From: Andy P. <at...@us...> - 2001-08-20 21:30:55
|
Update of /cvsroot/linux-vax/kernel-2.4/arch/vax/kernel In directory usw-pr-cvs1:/tmp/cvs-serv24293 Modified Files: interrupt.c regdump.c Log Message: add vaxpanic convenience function and fix machine check handler and get_irq_list null deferences Index: interrupt.c =================================================================== RCS file: /cvsroot/linux-vax/kernel-2.4/arch/vax/kernel/interrupt.c,v retrieving revision 1.14 retrieving revision 1.15 diff -u -r1.14 -r1.15 --- interrupt.c 2001/08/19 10:32:57 1.14 +++ interrupt.c 2001/08/20 21:30:52 1.15 @@ -99,55 +99,78 @@ flush_icache(); } -void trap_init(void) + +/* register the machine check handler. */ +void register_mcheck_handler(void) { extern void machine_check_handler(void); - void *mhandler; + struct irqvector *vector; + unsigned char *inside_vec; + + /* first register things properly so that the irq functions dont get upset */ + if (register_excep_handler(SCB_MCHECK, "Machine Check (machine_check_handler)", machine_check_handler, 2, 1)) { + printk("Panic: unable to register machine check handler\n"); + machine_halt(); + } + + /* Install the specific machine check handler in entry.S + * We override the value set up above, in register_excep_handler, as + * its easier than special casing all the exception info sizing. + */ + inside_vec = (unsigned char *) ((unsigned long)(SCB_VECTOR(SCB_MCHECK)) & ~0x3); + vector = (struct irqvector *)(inside_vec - + offsetof(struct irqvector, inst_jsb)); + vector->dest_addr = machine_check_handler; +} +void trap_init(void) +{ + /* Initialize the SCB with the stray interrupt/exception handlers. Some of these will be overridden later as device drivers hook up to their interrupts. */ setup_scb(); - /* Install the specific machine check handler in entry.S - * bits 0-1 must contain 1. machine check handler is longword aligned - */ - mhandler = (void *)(machine_check_handler) + 1; - scb.scb.mcheck = mhandler; /* And tell the hardware to use this SCB */ __mtpr(__pa(&scb), PR_SCBB); - - /* Register the access violation, page fault, corrected + + /* register the machine check handler. This is a special case due to + * the machine specific exception info which is not fixed sized */ + register_mcheck_handler(); + + /* Register the access violation, page fault, corrected read and other standard exception handlers */ - if (register_excep_handler(SCB_ACCVIO, page_fault_handler, 2, 0)) { + + + if (register_excep_handler(SCB_ACCVIO, "access violation (page_fault_handler)", page_fault_handler, 2, 0)) { printk("Panic: unable to register access violation handler\n"); machine_halt(); } - if (register_excep_handler(SCB_TRANS_INVAL, page_fault_handler, 2, 0)) { + if (register_excep_handler(SCB_TRANS_INVAL, "translation not valid (page_fault_handler)", page_fault_handler, 2, 0)) { printk("Panic: unable to register page fault handler\n"); machine_halt(); } - if (register_excep_handler(SCB_RESOP, reserved_operand_handler, 0, 0)) { + if (register_excep_handler(SCB_RESOP, "reserved operand (reserved_operand_handler)", reserved_operand_handler, 0, 0)) { printk("Panic: unable to register reserved operand handler\n"); machine_halt(); } - if (register_excep_handler(SCB_RESINSTR, reserved_instr_handler, 0, 0)) { + if (register_excep_handler(SCB_RESINSTR, "reserved instruction (reserved_instr_handler)", reserved_instr_handler, 0, 0)) { printk("Panic: unable to register reserved operand handler\n"); machine_halt(); } - if (register_excep_handler(SCB_CHMK, syscall_handler, 1, 0)) { + if (register_excep_handler(SCB_CHMK,"CHMK trap (syscall_handler)", syscall_handler, 1, 0)) { printk("Panic: unable to register syscall handler\n"); machine_halt(); } /* Perhaps this should be done in CPU-specific code? */ - if (register_excep_handler(SCB_MEMCORR, corrected_read_handler, 0, 0)) { + if (register_excep_handler(SCB_MEMCORR,"memory corrected read (corrected_read_handler)", corrected_read_handler, 0, 0)) { printk("Panic: unable to register corrected read handler\n"); machine_halt(); } @@ -595,6 +618,7 @@ } int register_excep_handler(unsigned int vec_num, + char *exception_name, void (*handler)(struct pt_regs *, void *), unsigned int excep_info_size, unsigned int use_interrupt_stack) @@ -619,8 +643,11 @@ vector->excep_info_size = excep_info_size; vector->excep_handler = handler; - + vector->action.name = exception_name; /* needed to stop get_irq_list dying */ + /* FIXME: this doesnt set dev_id or other members of the irqaction structure .. */ + retval = hook_scb_vector(vec_num, vector, use_interrupt_stack); + if (retval) #ifdef KMALLOC_WORKS @@ -638,10 +665,9 @@ struct irqvector *vector; unsigned char *inside_vec; - printk("get irq list: \n"); +// printk("get irq list: \n"); for (i=0; i<NR_IRQS; i++) { - printk("\t%d: scb free %d\n",i,scb_vec_free(i)); if (!scb_vec_free(i)) { inside_vec = SCB_VECTOR(i); @@ -653,8 +679,10 @@ vector = (struct irqvector *)(inside_vec - offsetof(struct irqvector, inst_jsb)); + if (vector->action.name == NULL) + len += sprintf(buf+len, "%4d: %8d no interrupt vector name\n", vector->vec_num, 0); + else len += sprintf(buf+len, "%4d: %8d %s\n", vector->vec_num, 0, vector->action.name); - printk("%4d: %8d %s, len %d\n", vector->vec_num, 0, vector->action.name, len); } } return len; Index: regdump.c =================================================================== RCS file: /cvsroot/linux-vax/kernel-2.4/arch/vax/kernel/regdump.c,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- regdump.c 2001/01/29 00:57:00 1.2 +++ regdump.c 2001/08/20 21:30:52 1.3 @@ -229,3 +229,14 @@ show_regs(®s); } +/* little convenience function -- temporary debugging aid - atp */ +void vaxpanic(char *reason) +{ + if (reason) printk(KERN_CRIT "panic: %s\n",reason); + + printk(KERN_CRIT "\nStack dump\n"); + hex_dump((void *)__mfpr(PR_KSP), 256); + dump_cur_regs(1); /* us and parent */ + show_cpu_regs(); + machine_halt(); +} |