Merge "arm64: kernel: Save and restore UAO and addr_limit on exception entry"

This commit is contained in:
Linux Build Service Account 2017-01-30 07:04:53 -08:00 committed by Gerrit - the friendly Code Review server
commit fbf5f7c2db
2 changed files with 5 additions and 1 deletions

View file

@ -104,6 +104,7 @@
str x20, [sp, #S_ORIG_ADDR_LIMIT] str x20, [sp, #S_ORIG_ADDR_LIMIT]
mov x20, #TASK_SIZE_64 mov x20, #TASK_SIZE_64
str x20, [tsk, #TI_ADDR_LIMIT] str x20, [tsk, #TI_ADDR_LIMIT]
ALTERNATIVE(nop, SET_PSTATE_UAO(0), ARM64_HAS_UAO, CONFIG_ARM64_UAO)
.endif /* \el == 0 */ .endif /* \el == 0 */
mrs x22, elr_el1 mrs x22, elr_el1
mrs x23, spsr_el1 mrs x23, spsr_el1
@ -139,6 +140,8 @@
/* Restore the task's original addr_limit. */ /* Restore the task's original addr_limit. */
ldr x20, [sp, #S_ORIG_ADDR_LIMIT] ldr x20, [sp, #S_ORIG_ADDR_LIMIT]
str x20, [tsk, #TI_ADDR_LIMIT] str x20, [tsk, #TI_ADDR_LIMIT]
/* No need to restore UAO, it will be restored from SPSR_EL1 */
.endif .endif
ldp x21, x22, [sp, #S_PC] // load ELR, SPSR ldp x21, x22, [sp, #S_PC] // load ELR, SPSR

View file

@ -291,7 +291,8 @@ static int __kprobes do_page_fault(unsigned long addr, unsigned int esr,
} }
if (permission_fault(esr) && (addr < USER_DS)) { if (permission_fault(esr) && (addr < USER_DS)) {
if (get_fs() == KERNEL_DS) /* regs->orig_addr_limit may be 0 if we entered from EL0 */
if (regs->orig_addr_limit == KERNEL_DS)
die("Accessing user space memory with fs=KERNEL_DS", regs, esr); die("Accessing user space memory with fs=KERNEL_DS", regs, esr);
if (!search_exception_tables(regs->pc)) if (!search_exception_tables(regs->pc))