|
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();
+}
|