MFC r204197:
Allow user programs to execute mfpvr instructions. Linux allows this, and some math-related software like GMP expects to be able to use it to pick a target appropriately. Reported by: Jakob van Santen <vansanten at wisc dot edu>
This commit is contained in:
parent
a0b72790e4
commit
7eb87cc8c7
@ -82,6 +82,7 @@ static void printtrap(u_int vector, struct trapframe *frame, int isfatal,
|
||||
int user);
|
||||
static int trap_pfault(struct trapframe *frame, int user);
|
||||
static int fix_unaligned(struct thread *td, struct trapframe *frame);
|
||||
static int ppc_instr_emulate(struct trapframe *frame);
|
||||
static int handle_onfault(struct trapframe *frame);
|
||||
static void syscall(struct trapframe *frame);
|
||||
|
||||
@ -211,7 +212,9 @@ trap(struct trapframe *frame)
|
||||
/* Identify the trap reason */
|
||||
if (frame->srr1 & EXC_PGM_TRAP)
|
||||
sig = SIGTRAP;
|
||||
else
|
||||
else if (ppc_instr_emulate(frame) == 0)
|
||||
frame->srr0 += 4;
|
||||
else
|
||||
sig = SIGILL;
|
||||
break;
|
||||
|
||||
@ -632,3 +635,21 @@ fix_unaligned(struct thread *td, struct trapframe *frame)
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
static int
|
||||
ppc_instr_emulate(struct trapframe *frame)
|
||||
{
|
||||
uint32_t instr;
|
||||
int reg;
|
||||
|
||||
instr = fuword32((void *)frame->srr0);
|
||||
|
||||
if ((instr & 0xfc1fffff) == 0x7c1f42a6) { /* mfpvr */
|
||||
reg = (instr & ~0xfc1fffff) >> 21;
|
||||
frame->fixreg[reg] = mfpvr();
|
||||
return (0);
|
||||
}
|
||||
|
||||
return (-1);
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user