From c77d4150b7c5ce1e4aa2a4f96822eca488501c18 Mon Sep 17 00:00:00 2001 From: jhb Date: Mon, 5 Dec 2005 22:39:09 +0000 Subject: Change the i386 code to pass the interrupt vector as a separate argument rather than embedding it in the intrframe as if_vec. This reduces diffs with amd64 somewhat. - Remove cf_vec from clockframe (it wasn't used anyway) and stop pushing dummy vector arguments for ipi_bitmap_handler() and lapic_handle_timer() since clockframe == trapframe now. - Fix ddb to handle stack traces across interrupt entry points that just have a trapframe on their stack and not a trapframe + vector. - Change intr_execute_handlers() to take a trapframe rather than an intrframe pointer. - Change lapic_handle_intr() and atpic_handle_intr() to take a vector and trapframe rather than an intrframe. - GC struct intrframe now that nothing uses it anymore. - GC CLOCK_TO_TRAPFRAME() and INTR_TO_TRAPFRAME(). Reviewed by: bde Requested by: peter --- sys/i386/i386/apic_vector.s | 4 ---- sys/i386/i386/db_trace.c | 9 +++++++++ sys/i386/i386/intr_machdep.c | 8 ++++---- sys/i386/i386/local_apic.c | 6 +++--- sys/i386/include/apicvar.h | 2 +- sys/i386/include/frame.h | 32 +------------------------------- sys/i386/include/intr_machdep.h | 4 ++-- sys/i386/isa/atpic.c | 13 ++++++------- sys/i386/isa/icu.h | 2 +- 9 files changed, 27 insertions(+), 53 deletions(-) diff --git a/sys/i386/i386/apic_vector.s b/sys/i386/i386/apic_vector.s index 95537fb..455934a 100644 --- a/sys/i386/i386/apic_vector.s +++ b/sys/i386/i386/apic_vector.s @@ -104,9 +104,7 @@ IDTVEC(timerint) SET_KERNEL_SREGS FAKE_MCOUNT(TF_EIP(%esp)) - pushl $0 /* XXX convert trapframe to clockframe */ call lapic_handle_timer - addl $4, %esp /* XXX convert clockframe to trapframe */ MEXITCOUNT jmp doreti @@ -249,9 +247,7 @@ IDTVEC(ipi_intr_bitmap_handler) FAKE_MCOUNT(TF_EIP(%esp)) - pushl $0 /* XXX convert trapframe to clockframe */ call ipi_bitmap_handler - addl $4, %esp /* XXX convert clockframe to trapframe */ MEXITCOUNT jmp doreti diff --git a/sys/i386/i386/db_trace.c b/sys/i386/i386/db_trace.c index 5064065..1fbcd43 100644 --- a/sys/i386/i386/db_trace.c +++ b/sys/i386/i386/db_trace.c @@ -181,6 +181,7 @@ struct i386_frame { #define INTERRUPT 2 #define SYSCALL 3 #define DOUBLE_FAULT 4 +#define TRAP_INTERRUPT 5 static void db_nextframe(struct i386_frame **, db_addr_t *, struct thread *); static int db_numargs(struct i386_frame *); @@ -307,6 +308,13 @@ db_nextframe(struct i386_frame **fp, db_addr_t *ip, struct thread *td) frame_type = SYSCALL; else if (strcmp(name, "dblfault_handler") == 0) frame_type = DOUBLE_FAULT; + /* XXX: These are interrupts with trap frames. */ + else if (strcmp(name, "Xtimerint") == 0 || + strcmp(name, "Xcpustop") == 0 || + strcmp(name, "Xrendezvous") == 0 || + strcmp(name, "Xipi_intr_bitmap_handler") == 0 || + strcmp(name, "Xlazypmap") == 0) + frame_type = TRAP_INTERRUPT; } /* @@ -358,6 +366,7 @@ db_nextframe(struct i386_frame **fp, db_addr_t *ip, struct thread *td) db_printf("--- syscall"); decode_syscall(tf->tf_eax, td); break; + case TRAP_INTERRUPT: case INTERRUPT: db_printf("--- interrupt"); break; diff --git a/sys/i386/i386/intr_machdep.c b/sys/i386/i386/intr_machdep.c index fc360f1..b343780 100644 --- a/sys/i386/i386/intr_machdep.c +++ b/sys/i386/i386/intr_machdep.c @@ -149,7 +149,7 @@ intr_config_intr(int vector, enum intr_trigger trig, enum intr_polarity pol) } void -intr_execute_handlers(struct intsrc *isrc, struct intrframe *iframe) +intr_execute_handlers(struct intsrc *isrc, struct trapframe *frame) { struct thread *td; struct intr_event *ie; @@ -197,7 +197,7 @@ intr_execute_handlers(struct intsrc *isrc, struct intrframe *iframe) * Execute fast interrupt handlers directly. * To support clock handlers, if a handler registers * with a NULL argument, then we pass it a pointer to - * an intrframe as its argument. + * a trapframe as its argument. */ td->td_intr_nesting_level++; thread = 0; @@ -208,10 +208,10 @@ intr_execute_handlers(struct intsrc *isrc, struct intrframe *iframe) continue; } CTR4(KTR_INTR, "%s: exec %p(%p) for %s", __func__, - ih->ih_handler, ih->ih_argument == NULL ? iframe : + ih->ih_handler, ih->ih_argument == NULL ? frame : ih->ih_argument, ih->ih_name); if (ih->ih_argument == NULL) - ih->ih_handler(iframe); + ih->ih_handler(frame); else ih->ih_handler(ih->ih_argument); } diff --git a/sys/i386/i386/local_apic.c b/sys/i386/i386/local_apic.c index c14b789..f2d96b5 100644 --- a/sys/i386/i386/local_apic.c +++ b/sys/i386/i386/local_apic.c @@ -608,13 +608,13 @@ lapic_eoi(void) } void -lapic_handle_intr(struct intrframe frame) +lapic_handle_intr(int vector, struct trapframe frame) { struct intsrc *isrc; - if (frame.if_vec == -1) + if (vector == -1) panic("Couldn't get vector from ISR!"); - isrc = intr_lookup_source(apic_idt_to_irq(frame.if_vec)); + isrc = intr_lookup_source(apic_idt_to_irq(vector)); intr_execute_handlers(isrc, &frame); } diff --git a/sys/i386/include/apicvar.h b/sys/i386/include/apicvar.h index 1fd9905..0c00b3c 100644 --- a/sys/i386/include/apicvar.h +++ b/sys/i386/include/apicvar.h @@ -200,7 +200,7 @@ int lapic_intr_pending(u_int vector); void lapic_ipi_raw(register_t icrlo, u_int dest); void lapic_ipi_vectored(u_int vector, int dest); int lapic_ipi_wait(int delay); -void lapic_handle_intr(struct intrframe frame); +void lapic_handle_intr(int vector, struct trapframe frame); void lapic_handle_timer(struct clockframe frame); void lapic_set_logical_id(u_int apic_id, u_int cluster, u_int cluster_id); int lapic_set_lvt_mask(u_int apic_id, u_int lvt, u_char masked); diff --git a/sys/i386/include/frame.h b/sys/i386/include/frame.h index 391b874..26c5c9e 100644 --- a/sys/i386/include/frame.h +++ b/sys/i386/include/frame.h @@ -97,36 +97,9 @@ struct trapframe_vm86 { int tf_vm86_gs; }; -/* Interrupt stack frame */ - -struct intrframe { - int if_vec; - int if_fs; - int if_es; - int if_ds; - int if_edi; - int if_esi; - int if_ebp; - int :32; - int if_ebx; - int if_edx; - int if_ecx; - int if_eax; - int :32; /* for compat with trap frame - trapno */ - int :32; /* for compat with trap frame - err */ - /* below portion defined in 386 hardware */ - int if_eip; - int if_cs; - int if_eflags; - /* below only when crossing rings (e.g. user to kernel) */ - int if_esp; - int if_ss; -}; - -/* frame of clock (same as interrupt frame) */ +/* frame of clock (same as trap frame) */ struct clockframe { - int cf_vec; int cf_fs; int cf_es; int cf_ds; @@ -149,7 +122,4 @@ struct clockframe { int cf_ss; }; -#define CLOCK_TO_TRAPFRAME(frame) ((struct trapframe *)&(frame)->cf_fs) -#define INTR_TO_TRAPFRAME(frame) ((struct trapframe *)&(frame)->if_fs) - #endif /* _MACHINE_FRAME_H_ */ diff --git a/sys/i386/include/intr_machdep.h b/sys/i386/include/intr_machdep.h index d174ed0..4d5743a 100644 --- a/sys/i386/include/intr_machdep.h +++ b/sys/i386/include/intr_machdep.h @@ -107,7 +107,7 @@ struct intsrc { u_int is_index; }; -struct intrframe; +struct trapframe; extern struct mtx icu_lock; extern int elcr_found; @@ -121,7 +121,7 @@ int intr_add_handler(const char *name, int vector, driver_intr_t handler, void *arg, enum intr_type flags, void **cookiep); int intr_config_intr(int vector, enum intr_trigger trig, enum intr_polarity pol); -void intr_execute_handlers(struct intsrc *isrc, struct intrframe *iframe); +void intr_execute_handlers(struct intsrc *isrc, struct trapframe *frame); struct intsrc *intr_lookup_source(int vector); int intr_register_source(struct intsrc *isrc); int intr_remove_handler(void *cookie); diff --git a/sys/i386/isa/atpic.c b/sys/i386/isa/atpic.c index 862da92..4f29bd9 100644 --- a/sys/i386/isa/atpic.c +++ b/sys/i386/isa/atpic.c @@ -541,20 +541,19 @@ atpic_init(void *dummy __unused) SYSINIT(atpic_init, SI_SUB_INTR, SI_ORDER_SECOND + 1, atpic_init, NULL) void -atpic_handle_intr(struct intrframe iframe) +atpic_handle_intr(u_int vector, struct trapframe frame) { struct intsrc *isrc; - KASSERT((u_int)iframe.if_vec < NUM_ISA_IRQS, - ("unknown int %d\n", iframe.if_vec)); - isrc = &atintrs[iframe.if_vec].at_intsrc; + KASSERT(vector < NUM_ISA_IRQS, + ("unknown int %u\n", vector)); + isrc = &atintrs[vector].at_intsrc; /* * If we don't have an event, see if this is a spurious * interrupt. */ - if (isrc->is_event == NULL && - (iframe.if_vec == 7 || iframe.if_vec == 15)) { + if (isrc->is_event == NULL && (vector == 7 || vector == 15)) { int port, isr; /* @@ -570,7 +569,7 @@ atpic_handle_intr(struct intrframe iframe) if ((isr & IRQ_MASK(7)) == 0) return; } - intr_execute_handlers(isrc, &iframe); + intr_execute_handlers(isrc, &frame); } #ifdef DEV_ISA diff --git a/sys/i386/isa/icu.h b/sys/i386/isa/icu.h index b882022..a74f183 100644 --- a/sys/i386/isa/icu.h +++ b/sys/i386/isa/icu.h @@ -47,7 +47,7 @@ #define ICU_IMR_OFFSET 1 #endif -void atpic_handle_intr(struct intrframe iframe); +void atpic_handle_intr(u_int vector, struct trapframe frame); void atpic_startup(void); #endif /* !_I386_ISA_ICU_H_ */ -- cgit v1.1