diff options
Diffstat (limited to 'arch/mips/kernel/genex.S')
-rw-r--r-- | arch/mips/kernel/genex.S | 44 |
1 files changed, 39 insertions, 5 deletions
diff --git a/arch/mips/kernel/genex.S b/arch/mips/kernel/genex.S index e7f6c1b90806..aa18a8b7b380 100644 --- a/arch/mips/kernel/genex.S +++ b/arch/mips/kernel/genex.S | |||
@@ -82,7 +82,7 @@ NESTED(except_vec3_r4000, 0, sp) | |||
82 | li k0, 14<<2 | 82 | li k0, 14<<2 |
83 | beq k1, k0, handle_vcei | 83 | beq k1, k0, handle_vcei |
84 | #ifdef CONFIG_64BIT | 84 | #ifdef CONFIG_64BIT |
85 | dsll k1, k1, 1 | 85 | dsll k1, k1, 1 |
86 | #endif | 86 | #endif |
87 | .set pop | 87 | .set pop |
88 | PTR_L k0, exception_handlers(k1) | 88 | PTR_L k0, exception_handlers(k1) |
@@ -90,17 +90,17 @@ NESTED(except_vec3_r4000, 0, sp) | |||
90 | 90 | ||
91 | /* | 91 | /* |
92 | * Big shit, we now may have two dirty primary cache lines for the same | 92 | * Big shit, we now may have two dirty primary cache lines for the same |
93 | * physical address. We can savely invalidate the line pointed to by | 93 | * physical address. We can safely invalidate the line pointed to by |
94 | * c0_badvaddr because after return from this exception handler the | 94 | * c0_badvaddr because after return from this exception handler the |
95 | * load / store will be re-executed. | 95 | * load / store will be re-executed. |
96 | */ | 96 | */ |
97 | handle_vced: | 97 | handle_vced: |
98 | DMFC0 k0, CP0_BADVADDR | 98 | MFC0 k0, CP0_BADVADDR |
99 | li k1, -4 # Is this ... | 99 | li k1, -4 # Is this ... |
100 | and k0, k1 # ... really needed? | 100 | and k0, k1 # ... really needed? |
101 | mtc0 zero, CP0_TAGLO | 101 | mtc0 zero, CP0_TAGLO |
102 | cache Index_Store_Tag_D,(k0) | 102 | cache Index_Store_Tag_D, (k0) |
103 | cache Hit_Writeback_Inv_SD,(k0) | 103 | cache Hit_Writeback_Inv_SD, (k0) |
104 | #ifdef CONFIG_PROC_FS | 104 | #ifdef CONFIG_PROC_FS |
105 | PTR_LA k0, vced_count | 105 | PTR_LA k0, vced_count |
106 | lw k1, (k0) | 106 | lw k1, (k0) |
@@ -148,6 +148,38 @@ NESTED(except_vec_ejtag_debug, 0, sp) | |||
148 | __FINIT | 148 | __FINIT |
149 | 149 | ||
150 | /* | 150 | /* |
151 | * Vectored interrupt handler. | ||
152 | * This prototype is copied to ebase + n*IntCtl.VS and patched | ||
153 | * to invoke the handler | ||
154 | */ | ||
155 | NESTED(except_vec_vi, 0, sp) | ||
156 | SAVE_SOME | ||
157 | SAVE_AT | ||
158 | .set push | ||
159 | .set noreorder | ||
160 | EXPORT(except_vec_vi_lui) | ||
161 | lui v0, 0 /* Patched */ | ||
162 | j except_vec_vi_handler | ||
163 | EXPORT(except_vec_vi_ori) | ||
164 | ori v0, 0 /* Patched */ | ||
165 | .set pop | ||
166 | END(except_vec_vi) | ||
167 | EXPORT(except_vec_vi_end) | ||
168 | |||
169 | /* | ||
170 | * Common Vectored Interrupt code | ||
171 | * Complete the register saves and invoke the handler which is passed in $v0 | ||
172 | */ | ||
173 | NESTED(except_vec_vi_handler, 0, sp) | ||
174 | SAVE_TEMP | ||
175 | SAVE_STATIC | ||
176 | CLI | ||
177 | move a0, sp | ||
178 | jalr v0 | ||
179 | j ret_from_irq | ||
180 | END(except_vec_vi_handler) | ||
181 | |||
182 | /* | ||
151 | * EJTAG debug exception handler. | 183 | * EJTAG debug exception handler. |
152 | */ | 184 | */ |
153 | NESTED(ejtag_debug_handler, PT_SIZE, sp) | 185 | NESTED(ejtag_debug_handler, PT_SIZE, sp) |
@@ -291,6 +323,8 @@ NESTED(nmi_handler, PT_SIZE, sp) | |||
291 | BUILD_HANDLER mdmx mdmx sti silent /* #22 */ | 323 | BUILD_HANDLER mdmx mdmx sti silent /* #22 */ |
292 | BUILD_HANDLER watch watch sti verbose /* #23 */ | 324 | BUILD_HANDLER watch watch sti verbose /* #23 */ |
293 | BUILD_HANDLER mcheck mcheck cli verbose /* #24 */ | 325 | BUILD_HANDLER mcheck mcheck cli verbose /* #24 */ |
326 | BUILD_HANDLER mt mt sti verbose /* #25 */ | ||
327 | BUILD_HANDLER dsp dsp sti silent /* #26 */ | ||
294 | BUILD_HANDLER reserved reserved sti verbose /* others */ | 328 | BUILD_HANDLER reserved reserved sti verbose /* others */ |
295 | 329 | ||
296 | #ifdef CONFIG_64BIT | 330 | #ifdef CONFIG_64BIT |