CRIS: Minor fixes to mm/fault.c

- Only disallow oops if we're in_interrupt context (was in_atomic before)
- Use the generic oops_in_progress instead of the raw_printk hack.
- Fix whitespace/formatting.
- Remove CVS log entries.
This commit is contained in:
Jesper Nilsson 2007-11-30 13:59:57 +01:00
parent 75e52b279c
commit 3e1fdc4eac

View File

@ -1,131 +1,10 @@
/* /*
* linux/arch/cris/mm/fault.c * linux/arch/cris/mm/fault.c
* *
* Copyright (C) 2000, 2001 Axis Communications AB * Copyright (C) 2000-2006 Axis Communications AB
* *
* Authors: Bjorn Wesen * Authors: Bjorn Wesen
* *
* $Log: fault.c,v $
* Revision 1.20 2005/03/04 08:16:18 starvik
* Merge of Linux 2.6.11.
*
* Revision 1.19 2005/01/14 10:07:59 starvik
* Fixed warning.
*
* Revision 1.18 2005/01/12 08:10:14 starvik
* Re-added the change of frametype when handling kernel page fault fixup
* for v10. This is necessary to avoid that the CPU remakes the faulting
* access.
*
* Revision 1.17 2005/01/11 13:53:05 starvik
* Use raw_printk.
*
* Revision 1.16 2004/12/17 11:39:41 starvik
* SMP support.
*
* Revision 1.15 2004/11/23 18:36:18 starvik
* Stack is now non-executable.
* Signal handler trampolines are placed in a reserved page mapped into all
* processes.
*
* Revision 1.14 2004/11/23 07:10:21 starvik
* Moved find_fixup_code to generic code.
*
* Revision 1.13 2004/11/23 07:00:54 starvik
* Actually use the execute permission bit in the MMU. This makes it possible
* to prevent e.g. attacks where executable code is put on the stack.
*
* Revision 1.12 2004/09/29 06:16:04 starvik
* Use instruction_pointer
*
* Revision 1.11 2004/05/14 07:58:05 starvik
* Merge of changes from 2.4
*
* Revision 1.10 2003/10/27 14:51:24 starvik
* Removed debugcode
*
* Revision 1.9 2003/10/27 14:50:42 starvik
* Changed do_page_fault signature
*
* Revision 1.8 2003/07/04 13:02:48 tobiasa
* Moved code snippet from arch/cris/mm/fault.c that searches for fixup code
* to separate function in arch-specific files.
*
* Revision 1.7 2003/01/22 06:48:38 starvik
* Fixed warnings issued by GCC 3.2.1
*
* Revision 1.6 2003/01/09 14:42:52 starvik
* Merge of Linux 2.5.55
*
* Revision 1.5 2002/12/11 14:44:48 starvik
* Extracted v10 (ETRAX 100LX) specific stuff to arch/cris/arch-v10/mm
*
* Revision 1.4 2002/11/13 15:10:28 starvik
* pte_offset has been renamed to pte_offset_kernel
*
* Revision 1.3 2002/11/05 06:45:13 starvik
* Merge of Linux 2.5.45
*
* Revision 1.2 2001/12/18 13:35:22 bjornw
* Applied the 2.4.13->2.4.16 CRIS patch to 2.5.1 (is a copy of 2.4.15).
*
* Revision 1.20 2001/11/22 13:34:06 bjornw
* * Bug workaround (LX TR89): force a rerun of the whole of an interrupted
* unaligned write, because the second half of the write will be corrupted
* otherwise. Affected unaligned writes spanning not-yet mapped pages.
* * Optimization: use the wr_rd bit in R_MMU_CAUSE to know whether a miss
* was due to a read or a write (before we didn't know this until the next
* restart of the interrupted instruction, thus wasting one fault-irq)
*
* Revision 1.19 2001/11/12 19:02:10 pkj
* Fixed compiler warnings.
*
* Revision 1.18 2001/07/18 22:14:32 bjornw
* Enable interrupts in the bulk of do_page_fault
*
* Revision 1.17 2001/07/18 13:07:23 bjornw
* * Detect non-existant PTE's in vmalloc pmd synchronization
* * Remove comment about fast-paths for VMALLOC_START etc, because all that
* was totally bogus anyway it turned out :)
* * Fix detection of vmalloc-area synchronization
* * Add some comments
*
* Revision 1.16 2001/06/13 00:06:08 bjornw
* current_pgd should be volatile
*
* Revision 1.15 2001/06/13 00:02:23 bjornw
* Use a separate variable to store the current pgd to avoid races in schedule
*
* Revision 1.14 2001/05/16 17:41:07 hp
* Last comment tweak further tweaked.
*
* Revision 1.13 2001/05/15 00:58:44 hp
* Expand a bit on the comment why we compare address >= TASK_SIZE rather
* than >= VMALLOC_START.
*
* Revision 1.12 2001/04/04 10:51:14 bjornw
* mmap_sem is grabbed for reading
*
* Revision 1.11 2001/03/23 07:36:07 starvik
* Corrected according to review remarks
*
* Revision 1.10 2001/03/21 16:10:11 bjornw
* CRIS_FRAME_FIXUP not needed anymore, use FRAME_NORMAL
*
* Revision 1.9 2001/03/05 13:22:20 bjornw
* Spell-fix and fix in vmalloc_fault handling
*
* Revision 1.8 2000/11/22 14:45:31 bjornw
* * 2.4.0-test10 removed the set_pgdir instantaneous kernel global mapping
* into all processes. Instead we fill in the missing PTE entries on demand.
*
* Revision 1.7 2000/11/21 16:39:09 bjornw
* fixup switches frametype
*
* Revision 1.6 2000/11/17 16:54:08 bjornw
* More detailed siginfo reporting
*
*
*/ */
#include <linux/mm.h> #include <linux/mm.h>
@ -135,7 +14,6 @@
extern int find_fixup_code(struct pt_regs *); extern int find_fixup_code(struct pt_regs *);
extern void die_if_kernel(const char *, struct pt_regs *, long); extern void die_if_kernel(const char *, struct pt_regs *, long);
extern int raw_printk(const char *fmt, ...);
/* debug of low-level TLB reload */ /* debug of low-level TLB reload */
#undef DEBUG #undef DEBUG
@ -181,7 +59,8 @@ do_page_fault(unsigned long address, struct pt_regs *regs,
siginfo_t info; siginfo_t info;
int fault; int fault;
D(printk("Page fault for %lX on %X at %lX, prot %d write %d\n", D(printk(KERN_DEBUG
"Page fault for %lX on %X at %lX, prot %d write %d\n",
address, smp_processor_id(), instruction_pointer(regs), address, smp_processor_id(), instruction_pointer(regs),
protection, writeaccess)); protection, writeaccess));
@ -233,7 +112,7 @@ do_page_fault(unsigned long address, struct pt_regs *regs,
* context, we must not take the fault.. * context, we must not take the fault..
*/ */
if (in_atomic() || !mm) if (in_interrupt() || !mm)
goto no_context; goto no_context;
down_read(&mm->mmap_sem); down_read(&mm->mmap_sem);
@ -319,6 +198,9 @@ do_page_fault(unsigned long address, struct pt_regs *regs,
/* info.si_code has been set above */ /* info.si_code has been set above */
info.si_addr = (void *)address; info.si_addr = (void *)address;
force_sig_info(SIGSEGV, &info, tsk); force_sig_info(SIGSEGV, &info, tsk);
printk(KERN_NOTICE "%s (pid %d) segfaults for page "
"address %08lx at pc %08lx\n",
tsk->comm, tsk->pid, address, instruction_pointer(regs));
return; return;
} }
@ -341,13 +223,18 @@ do_page_fault(unsigned long address, struct pt_regs *regs,
* terminate things with extreme prejudice. * terminate things with extreme prejudice.
*/ */
if (!oops_in_progress) {
oops_in_progress = 1;
if ((unsigned long) (address) < PAGE_SIZE) if ((unsigned long) (address) < PAGE_SIZE)
raw_printk(KERN_ALERT "Unable to handle kernel NULL pointer dereference"); printk(KERN_ALERT "Unable to handle kernel NULL "
"pointer dereference");
else else
raw_printk(KERN_ALERT "Unable to handle kernel access"); printk(KERN_ALERT "Unable to handle kernel access"
raw_printk(" at virtual address %08lx\n",address); " at virtual address %08lx\n", address);
die_if_kernel("Oops", regs, (writeaccess << 1) | protection); die_if_kernel("Oops", regs, (writeaccess << 1) | protection);
oops_in_progress = 0;
}
do_exit(SIGKILL); do_exit(SIGKILL);
@ -360,7 +247,7 @@ do_page_fault(unsigned long address, struct pt_regs *regs,
up_read(&mm->mmap_sem); up_read(&mm->mmap_sem);
printk("VM: killing process %s\n", tsk->comm); printk("VM: killing process %s\n", tsk->comm);
if (user_mode(regs)) if (user_mode(regs))
do_group_exit(SIGKILL); do_exit(SIGKILL);
goto no_context; goto no_context;
do_sigbus: do_sigbus: