struct unwind_frame_info info;
if (!task) {
- unsigned long sp, ip, rp;
+ unsigned long sp;
+ struct pt_regs *r;
HERE:
asm volatile ("copy %%r30, %0" : "=r"(sp));
- ip = (unsigned long)&&HERE;
- rp = (unsigned long)__builtin_return_address(0);
- unwind_frame_init(&info, current, sp, ip, rp);
+ r = (struct pt_regs *)kmalloc(sizeof(struct pt_regs), GFP_KERNEL);
+ if (!r)
+ return;
+ memset(r, 0, sizeof(struct pt_regs));
+ r->iaoq[0] = (unsigned long)&&HERE;
+ r->gr[2] = (unsigned long)__builtin_return_address(0);
+ r->gr[30] = sp;
+ unwind_frame_init(&info, current, r);
+ kfree(r);
} else {
unwind_frame_init_from_blocked_task(&info, task);
}
struct siginfo si;
si.si_code = wot;
- si.si_addr = (void *) (regs->iaoq[0] & ~3);
+ si.si_addr = (void __user *) (regs->iaoq[0] & ~3);
si.si_signo = SIGTRAP;
si.si_errno = 0;
force_sig_info(SIGTRAP, &si, current);
show_regs(regs);
#endif
si.si_code = TRAP_BRKPT;
- si.si_addr = (void *) (regs->iaoq[0] & ~3);
+ si.si_addr = (void __user *) (regs->iaoq[0] & ~3);
si.si_signo = SIGTRAP;
force_sig_info(SIGTRAP, &si, current);
break;
#endif
si.si_signo = SIGTRAP;
si.si_code = TRAP_BRKPT;
- si.si_addr = (void *) (regs->iaoq[0] & ~3);
+ si.si_addr = (void __user *) (regs->iaoq[0] & ~3);
force_sig_info(SIGTRAP, &si, current);
return;
}
{
/* show_stack(NULL, (unsigned long *)regs->gr[30]); */
struct unwind_frame_info info;
- unwind_frame_init(&info, current, regs->gr[30], regs->iaoq[0], regs->gr[2]);
+ unwind_frame_init(&info, current, regs);
do_show_stack(&info);
}
give_sigill:
si.si_signo = SIGILL;
si.si_errno = 0;
- si.si_addr = (void *) regs->iaoq[0];
+ si.si_addr = (void __user *) regs->iaoq[0];
force_sig_info(SIGILL, &si, current);
return;
/* Overflow Trap, let the userland signal handler do the cleanup */
si.si_signo = SIGFPE;
si.si_code = FPE_INTOVF;
- si.si_addr = (void *) regs->iaoq[0];
+ si.si_addr = (void __user *) regs->iaoq[0];
force_sig_info(SIGFPE, &si, current);
return;
si.si_signo = SIGSEGV;
si.si_errno = 0;
if (code == 7)
- si.si_addr = (void *) regs->iaoq[0];
+ si.si_addr = (void __user *) regs->iaoq[0];
else
- si.si_addr = (void *) regs->ior;
+ si.si_addr = (void __user *) regs->ior;
force_sig_info(SIGSEGV, &si, current);
return;
si.si_signo = SIGBUS;
si.si_code = BUS_OBJERR;
si.si_errno = 0;
- si.si_addr = (void *) regs->ior;
+ si.si_addr = (void __user *) regs->ior;
force_sig_info(SIGBUS, &si, current);
return;
}
}
if (user_mode(regs)) {
- if ((fault_space>>SPACEID_SHIFT) != (regs->sr[7] >> SPACEID_SHIFT)) {
+ if ((fault_space >> SPACEID_SHIFT) != (regs->sr[7] >> SPACEID_SHIFT)) {
#ifdef PRINT_USER_FAULTS
if (fault_space == 0)
printk(KERN_DEBUG "User Fault on Kernel Space ");
si.si_signo = SIGSEGV;
si.si_errno = 0;
si.si_code = SEGV_MAPERR;
- si.si_addr = (void *) regs->ior;
+ si.si_addr = (void __user *) regs->ior;
force_sig_info(SIGSEGV, &si, current);
return;
}