|
@@ -16,11 +16,20 @@
|
|
|
add \tmp1, \tmp1, #SWAPPER_DIR_SIZE // reserved_ttbr0 at the end of swapper_pg_dir
|
|
|
msr ttbr0_el1, \tmp1 // set reserved TTBR0_EL1
|
|
|
isb
|
|
|
+ sub \tmp1, \tmp1, #SWAPPER_DIR_SIZE
|
|
|
+ bic \tmp1, \tmp1, #(0xffff << 48)
|
|
|
+ msr ttbr1_el1, \tmp1 // set reserved ASID
|
|
|
+ isb
|
|
|
.endm
|
|
|
|
|
|
- .macro __uaccess_ttbr0_enable, tmp1
|
|
|
+ .macro __uaccess_ttbr0_enable, tmp1, tmp2
|
|
|
get_thread_info \tmp1
|
|
|
ldr \tmp1, [\tmp1, #TSK_TI_TTBR0] // load saved TTBR0_EL1
|
|
|
+ mrs \tmp2, ttbr1_el1
|
|
|
+ extr \tmp2, \tmp2, \tmp1, #48
|
|
|
+ ror \tmp2, \tmp2, #16
|
|
|
+ msr ttbr1_el1, \tmp2 // set the active ASID
|
|
|
+ isb
|
|
|
msr ttbr0_el1, \tmp1 // set the non-PAN TTBR0_EL1
|
|
|
isb
|
|
|
.endm
|
|
@@ -31,18 +40,18 @@ alternative_if_not ARM64_HAS_PAN
|
|
|
alternative_else_nop_endif
|
|
|
.endm
|
|
|
|
|
|
- .macro uaccess_ttbr0_enable, tmp1, tmp2
|
|
|
+ .macro uaccess_ttbr0_enable, tmp1, tmp2, tmp3
|
|
|
alternative_if_not ARM64_HAS_PAN
|
|
|
- save_and_disable_irq \tmp2 // avoid preemption
|
|
|
- __uaccess_ttbr0_enable \tmp1
|
|
|
- restore_irq \tmp2
|
|
|
+ save_and_disable_irq \tmp3 // avoid preemption
|
|
|
+ __uaccess_ttbr0_enable \tmp1, \tmp2
|
|
|
+ restore_irq \tmp3
|
|
|
alternative_else_nop_endif
|
|
|
.endm
|
|
|
#else
|
|
|
.macro uaccess_ttbr0_disable, tmp1
|
|
|
.endm
|
|
|
|
|
|
- .macro uaccess_ttbr0_enable, tmp1, tmp2
|
|
|
+ .macro uaccess_ttbr0_enable, tmp1, tmp2, tmp3
|
|
|
.endm
|
|
|
#endif
|
|
|
|
|
@@ -56,8 +65,8 @@ alternative_if ARM64_ALT_PAN_NOT_UAO
|
|
|
alternative_else_nop_endif
|
|
|
.endm
|
|
|
|
|
|
- .macro uaccess_enable_not_uao, tmp1, tmp2
|
|
|
- uaccess_ttbr0_enable \tmp1, \tmp2
|
|
|
+ .macro uaccess_enable_not_uao, tmp1, tmp2, tmp3
|
|
|
+ uaccess_ttbr0_enable \tmp1, \tmp2, \tmp3
|
|
|
alternative_if ARM64_ALT_PAN_NOT_UAO
|
|
|
SET_PSTATE_PAN(0)
|
|
|
alternative_else_nop_endif
|