diff options
author | Andrew Waterman <waterman@s141.Millennium.Berkeley.EDU> | 2011-02-04 16:09:01 -0800 |
---|---|---|
committer | Andrew Waterman <waterman@s141.Millennium.Berkeley.EDU> | 2011-02-04 16:09:01 -0800 |
commit | af2d471a4e6c2e4551238a2cc209f9c0d997c82f (patch) | |
tree | 324c10ad4431e08b28b3166169a1ccd3833b0d50 /pk/fp.c | |
parent | 83cdb2063f62d4d535aebbaff484e068808e097b (diff) | |
download | pk-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.c | 10 |
1 files changed, 8 insertions, 2 deletions
@@ -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; } |