powerpc: Emulate non privileged DSCR read and write
POWER8 allows read and write of the DSCR in userspace. We added kernel emulation so applications could always use the instructions regardless of the CPU type. Unfortunately there are two SPRs for the DSCR and we only added emulation for the privileged one. Add code to match the non privileged one. A simple test was created to verify the fix: http://ozlabs.org/~anton/junkcode/user_dscr_test.c Without the patch we get a SIGILL and it passes with the patch. Signed-off-by: Anton Blanchard <anton@samba.org> Cc: <stable@kernel.org> Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
This commit is contained in:

committed by
Benjamin Herrenschmidt

parent
01227a889e
commit
73d2fb758e
@@ -970,7 +970,10 @@ static int emulate_instruction(struct pt_regs *regs)
|
||||
|
||||
#ifdef CONFIG_PPC64
|
||||
/* Emulate the mfspr rD, DSCR. */
|
||||
if (((instword & PPC_INST_MFSPR_DSCR_MASK) == PPC_INST_MFSPR_DSCR) &&
|
||||
if ((((instword & PPC_INST_MFSPR_DSCR_USER_MASK) ==
|
||||
PPC_INST_MFSPR_DSCR_USER) ||
|
||||
((instword & PPC_INST_MFSPR_DSCR_MASK) ==
|
||||
PPC_INST_MFSPR_DSCR)) &&
|
||||
cpu_has_feature(CPU_FTR_DSCR)) {
|
||||
PPC_WARN_EMULATED(mfdscr, regs);
|
||||
rd = (instword >> 21) & 0x1f;
|
||||
@@ -978,7 +981,10 @@ static int emulate_instruction(struct pt_regs *regs)
|
||||
return 0;
|
||||
}
|
||||
/* Emulate the mtspr DSCR, rD. */
|
||||
if (((instword & PPC_INST_MTSPR_DSCR_MASK) == PPC_INST_MTSPR_DSCR) &&
|
||||
if ((((instword & PPC_INST_MTSPR_DSCR_USER_MASK) ==
|
||||
PPC_INST_MTSPR_DSCR_USER) ||
|
||||
((instword & PPC_INST_MTSPR_DSCR_MASK) ==
|
||||
PPC_INST_MTSPR_DSCR)) &&
|
||||
cpu_has_feature(CPU_FTR_DSCR)) {
|
||||
PPC_WARN_EMULATED(mtdscr, regs);
|
||||
rd = (instword >> 21) & 0x1f;
|
||||
|
Reference in New Issue
Block a user