Changeset f8ddd17 in mainline for kernel/arch/sparc64/src
- Timestamp:
- 2006-12-09T20:20:50Z (19 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- b82a13c
- Parents:
- 9ab9c2ec
- Location:
- kernel/arch/sparc64/src
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/arch/sparc64/src/mm/as.c
r9ab9c2ec rf8ddd17 49 49 #include <macros.h> 50 50 #endif /* CONFIG_TSB */ 51 52 #ifdef CONFIG_VIRT_IDX_DCACHE53 #include <arch/mm/cache.h>54 #endif /* CONFIG_VIRT_IDX_DCACHE */55 51 56 52 /** Architecture dependent address space init. */ … … 163 159 dtsb_base_write(tsb_base.value); 164 160 #endif 165 #ifdef CONFIG_VIRT_IDX_DCACHE166 if (as->dcache_flush_on_install) {167 /*168 * Some mappings in this address space are illegal address169 * aliases. Upon their creation, the dcache_flush_on_install170 * flag was set.171 *172 * We are now obliged to flush the D-cache in order to guarantee173 * that there will be at most one cache line for each address174 * alias.175 *176 * This flush performs a cleanup after another address space in177 * which the alias might have existed.178 */179 dcache_flush();180 }181 #endif /* CONFIG_VIRT_IDX_DCACHE */182 161 } 183 162 … … 214 193 } 215 194 #endif 216 #ifdef CONFIG_VIRT_IDX_DCACHE217 if (as->dcache_flush_on_deinstall) {218 /*219 * Some mappings in this address space are illegal address220 * aliases. Upon their creation, the dcache_flush_on_deinstall221 * flag was set.222 *223 * We are now obliged to flush the D-cache in order to guarantee224 * that there will be at most one cache line for each address225 * alias.226 *227 * This flush performs a cleanup after this address space. It is228 * necessary because other address spaces that contain the same229 * alias are not necessarily aware of the need to carry out the230 * cache flush. The only address spaces that are aware of it are231 * those that created the illegal alias.232 */233 dcache_flush();234 }235 #endif /* CONFIG_VIRT_IDX_DCACHE */236 195 } 237 196 -
kernel/arch/sparc64/src/mm/cache.c
r9ab9c2ec rf8ddd17 32 32 /** 33 33 * @file 34 * @brief D-cache shootdown algorithm.35 34 */ 36 35 37 36 #include <arch/mm/cache.h> 38 37 39 #ifdef CONFIG_SMP40 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-cache49 * 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 all56 * 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 */ -
kernel/arch/sparc64/src/mm/page.c
r9ab9c2ec rf8ddd17 74 74 for (i = 0; i < bsp_locked_dtlb_entries; i++) { 75 75 dtlb_insert_mapping(bsp_locked_dtlb_entry[i].virt_page, 76 bsp_locked_dtlb_entry[i].phys_page, bsp_locked_dtlb_entry[i].pagesize_code, 77 true, false); 76 bsp_locked_dtlb_entry[i].phys_page, 77 bsp_locked_dtlb_entry[i].pagesize_code, true, 78 false); 78 79 } 79 80 #endif … … 152 153 * Second, save the information about the mapping for APs. 153 154 */ 154 bsp_locked_dtlb_entry[bsp_locked_dtlb_entries].virt_page = virtaddr + i*sizemap[order].increment; 155 bsp_locked_dtlb_entry[bsp_locked_dtlb_entries].phys_page = physaddr + i*sizemap[order].increment; 156 bsp_locked_dtlb_entry[bsp_locked_dtlb_entries].pagesize_code = sizemap[order].pagesize_code; 155 bsp_locked_dtlb_entry[bsp_locked_dtlb_entries].virt_page = 156 virtaddr + i*sizemap[order].increment; 157 bsp_locked_dtlb_entry[bsp_locked_dtlb_entries].phys_page = 158 physaddr + i*sizemap[order].increment; 159 bsp_locked_dtlb_entry[bsp_locked_dtlb_entries].pagesize_code = 160 sizemap[order].pagesize_code; 157 161 bsp_locked_dtlb_entries++; 158 162 #endif -
kernel/arch/sparc64/src/smp/ipi.c
r9ab9c2ec rf8ddd17 39 39 #include <config.h> 40 40 #include <mm/tlb.h> 41 #include <arch/mm/cache.h>42 41 #include <arch/interrupt.h> 43 42 #include <arch/trap/interrupt.h> … … 122 121 func = tlb_shootdown_ipi_recv; 123 122 break; 124 case IPI_DCACHE_SHOOTDOWN:125 func = dcache_shootdown_ipi_recv;126 break;127 123 default: 128 124 panic("Unknown IPI (%d).\n", ipi); -
kernel/arch/sparc64/src/trap/interrupt.c
r9ab9c2ec rf8ddd17 45 45 #include <arch.h> 46 46 #include <mm/tlb.h> 47 #include <arch/mm/cache.h>48 47 #include <config.h> 49 48 #include <synch/spinlock.h> … … 92 91 if (data0 == (uintptr_t) tlb_shootdown_ipi_recv) { 93 92 tlb_shootdown_ipi_recv(); 94 } else if (data0 == (uintptr_t) dcache_shootdown_ipi_recv) {95 dcache_shootdown_ipi_recv();96 93 } 97 94 #endif
Note:
See TracChangeset
for help on using the changeset viewer.