X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=arch%2Fsparc%2Fkernel%2Funaligned.c;h=a40bbcfeb89882aa7ccb16b4a7ebb66ae273c6cd;hb=9bf4aaab3e101692164d49b7ca357651eb691cb6;hp=4e635aed14ec7eba9117c27ccbe71f1f4140d433;hpb=5273a3df6485dc2ad6aa7ddd441b9a21970f003b;p=linux-2.6.git diff --git a/arch/sparc/kernel/unaligned.c b/arch/sparc/kernel/unaligned.c index 4e635aed1..a40bbcfeb 100644 --- a/arch/sparc/kernel/unaligned.c +++ b/arch/sparc/kernel/unaligned.c @@ -109,14 +109,14 @@ static inline unsigned long fetch_reg(unsigned int reg, struct pt_regs *regs) static inline unsigned long safe_fetch_reg(unsigned int reg, struct pt_regs *regs) { - struct reg_window *win; + struct reg_window __user *win; unsigned long ret; - if(reg < 16) + if (reg < 16) return (!reg ? 0 : regs->u_regs[reg]); /* Ho hum, the slightly complicated case. */ - win = (struct reg_window *) regs->u_regs[UREG_FP]; + win = (struct reg_window __user *) regs->u_regs[UREG_FP]; if ((unsigned long)win & 3) return -1; @@ -137,8 +137,8 @@ static inline unsigned long *fetch_reg_addr(unsigned int reg, struct pt_regs *re return &win->locals[reg - 16]; } -static inline unsigned long compute_effective_address(struct pt_regs *regs, - unsigned int insn) +static unsigned long compute_effective_address(struct pt_regs *regs, + unsigned int insn) { unsigned int rs1 = (insn >> 14) & 0x1f; unsigned int rs2 = insn & 0x1f; @@ -153,8 +153,8 @@ static inline unsigned long compute_effective_address(struct pt_regs *regs, } } -static inline unsigned long safe_compute_effective_address(struct pt_regs *regs, - unsigned int insn) +unsigned long safe_compute_effective_address(struct pt_regs *regs, + unsigned int insn) { unsigned int rs1 = (insn >> 14) & 0x1f; unsigned int rs2 = insn & 0x1f; @@ -431,29 +431,32 @@ static inline int ok_for_user(struct pt_regs *regs, unsigned int insn, int retval, check = (dir == load) ? VERIFY_READ : VERIFY_WRITE; int size = ((insn >> 19) & 3) == 3 ? 8 : 4; - if((regs->pc | regs->npc) & 3) + if ((regs->pc | regs->npc) & 3) return 0; /* Must verify_area() in all the necessary places. */ -#define WINREG_ADDR(regnum) ((void *)(((unsigned long *)regs->u_regs[UREG_FP])+(regnum))) +#define WINREG_ADDR(regnum) \ + ((void __user *)(((unsigned long *)regs->u_regs[UREG_FP])+(regnum))) + retval = 0; reg = (insn >> 25) & 0x1f; - if(reg >= 16) { + if (reg >= 16) { retval = verify_area(check, WINREG_ADDR(reg - 16), size); - if(retval) + if (retval) return retval; } reg = (insn >> 14) & 0x1f; - if(reg >= 16) { + if (reg >= 16) { retval = verify_area(check, WINREG_ADDR(reg - 16), size); - if(retval) + if (retval) return retval; } - if(!(insn & 0x2000)) { + if (!(insn & 0x2000)) { reg = (insn & 0x1f); - if(reg >= 16) { - retval = verify_area(check, WINREG_ADDR(reg - 16), size); - if(retval) + if (reg >= 16) { + retval = verify_area(check, WINREG_ADDR(reg - 16), + size); + if (retval) return retval; } } @@ -470,7 +473,7 @@ void user_mna_trap_fault(struct pt_regs *regs, unsigned int insn) info.si_signo = SIGBUS; info.si_errno = 0; info.si_code = BUS_ADRALN; - info.si_addr = (void *)safe_compute_effective_address(regs, insn); + info.si_addr = (void __user *)safe_compute_effective_address(regs, insn); info.si_trapno = 0; send_sig_info(SIGBUS, &info, current); }