Changeset 46c20c8 in mainline for kernel/arch/sparc64/src/mm/sun4u
- Timestamp:
- 2010-11-26T20:08:10Z (15 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/fix-logger-deadlock, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 45df59a
- Parents:
- fb150d78 (diff), ffdd2b9 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)links above to see all the changes relative to each parent. - Location:
- kernel/arch/sparc64/src/mm/sun4u
- Files:
-
- 1 added
- 3 moved
-
as.c (moved) (moved from kernel/arch/sparc64/src/mm/as.c ) (12 diffs)
-
frame.c (added)
-
tlb.c (moved) (moved from kernel/arch/sparc64/src/mm/tlb.c ) (13 diffs)
-
tsb.c (moved) (moved from kernel/arch/sparc64/src/mm/tsb.c ) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
kernel/arch/sparc64/src/mm/sun4u/as.c
rfb150d78 r46c20c8 41 41 42 42 #ifdef CONFIG_TSB 43 43 44 #include <arch/mm/tsb.h> 44 45 #include <arch/memstr.h> … … 47 48 #include <bitops.h> 48 49 #include <macros.h> 50 49 51 #endif /* CONFIG_TSB */ 50 52 … … 58 60 } 59 61 60 int as_constructor_arch(as_t *as, int flags)62 int as_constructor_arch(as_t *as, unsigned int flags) 61 63 { 62 64 #ifdef CONFIG_TSB … … 64 66 * The order must be calculated with respect to the emulated 65 67 * 16K page size. 66 */ 67 int order = fnzb32(((ITSB_ENTRY_COUNT + DTSB_ENTRY_COUNT) * 68 * 69 */ 70 uint8_t order = fnzb32(((ITSB_ENTRY_COUNT + DTSB_ENTRY_COUNT) * 68 71 sizeof(tsb_entry_t)) >> FRAME_WIDTH); 69 72 70 73 uintptr_t tsb = (uintptr_t) frame_alloc(order, flags | FRAME_KA); 71 74 72 75 if (!tsb) 73 76 return -1; 74 77 75 78 as->arch.itsb = (tsb_entry_t *) tsb; 76 79 as->arch.dtsb = (tsb_entry_t *) (tsb + ITSB_ENTRY_COUNT * 77 80 sizeof(tsb_entry_t)); 78 81 79 82 memsetb(as->arch.itsb, 80 83 (ITSB_ENTRY_COUNT + DTSB_ENTRY_COUNT) * sizeof(tsb_entry_t), 0); 81 84 #endif 85 82 86 return 0; 83 87 } … … 93 97 sizeof(tsb_entry_t)) >> FRAME_WIDTH; 94 98 frame_free(KA2PA((uintptr_t) as->arch.itsb)); 99 95 100 return cnt; 96 101 #else … … 99 104 } 100 105 101 int as_create_arch(as_t *as, int flags)106 int as_create_arch(as_t *as, unsigned int flags) 102 107 { 103 108 #ifdef CONFIG_TSB 104 109 tsb_invalidate(as, 0, (size_t) -1); 105 110 #endif 111 106 112 return 0; 107 113 } … … 123 129 * 124 130 * Moreover, the as->asid is protected by asidlock, which is being held. 131 * 125 132 */ 126 133 … … 130 137 * secondary context register from the TL=1 code just before switch to 131 138 * userspace. 139 * 132 140 */ 133 141 ctx.v = 0; 134 142 ctx.context = as->asid; 135 143 mmu_secondary_context_write(ctx.v); 136 137 #ifdef CONFIG_TSB 144 145 #ifdef CONFIG_TSB 138 146 uintptr_t base = ALIGN_DOWN(config.base, 1 << KERNEL_PAGE_WIDTH); 139 147 140 148 ASSERT(as->arch.itsb && as->arch.dtsb); 141 149 142 150 uintptr_t tsb = (uintptr_t) as->arch.itsb; 143 151 144 152 if (!overlaps(tsb, 8 * MMU_PAGE_SIZE, base, 1 << KERNEL_PAGE_WIDTH)) { 145 153 /* … … 147 155 * by the locked 4M kernel DTLB entry. We need 148 156 * to map both TSBs explicitly. 157 * 149 158 */ 150 159 dtlb_demap(TLB_DEMAP_PAGE, TLB_DEMAP_NUCLEUS, tsb); 151 160 dtlb_insert_mapping(tsb, KA2PA(tsb), PAGESIZE_64K, true, true); 152 161 } 153 162 154 163 /* 155 164 * Setup TSB Base registers. 165 * 156 166 */ 157 167 tsb_base_reg_t tsb_base; 158 168 159 169 tsb_base.value = 0; 160 170 tsb_base.size = TSB_SIZE; 161 171 tsb_base.split = 0; 162 172 163 173 tsb_base.base = ((uintptr_t) as->arch.itsb) >> MMU_PAGE_WIDTH; 164 174 itsb_base_write(tsb_base.value); … … 175 185 * Clearing the extension registers will ensure that the value of the 176 186 * TSB Base register will be used as an address of TSB, making the code 177 * compatible with the US port. 187 * compatible with the US port. 188 * 178 189 */ 179 190 itsb_primary_extension_write(0); … … 195 206 void as_deinstall_arch(as_t *as) 196 207 { 197 198 208 /* 199 209 * Note that we don't and may not lock the address space. That's ok … … 201 211 * 202 212 * Moreover, the as->asid is protected by asidlock, which is being held. 203 */ 204 213 * 214 */ 215 205 216 #ifdef CONFIG_TSB 206 217 uintptr_t base = ALIGN_DOWN(config.base, 1 << KERNEL_PAGE_WIDTH); 207 218 208 219 ASSERT(as->arch.itsb && as->arch.dtsb); 209 220 210 221 uintptr_t tsb = (uintptr_t) as->arch.itsb; 211 222 212 223 if (!overlaps(tsb, 8 * MMU_PAGE_SIZE, base, 1 << KERNEL_PAGE_WIDTH)) { 213 224 /* -
kernel/arch/sparc64/src/mm/sun4u/tlb.c
rfb150d78 r46c20c8 27 27 */ 28 28 29 /** @addtogroup sparc64mm 29 /** @addtogroup sparc64mm 30 30 * @{ 31 31 */ … … 37 37 #include <mm/as.h> 38 38 #include <mm/asid.h> 39 #include <genarch/mm/page_ht.h>40 39 #include <arch/mm/frame.h> 41 40 #include <arch/mm/page.h> … … 45 44 #include <arch.h> 46 45 #include <print.h> 47 #include < arch/types.h>46 #include <typedefs.h> 48 47 #include <config.h> 49 48 #include <arch/trap/trap.h> … … 51 50 #include <panic.h> 52 51 #include <arch/asm.h> 52 #include <genarch/mm/page_ht.h> 53 53 54 54 #ifdef CONFIG_TSB … … 58 58 static void dtlb_pte_copy(pte_t *, size_t, bool); 59 59 static void itlb_pte_copy(pte_t *, size_t); 60 static void do_fast_instruction_access_mmu_miss_fault(istate_t *, const char *); 60 static void do_fast_instruction_access_mmu_miss_fault(istate_t *, uintptr_t, 61 const char *); 61 62 static void do_fast_data_access_mmu_miss_fault(istate_t *, tlb_tag_access_reg_t, 62 63 const char *); … … 64 65 tlb_tag_access_reg_t, const char *); 65 66 66 c har *context_encoding[] = {67 const char *context_encoding[] = { 67 68 "Primary", 68 69 "Secondary", … … 222 223 * Forward the page fault to the address space page fault 223 224 * handler. 224 */ 225 */ 225 226 page_table_unlock(AS, true); 226 227 if (as_page_fault(page_16k, PF_ACCESS_EXEC, istate) == 227 228 AS_PF_FAULT) { 228 229 do_fast_instruction_access_mmu_miss_fault(istate, 229 __func__);230 istate->tpc, __func__); 230 231 } 231 232 } … … 258 259 /* NULL access in kernel */ 259 260 do_fast_data_access_mmu_miss_fault(istate, tag, 260 __func__);261 "Dereferencing NULL pointer."); 261 262 } else if (page_8k >= end_of_identity) { 262 263 /* … … 359 360 static void print_tlb_entry(int i, tlb_tag_read_reg_t t, tlb_data_t d) 360 361 { 361 printf("% d: vpn=%#llx, context=%d, v=%d, size=%d, nfo=%d, "362 "ie=% d, soft2=%#x, pfn=%#x, soft=%#x, l=%d, "363 "cp=% d, cv=%d, e=%d, p=%d, w=%d, g=%d\n", i,t.vpn,362 printf("%u: vpn=%#" PRIx64 ", context=%u, v=%u, size=%u, nfo=%u, " 363 "ie=%u, soft2=%#x, pfn=%#x, soft=%#x, l=%u, " 364 "cp=%u, cv=%u, e=%u, p=%u, w=%u, g=%u\n", i, (uint64_t) t.vpn, 364 365 t.context, d.v, d.size, d.nfo, d.ie, d.soft2, 365 366 d.pfn, d.soft, d.l, d.cp, d.cv, d.e, d.p, d.w, d.g); … … 438 439 439 440 void do_fast_instruction_access_mmu_miss_fault(istate_t *istate, 440 const char *str) 441 { 442 fault_if_from_uspace(istate, "%s.", str); 443 dump_istate(istate); 444 panic("%s.", str); 441 uintptr_t va, const char *str) 442 { 443 fault_if_from_uspace(istate, "%s, address=%p.", str, (void *) va); 444 panic_memtrap(istate, PF_ACCESS_EXEC, va, str); 445 445 } 446 446 … … 451 451 452 452 va = tag.vpn << MMU_PAGE_WIDTH; 453 if (tag.context) { 454 fault_if_from_uspace(istate, "%s, Page=%p (ASID=%d).", str, va, 455 tag.context); 456 } 457 dump_istate(istate); 458 printf("Faulting page: %p, ASID=%d.\n", va, tag.context); 459 panic("%s.", str); 453 fault_if_from_uspace(istate, "%s, page=%p (asid=%u).", str, 454 (void *) va, tag.context); 455 panic_memtrap(istate, PF_ACCESS_UNKNOWN, va, str); 460 456 } 461 457 … … 466 462 467 463 va = tag.vpn << MMU_PAGE_WIDTH; 468 469 if (tag.context) { 470 fault_if_from_uspace(istate, "%s, Page=%p (ASID=%d).", str, va, 471 tag.context); 472 } 473 printf("Faulting page: %p, ASID=%d\n", va, tag.context); 474 dump_istate(istate); 475 panic("%s.", str); 476 } 477 478 void dump_sfsr_and_sfar(void) 464 fault_if_from_uspace(istate, "%s, page=%p (asid=%u).", str, 465 (void *) va, tag.context); 466 panic_memtrap(istate, PF_ACCESS_WRITE, va, str); 467 } 468 469 void describe_dmmu_fault(void) 479 470 { 480 471 tlb_sfsr_reg_t sfsr; … … 493 484 sfsr.e, sfsr.ct, sfsr.pr, sfsr.w, sfsr.ow, sfsr.fv); 494 485 #endif 486 487 printf("DTLB SFAR: address=%p\n", (void *) sfar); 488 489 dtlb_sfsr_write(0); 490 } 491 492 void dump_sfsr_and_sfar(void) 493 { 494 tlb_sfsr_reg_t sfsr; 495 uintptr_t sfar; 496 497 sfsr.value = dtlb_sfsr_read(); 498 sfar = dtlb_sfar_read(); 499 500 #if defined (US) 501 printf("DTLB SFSR: asi=%#x, ft=%#x, e=%d, ct=%d, pr=%d, w=%d, ow=%d, " 502 "fv=%d\n", sfsr.asi, sfsr.ft, sfsr.e, sfsr.ct, sfsr.pr, sfsr.w, 503 sfsr.ow, sfsr.fv); 504 #elif defined (US3) 505 printf("DTLB SFSR: nf=%d, asi=%#x, tm=%d, ft=%#x, e=%d, ct=%d, pr=%d, " 506 "w=%d, ow=%d, fv=%d\n", sfsr.nf, sfsr.asi, sfsr.tm, sfsr.ft, 507 sfsr.e, sfsr.ct, sfsr.pr, sfsr.w, sfsr.ow, sfsr.fv); 508 #endif 495 509 496 printf("DTLB SFAR: address=%p\n", sfar);510 printf("DTLB SFAR: address=%p\n", (void *) sfar); 497 511 498 512 dtlb_sfsr_write(0); -
kernel/arch/sparc64/src/mm/sun4u/tsb.c
rfb150d78 r46c20c8 38 38 #include <arch/barrier.h> 39 39 #include <mm/as.h> 40 #include < arch/types.h>40 #include <typedefs.h> 41 41 #include <macros.h> 42 42 #include <debug.h>
Note:
See TracChangeset
for help on using the changeset viewer.
