Message ID | OF2DE63E1A.21EA8BF0-ONC1257646.0082A7F0-C1257646.0082E281@transmode.se (mailing list archive) |
---|---|
State | Superseded, archived |
Headers | show |
\ > 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 */ > >
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); 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 */