diff options
Diffstat (limited to 'arch/mn10300/kernel/entry.S')
-rw-r--r-- | arch/mn10300/kernel/entry.S | 113 |
1 files changed, 90 insertions, 23 deletions
diff --git a/arch/mn10300/kernel/entry.S b/arch/mn10300/kernel/entry.S index 355f68176771..f00b9bafcd3e 100644 --- a/arch/mn10300/kernel/entry.S +++ b/arch/mn10300/kernel/entry.S | |||
@@ -28,25 +28,17 @@ | |||
28 | #include <asm/asm-offsets.h> | 28 | #include <asm/asm-offsets.h> |
29 | #include <asm/frame.inc> | 29 | #include <asm/frame.inc> |
30 | 30 | ||
31 | #if defined(CONFIG_SMP) && defined(CONFIG_GDBSTUB) | ||
32 | #include <asm/gdb-stub.h> | ||
33 | #endif /* CONFIG_SMP && CONFIG_GDBSTUB */ | ||
34 | |||
31 | #ifdef CONFIG_PREEMPT | 35 | #ifdef CONFIG_PREEMPT |
32 | #define preempt_stop __cli | 36 | #define preempt_stop LOCAL_IRQ_DISABLE |
33 | #else | 37 | #else |
34 | #define preempt_stop | 38 | #define preempt_stop |
35 | #define resume_kernel restore_all | 39 | #define resume_kernel restore_all |
36 | #endif | 40 | #endif |
37 | 41 | ||
38 | .macro __cli | ||
39 | and ~EPSW_IM,epsw | ||
40 | or EPSW_IE|MN10300_CLI_LEVEL,epsw | ||
41 | nop | ||
42 | nop | ||
43 | nop | ||
44 | .endm | ||
45 | .macro __sti | ||
46 | or EPSW_IE|EPSW_IM_7,epsw | ||
47 | .endm | ||
48 | |||
49 | |||
50 | .am33_2 | 42 | .am33_2 |
51 | 43 | ||
52 | ############################################################################### | 44 | ############################################################################### |
@@ -88,7 +80,7 @@ syscall_call: | |||
88 | syscall_exit: | 80 | syscall_exit: |
89 | # make sure we don't miss an interrupt setting need_resched or | 81 | # make sure we don't miss an interrupt setting need_resched or |
90 | # sigpending between sampling and the rti | 82 | # sigpending between sampling and the rti |
91 | __cli | 83 | LOCAL_IRQ_DISABLE |
92 | mov (TI_flags,a2),d2 | 84 | mov (TI_flags,a2),d2 |
93 | btst _TIF_ALLWORK_MASK,d2 | 85 | btst _TIF_ALLWORK_MASK,d2 |
94 | bne syscall_exit_work | 86 | bne syscall_exit_work |
@@ -105,7 +97,7 @@ restore_all: | |||
105 | syscall_exit_work: | 97 | syscall_exit_work: |
106 | btst _TIF_SYSCALL_TRACE,d2 | 98 | btst _TIF_SYSCALL_TRACE,d2 |
107 | beq work_pending | 99 | beq work_pending |
108 | __sti # could let syscall_trace_exit() call | 100 | LOCAL_IRQ_ENABLE # could let syscall_trace_exit() call |
109 | # schedule() instead | 101 | # schedule() instead |
110 | mov fp,d0 | 102 | mov fp,d0 |
111 | call syscall_trace_exit[],0 # do_syscall_trace(regs) | 103 | call syscall_trace_exit[],0 # do_syscall_trace(regs) |
@@ -121,7 +113,7 @@ work_resched: | |||
121 | 113 | ||
122 | # make sure we don't miss an interrupt setting need_resched or | 114 | # make sure we don't miss an interrupt setting need_resched or |
123 | # sigpending between sampling and the rti | 115 | # sigpending between sampling and the rti |
124 | __cli | 116 | LOCAL_IRQ_DISABLE |
125 | 117 | ||
126 | # is there any work to be done other than syscall tracing? | 118 | # is there any work to be done other than syscall tracing? |
127 | mov (TI_flags,a2),d2 | 119 | mov (TI_flags,a2),d2 |
@@ -168,7 +160,7 @@ ret_from_intr: | |||
168 | ENTRY(resume_userspace) | 160 | ENTRY(resume_userspace) |
169 | # make sure we don't miss an interrupt setting need_resched or | 161 | # make sure we don't miss an interrupt setting need_resched or |
170 | # sigpending between sampling and the rti | 162 | # sigpending between sampling and the rti |
171 | __cli | 163 | LOCAL_IRQ_DISABLE |
172 | 164 | ||
173 | # is there any work to be done on int/exception return? | 165 | # is there any work to be done on int/exception return? |
174 | mov (TI_flags,a2),d2 | 166 | mov (TI_flags,a2),d2 |
@@ -178,7 +170,7 @@ ENTRY(resume_userspace) | |||
178 | 170 | ||
179 | #ifdef CONFIG_PREEMPT | 171 | #ifdef CONFIG_PREEMPT |
180 | ENTRY(resume_kernel) | 172 | ENTRY(resume_kernel) |
181 | __cli | 173 | LOCAL_IRQ_DISABLE |
182 | mov (TI_preempt_count,a2),d0 # non-zero preempt_count ? | 174 | mov (TI_preempt_count,a2),d0 # non-zero preempt_count ? |
183 | cmp 0,d0 | 175 | cmp 0,d0 |
184 | bne restore_all | 176 | bne restore_all |
@@ -281,6 +273,79 @@ ENTRY(nmi_handler) | |||
281 | add -4,sp | 273 | add -4,sp |
282 | mov d0,(sp) | 274 | mov d0,(sp) |
283 | mov (TBR),d0 | 275 | mov (TBR),d0 |
276 | |||
277 | #ifdef CONFIG_SMP | ||
278 | add -4,sp | ||
279 | mov d0,(sp) # save d0(TBR) | ||
280 | movhu (NMIAGR),d0 | ||
281 | and NMIAGR_GN,d0 | ||
282 | lsr 0x2,d0 | ||
283 | cmp CALL_FUNCTION_NMI_IPI,d0 | ||
284 | bne 5f # if not call function, jump | ||
285 | |||
286 | # function call nmi ipi | ||
287 | add 4,sp # no need to store TBR | ||
288 | mov GxICR_DETECT,d0 # clear NMI request | ||
289 | movbu d0,(GxICR(CALL_FUNCTION_NMI_IPI)) | ||
290 | movhu (GxICR(CALL_FUNCTION_NMI_IPI)),d0 | ||
291 | and ~EPSW_NMID,epsw # enable NMI | ||
292 | |||
293 | mov (sp),d0 # restore d0 | ||
294 | SAVE_ALL | ||
295 | call smp_nmi_call_function_interrupt[],0 | ||
296 | RESTORE_ALL | ||
297 | |||
298 | 5: | ||
299 | #ifdef CONFIG_GDBSTUB | ||
300 | cmp GDB_NMI_IPI,d0 | ||
301 | bne 3f # if not gdb nmi ipi, jump | ||
302 | |||
303 | # gdb nmi ipi | ||
304 | add 4,sp # no need to store TBR | ||
305 | mov GxICR_DETECT,d0 # clear NMI | ||
306 | movbu d0,(GxICR(GDB_NMI_IPI)) | ||
307 | movhu (GxICR(GDB_NMI_IPI)),d0 | ||
308 | and ~EPSW_NMID,epsw # enable NMI | ||
309 | #ifdef CONFIG_MN10300_CACHE_ENABLED | ||
310 | mov (gdbstub_nmi_opr_type),d0 | ||
311 | cmp GDBSTUB_NMI_CACHE_PURGE,d0 | ||
312 | bne 4f # if not gdb cache purge, jump | ||
313 | |||
314 | # gdb cache purge nmi ipi | ||
315 | add -20,sp | ||
316 | mov d1,(4,sp) | ||
317 | mov a0,(8,sp) | ||
318 | mov a1,(12,sp) | ||
319 | mov mdr,d0 | ||
320 | mov d0,(16,sp) | ||
321 | call gdbstub_local_purge_cache[],0 | ||
322 | mov 0x1,d0 | ||
323 | mov (CPUID),d1 | ||
324 | asl d1,d0 | ||
325 | mov gdbstub_nmi_cpumask,a0 | ||
326 | bclr d0,(a0) | ||
327 | mov (4,sp),d1 | ||
328 | mov (8,sp),a0 | ||
329 | mov (12,sp),a1 | ||
330 | mov (16,sp),d0 | ||
331 | mov d0,mdr | ||
332 | add 20,sp | ||
333 | mov (sp),d0 | ||
334 | add 4,sp | ||
335 | rti | ||
336 | 4: | ||
337 | #endif /* CONFIG_MN10300_CACHE_ENABLED */ | ||
338 | # gdb wait nmi ipi | ||
339 | mov (sp),d0 | ||
340 | SAVE_ALL | ||
341 | call gdbstub_nmi_wait[],0 | ||
342 | RESTORE_ALL | ||
343 | 3: | ||
344 | #endif /* CONFIG_GDBSTUB */ | ||
345 | mov (sp),d0 # restore TBR to d0 | ||
346 | add 4,sp | ||
347 | #endif /* CONFIG_SMP */ | ||
348 | |||
284 | bra __common_exception_nonmi | 349 | bra __common_exception_nonmi |
285 | 350 | ||
286 | ENTRY(__common_exception) | 351 | ENTRY(__common_exception) |
@@ -314,15 +379,21 @@ __common_exception_nonmi: | |||
314 | mov d0,(REG_ORIG_D0,fp) | 379 | mov d0,(REG_ORIG_D0,fp) |
315 | 380 | ||
316 | #ifdef CONFIG_GDBSTUB | 381 | #ifdef CONFIG_GDBSTUB |
382 | #ifdef CONFIG_SMP | ||
383 | call gdbstub_busy_check[],0 | ||
384 | and d0,d0 # check return value | ||
385 | beq 2f | ||
386 | #else /* CONFIG_SMP */ | ||
317 | btst 0x01,(gdbstub_busy) | 387 | btst 0x01,(gdbstub_busy) |
318 | beq 2f | 388 | beq 2f |
389 | #endif /* CONFIG_SMP */ | ||
319 | and ~EPSW_IE,epsw | 390 | and ~EPSW_IE,epsw |
320 | mov fp,d0 | 391 | mov fp,d0 |
321 | mov a2,d1 | 392 | mov a2,d1 |
322 | call gdbstub_exception[],0 # gdbstub itself caused an exception | 393 | call gdbstub_exception[],0 # gdbstub itself caused an exception |
323 | bra restore_all | 394 | bra restore_all |
324 | 2: | 395 | 2: |
325 | #endif | 396 | #endif /* CONFIG_GDBSTUB */ |
326 | 397 | ||
327 | mov fp,d0 # arg 0: stacked register file | 398 | mov fp,d0 # arg 0: stacked register file |
328 | mov a2,d1 # arg 1: exception number | 399 | mov a2,d1 # arg 1: exception number |
@@ -357,11 +428,7 @@ ENTRY(set_excp_vector) | |||
357 | add exception_table,d0 | 428 | add exception_table,d0 |
358 | mov d1,(d0) | 429 | mov d1,(d0) |
359 | mov 4,d1 | 430 | mov 4,d1 |
360 | #if defined(CONFIG_MN10300_CACHE_WBACK) | ||
361 | jmp mn10300_dcache_flush_inv_range2 | ||
362 | #else | ||
363 | ret [],0 | 431 | ret [],0 |
364 | #endif | ||
365 | 432 | ||
366 | ############################################################################### | 433 | ############################################################################### |
367 | # | 434 | # |