58 uint64_t *return_paddr,
int flags)
62 int ksu, use_tlb, status, i;
63 uint64_t vaddr_vpn2=0, vaddr_asid=0;
64 int exccode, tlb_refill;
69 const int n_tlbs = 64;
70 const uint32_t pmask = 0xfff;
85 int pageshift, n_tlbs;
90 const int pfn_shift = 10;
94 const int pfn_shift = 12;
181 default:
fatal(
"memory_mips_v2p.c: ksu=%i not yet implemented yet\n",
193 vaddr <= 0x7fffffff) {
194 *return_paddr = vaddr & 0x7fffffff;
210 *return_paddr = vaddr & (((uint64_t)1 << 44) - 1);
221 vaddr = (int32_t) vaddr;
222 xuseg_top = 0x7fffffff;
226 if (vaddr <= xuseg_top) {
231 if (vaddr >= (uint64_t)0xffffffff80000000ULL &&
232 vaddr <= (uint64_t)0xffffffffbfffffffULL) {
233 *return_paddr = vaddr & 0x1fffffff;
247 uint64_t cached_lo1 = 0;
249 int g_bit, v_bit, d_bit;
250 uint64_t cached_hi, cached_lo0;
251 uint64_t entry_vpn2 = 0, entry_asid, pfn;
255 i_end = i == 0? n_tlbs-1 : i - 1;
261 cached_hi = cp0->
tlbs[i].
hi;
271 pmask = cp0->
tlbs[i].
mask & pagemask_mask;
272 cached_hi = cp0->
tlbs[i].
hi;
278 pageshift = pagemask_shift - 1;
279 entry_vpn2 = (cached_hi & vpn2_mask)
281 vaddr_vpn2 = (vaddr & vpn2_mask)
283 pmask = (1 << (pagemask_shift-1)) - 1;
284 odd = (vaddr >> (pagemask_shift-1)) & 1;
287 switch (pmask | ((1 << pagemask_shift) - 1)) {
288 case 0x00007ff: pageshift = 10;
break;
289 case 0x0001fff: pageshift = 12;
break;
290 case 0x0007fff: pageshift = 14;
break;
291 case 0x001ffff: pageshift = 16;
break;
292 case 0x007ffff: pageshift = 18;
break;
293 case 0x01fffff: pageshift = 20;
break;
294 case 0x07fffff: pageshift = 22;
break;
295 case 0x1ffffff: pageshift = 24;
break;
296 case 0x7ffffff: pageshift = 26;
break;
297 default:
fatal(
"pmask=%08" PRIx32
"\n", pmask);
301 entry_vpn2 = (cached_hi &
302 vpn2_mask) >> (pageshift + 1);
303 vaddr_vpn2 = (vaddr & vpn2_mask) >>
305 pmask = (1 << pageshift) - 1;
306 odd = (vaddr >> pageshift) & 1;
340 g_bit = cached_lo1 & cached_lo0 &
ENTRYLO_G;
342 g_bit = cached_hi &
TLB_G;
348 if (entry_vpn2 == vaddr_vpn2 &&
349 (entry_asid == vaddr_asid || g_bit)) {
356 if (d_bit || (!d_bit &&
377 paddr = pfn | (vaddr & pmask);
379 pfn = ((odd? cached_lo1 :
383 paddr = ((pfn << pfn_shift) &
384 ~pmask) | (vaddr & pmask);
387 *return_paddr = paddr;
443 0, vaddr_vpn2, vaddr_asid, x_64);