diff options
author | Richard Braun <rbraun@sceen.net> | 2013-03-11 00:15:39 +0100 |
---|---|---|
committer | Richard Braun <rbraun@sceen.net> | 2013-03-11 00:15:39 +0100 |
commit | 59550d5c2fa1e9f5dcec20a4ae444afe923ca1c1 (patch) | |
tree | 078a9517057c93014ef1b2453723cecb927a2c6f /arch | |
parent | 661109c3a36d71bb7b4f9ceb71398f2bd9f8ebda (diff) |
x86/{tcb,trap}: implement rescheduling IPIs
Diffstat (limited to 'arch')
-rw-r--r-- | arch/x86/machine/tcb.c | 10 | ||||
-rw-r--r-- | arch/x86/machine/tcb.h | 15 | ||||
-rw-r--r-- | arch/x86/machine/trap.c | 4 | ||||
-rw-r--r-- | arch/x86/machine/trap.h | 1 | ||||
-rw-r--r-- | arch/x86/machine/trap_asm.S | 1 |
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) |