/SPARTAN/trunk/include/mm/tlb.h |
---|
31,20 → 31,20 |
#ifdef __SMP__ |
extern void tlb_init(void); |
extern void tlb_shutdown_start(void); |
extern void tlb_shutdown_finalize(void); |
extern void tlb_shutdown_ipi_recv(void); |
extern void tlb_shootdown_start(void); |
extern void tlb_shootdown_finalize(void); |
extern void tlb_shootdown_ipi_recv(void); |
#else |
#define tlb_init() ; |
#define tlb_shutdown_start() ; |
#define tlb_shutdown_finalize() ; |
#define tlb_shutdown_ipi_recv() ; |
#define tlb_shootdown_start() ; |
#define tlb_shootdown_finalize() ; |
#define tlb_shootdown_ipi_recv() ; |
#endif /* __SMP__ */ |
/* Export TLB interface that each architecture must implement. */ |
extern void tlb_invalidate(int asid); |
extern void tlb_shutdown_ipi_send(void); |
extern void tlb_shootdown_ipi_send(void); |
#endif |
/SPARTAN/trunk/src/mm/tlb.c |
---|
34,34 → 34,34 |
#ifdef __SMP__ |
static spinlock_t tlblock; |
static volatile int tlb_shutdown_cnt; |
static volatile int tlb_shootdown_cnt; |
void tlb_init(void) |
{ |
spinlock_initialize(&tlblock); |
tlb_shutdown_cnt = 0; |
tlb_shootdown_cnt = 0; |
} |
/* must be called with interrupts disabled */ |
void tlb_shutdown_start(void) |
void tlb_shootdown_start(void) |
{ |
spinlock_lock(&tlblock); |
tlb_shutdown_ipi_send(); |
tlb_shootdown_ipi_send(); |
while (tlb_shutdown_cnt < config.cpu_active - 1) |
while (tlb_shootdown_cnt < config.cpu_active - 1) |
; |
tlb_shutdown_cnt = 0; |
tlb_shootdown_cnt = 0; |
} |
void tlb_shutdown_finalize(void) |
void tlb_shootdown_finalize(void) |
{ |
spinlock_unlock(&tlblock); |
} |
void tlb_shutdown_ipi_recv(void) |
void tlb_shootdown_ipi_recv(void) |
{ |
atomic_inc((int *) &tlb_shutdown_cnt); |
atomic_inc((int *) &tlb_shootdown_cnt); |
spinlock_lock(&tlblock); |
spinlock_unlock(&tlblock); |
tlb_invalidate(0); /* TODO: use valid ASID */ |
/SPARTAN/trunk/src/mm/vm.c |
---|
170,7 → 170,7 |
pri = cpu_priority_high(); |
tlb_shutdown_start(); |
tlb_shootdown_start(); |
spinlock_lock(&m->lock); |
180,7 → 180,7 |
spinlock_unlock(&m->lock); |
tlb_invalidate(0); |
tlb_shutdown_finalize(); |
tlb_shootdown_finalize(); |
cpu_priority_restore(pri); |
} |
/SPARTAN/trunk/arch/ia32/include/interrupt.h |
---|
59,7 → 59,7 |
#define VECTOR_KBD (IVT_IRQBASE+IRQ_KBD) |
#define VECTOR_SYSCALL (IVT_FREEBASE+0) |
#define VECTOR_TLB_SHUTDOWN (IVT_FREEBASE+1) |
#define VECTOR_TLB_SHOOTDOWN (IVT_FREEBASE+1) |
typedef void (* iroutine)(__u8 n, __u32 stack[]); |
77,7 → 77,7 |
extern void gp_fault(__u8 n, __u32 stack[]); |
extern void page_fault(__u8 n, __u32 stack[]); |
extern void syscall(__u8 n, __u32 stack[]); |
extern void tlb_shutdown_ipi(__u8 n, __u32 stack[]); |
extern void tlb_shootdown_ipi(__u8 n, __u32 stack[]); |
extern void trap_virtual_enable_irqs(__u16 irqmask); |
extern void trap_virtual_disable_irqs(__u16 irqmask); |
/SPARTAN/trunk/arch/ia32/src/ia32.c |
---|
58,7 → 58,7 |
trap_register(VECTOR_SYSCALL, syscall); |
#ifdef __SMP__ |
trap_register(VECTOR_TLB_SHUTDOWN, tlb_shutdown_ipi); |
trap_register(VECTOR_TLB_SHOOTDOWN, tlb_shootdown_ipi); |
#endif /* __SMP__ */ |
} |
} |
/SPARTAN/trunk/arch/ia32/src/mm/tlb.c |
---|
40,8 → 40,8 |
} |
#ifdef __SMP__ |
void tlb_shutdown_ipi_send(void) |
void tlb_shootdown_ipi_send(void) |
{ |
(void) l_apic_broadcast_custom_ipi(VECTOR_TLB_SHUTDOWN); |
(void) l_apic_broadcast_custom_ipi(VECTOR_TLB_SHOOTDOWN); |
} |
#endif /* __SMP__ */ |
/SPARTAN/trunk/arch/ia32/src/interrupt.c |
---|
94,10 → 94,10 |
thread_sleep(1); |
} |
void tlb_shutdown_ipi(__u8 n, __u32 stack[]) |
void tlb_shootdown_ipi(__u8 n, __u32 stack[]) |
{ |
trap_virtual_eoi(); |
tlb_shutdown_ipi_recv(); |
tlb_shootdown_ipi_recv(); |
} |
void trap_virtual_enable_irqs(__u16 irqmask) |