diff options
Diffstat (limited to 'arch/mips/math-emu')
-rw-r--r-- | arch/mips/math-emu/cp1emu.c | 19 |
1 files changed, 9 insertions, 10 deletions
diff --git a/arch/mips/math-emu/cp1emu.c b/arch/mips/math-emu/cp1emu.c index d7f05b0abe17..17419e11ecad 100644 --- a/arch/mips/math-emu/cp1emu.c +++ b/arch/mips/math-emu/cp1emu.c | |||
@@ -205,7 +205,7 @@ static int isBranchInstr(mips_instruction * i) | |||
205 | static int cop1Emulate(struct pt_regs *xcp, struct mips_fpu_struct *ctx) | 205 | static int cop1Emulate(struct pt_regs *xcp, struct mips_fpu_struct *ctx) |
206 | { | 206 | { |
207 | mips_instruction ir; | 207 | mips_instruction ir; |
208 | void * emulpc, *contpc; | 208 | unsigned long emulpc, contpc; |
209 | unsigned int cond; | 209 | unsigned int cond; |
210 | 210 | ||
211 | if (get_user(ir, (mips_instruction __user *) xcp->cp0_epc)) { | 211 | if (get_user(ir, (mips_instruction __user *) xcp->cp0_epc)) { |
@@ -230,7 +230,7 @@ static int cop1Emulate(struct pt_regs *xcp, struct mips_fpu_struct *ctx) | |||
230 | * Linux MIPS branch emulator operates on context, updating the | 230 | * Linux MIPS branch emulator operates on context, updating the |
231 | * cp0_epc. | 231 | * cp0_epc. |
232 | */ | 232 | */ |
233 | emulpc = (void *) (xcp->cp0_epc + 4); /* Snapshot emulation target */ | 233 | emulpc = xcp->cp0_epc + 4; /* Snapshot emulation target */ |
234 | 234 | ||
235 | if (__compute_return_epc(xcp)) { | 235 | if (__compute_return_epc(xcp)) { |
236 | #ifdef CP1DBG | 236 | #ifdef CP1DBG |
@@ -244,12 +244,12 @@ static int cop1Emulate(struct pt_regs *xcp, struct mips_fpu_struct *ctx) | |||
244 | return SIGBUS; | 244 | return SIGBUS; |
245 | } | 245 | } |
246 | /* __compute_return_epc() will have updated cp0_epc */ | 246 | /* __compute_return_epc() will have updated cp0_epc */ |
247 | contpc = (void *) xcp->cp0_epc; | 247 | contpc = xcp->cp0_epc; |
248 | /* In order not to confuse ptrace() et al, tweak context */ | 248 | /* In order not to confuse ptrace() et al, tweak context */ |
249 | xcp->cp0_epc = (unsigned long) emulpc - 4; | 249 | xcp->cp0_epc = emulpc - 4; |
250 | } else { | 250 | } else { |
251 | emulpc = (void *) xcp->cp0_epc; | 251 | emulpc = xcp->cp0_epc; |
252 | contpc = (void *) (xcp->cp0_epc + 4); | 252 | contpc = xcp->cp0_epc + 4; |
253 | } | 253 | } |
254 | 254 | ||
255 | emul: | 255 | emul: |
@@ -427,8 +427,7 @@ static int cop1Emulate(struct pt_regs *xcp, struct mips_fpu_struct *ctx) | |||
427 | * instruction | 427 | * instruction |
428 | */ | 428 | */ |
429 | xcp->cp0_epc += 4; | 429 | xcp->cp0_epc += 4; |
430 | contpc = (void *) | 430 | contpc = (xcp->cp0_epc + |
431 | (xcp->cp0_epc + | ||
432 | (MIPSInst_SIMM(ir) << 2)); | 431 | (MIPSInst_SIMM(ir) << 2)); |
433 | 432 | ||
434 | if (get_user(ir, | 433 | if (get_user(ir, |
@@ -462,7 +461,7 @@ static int cop1Emulate(struct pt_regs *xcp, struct mips_fpu_struct *ctx) | |||
462 | * Single step the non-cp1 | 461 | * Single step the non-cp1 |
463 | * instruction in the dslot | 462 | * instruction in the dslot |
464 | */ | 463 | */ |
465 | return mips_dsemul(xcp, ir, (unsigned long) contpc); | 464 | return mips_dsemul(xcp, ir, contpc); |
466 | } | 465 | } |
467 | else { | 466 | else { |
468 | /* branch not taken */ | 467 | /* branch not taken */ |
@@ -521,7 +520,7 @@ static int cop1Emulate(struct pt_regs *xcp, struct mips_fpu_struct *ctx) | |||
521 | } | 520 | } |
522 | 521 | ||
523 | /* we did it !! */ | 522 | /* we did it !! */ |
524 | xcp->cp0_epc = (unsigned long) contpc; | 523 | xcp->cp0_epc = contpc; |
525 | xcp->cp0_cause &= ~CAUSEF_BD; | 524 | xcp->cp0_cause &= ~CAUSEF_BD; |
526 | 525 | ||
527 | return 0; | 526 | return 0; |