Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Gross macro abuse. Get rid of gpreg_t, vaddr_t, REG_TO_VA and VA_TO_REG. Who ever wrote this apparently did enjoy the C Puzzle Book. ISBN 0201604612, a little old but still fun reading for the next blackout ;)

Signed-off-by: Ralf Baechle <ralf@linux-mips.org>

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