]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
powerpc/dexcr: Track the DEXCR per-process
authorBenjamin Gray <bgray@linux.ibm.com>
Wed, 17 Apr 2024 11:23:18 +0000 (21:23 +1000)
committerMichael Ellerman <mpe@ellerman.id.au>
Fri, 3 May 2024 10:46:51 +0000 (20:46 +1000)
Add capability to make the DEXCR act as a per-process SPR.

We do not yet have an interface for changing the values per task. We
also expect the kernel to use a single DEXCR value across all tasks
while in privileged state, so there is no need to synchronize after
changing it (the userspace aspects will synchronize upon returning to
userspace).

Signed-off-by: Benjamin Gray <bgray@linux.ibm.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://msgid.link/20240417112325.728010-3-bgray@linux.ibm.com
arch/powerpc/include/asm/processor.h
arch/powerpc/kernel/process.c
arch/powerpc/kernel/ptrace/ptrace-view.c

index b2c51d337e60cd429b2b6c68af83d39ce794e7c0..882e31296ea6baa16aa2fb891881e6ccc1bcdc73 100644 (file)
@@ -260,6 +260,7 @@ struct thread_struct {
        unsigned long   sier2;
        unsigned long   sier3;
        unsigned long   hashkeyr;
+       unsigned long   dexcr;
 
 #endif
 };
index 9452a54d356c97c145a876dd127a593d647ecc1e..d482c3fd81d7a506c91edd86accc474a950597cc 100644 (file)
@@ -1185,6 +1185,9 @@ static inline void save_sprs(struct thread_struct *t)
 
        if (cpu_has_feature(CPU_FTR_DEXCR_NPHIE))
                t->hashkeyr = mfspr(SPRN_HASHKEYR);
+
+       if (cpu_has_feature(CPU_FTR_ARCH_31))
+               t->dexcr = mfspr(SPRN_DEXCR);
 #endif
 }
 
@@ -1267,6 +1270,10 @@ static inline void restore_sprs(struct thread_struct *old_thread,
        if (cpu_has_feature(CPU_FTR_DEXCR_NPHIE) &&
            old_thread->hashkeyr != new_thread->hashkeyr)
                mtspr(SPRN_HASHKEYR, new_thread->hashkeyr);
+
+       if (cpu_has_feature(CPU_FTR_ARCH_31) &&
+           old_thread->dexcr != new_thread->dexcr)
+               mtspr(SPRN_DEXCR, new_thread->dexcr);
 #endif
 
 }
@@ -1878,6 +1885,9 @@ int copy_thread(struct task_struct *p, const struct kernel_clone_args *args)
 #ifdef CONFIG_PPC_BOOK3S_64
        if (cpu_has_feature(CPU_FTR_DEXCR_NPHIE))
                p->thread.hashkeyr = current->thread.hashkeyr;
+
+       if (cpu_has_feature(CPU_FTR_ARCH_31))
+               p->thread.dexcr = mfspr(SPRN_DEXCR);
 #endif
        return 0;
 }
index 584cf5c3df5093bb7d13a52832fd0341f51af4ca..c1819e0a66842b37f2a0a60ddba9b333dbcab85f 100644 (file)
@@ -469,12 +469,7 @@ static int dexcr_get(struct task_struct *target, const struct user_regset *regse
        if (!cpu_has_feature(CPU_FTR_ARCH_31))
                return -ENODEV;
 
-       /*
-        * The DEXCR is currently static across all CPUs, so we don't
-        * store the target's value anywhere, but the static value
-        * will also be correct.
-        */
-       membuf_store(&to, (u64)lower_32_bits(DEXCR_INIT));
+       membuf_store(&to, (u64)lower_32_bits(target->thread.dexcr));
 
        /*
         * Technically the HDEXCR is per-cpu, but a hypervisor can't reasonably