Changeset 57da95c in mainline for kernel/arch/sparc64/src
- Timestamp:
- 2006-09-18T11:47:28Z (19 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 29b2bbf
- Parents:
- f1d1f5d3
- Location:
- kernel/arch/sparc64/src
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/arch/sparc64/src/mm/as.c
rf1d1f5d3 r57da95c 37 37 #include <genarch/mm/as_ht.h> 38 38 #include <genarch/mm/asid_fifo.h> 39 #include <debug.h> 40 41 #ifdef CONFIG_TSB 42 #include <arch/mm/tsb.h> 43 #endif 39 44 40 45 /** Architecture dependent address space init. */ … … 45 50 } 46 51 52 /** Perform sparc64-specific tasks when an address space becomes active on the processor. 53 * 54 * Install ASID and map TSBs. 55 * 56 * @param as Address space. 57 */ 47 58 void as_install_arch(as_t *as) 48 59 { 49 60 tlb_context_reg_t ctx; 61 62 /* 63 * Note that we don't lock the address space. 64 * That's correct - we can afford it here 65 * because we only read members that are 66 * currently read-only. 67 */ 50 68 51 69 /* … … 59 77 ctx.context = as->asid; 60 78 mmu_secondary_context_write(ctx.v); 79 80 #ifdef CONFIG_TSB 81 if (as != AS_KERNEL) { 82 uintptr_t base = ALIGN_DOWN(config.base, 1 << KERNEL_PAGE_WIDTH); 83 84 ASSERT(as->arch.itsb && as->arch.dtsb); 85 86 uintptr_t tsb = as->arch.itsb; 87 88 if (!overlaps(tsb, 8*PAGE_SIZE, base, 1 << KERNEL_PAGE_WIDTH)) { 89 /* 90 * TSBs were allocated from memory not covered 91 * by the locked 4M kernel DTLB entry. We need 92 * to map both TSBs explicitly. 93 */ 94 dtlb_demap(TLB_DEMAP_PAGE, TLB_DEMAP_NUCLEUS, tsb); 95 dtlb_insert_mapping(tsb, KA2PA(tsb), PAGESIZE_64K, true, true); 96 } 97 98 /* 99 * Setup TSB Base registers. 100 */ 101 tsb_base_reg_t tsb_base; 102 103 tsb_base.value = 0; 104 tsb_base.size = TSB_SIZE; 105 tsb_base.split = 0; 106 107 tsb_base.base = as->arch.itsb >> PAGE_WIDTH; 108 itsb_base_write(tsb_base.value); 109 tsb_base.base = as->arch.dtsb >> PAGE_WIDTH; 110 dtsb_base_write(tsb_base.value); 111 } 112 #endif 113 } 114 115 /** Perform sparc64-specific tasks when an address space is removed from the processor. 116 * 117 * Demap TSBs. 118 * 119 * @param as Address space. 120 */ 121 void as_deinstall_arch(as_t *as) 122 { 123 124 /* 125 * Note that we don't lock the address space. 126 * That's correct - we can afford it here 127 * because we only read members that are 128 * currently read-only. 129 */ 130 131 #ifdef CONFIG_TSB 132 if (as != AS_KERNEL) { 133 uintptr_t base = ALIGN_DOWN(config.base, 1 << KERNEL_PAGE_WIDTH); 134 135 ASSERT(as->arch.itsb && as->arch.dtsb); 136 137 uintptr_t tsb = as->arch.itsb; 138 139 if (!overlaps(tsb, 8*PAGE_SIZE, base, 1 << KERNEL_PAGE_WIDTH)) { 140 /* 141 * TSBs were allocated from memory not covered 142 * by the locked 4M kernel DTLB entry. We need 143 * to demap the entry installed by as_install_arch(). 144 */ 145 dtlb_demap(TLB_DEMAP_PAGE, TLB_DEMAP_NUCLEUS, tsb); 146 } 147 148 } 149 #endif 61 150 } 62 151 -
kernel/arch/sparc64/src/proc/scheduler.c
rf1d1f5d3 r57da95c 121 121 if ((THREAD->flags & THREAD_FLAG_USPACE)) { 122 122 /* 123 * If this thread executes also in userspace, we have to force all 124 * its still-active userspace windows into the userspace window buffer 125 * and demap the buffer from DTLB. 123 * If this thread executes also in userspace, we have to 124 * demap the userspace window buffer from DTLB. 126 125 */ 127 126 ASSERT(THREAD->arch.uspace_window_buffer);
Note:
See TracChangeset
for help on using the changeset viewer.