Subversion Repositories HelenOS

Rev

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

Rev 2009 Rev 2015
Line 29... Line 29...
29
/** @addtogroup sparc64mm  
29
/** @addtogroup sparc64mm  
30
 * @{
30
 * @{
31
 */
31
 */
32
/**
32
/**
33
 * @file
33
 * @file
34
 * @brief   D-cache shootdown algorithm.
-
 
35
 */
34
 */
36
 
35
 
37
#include <arch/mm/cache.h>
36
#include <arch/mm/cache.h>
38
 
37
 
39
#ifdef CONFIG_SMP
-
 
40
 
-
 
41
#include <smp/ipi.h>
-
 
42
#include <arch/interrupt.h>
-
 
43
#include <synch/spinlock.h>
-
 
44
#include <arch.h>
-
 
45
#include <debug.h>
-
 
46
 
-
 
47
/**
-
 
48
 * This spinlock is used by the processors to synchronize during the D-cache
-
 
49
 * shootdown.
-
 
50
 */
-
 
51
SPINLOCK_INITIALIZE(dcachelock);
-
 
52
 
-
 
53
/** Initialize the D-cache shootdown sequence.
-
 
54
 *
-
 
55
 * Start the shootdown sequence by sending out an IPI and wait until all
-
 
56
 * processors spin on the dcachelock spinlock.
-
 
57
 */
-
 
58
void dcache_shootdown_start(void)
-
 
59
{
-
 
60
    int i;
-
 
61
 
-
 
62
    CPU->arch.dcache_active = 0;
-
 
63
    spinlock_lock(&dcachelock);
-
 
64
 
-
 
65
    ipi_broadcast(IPI_DCACHE_SHOOTDOWN);   
-
 
66
 
-
 
67
busy_wait:
-
 
68
    for (i = 0; i < config.cpu_count; i++)
-
 
69
        if (cpus[i].arch.dcache_active)
-
 
70
            goto busy_wait;
-
 
71
}
-
 
72
 
-
 
73
/** Finish the D-cache shootdown sequence. */
-
 
74
void dcache_shootdown_finalize(void)
-
 
75
{
-
 
76
    spinlock_unlock(&dcachelock);
-
 
77
    CPU->arch.dcache_active = 1;
-
 
78
}
-
 
79
 
-
 
80
/** Process the D-cache shootdown IPI. */
-
 
81
void dcache_shootdown_ipi_recv(void)
-
 
82
{
-
 
83
    ASSERT(CPU);
-
 
84
 
-
 
85
    CPU->arch.dcache_active = 0;
-
 
86
    spinlock_lock(&dcachelock);
-
 
87
    spinlock_unlock(&dcachelock);
-
 
88
   
-
 
89
    dcache_flush();
-
 
90
 
-
 
91
    CPU->arch.dcache_active = 1;
-
 
92
}
-
 
93
 
-
 
94
#endif /* CONFIG_SMP */
-
 
95
 
-
 
96
/** @}
38
/** @}
97
 */
39
 */
98
 
40