diff options
-rw-r--r-- | arch/mn10300/Kconfig | 3 | ||||
-rw-r--r-- | arch/mn10300/kernel/entry.S | 8 | ||||
-rw-r--r-- | arch/mn10300/mm/tlb-mn10300.S | 32 |
3 files changed, 37 insertions, 6 deletions
diff --git a/arch/mn10300/Kconfig b/arch/mn10300/Kconfig index 21e2a534d98e..dd7b5700358b 100644 --- a/arch/mn10300/Kconfig +++ b/arch/mn10300/Kconfig | |||
@@ -20,6 +20,9 @@ config AM34_2 | |||
20 | select MN10300_HAS_ATOMIC_OPS_UNIT | 20 | select MN10300_HAS_ATOMIC_OPS_UNIT |
21 | select MN10300_HAS_CACHE_SNOOP | 21 | select MN10300_HAS_CACHE_SNOOP |
22 | 22 | ||
23 | config ERRATUM_NEED_TO_RELOAD_MMUCTR | ||
24 | def_bool y if AM33_3 || AM34_2 | ||
25 | |||
23 | config MMU | 26 | config MMU |
24 | def_bool y | 27 | def_bool y |
25 | 28 | ||
diff --git a/arch/mn10300/kernel/entry.S b/arch/mn10300/kernel/entry.S index b82ce7b47fcb..355f68176771 100644 --- a/arch/mn10300/kernel/entry.S +++ b/arch/mn10300/kernel/entry.S | |||
@@ -251,6 +251,10 @@ double_fault_loop: | |||
251 | ENTRY(raw_bus_error) | 251 | ENTRY(raw_bus_error) |
252 | add -4,sp | 252 | add -4,sp |
253 | mov d0,(sp) | 253 | mov d0,(sp) |
254 | #if defined(CONFIG_ERRATUM_NEED_TO_RELOAD_MMUCTR) | ||
255 | mov (MMUCTR),d0 | ||
256 | mov d0,(MMUCTR) | ||
257 | #endif | ||
254 | mov (BCBERR),d0 # what | 258 | mov (BCBERR),d0 # what |
255 | btst BCBERR_BEMR_DMA,d0 # see if it was an external bus error | 259 | btst BCBERR_BEMR_DMA,d0 # see if it was an external bus error |
256 | beq __common_exception_aux # it wasn't | 260 | beq __common_exception_aux # it wasn't |
@@ -282,6 +286,10 @@ ENTRY(nmi_handler) | |||
282 | ENTRY(__common_exception) | 286 | ENTRY(__common_exception) |
283 | add -4,sp | 287 | add -4,sp |
284 | mov d0,(sp) | 288 | mov d0,(sp) |
289 | #if defined(CONFIG_ERRATUM_NEED_TO_RELOAD_MMUCTR) | ||
290 | mov (MMUCTR),d0 | ||
291 | mov d0,(MMUCTR) | ||
292 | #endif | ||
285 | 293 | ||
286 | __common_exception_aux: | 294 | __common_exception_aux: |
287 | mov (TBR),d0 | 295 | mov (TBR),d0 |
diff --git a/arch/mn10300/mm/tlb-mn10300.S b/arch/mn10300/mm/tlb-mn10300.S index 7095147dcb8b..ccf622999a5b 100644 --- a/arch/mn10300/mm/tlb-mn10300.S +++ b/arch/mn10300/mm/tlb-mn10300.S | |||
@@ -27,7 +27,6 @@ | |||
27 | ############################################################################### | 27 | ############################################################################### |
28 | .type itlb_miss,@function | 28 | .type itlb_miss,@function |
29 | ENTRY(itlb_miss) | 29 | ENTRY(itlb_miss) |
30 | and ~EPSW_NMID,epsw | ||
31 | #ifdef CONFIG_GDBSTUB | 30 | #ifdef CONFIG_GDBSTUB |
32 | movm [d2,d3,a2],(sp) | 31 | movm [d2,d3,a2],(sp) |
33 | #else | 32 | #else |
@@ -38,6 +37,12 @@ ENTRY(itlb_miss) | |||
38 | nop | 37 | nop |
39 | #endif | 38 | #endif |
40 | 39 | ||
40 | #if defined(CONFIG_ERRATUM_NEED_TO_RELOAD_MMUCTR) | ||
41 | mov (MMUCTR),d2 | ||
42 | mov d2,(MMUCTR) | ||
43 | #endif | ||
44 | |||
45 | and ~EPSW_NMID,epsw | ||
41 | mov (IPTEU),d3 | 46 | mov (IPTEU),d3 |
42 | mov (PTBR),a2 | 47 | mov (PTBR),a2 |
43 | mov d3,d2 | 48 | mov d3,d2 |
@@ -79,7 +84,6 @@ itlb_miss_fault: | |||
79 | ############################################################################### | 84 | ############################################################################### |
80 | .type dtlb_miss,@function | 85 | .type dtlb_miss,@function |
81 | ENTRY(dtlb_miss) | 86 | ENTRY(dtlb_miss) |
82 | and ~EPSW_NMID,epsw | ||
83 | #ifdef CONFIG_GDBSTUB | 87 | #ifdef CONFIG_GDBSTUB |
84 | movm [d2,d3,a2],(sp) | 88 | movm [d2,d3,a2],(sp) |
85 | #else | 89 | #else |
@@ -90,6 +94,12 @@ ENTRY(dtlb_miss) | |||
90 | nop | 94 | nop |
91 | #endif | 95 | #endif |
92 | 96 | ||
97 | #if defined(CONFIG_ERRATUM_NEED_TO_RELOAD_MMUCTR) | ||
98 | mov (MMUCTR),d2 | ||
99 | mov d2,(MMUCTR) | ||
100 | #endif | ||
101 | |||
102 | and ~EPSW_NMID,epsw | ||
93 | mov (DPTEU),d3 | 103 | mov (DPTEU),d3 |
94 | mov (PTBR),a2 | 104 | mov (PTBR),a2 |
95 | mov d3,d2 | 105 | mov d3,d2 |
@@ -130,9 +140,15 @@ dtlb_miss_fault: | |||
130 | ############################################################################### | 140 | ############################################################################### |
131 | .type itlb_aerror,@function | 141 | .type itlb_aerror,@function |
132 | ENTRY(itlb_aerror) | 142 | ENTRY(itlb_aerror) |
133 | and ~EPSW_NMID,epsw | ||
134 | add -4,sp | 143 | add -4,sp |
135 | SAVE_ALL | 144 | SAVE_ALL |
145 | |||
146 | #if defined(CONFIG_ERRATUM_NEED_TO_RELOAD_MMUCTR) | ||
147 | mov (MMUCTR),d1 | ||
148 | mov d1,(MMUCTR) | ||
149 | #endif | ||
150 | |||
151 | and ~EPSW_NMID,epsw | ||
136 | add -4,sp # need to pass three params | 152 | add -4,sp # need to pass three params |
137 | 153 | ||
138 | # calculate the fault code | 154 | # calculate the fault code |
@@ -148,7 +164,6 @@ ENTRY(itlb_aerror) | |||
148 | clr d0 | 164 | clr d0 |
149 | mov d0,(IPTEL) | 165 | mov d0,(IPTEL) |
150 | 166 | ||
151 | and ~EPSW_NMID,epsw | ||
152 | or EPSW_IE,epsw | 167 | or EPSW_IE,epsw |
153 | mov fp,d0 | 168 | mov fp,d0 |
154 | call do_page_fault[],0 # do_page_fault(regs,code,addr | 169 | call do_page_fault[],0 # do_page_fault(regs,code,addr |
@@ -163,10 +178,16 @@ ENTRY(itlb_aerror) | |||
163 | ############################################################################### | 178 | ############################################################################### |
164 | .type dtlb_aerror,@function | 179 | .type dtlb_aerror,@function |
165 | ENTRY(dtlb_aerror) | 180 | ENTRY(dtlb_aerror) |
166 | and ~EPSW_NMID,epsw | ||
167 | add -4,sp | 181 | add -4,sp |
168 | SAVE_ALL | 182 | SAVE_ALL |
183 | |||
184 | #if defined(CONFIG_ERRATUM_NEED_TO_RELOAD_MMUCTR) | ||
185 | mov (MMUCTR),d1 | ||
186 | mov d1,(MMUCTR) | ||
187 | #endif | ||
188 | |||
169 | add -4,sp # need to pass three params | 189 | add -4,sp # need to pass three params |
190 | and ~EPSW_NMID,epsw | ||
170 | 191 | ||
171 | # calculate the fault code | 192 | # calculate the fault code |
172 | movhu (MMUFCR_DFC),d1 | 193 | movhu (MMUFCR_DFC),d1 |
@@ -180,7 +201,6 @@ ENTRY(dtlb_aerror) | |||
180 | clr d0 | 201 | clr d0 |
181 | mov d0,(DPTEL) | 202 | mov d0,(DPTEL) |
182 | 203 | ||
183 | and ~EPSW_NMID,epsw | ||
184 | or EPSW_IE,epsw | 204 | or EPSW_IE,epsw |
185 | mov fp,d0 | 205 | mov fp,d0 |
186 | call do_page_fault[],0 # do_page_fault(regs,code,addr | 206 | call do_page_fault[],0 # do_page_fault(regs,code,addr |