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
This commit is contained in:
John Baldwin 2005-12-05 22:39:09 +00:00
parent dc7a8b0067
commit 2dce95a085
9 changed files with 27 additions and 53 deletions

View File

@ -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

View File

@ -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;

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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);

View File

@ -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_ */

View File

@ -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);

View File

@ -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

View File

@ -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_ */