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 |
