powerpc: Return SIGILL if DSCR does not exist in m{f,t}spr emulation

Guard against programs written for one powerpc target running on another,
and panicking the system due to not having the DSCR register.
This commit is contained in:
Justin Hibbits 2019-11-17 01:01:02 +00:00
parent 7316504cd5
commit 5979bb0b7d
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=354783

View File

@ -1086,15 +1086,17 @@ emulate_mfspr(int spr, int reg, struct trapframe *frame){
td = curthread;
if (spr == SPR_DSCR || spr == SPR_DSCRP) {
if (!(cpu_features2 & PPC_FEATURE2_DSCR))
return (SIGILL);
// If DSCR was never set, get the default DSCR
if ((td->td_pcb->pcb_flags & PCB_CDSCR) == 0)
td->td_pcb->pcb_dscr = mfspr(SPR_DSCRP);
frame->fixreg[reg] = td->td_pcb->pcb_dscr;
frame->srr0 += 4;
return 0;
return (0);
} else
return SIGILL;
return (SIGILL);
}
static int
@ -1104,13 +1106,15 @@ emulate_mtspr(int spr, int reg, struct trapframe *frame){
td = curthread;
if (spr == SPR_DSCR || spr == SPR_DSCRP) {
if (!(cpu_features2 & PPC_FEATURE2_DSCR))
return (SIGILL);
td->td_pcb->pcb_flags |= PCB_CDSCR;
td->td_pcb->pcb_dscr = frame->fixreg[reg];
mtspr(SPR_DSCRP, frame->fixreg[reg]);
frame->srr0 += 4;
return 0;
return (0);
} else
return SIGILL;
return (SIGILL);
}
#define XFX 0xFC0007FF