Rev 1776 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 1776 | Rev 1780 | ||
---|---|---|---|
Line 49... | Line 49... | ||
49 | 49 | ||
50 | static void tlb_refill_fail(istate_t *istate); |
50 | static void tlb_refill_fail(istate_t *istate); |
51 | static void tlb_invalid_fail(istate_t *istate); |
51 | static void tlb_invalid_fail(istate_t *istate); |
52 | static void tlb_modified_fail(istate_t *istate); |
52 | static void tlb_modified_fail(istate_t *istate); |
53 | 53 | ||
54 | static pte_t *find_mapping_and_check(__address badvaddr, int access, istate_t *istate, int *pfrc); |
54 | static pte_t *find_mapping_and_check(uintptr_t badvaddr, int access, istate_t *istate, int *pfrc); |
55 | 55 | ||
56 | static void prepare_entry_lo(entry_lo_t *lo, bool g, bool v, bool d, bool cacheable, __address pfn); |
56 | static void prepare_entry_lo(entry_lo_t *lo, bool g, bool v, bool d, bool cacheable, uintptr_t pfn); |
57 | static void prepare_entry_hi(entry_hi_t *hi, asid_t asid, __address addr); |
57 | static void prepare_entry_hi(entry_hi_t *hi, asid_t asid, uintptr_t addr); |
58 | 58 | ||
59 | /** Initialize TLB |
59 | /** Initialize TLB |
60 | * |
60 | * |
61 | * Initialize TLB. |
61 | * Initialize TLB. |
62 | * Invalidate all entries and mark wired entries. |
62 | * Invalidate all entries and mark wired entries. |
Line 94... | Line 94... | ||
94 | void tlb_refill(istate_t *istate) |
94 | void tlb_refill(istate_t *istate) |
95 | { |
95 | { |
96 | entry_lo_t lo; |
96 | entry_lo_t lo; |
97 | entry_hi_t hi; |
97 | entry_hi_t hi; |
98 | asid_t asid; |
98 | asid_t asid; |
99 | __address badvaddr; |
99 | uintptr_t badvaddr; |
100 | pte_t *pte; |
100 | pte_t *pte; |
101 | int pfrc; |
101 | int pfrc; |
102 | 102 | ||
103 | badvaddr = cp0_badvaddr_read(); |
103 | badvaddr = cp0_badvaddr_read(); |
104 | 104 | ||
Line 164... | Line 164... | ||
164 | * @param istate Interrupted register context. |
164 | * @param istate Interrupted register context. |
165 | */ |
165 | */ |
166 | void tlb_invalid(istate_t *istate) |
166 | void tlb_invalid(istate_t *istate) |
167 | { |
167 | { |
168 | tlb_index_t index; |
168 | tlb_index_t index; |
169 | __address badvaddr; |
169 | uintptr_t badvaddr; |
170 | entry_lo_t lo; |
170 | entry_lo_t lo; |
171 | entry_hi_t hi; |
171 | entry_hi_t hi; |
172 | pte_t *pte; |
172 | pte_t *pte; |
173 | int pfrc; |
173 | int pfrc; |
174 | 174 | ||
Line 248... | Line 248... | ||
248 | * @param istate Interrupted register context. |
248 | * @param istate Interrupted register context. |
249 | */ |
249 | */ |
250 | void tlb_modified(istate_t *istate) |
250 | void tlb_modified(istate_t *istate) |
251 | { |
251 | { |
252 | tlb_index_t index; |
252 | tlb_index_t index; |
253 | __address badvaddr; |
253 | uintptr_t badvaddr; |
254 | entry_lo_t lo; |
254 | entry_lo_t lo; |
255 | entry_hi_t hi; |
255 | entry_hi_t hi; |
256 | pte_t *pte; |
256 | pte_t *pte; |
257 | int pfrc; |
257 | int pfrc; |
258 | 258 | ||
Line 381... | Line 381... | ||
381 | * @param istate Pointer to interrupted state. |
381 | * @param istate Pointer to interrupted state. |
382 | * @param pfrc Pointer to variable where as_page_fault() return code will be stored. |
382 | * @param pfrc Pointer to variable where as_page_fault() return code will be stored. |
383 | * |
383 | * |
384 | * @return PTE on success, NULL otherwise. |
384 | * @return PTE on success, NULL otherwise. |
385 | */ |
385 | */ |
386 | pte_t *find_mapping_and_check(__address badvaddr, int access, istate_t *istate, int *pfrc) |
386 | pte_t *find_mapping_and_check(uintptr_t badvaddr, int access, istate_t *istate, int *pfrc) |
387 | { |
387 | { |
388 | entry_hi_t hi; |
388 | entry_hi_t hi; |
389 | pte_t *pte; |
389 | pte_t *pte; |
390 | 390 | ||
391 | hi.value = cp0_entry_hi_read(); |
391 | hi.value = cp0_entry_hi_read(); |
Line 443... | Line 443... | ||
443 | } |
443 | } |
444 | 444 | ||
445 | } |
445 | } |
446 | } |
446 | } |
447 | 447 | ||
448 | void prepare_entry_lo(entry_lo_t *lo, bool g, bool v, bool d, bool cacheable, __address pfn) |
448 | void prepare_entry_lo(entry_lo_t *lo, bool g, bool v, bool d, bool cacheable, uintptr_t pfn) |
449 | { |
449 | { |
450 | lo->value = 0; |
450 | lo->value = 0; |
451 | lo->g = g; |
451 | lo->g = g; |
452 | lo->v = v; |
452 | lo->v = v; |
453 | lo->d = d; |
453 | lo->d = d; |
454 | lo->c = cacheable ? PAGE_CACHEABLE_EXC_WRITE : PAGE_UNCACHED; |
454 | lo->c = cacheable ? PAGE_CACHEABLE_EXC_WRITE : PAGE_UNCACHED; |
455 | lo->pfn = pfn; |
455 | lo->pfn = pfn; |
456 | } |
456 | } |
457 | 457 | ||
458 | void prepare_entry_hi(entry_hi_t *hi, asid_t asid, __address addr) |
458 | void prepare_entry_hi(entry_hi_t *hi, asid_t asid, uintptr_t addr) |
459 | { |
459 | { |
460 | hi->value = ALIGN_DOWN(addr, PAGE_SIZE * 2); |
460 | hi->value = ALIGN_DOWN(addr, PAGE_SIZE * 2); |
461 | hi->asid = asid; |
461 | hi->asid = asid; |
462 | } |
462 | } |
463 | 463 | ||
Line 565... | Line 565... | ||
565 | * |
565 | * |
566 | * @param asid Address space identifier. |
566 | * @param asid Address space identifier. |
567 | * @param page First page whose TLB entry is to be invalidated. |
567 | * @param page First page whose TLB entry is to be invalidated. |
568 | * @param cnt Number of entries to invalidate. |
568 | * @param cnt Number of entries to invalidate. |
569 | */ |
569 | */ |
570 | void tlb_invalidate_pages(asid_t asid, __address page, count_t cnt) |
570 | void tlb_invalidate_pages(asid_t asid, uintptr_t page, count_t cnt) |
571 | { |
571 | { |
572 | int i; |
572 | int i; |
573 | ipl_t ipl; |
573 | ipl_t ipl; |
574 | entry_lo_t lo0, lo1; |
574 | entry_lo_t lo0, lo1; |
575 | entry_hi_t hi, hi_save; |
575 | entry_hi_t hi, hi_save; |