summaryrefslogtreecommitdiff
path: root/arch
diff options
context:
space:
mode:
authorRichard Braun <rbraun@sceen.net>2013-03-11 00:15:39 +0100
committerRichard Braun <rbraun@sceen.net>2013-03-11 00:15:39 +0100
commit59550d5c2fa1e9f5dcec20a4ae444afe923ca1c1 (patch)
tree078a9517057c93014ef1b2453723cecb927a2c6f /arch
parent661109c3a36d71bb7b4f9ceb71398f2bd9f8ebda (diff)
x86/{tcb,trap}: implement rescheduling IPIs
Diffstat (limited to 'arch')
-rw-r--r--arch/x86/machine/tcb.c10
-rw-r--r--arch/x86/machine/tcb.h15
-rw-r--r--arch/x86/machine/trap.c4
-rw-r--r--arch/x86/machine/trap.h1
-rw-r--r--arch/x86/machine/trap_asm.S1
5 files changed, 31 insertions, 0 deletions
diff --git a/arch/x86/machine/tcb.c b/arch/x86/machine/tcb.c
index c1f2500..90f08b5 100644
--- a/arch/x86/machine/tcb.c
+++ b/arch/x86/machine/tcb.c
@@ -47,3 +47,13 @@ tcb_load(struct tcb *tcb)
tcb_set_current(tcb);
tcb_context_load(tcb);
}
+
+void
+tcb_reschedule_intr(struct trap_frame *frame)
+{
+ (void)frame;
+
+ lapic_eoi();
+
+ /* Let the return from interrupt code handle rescheduling */
+}
diff --git a/arch/x86/machine/tcb.h b/arch/x86/machine/tcb.h
index 8bf6a00..886237e 100644
--- a/arch/x86/machine/tcb.h
+++ b/arch/x86/machine/tcb.h
@@ -24,6 +24,7 @@
#include <kern/assert.h>
#include <kern/macros.h>
#include <machine/cpu.h>
+#include <machine/lapic.h>
#include <machine/trap.h>
/*
@@ -80,4 +81,18 @@ tcb_switch(struct tcb *prev, struct tcb *next)
tcb_context_switch(prev, next);
}
+/*
+ * Send a rescheduling interrupt to a remote processor.
+ */
+static inline void
+tcb_send_reschedule(unsigned int cpu)
+{
+ lapic_ipi_send(cpu, TRAP_RESCHEDULE);
+}
+
+/*
+ * Interrupt handler for rescheduling requests.
+ */
+void tcb_reschedule_intr(struct trap_frame *frame);
+
#endif /* _X86_TCB_H */
diff --git a/arch/x86/machine/trap.c b/arch/x86/machine/trap.c
index 8591aa5..254f5ed 100644
--- a/arch/x86/machine/trap.c
+++ b/arch/x86/machine/trap.c
@@ -30,6 +30,7 @@
#include <machine/pic.h>
#include <machine/pmap.h>
#include <machine/strace.h>
+#include <machine/tcb.h>
#include <machine/trap.h>
/*
@@ -75,6 +76,7 @@ void trap_isr_machine_check(void);
void trap_isr_simd_fp_exception(void);
void trap_isr_pic_int7(void);
void trap_isr_pic_int15(void);
+void trap_isr_reschedule(void);
void trap_isr_pmap_update(void);
void trap_isr_cpu_halt(void);
void trap_isr_lapic_timer(void);
@@ -201,6 +203,8 @@ trap_setup(void)
trap_isr_pic_int15, pic_intr_spurious);
/* System defined traps */
+ trap_install(TRAP_RESCHEDULE, TRAP_HF_NOPREEMPT,
+ trap_isr_reschedule, tcb_reschedule_intr);
trap_install(TRAP_PMAP_UPDATE, TRAP_HF_NOPREEMPT,
trap_isr_pmap_update, pmap_update_intr);
trap_install(TRAP_CPU_HALT, TRAP_HF_NOPREEMPT,
diff --git a/arch/x86/machine/trap.h b/arch/x86/machine/trap.h
index cc805de..8952024 100644
--- a/arch/x86/machine/trap.h
+++ b/arch/x86/machine/trap.h
@@ -53,6 +53,7 @@
*
* The local APIC assigns one priority every 16 vectors.
*/
+#define TRAP_RESCHEDULE 238
#define TRAP_PMAP_UPDATE 239
#define TRAP_CPU_HALT 240
#define TRAP_LAPIC_TIMER 253
diff --git a/arch/x86/machine/trap_asm.S b/arch/x86/machine/trap_asm.S
index cf51b38..535ede3 100644
--- a/arch/x86/machine/trap_asm.S
+++ b/arch/x86/machine/trap_asm.S
@@ -157,6 +157,7 @@ TRAP(TRAP_PIC_BASE + 7, pic_int7)
TRAP(TRAP_PIC_BASE + 15, pic_int15)
/* System defined traps */
+TRAP(TRAP_RESCHEDULE, reschedule)
TRAP(TRAP_PMAP_UPDATE, pmap_update)
TRAP(TRAP_CPU_HALT, cpu_halt)
TRAP(TRAP_LAPIC_TIMER, lapic_timer)