Rev 3856 | Rev 4132 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 3856 | Rev 3857 | ||
---|---|---|---|
Line 225... | Line 225... | ||
225 | phte[base + i].wimg = (pte->page_cache_disable ? WIMG_NO_CACHE : 0); |
225 | phte[base + i].wimg = (pte->page_cache_disable ? WIMG_NO_CACHE : 0); |
226 | phte[base + i].pp = 2; // FIXME |
226 | phte[base + i].pp = 2; // FIXME |
227 | } |
227 | } |
228 | 228 | ||
229 | 229 | ||
230 | /** Process Instruction/Data Storage Interrupt |
230 | /** Process Instruction/Data Storage Exception |
231 | * |
231 | * |
232 | * @param n Interrupt vector number. |
232 | * @param n Exception vector number. |
233 | * @param istate Interrupted register context. |
233 | * @param istate Interrupted register context. |
234 | * |
234 | * |
235 | */ |
235 | */ |
236 | void pht_refill(int n, istate_t *istate) |
236 | void pht_refill(int n, istate_t *istate) |
237 | { |
237 | { |
238 | uintptr_t badvaddr; |
238 | uintptr_t badvaddr; |
Line 285... | Line 285... | ||
285 | page_table_unlock(as, lock); |
285 | page_table_unlock(as, lock); |
286 | pht_refill_fail(badvaddr, istate); |
286 | pht_refill_fail(badvaddr, istate); |
287 | } |
287 | } |
288 | 288 | ||
289 | 289 | ||
290 | /** Process Instruction/Data Storage Interrupt in Real Mode |
290 | /** Process Instruction/Data Storage Exception in Real Mode |
291 | * |
291 | * |
292 | * @param n Interrupt vector number. |
292 | * @param n Exception vector number. |
293 | * @param istate Interrupted register context. |
293 | * @param istate Interrupted register context. |
294 | * |
294 | * |
295 | */ |
295 | */ |
296 | bool pht_refill_real(int n, istate_t *istate) |
296 | bool pht_refill_real(int n, istate_t *istate) |
297 | { |
297 | { |
298 | uintptr_t badvaddr; |
298 | uintptr_t badvaddr; |
Line 406... | Line 406... | ||
406 | 406 | ||
407 | return true; |
407 | return true; |
408 | } |
408 | } |
409 | 409 | ||
410 | 410 | ||
- | 411 | /** Process ITLB/DTLB Miss Exception in Real Mode |
|
- | 412 | * |
|
- | 413 | * |
|
- | 414 | */ |
|
- | 415 | void tlb_refill_real(int n, uint32_t tlbmiss, ptehi_t ptehi, ptelo_t ptelo, istate_t *istate) |
|
- | 416 | { |
|
- | 417 | uint32_t badvaddr = tlbmiss & 0xfffffffc; |
|
- | 418 | ||
- | 419 | uint32_t physmem; |
|
- | 420 | asm volatile ( |
|
- | 421 | "mfsprg3 %0\n" |
|
- | 422 | : "=r" (physmem) |
|
- | 423 | ); |
|
- | 424 | ||
- | 425 | if ((badvaddr < PA2KA(0)) || (badvaddr >= PA2KA(physmem))) |
|
- | 426 | return; // FIXME |
|
- | 427 | ||
- | 428 | ptelo.rpn = KA2PA(badvaddr) >> 12; |
|
- | 429 | ptelo.wimg = 0; |
|
- | 430 | ptelo.pp = 2; // FIXME |
|
- | 431 | ||
- | 432 | uint32_t index = 0; |
|
- | 433 | asm volatile ( |
|
- | 434 | "mtspr 981, %0\n" |
|
- | 435 | "mtspr 982, %1\n" |
|
- | 436 | "tlbld %2\n" |
|
- | 437 | "tlbli %2\n" |
|
- | 438 | : "=r" (index) |
|
- | 439 | : "r" (ptehi), |
|
- | 440 | "r" (ptelo) |
|
- | 441 | ); |
|
- | 442 | } |
|
- | 443 | ||
- | 444 | ||
411 | void tlb_arch_init(void) |
445 | void tlb_arch_init(void) |
412 | { |
446 | { |
413 | tlb_invalidate_all(); |
447 | tlb_invalidate_all(); |
414 | } |
448 | } |
415 | 449 |