]> git.proxmox.com Git - mirror_ubuntu-zesty-kernel.git/blob - arch/frv/kernel/break.S
Merge tag 'media/v4.10-5' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab...
[mirror_ubuntu-zesty-kernel.git] / arch / frv / kernel / break.S
1 /* break.S: Break interrupt handling (kept separate from entry.S)
2 *
3 * Copyright (C) 2003 Red Hat, Inc. All Rights Reserved.
4 * Written by David Howells (dhowells@redhat.com)
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License
8 * as published by the Free Software Foundation; either version
9 * 2 of the License, or (at your option) any later version.
10 */
11
12 #include <linux/linkage.h>
13 #include <asm/setup.h>
14 #include <asm/segment.h>
15 #include <asm/ptrace.h>
16 #include <asm/thread_info.h>
17 #include <asm/spr-regs.h>
18
19 #include <asm/errno.h>
20
21 #
22 # the break handler has its own stack
23 #
24 .section .bss..stack
25 .globl __break_user_context
26 .balign THREAD_SIZE
27 __break_stack:
28 .space THREAD_SIZE - FRV_FRAME0_SIZE
29 __break_frame_0:
30 .space FRV_FRAME0_SIZE
31
32 #
33 # miscellaneous variables
34 #
35 .section .bss
36 #ifdef CONFIG_MMU
37 .globl __break_tlb_miss_real_return_info
38 __break_tlb_miss_real_return_info:
39 .balign 8
40 .space 2*4 /* saved PCSR, PSR for TLB-miss handler fixup */
41 #endif
42
43 __break_trace_through_exceptions:
44 .space 4
45
46 #define CS2_ECS1 0xe1200000
47 #define CS2_USERLED 0x4
48
49 .macro LEDS val,reg
50 # sethi.p %hi(CS2_ECS1+CS2_USERLED),gr30
51 # setlo %lo(CS2_ECS1+CS2_USERLED),gr30
52 # setlos #~\val,\reg
53 # st \reg,@(gr30,gr0)
54 # setlos #0x5555,\reg
55 # sethi.p %hi(0xffc00100),gr30
56 # setlo %lo(0xffc00100),gr30
57 # sth \reg,@(gr30,gr0)
58 # membar
59 .endm
60
61 ###############################################################################
62 #
63 # entry point for Break Exceptions/Interrupts
64 #
65 ###############################################################################
66 .section .text..break
67 .balign 4
68 .globl __entry_break
69 __entry_break:
70 #ifdef CONFIG_MMU
71 movgs gr31,scr3
72 #endif
73 LEDS 0x1001,gr31
74
75 sethi.p %hi(__break_frame_0),gr31
76 setlo %lo(__break_frame_0),gr31
77
78 stdi gr2,@(gr31,#REG_GR(2))
79 movsg ccr,gr3
80 sti gr3,@(gr31,#REG_CCR)
81
82 # catch the return from a TLB-miss handler that had single-step disabled
83 # traps will be enabled, so we have to do this now
84 #ifdef CONFIG_MMU
85 movsg bpcsr,gr3
86 sethi.p %hi(__break_tlb_miss_return_breaks_here),gr2
87 setlo %lo(__break_tlb_miss_return_breaks_here),gr2
88 subcc gr2,gr3,gr0,icc0
89 beq icc0,#2,__break_return_singlestep_tlbmiss
90 #endif
91
92 # determine whether we have stepped through into an exception
93 # - we need to take special action to suspend h/w single stepping if we've done
94 # that, so that the gdbstub doesn't get bogged down endlessly stepping through
95 # external interrupt handling
96 movsg bpsr,gr3
97 andicc gr3,#BPSR_BET,gr0,icc0
98 bne icc0,#2,__break_maybe_userspace /* jump if PSR.ET was 1 */
99
100 LEDS 0x1003,gr2
101
102 movsg brr,gr3
103 andicc gr3,#BRR_ST,gr0,icc0
104 andicc.p gr3,#BRR_SB,gr0,icc1
105 bne icc0,#2,__break_step /* jump if single-step caused break */
106 beq icc1,#2,__break_continue /* jump if BREAK didn't cause break */
107
108 LEDS 0x1007,gr2
109
110 # handle special breaks
111 movsg bpcsr,gr3
112
113 sethi.p %hi(__entry_return_singlestep_breaks_here),gr2
114 setlo %lo(__entry_return_singlestep_breaks_here),gr2
115 subcc gr2,gr3,gr0,icc0
116 beq icc0,#2,__break_return_singlestep
117
118 bra __break_continue
119
120
121 ###############################################################################
122 #
123 # handle BREAK instruction in kernel-mode exception epilogue
124 #
125 ###############################################################################
126 __break_return_singlestep:
127 LEDS 0x100f,gr2
128
129 # special break insn requests single-stepping to be turned back on
130 # HERE RETT
131 # PSR.ET 0 0
132 # PSR.PS old PSR.S ?
133 # PSR.S 1 1
134 # BPSR.ET 0 1 (can't have caused orig excep otherwise)
135 # BPSR.BS 1 old PSR.S
136 movsg dcr,gr2
137 sethi.p %hi(DCR_SE),gr3
138 setlo %lo(DCR_SE),gr3
139 or gr2,gr3,gr2
140 movgs gr2,dcr
141
142 movsg psr,gr2
143 andi gr2,#PSR_PS,gr2
144 slli gr2,#11,gr2 /* PSR.PS -> BPSR.BS */
145 ori gr2,#BPSR_BET,gr2 /* 1 -> BPSR.BET */
146 movgs gr2,bpsr
147
148 # return to the invoker of the original kernel exception
149 movsg pcsr,gr2
150 movgs gr2,bpcsr
151
152 LEDS 0x101f,gr2
153
154 ldi @(gr31,#REG_CCR),gr3
155 movgs gr3,ccr
156 lddi.p @(gr31,#REG_GR(2)),gr2
157 xor gr31,gr31,gr31
158 movgs gr0,brr
159 #ifdef CONFIG_MMU
160 movsg scr3,gr31
161 #endif
162 rett #1
163
164 ###############################################################################
165 #
166 # handle BREAK instruction in TLB-miss handler return path
167 #
168 ###############################################################################
169 #ifdef CONFIG_MMU
170 __break_return_singlestep_tlbmiss:
171 LEDS 0x1100,gr2
172
173 sethi.p %hi(__break_tlb_miss_real_return_info),gr3
174 setlo %lo(__break_tlb_miss_real_return_info),gr3
175 lddi @(gr3,#0),gr2
176 movgs gr2,pcsr
177 movgs gr3,psr
178
179 bra __break_return_singlestep
180 #endif
181
182
183 ###############################################################################
184 #
185 # handle single stepping into an exception prologue from kernel mode
186 # - we try and catch it whilst it is still in the main vector table
187 # - if we catch it there, we have to jump to the fixup handler
188 # - there is a fixup table that has a pointer for every 16b slot in the trap
189 # table
190 #
191 ###############################################################################
192 __break_step:
193 LEDS 0x2003,gr2
194
195 # external interrupts seem to escape from the trap table before single
196 # step catches up with them
197 movsg bpcsr,gr2
198 sethi.p %hi(__entry_kernel_external_interrupt),gr3
199 setlo %lo(__entry_kernel_external_interrupt),gr3
200 subcc.p gr2,gr3,gr0,icc0
201 sethi %hi(__entry_uspace_external_interrupt),gr3
202 setlo.p %lo(__entry_uspace_external_interrupt),gr3
203 beq icc0,#2,__break_step_kernel_external_interrupt
204 subcc.p gr2,gr3,gr0,icc0
205 sethi %hi(__entry_kernel_external_interrupt_virtually_disabled),gr3
206 setlo.p %lo(__entry_kernel_external_interrupt_virtually_disabled),gr3
207 beq icc0,#2,__break_step_uspace_external_interrupt
208 subcc.p gr2,gr3,gr0,icc0
209 sethi %hi(__entry_kernel_external_interrupt_virtual_reenable),gr3
210 setlo.p %lo(__entry_kernel_external_interrupt_virtual_reenable),gr3
211 beq icc0,#2,__break_step_kernel_external_interrupt_virtually_disabled
212 subcc gr2,gr3,gr0,icc0
213 beq icc0,#2,__break_step_kernel_external_interrupt_virtual_reenable
214
215 LEDS 0x2007,gr2
216
217 # the two main vector tables are adjacent on one 8Kb slab
218 movsg bpcsr,gr2
219 setlos #0xffffe000,gr3
220 and gr2,gr3,gr2
221 sethi.p %hi(__trap_tables),gr3
222 setlo %lo(__trap_tables),gr3
223 subcc gr2,gr3,gr0,icc0
224 bne icc0,#2,__break_continue
225
226 LEDS 0x200f,gr2
227
228 # skip workaround if so requested by GDB
229 sethi.p %hi(__break_trace_through_exceptions),gr3
230 setlo %lo(__break_trace_through_exceptions),gr3
231 ld @(gr3,gr0),gr3
232 subcc gr3,gr0,gr0,icc0
233 bne icc0,#0,__break_continue
234
235 LEDS 0x201f,gr2
236
237 # access the fixup table - there's a 1:1 mapping between the slots in the trap tables and
238 # the slots in the trap fixup tables allowing us to simply divide the offset into the
239 # former by 4 to access the latter
240 sethi.p %hi(__trap_tables),gr3
241 setlo %lo(__trap_tables),gr3
242 movsg bpcsr,gr2
243 sub gr2,gr3,gr2
244 srli.p gr2,#2,gr2
245
246 sethi %hi(__trap_fixup_tables),gr3
247 setlo.p %lo(__trap_fixup_tables),gr3
248 andi gr2,#~3,gr2
249 ld @(gr2,gr3),gr2
250 jmpil @(gr2,#0)
251
252 # step through an internal exception from kernel mode
253 .globl __break_step_kernel_softprog_interrupt
254 __break_step_kernel_softprog_interrupt:
255 sethi.p %hi(__entry_kernel_softprog_interrupt_reentry),gr3
256 setlo %lo(__entry_kernel_softprog_interrupt_reentry),gr3
257 bra __break_return_as_kernel_prologue
258
259 # step through an external interrupt from kernel mode
260 .globl __break_step_kernel_external_interrupt
261 __break_step_kernel_external_interrupt:
262 # deal with virtual interrupt disablement
263 beq icc2,#0,__break_step_kernel_external_interrupt_virtually_disabled
264
265 sethi.p %hi(__entry_kernel_external_interrupt_reentry),gr3
266 setlo %lo(__entry_kernel_external_interrupt_reentry),gr3
267
268 __break_return_as_kernel_prologue:
269 LEDS 0x203f,gr2
270
271 movgs gr3,bpcsr
272
273 # do the bit we had to skip
274 #ifdef CONFIG_MMU
275 movsg ear0,gr2 /* EAR0 can get clobbered by gdb-stub (ICI/ICEI) */
276 movgs gr2,scr2
277 #endif
278
279 or.p sp,gr0,gr2 /* set up the stack pointer */
280 subi sp,#REG__END,sp
281 sti.p gr2,@(sp,#REG_SP)
282
283 setlos #REG__STATUS_STEP,gr2
284 sti gr2,@(sp,#REG__STATUS) /* record single step status */
285
286 # cancel single-stepping mode
287 movsg dcr,gr2
288 sethi.p %hi(~DCR_SE),gr3
289 setlo %lo(~DCR_SE),gr3
290 and gr2,gr3,gr2
291 movgs gr2,dcr
292
293 LEDS 0x207f,gr2
294
295 ldi @(gr31,#REG_CCR),gr3
296 movgs gr3,ccr
297 lddi.p @(gr31,#REG_GR(2)),gr2
298 xor gr31,gr31,gr31
299 movgs gr0,brr
300 #ifdef CONFIG_MMU
301 movsg scr3,gr31
302 #endif
303 rett #1
304
305 # we single-stepped into an interrupt handler whilst interrupts were merely virtually disabled
306 # need to really disable interrupts, set flag, fix up and return
307 __break_step_kernel_external_interrupt_virtually_disabled:
308 movsg psr,gr2
309 andi gr2,#~PSR_PIL,gr2
310 ori gr2,#PSR_PIL_14,gr2 /* debugging interrupts only */
311 movgs gr2,psr
312
313 ldi @(gr31,#REG_CCR),gr3
314 movgs gr3,ccr
315 subcc.p gr0,gr0,gr0,icc2 /* leave Z set, clear C */
316
317 # exceptions must've been enabled and we must've been in supervisor mode
318 setlos BPSR_BET|BPSR_BS,gr3
319 movgs gr3,bpsr
320
321 # return to where the interrupt happened
322 movsg pcsr,gr2
323 movgs gr2,bpcsr
324
325 lddi.p @(gr31,#REG_GR(2)),gr2
326
327 xor gr31,gr31,gr31
328 movgs gr0,brr
329 #ifdef CONFIG_MMU
330 movsg scr3,gr31
331 #endif
332 rett #1
333
334 # we stepped through into the virtual interrupt reenablement trap
335 #
336 # we also want to single step anyway, but after fixing up so that we get an event on the
337 # instruction after the broken-into exception returns
338 .globl __break_step_kernel_external_interrupt_virtual_reenable
339 __break_step_kernel_external_interrupt_virtual_reenable:
340 movsg psr,gr2
341 andi gr2,#~PSR_PIL,gr2
342 movgs gr2,psr
343
344 ldi @(gr31,#REG_CCR),gr3
345 movgs gr3,ccr
346 subicc gr0,#1,gr0,icc2 /* clear Z, set C */
347
348 # save the adjusted ICC2
349 movsg ccr,gr3
350 sti gr3,@(gr31,#REG_CCR)
351
352 # exceptions must've been enabled and we must've been in supervisor mode
353 setlos BPSR_BET|BPSR_BS,gr3
354 movgs gr3,bpsr
355
356 # return to where the trap happened
357 movsg pcsr,gr2
358 movgs gr2,bpcsr
359
360 # and then process the single step
361 bra __break_continue
362
363 # step through an internal exception from uspace mode
364 .globl __break_step_uspace_softprog_interrupt
365 __break_step_uspace_softprog_interrupt:
366 sethi.p %hi(__entry_uspace_softprog_interrupt_reentry),gr3
367 setlo %lo(__entry_uspace_softprog_interrupt_reentry),gr3
368 bra __break_return_as_uspace_prologue
369
370 # step through an external interrupt from kernel mode
371 .globl __break_step_uspace_external_interrupt
372 __break_step_uspace_external_interrupt:
373 sethi.p %hi(__entry_uspace_external_interrupt_reentry),gr3
374 setlo %lo(__entry_uspace_external_interrupt_reentry),gr3
375
376 __break_return_as_uspace_prologue:
377 LEDS 0x20ff,gr2
378
379 movgs gr3,bpcsr
380
381 # do the bit we had to skip
382 sethi.p %hi(__kernel_frame0_ptr),gr28
383 setlo %lo(__kernel_frame0_ptr),gr28
384 ldi.p @(gr28,#0),gr28
385
386 setlos #REG__STATUS_STEP,gr2
387 sti gr2,@(gr28,#REG__STATUS) /* record single step status */
388
389 # cancel single-stepping mode
390 movsg dcr,gr2
391 sethi.p %hi(~DCR_SE),gr3
392 setlo %lo(~DCR_SE),gr3
393 and gr2,gr3,gr2
394 movgs gr2,dcr
395
396 LEDS 0x20fe,gr2
397
398 ldi @(gr31,#REG_CCR),gr3
399 movgs gr3,ccr
400 lddi.p @(gr31,#REG_GR(2)),gr2
401 xor gr31,gr31,gr31
402 movgs gr0,brr
403 #ifdef CONFIG_MMU
404 movsg scr3,gr31
405 #endif
406 rett #1
407
408 #ifdef CONFIG_MMU
409 # step through an ITLB-miss handler from user mode
410 .globl __break_user_insn_tlb_miss
411 __break_user_insn_tlb_miss:
412 # we'll want to try the trap stub again
413 sethi.p %hi(__trap_user_insn_tlb_miss),gr2
414 setlo %lo(__trap_user_insn_tlb_miss),gr2
415 movgs gr2,bpcsr
416
417 __break_tlb_miss_common:
418 LEDS 0x2101,gr2
419
420 # cancel single-stepping mode
421 movsg dcr,gr2
422 sethi.p %hi(~DCR_SE),gr3
423 setlo %lo(~DCR_SE),gr3
424 and gr2,gr3,gr2
425 movgs gr2,dcr
426
427 # we'll swap the real return address for one with a BREAK insn so that we can re-enable
428 # single stepping on return
429 movsg pcsr,gr2
430 sethi.p %hi(__break_tlb_miss_real_return_info),gr3
431 setlo %lo(__break_tlb_miss_real_return_info),gr3
432 sti gr2,@(gr3,#0)
433
434 sethi.p %hi(__break_tlb_miss_return_break),gr2
435 setlo %lo(__break_tlb_miss_return_break),gr2
436 movgs gr2,pcsr
437
438 # we also have to fudge PSR because the return BREAK is in kernel space and we want
439 # to get a BREAK fault not an access violation should the return be to userspace
440 movsg psr,gr2
441 sti.p gr2,@(gr3,#4)
442 ori gr2,#PSR_PS,gr2
443 movgs gr2,psr
444
445 LEDS 0x2102,gr2
446
447 ldi @(gr31,#REG_CCR),gr3
448 movgs gr3,ccr
449 lddi @(gr31,#REG_GR(2)),gr2
450 movsg scr3,gr31
451 movgs gr0,brr
452 rett #1
453
454 # step through a DTLB-miss handler from user mode
455 .globl __break_user_data_tlb_miss
456 __break_user_data_tlb_miss:
457 # we'll want to try the trap stub again
458 sethi.p %hi(__trap_user_data_tlb_miss),gr2
459 setlo %lo(__trap_user_data_tlb_miss),gr2
460 movgs gr2,bpcsr
461 bra __break_tlb_miss_common
462
463 # step through an ITLB-miss handler from kernel mode
464 .globl __break_kernel_insn_tlb_miss
465 __break_kernel_insn_tlb_miss:
466 # we'll want to try the trap stub again
467 sethi.p %hi(__trap_kernel_insn_tlb_miss),gr2
468 setlo %lo(__trap_kernel_insn_tlb_miss),gr2
469 movgs gr2,bpcsr
470 bra __break_tlb_miss_common
471
472 # step through a DTLB-miss handler from kernel mode
473 .globl __break_kernel_data_tlb_miss
474 __break_kernel_data_tlb_miss:
475 # we'll want to try the trap stub again
476 sethi.p %hi(__trap_kernel_data_tlb_miss),gr2
477 setlo %lo(__trap_kernel_data_tlb_miss),gr2
478 movgs gr2,bpcsr
479 bra __break_tlb_miss_common
480 #endif
481
482 ###############################################################################
483 #
484 # handle debug events originating with userspace
485 #
486 ###############################################################################
487 __break_maybe_userspace:
488 LEDS 0x3003,gr2
489
490 setlos #BPSR_BS,gr2
491 andcc gr3,gr2,gr0,icc0
492 bne icc0,#0,__break_continue /* skip if PSR.S was 1 */
493
494 movsg brr,gr2
495 andicc gr2,#BRR_ST|BRR_SB,gr0,icc0
496 beq icc0,#0,__break_continue /* jump if not BREAK or single-step */
497
498 LEDS 0x3007,gr2
499
500 # do the first part of the exception prologue here
501 sethi.p %hi(__kernel_frame0_ptr),gr28
502 setlo %lo(__kernel_frame0_ptr),gr28
503 ldi @(gr28,#0),gr28
504 andi gr28,#~7,gr28
505
506 # set up the kernel stack pointer
507 sti sp ,@(gr28,#REG_SP)
508 ori gr28,0,sp
509 sti gr0 ,@(gr28,#REG_GR(28))
510
511 stdi gr20,@(gr28,#REG_GR(20))
512 stdi gr22,@(gr28,#REG_GR(22))
513
514 movsg tbr,gr20
515 movsg bpcsr,gr21
516 movsg psr,gr22
517
518 # determine the exception type and cancel single-stepping mode
519 or gr0,gr0,gr23
520
521 movsg dcr,gr2
522 sethi.p %hi(DCR_SE),gr3
523 setlo %lo(DCR_SE),gr3
524 andcc gr2,gr3,gr0,icc0
525 beq icc0,#0,__break_no_user_sstep /* must have been a BREAK insn */
526
527 not gr3,gr3
528 and gr2,gr3,gr2
529 movgs gr2,dcr
530 ori gr23,#REG__STATUS_STEP,gr23
531
532 __break_no_user_sstep:
533 LEDS 0x300f,gr2
534
535 movsg brr,gr2
536 andi gr2,#BRR_ST|BRR_SB,gr2
537 slli gr2,#1,gr2
538 or gr23,gr2,gr23
539 sti.p gr23,@(gr28,#REG__STATUS) /* record single step status */
540
541 # adjust the value acquired from TBR - this indicates the exception
542 setlos #~TBR_TT,gr2
543 and.p gr20,gr2,gr20
544 setlos #TBR_TT_BREAK,gr2
545 or.p gr20,gr2,gr20
546
547 # fudge PSR.PS and BPSR.BS to return to kernel mode through the trap
548 # table as trap 126
549 andi gr22,#~PSR_PS,gr22 /* PSR.PS should be 0 */
550 movgs gr22,psr
551
552 setlos #BPSR_BS,gr2 /* BPSR.BS should be 1 and BPSR.BET 0 */
553 movgs gr2,bpsr
554
555 # return through remainder of the exception prologue
556 # - need to load gr23 with return handler address
557 sethi.p %hi(__entry_return_from_user_exception),gr23
558 setlo %lo(__entry_return_from_user_exception),gr23
559 sethi.p %hi(__entry_common),gr3
560 setlo %lo(__entry_common),gr3
561 movgs gr3,bpcsr
562
563 LEDS 0x301f,gr2
564
565 ldi @(gr31,#REG_CCR),gr3
566 movgs gr3,ccr
567 lddi.p @(gr31,#REG_GR(2)),gr2
568 xor gr31,gr31,gr31
569 movgs gr0,brr
570 #ifdef CONFIG_MMU
571 movsg scr3,gr31
572 #endif
573 rett #1
574
575 ###############################################################################
576 #
577 # resume normal debug-mode entry
578 #
579 ###############################################################################
580 __break_continue:
581 LEDS 0x4003,gr2
582
583 # set up the kernel stack pointer
584 sti sp,@(gr31,#REG_SP)
585
586 sethi.p %hi(__break_frame_0),sp
587 setlo %lo(__break_frame_0),sp
588
589 # finish building the exception frame
590 stdi gr4 ,@(gr31,#REG_GR(4))
591 stdi gr6 ,@(gr31,#REG_GR(6))
592 stdi gr8 ,@(gr31,#REG_GR(8))
593 stdi gr10,@(gr31,#REG_GR(10))
594 stdi gr12,@(gr31,#REG_GR(12))
595 stdi gr14,@(gr31,#REG_GR(14))
596 stdi gr16,@(gr31,#REG_GR(16))
597 stdi gr18,@(gr31,#REG_GR(18))
598 stdi gr20,@(gr31,#REG_GR(20))
599 stdi gr22,@(gr31,#REG_GR(22))
600 stdi gr24,@(gr31,#REG_GR(24))
601 stdi gr26,@(gr31,#REG_GR(26))
602 sti gr0 ,@(gr31,#REG_GR(28)) /* NULL frame pointer */
603 sti gr29,@(gr31,#REG_GR(29))
604 sti gr30,@(gr31,#REG_GR(30))
605 sti gr8 ,@(gr31,#REG_ORIG_GR8)
606
607 #ifdef CONFIG_MMU
608 movsg scr3,gr19
609 sti gr19,@(gr31,#REG_GR(31))
610 #endif
611
612 movsg bpsr ,gr19
613 movsg tbr ,gr20
614 movsg bpcsr,gr21
615 movsg psr ,gr22
616 movsg isr ,gr23
617 movsg cccr ,gr25
618 movsg lr ,gr26
619 movsg lcr ,gr27
620
621 andi.p gr22,#~(PSR_S|PSR_ET),gr5 /* rebuild PSR */
622 andi gr19,#PSR_ET,gr4
623 or.p gr4,gr5,gr5
624 srli gr19,#10,gr4
625 andi gr4,#PSR_S,gr4
626 or.p gr4,gr5,gr5
627
628 setlos #-1,gr6
629 sti gr20,@(gr31,#REG_TBR)
630 sti gr21,@(gr31,#REG_PC)
631 sti gr5 ,@(gr31,#REG_PSR)
632 sti gr23,@(gr31,#REG_ISR)
633 sti gr25,@(gr31,#REG_CCCR)
634 stdi gr26,@(gr31,#REG_LR)
635 sti gr6 ,@(gr31,#REG_SYSCALLNO)
636
637 # store CPU-specific regs
638 movsg iacc0h,gr4
639 movsg iacc0l,gr5
640 stdi gr4,@(gr31,#REG_IACC0)
641
642 movsg gner0,gr4
643 movsg gner1,gr5
644 stdi gr4,@(gr31,#REG_GNER0)
645
646 # build the debug register frame
647 movsg brr,gr4
648 movgs gr0,brr
649 movsg nmar,gr5
650 movsg dcr,gr6
651
652 sethi.p %hi(__debug_status),gr7
653 setlo %lo(__debug_status),gr7
654
655 stdi gr4 ,@(gr7,#DEBUG_BRR)
656 sti gr19,@(gr7,#DEBUG_BPSR)
657 sti.p gr6 ,@(gr7,#DEBUG_DCR)
658
659 # trap exceptions during break handling and disable h/w breakpoints/watchpoints
660 sethi %hi(DCR_EBE),gr5
661 setlo.p %lo(DCR_EBE),gr5
662 sethi %hi(__entry_breaktrap_table),gr4
663 setlo %lo(__entry_breaktrap_table),gr4
664 movgs gr5,dcr
665 movgs gr4,tbr
666
667 # set up kernel global registers
668 sethi.p %hi(__kernel_current_task),gr5
669 setlo %lo(__kernel_current_task),gr5
670 ld @(gr5,gr0),gr29
671 ldi.p @(gr29,#4),gr15 ; __current_thread_info = current->thread_info
672
673 sethi %hi(_gp),gr16
674 setlo.p %lo(_gp),gr16
675
676 # make sure we (the kernel) get div-zero and misalignment exceptions
677 setlos #ISR_EDE|ISR_DTT_DIVBYZERO|ISR_EMAM_EXCEPTION,gr5
678 movgs gr5,isr
679
680 # enter the GDB stub
681 LEDS 0x4007,gr2
682
683 or.p gr0,gr0,fp
684 call debug_stub
685
686 LEDS 0x403f,gr2
687
688 # return from break
689 lddi @(gr31,#REG_IACC0),gr4
690 movgs gr4,iacc0h
691 movgs gr5,iacc0l
692
693 lddi @(gr31,#REG_GNER0),gr4
694 movgs gr4,gner0
695 movgs gr5,gner1
696
697 lddi @(gr31,#REG_LR) ,gr26
698 lddi @(gr31,#REG_CCR) ,gr24
699 lddi @(gr31,#REG_PSR) ,gr22
700 ldi @(gr31,#REG_PC) ,gr21
701 ldi @(gr31,#REG_TBR) ,gr20
702
703 sethi.p %hi(__debug_status),gr6
704 setlo %lo(__debug_status),gr6
705 ldi.p @(gr6,#DEBUG_DCR) ,gr6
706
707 andi gr22,#PSR_S,gr19 /* rebuild BPSR */
708 andi.p gr22,#PSR_ET,gr5
709 slli gr19,#10,gr19
710 or gr5,gr19,gr19
711
712 movgs gr6 ,dcr
713 movgs gr19,bpsr
714 movgs gr20,tbr
715 movgs gr21,bpcsr
716 movgs gr23,isr
717 movgs gr24,ccr
718 movgs gr25,cccr
719 movgs gr26,lr
720 movgs gr27,lcr
721
722 LEDS 0x407f,gr2
723
724 #ifdef CONFIG_MMU
725 ldi @(gr31,#REG_GR(31)),gr2
726 movgs gr2,scr3
727 #endif
728
729 ldi @(gr31,#REG_GR(30)),gr30
730 ldi @(gr31,#REG_GR(29)),gr29
731 lddi @(gr31,#REG_GR(26)),gr26
732 lddi @(gr31,#REG_GR(24)),gr24
733 lddi @(gr31,#REG_GR(22)),gr22
734 lddi @(gr31,#REG_GR(20)),gr20
735 lddi @(gr31,#REG_GR(18)),gr18
736 lddi @(gr31,#REG_GR(16)),gr16
737 lddi @(gr31,#REG_GR(14)),gr14
738 lddi @(gr31,#REG_GR(12)),gr12
739 lddi @(gr31,#REG_GR(10)),gr10
740 lddi @(gr31,#REG_GR(8)) ,gr8
741 lddi @(gr31,#REG_GR(6)) ,gr6
742 lddi @(gr31,#REG_GR(4)) ,gr4
743 lddi @(gr31,#REG_GR(2)) ,gr2
744 ldi.p @(gr31,#REG_SP) ,sp
745
746 xor gr31,gr31,gr31
747 movgs gr0,brr
748 #ifdef CONFIG_MMU
749 movsg scr3,gr31
750 #endif
751 rett #1
752
753 ###################################################################################################
754 #
755 # GDB stub "system calls"
756 #
757 ###################################################################################################
758
759 #ifdef CONFIG_GDBSTUB
760 # void gdbstub_console_write(struct console *con, const char *p, unsigned n)
761 .globl gdbstub_console_write
762 gdbstub_console_write:
763 break
764 bralr
765 #endif
766
767 # GDB stub BUG() trap
768 # GR8 is the proposed signal number
769 .globl __debug_bug_trap
770 __debug_bug_trap:
771 break
772 bralr
773
774 # transfer kernel exeception to GDB for handling
775 .globl __break_hijack_kernel_event
776 __break_hijack_kernel_event:
777 break
778 .globl __break_hijack_kernel_event_breaks_here
779 __break_hijack_kernel_event_breaks_here:
780 nop
781
782 #ifdef CONFIG_MMU
783 # handle a return from TLB-miss that requires single-step reactivation
784 .globl __break_tlb_miss_return_break
785 __break_tlb_miss_return_break:
786 break
787 __break_tlb_miss_return_breaks_here:
788 nop
789 #endif
790
791 # guard the first .text label in the next file from confusion
792 nop