Rev 873 | Rev 883 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 873 | Rev 877 | ||
|---|---|---|---|
| Line 29... | Line 29... | ||
| 29 | #include <arch/mm/tlb.h> |
29 | #include <arch/mm/tlb.h> |
| 30 | #include <mm/tlb.h> |
30 | #include <mm/tlb.h> |
| 31 | #include <arch/mm/frame.h> |
31 | #include <arch/mm/frame.h> |
| 32 | #include <arch/mm/page.h> |
32 | #include <arch/mm/page.h> |
| 33 | #include <arch/mm/mmu.h> |
33 | #include <arch/mm/mmu.h> |
| - | 34 | #include <mm/asid.h> |
|
| 34 | #include <print.h> |
35 | #include <print.h> |
| 35 | #include <arch/types.h> |
36 | #include <arch/types.h> |
| 36 | #include <typedefs.h> |
37 | #include <typedefs.h> |
| 37 | #include <config.h> |
38 | #include <config.h> |
| 38 | #include <arch/trap/trap.h> |
39 | #include <arch/trap/trap.h> |
| Line 72... | Line 73... | ||
| 72 | dmmu_disable(); |
73 | dmmu_disable(); |
| 73 | 74 | ||
| 74 | /* |
75 | /* |
| 75 | * We do identity mapping of 4M-page at 4M. |
76 | * We do identity mapping of 4M-page at 4M. |
| 76 | */ |
77 | */ |
| 77 | tag.value = 0; |
78 | tag.value = ASID_KERNEL; |
| 78 | tag.vpn = pg.vpn; |
79 | tag.vpn = pg.vpn; |
| 79 | 80 | ||
| 80 | itlb_tag_access_write(tag.value); |
81 | itlb_tag_access_write(tag.value); |
| 81 | dtlb_tag_access_write(tag.value); |
82 | dtlb_tag_access_write(tag.value); |
| 82 | 83 | ||
| Line 110... | Line 111... | ||
| 110 | * Quick hack: map frame buffer |
111 | * Quick hack: map frame buffer |
| 111 | */ |
112 | */ |
| 112 | fr.address = 0x1C901000000ULL; |
113 | fr.address = 0x1C901000000ULL; |
| 113 | pg.address = 0xc0000000; |
114 | pg.address = 0xc0000000; |
| 114 | 115 | ||
| 115 | tag.value = 0; |
116 | tag.value = ASID_KERNEL; |
| 116 | tag.vpn = pg.vpn; |
117 | tag.vpn = pg.vpn; |
| 117 | 118 | ||
| 118 | dtlb_tag_access_write(tag.value); |
119 | dtlb_tag_access_write(tag.value); |
| 119 | 120 | ||
| 120 | data.value = 0; |
121 | data.value = 0; |
| Line 139... | Line 140... | ||
| 139 | } |
140 | } |
| 140 | 141 | ||
| 141 | /** DTLB miss handler. */ |
142 | /** DTLB miss handler. */ |
| 142 | void fast_data_access_mmu_miss(void) |
143 | void fast_data_access_mmu_miss(void) |
| 143 | { |
144 | { |
| 144 | tlb_sfsr_reg_t status; |
145 | tlb_tag_access_reg_t tag; |
| - | 146 | tlb_data_t data; |
|
| 145 | __address address, tpc; |
147 | __address tpc; |
| 146 | char *tpc_str; |
148 | char *tpc_str; |
| 147 | 149 | ||
| 148 | status.value = dtlb_sfsr_read(); |
150 | tag.value = dtlb_tag_access_read(); |
| 149 | address = dtlb_sfar_read(); |
151 | if (tag.context != ASID_KERNEL || tag.vpn == 0) { |
| 150 | tpc = tpc_read(); |
152 | tpc = tpc_read(); |
| 151 | tpc_str = get_symtab_entry(tpc); |
153 | tpc_str = get_symtab_entry(tpc); |
| 152 | 154 | ||
| 153 | printf("ASI=%B, Context=%s\n", status.asi, context_encoding[status.ct]); |
- | |
| 154 | printf("Faulting address: %P\n", dtlb_sfar_read()); |
155 | printf("Faulting page: %P, ASID=%d\n", tag.vpn * PAGE_SIZE, tag.context); |
| 155 | printf("TPC=%P, (%s)\n", tpc, tpc_str ? tpc_str : "?"); |
156 | printf("TPC=%P, (%s)\n", tpc, tpc_str ? tpc_str : "?"); |
| 156 | panic("%s\n", __FUNCTION__); |
157 | panic("%s\n", __FUNCTION__); |
| - | 158 | } |
|
| - | 159 | ||
| - | 160 | /* |
|
| - | 161 | * Identity map piece of faulting kernel address space. |
|
| - | 162 | */ |
|
| - | 163 | data.value = 0; |
|
| - | 164 | data.v = true; |
|
| - | 165 | data.size = PAGESIZE_8K; |
|
| - | 166 | data.pfn = tag.vpn; |
|
| - | 167 | data.l = false; |
|
| - | 168 | data.cp = 1; |
|
| - | 169 | data.cv = 1; |
|
| - | 170 | data.p = true; |
|
| - | 171 | data.w = true; |
|
| - | 172 | data.g = true; |
|
| - | 173 | ||
| - | 174 | dtlb_data_in_write(data.value); |
|
| 157 | } |
175 | } |
| 158 | 176 | ||
| 159 | /** DTLB protection fault handler. */ |
177 | /** DTLB protection fault handler. */ |
| 160 | void fast_data_access_protection(void) |
178 | void fast_data_access_protection(void) |
| 161 | { |
179 | { |