2005-04-16 15:20:36 -07:00
/*
* linux / arch / m68knommu / mm / fault . c
*
* Copyright ( C ) 1998 D . Jeff Dionne < jeff @ lineo . ca > ,
2010-05-23 22:01:57 +02:00
* Copyright ( C ) 2000 Lineo , Inc . ( www . lineo . com )
2005-04-16 15:20:36 -07:00
*
* Based on :
*
* linux / arch / m68k / mm / fault . c
*
* Copyright ( C ) 1995 Hamish Macdonald
*/
# include <linux/mman.h>
# include <linux/mm.h>
# include <linux/kernel.h>
# include <linux/ptrace.h>
# include <asm/system.h>
# include <asm/pgtable.h>
extern void die_if_kernel ( char * , struct pt_regs * , long ) ;
/*
* This routine handles page faults . It determines the problem , and
* then passes it off to one of the appropriate routines .
*
* error_code :
* bit 0 = = 0 means no page found , 1 means protection fault
* bit 1 = = 0 means read , 1 means write
*
* If this routine detects a bad access , it returns 1 , otherwise it
* returns 0.
*/
asmlinkage int do_page_fault ( struct pt_regs * regs , unsigned long address ,
unsigned long error_code )
{
# ifdef DEBUG
2010-05-23 22:01:57 +02:00
printk ( KERN_DEBUG " regs->sr=%#x, regs->pc=%#lx, address=%#lx, %ld \n " ,
2005-04-16 15:20:36 -07:00
regs - > sr , regs - > pc , address , error_code ) ;
# endif
/*
* Oops . The kernel tried to access some bad page . We ' ll have to
* terminate things with extreme prejudice .
*/
2010-05-23 22:01:57 +02:00
if ( ( unsigned long ) address < PAGE_SIZE )
2005-04-16 15:20:36 -07:00
printk ( KERN_ALERT " Unable to handle kernel NULL pointer dereference " ) ;
2010-05-23 22:01:57 +02:00
else
2005-04-16 15:20:36 -07:00
printk ( KERN_ALERT " Unable to handle kernel access " ) ;
2010-05-23 22:01:57 +02:00
printk ( KERN_ALERT " at virtual address %08lx \n " , address ) ;
2005-04-16 15:20:36 -07:00
die_if_kernel ( " Oops " , regs , error_code ) ;
do_exit ( SIGKILL ) ;
return 1 ;
}