summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
Diffstat (limited to 'sys')
-rw-r--r--sys/i386/i386/apic_vector.s4
-rw-r--r--sys/i386/i386/db_trace.c9
-rw-r--r--sys/i386/i386/intr_machdep.c8
-rw-r--r--sys/i386/i386/local_apic.c6
-rw-r--r--sys/i386/include/apicvar.h2
-rw-r--r--sys/i386/include/frame.h32
-rw-r--r--sys/i386/include/intr_machdep.h4
-rw-r--r--sys/i386/isa/atpic.c13
-rw-r--r--sys/i386/isa/icu.h2
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_ */
OpenPOWER on IntegriCloud