Subversion Repositories HelenOS

Rev

Rev 11 | Rev 32 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 11 Rev 31
Line 31... Line 31...
31
#include <synch/spinlock.h>
31
#include <synch/spinlock.h>
32
#include <typedefs.h>
32
#include <typedefs.h>
33
#include <arch/smp/atomic.h>
33
#include <arch/smp/atomic.h>
34
#include <arch/interrupt.h>
34
#include <arch/interrupt.h>
35
#include <config.h>
35
#include <config.h>
-
 
36
#include <arch.h>
36
 
37
 
37
#ifdef __SMP__
38
#ifdef __SMP__
38
static spinlock_t tlblock;
39
static spinlock_t tlblock;
39
static volatile int tlb_shootdown_cnt;
-
 
40
 
40
 
41
void tlb_init(void)
41
void tlb_init(void)
42
{
42
{
43
    spinlock_initialize(&tlblock);
43
    spinlock_initialize(&tlblock);
44
    tlb_shootdown_cnt = 0;
-
 
45
}
44
}
46
 
45
 
47
/* must be called with interrupts disabled */
46
/* must be called with interrupts disabled */
48
void tlb_shootdown_start(void)
47
void tlb_shootdown_start(void)
49
{
48
{
-
 
49
    int i;
-
 
50
 
-
 
51
    CPU->tlb_active = 0;
50
    spinlock_lock(&tlblock);
52
    spinlock_lock(&tlblock);
51
    tlb_shootdown_ipi_send();
53
    tlb_shootdown_ipi_send();
-
 
54
    tlb_invalidate(0); /* TODO: use valid ASID */
52
   
55
   
-
 
56
busy_wait: 
53
    while (tlb_shootdown_cnt < config.cpu_active - 1)
57
    for (i = 0; i<config.cpu_active; i++)
54
        ;
58
        if (cpus[i].tlb_active)
55
       
-
 
56
    tlb_shootdown_cnt = 0;
59
            goto busy_wait;
57
}
60
}
58
 
61
 
59
void tlb_shootdown_finalize(void)
62
void tlb_shootdown_finalize(void)
60
{
63
{
61
    spinlock_unlock(&tlblock);
64
    spinlock_unlock(&tlblock);
-
 
65
    CPU->tlb_active = 1;
62
}
66
}
63
 
67
 
64
void tlb_shootdown_ipi_send(void)
68
void tlb_shootdown_ipi_send(void)
65
{
69
{
66
    ipi_broadcast(VECTOR_TLB_SHOOTDOWN_IPI);
70
    ipi_broadcast(VECTOR_TLB_SHOOTDOWN_IPI);
67
}
71
}
68
 
72
 
69
void tlb_shootdown_ipi_recv(void)
73
void tlb_shootdown_ipi_recv(void)
70
{
74
{
71
    atomic_inc((int *) &tlb_shootdown_cnt);
75
    CPU->tlb_active = 0;
72
    spinlock_lock(&tlblock);
76
    spinlock_lock(&tlblock);
73
    spinlock_unlock(&tlblock);
77
    spinlock_unlock(&tlblock);
74
    tlb_invalidate(0);  /* TODO: use valid ASID */
78
    tlb_invalidate(0);  /* TODO: use valid ASID */
-
 
79
    CPU->tlb_active = 1;
75
}
80
}
76
#endif /* __SMP__ */
81
#endif /* __SMP__ */