diff options
Diffstat (limited to 'arch/mips')
| -rw-r--r-- | arch/mips/math-emu/cp1emu.c | 48 | ||||
| -rw-r--r-- | arch/mips/math-emu/dsemul.c | 10 | ||||
| -rw-r--r-- | arch/mips/math-emu/dsemul.h | 10 |
3 files changed, 31 insertions, 37 deletions
diff --git a/arch/mips/math-emu/cp1emu.c b/arch/mips/math-emu/cp1emu.c index 99c550632d44..c70f25f5889e 100644 --- a/arch/mips/math-emu/cp1emu.c +++ b/arch/mips/math-emu/cp1emu.c | |||
| @@ -196,7 +196,7 @@ static int isBranchInstr(mips_instruction * i) | |||
| 196 | static int cop1Emulate(struct pt_regs *xcp, struct mips_fpu_soft_struct *ctx) | 196 | static int cop1Emulate(struct pt_regs *xcp, struct mips_fpu_soft_struct *ctx) |
| 197 | { | 197 | { |
| 198 | mips_instruction ir; | 198 | mips_instruction ir; |
| 199 | vaddr_t emulpc, contpc; | 199 | void * emulpc, *contpc; |
| 200 | unsigned int cond; | 200 | unsigned int cond; |
| 201 | 201 | ||
| 202 | if (get_user(ir, (mips_instruction *) xcp->cp0_epc)) { | 202 | if (get_user(ir, (mips_instruction *) xcp->cp0_epc)) { |
| @@ -221,12 +221,12 @@ static int cop1Emulate(struct pt_regs *xcp, struct mips_fpu_soft_struct *ctx) | |||
| 221 | * Linux MIPS branch emulator operates on context, updating the | 221 | * Linux MIPS branch emulator operates on context, updating the |
| 222 | * cp0_epc. | 222 | * cp0_epc. |
| 223 | */ | 223 | */ |
| 224 | emulpc = REG_TO_VA(xcp->cp0_epc + 4); /* Snapshot emulation target */ | 224 | emulpc = (void *) (xcp->cp0_epc + 4); /* Snapshot emulation target */ |
| 225 | 225 | ||
| 226 | if (__compute_return_epc(xcp)) { | 226 | if (__compute_return_epc(xcp)) { |
| 227 | #ifdef CP1DBG | 227 | #ifdef CP1DBG |
| 228 | printk("failed to emulate branch at %p\n", | 228 | printk("failed to emulate branch at %p\n", |
| 229 | REG_TO_VA(xcp->cp0_epc)); | 229 | (void *) (xcp->cp0_epc)); |
| 230 | #endif | 230 | #endif |
| 231 | return SIGILL; | 231 | return SIGILL; |
| 232 | } | 232 | } |
| @@ -235,13 +235,12 @@ static int cop1Emulate(struct pt_regs *xcp, struct mips_fpu_soft_struct *ctx) | |||
| 235 | return SIGBUS; | 235 | return SIGBUS; |
| 236 | } | 236 | } |
| 237 | /* __compute_return_epc() will have updated cp0_epc */ | 237 | /* __compute_return_epc() will have updated cp0_epc */ |
| 238 | contpc = REG_TO_VA xcp->cp0_epc; | 238 | contpc = (void *) xcp->cp0_epc; |
| 239 | /* In order not to confuse ptrace() et al, tweak context */ | 239 | /* In order not to confuse ptrace() et al, tweak context */ |
| 240 | xcp->cp0_epc = VA_TO_REG emulpc - 4; | 240 | xcp->cp0_epc = (unsigned long) emulpc - 4; |
| 241 | } | 241 | } else { |
| 242 | else { | 242 | emulpc = (void *) xcp->cp0_epc; |
| 243 | emulpc = REG_TO_VA xcp->cp0_epc; | 243 | contpc = (void *) (xcp->cp0_epc + 4); |
| 244 | contpc = REG_TO_VA(xcp->cp0_epc + 4); | ||
| 245 | } | 244 | } |
| 246 | 245 | ||
| 247 | emul: | 246 | emul: |
| @@ -249,7 +248,7 @@ static int cop1Emulate(struct pt_regs *xcp, struct mips_fpu_soft_struct *ctx) | |||
| 249 | switch (MIPSInst_OPCODE(ir)) { | 248 | switch (MIPSInst_OPCODE(ir)) { |
| 250 | #ifndef SINGLE_ONLY_FPU | 249 | #ifndef SINGLE_ONLY_FPU |
| 251 | case ldc1_op:{ | 250 | case ldc1_op:{ |
| 252 | u64 *va = REG_TO_VA(xcp->regs[MIPSInst_RS(ir)] + | 251 | u64 *va = (void *) (xcp->regs[MIPSInst_RS(ir)] + |
| 253 | MIPSInst_SIMM(ir)); | 252 | MIPSInst_SIMM(ir)); |
| 254 | u64 val; | 253 | u64 val; |
| 255 | 254 | ||
| @@ -263,7 +262,7 @@ static int cop1Emulate(struct pt_regs *xcp, struct mips_fpu_soft_struct *ctx) | |||
| 263 | } | 262 | } |
| 264 | 263 | ||
| 265 | case sdc1_op:{ | 264 | case sdc1_op:{ |
| 266 | u64 *va = REG_TO_VA(xcp->regs[MIPSInst_RS(ir)] + | 265 | u64 *va = (void *) (xcp->regs[MIPSInst_RS(ir)] + |
| 267 | MIPSInst_SIMM(ir)); | 266 | MIPSInst_SIMM(ir)); |
| 268 | u64 val; | 267 | u64 val; |
| 269 | 268 | ||
| @@ -278,7 +277,7 @@ static int cop1Emulate(struct pt_regs *xcp, struct mips_fpu_soft_struct *ctx) | |||
| 278 | #endif | 277 | #endif |
| 279 | 278 | ||
| 280 | case lwc1_op:{ | 279 | case lwc1_op:{ |
| 281 | u32 *va = REG_TO_VA(xcp->regs[MIPSInst_RS(ir)] + | 280 | u32 *va = (void *) (xcp->regs[MIPSInst_RS(ir)] + |
| 282 | MIPSInst_SIMM(ir)); | 281 | MIPSInst_SIMM(ir)); |
| 283 | u32 val; | 282 | u32 val; |
| 284 | 283 | ||
| @@ -298,7 +297,7 @@ static int cop1Emulate(struct pt_regs *xcp, struct mips_fpu_soft_struct *ctx) | |||
| 298 | } | 297 | } |
| 299 | 298 | ||
| 300 | case swc1_op:{ | 299 | case swc1_op:{ |
| 301 | u32 *va = REG_TO_VA(xcp->regs[MIPSInst_RS(ir)] + | 300 | u32 *va = (void *) (xcp->regs[MIPSInst_RS(ir)] + |
| 302 | MIPSInst_SIMM(ir)); | 301 | MIPSInst_SIMM(ir)); |
| 303 | u32 val; | 302 | u32 val; |
| 304 | 303 | ||
| @@ -371,7 +370,7 @@ static int cop1Emulate(struct pt_regs *xcp, struct mips_fpu_soft_struct *ctx) | |||
| 371 | value = ctx->fcr31; | 370 | value = ctx->fcr31; |
| 372 | #ifdef CSRTRACE | 371 | #ifdef CSRTRACE |
| 373 | printk("%p gpr[%d]<-csr=%08x\n", | 372 | printk("%p gpr[%d]<-csr=%08x\n", |
| 374 | REG_TO_VA(xcp->cp0_epc), | 373 | (void *) (xcp->cp0_epc), |
| 375 | MIPSInst_RT(ir), value); | 374 | MIPSInst_RT(ir), value); |
| 376 | #endif | 375 | #endif |
| 377 | } | 376 | } |
| @@ -398,7 +397,7 @@ static int cop1Emulate(struct pt_regs *xcp, struct mips_fpu_soft_struct *ctx) | |||
| 398 | if (MIPSInst_RD(ir) == FPCREG_CSR) { | 397 | if (MIPSInst_RD(ir) == FPCREG_CSR) { |
| 399 | #ifdef CSRTRACE | 398 | #ifdef CSRTRACE |
| 400 | printk("%p gpr[%d]->csr=%08x\n", | 399 | printk("%p gpr[%d]->csr=%08x\n", |
| 401 | REG_TO_VA(xcp->cp0_epc), | 400 | (void *) (xcp->cp0_epc), |
| 402 | MIPSInst_RT(ir), value); | 401 | MIPSInst_RT(ir), value); |
| 403 | #endif | 402 | #endif |
| 404 | ctx->fcr31 = value; | 403 | ctx->fcr31 = value; |
| @@ -445,12 +444,12 @@ static int cop1Emulate(struct pt_regs *xcp, struct mips_fpu_soft_struct *ctx) | |||
| 445 | * instruction | 444 | * instruction |
| 446 | */ | 445 | */ |
| 447 | xcp->cp0_epc += 4; | 446 | xcp->cp0_epc += 4; |
| 448 | contpc = REG_TO_VA | 447 | contpc = (void *) |
| 449 | (xcp->cp0_epc + | 448 | (xcp->cp0_epc + |
| 450 | (MIPSInst_SIMM(ir) << 2)); | 449 | (MIPSInst_SIMM(ir) << 2)); |
| 451 | 450 | ||
| 452 | if (get_user(ir, (mips_instruction *) | 451 | if (get_user(ir, (mips_instruction *) |
| 453 | REG_TO_VA xcp->cp0_epc)) { | 452 | (void *) xcp->cp0_epc)) { |
| 454 | fpuemuprivate.stats.errors++; | 453 | fpuemuprivate.stats.errors++; |
| 455 | return SIGBUS; | 454 | return SIGBUS; |
| 456 | } | 455 | } |
| @@ -480,7 +479,7 @@ static int cop1Emulate(struct pt_regs *xcp, struct mips_fpu_soft_struct *ctx) | |||
| 480 | * Single step the non-cp1 | 479 | * Single step the non-cp1 |
| 481 | * instruction in the dslot | 480 | * instruction in the dslot |
| 482 | */ | 481 | */ |
| 483 | return mips_dsemul(xcp, ir, VA_TO_REG contpc); | 482 | return mips_dsemul(xcp, ir, (unsigned long) contpc); |
| 484 | } | 483 | } |
| 485 | else { | 484 | else { |
| 486 | /* branch not taken */ | 485 | /* branch not taken */ |
| @@ -539,8 +538,9 @@ static int cop1Emulate(struct pt_regs *xcp, struct mips_fpu_soft_struct *ctx) | |||
| 539 | } | 538 | } |
| 540 | 539 | ||
| 541 | /* we did it !! */ | 540 | /* we did it !! */ |
| 542 | xcp->cp0_epc = VA_TO_REG(contpc); | 541 | xcp->cp0_epc = (unsigned long) contpc; |
| 543 | xcp->cp0_cause &= ~CAUSEF_BD; | 542 | xcp->cp0_cause &= ~CAUSEF_BD; |
| 543 | |||
| 544 | return 0; | 544 | return 0; |
| 545 | } | 545 | } |
| 546 | 546 | ||
| @@ -628,7 +628,7 @@ static int fpux_emu(struct pt_regs *xcp, struct mips_fpu_soft_struct *ctx, | |||
| 628 | 628 | ||
| 629 | switch (MIPSInst_FUNC(ir)) { | 629 | switch (MIPSInst_FUNC(ir)) { |
| 630 | case lwxc1_op: | 630 | case lwxc1_op: |
| 631 | va = REG_TO_VA(xcp->regs[MIPSInst_FR(ir)] + | 631 | va = (void *) (xcp->regs[MIPSInst_FR(ir)] + |
| 632 | xcp->regs[MIPSInst_FT(ir)]); | 632 | xcp->regs[MIPSInst_FT(ir)]); |
| 633 | 633 | ||
| 634 | fpuemuprivate.stats.loads++; | 634 | fpuemuprivate.stats.loads++; |
| @@ -648,7 +648,7 @@ static int fpux_emu(struct pt_regs *xcp, struct mips_fpu_soft_struct *ctx, | |||
| 648 | break; | 648 | break; |
| 649 | 649 | ||
| 650 | case swxc1_op: | 650 | case swxc1_op: |
| 651 | va = REG_TO_VA(xcp->regs[MIPSInst_FR(ir)] + | 651 | va = (void *) (xcp->regs[MIPSInst_FR(ir)] + |
| 652 | xcp->regs[MIPSInst_FT(ir)]); | 652 | xcp->regs[MIPSInst_FT(ir)]); |
| 653 | 653 | ||
| 654 | fpuemuprivate.stats.stores++; | 654 | fpuemuprivate.stats.stores++; |
| @@ -724,7 +724,7 @@ static int fpux_emu(struct pt_regs *xcp, struct mips_fpu_soft_struct *ctx, | |||
| 724 | 724 | ||
| 725 | switch (MIPSInst_FUNC(ir)) { | 725 | switch (MIPSInst_FUNC(ir)) { |
| 726 | case ldxc1_op: | 726 | case ldxc1_op: |
| 727 | va = REG_TO_VA(xcp->regs[MIPSInst_FR(ir)] + | 727 | va = (void *) (xcp->regs[MIPSInst_FR(ir)] + |
| 728 | xcp->regs[MIPSInst_FT(ir)]); | 728 | xcp->regs[MIPSInst_FT(ir)]); |
| 729 | 729 | ||
| 730 | fpuemuprivate.stats.loads++; | 730 | fpuemuprivate.stats.loads++; |
| @@ -736,7 +736,7 @@ static int fpux_emu(struct pt_regs *xcp, struct mips_fpu_soft_struct *ctx, | |||
| 736 | break; | 736 | break; |
| 737 | 737 | ||
| 738 | case sdxc1_op: | 738 | case sdxc1_op: |
| 739 | va = REG_TO_VA(xcp->regs[MIPSInst_FR(ir)] + | 739 | va = (void *) (xcp->regs[MIPSInst_FR(ir)] + |
| 740 | xcp->regs[MIPSInst_FT(ir)]); | 740 | xcp->regs[MIPSInst_FT(ir)]); |
| 741 | 741 | ||
| 742 | fpuemuprivate.stats.stores++; | 742 | fpuemuprivate.stats.stores++; |
| @@ -1282,7 +1282,7 @@ static int fpu_emu(struct pt_regs *xcp, struct mips_fpu_soft_struct *ctx, | |||
| 1282 | int fpu_emulator_cop1Handler(int xcptno, struct pt_regs *xcp, | 1282 | int fpu_emulator_cop1Handler(int xcptno, struct pt_regs *xcp, |
| 1283 | struct mips_fpu_soft_struct *ctx) | 1283 | struct mips_fpu_soft_struct *ctx) |
| 1284 | { | 1284 | { |
| 1285 | gpreg_t oldepc, prevepc; | 1285 | unsigned long oldepc, prevepc; |
| 1286 | mips_instruction insn; | 1286 | mips_instruction insn; |
| 1287 | int sig = 0; | 1287 | int sig = 0; |
| 1288 | 1288 | ||
diff --git a/arch/mips/math-emu/dsemul.c b/arch/mips/math-emu/dsemul.c index 688be60c5385..d48bb62495bf 100644 --- a/arch/mips/math-emu/dsemul.c +++ b/arch/mips/math-emu/dsemul.c | |||
| @@ -49,10 +49,10 @@ struct emuframe { | |||
| 49 | mips_instruction emul; | 49 | mips_instruction emul; |
| 50 | mips_instruction badinst; | 50 | mips_instruction badinst; |
| 51 | mips_instruction cookie; | 51 | mips_instruction cookie; |
| 52 | gpreg_t epc; | 52 | unsigned long epc; |
| 53 | }; | 53 | }; |
| 54 | 54 | ||
| 55 | int mips_dsemul(struct pt_regs *regs, mips_instruction ir, gpreg_t cpc) | 55 | int mips_dsemul(struct pt_regs *regs, mips_instruction ir, unsigned long cpc) |
| 56 | { | 56 | { |
| 57 | extern asmlinkage void handle_dsemulret(void); | 57 | extern asmlinkage void handle_dsemulret(void); |
| 58 | mips_instruction *dsemul_insns; | 58 | mips_instruction *dsemul_insns; |
| @@ -88,7 +88,7 @@ int mips_dsemul(struct pt_regs *regs, mips_instruction ir, gpreg_t cpc) | |||
| 88 | */ | 88 | */ |
| 89 | 89 | ||
| 90 | /* Ensure that the two instructions are in the same cache line */ | 90 | /* Ensure that the two instructions are in the same cache line */ |
| 91 | dsemul_insns = (mips_instruction *) REG_TO_VA ((regs->regs[29] - sizeof(struct emuframe)) & ~0x7); | 91 | dsemul_insns = (mips_instruction *) ((regs->regs[29] - sizeof(struct emuframe)) & ~0x7); |
| 92 | fr = (struct emuframe *) dsemul_insns; | 92 | fr = (struct emuframe *) dsemul_insns; |
| 93 | 93 | ||
| 94 | /* Verify that the stack pointer is not competely insane */ | 94 | /* Verify that the stack pointer is not competely insane */ |
| @@ -105,7 +105,7 @@ int mips_dsemul(struct pt_regs *regs, mips_instruction ir, gpreg_t cpc) | |||
| 105 | return SIGBUS; | 105 | return SIGBUS; |
| 106 | } | 106 | } |
| 107 | 107 | ||
| 108 | regs->cp0_epc = VA_TO_REG & fr->emul; | 108 | regs->cp0_epc = (unsigned long) &fr->emul; |
| 109 | 109 | ||
| 110 | flush_cache_sigtramp((unsigned long)&fr->badinst); | 110 | flush_cache_sigtramp((unsigned long)&fr->badinst); |
| 111 | 111 | ||
| @@ -115,7 +115,7 @@ int mips_dsemul(struct pt_regs *regs, mips_instruction ir, gpreg_t cpc) | |||
| 115 | int do_dsemulret(struct pt_regs *xcp) | 115 | int do_dsemulret(struct pt_regs *xcp) |
| 116 | { | 116 | { |
| 117 | struct emuframe *fr; | 117 | struct emuframe *fr; |
| 118 | gpreg_t epc; | 118 | unsigned long epc; |
| 119 | u32 insn, cookie; | 119 | u32 insn, cookie; |
| 120 | int err = 0; | 120 | int err = 0; |
| 121 | 121 | ||
diff --git a/arch/mips/math-emu/dsemul.h b/arch/mips/math-emu/dsemul.h index dbd85f95268d..091f0e76730f 100644 --- a/arch/mips/math-emu/dsemul.h +++ b/arch/mips/math-emu/dsemul.h | |||
| @@ -1,11 +1,5 @@ | |||
| 1 | typedef long gpreg_t; | 1 | extern int mips_dsemul(struct pt_regs *regs, mips_instruction ir, unsigned long cpc); |
| 2 | typedef void *vaddr_t; | 2 | extern int do_dsemulret(struct pt_regs *xcp); |
| 3 | |||
| 4 | #define REG_TO_VA (vaddr_t) | ||
| 5 | #define VA_TO_REG (gpreg_t) | ||
| 6 | |||
| 7 | int mips_dsemul(struct pt_regs *regs, mips_instruction ir, gpreg_t cpc); | ||
| 8 | int do_dsemulret(struct pt_regs *xcp); | ||
| 9 | 3 | ||
| 10 | /* Instruction which will always cause an address error */ | 4 | /* Instruction which will always cause an address error */ |
| 11 | #define AdELOAD 0x8c000001 /* lw $0,1($0) */ | 5 | #define AdELOAD 0x8c000001 /* lw $0,1($0) */ |
