|
@@ -153,6 +153,12 @@ static int xmon_trace[NR_CPUS];
|
|
#define SSTEP 1 /* stepping because of 's' command */
|
|
#define SSTEP 1 /* stepping because of 's' command */
|
|
#define BRSTEP 2 /* stepping over breakpoint */
|
|
#define BRSTEP 2 /* stepping over breakpoint */
|
|
|
|
|
|
|
|
+#ifdef CONFIG_4xx
|
|
|
|
+#define MSR_SSTEP_ENABLE 0x200
|
|
|
|
+#else
|
|
|
|
+#define MSR_SSTEP_ENABLE 0x400
|
|
|
|
+#endif
|
|
|
|
+
|
|
static struct pt_regs *xmon_regs[NR_CPUS];
|
|
static struct pt_regs *xmon_regs[NR_CPUS];
|
|
|
|
|
|
extern inline void sync(void)
|
|
extern inline void sync(void)
|
|
@@ -211,6 +217,14 @@ static void get_tb(unsigned *p)
|
|
p[1] = lo;
|
|
p[1] = lo;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static inline void xmon_enable_sstep(struct pt_regs *regs)
|
|
|
|
+{
|
|
|
|
+ regs->msr |= MSR_SSTEP_ENABLE;
|
|
|
|
+#ifdef CONFIG_4xx
|
|
|
|
+ mtspr(SPRN_DBCR0, mfspr(SPRN_DBCR0) | DBCR0_IC | DBCR0_IDM);
|
|
|
|
+#endif
|
|
|
|
+}
|
|
|
|
+
|
|
int xmon(struct pt_regs *excp)
|
|
int xmon(struct pt_regs *excp)
|
|
{
|
|
{
|
|
struct pt_regs regs;
|
|
struct pt_regs regs;
|
|
@@ -254,10 +268,10 @@ int xmon(struct pt_regs *excp)
|
|
cmd = cmds(excp);
|
|
cmd = cmds(excp);
|
|
if (cmd == 's') {
|
|
if (cmd == 's') {
|
|
xmon_trace[smp_processor_id()] = SSTEP;
|
|
xmon_trace[smp_processor_id()] = SSTEP;
|
|
- excp->msr |= 0x400;
|
|
|
|
|
|
+ xmon_enable_sstep(excp);
|
|
} else if (at_breakpoint(excp->nip)) {
|
|
} else if (at_breakpoint(excp->nip)) {
|
|
xmon_trace[smp_processor_id()] = BRSTEP;
|
|
xmon_trace[smp_processor_id()] = BRSTEP;
|
|
- excp->msr |= 0x400;
|
|
|
|
|
|
+ xmon_enable_sstep(excp);
|
|
} else {
|
|
} else {
|
|
xmon_trace[smp_processor_id()] = 0;
|
|
xmon_trace[smp_processor_id()] = 0;
|
|
insert_bpts();
|
|
insert_bpts();
|
|
@@ -298,7 +312,7 @@ xmon_bpt(struct pt_regs *regs)
|
|
remove_bpts();
|
|
remove_bpts();
|
|
excprint(regs);
|
|
excprint(regs);
|
|
xmon_trace[smp_processor_id()] = BRSTEP;
|
|
xmon_trace[smp_processor_id()] = BRSTEP;
|
|
- regs->msr |= 0x400;
|
|
|
|
|
|
+ xmon_enable_sstep(regs);
|
|
} else {
|
|
} else {
|
|
xmon(regs);
|
|
xmon(regs);
|
|
}
|
|
}
|
|
@@ -385,7 +399,7 @@ insert_bpts(void)
|
|
}
|
|
}
|
|
store_inst((void *) bp->address);
|
|
store_inst((void *) bp->address);
|
|
}
|
|
}
|
|
-#if !defined(CONFIG_8xx)
|
|
|
|
|
|
+#if ! (defined(CONFIG_8xx) || defined(CONFIG_4xx))
|
|
if (dabr.enabled)
|
|
if (dabr.enabled)
|
|
set_dabr(dabr.address);
|
|
set_dabr(dabr.address);
|
|
if (iabr.enabled)
|
|
if (iabr.enabled)
|
|
@@ -400,7 +414,7 @@ remove_bpts(void)
|
|
struct bpt *bp;
|
|
struct bpt *bp;
|
|
unsigned instr;
|
|
unsigned instr;
|
|
|
|
|
|
-#if !defined(CONFIG_8xx)
|
|
|
|
|
|
+#if ! (defined(CONFIG_8xx) || defined(CONFIG_4xx))
|
|
set_dabr(0);
|
|
set_dabr(0);
|
|
set_iabr(0);
|
|
set_iabr(0);
|
|
#endif
|
|
#endif
|
|
@@ -677,7 +691,7 @@ bpt_cmds(void)
|
|
|
|
|
|
cmd = inchar();
|
|
cmd = inchar();
|
|
switch (cmd) {
|
|
switch (cmd) {
|
|
-#if !defined(CONFIG_8xx)
|
|
|
|
|
|
+#if ! (defined(CONFIG_8xx) || defined(CONFIG_4xx))
|
|
case 'd':
|
|
case 'd':
|
|
mode = 7;
|
|
mode = 7;
|
|
cmd = inchar();
|
|
cmd = inchar();
|