POR_EL1 is about to be used by the kpkeys framework, modifying it
for (typically small) sections of code. If an exception occurs
during that window and scheduling occurs, we must ensure that
POR_EL1 is context-switched as needed (saving the old value and
restoring the new one). An ISB is needed to ensure the write takes
effect, so we skip it if the new value is the same as the old, like
for POR_EL0.

Signed-off-by: Kevin Brodsky <[email protected]>
---
 arch/arm64/include/asm/processor.h | 1 +
 arch/arm64/kernel/process.c        | 9 +++++++++
 2 files changed, 10 insertions(+)

diff --git a/arch/arm64/include/asm/processor.h 
b/arch/arm64/include/asm/processor.h
index e30c4c8e3a7a..6095322343fc 100644
--- a/arch/arm64/include/asm/processor.h
+++ b/arch/arm64/include/asm/processor.h
@@ -192,6 +192,7 @@ struct thread_struct {
        u64                     svcr;
        u64                     tpidr2_el0;
        u64                     por_el0;
+       u64                     por_el1;
 #ifdef CONFIG_ARM64_GCS
        unsigned int            gcs_el0_mode;
        unsigned int            gcs_el0_locked;
diff --git a/arch/arm64/kernel/process.c b/arch/arm64/kernel/process.c
index 489554931231..618fb5ce1c1d 100644
--- a/arch/arm64/kernel/process.c
+++ b/arch/arm64/kernel/process.c
@@ -429,6 +429,9 @@ int copy_thread(struct task_struct *p, const struct 
kernel_clone_args *args)
 
        ptrauth_thread_init_kernel(p);
 
+       if (system_supports_poe())
+               p->thread.por_el1 = read_sysreg_s(SYS_POR_EL1);
+
        if (likely(!args->fn)) {
                *childregs = *current_pt_regs();
                childregs->regs[0] = 0;
@@ -679,6 +682,12 @@ static void permission_overlay_switch(struct task_struct 
*next)
                 * of POR_EL0.
                 */
        }
+
+       current->thread.por_el1 = read_sysreg_s(SYS_POR_EL1);
+       if (current->thread.por_el1 != next->thread.por_el1) {
+               write_sysreg_s(next->thread.por_el1, SYS_POR_EL1);
+               isb();
+       }
 }
 
 /*
-- 
2.51.2


Reply via email to