X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=arch%2Falpha%2Fmm%2Ffault.c;h=e5a0c5c7828238087ad676f176524687e3b28601;hb=refs%2Fheads%2Fvserver;hp=242317d15093ee6adf7b428840843d4a6ece6d01;hpb=9213980e6a70d8473e0ffd4b39ab5b6caaba9ff5;p=linux-2.6.git diff --git a/arch/alpha/mm/fault.c b/arch/alpha/mm/fault.c index 242317d15..e5a0c5c78 100644 --- a/arch/alpha/mm/fault.c +++ b/arch/alpha/mm/fault.c @@ -4,7 +4,6 @@ * Copyright (C) 1995 Linus Torvalds */ -#include #include #include #include @@ -98,7 +97,7 @@ do_page_fault(unsigned long address, unsigned long mmcsr, by ignoring such an instruction. */ if (cause == 0) { unsigned int insn; - __get_user(insn, (unsigned int *)regs->pc); + __get_user(insn, (unsigned int __user *)regs->pc); if ((insn >> 21 & 0x1f) == 0x1f && /* ldq ldl ldt lds ldg ldf ldwu ldbu */ (1ul << (insn >> 26) & 0x30f00001400ul)) { @@ -109,7 +108,7 @@ do_page_fault(unsigned long address, unsigned long mmcsr, /* If we're in an interrupt context, or have no user context, we must not take the fault. */ - if (!mm || in_interrupt()) + if (!mm || in_atomic()) goto no_context; #ifdef CONFIG_ALPHA_LARGE_VMALLOC @@ -194,13 +193,13 @@ do_page_fault(unsigned long address, unsigned long mmcsr, /* We ran out of memory, or some other thing happened to us that made us unable to handle the page fault gracefully. */ out_of_memory: - if (current->pid == 1) { + if (is_init(current)) { yield(); down_read(&mm->mmap_sem); goto survive; } - printk(KERN_ALERT "VM: killing process %s(%d)\n", - current->comm, current->pid); + printk(KERN_ALERT "VM: killing process %s(%d:#%u)\n", + current->comm, current->pid, current->xid); if (!user_mode(regs)) goto no_context; do_exit(SIGKILL); @@ -211,7 +210,7 @@ do_page_fault(unsigned long address, unsigned long mmcsr, info.si_signo = SIGBUS; info.si_errno = 0; info.si_code = BUS_ADRERR; - info.si_addr = (void *) address; + info.si_addr = (void __user *) address; force_sig_info(SIGBUS, &info, current); if (!user_mode(regs)) goto no_context; @@ -221,7 +220,7 @@ do_page_fault(unsigned long address, unsigned long mmcsr, info.si_signo = SIGSEGV; info.si_errno = 0; info.si_code = si_code; - info.si_addr = (void *) address; + info.si_addr = (void __user *) address; force_sig_info(SIGSEGV, &info, current); return;