Subversion Repositories HelenOS-historic

Compare Revisions

Ignore whitespace Rev 5 → Rev 6

/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)