129 |
/* SPARC reference MMU table walk: Context table->L1->L2->PTE */ |
/* SPARC reference MMU table walk: Context table->L1->L2->PTE */ |
130 |
/* Context base + context number */ |
/* Context base + context number */ |
131 |
pde_ptr = (env->mmuregs[1] << 4) + (env->mmuregs[2] << 4); |
pde_ptr = (env->mmuregs[1] << 4) + (env->mmuregs[2] << 4); |
132 |
cpu_physical_memory_read(pde_ptr, (uint8_t *)&pde, 4); |
pde = ldl_phys(pde_ptr); |
|
bswap32s(&pde); |
|
133 |
|
|
134 |
/* Ctx pde */ |
/* Ctx pde */ |
135 |
switch (pde & PTE_ENTRYTYPE_MASK) { |
switch (pde & PTE_ENTRYTYPE_MASK) { |
141 |
return 4; |
return 4; |
142 |
case 1: /* L0 PDE */ |
case 1: /* L0 PDE */ |
143 |
pde_ptr = ((address >> 22) & ~3) + ((pde & ~3) << 4); |
pde_ptr = ((address >> 22) & ~3) + ((pde & ~3) << 4); |
144 |
cpu_physical_memory_read(pde_ptr, (uint8_t *)&pde, 4); |
pde = ldl_phys(pde_ptr); |
|
bswap32s(&pde); |
|
145 |
|
|
146 |
switch (pde & PTE_ENTRYTYPE_MASK) { |
switch (pde & PTE_ENTRYTYPE_MASK) { |
147 |
default: |
default: |
151 |
return 4; |
return 4; |
152 |
case 1: /* L1 PDE */ |
case 1: /* L1 PDE */ |
153 |
pde_ptr = ((address & 0xfc0000) >> 16) + ((pde & ~3) << 4); |
pde_ptr = ((address & 0xfc0000) >> 16) + ((pde & ~3) << 4); |
154 |
cpu_physical_memory_read(pde_ptr, (uint8_t *)&pde, 4); |
pde = ldl_phys(pde_ptr); |
|
bswap32s(&pde); |
|
155 |
|
|
156 |
switch (pde & PTE_ENTRYTYPE_MASK) { |
switch (pde & PTE_ENTRYTYPE_MASK) { |
157 |
default: |
default: |
161 |
return 4; |
return 4; |
162 |
case 1: /* L2 PDE */ |
case 1: /* L2 PDE */ |
163 |
pde_ptr = ((address & 0x3f000) >> 10) + ((pde & ~3) << 4); |
pde_ptr = ((address & 0x3f000) >> 10) + ((pde & ~3) << 4); |
164 |
cpu_physical_memory_read(pde_ptr, (uint8_t *)&pde, 4); |
pde = ldl_phys(pde_ptr); |
|
bswap32s(&pde); |
|
165 |
|
|
166 |
switch (pde & PTE_ENTRYTYPE_MASK) { |
switch (pde & PTE_ENTRYTYPE_MASK) { |
167 |
default: |
default: |
189 |
/* update page modified and dirty bits */ |
/* update page modified and dirty bits */ |
190 |
is_dirty = (rw & 1) && !(pde & PG_MODIFIED_MASK); |
is_dirty = (rw & 1) && !(pde & PG_MODIFIED_MASK); |
191 |
if (!(pde & PG_ACCESSED_MASK) || is_dirty) { |
if (!(pde & PG_ACCESSED_MASK) || is_dirty) { |
|
uint32_t tmppde; |
|
192 |
pde |= PG_ACCESSED_MASK; |
pde |= PG_ACCESSED_MASK; |
193 |
if (is_dirty) |
if (is_dirty) |
194 |
pde |= PG_MODIFIED_MASK; |
pde |= PG_MODIFIED_MASK; |
195 |
tmppde = bswap32(pde); |
stl_phys_notdirty(pde_ptr, pde); |
|
cpu_physical_memory_write(pde_ptr, (uint8_t *)&tmppde, 4); |
|
196 |
} |
} |
197 |
/* check access */ |
/* check access */ |
198 |
*access_index = ((rw & 1) << 2) | (rw & 2) | (is_user? 0 : 1); |
*access_index = ((rw & 1) << 2) | (rw & 2) | (is_user? 0 : 1); |
350 |
|
|
351 |
/* Context base + context number */ |
/* Context base + context number */ |
352 |
pde_ptr = (env->mmuregs[1] << 4) + (env->mmuregs[2] << 4); |
pde_ptr = (env->mmuregs[1] << 4) + (env->mmuregs[2] << 4); |
353 |
cpu_physical_memory_read(pde_ptr, (uint8_t *)&pde, 4); |
pde = ldl_phys(pde_ptr); |
354 |
bswap32s(&pde); |
|
355 |
switch (pde & PTE_ENTRYTYPE_MASK) { |
switch (pde & PTE_ENTRYTYPE_MASK) { |
356 |
default: |
default: |
357 |
case 0: /* Invalid */ |
case 0: /* Invalid */ |
362 |
if (mmulev == 3) |
if (mmulev == 3) |
363 |
return pde; |
return pde; |
364 |
pde_ptr = ((address >> 22) & ~3) + ((pde & ~3) << 4); |
pde_ptr = ((address >> 22) & ~3) + ((pde & ~3) << 4); |
365 |
cpu_physical_memory_read(pde_ptr, (uint8_t *)&pde, 4); |
pde = ldl_phys(pde_ptr); |
|
bswap32s(&pde); |
|
366 |
|
|
367 |
switch (pde & PTE_ENTRYTYPE_MASK) { |
switch (pde & PTE_ENTRYTYPE_MASK) { |
368 |
default: |
default: |
375 |
if (mmulev == 2) |
if (mmulev == 2) |
376 |
return pde; |
return pde; |
377 |
pde_ptr = ((address & 0xfc0000) >> 16) + ((pde & ~3) << 4); |
pde_ptr = ((address & 0xfc0000) >> 16) + ((pde & ~3) << 4); |
378 |
cpu_physical_memory_read(pde_ptr, (uint8_t *)&pde, 4); |
pde = ldl_phys(pde_ptr); |
|
bswap32s(&pde); |
|
379 |
|
|
380 |
switch (pde & PTE_ENTRYTYPE_MASK) { |
switch (pde & PTE_ENTRYTYPE_MASK) { |
381 |
default: |
default: |
388 |
if (mmulev == 1) |
if (mmulev == 1) |
389 |
return pde; |
return pde; |
390 |
pde_ptr = ((address & 0x3f000) >> 10) + ((pde & ~3) << 4); |
pde_ptr = ((address & 0x3f000) >> 10) + ((pde & ~3) << 4); |
391 |
cpu_physical_memory_read(pde_ptr, (uint8_t *)&pde, 4); |
pde = ldl_phys(pde_ptr); |
|
bswap32s(&pde); |
|
392 |
|
|
393 |
switch (pde & PTE_ENTRYTYPE_MASK) { |
switch (pde & PTE_ENTRYTYPE_MASK) { |
394 |
default: |
default: |
415 |
|
|
416 |
printf("MMU dump:\n"); |
printf("MMU dump:\n"); |
417 |
pde_ptr = (env->mmuregs[1] << 4) + (env->mmuregs[2] << 4); |
pde_ptr = (env->mmuregs[1] << 4) + (env->mmuregs[2] << 4); |
418 |
cpu_physical_memory_read(pde_ptr, (uint8_t *)&pde, 4); |
pde = ldl_phys(pde_ptr); |
|
bswap32s(&pde); |
|
419 |
printf("Root ptr: 0x%08x, ctx: %d\n", env->mmuregs[1] << 4, env->mmuregs[2]); |
printf("Root ptr: 0x%08x, ctx: %d\n", env->mmuregs[1] << 4, env->mmuregs[2]); |
420 |
for (n = 0, va = 0; n < 256; n++, va += 16 * 1024 * 1024) { |
for (n = 0, va = 0; n < 256; n++, va += 16 * 1024 * 1024) { |
421 |
pde_ptr = mmu_probe(va, 2); |
pde_ptr = mmu_probe(va, 2); |