diff options
author | David S. Miller <davem@davemloft.net> | 2008-04-29 05:38:50 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2008-04-29 05:38:50 -0400 |
commit | e2fdd7fd99dd68b77caaf2a2272b75b5da890de7 (patch) | |
tree | d2b6d3a9b50e4d2ced793430d2b1414f790666a3 /arch/sparc/kernel/entry.S | |
parent | 4d7ffa49909a830f5f926a3280731d01e29f31fb (diff) |
sparc: Add kgdb support.
Current limitations:
1) On SMP single stepping has some fundamental issues,
shared with other sw single-step architectures such
as mips and arm.
2) On 32-bit sparc we don't support SMP kgdb yet. That
requires some reworking of the IPI mechanisms and
infrastructure on that platform.
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'arch/sparc/kernel/entry.S')
-rw-r--r-- | arch/sparc/kernel/entry.S | 125 |
1 files changed, 44 insertions, 81 deletions
diff --git a/arch/sparc/kernel/entry.S b/arch/sparc/kernel/entry.S index 484c83d23eef..57d1bbdd0bd2 100644 --- a/arch/sparc/kernel/entry.S +++ b/arch/sparc/kernel/entry.S | |||
@@ -12,7 +12,6 @@ | |||
12 | #include <asm/head.h> | 12 | #include <asm/head.h> |
13 | #include <asm/asi.h> | 13 | #include <asm/asi.h> |
14 | #include <asm/smp.h> | 14 | #include <asm/smp.h> |
15 | #include <asm/kgdb.h> | ||
16 | #include <asm/contregs.h> | 15 | #include <asm/contregs.h> |
17 | #include <asm/ptrace.h> | 16 | #include <asm/ptrace.h> |
18 | #include <asm/asm-offsets.h> | 17 | #include <asm/asm-offsets.h> |
@@ -45,91 +44,20 @@ | |||
45 | _SV; _SV; _SV; _SV; _SV; _SV; _SV; \ | 44 | _SV; _SV; _SV; _SV; _SV; _SV; _SV; \ |
46 | _RS; _RS; _RS; _RS; _RS; _RS; _RS; | 45 | _RS; _RS; _RS; _RS; _RS; _RS; _RS; |
47 | 46 | ||
48 | /* First, KGDB low level things. This is a rewrite | ||
49 | * of the routines found in the sparc-stub.c asm() statement | ||
50 | * from the gdb distribution. This is also dual-purpose | ||
51 | * as a software trap for userlevel programs. | ||
52 | */ | ||
53 | .data | ||
54 | .align 4 | ||
55 | |||
56 | in_trap_handler: | ||
57 | .word 0 | ||
58 | |||
59 | .text | 47 | .text |
60 | .align 4 | ||
61 | 48 | ||
62 | #if 0 /* kgdb is dropped from 2.5.33 */ | 49 | #ifdef CONFIG_KGDB |
63 | ! This function is called when any SPARC trap (except window overflow or | 50 | .align 4 |
64 | ! underflow) occurs. It makes sure that the invalid register window is still | 51 | .globl arch_kgdb_breakpoint |
65 | ! available before jumping into C code. It will also restore the world if you | 52 | .type arch_kgdb_breakpoint,#function |
66 | ! return from handle_exception. | 53 | arch_kgdb_breakpoint: |
67 | 54 | ta 0x7d | |
68 | .globl trap_low | 55 | retl |
69 | trap_low: | 56 | nop |
70 | rd %wim, %l3 | 57 | .size arch_kgdb_breakpoint,.-arch_kgdb_breakpoint |
71 | SAVE_ALL | ||
72 | |||
73 | sethi %hi(in_trap_handler), %l4 | ||
74 | ld [%lo(in_trap_handler) + %l4], %l5 | ||
75 | inc %l5 | ||
76 | st %l5, [%lo(in_trap_handler) + %l4] | ||
77 | |||
78 | /* Make sure kgdb sees the same state we just saved. */ | ||
79 | LOAD_PT_GLOBALS(sp) | ||
80 | LOAD_PT_INS(sp) | ||
81 | ld [%sp + STACKFRAME_SZ + PT_Y], %l4 | ||
82 | ld [%sp + STACKFRAME_SZ + PT_WIM], %l3 | ||
83 | ld [%sp + STACKFRAME_SZ + PT_PSR], %l0 | ||
84 | ld [%sp + STACKFRAME_SZ + PT_PC], %l1 | ||
85 | ld [%sp + STACKFRAME_SZ + PT_NPC], %l2 | ||
86 | rd %tbr, %l5 /* Never changes... */ | ||
87 | |||
88 | /* Make kgdb exception frame. */ | ||
89 | sub %sp,(16+1+6+1+72)*4,%sp ! Make room for input & locals | ||
90 | ! + hidden arg + arg spill | ||
91 | ! + doubleword alignment | ||
92 | ! + registers[72] local var | ||
93 | SAVE_KGDB_GLOBALS(sp) | ||
94 | SAVE_KGDB_INS(sp) | ||
95 | SAVE_KGDB_SREGS(sp, l4, l0, l3, l5, l1, l2) | ||
96 | |||
97 | /* We are increasing PIL, so two writes. */ | ||
98 | or %l0, PSR_PIL, %l0 | ||
99 | wr %l0, 0, %psr | ||
100 | WRITE_PAUSE | ||
101 | wr %l0, PSR_ET, %psr | ||
102 | WRITE_PAUSE | ||
103 | |||
104 | call handle_exception | ||
105 | add %sp, STACKFRAME_SZ, %o0 ! Pass address of registers | ||
106 | |||
107 | /* Load new kgdb register set. */ | ||
108 | LOAD_KGDB_GLOBALS(sp) | ||
109 | LOAD_KGDB_INS(sp) | ||
110 | LOAD_KGDB_SREGS(sp, l4, l0, l3, l5, l1, l2) | ||
111 | wr %l4, 0x0, %y | ||
112 | |||
113 | sethi %hi(in_trap_handler), %l4 | ||
114 | ld [%lo(in_trap_handler) + %l4], %l5 | ||
115 | dec %l5 | ||
116 | st %l5, [%lo(in_trap_handler) + %l4] | ||
117 | |||
118 | add %sp,(16+1+6+1+72)*4,%sp ! Undo the kgdb trap frame. | ||
119 | |||
120 | /* Now take what kgdb did and place it into the pt_regs | ||
121 | * frame which SparcLinux RESTORE_ALL understands., | ||
122 | */ | ||
123 | STORE_PT_INS(sp) | ||
124 | STORE_PT_GLOBALS(sp) | ||
125 | STORE_PT_YREG(sp, g2) | ||
126 | STORE_PT_PRIV(sp, l0, l1, l2) | ||
127 | |||
128 | RESTORE_ALL | ||
129 | #endif | 58 | #endif |
130 | 59 | ||
131 | #if defined(CONFIG_BLK_DEV_FD) || defined(CONFIG_BLK_DEV_FD_MODULE) | 60 | #if defined(CONFIG_BLK_DEV_FD) || defined(CONFIG_BLK_DEV_FD_MODULE) |
132 | .text | ||
133 | .align 4 | 61 | .align 4 |
134 | .globl floppy_hardint | 62 | .globl floppy_hardint |
135 | floppy_hardint: | 63 | floppy_hardint: |
@@ -1596,6 +1524,23 @@ breakpoint_trap: | |||
1596 | 1524 | ||
1597 | RESTORE_ALL | 1525 | RESTORE_ALL |
1598 | 1526 | ||
1527 | #ifdef CONFIG_KGDB | ||
1528 | .align 4 | ||
1529 | .globl kgdb_trap_low | ||
1530 | .type kgdb_trap_low,#function | ||
1531 | kgdb_trap_low: | ||
1532 | rd %wim,%l3 | ||
1533 | SAVE_ALL | ||
1534 | wr %l0, PSR_ET, %psr | ||
1535 | WRITE_PAUSE | ||
1536 | |||
1537 | call kgdb_trap | ||
1538 | add %sp, STACKFRAME_SZ, %o0 | ||
1539 | |||
1540 | RESTORE_ALL | ||
1541 | .size kgdb_trap_low,.-kgdb_trap_low | ||
1542 | #endif | ||
1543 | |||
1599 | .align 4 | 1544 | .align 4 |
1600 | .globl __handle_exception, flush_patch_exception | 1545 | .globl __handle_exception, flush_patch_exception |
1601 | __handle_exception: | 1546 | __handle_exception: |
@@ -1698,4 +1643,22 @@ pcic_nmi_trap_patch: | |||
1698 | 1643 | ||
1699 | #endif /* CONFIG_PCI */ | 1644 | #endif /* CONFIG_PCI */ |
1700 | 1645 | ||
1646 | .globl flushw_all | ||
1647 | flushw_all: | ||
1648 | save %sp, -0x40, %sp | ||
1649 | save %sp, -0x40, %sp | ||
1650 | save %sp, -0x40, %sp | ||
1651 | save %sp, -0x40, %sp | ||
1652 | save %sp, -0x40, %sp | ||
1653 | save %sp, -0x40, %sp | ||
1654 | save %sp, -0x40, %sp | ||
1655 | restore | ||
1656 | restore | ||
1657 | restore | ||
1658 | restore | ||
1659 | restore | ||
1660 | restore | ||
1661 | ret | ||
1662 | restore | ||
1663 | |||
1701 | /* End of entry.S */ | 1664 | /* End of entry.S */ |