|
@@ -14,11 +14,11 @@
|
|
|
#ifdef CONFIG_ARM64_SW_TTBR0_PAN
|
|
|
.macro __uaccess_ttbr0_disable, tmp1
|
|
|
mrs \tmp1, ttbr1_el1 // swapper_pg_dir
|
|
|
+ bic \tmp1, \tmp1, #TTBR_ASID_MASK
|
|
|
sub \tmp1, \tmp1, #RESERVED_TTBR0_SIZE // reserved_ttbr0 just before swapper_pg_dir
|
|
|
msr ttbr0_el1, \tmp1 // set reserved TTBR0_EL1
|
|
|
isb
|
|
|
add \tmp1, \tmp1, #RESERVED_TTBR0_SIZE
|
|
|
- bic \tmp1, \tmp1, #TTBR_ASID_MASK
|
|
|
msr ttbr1_el1, \tmp1 // set reserved ASID
|
|
|
isb
|
|
|
.endm
|
|
@@ -35,9 +35,11 @@
|
|
|
isb
|
|
|
.endm
|
|
|
|
|
|
- .macro uaccess_ttbr0_disable, tmp1
|
|
|
+ .macro uaccess_ttbr0_disable, tmp1, tmp2
|
|
|
alternative_if_not ARM64_HAS_PAN
|
|
|
+ save_and_disable_irq \tmp2 // avoid preemption
|
|
|
__uaccess_ttbr0_disable \tmp1
|
|
|
+ restore_irq \tmp2
|
|
|
alternative_else_nop_endif
|
|
|
.endm
|
|
|
|
|
@@ -49,7 +51,7 @@ alternative_if_not ARM64_HAS_PAN
|
|
|
alternative_else_nop_endif
|
|
|
.endm
|
|
|
#else
|
|
|
- .macro uaccess_ttbr0_disable, tmp1
|
|
|
+ .macro uaccess_ttbr0_disable, tmp1, tmp2
|
|
|
.endm
|
|
|
|
|
|
.macro uaccess_ttbr0_enable, tmp1, tmp2, tmp3
|
|
@@ -59,8 +61,8 @@ alternative_else_nop_endif
|
|
|
/*
|
|
|
* These macros are no-ops when UAO is present.
|
|
|
*/
|
|
|
- .macro uaccess_disable_not_uao, tmp1
|
|
|
- uaccess_ttbr0_disable \tmp1
|
|
|
+ .macro uaccess_disable_not_uao, tmp1, tmp2
|
|
|
+ uaccess_ttbr0_disable \tmp1, \tmp2
|
|
|
alternative_if ARM64_ALT_PAN_NOT_UAO
|
|
|
SET_PSTATE_PAN(1)
|
|
|
alternative_else_nop_endif
|