Subversion Repositories HelenOS-historic

Compare Revisions

Ignore whitespace Rev 28 → Rev 31

/SPARTAN/trunk/src/Makefile.config
22,7 → 22,7
#TEST_DIR=synch/rwlock1/
#TEST_DIR=synch/rwlock2/
#TEST_DIR=synch/rwlock3/
#TEST_DIR=synch/rwlock4/
TEST_DIR=synch/rwlock5/
TEST_DIR=synch/rwlock4/
#TEST_DIR=synch/rwlock5/
#TEST_DIR=synch/semaphore1/
#TEST_DIR=synch/semaphore2/
/SPARTAN/trunk/src/cpu/cpu.c
82,6 → 82,7
#endif /* __SMP__ */
CPU->active = 1;
CPU->tlb_active = 1;
cpu_identify();
cpu_arch_init();
/SPARTAN/trunk/src/mm/tlb.c
33,32 → 33,36
#include <arch/smp/atomic.h>
#include <arch/interrupt.h>
#include <config.h>
#include <arch.h>
 
#ifdef __SMP__
static spinlock_t tlblock;
static volatile int tlb_shootdown_cnt;
 
void tlb_init(void)
{
spinlock_initialize(&tlblock);
tlb_shootdown_cnt = 0;
}
 
/* must be called with interrupts disabled */
void tlb_shootdown_start(void)
{
int i;
 
CPU->tlb_active = 0;
spinlock_lock(&tlblock);
tlb_shootdown_ipi_send();
tlb_invalidate(0); /* TODO: use valid ASID */
while (tlb_shootdown_cnt < config.cpu_active - 1)
;
tlb_shootdown_cnt = 0;
busy_wait:
for (i = 0; i<config.cpu_active; i++)
if (cpus[i].tlb_active)
goto busy_wait;
}
 
void tlb_shootdown_finalize(void)
{
spinlock_unlock(&tlblock);
CPU->tlb_active = 1;
}
 
void tlb_shootdown_ipi_send(void)
68,9 → 72,10
 
void tlb_shootdown_ipi_recv(void)
{
atomic_inc((int *) &tlb_shootdown_cnt);
CPU->tlb_active = 0;
spinlock_lock(&tlblock);
spinlock_unlock(&tlblock);
tlb_invalidate(0); /* TODO: use valid ASID */
CPU->tlb_active = 1;
}
#endif /* __SMP__ */
/SPARTAN/trunk/src/mm/vm.c
179,7 → 179,6
 
spinlock_unlock(&m->lock);
 
tlb_invalidate(0);
tlb_shootdown_finalize();
 
cpu_priority_restore(pri);