Commit 84e8cd6d authored by David Howells's avatar David Howells Committed by Linus Torvalds

[PATCH] FRV: Introduce asm-offsets for FRV arch

Introduce the use of asm-offsets into the FRV architecture.
Signed-off-by: default avatarDavid Howells <dhowells@redhat.com>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 6d8c4e3b
/* Dummy asm-offsets.c file. Required by kbuild and ready to be used - hint! */ /*
* Generate definitions needed by assembly language modules.
* This code generates raw asm output which is post-processed
* to extract and format the required data.
*/
#include <linux/sched.h>
#include <linux/signal.h>
#include <linux/personality.h>
#include <asm/registers.h>
#include <asm/ucontext.h>
#include <asm/processor.h>
#include <asm/thread_info.h>
#include <asm/gdb-stub.h>
#define DEFINE(sym, val) \
asm volatile("\n->" #sym " %0 " #val : : "i" (val))
#define DEF_PTREG(sym, reg) \
asm volatile("\n->" #sym " %0 offsetof(struct pt_regs, " #reg ")" \
: : "i" (offsetof(struct pt_regs, reg)))
#define DEF_IREG(sym, reg) \
asm volatile("\n->" #sym " %0 offsetof(struct user_context, " #reg ")" \
: : "i" (offsetof(struct user_context, reg)))
#define DEF_FREG(sym, reg) \
asm volatile("\n->" #sym " %0 offsetof(struct user_context, " #reg ")" \
: : "i" (offsetof(struct user_context, reg)))
#define DEF_0REG(sym, reg) \
asm volatile("\n->" #sym " %0 offsetof(struct frv_frame0, " #reg ")" \
: : "i" (offsetof(struct frv_frame0, reg)))
#define BLANK() asm volatile("\n->" : : )
#define OFFSET(sym, str, mem) \
DEFINE(sym, offsetof(struct str, mem));
void foo(void)
{
/* offsets into the thread_info structure */
OFFSET(TI_TASK, thread_info, task);
OFFSET(TI_EXEC_DOMAIN, thread_info, exec_domain);
OFFSET(TI_FLAGS, thread_info, flags);
OFFSET(TI_STATUS, thread_info, status);
OFFSET(TI_CPU, thread_info, cpu);
OFFSET(TI_PREEMPT_COUNT, thread_info, preempt_count);
OFFSET(TI_ADDR_LIMIT, thread_info, addr_limit);
OFFSET(TI_RESTART_BLOCK, thread_info, restart_block);
BLANK();
/* offsets into register file storage */
DEF_PTREG(REG_PSR, psr);
DEF_PTREG(REG_ISR, isr);
DEF_PTREG(REG_CCR, ccr);
DEF_PTREG(REG_CCCR, cccr);
DEF_PTREG(REG_LR, lr);
DEF_PTREG(REG_LCR, lcr);
DEF_PTREG(REG_PC, pc);
DEF_PTREG(REG__STATUS, __status);
DEF_PTREG(REG_SYSCALLNO, syscallno);
DEF_PTREG(REG_ORIG_GR8, orig_gr8);
DEF_PTREG(REG_GNER0, gner0);
DEF_PTREG(REG_GNER1, gner1);
DEF_PTREG(REG_IACC0, iacc0);
DEF_PTREG(REG_TBR, tbr);
DEF_PTREG(REG_GR0, tbr);
DEFINE(REG__END, sizeof(struct pt_regs));
BLANK();
DEF_0REG(REG_DCR, debug.dcr);
DEF_0REG(REG_IBAR0, debug.ibar[0]);
DEF_0REG(REG_DBAR0, debug.dbar[0]);
DEF_0REG(REG_DBDR00, debug.dbdr[0][0]);
DEF_0REG(REG_DBMR00, debug.dbmr[0][0]);
BLANK();
DEF_IREG(__INT_GR0, i.gr[0]);
DEF_FREG(__USER_FPMEDIA, f);
DEF_FREG(__FPMEDIA_FR0, f.fr[0]);
DEF_FREG(__FPMEDIA_FNER0, f.fner[0]);
DEF_FREG(__FPMEDIA_MSR0, f.msr[0]);
DEF_FREG(__FPMEDIA_ACC0, f.acc[0]);
DEF_FREG(__FPMEDIA_ACCG0, f.accg[0]);
DEF_FREG(__FPMEDIA_FSR0, f.fsr[0]);
BLANK();
DEFINE(NR_PT_REGS, sizeof(struct pt_regs) / 4);
DEFINE(NR_USER_INT_REGS, sizeof(struct user_int_regs) / 4);
DEFINE(NR_USER_FPMEDIA_REGS, sizeof(struct user_fpmedia_regs) / 4);
DEFINE(NR_USER_CONTEXT, sizeof(struct user_context) / 4);
DEFINE(FRV_FRAME0_SIZE, sizeof(struct frv_frame0));
BLANK();
/* offsets into thread_struct */
OFFSET(__THREAD_FRAME, thread_struct, frame);
OFFSET(__THREAD_CURR, thread_struct, curr);
OFFSET(__THREAD_SP, thread_struct, sp);
OFFSET(__THREAD_FP, thread_struct, fp);
OFFSET(__THREAD_LR, thread_struct, lr);
OFFSET(__THREAD_PC, thread_struct, pc);
OFFSET(__THREAD_GR16, thread_struct, gr[0]);
OFFSET(__THREAD_SCHED_LR, thread_struct, sched_lr);
OFFSET(__THREAD_FRAME0, thread_struct, frame0);
OFFSET(__THREAD_USER, thread_struct, user);
BLANK();
/* offsets into frv_debug_status */
OFFSET(DEBUG_BPSR, frv_debug_status, bpsr);
OFFSET(DEBUG_DCR, frv_debug_status, dcr);
OFFSET(DEBUG_BRR, frv_debug_status, brr);
OFFSET(DEBUG_NMAR, frv_debug_status, nmar);
BLANK();
}
...@@ -9,11 +9,11 @@ ...@@ -9,11 +9,11 @@
* 2 of the License, or (at your option) any later version. * 2 of the License, or (at your option) any later version.
*/ */
#include <linux/sys.h>
#include <linux/linkage.h> #include <linux/linkage.h>
#include <asm/setup.h> #include <asm/setup.h>
#include <asm/segment.h> #include <asm/segment.h>
#include <asm/ptrace.h> #include <asm/ptrace.h>
#include <asm/thread_info.h>
#include <asm/spr-regs.h> #include <asm/spr-regs.h>
#include <asm/errno.h> #include <asm/errno.h>
...@@ -23,13 +23,11 @@ ...@@ -23,13 +23,11 @@
# #
.section .bss.stack .section .bss.stack
.globl __break_user_context .globl __break_user_context
.balign 8192 .balign THREAD_SIZE
__break_stack: __break_stack:
.space (8192 - (USER_CONTEXT_SIZE + REG__DEBUG_XTRA)) & ~7 .space THREAD_SIZE - FRV_FRAME0_SIZE
__break_stack_tos: __break_frame_0:
.space REG__DEBUG_XTRA .space FRV_FRAME0_SIZE
__break_user_context:
.space USER_CONTEXT_SIZE
# #
# miscellaneous variables # miscellaneous variables
...@@ -74,8 +72,8 @@ __entry_break: ...@@ -74,8 +72,8 @@ __entry_break:
#endif #endif
LEDS 0x1001,gr31 LEDS 0x1001,gr31
sethi.p %hi(__break_user_context),gr31 sethi.p %hi(__break_frame_0),gr31
setlo %lo(__break_user_context),gr31 setlo %lo(__break_frame_0),gr31
stdi gr2,@(gr31,#REG_GR(2)) stdi gr2,@(gr31,#REG_GR(2))
movsg ccr,gr3 movsg ccr,gr3
...@@ -585,8 +583,8 @@ __break_continue: ...@@ -585,8 +583,8 @@ __break_continue:
# set up the kernel stack pointer # set up the kernel stack pointer
sti sp,@(gr31,#REG_SP) sti sp,@(gr31,#REG_SP)
sethi.p %hi(__break_stack_tos),sp sethi.p %hi(__break_frame_0),sp
setlo %lo(__break_stack_tos),sp setlo %lo(__break_frame_0),sp
# finish building the exception frame # finish building the exception frame
stdi gr4 ,@(gr31,#REG_GR(4)) stdi gr4 ,@(gr31,#REG_GR(4))
...@@ -651,9 +649,12 @@ __break_continue: ...@@ -651,9 +649,12 @@ __break_continue:
movsg nmar,gr5 movsg nmar,gr5
movsg dcr,gr6 movsg dcr,gr6
stdi gr4 ,@(gr31,#REG_BRR) sethi.p %hi(__debug_status),gr7
sti gr19,@(gr31,#REG_BPSR) setlo %lo(__debug_status),gr7
sti.p gr6 ,@(gr31,#REG_DCR)
stdi gr4 ,@(gr7,#DEBUG_BRR)
sti gr19,@(gr7,#DEBUG_BPSR)
sti.p gr6 ,@(gr7,#DEBUG_DCR)
# trap exceptions during break handling and disable h/w breakpoints/watchpoints # trap exceptions during break handling and disable h/w breakpoints/watchpoints
sethi %hi(DCR_EBE),gr5 sethi %hi(DCR_EBE),gr5
...@@ -698,7 +699,10 @@ __break_continue: ...@@ -698,7 +699,10 @@ __break_continue:
lddi @(gr31,#REG_PSR) ,gr22 lddi @(gr31,#REG_PSR) ,gr22
ldi @(gr31,#REG_PC) ,gr21 ldi @(gr31,#REG_PC) ,gr21
ldi @(gr31,#REG_TBR) ,gr20 ldi @(gr31,#REG_TBR) ,gr20
ldi.p @(gr31,#REG_DCR) ,gr6
sethi.p %hi(__debug_status),gr6
setlo %lo(__debug_status),gr6
ldi.p @(gr6,#DEBUG_DCR) ,gr6
andi gr22,#PSR_S,gr19 /* rebuild BPSR */ andi gr22,#PSR_S,gr19 /* rebuild BPSR */
andi.p gr22,#PSR_ET,gr5 andi.p gr22,#PSR_ET,gr5
......
...@@ -39,10 +39,9 @@ do { \ ...@@ -39,10 +39,9 @@ do { \
gdbstub_do_rx(); \ gdbstub_do_rx(); \
} while(!FLOWCTL_QUERY(LINE)) } while(!FLOWCTL_QUERY(LINE))
static void __init debug_stub_init(void); struct frv_debug_status __debug_status;
extern asmlinkage void __break_hijack_kernel_event(void); static void __init debug_stub_init(void);
extern asmlinkage void __break_hijack_kernel_event_breaks_here(void);
/*****************************************************************************/ /*****************************************************************************/
/* /*
...@@ -67,7 +66,7 @@ asmlinkage void debug_stub(void) ...@@ -67,7 +66,7 @@ asmlinkage void debug_stub(void)
__set_HSR(0, hsr0 & ~HSR0_ETMD); __set_HSR(0, hsr0 & ~HSR0_ETMD);
/* disable single stepping */ /* disable single stepping */
__debug_regs->dcr &= ~DCR_SE; __debug_status.dcr &= ~DCR_SE;
/* kernel mode can propose an exception be handled in debug mode by jumping to a special /* kernel mode can propose an exception be handled in debug mode by jumping to a special
* location */ * location */
...@@ -76,8 +75,8 @@ asmlinkage void debug_stub(void) ...@@ -76,8 +75,8 @@ asmlinkage void debug_stub(void)
* the top kernel context */ * the top kernel context */
*__debug_frame = *__frame; *__debug_frame = *__frame;
__frame = __debug_frame->next_frame; __frame = __debug_frame->next_frame;
__debug_regs->brr = (__debug_frame->tbr & TBR_TT) << 12; __debug_status.brr = (__debug_frame->tbr & TBR_TT) << 12;
__debug_regs->brr |= BRR_EB; __debug_status.brr |= BRR_EB;
} }
if (__debug_frame->pc == (unsigned long) __debug_bug_trap + 4) { if (__debug_frame->pc == (unsigned long) __debug_bug_trap + 4) {
...@@ -124,7 +123,7 @@ static void __init debug_stub_init(void) ...@@ -124,7 +123,7 @@ static void __init debug_stub_init(void)
__debug_frame->pc = (unsigned long) start_kernel; __debug_frame->pc = (unsigned long) start_kernel;
/* enable the debug events we want to trap */ /* enable the debug events we want to trap */
__debug_regs->dcr = DCR_EBE; __debug_status.dcr = DCR_EBE;
#ifdef CONFIG_GDBSTUB #ifdef CONFIG_GDBSTUB
gdbstub_init(); gdbstub_init();
......
...@@ -27,7 +27,6 @@ ...@@ -27,7 +27,6 @@
* *
*/ */
#include <linux/sys.h>
#include <linux/linkage.h> #include <linux/linkage.h>
#include <asm/thread_info.h> #include <asm/thread_info.h>
#include <asm/setup.h> #include <asm/setup.h>
......
...@@ -124,6 +124,7 @@ ...@@ -124,6 +124,7 @@
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/nmi.h> #include <linux/nmi.h>
#include <asm/asm-offsets.h>
#include <asm/pgtable.h> #include <asm/pgtable.h>
#include <asm/system.h> #include <asm/system.h>
#include <asm/gdb-stub.h> #include <asm/gdb-stub.h>
...@@ -136,7 +137,6 @@ extern void debug_to_serial(const char *p, int n); ...@@ -136,7 +137,6 @@ extern void debug_to_serial(const char *p, int n);
extern void gdbstub_console_write(struct console *co, const char *p, unsigned n); extern void gdbstub_console_write(struct console *co, const char *p, unsigned n);
extern volatile uint32_t __break_error_detect[3]; /* ESFR1, ESR15, EAR15 */ extern volatile uint32_t __break_error_detect[3]; /* ESFR1, ESR15, EAR15 */
extern struct user_context __break_user_context;
struct __debug_amr { struct __debug_amr {
unsigned long L, P; unsigned long L, P;
...@@ -926,6 +926,7 @@ static int gdbstub_set_breakpoint(unsigned long type, unsigned long addr, unsign ...@@ -926,6 +926,7 @@ static int gdbstub_set_breakpoint(unsigned long type, unsigned long addr, unsign
if (!(__debug_regs->dcr & DCR_IBE0)) { if (!(__debug_regs->dcr & DCR_IBE0)) {
//gdbstub_printk("set h/w break 0: %08lx\n", addr); //gdbstub_printk("set h/w break 0: %08lx\n", addr);
__debug_regs->dcr |= DCR_IBE0; __debug_regs->dcr |= DCR_IBE0;
__debug_regs->ibar[0] = addr;
asm volatile("movgs %0,ibar0" : : "r"(addr)); asm volatile("movgs %0,ibar0" : : "r"(addr));
return 0; return 0;
} }
...@@ -933,6 +934,7 @@ static int gdbstub_set_breakpoint(unsigned long type, unsigned long addr, unsign ...@@ -933,6 +934,7 @@ static int gdbstub_set_breakpoint(unsigned long type, unsigned long addr, unsign
if (!(__debug_regs->dcr & DCR_IBE1)) { if (!(__debug_regs->dcr & DCR_IBE1)) {
//gdbstub_printk("set h/w break 1: %08lx\n", addr); //gdbstub_printk("set h/w break 1: %08lx\n", addr);
__debug_regs->dcr |= DCR_IBE1; __debug_regs->dcr |= DCR_IBE1;
__debug_regs->ibar[1] = addr;
asm volatile("movgs %0,ibar1" : : "r"(addr)); asm volatile("movgs %0,ibar1" : : "r"(addr));
return 0; return 0;
} }
...@@ -940,6 +942,7 @@ static int gdbstub_set_breakpoint(unsigned long type, unsigned long addr, unsign ...@@ -940,6 +942,7 @@ static int gdbstub_set_breakpoint(unsigned long type, unsigned long addr, unsign
if (!(__debug_regs->dcr & DCR_IBE2)) { if (!(__debug_regs->dcr & DCR_IBE2)) {
//gdbstub_printk("set h/w break 2: %08lx\n", addr); //gdbstub_printk("set h/w break 2: %08lx\n", addr);
__debug_regs->dcr |= DCR_IBE2; __debug_regs->dcr |= DCR_IBE2;
__debug_regs->ibar[2] = addr;
asm volatile("movgs %0,ibar2" : : "r"(addr)); asm volatile("movgs %0,ibar2" : : "r"(addr));
return 0; return 0;
} }
...@@ -947,6 +950,7 @@ static int gdbstub_set_breakpoint(unsigned long type, unsigned long addr, unsign ...@@ -947,6 +950,7 @@ static int gdbstub_set_breakpoint(unsigned long type, unsigned long addr, unsign
if (!(__debug_regs->dcr & DCR_IBE3)) { if (!(__debug_regs->dcr & DCR_IBE3)) {
//gdbstub_printk("set h/w break 3: %08lx\n", addr); //gdbstub_printk("set h/w break 3: %08lx\n", addr);
__debug_regs->dcr |= DCR_IBE3; __debug_regs->dcr |= DCR_IBE3;
__debug_regs->ibar[3] = addr;
asm volatile("movgs %0,ibar3" : : "r"(addr)); asm volatile("movgs %0,ibar3" : : "r"(addr));
return 0; return 0;
} }
...@@ -971,7 +975,14 @@ static int gdbstub_set_breakpoint(unsigned long type, unsigned long addr, unsign ...@@ -971,7 +975,14 @@ static int gdbstub_set_breakpoint(unsigned long type, unsigned long addr, unsign
if (!(__debug_regs->dcr & (DCR_DRBE0|DCR_DWBE0))) { if (!(__debug_regs->dcr & (DCR_DRBE0|DCR_DWBE0))) {
//gdbstub_printk("set h/w watchpoint 0 type %ld: %08lx\n", type, addr); //gdbstub_printk("set h/w watchpoint 0 type %ld: %08lx\n", type, addr);
tmp = type==2 ? DCR_DWBE0 : type==3 ? DCR_DRBE0 : DCR_DRBE0|DCR_DWBE0; tmp = type==2 ? DCR_DWBE0 : type==3 ? DCR_DRBE0 : DCR_DRBE0|DCR_DWBE0;
__debug_regs->dcr |= tmp; __debug_regs->dcr |= tmp;
__debug_regs->dbar[0] = addr;
__debug_regs->dbmr[0][0] = dbmr.mask0;
__debug_regs->dbmr[0][1] = dbmr.mask1;
__debug_regs->dbdr[0][0] = 0;
__debug_regs->dbdr[0][1] = 0;
asm volatile(" movgs %0,dbar0 \n" asm volatile(" movgs %0,dbar0 \n"
" movgs %1,dbmr00 \n" " movgs %1,dbmr00 \n"
" movgs %2,dbmr01 \n" " movgs %2,dbmr01 \n"
...@@ -984,7 +995,14 @@ static int gdbstub_set_breakpoint(unsigned long type, unsigned long addr, unsign ...@@ -984,7 +995,14 @@ static int gdbstub_set_breakpoint(unsigned long type, unsigned long addr, unsign
if (!(__debug_regs->dcr & (DCR_DRBE1|DCR_DWBE1))) { if (!(__debug_regs->dcr & (DCR_DRBE1|DCR_DWBE1))) {
//gdbstub_printk("set h/w watchpoint 1 type %ld: %08lx\n", type, addr); //gdbstub_printk("set h/w watchpoint 1 type %ld: %08lx\n", type, addr);
tmp = type==2 ? DCR_DWBE1 : type==3 ? DCR_DRBE1 : DCR_DRBE1|DCR_DWBE1; tmp = type==2 ? DCR_DWBE1 : type==3 ? DCR_DRBE1 : DCR_DRBE1|DCR_DWBE1;
__debug_regs->dcr |= tmp; __debug_regs->dcr |= tmp;
__debug_regs->dbar[1] = addr;
__debug_regs->dbmr[1][0] = dbmr.mask0;
__debug_regs->dbmr[1][1] = dbmr.mask1;
__debug_regs->dbdr[1][0] = 0;
__debug_regs->dbdr[1][1] = 0;
asm volatile(" movgs %0,dbar1 \n" asm volatile(" movgs %0,dbar1 \n"
" movgs %1,dbmr10 \n" " movgs %1,dbmr10 \n"
" movgs %2,dbmr11 \n" " movgs %2,dbmr11 \n"
...@@ -1047,6 +1065,7 @@ int gdbstub_clear_breakpoint(unsigned long type, unsigned long addr, unsigned lo ...@@ -1047,6 +1065,7 @@ int gdbstub_clear_breakpoint(unsigned long type, unsigned long addr, unsigned lo
if (__debug_regs->dcr & DCR_IBE0 && __get_ibar(0) == addr) { if (__debug_regs->dcr & DCR_IBE0 && __get_ibar(0) == addr) {
//gdbstub_printk("clear h/w break 0: %08lx\n", addr); //gdbstub_printk("clear h/w break 0: %08lx\n", addr);
__debug_regs->dcr &= ~DCR_IBE0; __debug_regs->dcr &= ~DCR_IBE0;
__debug_regs->ibar[0] = 0;
asm volatile("movgs gr0,ibar0"); asm volatile("movgs gr0,ibar0");
return 0; return 0;
} }
...@@ -1054,6 +1073,7 @@ int gdbstub_clear_breakpoint(unsigned long type, unsigned long addr, unsigned lo ...@@ -1054,6 +1073,7 @@ int gdbstub_clear_breakpoint(unsigned long type, unsigned long addr, unsigned lo
if (__debug_regs->dcr & DCR_IBE1 && __get_ibar(1) == addr) { if (__debug_regs->dcr & DCR_IBE1 && __get_ibar(1) == addr) {
//gdbstub_printk("clear h/w break 1: %08lx\n", addr); //gdbstub_printk("clear h/w break 1: %08lx\n", addr);
__debug_regs->dcr &= ~DCR_IBE1; __debug_regs->dcr &= ~DCR_IBE1;
__debug_regs->ibar[1] = 0;
asm volatile("movgs gr0,ibar1"); asm volatile("movgs gr0,ibar1");
return 0; return 0;
} }
...@@ -1061,6 +1081,7 @@ int gdbstub_clear_breakpoint(unsigned long type, unsigned long addr, unsigned lo ...@@ -1061,6 +1081,7 @@ int gdbstub_clear_breakpoint(unsigned long type, unsigned long addr, unsigned lo
if (__debug_regs->dcr & DCR_IBE2 && __get_ibar(2) == addr) { if (__debug_regs->dcr & DCR_IBE2 && __get_ibar(2) == addr) {
//gdbstub_printk("clear h/w break 2: %08lx\n", addr); //gdbstub_printk("clear h/w break 2: %08lx\n", addr);
__debug_regs->dcr &= ~DCR_IBE2; __debug_regs->dcr &= ~DCR_IBE2;
__debug_regs->ibar[2] = 0;
asm volatile("movgs gr0,ibar2"); asm volatile("movgs gr0,ibar2");
return 0; return 0;
} }
...@@ -1068,6 +1089,7 @@ int gdbstub_clear_breakpoint(unsigned long type, unsigned long addr, unsigned lo ...@@ -1068,6 +1089,7 @@ int gdbstub_clear_breakpoint(unsigned long type, unsigned long addr, unsigned lo
if (__debug_regs->dcr & DCR_IBE3 && __get_ibar(3) == addr) { if (__debug_regs->dcr & DCR_IBE3 && __get_ibar(3) == addr) {
//gdbstub_printk("clear h/w break 3: %08lx\n", addr); //gdbstub_printk("clear h/w break 3: %08lx\n", addr);
__debug_regs->dcr &= ~DCR_IBE3; __debug_regs->dcr &= ~DCR_IBE3;
__debug_regs->ibar[3] = 0;
asm volatile("movgs gr0,ibar3"); asm volatile("movgs gr0,ibar3");
return 0; return 0;
} }
...@@ -1104,6 +1126,12 @@ int gdbstub_clear_breakpoint(unsigned long type, unsigned long addr, unsigned lo ...@@ -1104,6 +1126,12 @@ int gdbstub_clear_breakpoint(unsigned long type, unsigned long addr, unsigned lo
//gdbstub_printk("clear h/w watchpoint 0 type %ld: %08lx\n", type, addr); //gdbstub_printk("clear h/w watchpoint 0 type %ld: %08lx\n", type, addr);
__debug_regs->dcr &= ~(DCR_DRBE0|DCR_DWBE0); __debug_regs->dcr &= ~(DCR_DRBE0|DCR_DWBE0);
__debug_regs->dbar[0] = 0;
__debug_regs->dbmr[0][0] = 0;
__debug_regs->dbmr[0][1] = 0;
__debug_regs->dbdr[0][0] = 0;
__debug_regs->dbdr[0][1] = 0;
asm volatile(" movgs gr0,dbar0 \n" asm volatile(" movgs gr0,dbar0 \n"
" movgs gr0,dbmr00 \n" " movgs gr0,dbmr00 \n"
" movgs gr0,dbmr01 \n" " movgs gr0,dbmr01 \n"
...@@ -1123,6 +1151,12 @@ int gdbstub_clear_breakpoint(unsigned long type, unsigned long addr, unsigned lo ...@@ -1123,6 +1151,12 @@ int gdbstub_clear_breakpoint(unsigned long type, unsigned long addr, unsigned lo
//gdbstub_printk("clear h/w watchpoint 1 type %ld: %08lx\n", type, addr); //gdbstub_printk("clear h/w watchpoint 1 type %ld: %08lx\n", type, addr);
__debug_regs->dcr &= ~(DCR_DRBE1|DCR_DWBE1); __debug_regs->dcr &= ~(DCR_DRBE1|DCR_DWBE1);
__debug_regs->dbar[1] = 0;
__debug_regs->dbmr[1][0] = 0;
__debug_regs->dbmr[1][1] = 0;
__debug_regs->dbdr[1][0] = 0;
__debug_regs->dbdr[1][1] = 0;
asm volatile(" movgs gr0,dbar1 \n" asm volatile(" movgs gr0,dbar1 \n"
" movgs gr0,dbmr10 \n" " movgs gr0,dbmr10 \n"
" movgs gr0,dbmr11 \n" " movgs gr0,dbmr11 \n"
...@@ -1163,7 +1197,7 @@ static void gdbstub_check_breakpoint(void) ...@@ -1163,7 +1197,7 @@ static void gdbstub_check_breakpoint(void)
*/ */
static void __attribute__((unused)) gdbstub_show_regs(void) static void __attribute__((unused)) gdbstub_show_regs(void)
{ {
uint32_t *reg; unsigned long *reg;
int loop; int loop;
gdbstub_printk("\n"); gdbstub_printk("\n");
...@@ -1172,11 +1206,11 @@ static void __attribute__((unused)) gdbstub_show_regs(void) ...@@ -1172,11 +1206,11 @@ static void __attribute__((unused)) gdbstub_show_regs(void)
__debug_frame, __debug_frame,
__debug_frame->psr & PSR_S ? "kernel" : "user"); __debug_frame->psr & PSR_S ? "kernel" : "user");
reg = (uint32_t *) __debug_frame; reg = (unsigned long *) __debug_frame;
for (loop = 0; loop < REG__END; loop++) { for (loop = 0; loop < NR_PT_REGS; loop++) {
printk("%s %08x", regnames[loop + 0], reg[loop + 0]); printk("%s %08lx", regnames[loop + 0], reg[loop + 0]);
if (loop == REG__END - 1 || loop % 5 == 4) if (loop == NR_PT_REGS - 1 || loop % 5 == 4)
printk("\n"); printk("\n");
else else
printk(" | "); printk(" | ");
...@@ -1191,13 +1225,8 @@ static void __attribute__((unused)) gdbstub_show_regs(void) ...@@ -1191,13 +1225,8 @@ static void __attribute__((unused)) gdbstub_show_regs(void)
*/ */
static void __attribute__((unused)) gdbstub_dump_debugregs(void) static void __attribute__((unused)) gdbstub_dump_debugregs(void)
{ {
unsigned long x; gdbstub_printk("DCR %08lx ", __debug_status.dcr);
gdbstub_printk("BRR %08lx\n", __debug_status.brr);
x = __debug_regs->dcr;
gdbstub_printk("DCR %08lx ", x);
x = __debug_regs->brr;
gdbstub_printk("BRR %08lx\n", x);
gdbstub_printk("IBAR0 %08lx ", __get_ibar(0)); gdbstub_printk("IBAR0 %08lx ", __get_ibar(0));
gdbstub_printk("IBAR1 %08lx ", __get_ibar(1)); gdbstub_printk("IBAR1 %08lx ", __get_ibar(1));
...@@ -1360,7 +1389,7 @@ void gdbstub(int sigval) ...@@ -1360,7 +1389,7 @@ void gdbstub(int sigval)
#endif #endif
} }
save_user_regs(&__break_user_context); save_user_regs(&__debug_frame0->uc);
#if 0 #if 0
gdbstub_printk("--> gdbstub() %08x %p %08x %08x\n", gdbstub_printk("--> gdbstub() %08x %p %08x %08x\n",
...@@ -1389,8 +1418,8 @@ void gdbstub(int sigval) ...@@ -1389,8 +1418,8 @@ void gdbstub(int sigval)
__debug_frame->psr &= ~PSR_S; __debug_frame->psr &= ~PSR_S;
if (__debug_frame->psr & PSR_PS) if (__debug_frame->psr & PSR_PS)
__debug_frame->psr |= PSR_S; __debug_frame->psr |= PSR_S;
__debug_regs->brr = (__debug_frame->tbr & TBR_TT) << 12; __debug_status.brr = (__debug_frame->tbr & TBR_TT) << 12;
__debug_regs->brr |= BRR_EB; __debug_status.brr |= BRR_EB;
sigval = SIGINT; sigval = SIGINT;
} }
...@@ -1404,15 +1433,15 @@ void gdbstub(int sigval) ...@@ -1404,15 +1433,15 @@ void gdbstub(int sigval)
__debug_frame->psr &= ~PSR_S; __debug_frame->psr &= ~PSR_S;
if (__debug_frame->psr & PSR_PS) if (__debug_frame->psr & PSR_PS)
__debug_frame->psr |= PSR_S; __debug_frame->psr |= PSR_S;
__debug_regs->brr = (__debug_frame->tbr & TBR_TT) << 12; __debug_status.brr = (__debug_frame->tbr & TBR_TT) << 12;
__debug_regs->brr |= BRR_EB; __debug_status.brr |= BRR_EB;
sigval = SIGXCPU; sigval = SIGXCPU;
} }
LEDS(0x5002); LEDS(0x5002);
/* after a BREAK insn, the PC lands on the far side of it */ /* after a BREAK insn, the PC lands on the far side of it */
if (__debug_regs->brr & BRR_SB) if (__debug_status.brr & BRR_SB)
gdbstub_check_breakpoint(); gdbstub_check_breakpoint();
LEDS(0x5003); LEDS(0x5003);
...@@ -1431,7 +1460,7 @@ void gdbstub(int sigval) ...@@ -1431,7 +1460,7 @@ void gdbstub(int sigval)
} }
if (!sigval) if (!sigval)
sigval = gdbstub_compute_signal(__debug_regs->brr); sigval = gdbstub_compute_signal(__debug_status.brr);
LEDS(0x5004); LEDS(0x5004);
...@@ -1441,7 +1470,7 @@ void gdbstub(int sigval) ...@@ -1441,7 +1470,7 @@ void gdbstub(int sigval)
if (sigval != SIGINT && sigval != SIGTRAP && sigval != SIGILL) { if (sigval != SIGINT && sigval != SIGTRAP && sigval != SIGILL) {
static const char title[] = "Break "; static const char title[] = "Break ";
static const char crlf[] = "\r\n"; static const char crlf[] = "\r\n";
unsigned long brr = __debug_regs->brr; unsigned long brr = __debug_status.brr;
char hx; char hx;
ptr = output_buffer; ptr = output_buffer;
...@@ -1565,28 +1594,24 @@ void gdbstub(int sigval) ...@@ -1565,28 +1594,24 @@ void gdbstub(int sigval)
ptr = mem2hex(&zero, ptr, 4, 0); ptr = mem2hex(&zero, ptr, 4, 0);
for (loop = 1; loop <= 27; loop++) for (loop = 1; loop <= 27; loop++)
ptr = mem2hex((unsigned long *)__debug_frame + REG_GR(loop), ptr = mem2hex(&__debug_user_context->i.gr[loop], ptr, 4, 0);
ptr, 4, 0);
temp = (unsigned long) __frame; temp = (unsigned long) __frame;
ptr = mem2hex(&temp, ptr, 4, 0); ptr = mem2hex(&temp, ptr, 4, 0);
ptr = mem2hex((unsigned long *)__debug_frame + REG_GR(29), ptr, 4, 0); ptr = mem2hex(&__debug_user_context->i.gr[29], ptr, 4, 0);
ptr = mem2hex((unsigned long *)__debug_frame + REG_GR(30), ptr, 4, 0); ptr = mem2hex(&__debug_user_context->i.gr[30], ptr, 4, 0);
#ifdef CONFIG_MMU #ifdef CONFIG_MMU
ptr = mem2hex((unsigned long *)__debug_frame + REG_GR(31), ptr, 4, 0); ptr = mem2hex(&__debug_user_context->i.gr[31], ptr, 4, 0);
#else #else
temp = (unsigned long) __debug_frame; temp = (unsigned long) __debug_frame;
ptr = mem2hex(&temp, ptr, 4, 0); ptr = mem2hex(&temp, ptr, 4, 0);
#endif #endif
for (loop = 32; loop <= 63; loop++) for (loop = 32; loop <= 63; loop++)
ptr = mem2hex((unsigned long *)__debug_frame + REG_GR(loop), ptr = mem2hex(&__debug_user_context->i.gr[loop], ptr, 4, 0);
ptr, 4, 0);
/* deal with FR0-FR63 */ /* deal with FR0-FR63 */
for (loop = 0; loop <= 63; loop++) for (loop = 0; loop <= 63; loop++)
ptr = mem2hex((unsigned long *)&__break_user_context + ptr = mem2hex(&__debug_user_context->f.fr[loop], ptr, 4, 0);
__FPMEDIA_FR(loop),
ptr, 4, 0);
/* deal with special registers */ /* deal with special registers */
ptr = mem2hex(&__debug_frame->pc, ptr, 4, 0); ptr = mem2hex(&__debug_frame->pc, ptr, 4, 0);
...@@ -1597,7 +1622,7 @@ void gdbstub(int sigval) ...@@ -1597,7 +1622,7 @@ void gdbstub(int sigval)
ptr = mem2hex(&zero, ptr, 4, 0); ptr = mem2hex(&zero, ptr, 4, 0);
ptr = mem2hex(&zero, ptr, 4, 0); ptr = mem2hex(&zero, ptr, 4, 0);
ptr = mem2hex(&__debug_frame->tbr, ptr, 4, 0); ptr = mem2hex(&__debug_frame->tbr, ptr, 4, 0);
ptr = mem2hex(&__debug_regs->brr , ptr, 4, 0); ptr = mem2hex(&__debug_status.brr , ptr, 4, 0);
asm volatile("movsg dbar0,%0" : "=r"(dbar)); asm volatile("movsg dbar0,%0" : "=r"(dbar));
ptr = mem2hex(&dbar, ptr, 4, 0); ptr = mem2hex(&dbar, ptr, 4, 0);
...@@ -1622,21 +1647,21 @@ void gdbstub(int sigval) ...@@ -1622,21 +1647,21 @@ void gdbstub(int sigval)
ptr = mem2hex(&__debug_frame->iacc0, ptr, 8, 0); ptr = mem2hex(&__debug_frame->iacc0, ptr, 8, 0);
ptr = mem2hex(&__break_user_context.f.fsr[0], ptr, 4, 0); ptr = mem2hex(&__debug_user_context->f.fsr[0], ptr, 4, 0);
for (loop = 0; loop <= 7; loop++) for (loop = 0; loop <= 7; loop++)
ptr = mem2hex(&__break_user_context.f.acc[loop], ptr, 4, 0); ptr = mem2hex(&__debug_user_context->f.acc[loop], ptr, 4, 0);
ptr = mem2hex(&__break_user_context.f.accg, ptr, 8, 0); ptr = mem2hex(&__debug_user_context->f.accg, ptr, 8, 0);
for (loop = 0; loop <= 1; loop++) for (loop = 0; loop <= 1; loop++)
ptr = mem2hex(&__break_user_context.f.msr[loop], ptr, 4, 0); ptr = mem2hex(&__debug_user_context->f.msr[loop], ptr, 4, 0);
ptr = mem2hex(&__debug_frame->gner0, ptr, 4, 0); ptr = mem2hex(&__debug_frame->gner0, ptr, 4, 0);
ptr = mem2hex(&__debug_frame->gner1, ptr, 4, 0); ptr = mem2hex(&__debug_frame->gner1, ptr, 4, 0);
ptr = mem2hex(&__break_user_context.f.fner[0], ptr, 4, 0); ptr = mem2hex(&__debug_user_context->f.fner[0], ptr, 4, 0);
ptr = mem2hex(&__break_user_context.f.fner[1], ptr, 4, 0); ptr = mem2hex(&__debug_user_context->f.fner[1], ptr, 4, 0);
break; break;
...@@ -1648,8 +1673,7 @@ void gdbstub(int sigval) ...@@ -1648,8 +1673,7 @@ void gdbstub(int sigval)
ptr = hex2mem(ptr, &temp, 4); ptr = hex2mem(ptr, &temp, 4);
for (loop = 1; loop <= 27; loop++) for (loop = 1; loop <= 27; loop++)
ptr = hex2mem(ptr, (unsigned long *)__debug_frame + REG_GR(loop), ptr = hex2mem(ptr, &__debug_user_context->i.gr[loop], 4);
4);
ptr = hex2mem(ptr, &temp, 4); ptr = hex2mem(ptr, &temp, 4);
__frame = (struct pt_regs *) temp; __frame = (struct pt_regs *) temp;
...@@ -1662,14 +1686,11 @@ void gdbstub(int sigval) ...@@ -1662,14 +1686,11 @@ void gdbstub(int sigval)
#endif #endif
for (loop = 32; loop <= 63; loop++) for (loop = 32; loop <= 63; loop++)
ptr = hex2mem(ptr, (unsigned long *)__debug_frame + REG_GR(loop), ptr = hex2mem(ptr, &__debug_user_context->i.gr[loop], 4);
4);
/* deal with FR0-FR63 */ /* deal with FR0-FR63 */
for (loop = 0; loop <= 63; loop++) for (loop = 0; loop <= 63; loop++)
ptr = mem2hex((unsigned long *)&__break_user_context + ptr = mem2hex(&__debug_user_context->f.fr[loop], ptr, 4, 0);
__FPMEDIA_FR(loop),
ptr, 4, 0);
/* deal with special registers */ /* deal with special registers */
ptr = hex2mem(ptr, &__debug_frame->pc, 4); ptr = hex2mem(ptr, &__debug_frame->pc, 4);
...@@ -1694,21 +1715,21 @@ void gdbstub(int sigval) ...@@ -1694,21 +1715,21 @@ void gdbstub(int sigval)
ptr = hex2mem(ptr, &__debug_frame->iacc0, 8); ptr = hex2mem(ptr, &__debug_frame->iacc0, 8);
ptr = hex2mem(ptr, &__break_user_context.f.fsr[0], 4); ptr = hex2mem(ptr, &__debug_user_context->f.fsr[0], 4);
for (loop = 0; loop <= 7; loop++) for (loop = 0; loop <= 7; loop++)
ptr = hex2mem(ptr, &__break_user_context.f.acc[loop], 4); ptr = hex2mem(ptr, &__debug_user_context->f.acc[loop], 4);
ptr = hex2mem(ptr, &__break_user_context.f.accg, 8); ptr = hex2mem(ptr, &__debug_user_context->f.accg, 8);
for (loop = 0; loop <= 1; loop++) for (loop = 0; loop <= 1; loop++)
ptr = hex2mem(ptr, &__break_user_context.f.msr[loop], 4); ptr = hex2mem(ptr, &__debug_user_context->f.msr[loop], 4);
ptr = hex2mem(ptr, &__debug_frame->gner0, 4); ptr = hex2mem(ptr, &__debug_frame->gner0, 4);
ptr = hex2mem(ptr, &__debug_frame->gner1, 4); ptr = hex2mem(ptr, &__debug_frame->gner1, 4);
ptr = hex2mem(ptr, &__break_user_context.f.fner[0], 4); ptr = hex2mem(ptr, &__debug_user_context->f.fner[0], 4);
ptr = hex2mem(ptr, &__break_user_context.f.fner[1], 4); ptr = hex2mem(ptr, &__debug_user_context->f.fner[1], 4);
gdbstub_strcpy(output_buffer,"OK"); gdbstub_strcpy(output_buffer,"OK");
break; break;
...@@ -1769,52 +1790,52 @@ void gdbstub(int sigval) ...@@ -1769,52 +1790,52 @@ void gdbstub(int sigval)
case GDB_REG_GR(0): case GDB_REG_GR(0):
break; break;
case GDB_REG_GR(1) ... GDB_REG_GR(63): case GDB_REG_GR(1) ... GDB_REG_GR(63):
__break_user_context.i.gr[addr - GDB_REG_GR(0)] = temp; __debug_user_context->i.gr[addr - GDB_REG_GR(0)] = temp;
break; break;
case GDB_REG_FR(0) ... GDB_REG_FR(63): case GDB_REG_FR(0) ... GDB_REG_FR(63):
__break_user_context.f.fr[addr - GDB_REG_FR(0)] = temp; __debug_user_context->f.fr[addr - GDB_REG_FR(0)] = temp;
break; break;
case GDB_REG_PC: case GDB_REG_PC:
__break_user_context.i.pc = temp; __debug_user_context->i.pc = temp;
break; break;
case GDB_REG_PSR: case GDB_REG_PSR:
__break_user_context.i.psr = temp; __debug_user_context->i.psr = temp;
break; break;
case GDB_REG_CCR: case GDB_REG_CCR:
__break_user_context.i.ccr = temp; __debug_user_context->i.ccr = temp;
break; break;
case GDB_REG_CCCR: case GDB_REG_CCCR:
__break_user_context.i.cccr = temp; __debug_user_context->i.cccr = temp;
break; break;
case GDB_REG_BRR: case GDB_REG_BRR:
__debug_regs->brr = temp; __debug_status.brr = temp;
break; break;
case GDB_REG_LR: case GDB_REG_LR:
__break_user_context.i.lr = temp; __debug_user_context->i.lr = temp;
break; break;
case GDB_REG_LCR: case GDB_REG_LCR:
__break_user_context.i.lcr = temp; __debug_user_context->i.lcr = temp;
break; break;
case GDB_REG_FSR0: case GDB_REG_FSR0:
__break_user_context.f.fsr[0] = temp; __debug_user_context->f.fsr[0] = temp;
break; break;
case GDB_REG_ACC(0) ... GDB_REG_ACC(7): case GDB_REG_ACC(0) ... GDB_REG_ACC(7):
__break_user_context.f.acc[addr - GDB_REG_ACC(0)] = temp; __debug_user_context->f.acc[addr - GDB_REG_ACC(0)] = temp;
break; break;
case GDB_REG_ACCG(0): case GDB_REG_ACCG(0):
*(uint32_t *) &__break_user_context.f.accg[0] = temp; *(uint32_t *) &__debug_user_context->f.accg[0] = temp;
break; break;
case GDB_REG_ACCG(4): case GDB_REG_ACCG(4):
*(uint32_t *) &__break_user_context.f.accg[4] = temp; *(uint32_t *) &__debug_user_context->f.accg[4] = temp;
break; break;
case GDB_REG_MSR(0) ... GDB_REG_MSR(1): case GDB_REG_MSR(0) ... GDB_REG_MSR(1):
__break_user_context.f.msr[addr - GDB_REG_MSR(0)] = temp; __debug_user_context->f.msr[addr - GDB_REG_MSR(0)] = temp;
break; break;
case GDB_REG_GNER(0) ... GDB_REG_GNER(1): case GDB_REG_GNER(0) ... GDB_REG_GNER(1):
__break_user_context.i.gner[addr - GDB_REG_GNER(0)] = temp; __debug_user_context->i.gner[addr - GDB_REG_GNER(0)] = temp;
break; break;
case GDB_REG_FNER(0) ... GDB_REG_FNER(1): case GDB_REG_FNER(0) ... GDB_REG_FNER(1):
__break_user_context.f.fner[addr - GDB_REG_FNER(0)] = temp; __debug_user_context->f.fner[addr - GDB_REG_FNER(0)] = temp;
break; break;
default: default:
temp2 = 0; temp2 = 0;
...@@ -1850,6 +1871,7 @@ void gdbstub(int sigval) ...@@ -1850,6 +1871,7 @@ void gdbstub(int sigval)
/* step to next instruction */ /* step to next instruction */
case 's': case 's':
__debug_regs->dcr |= DCR_SE; __debug_regs->dcr |= DCR_SE;
__debug_status.dcr |= DCR_SE;
goto done; goto done;
/* set baud rate (bBB) */ /* set baud rate (bBB) */
...@@ -1934,7 +1956,7 @@ void gdbstub(int sigval) ...@@ -1934,7 +1956,7 @@ void gdbstub(int sigval)
} }
done: done:
restore_user_regs(&__break_user_context); restore_user_regs(&__debug_frame0->uc);
//gdbstub_dump_debugregs(); //gdbstub_dump_debugregs();
//gdbstub_printk("<-- gdbstub() %08x\n", __debug_frame->pc); //gdbstub_printk("<-- gdbstub() %08x\n", __debug_frame->pc);
...@@ -1966,7 +1988,6 @@ void __init gdbstub_init(void) ...@@ -1966,7 +1988,6 @@ void __init gdbstub_init(void)
#endif #endif
gdbstub_printk("%s", gdbstub_banner); gdbstub_printk("%s", gdbstub_banner);
gdbstub_printk("DCR: %x\n", __debug_regs->dcr);
gdbstub_io_init(); gdbstub_io_init();
......
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#include <linux/threads.h> #include <linux/threads.h>
#include <linux/linkage.h> #include <linux/linkage.h>
#include <asm/thread_info.h>
#include <asm/ptrace.h> #include <asm/ptrace.h>
#include <asm/page.h> #include <asm/page.h>
#include <asm/spr-regs.h> #include <asm/spr-regs.h>
......
...@@ -26,6 +26,7 @@ ...@@ -26,6 +26,7 @@
#include <linux/reboot.h> #include <linux/reboot.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <asm/asm-offsets.h>
#include <asm/uaccess.h> #include <asm/uaccess.h>
#include <asm/system.h> #include <asm/system.h>
#include <asm/setup.h> #include <asm/setup.h>
...@@ -207,7 +208,7 @@ int copy_thread(int nr, unsigned long clone_flags, ...@@ -207,7 +208,7 @@ int copy_thread(int nr, unsigned long clone_flags,
regs0 = __kernel_frame0_ptr; regs0 = __kernel_frame0_ptr;
childregs0 = (struct pt_regs *) childregs0 = (struct pt_regs *)
(task_stack_page(p) + THREAD_SIZE - USER_CONTEXT_SIZE); (task_stack_page(p) + THREAD_SIZE - FRV_FRAME0_SIZE);
childregs = childregs0; childregs = childregs0;
/* set up the userspace frame (the only place that the USP is stored) */ /* set up the userspace frame (the only place that the USP is stored) */
......
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
# 2 of the License, or (at your option) any later version. # 2 of the License, or (at your option) any later version.
# #
############################################################################### ###############################################################################
#include <linux/linkage.h> #include <linux/linkage.h>
#include <asm/thread_info.h> #include <asm/thread_info.h>
#include <asm/processor.h> #include <asm/processor.h>
...@@ -30,7 +31,7 @@ ...@@ -30,7 +31,7 @@
# address of frame 0 (userspace) on current kernel stack # address of frame 0 (userspace) on current kernel stack
.globl __kernel_frame0_ptr .globl __kernel_frame0_ptr
__kernel_frame0_ptr: __kernel_frame0_ptr:
.long init_thread_union + THREAD_SIZE - USER_CONTEXT_SIZE .long init_thread_union + THREAD_SIZE - FRV_FRAME0_SIZE
# address of current task # address of current task
.globl __kernel_current_task .globl __kernel_current_task
......
...@@ -20,6 +20,7 @@ ...@@ -20,6 +20,7 @@
#include <linux/init.h> #include <linux/init.h>
#include <linux/module.h> #include <linux/module.h>
#include <asm/asm-offsets.h>
#include <asm/setup.h> #include <asm/setup.h>
#include <asm/fpu.h> #include <asm/fpu.h>
#include <asm/system.h> #include <asm/system.h>
...@@ -279,20 +280,20 @@ static const char *regnames[] = { ...@@ -279,20 +280,20 @@ static const char *regnames[] = {
void show_regs(struct pt_regs *regs) void show_regs(struct pt_regs *regs)
{ {
uint32_t *reg; unsigned long *reg;
int loop; int loop;
printk("\n"); printk("\n");
printk("Frame: @%08x [%s]\n", printk("Frame: @%08lx [%s]\n",
(uint32_t) regs, (unsigned long) regs,
regs->psr & PSR_S ? "kernel" : "user"); regs->psr & PSR_S ? "kernel" : "user");
reg = (uint32_t *) regs; reg = (unsigned long *) regs;
for (loop = 0; loop < REG__END; loop++) { for (loop = 0; loop < NR_PT_REGS; loop++) {
printk("%s %08x", regnames[loop + 0], reg[loop + 0]); printk("%s %08lx", regnames[loop + 0], reg[loop + 0]);
if (loop == REG__END - 1 || loop % 5 == 4) if (loop == NR_PT_REGS - 1 || loop % 5 == 4)
printk("\n"); printk("\n");
else else
printk(" | "); printk(" | ");
...@@ -328,7 +329,7 @@ void die_if_kernel(const char *str, ...) ...@@ -328,7 +329,7 @@ void die_if_kernel(const char *str, ...)
*/ */
static void show_backtrace_regs(struct pt_regs *frame) static void show_backtrace_regs(struct pt_regs *frame)
{ {
uint32_t *reg; unsigned long *reg;
int loop; int loop;
/* print the registers for this frame */ /* print the registers for this frame */
...@@ -336,11 +337,11 @@ static void show_backtrace_regs(struct pt_regs *frame) ...@@ -336,11 +337,11 @@ static void show_backtrace_regs(struct pt_regs *frame)
frame->psr & PSR_S ? "Kernel Mode" : "User Mode", frame->psr & PSR_S ? "Kernel Mode" : "User Mode",
frame); frame);
reg = (uint32_t *) frame; reg = (unsigned long *) frame;
for (loop = 0; loop < REG__END; loop++) { for (loop = 0; loop < NR_PT_REGS; loop++) {
printk("%s %08x", regnames[loop + 0], reg[loop + 0]); printk("%s %08lx", regnames[loop + 0], reg[loop + 0]);
if (loop == REG__END - 1 || loop % 5 == 4) if (loop == NR_PT_REGS - 1 || loop % 5 == 4)
printk("\n"); printk("\n");
else else
printk(" | "); printk(" | ");
......
...@@ -89,6 +89,7 @@ extern void gdbstub_do_rx(void); ...@@ -89,6 +89,7 @@ extern void gdbstub_do_rx(void);
extern asmlinkage void __debug_stub_init_break(void); extern asmlinkage void __debug_stub_init_break(void);
extern asmlinkage void __break_hijack_kernel_event(void); extern asmlinkage void __break_hijack_kernel_event(void);
extern asmlinkage void __break_hijack_kernel_event_breaks_here(void);
extern asmlinkage void start_kernel(void); extern asmlinkage void start_kernel(void);
extern asmlinkage void gdbstub_rx_handler(void); extern asmlinkage void gdbstub_rx_handler(void);
...@@ -114,5 +115,26 @@ extern void console_set_baud(unsigned baud); ...@@ -114,5 +115,26 @@ extern void console_set_baud(unsigned baud);
#define gdbstub_proto(FMT,...) ({ 0; }) #define gdbstub_proto(FMT,...) ({ 0; })
#endif #endif
/*
* we dedicate GR31 to keeping a pointer to the gdbstub exception frame
* - gr31 is destroyed on entry to the gdbstub if !MMU
* - gr31 is saved in scr3 on entry to the gdbstub if in !MMU
*/
register struct frv_frame0 *__debug_frame0 asm("gr31");
#define __debug_frame (&__debug_frame0->regs)
#define __debug_user_context (&__debug_frame0->uc)
#define __debug_regs (&__debug_frame0->debug)
#define __debug_reg(X) ((unsigned long *) ((unsigned long) &__debug_frame0 + (X)))
struct frv_debug_status {
unsigned long bpsr;
unsigned long dcr;
unsigned long brr;
unsigned long nmar;
};
extern struct frv_debug_status __debug_status;
#endif /* _LANGUAGE_ASSEMBLY */ #endif /* _LANGUAGE_ASSEMBLY */
#endif /* __ASM_GDB_STUB_H */ #endif /* __ASM_GDB_STUB_H */
...@@ -62,18 +62,10 @@ ...@@ -62,18 +62,10 @@
#ifndef __ASSEMBLY__ #ifndef __ASSEMBLY__
/* /*
* dedicate GR28; to keeping the a pointer to the current exception frame * we dedicate GR28 to keeping a pointer to the current exception frame
* - gr28 is destroyed on entry to the kernel from userspace
*/ */
register struct pt_regs *__frame asm("gr28"); register struct pt_regs *__frame asm("gr28");
register struct pt_regs *__debug_frame asm("gr31");
#ifndef container_of
#define container_of(ptr, type, member) ({ \
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
(type *)( (char *)__mptr - offsetof(type,member) );})
#endif
#define __debug_regs container_of(__debug_frame, struct pt_debug_regs, normal_regs)
#define user_mode(regs) (!((regs)->psr & PSR_S)) #define user_mode(regs) (!((regs)->psr & PSR_S))
#define instruction_pointer(regs) ((regs)->pc) #define instruction_pointer(regs) ((regs)->pc)
......
...@@ -23,7 +23,13 @@ ...@@ -23,7 +23,13 @@
* *
* +0x2000 +---------------------- * +0x2000 +----------------------
* | union { * | union {
* | struct user_context * | struct frv_frame0 {
* | struct user_context {
* | struct user_int_regs
* | struct user_fpmedia_regs
* | }
* | struct frv_debug_regs
* | }
* | struct pt_regs [user exception] * | struct pt_regs [user exception]
* | } * | }
* +---------------------- <-- __kernel_frame0_ptr (maybe GR28) * +---------------------- <-- __kernel_frame0_ptr (maybe GR28)
...@@ -51,11 +57,11 @@ ...@@ -51,11 +57,11 @@
#define _ASM_REGISTERS_H #define _ASM_REGISTERS_H
#ifndef __ASSEMBLY__ #ifndef __ASSEMBLY__
#define __OFFSET(X) (X) #define __OFFSET(X,N) ((X)+(N)*4)
#define __OFFSETC(X,N) xxxxxxxxxxxxxxxxxxxxxxxx #define __OFFSETC(X,N) xxxxxxxxxxxxxxxxxxxxxxxx
#else #else
#define __OFFSET(X) ((X)*4) #define __OFFSET(X,N) ((X)+(N)*4)
#define __OFFSETC(X,N) ((X)*4+(N)) #define __OFFSETC(X,N) ((X)+(N))
#endif #endif
/*****************************************************************************/ /*****************************************************************************/
...@@ -117,30 +123,13 @@ struct pt_regs { ...@@ -117,30 +123,13 @@ struct pt_regs {
#endif #endif
#define REG_PSR __OFFSET( 0) /* Processor Status Register */
#define REG_ISR __OFFSET( 1) /* Integer Status Register */
#define REG_CCR __OFFSET( 2) /* Condition Code Register */
#define REG_CCCR __OFFSET( 3) /* Condition Code for Conditional Insns Register */
#define REG_LR __OFFSET( 4) /* Link Register */
#define REG_LCR __OFFSET( 5) /* Loop Count Register */
#define REG_PC __OFFSET( 6) /* Program Counter */
#define REG__STATUS __OFFSET( 7) /* exception status */
#define REG__STATUS_STEP 0x00000001 /* - reenable single stepping on return */ #define REG__STATUS_STEP 0x00000001 /* - reenable single stepping on return */
#define REG__STATUS_STEPPED 0x00000002 /* - single step caused exception */ #define REG__STATUS_STEPPED 0x00000002 /* - single step caused exception */
#define REG__STATUS_BROKE 0x00000004 /* - BREAK insn caused exception */ #define REG__STATUS_BROKE 0x00000004 /* - BREAK insn caused exception */
#define REG__STATUS_SYSC_ENTRY 0x40000000 /* - T on syscall entry (ptrace.c only) */ #define REG__STATUS_SYSC_ENTRY 0x40000000 /* - T on syscall entry (ptrace.c only) */
#define REG__STATUS_SYSC_EXIT 0x80000000 /* - T on syscall exit (ptrace.c only) */ #define REG__STATUS_SYSC_EXIT 0x80000000 /* - T on syscall exit (ptrace.c only) */
#define REG_SYSCALLNO __OFFSET( 8) /* syscall number or -1 */ #define REG_GR(R) __OFFSET(REG_GR0, (R))
#define REG_ORIG_GR8 __OFFSET( 9) /* saved GR8 for signal handling */
#define REG_GNER0 __OFFSET(10)
#define REG_GNER1 __OFFSET(11)
#define REG_IACC0 __OFFSET(12)
#define REG_TBR __OFFSET(14) /* Trap Vector Register */
#define REG_GR(R) __OFFSET((14+(R)))
#define REG__END REG_GR(32)
#define REG_SP REG_GR(1) #define REG_SP REG_GR(1)
#define REG_FP REG_GR(2) #define REG_FP REG_GR(2)
...@@ -149,27 +138,21 @@ struct pt_regs { ...@@ -149,27 +138,21 @@ struct pt_regs {
/*****************************************************************************/ /*****************************************************************************/
/* /*
* extension tacked in front of the exception frame in debug mode * debugging registers
*/ */
#ifndef __ASSEMBLY__ #ifndef __ASSEMBLY__
struct pt_debug_regs struct frv_debug_regs
{ {
unsigned long bpsr;
unsigned long dcr; unsigned long dcr;
unsigned long brr; unsigned long ibar[4] __attribute__((aligned(8)));
unsigned long nmar; unsigned long dbar[4] __attribute__((aligned(8)));
struct pt_regs normal_regs; unsigned long dbdr[4][4] __attribute__((aligned(8)));
unsigned long dbmr[4][4] __attribute__((aligned(8)));
} __attribute__((aligned(8))); } __attribute__((aligned(8)));
#endif #endif
#define REG_NMAR __OFFSET(-1)
#define REG_BRR __OFFSET(-2)
#define REG_DCR __OFFSET(-3)
#define REG_BPSR __OFFSET(-4)
#define REG__DEBUG_XTRA __OFFSET(4)
/*****************************************************************************/ /*****************************************************************************/
/* /*
* userspace registers * userspace registers
...@@ -223,33 +206,27 @@ struct user_context ...@@ -223,33 +206,27 @@ struct user_context
void *extension; void *extension;
} __attribute__((aligned(8))); } __attribute__((aligned(8)));
struct frv_frame0 {
union {
struct pt_regs regs;
struct user_context uc;
};
struct frv_debug_regs debug;
} __attribute__((aligned(32)));
#endif #endif
#define NR_USER_INT_REGS (14 + 64) #define __INT_GR(R) __OFFSET(__INT_GR0, (R))
#define NR_USER_FPMEDIA_REGS (64 + 2 + 2 + 8 + 8/4 + 1)
#define NR_USER_CONTEXT (NR_USER_INT_REGS + NR_USER_FPMEDIA_REGS + 1) #define __FPMEDIA_FR(R) __OFFSET(__FPMEDIA_FR0, (R))
#define __FPMEDIA_FNER(R) __OFFSET(__FPMEDIA_FNER0, (R))
#define USER_CONTEXT_SIZE (((NR_USER_CONTEXT + 1) & ~1) * 4) #define __FPMEDIA_MSR(R) __OFFSET(__FPMEDIA_MSR0, (R))
#define __FPMEDIA_ACC(R) __OFFSET(__FPMEDIA_ACC0, (R))
#define __THREAD_FRAME __OFFSET(0) #define __FPMEDIA_ACCG(R) __OFFSETC(__FPMEDIA_ACCG0, (R))
#define __THREAD_CURR __OFFSET(1) #define __FPMEDIA_FSR(R) __OFFSET(__FPMEDIA_FSR0, (R))
#define __THREAD_SP __OFFSET(2)
#define __THREAD_FP __OFFSET(3) #define __THREAD_GR(R) __OFFSET(__THREAD_GR16, (R) - 16)
#define __THREAD_LR __OFFSET(4)
#define __THREAD_PC __OFFSET(5)
#define __THREAD_GR(R) __OFFSET(6 + (R) - 16)
#define __THREAD_FRAME0 __OFFSET(19)
#define __THREAD_USER __OFFSET(19)
#define __USER_INT __OFFSET(0)
#define __INT_GR(R) __OFFSET(14 + (R))
#define __USER_FPMEDIA __OFFSET(NR_USER_INT_REGS)
#define __FPMEDIA_FR(R) __OFFSET(NR_USER_INT_REGS + (R))
#define __FPMEDIA_FNER(R) __OFFSET(NR_USER_INT_REGS + 64 + (R))
#define __FPMEDIA_MSR(R) __OFFSET(NR_USER_INT_REGS + 66 + (R))
#define __FPMEDIA_ACC(R) __OFFSET(NR_USER_INT_REGS + 68 + (R))
#define __FPMEDIA_ACCG(R) __OFFSETC(NR_USER_INT_REGS + 76, (R))
#define __FPMEDIA_FSR(R) __OFFSET(NR_USER_INT_REGS + 78 + (R))
#endif /* _ASM_REGISTERS_H */ #endif /* _ASM_REGISTERS_H */
...@@ -19,6 +19,8 @@ ...@@ -19,6 +19,8 @@
#include <asm/processor.h> #include <asm/processor.h>
#endif #endif
#define THREAD_SIZE 8192
/* /*
* low level task data that entry.S needs immediate access to * low level task data that entry.S needs immediate access to
* - this struct should fit entirely inside of one cache line * - this struct should fit entirely inside of one cache line
...@@ -46,15 +48,7 @@ struct thread_info { ...@@ -46,15 +48,7 @@ struct thread_info {
#else /* !__ASSEMBLY__ */ #else /* !__ASSEMBLY__ */
/* offsets into the thread_info struct for assembly code access */ #include <asm/asm-offsets.h>
#define TI_TASK 0x00000000
#define TI_EXEC_DOMAIN 0x00000004
#define TI_FLAGS 0x00000008
#define TI_STATUS 0x0000000C
#define TI_CPU 0x00000010
#define TI_PRE_COUNT 0x00000014
#define TI_ADDR_LIMIT 0x00000018
#define TI_RESTART_BLOCK 0x0000001C
#endif #endif
...@@ -83,12 +77,6 @@ struct thread_info { ...@@ -83,12 +77,6 @@ struct thread_info {
#define init_thread_info (init_thread_union.thread_info) #define init_thread_info (init_thread_union.thread_info)
#define init_stack (init_thread_union.stack) #define init_stack (init_thread_union.stack)
#ifdef CONFIG_SMALL_TASKS
#define THREAD_SIZE 4096
#else
#define THREAD_SIZE 8192
#endif
/* how to get the thread information struct from C */ /* how to get the thread information struct from C */
register struct thread_info *__current_thread_info asm("gr15"); register struct thread_info *__current_thread_info asm("gr15");
...@@ -111,11 +99,7 @@ register struct thread_info *__current_thread_info asm("gr15"); ...@@ -111,11 +99,7 @@ register struct thread_info *__current_thread_info asm("gr15");
#define free_thread_info(info) kfree(info) #define free_thread_info(info) kfree(info)
#else /* !__ASSEMBLY__ */ #endif /* __ASSEMBLY__ */
#define THREAD_SIZE 8192
#endif
/* /*
* thread information flags * thread information flags
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment