aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Howells <dhowells@redhat.com>2006-07-10 07:44:55 -0400
committerLinus Torvalds <torvalds@g5.osdl.org>2006-07-10 16:24:22 -0400
commit84e8cd6dbc00b4979e8d1c15c80d91987aeb3417 (patch)
tree5df8103b5e6d414bc39e165655ae8bd5341abd76
parent6d8c4e3b0150ff537902477ed62f8a8e9e70007b (diff)
[PATCH] FRV: Introduce asm-offsets for FRV arch
Introduce the use of asm-offsets into the FRV architecture. Signed-off-by: David Howells <dhowells@redhat.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
-rw-r--r--arch/frv/kernel/asm-offsets.c116
-rw-r--r--arch/frv/kernel/break.S34
-rw-r--r--arch/frv/kernel/debug-stub.c13
-rw-r--r--arch/frv/kernel/entry.S1
-rw-r--r--arch/frv/kernel/gdb-stub.c159
-rw-r--r--arch/frv/kernel/head.S1
-rw-r--r--arch/frv/kernel/process.c3
-rw-r--r--arch/frv/kernel/switch_to.S3
-rw-r--r--arch/frv/kernel/traps.c25
-rw-r--r--include/asm-frv/gdb-stub.h22
-rw-r--r--include/asm-frv/ptrace.h12
-rw-r--r--include/asm-frv/registers.h97
-rw-r--r--include/asm-frv/thread_info.h24
13 files changed, 313 insertions, 197 deletions
diff --git a/arch/frv/kernel/asm-offsets.c b/arch/frv/kernel/asm-offsets.c
index 9e263112a6e2..fbb19fc1af40 100644
--- a/arch/frv/kernel/asm-offsets.c
+++ b/arch/frv/kernel/asm-offsets.c
@@ -1 +1,115 @@
1/* Dummy asm-offsets.c file. Required by kbuild and ready to be used - hint! */ 1/*
2 * Generate definitions needed by assembly language modules.
3 * This code generates raw asm output which is post-processed
4 * to extract and format the required data.
5 */
6
7#include <linux/sched.h>
8#include <linux/signal.h>
9#include <linux/personality.h>
10#include <asm/registers.h>
11#include <asm/ucontext.h>
12#include <asm/processor.h>
13#include <asm/thread_info.h>
14#include <asm/gdb-stub.h>
15
16#define DEFINE(sym, val) \
17 asm volatile("\n->" #sym " %0 " #val : : "i" (val))
18
19#define DEF_PTREG(sym, reg) \
20 asm volatile("\n->" #sym " %0 offsetof(struct pt_regs, " #reg ")" \
21 : : "i" (offsetof(struct pt_regs, reg)))
22
23#define DEF_IREG(sym, reg) \
24 asm volatile("\n->" #sym " %0 offsetof(struct user_context, " #reg ")" \
25 : : "i" (offsetof(struct user_context, reg)))
26
27#define DEF_FREG(sym, reg) \
28 asm volatile("\n->" #sym " %0 offsetof(struct user_context, " #reg ")" \
29 : : "i" (offsetof(struct user_context, reg)))
30
31#define DEF_0REG(sym, reg) \
32 asm volatile("\n->" #sym " %0 offsetof(struct frv_frame0, " #reg ")" \
33 : : "i" (offsetof(struct frv_frame0, reg)))
34
35#define BLANK() asm volatile("\n->" : : )
36
37#define OFFSET(sym, str, mem) \
38 DEFINE(sym, offsetof(struct str, mem));
39
40void foo(void)
41{
42 /* offsets into the thread_info structure */
43 OFFSET(TI_TASK, thread_info, task);
44 OFFSET(TI_EXEC_DOMAIN, thread_info, exec_domain);
45 OFFSET(TI_FLAGS, thread_info, flags);
46 OFFSET(TI_STATUS, thread_info, status);
47 OFFSET(TI_CPU, thread_info, cpu);
48 OFFSET(TI_PREEMPT_COUNT, thread_info, preempt_count);
49 OFFSET(TI_ADDR_LIMIT, thread_info, addr_limit);
50 OFFSET(TI_RESTART_BLOCK, thread_info, restart_block);
51 BLANK();
52
53 /* offsets into register file storage */
54 DEF_PTREG(REG_PSR, psr);
55 DEF_PTREG(REG_ISR, isr);
56 DEF_PTREG(REG_CCR, ccr);
57 DEF_PTREG(REG_CCCR, cccr);
58 DEF_PTREG(REG_LR, lr);
59 DEF_PTREG(REG_LCR, lcr);
60 DEF_PTREG(REG_PC, pc);
61 DEF_PTREG(REG__STATUS, __status);
62 DEF_PTREG(REG_SYSCALLNO, syscallno);
63 DEF_PTREG(REG_ORIG_GR8, orig_gr8);
64 DEF_PTREG(REG_GNER0, gner0);
65 DEF_PTREG(REG_GNER1, gner1);
66 DEF_PTREG(REG_IACC0, iacc0);
67 DEF_PTREG(REG_TBR, tbr);
68 DEF_PTREG(REG_GR0, tbr);
69 DEFINE(REG__END, sizeof(struct pt_regs));
70 BLANK();
71
72 DEF_0REG(REG_DCR, debug.dcr);
73 DEF_0REG(REG_IBAR0, debug.ibar[0]);
74 DEF_0REG(REG_DBAR0, debug.dbar[0]);
75 DEF_0REG(REG_DBDR00, debug.dbdr[0][0]);
76 DEF_0REG(REG_DBMR00, debug.dbmr[0][0]);
77 BLANK();
78
79 DEF_IREG(__INT_GR0, i.gr[0]);
80 DEF_FREG(__USER_FPMEDIA, f);
81 DEF_FREG(__FPMEDIA_FR0, f.fr[0]);
82 DEF_FREG(__FPMEDIA_FNER0, f.fner[0]);
83 DEF_FREG(__FPMEDIA_MSR0, f.msr[0]);
84 DEF_FREG(__FPMEDIA_ACC0, f.acc[0]);
85 DEF_FREG(__FPMEDIA_ACCG0, f.accg[0]);
86 DEF_FREG(__FPMEDIA_FSR0, f.fsr[0]);
87 BLANK();
88
89 DEFINE(NR_PT_REGS, sizeof(struct pt_regs) / 4);
90 DEFINE(NR_USER_INT_REGS, sizeof(struct user_int_regs) / 4);
91 DEFINE(NR_USER_FPMEDIA_REGS, sizeof(struct user_fpmedia_regs) / 4);
92 DEFINE(NR_USER_CONTEXT, sizeof(struct user_context) / 4);
93 DEFINE(FRV_FRAME0_SIZE, sizeof(struct frv_frame0));
94 BLANK();
95
96 /* offsets into thread_struct */
97 OFFSET(__THREAD_FRAME, thread_struct, frame);
98 OFFSET(__THREAD_CURR, thread_struct, curr);
99 OFFSET(__THREAD_SP, thread_struct, sp);
100 OFFSET(__THREAD_FP, thread_struct, fp);
101 OFFSET(__THREAD_LR, thread_struct, lr);
102 OFFSET(__THREAD_PC, thread_struct, pc);
103 OFFSET(__THREAD_GR16, thread_struct, gr[0]);
104 OFFSET(__THREAD_SCHED_LR, thread_struct, sched_lr);
105 OFFSET(__THREAD_FRAME0, thread_struct, frame0);
106 OFFSET(__THREAD_USER, thread_struct, user);
107 BLANK();
108
109 /* offsets into frv_debug_status */
110 OFFSET(DEBUG_BPSR, frv_debug_status, bpsr);
111 OFFSET(DEBUG_DCR, frv_debug_status, dcr);
112 OFFSET(DEBUG_BRR, frv_debug_status, brr);
113 OFFSET(DEBUG_NMAR, frv_debug_status, nmar);
114 BLANK();
115}
diff --git a/arch/frv/kernel/break.S b/arch/frv/kernel/break.S
index ea161f0ca427..dac4a5f68c2e 100644
--- a/arch/frv/kernel/break.S
+++ b/arch/frv/kernel/break.S
@@ -9,11 +9,11 @@
9 * 2 of the License, or (at your option) any later version. 9 * 2 of the License, or (at your option) any later version.
10 */ 10 */
11 11
12#include <linux/sys.h>
13#include <linux/linkage.h> 12#include <linux/linkage.h>
14#include <asm/setup.h> 13#include <asm/setup.h>
15#include <asm/segment.h> 14#include <asm/segment.h>
16#include <asm/ptrace.h> 15#include <asm/ptrace.h>
16#include <asm/thread_info.h>
17#include <asm/spr-regs.h> 17#include <asm/spr-regs.h>
18 18
19#include <asm/errno.h> 19#include <asm/errno.h>
@@ -23,13 +23,11 @@
23# 23#
24 .section .bss.stack 24 .section .bss.stack
25 .globl __break_user_context 25 .globl __break_user_context
26 .balign 8192 26 .balign THREAD_SIZE
27__break_stack: 27__break_stack:
28 .space (8192 - (USER_CONTEXT_SIZE + REG__DEBUG_XTRA)) & ~7 28 .space THREAD_SIZE - FRV_FRAME0_SIZE
29__break_stack_tos: 29__break_frame_0:
30 .space REG__DEBUG_XTRA 30 .space FRV_FRAME0_SIZE
31__break_user_context:
32 .space USER_CONTEXT_SIZE
33 31
34# 32#
35# miscellaneous variables 33# miscellaneous variables
@@ -74,8 +72,8 @@ __entry_break:
74#endif 72#endif
75 LEDS 0x1001,gr31 73 LEDS 0x1001,gr31
76 74
77 sethi.p %hi(__break_user_context),gr31 75 sethi.p %hi(__break_frame_0),gr31
78 setlo %lo(__break_user_context),gr31 76 setlo %lo(__break_frame_0),gr31
79 77
80 stdi gr2,@(gr31,#REG_GR(2)) 78 stdi gr2,@(gr31,#REG_GR(2))
81 movsg ccr,gr3 79 movsg ccr,gr3
@@ -585,8 +583,8 @@ __break_continue:
585 # set up the kernel stack pointer 583 # set up the kernel stack pointer
586 sti sp,@(gr31,#REG_SP) 584 sti sp,@(gr31,#REG_SP)
587 585
588 sethi.p %hi(__break_stack_tos),sp 586 sethi.p %hi(__break_frame_0),sp
589 setlo %lo(__break_stack_tos),sp 587 setlo %lo(__break_frame_0),sp
590 588
591 # finish building the exception frame 589 # finish building the exception frame
592 stdi gr4 ,@(gr31,#REG_GR(4)) 590 stdi gr4 ,@(gr31,#REG_GR(4))
@@ -651,9 +649,12 @@ __break_continue:
651 movsg nmar,gr5 649 movsg nmar,gr5
652 movsg dcr,gr6 650 movsg dcr,gr6
653 651
654 stdi gr4 ,@(gr31,#REG_BRR) 652 sethi.p %hi(__debug_status),gr7
655 sti gr19,@(gr31,#REG_BPSR) 653 setlo %lo(__debug_status),gr7
656 sti.p gr6 ,@(gr31,#REG_DCR) 654
655 stdi gr4 ,@(gr7,#DEBUG_BRR)
656 sti gr19,@(gr7,#DEBUG_BPSR)
657 sti.p gr6 ,@(gr7,#DEBUG_DCR)
657 658
658 # trap exceptions during break handling and disable h/w breakpoints/watchpoints 659 # trap exceptions during break handling and disable h/w breakpoints/watchpoints
659 sethi %hi(DCR_EBE),gr5 660 sethi %hi(DCR_EBE),gr5
@@ -698,7 +699,10 @@ __break_continue:
698 lddi @(gr31,#REG_PSR) ,gr22 699 lddi @(gr31,#REG_PSR) ,gr22
699 ldi @(gr31,#REG_PC) ,gr21 700 ldi @(gr31,#REG_PC) ,gr21
700 ldi @(gr31,#REG_TBR) ,gr20 701 ldi @(gr31,#REG_TBR) ,gr20
701 ldi.p @(gr31,#REG_DCR) ,gr6 702
703 sethi.p %hi(__debug_status),gr6
704 setlo %lo(__debug_status),gr6
705 ldi.p @(gr6,#DEBUG_DCR) ,gr6
702 706
703 andi gr22,#PSR_S,gr19 /* rebuild BPSR */ 707 andi gr22,#PSR_S,gr19 /* rebuild BPSR */
704 andi.p gr22,#PSR_ET,gr5 708 andi.p gr22,#PSR_ET,gr5
diff --git a/arch/frv/kernel/debug-stub.c b/arch/frv/kernel/debug-stub.c
index 4761cc4b4a90..2f6c60c921e0 100644
--- a/arch/frv/kernel/debug-stub.c
+++ b/arch/frv/kernel/debug-stub.c
@@ -39,10 +39,9 @@ do { \
39 gdbstub_do_rx(); \ 39 gdbstub_do_rx(); \
40} while(!FLOWCTL_QUERY(LINE)) 40} while(!FLOWCTL_QUERY(LINE))
41 41
42static void __init debug_stub_init(void); 42struct frv_debug_status __debug_status;
43 43
44extern asmlinkage void __break_hijack_kernel_event(void); 44static void __init debug_stub_init(void);
45extern asmlinkage void __break_hijack_kernel_event_breaks_here(void);
46 45
47/*****************************************************************************/ 46/*****************************************************************************/
48/* 47/*
@@ -67,7 +66,7 @@ asmlinkage void debug_stub(void)
67 __set_HSR(0, hsr0 & ~HSR0_ETMD); 66 __set_HSR(0, hsr0 & ~HSR0_ETMD);
68 67
69 /* disable single stepping */ 68 /* disable single stepping */
70 __debug_regs->dcr &= ~DCR_SE; 69 __debug_status.dcr &= ~DCR_SE;
71 70
72 /* kernel mode can propose an exception be handled in debug mode by jumping to a special 71 /* kernel mode can propose an exception be handled in debug mode by jumping to a special
73 * location */ 72 * location */
@@ -76,8 +75,8 @@ asmlinkage void debug_stub(void)
76 * the top kernel context */ 75 * the top kernel context */
77 *__debug_frame = *__frame; 76 *__debug_frame = *__frame;
78 __frame = __debug_frame->next_frame; 77 __frame = __debug_frame->next_frame;
79 __debug_regs->brr = (__debug_frame->tbr & TBR_TT) << 12; 78 __debug_status.brr = (__debug_frame->tbr & TBR_TT) << 12;
80 __debug_regs->brr |= BRR_EB; 79 __debug_status.brr |= BRR_EB;
81 } 80 }
82 81
83 if (__debug_frame->pc == (unsigned long) __debug_bug_trap + 4) { 82 if (__debug_frame->pc == (unsigned long) __debug_bug_trap + 4) {
@@ -124,7 +123,7 @@ static void __init debug_stub_init(void)
124 __debug_frame->pc = (unsigned long) start_kernel; 123 __debug_frame->pc = (unsigned long) start_kernel;
125 124
126 /* enable the debug events we want to trap */ 125 /* enable the debug events we want to trap */
127 __debug_regs->dcr = DCR_EBE; 126 __debug_status.dcr = DCR_EBE;
128 127
129#ifdef CONFIG_GDBSTUB 128#ifdef CONFIG_GDBSTUB
130 gdbstub_init(); 129 gdbstub_init();
diff --git a/arch/frv/kernel/entry.S b/arch/frv/kernel/entry.S
index 2a1ff1ff8692..940ac306e9a0 100644
--- a/arch/frv/kernel/entry.S
+++ b/arch/frv/kernel/entry.S
@@ -27,7 +27,6 @@
27 * 27 *
28 */ 28 */
29 29
30#include <linux/sys.h>
31#include <linux/linkage.h> 30#include <linux/linkage.h>
32#include <asm/thread_info.h> 31#include <asm/thread_info.h>
33#include <asm/setup.h> 32#include <asm/setup.h>
diff --git a/arch/frv/kernel/gdb-stub.c b/arch/frv/kernel/gdb-stub.c
index 508601fad079..9550f37fb62c 100644
--- a/arch/frv/kernel/gdb-stub.c
+++ b/arch/frv/kernel/gdb-stub.c
@@ -124,6 +124,7 @@
124#include <linux/slab.h> 124#include <linux/slab.h>
125#include <linux/nmi.h> 125#include <linux/nmi.h>
126 126
127#include <asm/asm-offsets.h>
127#include <asm/pgtable.h> 128#include <asm/pgtable.h>
128#include <asm/system.h> 129#include <asm/system.h>
129#include <asm/gdb-stub.h> 130#include <asm/gdb-stub.h>
@@ -136,7 +137,6 @@ extern void debug_to_serial(const char *p, int n);
136extern void gdbstub_console_write(struct console *co, const char *p, unsigned n); 137extern void gdbstub_console_write(struct console *co, const char *p, unsigned n);
137 138
138extern volatile uint32_t __break_error_detect[3]; /* ESFR1, ESR15, EAR15 */ 139extern volatile uint32_t __break_error_detect[3]; /* ESFR1, ESR15, EAR15 */
139extern struct user_context __break_user_context;
140 140
141struct __debug_amr { 141struct __debug_amr {
142 unsigned long L, P; 142 unsigned long L, P;
@@ -926,6 +926,7 @@ static int gdbstub_set_breakpoint(unsigned long type, unsigned long addr, unsign
926 if (!(__debug_regs->dcr & DCR_IBE0)) { 926 if (!(__debug_regs->dcr & DCR_IBE0)) {
927 //gdbstub_printk("set h/w break 0: %08lx\n", addr); 927 //gdbstub_printk("set h/w break 0: %08lx\n", addr);
928 __debug_regs->dcr |= DCR_IBE0; 928 __debug_regs->dcr |= DCR_IBE0;
929 __debug_regs->ibar[0] = addr;
929 asm volatile("movgs %0,ibar0" : : "r"(addr)); 930 asm volatile("movgs %0,ibar0" : : "r"(addr));
930 return 0; 931 return 0;
931 } 932 }
@@ -933,6 +934,7 @@ static int gdbstub_set_breakpoint(unsigned long type, unsigned long addr, unsign
933 if (!(__debug_regs->dcr & DCR_IBE1)) { 934 if (!(__debug_regs->dcr & DCR_IBE1)) {
934 //gdbstub_printk("set h/w break 1: %08lx\n", addr); 935 //gdbstub_printk("set h/w break 1: %08lx\n", addr);
935 __debug_regs->dcr |= DCR_IBE1; 936 __debug_regs->dcr |= DCR_IBE1;
937 __debug_regs->ibar[1] = addr;
936 asm volatile("movgs %0,ibar1" : : "r"(addr)); 938 asm volatile("movgs %0,ibar1" : : "r"(addr));
937 return 0; 939 return 0;
938 } 940 }
@@ -940,6 +942,7 @@ static int gdbstub_set_breakpoint(unsigned long type, unsigned long addr, unsign
940 if (!(__debug_regs->dcr & DCR_IBE2)) { 942 if (!(__debug_regs->dcr & DCR_IBE2)) {
941 //gdbstub_printk("set h/w break 2: %08lx\n", addr); 943 //gdbstub_printk("set h/w break 2: %08lx\n", addr);
942 __debug_regs->dcr |= DCR_IBE2; 944 __debug_regs->dcr |= DCR_IBE2;
945 __debug_regs->ibar[2] = addr;
943 asm volatile("movgs %0,ibar2" : : "r"(addr)); 946 asm volatile("movgs %0,ibar2" : : "r"(addr));
944 return 0; 947 return 0;
945 } 948 }
@@ -947,6 +950,7 @@ static int gdbstub_set_breakpoint(unsigned long type, unsigned long addr, unsign
947 if (!(__debug_regs->dcr & DCR_IBE3)) { 950 if (!(__debug_regs->dcr & DCR_IBE3)) {
948 //gdbstub_printk("set h/w break 3: %08lx\n", addr); 951 //gdbstub_printk("set h/w break 3: %08lx\n", addr);
949 __debug_regs->dcr |= DCR_IBE3; 952 __debug_regs->dcr |= DCR_IBE3;
953 __debug_regs->ibar[3] = addr;
950 asm volatile("movgs %0,ibar3" : : "r"(addr)); 954 asm volatile("movgs %0,ibar3" : : "r"(addr));
951 return 0; 955 return 0;
952 } 956 }
@@ -971,7 +975,14 @@ static int gdbstub_set_breakpoint(unsigned long type, unsigned long addr, unsign
971 if (!(__debug_regs->dcr & (DCR_DRBE0|DCR_DWBE0))) { 975 if (!(__debug_regs->dcr & (DCR_DRBE0|DCR_DWBE0))) {
972 //gdbstub_printk("set h/w watchpoint 0 type %ld: %08lx\n", type, addr); 976 //gdbstub_printk("set h/w watchpoint 0 type %ld: %08lx\n", type, addr);
973 tmp = type==2 ? DCR_DWBE0 : type==3 ? DCR_DRBE0 : DCR_DRBE0|DCR_DWBE0; 977 tmp = type==2 ? DCR_DWBE0 : type==3 ? DCR_DRBE0 : DCR_DRBE0|DCR_DWBE0;
978
974 __debug_regs->dcr |= tmp; 979 __debug_regs->dcr |= tmp;
980 __debug_regs->dbar[0] = addr;
981 __debug_regs->dbmr[0][0] = dbmr.mask0;
982 __debug_regs->dbmr[0][1] = dbmr.mask1;
983 __debug_regs->dbdr[0][0] = 0;
984 __debug_regs->dbdr[0][1] = 0;
985
975 asm volatile(" movgs %0,dbar0 \n" 986 asm volatile(" movgs %0,dbar0 \n"
976 " movgs %1,dbmr00 \n" 987 " movgs %1,dbmr00 \n"
977 " movgs %2,dbmr01 \n" 988 " movgs %2,dbmr01 \n"
@@ -984,7 +995,14 @@ static int gdbstub_set_breakpoint(unsigned long type, unsigned long addr, unsign
984 if (!(__debug_regs->dcr & (DCR_DRBE1|DCR_DWBE1))) { 995 if (!(__debug_regs->dcr & (DCR_DRBE1|DCR_DWBE1))) {
985 //gdbstub_printk("set h/w watchpoint 1 type %ld: %08lx\n", type, addr); 996 //gdbstub_printk("set h/w watchpoint 1 type %ld: %08lx\n", type, addr);
986 tmp = type==2 ? DCR_DWBE1 : type==3 ? DCR_DRBE1 : DCR_DRBE1|DCR_DWBE1; 997 tmp = type==2 ? DCR_DWBE1 : type==3 ? DCR_DRBE1 : DCR_DRBE1|DCR_DWBE1;
998
987 __debug_regs->dcr |= tmp; 999 __debug_regs->dcr |= tmp;
1000 __debug_regs->dbar[1] = addr;
1001 __debug_regs->dbmr[1][0] = dbmr.mask0;
1002 __debug_regs->dbmr[1][1] = dbmr.mask1;
1003 __debug_regs->dbdr[1][0] = 0;
1004 __debug_regs->dbdr[1][1] = 0;
1005
988 asm volatile(" movgs %0,dbar1 \n" 1006 asm volatile(" movgs %0,dbar1 \n"
989 " movgs %1,dbmr10 \n" 1007 " movgs %1,dbmr10 \n"
990 " movgs %2,dbmr11 \n" 1008 " movgs %2,dbmr11 \n"
@@ -1047,6 +1065,7 @@ int gdbstub_clear_breakpoint(unsigned long type, unsigned long addr, unsigned lo
1047 if (__debug_regs->dcr & DCR_IBE0 && __get_ibar(0) == addr) { 1065 if (__debug_regs->dcr & DCR_IBE0 && __get_ibar(0) == addr) {
1048 //gdbstub_printk("clear h/w break 0: %08lx\n", addr); 1066 //gdbstub_printk("clear h/w break 0: %08lx\n", addr);
1049 __debug_regs->dcr &= ~DCR_IBE0; 1067 __debug_regs->dcr &= ~DCR_IBE0;
1068 __debug_regs->ibar[0] = 0;
1050 asm volatile("movgs gr0,ibar0"); 1069 asm volatile("movgs gr0,ibar0");
1051 return 0; 1070 return 0;
1052 } 1071 }
@@ -1054,6 +1073,7 @@ int gdbstub_clear_breakpoint(unsigned long type, unsigned long addr, unsigned lo
1054 if (__debug_regs->dcr & DCR_IBE1 && __get_ibar(1) == addr) { 1073 if (__debug_regs->dcr & DCR_IBE1 && __get_ibar(1) == addr) {
1055 //gdbstub_printk("clear h/w break 1: %08lx\n", addr); 1074 //gdbstub_printk("clear h/w break 1: %08lx\n", addr);
1056 __debug_regs->dcr &= ~DCR_IBE1; 1075 __debug_regs->dcr &= ~DCR_IBE1;
1076 __debug_regs->ibar[1] = 0;
1057 asm volatile("movgs gr0,ibar1"); 1077 asm volatile("movgs gr0,ibar1");
1058 return 0; 1078 return 0;
1059 } 1079 }
@@ -1061,6 +1081,7 @@ int gdbstub_clear_breakpoint(unsigned long type, unsigned long addr, unsigned lo
1061 if (__debug_regs->dcr & DCR_IBE2 && __get_ibar(2) == addr) { 1081 if (__debug_regs->dcr & DCR_IBE2 && __get_ibar(2) == addr) {
1062 //gdbstub_printk("clear h/w break 2: %08lx\n", addr); 1082 //gdbstub_printk("clear h/w break 2: %08lx\n", addr);
1063 __debug_regs->dcr &= ~DCR_IBE2; 1083 __debug_regs->dcr &= ~DCR_IBE2;
1084 __debug_regs->ibar[2] = 0;
1064 asm volatile("movgs gr0,ibar2"); 1085 asm volatile("movgs gr0,ibar2");
1065 return 0; 1086 return 0;
1066 } 1087 }
@@ -1068,6 +1089,7 @@ int gdbstub_clear_breakpoint(unsigned long type, unsigned long addr, unsigned lo
1068 if (__debug_regs->dcr & DCR_IBE3 && __get_ibar(3) == addr) { 1089 if (__debug_regs->dcr & DCR_IBE3 && __get_ibar(3) == addr) {
1069 //gdbstub_printk("clear h/w break 3: %08lx\n", addr); 1090 //gdbstub_printk("clear h/w break 3: %08lx\n", addr);
1070 __debug_regs->dcr &= ~DCR_IBE3; 1091 __debug_regs->dcr &= ~DCR_IBE3;
1092 __debug_regs->ibar[3] = 0;
1071 asm volatile("movgs gr0,ibar3"); 1093 asm volatile("movgs gr0,ibar3");
1072 return 0; 1094 return 0;
1073 } 1095 }
@@ -1104,6 +1126,12 @@ int gdbstub_clear_breakpoint(unsigned long type, unsigned long addr, unsigned lo
1104 1126
1105 //gdbstub_printk("clear h/w watchpoint 0 type %ld: %08lx\n", type, addr); 1127 //gdbstub_printk("clear h/w watchpoint 0 type %ld: %08lx\n", type, addr);
1106 __debug_regs->dcr &= ~(DCR_DRBE0|DCR_DWBE0); 1128 __debug_regs->dcr &= ~(DCR_DRBE0|DCR_DWBE0);
1129 __debug_regs->dbar[0] = 0;
1130 __debug_regs->dbmr[0][0] = 0;
1131 __debug_regs->dbmr[0][1] = 0;
1132 __debug_regs->dbdr[0][0] = 0;
1133 __debug_regs->dbdr[0][1] = 0;
1134
1107 asm volatile(" movgs gr0,dbar0 \n" 1135 asm volatile(" movgs gr0,dbar0 \n"
1108 " movgs gr0,dbmr00 \n" 1136 " movgs gr0,dbmr00 \n"
1109 " movgs gr0,dbmr01 \n" 1137 " movgs gr0,dbmr01 \n"
@@ -1123,6 +1151,12 @@ int gdbstub_clear_breakpoint(unsigned long type, unsigned long addr, unsigned lo
1123 1151
1124 //gdbstub_printk("clear h/w watchpoint 1 type %ld: %08lx\n", type, addr); 1152 //gdbstub_printk("clear h/w watchpoint 1 type %ld: %08lx\n", type, addr);
1125 __debug_regs->dcr &= ~(DCR_DRBE1|DCR_DWBE1); 1153 __debug_regs->dcr &= ~(DCR_DRBE1|DCR_DWBE1);
1154 __debug_regs->dbar[1] = 0;
1155 __debug_regs->dbmr[1][0] = 0;
1156 __debug_regs->dbmr[1][1] = 0;
1157 __debug_regs->dbdr[1][0] = 0;
1158 __debug_regs->dbdr[1][1] = 0;
1159
1126 asm volatile(" movgs gr0,dbar1 \n" 1160 asm volatile(" movgs gr0,dbar1 \n"
1127 " movgs gr0,dbmr10 \n" 1161 " movgs gr0,dbmr10 \n"
1128 " movgs gr0,dbmr11 \n" 1162 " movgs gr0,dbmr11 \n"
@@ -1163,7 +1197,7 @@ static void gdbstub_check_breakpoint(void)
1163 */ 1197 */
1164static void __attribute__((unused)) gdbstub_show_regs(void) 1198static void __attribute__((unused)) gdbstub_show_regs(void)
1165{ 1199{
1166 uint32_t *reg; 1200 unsigned long *reg;
1167 int loop; 1201 int loop;
1168 1202
1169 gdbstub_printk("\n"); 1203 gdbstub_printk("\n");
@@ -1172,11 +1206,11 @@ static void __attribute__((unused)) gdbstub_show_regs(void)
1172 __debug_frame, 1206 __debug_frame,
1173 __debug_frame->psr & PSR_S ? "kernel" : "user"); 1207 __debug_frame->psr & PSR_S ? "kernel" : "user");
1174 1208
1175 reg = (uint32_t *) __debug_frame; 1209 reg = (unsigned long *) __debug_frame;
1176 for (loop = 0; loop < REG__END; loop++) { 1210 for (loop = 0; loop < NR_PT_REGS; loop++) {
1177 printk("%s %08x", regnames[loop + 0], reg[loop + 0]); 1211 printk("%s %08lx", regnames[loop + 0], reg[loop + 0]);
1178 1212
1179 if (loop == REG__END - 1 || loop % 5 == 4) 1213 if (loop == NR_PT_REGS - 1 || loop % 5 == 4)
1180 printk("\n"); 1214 printk("\n");
1181 else 1215 else
1182 printk(" | "); 1216 printk(" | ");
@@ -1191,13 +1225,8 @@ static void __attribute__((unused)) gdbstub_show_regs(void)
1191 */ 1225 */
1192static void __attribute__((unused)) gdbstub_dump_debugregs(void) 1226static void __attribute__((unused)) gdbstub_dump_debugregs(void)
1193{ 1227{
1194 unsigned long x; 1228 gdbstub_printk("DCR %08lx ", __debug_status.dcr);
1195 1229 gdbstub_printk("BRR %08lx\n", __debug_status.brr);
1196 x = __debug_regs->dcr;
1197 gdbstub_printk("DCR %08lx ", x);
1198
1199 x = __debug_regs->brr;
1200 gdbstub_printk("BRR %08lx\n", x);
1201 1230
1202 gdbstub_printk("IBAR0 %08lx ", __get_ibar(0)); 1231 gdbstub_printk("IBAR0 %08lx ", __get_ibar(0));
1203 gdbstub_printk("IBAR1 %08lx ", __get_ibar(1)); 1232 gdbstub_printk("IBAR1 %08lx ", __get_ibar(1));
@@ -1360,7 +1389,7 @@ void gdbstub(int sigval)
1360#endif 1389#endif
1361 } 1390 }
1362 1391
1363 save_user_regs(&__break_user_context); 1392 save_user_regs(&__debug_frame0->uc);
1364 1393
1365#if 0 1394#if 0
1366 gdbstub_printk("--> gdbstub() %08x %p %08x %08x\n", 1395 gdbstub_printk("--> gdbstub() %08x %p %08x %08x\n",
@@ -1389,8 +1418,8 @@ void gdbstub(int sigval)
1389 __debug_frame->psr &= ~PSR_S; 1418 __debug_frame->psr &= ~PSR_S;
1390 if (__debug_frame->psr & PSR_PS) 1419 if (__debug_frame->psr & PSR_PS)
1391 __debug_frame->psr |= PSR_S; 1420 __debug_frame->psr |= PSR_S;
1392 __debug_regs->brr = (__debug_frame->tbr & TBR_TT) << 12; 1421 __debug_status.brr = (__debug_frame->tbr & TBR_TT) << 12;
1393 __debug_regs->brr |= BRR_EB; 1422 __debug_status.brr |= BRR_EB;
1394 sigval = SIGINT; 1423 sigval = SIGINT;
1395 } 1424 }
1396 1425
@@ -1404,15 +1433,15 @@ void gdbstub(int sigval)
1404 __debug_frame->psr &= ~PSR_S; 1433 __debug_frame->psr &= ~PSR_S;
1405 if (__debug_frame->psr & PSR_PS) 1434 if (__debug_frame->psr & PSR_PS)
1406 __debug_frame->psr |= PSR_S; 1435 __debug_frame->psr |= PSR_S;
1407 __debug_regs->brr = (__debug_frame->tbr & TBR_TT) << 12; 1436 __debug_status.brr = (__debug_frame->tbr & TBR_TT) << 12;
1408 __debug_regs->brr |= BRR_EB; 1437 __debug_status.brr |= BRR_EB;
1409 sigval = SIGXCPU; 1438 sigval = SIGXCPU;
1410 } 1439 }
1411 1440
1412 LEDS(0x5002); 1441 LEDS(0x5002);
1413 1442
1414 /* after a BREAK insn, the PC lands on the far side of it */ 1443 /* after a BREAK insn, the PC lands on the far side of it */
1415 if (__debug_regs->brr & BRR_SB) 1444 if (__debug_status.brr & BRR_SB)
1416 gdbstub_check_breakpoint(); 1445 gdbstub_check_breakpoint();
1417 1446
1418 LEDS(0x5003); 1447 LEDS(0x5003);
@@ -1431,7 +1460,7 @@ void gdbstub(int sigval)
1431 } 1460 }
1432 1461
1433 if (!sigval) 1462 if (!sigval)
1434 sigval = gdbstub_compute_signal(__debug_regs->brr); 1463 sigval = gdbstub_compute_signal(__debug_status.brr);
1435 1464
1436 LEDS(0x5004); 1465 LEDS(0x5004);
1437 1466
@@ -1441,7 +1470,7 @@ void gdbstub(int sigval)
1441 if (sigval != SIGINT && sigval != SIGTRAP && sigval != SIGILL) { 1470 if (sigval != SIGINT && sigval != SIGTRAP && sigval != SIGILL) {
1442 static const char title[] = "Break "; 1471 static const char title[] = "Break ";
1443 static const char crlf[] = "\r\n"; 1472 static const char crlf[] = "\r\n";
1444 unsigned long brr = __debug_regs->brr; 1473 unsigned long brr = __debug_status.brr;
1445 char hx; 1474 char hx;
1446 1475
1447 ptr = output_buffer; 1476 ptr = output_buffer;
@@ -1565,28 +1594,24 @@ void gdbstub(int sigval)
1565 ptr = mem2hex(&zero, ptr, 4, 0); 1594 ptr = mem2hex(&zero, ptr, 4, 0);
1566 1595
1567 for (loop = 1; loop <= 27; loop++) 1596 for (loop = 1; loop <= 27; loop++)
1568 ptr = mem2hex((unsigned long *)__debug_frame + REG_GR(loop), 1597 ptr = mem2hex(&__debug_user_context->i.gr[loop], ptr, 4, 0);
1569 ptr, 4, 0);
1570 temp = (unsigned long) __frame; 1598 temp = (unsigned long) __frame;
1571 ptr = mem2hex(&temp, ptr, 4, 0); 1599 ptr = mem2hex(&temp, ptr, 4, 0);
1572 ptr = mem2hex((unsigned long *)__debug_frame + REG_GR(29), ptr, 4, 0); 1600 ptr = mem2hex(&__debug_user_context->i.gr[29], ptr, 4, 0);
1573 ptr = mem2hex((unsigned long *)__debug_frame + REG_GR(30), ptr, 4, 0); 1601 ptr = mem2hex(&__debug_user_context->i.gr[30], ptr, 4, 0);
1574#ifdef CONFIG_MMU 1602#ifdef CONFIG_MMU
1575 ptr = mem2hex((unsigned long *)__debug_frame + REG_GR(31), ptr, 4, 0); 1603 ptr = mem2hex(&__debug_user_context->i.gr[31], ptr, 4, 0);
1576#else 1604#else
1577 temp = (unsigned long) __debug_frame; 1605 temp = (unsigned long) __debug_frame;
1578 ptr = mem2hex(&temp, ptr, 4, 0); 1606 ptr = mem2hex(&temp, ptr, 4, 0);
1579#endif 1607#endif
1580 1608
1581 for (loop = 32; loop <= 63; loop++) 1609 for (loop = 32; loop <= 63; loop++)
1582 ptr = mem2hex((unsigned long *)__debug_frame + REG_GR(loop), 1610 ptr = mem2hex(&__debug_user_context->i.gr[loop], ptr, 4, 0);
1583 ptr, 4, 0);
1584 1611
1585 /* deal with FR0-FR63 */ 1612 /* deal with FR0-FR63 */
1586 for (loop = 0; loop <= 63; loop++) 1613 for (loop = 0; loop <= 63; loop++)
1587 ptr = mem2hex((unsigned long *)&__break_user_context + 1614 ptr = mem2hex(&__debug_user_context->f.fr[loop], ptr, 4, 0);
1588 __FPMEDIA_FR(loop),
1589 ptr, 4, 0);
1590 1615
1591 /* deal with special registers */ 1616 /* deal with special registers */
1592 ptr = mem2hex(&__debug_frame->pc, ptr, 4, 0); 1617 ptr = mem2hex(&__debug_frame->pc, ptr, 4, 0);
@@ -1597,7 +1622,7 @@ void gdbstub(int sigval)
1597 ptr = mem2hex(&zero, ptr, 4, 0); 1622 ptr = mem2hex(&zero, ptr, 4, 0);
1598 ptr = mem2hex(&zero, ptr, 4, 0); 1623 ptr = mem2hex(&zero, ptr, 4, 0);
1599 ptr = mem2hex(&__debug_frame->tbr, ptr, 4, 0); 1624 ptr = mem2hex(&__debug_frame->tbr, ptr, 4, 0);
1600 ptr = mem2hex(&__debug_regs->brr , ptr, 4, 0); 1625 ptr = mem2hex(&__debug_status.brr , ptr, 4, 0);
1601 1626
1602 asm volatile("movsg dbar0,%0" : "=r"(dbar)); 1627 asm volatile("movsg dbar0,%0" : "=r"(dbar));
1603 ptr = mem2hex(&dbar, ptr, 4, 0); 1628 ptr = mem2hex(&dbar, ptr, 4, 0);
@@ -1622,21 +1647,21 @@ void gdbstub(int sigval)
1622 1647
1623 ptr = mem2hex(&__debug_frame->iacc0, ptr, 8, 0); 1648 ptr = mem2hex(&__debug_frame->iacc0, ptr, 8, 0);
1624 1649
1625 ptr = mem2hex(&__break_user_context.f.fsr[0], ptr, 4, 0); 1650 ptr = mem2hex(&__debug_user_context->f.fsr[0], ptr, 4, 0);
1626 1651
1627 for (loop = 0; loop <= 7; loop++) 1652 for (loop = 0; loop <= 7; loop++)
1628 ptr = mem2hex(&__break_user_context.f.acc[loop], ptr, 4, 0); 1653 ptr = mem2hex(&__debug_user_context->f.acc[loop], ptr, 4, 0);
1629 1654
1630 ptr = mem2hex(&__break_user_context.f.accg, ptr, 8, 0); 1655 ptr = mem2hex(&__debug_user_context->f.accg, ptr, 8, 0);
1631 1656
1632 for (loop = 0; loop <= 1; loop++) 1657 for (loop = 0; loop <= 1; loop++)
1633 ptr = mem2hex(&__break_user_context.f.msr[loop], ptr, 4, 0); 1658 ptr = mem2hex(&__debug_user_context->f.msr[loop], ptr, 4, 0);
1634 1659
1635 ptr = mem2hex(&__debug_frame->gner0, ptr, 4, 0); 1660 ptr = mem2hex(&__debug_frame->gner0, ptr, 4, 0);
1636 ptr = mem2hex(&__debug_frame->gner1, ptr, 4, 0); 1661 ptr = mem2hex(&__debug_frame->gner1, ptr, 4, 0);
1637 1662
1638 ptr = mem2hex(&__break_user_context.f.fner[0], ptr, 4, 0); 1663 ptr = mem2hex(&__debug_user_context->f.fner[0], ptr, 4, 0);
1639 ptr = mem2hex(&__break_user_context.f.fner[1], ptr, 4, 0); 1664 ptr = mem2hex(&__debug_user_context->f.fner[1], ptr, 4, 0);
1640 1665
1641 break; 1666 break;
1642 1667
@@ -1648,8 +1673,7 @@ void gdbstub(int sigval)
1648 ptr = hex2mem(ptr, &temp, 4); 1673 ptr = hex2mem(ptr, &temp, 4);
1649 1674
1650 for (loop = 1; loop <= 27; loop++) 1675 for (loop = 1; loop <= 27; loop++)
1651 ptr = hex2mem(ptr, (unsigned long *)__debug_frame + REG_GR(loop), 1676 ptr = hex2mem(ptr, &__debug_user_context->i.gr[loop], 4);
1652 4);
1653 1677
1654 ptr = hex2mem(ptr, &temp, 4); 1678 ptr = hex2mem(ptr, &temp, 4);
1655 __frame = (struct pt_regs *) temp; 1679 __frame = (struct pt_regs *) temp;
@@ -1662,14 +1686,11 @@ void gdbstub(int sigval)
1662#endif 1686#endif
1663 1687
1664 for (loop = 32; loop <= 63; loop++) 1688 for (loop = 32; loop <= 63; loop++)
1665 ptr = hex2mem(ptr, (unsigned long *)__debug_frame + REG_GR(loop), 1689 ptr = hex2mem(ptr, &__debug_user_context->i.gr[loop], 4);
1666 4);
1667 1690
1668 /* deal with FR0-FR63 */ 1691 /* deal with FR0-FR63 */
1669 for (loop = 0; loop <= 63; loop++) 1692 for (loop = 0; loop <= 63; loop++)
1670 ptr = mem2hex((unsigned long *)&__break_user_context + 1693 ptr = mem2hex(&__debug_user_context->f.fr[loop], ptr, 4, 0);
1671 __FPMEDIA_FR(loop),
1672 ptr, 4, 0);
1673 1694
1674 /* deal with special registers */ 1695 /* deal with special registers */
1675 ptr = hex2mem(ptr, &__debug_frame->pc, 4); 1696 ptr = hex2mem(ptr, &__debug_frame->pc, 4);
@@ -1694,21 +1715,21 @@ void gdbstub(int sigval)
1694 1715
1695 ptr = hex2mem(ptr, &__debug_frame->iacc0, 8); 1716 ptr = hex2mem(ptr, &__debug_frame->iacc0, 8);
1696 1717
1697 ptr = hex2mem(ptr, &__break_user_context.f.fsr[0], 4); 1718 ptr = hex2mem(ptr, &__debug_user_context->f.fsr[0], 4);
1698 1719
1699 for (loop = 0; loop <= 7; loop++) 1720 for (loop = 0; loop <= 7; loop++)
1700 ptr = hex2mem(ptr, &__break_user_context.f.acc[loop], 4); 1721 ptr = hex2mem(ptr, &__debug_user_context->f.acc[loop], 4);
1701 1722
1702 ptr = hex2mem(ptr, &__break_user_context.f.accg, 8); 1723 ptr = hex2mem(ptr, &__debug_user_context->f.accg, 8);
1703 1724
1704 for (loop = 0; loop <= 1; loop++) 1725 for (loop = 0; loop <= 1; loop++)
1705 ptr = hex2mem(ptr, &__break_user_context.f.msr[loop], 4); 1726 ptr = hex2mem(ptr, &__debug_user_context->f.msr[loop], 4);
1706 1727
1707 ptr = hex2mem(ptr, &__debug_frame->gner0, 4); 1728 ptr = hex2mem(ptr, &__debug_frame->gner0, 4);
1708 ptr = hex2mem(ptr, &__debug_frame->gner1, 4); 1729 ptr = hex2mem(ptr, &__debug_frame->gner1, 4);
1709 1730
1710 ptr = hex2mem(ptr, &__break_user_context.f.fner[0], 4); 1731 ptr = hex2mem(ptr, &__debug_user_context->f.fner[0], 4);
1711 ptr = hex2mem(ptr, &__break_user_context.f.fner[1], 4); 1732 ptr = hex2mem(ptr, &__debug_user_context->f.fner[1], 4);
1712 1733
1713 gdbstub_strcpy(output_buffer,"OK"); 1734 gdbstub_strcpy(output_buffer,"OK");
1714 break; 1735 break;
@@ -1769,52 +1790,52 @@ void gdbstub(int sigval)
1769 case GDB_REG_GR(0): 1790 case GDB_REG_GR(0):
1770 break; 1791 break;
1771 case GDB_REG_GR(1) ... GDB_REG_GR(63): 1792 case GDB_REG_GR(1) ... GDB_REG_GR(63):
1772 __break_user_context.i.gr[addr - GDB_REG_GR(0)] = temp; 1793 __debug_user_context->i.gr[addr - GDB_REG_GR(0)] = temp;
1773 break; 1794 break;
1774 case GDB_REG_FR(0) ... GDB_REG_FR(63): 1795 case GDB_REG_FR(0) ... GDB_REG_FR(63):
1775 __break_user_context.f.fr[addr - GDB_REG_FR(0)] = temp; 1796 __debug_user_context->f.fr[addr - GDB_REG_FR(0)] = temp;
1776 break; 1797 break;
1777 case GDB_REG_PC: 1798 case GDB_REG_PC:
1778 __break_user_context.i.pc = temp; 1799 __debug_user_context->i.pc = temp;
1779 break; 1800 break;
1780 case GDB_REG_PSR: 1801 case GDB_REG_PSR:
1781 __break_user_context.i.psr = temp; 1802 __debug_user_context->i.psr = temp;
1782 break; 1803 break;
1783 case GDB_REG_CCR: 1804 case GDB_REG_CCR:
1784 __break_user_context.i.ccr = temp; 1805 __debug_user_context->i.ccr = temp;
1785 break; 1806 break;
1786 case GDB_REG_CCCR: 1807 case GDB_REG_CCCR:
1787 __break_user_context.i.cccr = temp; 1808 __debug_user_context->i.cccr = temp;
1788 break; 1809 break;
1789 case GDB_REG_BRR: 1810 case GDB_REG_BRR:
1790 __debug_regs->brr = temp; 1811 __debug_status.brr = temp;
1791 break; 1812 break;
1792 case GDB_REG_LR: 1813 case GDB_REG_LR:
1793 __break_user_context.i.lr = temp; 1814 __debug_user_context->i.lr = temp;
1794 break; 1815 break;
1795 case GDB_REG_LCR: 1816 case GDB_REG_LCR:
1796 __break_user_context.i.lcr = temp; 1817 __debug_user_context->i.lcr = temp;
1797 break; 1818 break;
1798 case GDB_REG_FSR0: 1819 case GDB_REG_FSR0:
1799 __break_user_context.f.fsr[0] = temp; 1820 __debug_user_context->f.fsr[0] = temp;
1800 break; 1821 break;
1801 case GDB_REG_ACC(0) ... GDB_REG_ACC(7): 1822 case GDB_REG_ACC(0) ... GDB_REG_ACC(7):
1802 __break_user_context.f.acc[addr - GDB_REG_ACC(0)] = temp; 1823 __debug_user_context->f.acc[addr - GDB_REG_ACC(0)] = temp;
1803 break; 1824 break;
1804 case GDB_REG_ACCG(0): 1825 case GDB_REG_ACCG(0):
1805 *(uint32_t *) &__break_user_context.f.accg[0] = temp; 1826 *(uint32_t *) &__debug_user_context->f.accg[0] = temp;
1806 break; 1827 break;
1807 case GDB_REG_ACCG(4): 1828 case GDB_REG_ACCG(4):
1808 *(uint32_t *) &__break_user_context.f.accg[4] = temp; 1829 *(uint32_t *) &__debug_user_context->f.accg[4] = temp;
1809 break; 1830 break;
1810 case GDB_REG_MSR(0) ... GDB_REG_MSR(1): 1831 case GDB_REG_MSR(0) ... GDB_REG_MSR(1):
1811 __break_user_context.f.msr[addr - GDB_REG_MSR(0)] = temp; 1832 __debug_user_context->f.msr[addr - GDB_REG_MSR(0)] = temp;
1812 break; 1833 break;
1813 case GDB_REG_GNER(0) ... GDB_REG_GNER(1): 1834 case GDB_REG_GNER(0) ... GDB_REG_GNER(1):
1814 __break_user_context.i.gner[addr - GDB_REG_GNER(0)] = temp; 1835 __debug_user_context->i.gner[addr - GDB_REG_GNER(0)] = temp;
1815 break; 1836 break;
1816 case GDB_REG_FNER(0) ... GDB_REG_FNER(1): 1837 case GDB_REG_FNER(0) ... GDB_REG_FNER(1):
1817 __break_user_context.f.fner[addr - GDB_REG_FNER(0)] = temp; 1838 __debug_user_context->f.fner[addr - GDB_REG_FNER(0)] = temp;
1818 break; 1839 break;
1819 default: 1840 default:
1820 temp2 = 0; 1841 temp2 = 0;
@@ -1850,6 +1871,7 @@ void gdbstub(int sigval)
1850 /* step to next instruction */ 1871 /* step to next instruction */
1851 case 's': 1872 case 's':
1852 __debug_regs->dcr |= DCR_SE; 1873 __debug_regs->dcr |= DCR_SE;
1874 __debug_status.dcr |= DCR_SE;
1853 goto done; 1875 goto done;
1854 1876
1855 /* set baud rate (bBB) */ 1877 /* set baud rate (bBB) */
@@ -1934,7 +1956,7 @@ void gdbstub(int sigval)
1934 } 1956 }
1935 1957
1936 done: 1958 done:
1937 restore_user_regs(&__break_user_context); 1959 restore_user_regs(&__debug_frame0->uc);
1938 1960
1939 //gdbstub_dump_debugregs(); 1961 //gdbstub_dump_debugregs();
1940 //gdbstub_printk("<-- gdbstub() %08x\n", __debug_frame->pc); 1962 //gdbstub_printk("<-- gdbstub() %08x\n", __debug_frame->pc);
@@ -1966,7 +1988,6 @@ void __init gdbstub_init(void)
1966#endif 1988#endif
1967 1989
1968 gdbstub_printk("%s", gdbstub_banner); 1990 gdbstub_printk("%s", gdbstub_banner);
1969 gdbstub_printk("DCR: %x\n", __debug_regs->dcr);
1970 1991
1971 gdbstub_io_init(); 1992 gdbstub_io_init();
1972 1993
diff --git a/arch/frv/kernel/head.S b/arch/frv/kernel/head.S
index 47c990af2e06..fecf751c5cae 100644
--- a/arch/frv/kernel/head.S
+++ b/arch/frv/kernel/head.S
@@ -11,6 +11,7 @@
11 11
12#include <linux/threads.h> 12#include <linux/threads.h>
13#include <linux/linkage.h> 13#include <linux/linkage.h>
14#include <asm/thread_info.h>
14#include <asm/ptrace.h> 15#include <asm/ptrace.h>
15#include <asm/page.h> 16#include <asm/page.h>
16#include <asm/spr-regs.h> 17#include <asm/spr-regs.h>
diff --git a/arch/frv/kernel/process.c b/arch/frv/kernel/process.c
index f0c767a56c65..515a5cea5469 100644
--- a/arch/frv/kernel/process.c
+++ b/arch/frv/kernel/process.c
@@ -26,6 +26,7 @@
26#include <linux/reboot.h> 26#include <linux/reboot.h>
27#include <linux/interrupt.h> 27#include <linux/interrupt.h>
28 28
29#include <asm/asm-offsets.h>
29#include <asm/uaccess.h> 30#include <asm/uaccess.h>
30#include <asm/system.h> 31#include <asm/system.h>
31#include <asm/setup.h> 32#include <asm/setup.h>
@@ -207,7 +208,7 @@ int copy_thread(int nr, unsigned long clone_flags,
207 208
208 regs0 = __kernel_frame0_ptr; 209 regs0 = __kernel_frame0_ptr;
209 childregs0 = (struct pt_regs *) 210 childregs0 = (struct pt_regs *)
210 (task_stack_page(p) + THREAD_SIZE - USER_CONTEXT_SIZE); 211 (task_stack_page(p) + THREAD_SIZE - FRV_FRAME0_SIZE);
211 childregs = childregs0; 212 childregs = childregs0;
212 213
213 /* set up the userspace frame (the only place that the USP is stored) */ 214 /* set up the userspace frame (the only place that the USP is stored) */
diff --git a/arch/frv/kernel/switch_to.S b/arch/frv/kernel/switch_to.S
index 9e5a583991a3..b5275fa9cd0d 100644
--- a/arch/frv/kernel/switch_to.S
+++ b/arch/frv/kernel/switch_to.S
@@ -11,6 +11,7 @@
11# 2 of the License, or (at your option) any later version. 11# 2 of the License, or (at your option) any later version.
12# 12#
13############################################################################### 13###############################################################################
14
14#include <linux/linkage.h> 15#include <linux/linkage.h>
15#include <asm/thread_info.h> 16#include <asm/thread_info.h>
16#include <asm/processor.h> 17#include <asm/processor.h>
@@ -30,7 +31,7 @@
30 # address of frame 0 (userspace) on current kernel stack 31 # address of frame 0 (userspace) on current kernel stack
31 .globl __kernel_frame0_ptr 32 .globl __kernel_frame0_ptr
32__kernel_frame0_ptr: 33__kernel_frame0_ptr:
33 .long init_thread_union + THREAD_SIZE - USER_CONTEXT_SIZE 34 .long init_thread_union + THREAD_SIZE - FRV_FRAME0_SIZE
34 35
35 # address of current task 36 # address of current task
36 .globl __kernel_current_task 37 .globl __kernel_current_task
diff --git a/arch/frv/kernel/traps.c b/arch/frv/kernel/traps.c
index 98ce3628ebde..2e6098c85578 100644
--- a/arch/frv/kernel/traps.c
+++ b/arch/frv/kernel/traps.c
@@ -20,6 +20,7 @@
20#include <linux/init.h> 20#include <linux/init.h>
21#include <linux/module.h> 21#include <linux/module.h>
22 22
23#include <asm/asm-offsets.h>
23#include <asm/setup.h> 24#include <asm/setup.h>
24#include <asm/fpu.h> 25#include <asm/fpu.h>
25#include <asm/system.h> 26#include <asm/system.h>
@@ -279,20 +280,20 @@ static const char *regnames[] = {
279 280
280void show_regs(struct pt_regs *regs) 281void show_regs(struct pt_regs *regs)
281{ 282{
282 uint32_t *reg; 283 unsigned long *reg;
283 int loop; 284 int loop;
284 285
285 printk("\n"); 286 printk("\n");
286 287
287 printk("Frame: @%08x [%s]\n", 288 printk("Frame: @%08lx [%s]\n",
288 (uint32_t) regs, 289 (unsigned long) regs,
289 regs->psr & PSR_S ? "kernel" : "user"); 290 regs->psr & PSR_S ? "kernel" : "user");
290 291
291 reg = (uint32_t *) regs; 292 reg = (unsigned long *) regs;
292 for (loop = 0; loop < REG__END; loop++) { 293 for (loop = 0; loop < NR_PT_REGS; loop++) {
293 printk("%s %08x", regnames[loop + 0], reg[loop + 0]); 294 printk("%s %08lx", regnames[loop + 0], reg[loop + 0]);
294 295
295 if (loop == REG__END - 1 || loop % 5 == 4) 296 if (loop == NR_PT_REGS - 1 || loop % 5 == 4)
296 printk("\n"); 297 printk("\n");
297 else 298 else
298 printk(" | "); 299 printk(" | ");
@@ -328,7 +329,7 @@ void die_if_kernel(const char *str, ...)
328 */ 329 */
329static void show_backtrace_regs(struct pt_regs *frame) 330static void show_backtrace_regs(struct pt_regs *frame)
330{ 331{
331 uint32_t *reg; 332 unsigned long *reg;
332 int loop; 333 int loop;
333 334
334 /* print the registers for this frame */ 335 /* print the registers for this frame */
@@ -336,11 +337,11 @@ static void show_backtrace_regs(struct pt_regs *frame)
336 frame->psr & PSR_S ? "Kernel Mode" : "User Mode", 337 frame->psr & PSR_S ? "Kernel Mode" : "User Mode",
337 frame); 338 frame);
338 339
339 reg = (uint32_t *) frame; 340 reg = (unsigned long *) frame;
340 for (loop = 0; loop < REG__END; loop++) { 341 for (loop = 0; loop < NR_PT_REGS; loop++) {
341 printk("%s %08x", regnames[loop + 0], reg[loop + 0]); 342 printk("%s %08lx", regnames[loop + 0], reg[loop + 0]);
342 343
343 if (loop == REG__END - 1 || loop % 5 == 4) 344 if (loop == NR_PT_REGS - 1 || loop % 5 == 4)
344 printk("\n"); 345 printk("\n");
345 else 346 else
346 printk(" | "); 347 printk(" | ");
diff --git a/include/asm-frv/gdb-stub.h b/include/asm-frv/gdb-stub.h
index c58479a4be99..24f9738670bd 100644
--- a/include/asm-frv/gdb-stub.h
+++ b/include/asm-frv/gdb-stub.h
@@ -89,6 +89,7 @@ extern void gdbstub_do_rx(void);
89 89
90extern asmlinkage void __debug_stub_init_break(void); 90extern asmlinkage void __debug_stub_init_break(void);
91extern asmlinkage void __break_hijack_kernel_event(void); 91extern asmlinkage void __break_hijack_kernel_event(void);
92extern asmlinkage void __break_hijack_kernel_event_breaks_here(void);
92extern asmlinkage void start_kernel(void); 93extern asmlinkage void start_kernel(void);
93 94
94extern asmlinkage void gdbstub_rx_handler(void); 95extern asmlinkage void gdbstub_rx_handler(void);
@@ -114,5 +115,26 @@ extern void console_set_baud(unsigned baud);
114#define gdbstub_proto(FMT,...) ({ 0; }) 115#define gdbstub_proto(FMT,...) ({ 0; })
115#endif 116#endif
116 117
118/*
119 * we dedicate GR31 to keeping a pointer to the gdbstub exception frame
120 * - gr31 is destroyed on entry to the gdbstub if !MMU
121 * - gr31 is saved in scr3 on entry to the gdbstub if in !MMU
122 */
123register struct frv_frame0 *__debug_frame0 asm("gr31");
124
125#define __debug_frame (&__debug_frame0->regs)
126#define __debug_user_context (&__debug_frame0->uc)
127#define __debug_regs (&__debug_frame0->debug)
128#define __debug_reg(X) ((unsigned long *) ((unsigned long) &__debug_frame0 + (X)))
129
130struct frv_debug_status {
131 unsigned long bpsr;
132 unsigned long dcr;
133 unsigned long brr;
134 unsigned long nmar;
135};
136
137extern struct frv_debug_status __debug_status;
138
117#endif /* _LANGUAGE_ASSEMBLY */ 139#endif /* _LANGUAGE_ASSEMBLY */
118#endif /* __ASM_GDB_STUB_H */ 140#endif /* __ASM_GDB_STUB_H */
diff --git a/include/asm-frv/ptrace.h b/include/asm-frv/ptrace.h
index b2cce0718e57..7ff525162a72 100644
--- a/include/asm-frv/ptrace.h
+++ b/include/asm-frv/ptrace.h
@@ -62,18 +62,10 @@
62#ifndef __ASSEMBLY__ 62#ifndef __ASSEMBLY__
63 63
64/* 64/*
65 * dedicate GR28; to keeping the a pointer to the current exception frame 65 * we dedicate GR28 to keeping a pointer to the current exception frame
66 * - gr28 is destroyed on entry to the kernel from userspace
66 */ 67 */
67register struct pt_regs *__frame asm("gr28"); 68register struct pt_regs *__frame asm("gr28");
68register struct pt_regs *__debug_frame asm("gr31");
69
70#ifndef container_of
71#define container_of(ptr, type, member) ({ \
72 const typeof( ((type *)0)->member ) *__mptr = (ptr); \
73 (type *)( (char *)__mptr - offsetof(type,member) );})
74#endif
75
76#define __debug_regs container_of(__debug_frame, struct pt_debug_regs, normal_regs)
77 69
78#define user_mode(regs) (!((regs)->psr & PSR_S)) 70#define user_mode(regs) (!((regs)->psr & PSR_S))
79#define instruction_pointer(regs) ((regs)->pc) 71#define instruction_pointer(regs) ((regs)->pc)
diff --git a/include/asm-frv/registers.h b/include/asm-frv/registers.h
index fccfd95cff68..9666119fcf6e 100644
--- a/include/asm-frv/registers.h
+++ b/include/asm-frv/registers.h
@@ -23,7 +23,13 @@
23 * 23 *
24 * +0x2000 +---------------------- 24 * +0x2000 +----------------------
25 * | union { 25 * | union {
26 * | struct user_context 26 * | struct frv_frame0 {
27 * | struct user_context {
28 * | struct user_int_regs
29 * | struct user_fpmedia_regs
30 * | }
31 * | struct frv_debug_regs
32 * | }
27 * | struct pt_regs [user exception] 33 * | struct pt_regs [user exception]
28 * | } 34 * | }
29 * +---------------------- <-- __kernel_frame0_ptr (maybe GR28) 35 * +---------------------- <-- __kernel_frame0_ptr (maybe GR28)
@@ -51,11 +57,11 @@
51#define _ASM_REGISTERS_H 57#define _ASM_REGISTERS_H
52 58
53#ifndef __ASSEMBLY__ 59#ifndef __ASSEMBLY__
54#define __OFFSET(X) (X) 60#define __OFFSET(X,N) ((X)+(N)*4)
55#define __OFFSETC(X,N) xxxxxxxxxxxxxxxxxxxxxxxx 61#define __OFFSETC(X,N) xxxxxxxxxxxxxxxxxxxxxxxx
56#else 62#else
57#define __OFFSET(X) ((X)*4) 63#define __OFFSET(X,N) ((X)+(N)*4)
58#define __OFFSETC(X,N) ((X)*4+(N)) 64#define __OFFSETC(X,N) ((X)+(N))
59#endif 65#endif
60 66
61/*****************************************************************************/ 67/*****************************************************************************/
@@ -117,30 +123,13 @@ struct pt_regs {
117 123
118#endif 124#endif
119 125
120#define REG_PSR __OFFSET( 0) /* Processor Status Register */
121#define REG_ISR __OFFSET( 1) /* Integer Status Register */
122#define REG_CCR __OFFSET( 2) /* Condition Code Register */
123#define REG_CCCR __OFFSET( 3) /* Condition Code for Conditional Insns Register */
124#define REG_LR __OFFSET( 4) /* Link Register */
125#define REG_LCR __OFFSET( 5) /* Loop Count Register */
126#define REG_PC __OFFSET( 6) /* Program Counter */
127
128#define REG__STATUS __OFFSET( 7) /* exception status */
129#define REG__STATUS_STEP 0x00000001 /* - reenable single stepping on return */ 126#define REG__STATUS_STEP 0x00000001 /* - reenable single stepping on return */
130#define REG__STATUS_STEPPED 0x00000002 /* - single step caused exception */ 127#define REG__STATUS_STEPPED 0x00000002 /* - single step caused exception */
131#define REG__STATUS_BROKE 0x00000004 /* - BREAK insn caused exception */ 128#define REG__STATUS_BROKE 0x00000004 /* - BREAK insn caused exception */
132#define REG__STATUS_SYSC_ENTRY 0x40000000 /* - T on syscall entry (ptrace.c only) */ 129#define REG__STATUS_SYSC_ENTRY 0x40000000 /* - T on syscall entry (ptrace.c only) */
133#define REG__STATUS_SYSC_EXIT 0x80000000 /* - T on syscall exit (ptrace.c only) */ 130#define REG__STATUS_SYSC_EXIT 0x80000000 /* - T on syscall exit (ptrace.c only) */
134 131
135#define REG_SYSCALLNO __OFFSET( 8) /* syscall number or -1 */ 132#define REG_GR(R) __OFFSET(REG_GR0, (R))
136#define REG_ORIG_GR8 __OFFSET( 9) /* saved GR8 for signal handling */
137#define REG_GNER0 __OFFSET(10)
138#define REG_GNER1 __OFFSET(11)
139#define REG_IACC0 __OFFSET(12)
140
141#define REG_TBR __OFFSET(14) /* Trap Vector Register */
142#define REG_GR(R) __OFFSET((14+(R)))
143#define REG__END REG_GR(32)
144 133
145#define REG_SP REG_GR(1) 134#define REG_SP REG_GR(1)
146#define REG_FP REG_GR(2) 135#define REG_FP REG_GR(2)
@@ -149,27 +138,21 @@ struct pt_regs {
149 138
150/*****************************************************************************/ 139/*****************************************************************************/
151/* 140/*
152 * extension tacked in front of the exception frame in debug mode 141 * debugging registers
153 */ 142 */
154#ifndef __ASSEMBLY__ 143#ifndef __ASSEMBLY__
155 144
156struct pt_debug_regs 145struct frv_debug_regs
157{ 146{
158 unsigned long bpsr;
159 unsigned long dcr; 147 unsigned long dcr;
160 unsigned long brr; 148 unsigned long ibar[4] __attribute__((aligned(8)));
161 unsigned long nmar; 149 unsigned long dbar[4] __attribute__((aligned(8)));
162 struct pt_regs normal_regs; 150 unsigned long dbdr[4][4] __attribute__((aligned(8)));
151 unsigned long dbmr[4][4] __attribute__((aligned(8)));
163} __attribute__((aligned(8))); 152} __attribute__((aligned(8)));
164 153
165#endif 154#endif
166 155
167#define REG_NMAR __OFFSET(-1)
168#define REG_BRR __OFFSET(-2)
169#define REG_DCR __OFFSET(-3)
170#define REG_BPSR __OFFSET(-4)
171#define REG__DEBUG_XTRA __OFFSET(4)
172
173/*****************************************************************************/ 156/*****************************************************************************/
174/* 157/*
175 * userspace registers 158 * userspace registers
@@ -223,33 +206,27 @@ struct user_context
223 void *extension; 206 void *extension;
224} __attribute__((aligned(8))); 207} __attribute__((aligned(8)));
225 208
209struct frv_frame0 {
210 union {
211 struct pt_regs regs;
212 struct user_context uc;
213 };
214
215 struct frv_debug_regs debug;
216
217} __attribute__((aligned(32)));
218
226#endif 219#endif
227 220
228#define NR_USER_INT_REGS (14 + 64) 221#define __INT_GR(R) __OFFSET(__INT_GR0, (R))
229#define NR_USER_FPMEDIA_REGS (64 + 2 + 2 + 8 + 8/4 + 1) 222
230#define NR_USER_CONTEXT (NR_USER_INT_REGS + NR_USER_FPMEDIA_REGS + 1) 223#define __FPMEDIA_FR(R) __OFFSET(__FPMEDIA_FR0, (R))
231 224#define __FPMEDIA_FNER(R) __OFFSET(__FPMEDIA_FNER0, (R))
232#define USER_CONTEXT_SIZE (((NR_USER_CONTEXT + 1) & ~1) * 4) 225#define __FPMEDIA_MSR(R) __OFFSET(__FPMEDIA_MSR0, (R))
233 226#define __FPMEDIA_ACC(R) __OFFSET(__FPMEDIA_ACC0, (R))
234#define __THREAD_FRAME __OFFSET(0) 227#define __FPMEDIA_ACCG(R) __OFFSETC(__FPMEDIA_ACCG0, (R))
235#define __THREAD_CURR __OFFSET(1) 228#define __FPMEDIA_FSR(R) __OFFSET(__FPMEDIA_FSR0, (R))
236#define __THREAD_SP __OFFSET(2) 229
237#define __THREAD_FP __OFFSET(3) 230#define __THREAD_GR(R) __OFFSET(__THREAD_GR16, (R) - 16)
238#define __THREAD_LR __OFFSET(4)
239#define __THREAD_PC __OFFSET(5)
240#define __THREAD_GR(R) __OFFSET(6 + (R) - 16)
241#define __THREAD_FRAME0 __OFFSET(19)
242#define __THREAD_USER __OFFSET(19)
243
244#define __USER_INT __OFFSET(0)
245#define __INT_GR(R) __OFFSET(14 + (R))
246
247#define __USER_FPMEDIA __OFFSET(NR_USER_INT_REGS)
248#define __FPMEDIA_FR(R) __OFFSET(NR_USER_INT_REGS + (R))
249#define __FPMEDIA_FNER(R) __OFFSET(NR_USER_INT_REGS + 64 + (R))
250#define __FPMEDIA_MSR(R) __OFFSET(NR_USER_INT_REGS + 66 + (R))
251#define __FPMEDIA_ACC(R) __OFFSET(NR_USER_INT_REGS + 68 + (R))
252#define __FPMEDIA_ACCG(R) __OFFSETC(NR_USER_INT_REGS + 76, (R))
253#define __FPMEDIA_FSR(R) __OFFSET(NR_USER_INT_REGS + 78 + (R))
254 231
255#endif /* _ASM_REGISTERS_H */ 232#endif /* _ASM_REGISTERS_H */
diff --git a/include/asm-frv/thread_info.h b/include/asm-frv/thread_info.h
index ea426abf01d3..d66c48e6ef14 100644
--- a/include/asm-frv/thread_info.h
+++ b/include/asm-frv/thread_info.h
@@ -19,6 +19,8 @@
19#include <asm/processor.h> 19#include <asm/processor.h>
20#endif 20#endif
21 21
22#define THREAD_SIZE 8192
23
22/* 24/*
23 * low level task data that entry.S needs immediate access to 25 * low level task data that entry.S needs immediate access to
24 * - this struct should fit entirely inside of one cache line 26 * - this struct should fit entirely inside of one cache line
@@ -46,15 +48,7 @@ struct thread_info {
46 48
47#else /* !__ASSEMBLY__ */ 49#else /* !__ASSEMBLY__ */
48 50
49/* offsets into the thread_info struct for assembly code access */ 51#include <asm/asm-offsets.h>
50#define TI_TASK 0x00000000
51#define TI_EXEC_DOMAIN 0x00000004
52#define TI_FLAGS 0x00000008
53#define TI_STATUS 0x0000000C
54#define TI_CPU 0x00000010
55#define TI_PRE_COUNT 0x00000014
56#define TI_ADDR_LIMIT 0x00000018
57#define TI_RESTART_BLOCK 0x0000001C
58 52
59#endif 53#endif
60 54
@@ -83,12 +77,6 @@ struct thread_info {
83#define init_thread_info (init_thread_union.thread_info) 77#define init_thread_info (init_thread_union.thread_info)
84#define init_stack (init_thread_union.stack) 78#define init_stack (init_thread_union.stack)
85 79
86#ifdef CONFIG_SMALL_TASKS
87#define THREAD_SIZE 4096
88#else
89#define THREAD_SIZE 8192
90#endif
91
92/* how to get the thread information struct from C */ 80/* how to get the thread information struct from C */
93register struct thread_info *__current_thread_info asm("gr15"); 81register struct thread_info *__current_thread_info asm("gr15");
94 82
@@ -111,11 +99,7 @@ register struct thread_info *__current_thread_info asm("gr15");
111 99
112#define free_thread_info(info) kfree(info) 100#define free_thread_info(info) kfree(info)
113 101
114#else /* !__ASSEMBLY__ */ 102#endif /* __ASSEMBLY__ */
115
116#define THREAD_SIZE 8192
117
118#endif
119 103
120/* 104/*
121 * thread information flags 105 * thread information flags