Commit 75171f06 authored by Benjamin Gray's avatar Benjamin Gray Committed by Michael Ellerman
Browse files

powerpc/dexcr: Track the DEXCR per-process



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: default avatarBenjamin Gray <bgray@linux.ibm.com>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
Link: https://msgid.link/20240417112325.728010-3-bgray@linux.ibm.com
parent d7228a58
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -260,6 +260,7 @@ struct thread_struct {
	unsigned long   sier2;
	unsigned long   sier3;
	unsigned long	hashkeyr;
	unsigned long	dexcr;

#endif
};
+10 −0
Original line number Diff line number Diff line
@@ -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;
}
+1 −6
Original line number Diff line number Diff line
@@ -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