@ -324,38 +324,10 @@ static inline int check_io_access(struct pt_regs *regs)
# define clear_single_step(regs) ((regs)->msr &= ~MSR_SE)
# endif
void machine_check_exception ( struct pt_regs * regs )
static int generic_ machine_check_exception( struct pt_regs * regs )
{
int recover = 0 ;
unsigned long reason = get_mc_reason ( regs ) ;
/* See if any machine dependent calls */
if ( ppc_md . machine_check_exception )
recover = ppc_md . machine_check_exception ( regs ) ;
if ( recover )
return ;
if ( user_mode ( regs ) ) {
regs - > msr | = MSR_RI ;
_exception ( SIGBUS , regs , BUS_ADRERR , regs - > nip ) ;
return ;
}
# if defined(CONFIG_8xx) && defined(CONFIG_PCI)
/* the qspan pci read routines can cause machine checks -- Cort */
bad_page_fault ( regs , regs - > dar , SIGBUS ) ;
return ;
# endif
if ( debugger_fault_handler ( regs ) ) {
regs - > msr | = MSR_RI ;
return ;
}
if ( check_io_access ( regs ) )
return ;
# if defined(CONFIG_4xx) && !defined(CONFIG_440A)
if ( reason & ESR_IMCP ) {
printk ( " Instruction " ) ;
@ -471,6 +443,42 @@ void machine_check_exception(struct pt_regs *regs)
}
# endif /* CONFIG_4xx */
return 0 ;
}
void machine_check_exception ( struct pt_regs * regs )
{
int recover = 0 ;
/* See if any machine dependent calls */
if ( ppc_md . machine_check_exception )
recover = ppc_md . machine_check_exception ( regs ) ;
else
recover = generic_machine_check_exception ( regs ) ;
if ( recover )
return ;
if ( user_mode ( regs ) ) {
regs - > msr | = MSR_RI ;
_exception ( SIGBUS , regs , BUS_ADRERR , regs - > nip ) ;
return ;
}
# if defined(CONFIG_8xx) && defined(CONFIG_PCI)
/* the qspan pci read routines can cause machine checks -- Cort */
bad_page_fault ( regs , regs - > dar , SIGBUS ) ;
return ;
# endif
if ( debugger_fault_handler ( regs ) ) {
regs - > msr | = MSR_RI ;
return ;
}
if ( check_io_access ( regs ) )
return ;
if ( debugger_fault_handler ( regs ) )
return ;
die ( " Machine check " , regs , SIGBUS ) ;