[PATCH 0/6] PowerPc 8xx TLB/MMU fixes
Benjamin Herrenschmidt
benh at kernel.crashing.org
Tue Oct 6 12:52:15 EST 2009
\
> So how does this look? Does it change anything?
> It should as the previous way was way off :(
>
> diff --git a/arch/powerpc/mm/fault.c b/arch/powerpc/mm/fault.c
> index c33c6de..08a392f 100644
> --- a/arch/powerpc/mm/fault.c
> +++ b/arch/powerpc/mm/fault.c
> @@ -153,7 +153,7 @@ int __kprobes do_page_fault(struct pt_regs *regs, unsigned long address,
> #ifdef DEBUG_DCBX
> const char *istr = NULL;
>
> - insn = *((unsigned long *)regs->nip);
> + __get_user(insn, (unsigned long __user *)regs->nip);
No, use get_user() not __get_user() or if you use the later, also use
access_ok(), and test the result in case it errors (if it does, you
probably want to just goto bad access and SEGV).
Cheers,
Ben.
> if (((insn >> (31-5)) & 0x3f) == 31) {
> if (((insn >> 1) & 0x3ff) == 1014) /* dcbz ? 0x3f6 */
> istr = "dcbz";
> @@ -178,11 +178,12 @@ int __kprobes do_page_fault(struct pt_regs *regs, unsigned long address,
> ra, rb, dar);
> is_write = 0;
> }
> -
> +#if 0
> if (trap == 0x300 && address != dar) {
> __asm__ ("mtdar %0" : : "r" (dar));
> return 0;
> }
> +#endif
> }
> }
> #endif
> @@ -191,7 +192,7 @@ int __kprobes do_page_fault(struct pt_regs *regs, unsigned long address,
>
> /* This is from a dcbX or icbi insn gone bad, these
> * insn do not set DAR so we have to do it here instead */
> - insn = *((unsigned long *)regs->nip);
> + __get_user(insn, (unsigned long __user *)regs->nip);
>
> ra = (insn >> (31-15)) & 0x1f; /* Reg RA */
> rb = (insn >> (31-20)) & 0x1f; /* Reg RB */
>
>
More information about the Linuxppc-dev
mailing list