aboutsummaryrefslogtreecommitdiff
path: root/pk/fp.c
diff options
context:
space:
mode:
authorAndrew Waterman <waterman@s141.Millennium.Berkeley.EDU>2011-02-04 16:09:01 -0800
committerAndrew Waterman <waterman@s141.Millennium.Berkeley.EDU>2011-02-04 16:09:01 -0800
commitaf2d471a4e6c2e4551238a2cc209f9c0d997c82f (patch)
tree324c10ad4431e08b28b3166169a1ccd3833b0d50 /pk/fp.c
parent83cdb2063f62d4d535aebbaff484e068808e097b (diff)
downloadpk-af2d471a4e6c2e4551238a2cc209f9c0d997c82f.zip
pk-af2d471a4e6c2e4551238a2cc209f9c0d997c82f.tar.gz
pk-af2d471a4e6c2e4551238a2cc209f9c0d997c82f.tar.bz2
[pk] fixed FP emulation bug
kernel would erroneously trap on FP disabled
Diffstat (limited to 'pk/fp.c')
-rw-r--r--pk/fp.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/pk/fp.c b/pk/fp.c
index 55e416d..587cc3f 100644
--- a/pk/fp.c
+++ b/pk/fp.c
@@ -27,7 +27,11 @@ validate_address(trapframe_t* tf, long addr, int size, int store)
int emulate_fp(trapframe_t* tf)
{
if(have_fp)
+ {
+ if(!(mfpcr(PCR_SR) & SR_EF))
+ init_fp();
fp_state.fsr = get_fp_state(fp_state.fpr);
+ }
if(noisy)
printk("FPU emulation at pc %lx, insn %x\n",tf->epc,(uint32_t)tf->insn);
@@ -257,10 +261,12 @@ get_fp_reg(unsigned int which, unsigned int dp)
#endif
-void init_fp_regs()
+void init_fp(trapframe_t* tf)
{
long sr = mfpcr(PCR_SR);
mtpcr(sr | SR_EF, PCR_SR);
+
put_fp_state(fp_state.fpr,fp_state.fsr);
- mtpcr(sr, PCR_SR);
+
+ tf->sr |= SR_EF;
}