OpenCores
URL https://opencores.org/ocsvn/or1k_soc_on_altera_embedded_dev_kit/or1k_soc_on_altera_embedded_dev_kit/trunk

Subversion Repositories or1k_soc_on_altera_embedded_dev_kit

[/] [or1k_soc_on_altera_embedded_dev_kit/] [trunk/] [linux-2.6/] [linux-2.6.24/] [arch/] [frv/] [kernel/] [break.S] - Blame information for rev 3

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 3 xianfeng
/* 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 
13
#include 
14
#include 
15
#include 
16
#include 
17
#include 
18
 
19
#include 
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

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.