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:
parent
dc7a8b0067
commit
2dce95a085
@ -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
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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_ */
|
||||
|
@ -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);
|
||||
|
@ -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
|
||||
|
@ -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_ */
|
||||
|
Loading…
x
Reference in New Issue
Block a user