Changeset a35b458 in mainline for kernel/arch/ppc32/src/mm
- Timestamp:
- 2018-03-02T20:10:49Z (8 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- f1380b7
- Parents:
- 3061bc1
- git-author:
- Jiří Zárevúcky <zarevucky.jiri@…> (2018-02-28 17:38:31)
- git-committer:
- Jiří Zárevúcky <zarevucky.jiri@…> (2018-03-02 20:10:49)
- Location:
- kernel/arch/ppc32/src/mm
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/arch/ppc32/src/mm/as.c
r3061bc1 ra35b458 56 56 { 57 57 uint32_t sr; 58 58 59 59 /* Lower 2 GB, user and supervisor access */ 60 60 for (sr = 0; sr < 8; sr++) 61 61 sr_set(0x6000, as->asid, sr); 62 62 63 63 /* Upper 2 GB, only supervisor access */ 64 64 for (sr = 8; sr < 16; sr++) -
kernel/arch/ppc32/src/mm/frame.c
r3061bc1 ra35b458 45 45 { 46 46 printf("[base ] [size ]\n"); 47 47 48 48 size_t i; 49 49 for (i = 0; i < memmap.cnt; i++) { … … 57 57 pfn_t minconf = 2; 58 58 size_t i; 59 59 60 60 for (i = 0; i < memmap.cnt; i++) { 61 61 /* To be safe, make the available zone possibly smaller */ … … 64 64 size_t size = ALIGN_DOWN(memmap.zones[i].size - 65 65 (base - ((uintptr_t) memmap.zones[i].start)), FRAME_SIZE); 66 66 67 67 if (!frame_adjust_zone_bounds(low, &base, &size)) 68 68 return; … … 86 86 } 87 87 } 88 88 89 89 } 90 90 … … 92 92 { 93 93 frame_common_arch_init(true); 94 94 95 95 /* First is exception vector, second is 'implementation specific', 96 96 third and fourth is reserved, other contain real mode code */ 97 97 frame_mark_unavailable(0, 8); 98 98 99 99 /* Mark the Page Hash Table frames as unavailable */ 100 100 uint32_t sdr1 = sdr1_get(); 101 101 102 102 // FIXME: compute size of PHT exactly 103 103 frame_mark_unavailable(ADDR2PFN(sdr1 & 0xffff000), 16); -
kernel/arch/ppc32/src/mm/pht.c
r3061bc1 ra35b458 93 93 uint32_t page = (vaddr >> 12) & 0xffff; 94 94 uint32_t api = (vaddr >> 22) & 0x3f; 95 95 96 96 uint32_t vsid = sr_get(vaddr); 97 97 uint32_t sdr1 = sdr1_get(); 98 98 99 99 // FIXME: compute size of PHT exactly 100 100 phte_t *phte = (phte_t *) PA2KA(sdr1 & 0xffff0000); 101 101 102 102 /* Primary hash (xor) */ 103 103 uint32_t h = 0; … … 106 106 uint32_t i; 107 107 bool found = false; 108 108 109 109 /* Find colliding PTE in PTEG */ 110 110 for (i = 0; i < 8; i++) { … … 117 117 } 118 118 } 119 119 120 120 if (!found) { 121 121 /* Find unused PTE in PTEG */ … … 127 127 } 128 128 } 129 129 130 130 if (!found) { 131 131 /* Secondary hash (not) */ 132 132 uint32_t base2 = (~hash & 0x3ff) << 3; 133 133 134 134 /* Find colliding PTE in PTEG */ 135 135 for (i = 0; i < 8; i++) { … … 144 144 } 145 145 } 146 146 147 147 if (!found) { 148 148 /* Find unused PTE in PTEG */ … … 156 156 } 157 157 } 158 158 159 159 if (!found) 160 160 i = RANDI(seed) % 8; 161 161 } 162 162 163 163 phte[base + i].v = 1; 164 164 phte[base + i].vsid = vsid; … … 181 181 { 182 182 uintptr_t badvaddr; 183 183 184 184 if (n == VECTOR_DATA_STORAGE) 185 185 badvaddr = istate->dar; 186 186 else 187 187 badvaddr = istate->pc; 188 188 189 189 pte_t pte; 190 190 bool found = find_mapping_and_check(AS, badvaddr, 191 191 PF_ACCESS_READ /* FIXME */, istate, &pte); 192 192 193 193 if (found) { 194 194 /* Record access to PTE */ … … 201 201 { 202 202 uint32_t sdr1 = sdr1_get(); 203 203 204 204 // FIXME: compute size of PHT exactly 205 205 phte_t *phte = (phte_t *) PA2KA(sdr1 & 0xffff0000); 206 206 207 207 // FIXME: this invalidates all PHT entries, 208 208 // which is an overkill, invalidate only -
kernel/arch/ppc32/src/mm/tlb.c
r3061bc1 ra35b458 42 42 ptehi_t ptehi; 43 43 ptelo_t ptelo; 44 44 45 45 asm volatile ( 46 46 "mfspr %[tlbmiss], 980\n" … … 51 51 [ptelo] "=r" (ptelo) 52 52 ); 53 53 54 54 uint32_t badvaddr = tlbmiss & 0xfffffffc; 55 55 uint32_t physmem = physmem_top(); 56 56 57 57 if ((badvaddr < PA2KA(0)) || (badvaddr >= PA2KA(physmem))) 58 58 return; // FIXME 59 59 60 60 ptelo.rpn = KA2PA(badvaddr) >> 12; 61 61 ptelo.wimg = 0; 62 62 ptelo.pp = 2; // FIXME 63 63 64 64 uint32_t index = 0; 65 65 asm volatile ( … … 84 84 "sync\n" 85 85 ); 86 86 87 87 for (unsigned int i = 0; i < 0x00040000; i += 0x00001000) { 88 88 asm volatile ( … … 91 91 ); 92 92 } 93 93 94 94 asm volatile ( 95 95 "eieio\n" … … 143 143 { 144 144 uint32_t sr; 145 145 146 146 for (sr = 0; sr < 16; sr++) { 147 147 uint32_t vsid = sr_get(sr << 28); 148 148 149 149 printf("sr[%02" PRIu32 "]: vsid=%#0" PRIx32 " (asid=%" PRIu32 ")" 150 150 "%s%s\n", sr, vsid & UINT32_C(0x00ffffff), … … 153 153 ((vsid >> 29) & 1) ? " user" : ""); 154 154 } 155 155 156 156 uint32_t upper; 157 157 uint32_t lower; 158 158 uint32_t mask; 159 159 uint32_t length; 160 160 161 161 PRINT_BAT("ibat[0]", 528, 529); 162 162 PRINT_BAT("ibat[1]", 530, 531); 163 163 PRINT_BAT("ibat[2]", 532, 533); 164 164 PRINT_BAT("ibat[3]", 534, 535); 165 165 166 166 PRINT_BAT("dbat[0]", 536, 537); 167 167 PRINT_BAT("dbat[1]", 538, 539);
Note:
See TracChangeset
for help on using the changeset viewer.
