Hello, I have made som changes on kernel 2.4.18 to get access to the Debug Registers on a MPC855. Please apply and let me know whether the kernel runs stable or not. I need this support for the gdb to set Hardware Breakpoints on a MPC855 target.
Thank you --- /linux/arch/ppc/kernel/entry.S.orig 2005-01-25 14:20:17.269216024 +0100 +++ /linux/arch/ppc/kernel/entry.S 2005-01-25 14:27:22.440580152 +0100 @@ -294,6 +294,27 @@ stw r20,_CCR(r1) stw r22,_CTR(r1) stw r23,_XER(r1) + + mfspr r23,CMPA + stw r23,_CMPA(r1) + mfspr r23,CMPB + stw r23,_CMPB(r1) + mfspr r23,CMPC + stw r23,_CMPC(r1) + mfspr r23,CMPD + stw r23,_CMPD(r1) + mfspr r23,CMPE + stw r23,_CMPE(r1) + mfspr r23,CMPF + stw r23,_CMPF(r1) + mfspr r23,CMPG + stw r23,_CMPG(r1) + mfspr r23,CMPH + stw r23,_CMPH(r1) + + mfspr r23,ICTRL + stw r23,_ICTRL(r1) + li r0,0x0ff0 stw r0,TRAP(r1) stw r1,KSP(r3) /* Set old stack pointer */ @@ -419,6 +440,27 @@ restore: lwz r3,_XER(r1) mtspr XER,r3 + + lwz r3,_CMPA(r1) + mtspr CMPA,r3 + lwz r3,_CMPB(r1) + mtspr CMPB,r3 + lwz r3,_CMPC(r1) + mtspr CMPC,r3 + lwz r3,_CMPD(r1) + mtspr CMPD,r3 + lwz r3,_CMPE(r1) + mtspr CMPE,r3 + lwz r3,_CMPF(r1) + mtspr CMPF,r3 + lwz r3,_CMPG(r1) + mtspr CMPG,r3 + lwz r3,_CMPH(r1) + mtspr CMPH,r3 + + lwz r3,_ICTRL(r1) + mtspr ICTRL,r3 + REST_10GPRS(9,r1) REST_10GPRS(19,r1) REST_2GPRS(29,r1) --- /linux/arch/ppc/kernel/head_8xx.S.orig 2005-01-25 14:22:39.591579736 +0100 +++ /linux/arch/ppc/kernel/head_8xx.S 2005-01-25 14:27:43.950310176 +0100 @@ -136,6 +136,24 @@ stw r22,_CTR(r21); \ mfspr r20,XER; \ stw r20,_XER(r21); \ + mfspr r20,CMPA; \ + stw r20,_CMPA(r21); \ + mfspr r20,CMPB; \ + stw r20,_CMPB(r21); \ + mfspr r20,CMPC; \ + stw r20,_CMPC(r21); \ + mfspr r20,CMPD; \ + stw r20,_CMPD(r21); \ + mfspr r20,CMPE; \ + stw r20,_CMPE(r21); \ + mfspr r20,CMPF; \ + stw r20,_CMPF(r21); \ + mfspr r20,CMPG; \ + stw r20,_CMPG(r21); \ + mfspr r20,CMPH; \ + stw r20,_CMPH(r21); \ + mfspr r20,ICTRL; \ + stw r20,_ICTRL(r21);\ mfspr r22,SRR0; \ mfspr r23,SRR1; \ stw r0,GPR0(r21); \ @@ -630,7 +648,7 @@ * using them. */ STD_EXCEPTION(0x1c00, Trap_1c, UnknownException) - STD_EXCEPTION(0x1d00, Trap_1d, UnknownException) + STD_EXCEPTION(0x1d00, Trap_1d, InstructionBreakpoint) STD_EXCEPTION(0x1e00, Trap_1e, UnknownException) STD_EXCEPTION(0x1f00, Trap_1f, UnknownException) --- /linux/arch/ppc/kernel/mk_defs.c.orig 2005-01-25 14:23:12.434586840 +0100 +++ /linux/arch/ppc/kernel/mk_defs.c 2005-01-25 14:28:11.315150088 +0100 @@ -116,6 +116,20 @@ DEFINE(_LINK, STACK_FRAME_OVERHEAD+offsetof(struct pt_regs, link)); DEFINE(_CCR, STACK_FRAME_OVERHEAD+offsetof(struct pt_regs, ccr)); DEFINE(_MQ, STACK_FRAME_OVERHEAD+offsetof(struct pt_regs, mq)); + + DEFINE(_CMPA, STACK_FRAME_OVERHEAD+offsetof(struct pt_regs, cmpa)); + DEFINE(_CMPB, STACK_FRAME_OVERHEAD+offsetof(struct pt_regs, cmpb)); + DEFINE(_CMPC, STACK_FRAME_OVERHEAD+offsetof(struct pt_regs, cmpc)); + DEFINE(_CMPD, STACK_FRAME_OVERHEAD+offsetof(struct pt_regs, cmpd)); + DEFINE(_DER, STACK_FRAME_OVERHEAD+offsetof(struct pt_regs, der)); + DEFINE(_CMPE, STACK_FRAME_OVERHEAD+offsetof(struct pt_regs, cmpe)); + DEFINE(_CMPF, STACK_FRAME_OVERHEAD+offsetof(struct pt_regs, cmpf)); + DEFINE(_CMPG, STACK_FRAME_OVERHEAD+offsetof(struct pt_regs, cmpg)); + DEFINE(_CMPH, STACK_FRAME_OVERHEAD+offsetof(struct pt_regs, cmph)); + DEFINE(_LCTRL1, STACK_FRAME_OVERHEAD+offsetof(struct pt_regs, lctrl1)); + DEFINE(_LCTRL2, STACK_FRAME_OVERHEAD+offsetof(struct pt_regs, lctrl2)); + DEFINE(_ICTRL, STACK_FRAME_OVERHEAD+offsetof(struct pt_regs, ictrl)); + DEFINE(_XER, STACK_FRAME_OVERHEAD+offsetof(struct pt_regs, xer)); DEFINE(_DAR, STACK_FRAME_OVERHEAD+offsetof(struct pt_regs, dar)); DEFINE(_DSISR, STACK_FRAME_OVERHEAD+offsetof(struct pt_regs, dsisr)); --- /linux/arch/ppc/kernel/process.c.orig 2005-01-25 14:23:45.410573728 +0100 +++ /linux/arch/ppc/kernel/process.c 2005-01-25 14:28:33.340801680 +0100 @@ -191,6 +191,8 @@ return 1; } + + void _switch_to(struct task_struct *prev, struct task_struct *new, struct task_struct **last) @@ -253,13 +255,13 @@ printk("NIP: %08lX XER: %08lX LR: %08lX SP: %08lX REGS: %p TRAP: %04lx %s\n", regs->nip, regs->xer, regs->link, regs->gpr[1], regs,regs->trap, print_tainted()); - printk("MSR: %08lx EE: %01x PR: %01x FP: %01x ME: %01x IR/DR: %01x%01x\n", - regs->msr, regs->msr&MSR_EE ? 1 : 0, regs->msr&MSR_PR ? 1 : 0, + printk("CMPA: %08lX ICTRL: %08lX MSR: %08lx EE: %01x PR: %01x FP: %01x ME: %01x IR/DR: %01x%01x\n", + regs->cmpa, regs->ictrl, regs->msr, regs->msr&MSR_EE ? 1 : 0, regs->msr&MSR_PR ? 1 : 0, regs->msr & MSR_FP ? 1 : 0,regs->msr&MSR_ME ? 1 : 0, regs->msr&MSR_IR ? 1 : 0, regs->msr&MSR_DR ? 1 : 0); if (regs->trap == 0x300 || regs->trap == 0x600) - printk("DAR: %08lX, DSISR: %08lX\n", regs->dar, regs->dsisr); + printk("DAR: %08lX, DSISR: %08lX DER: %08lX\n", regs->dar, regs->dsisr, regs->der); printk("TASK = %p[%d] '%s' ", current, current->pid, current->comm); printk("Last syscall: %ld ", current->thread.last_syscall); --- /linux/arch/ppc/kernel/ptrace.c.orig 2005-01-25 14:24:08.171113600 +0100 +++ /linux/arch/ppc/kernel/ptrace.c 2005-01-25 14:28:47.701618504 +0100 @@ -33,6 +33,7 @@ #include <asm/page.h> #include <asm/pgtable.h> #include <asm/system.h> +#include <asm/processor.h> /* * Set of msr bits that gdb can change on behalf of a process. @@ -65,7 +66,7 @@ static inline int put_reg(struct task_struct *task, int regno, unsigned long data) { - if (regno <= PT_MQ && task->thread.regs != NULL) { + if (regno <= PT_ICTRL && task->thread.regs != NULL) { if (regno == PT_MSR) data = (data & MSR_DEBUGCHANGE) | (task->thread.regs->msr & ~MSR_DEBUGCHANGE); @@ -233,7 +234,7 @@ index = (unsigned long) addr >> 2; if ((addr & 3) || index > PT_FPSCR) break; - + if (index < PT_FPR0) { tmp = get_reg(child, (int) index); } else { @@ -383,4 +384,4 @@ send_sig(current->exit_code, current, 1); current->exit_code = 0; } -} +} --- /linux/include/asm-ppc/processor.h.orig 2005-01-25 14:56:33.629358992 +0100 +++ /linux/include/asm-ppc/processor.h 2005-01-25 14:59:33.511012824 +0100 @@ -89,6 +89,18 @@ #define SPRN_CCR0 0x3B3 /* Core Configuration Register (4xx) */ #define SPRN_CDBCR 0x3D7 /* Cache Debug Control Register */ + +#define SPRN_CMPA 0x90 /* Development Support Register Comparator A */ +#define SPRN_CMPB 0x91 /* Development Support Register Comparator B */ +#define SPRN_CMPC 0x92 /* Development Support Register Comparator C */ +#define SPRN_CMPD 0x93 /* Development Support Register Comparator D */ +#define SPRN_CMPE 0x98 /* Development Support Register Comparator E */ +#define SPRN_CMPF 0x99 /* Development Support Register Comparator F */ +#define SPRN_CMPG 0x9A /* Development Support Register Comparator G */ +#define SPRN_CMPH 0x9B /* Development Support Register Comparator H */ +#define SPRN_COUNTA 0x96 /* Development Support Register CounterA */ +#define SPRN_COUNTB 0x97 /* Development Support Register CounterB */ + #define SPRN_CTR 0x009 /* Count Register */ #define SPRN_DABR 0x3F5 /* Data Address Breakpoint Register */ #define SPRN_DAC1 0x3F6 /* Data Address Compare 1 */ @@ -272,6 +284,7 @@ #define ICTRL_EICE 0x08000000 /* enable icache parity errs */ #define ICTRL_EDCE 0x04000000 /* enable dcache parity errs */ #define ICTRL_EICP 0x00000100 /* enable icache par. check */ +#define SPRN_ICTRL2 0x9E /* Development Support Instruction Support Control Register */ #define SPRN_IMISS 0x3D4 /* Instruction TLB Miss Register */ #define SPRN_IMMR 0x27E /* Internal Memory Map Register */ #define SPRN_L2CR 0x3F9 /* Level 2 Cache Control Regsiter */ @@ -307,6 +320,8 @@ #define SPRN_L2CR2 0x3f8 #define SPRN_L3CR 0x3FA /* Level 3 Cache Control Regsiter (7450) */ #define L3CR_L3E 0x80000000 /* L3 enable */ +#define SPRN_LCTRL1 0x9C /* Development Support Load/Store Support Comparators Control Register */ +#define SPRN_LCTRL2 0x9D /* Development Support Load/Store Support AND-OR Control Register */ #define SPRN_MSSCR0 0x3f6 /* Memory Subsystem Control Register 0 */ #define SPRN_MSSSR0 0x3f7 /* Memory Subsystem Status Register 1 */ #define SPRN_LDSTCR 0x3f8 /* Load/Store control register */ @@ -415,6 +430,16 @@ /* Short-hand versions for a number of the above SPRNs */ #define CTR SPRN_CTR /* Counter Register */ +#define CMPA SPRN_CMPA +#define CMPB SPRN_CMPB /* Development Support Register Comparator B */ +#define CMPC SPRN_CMPC /* Development Support Register Comparator C */ +#define CMPD SPRN_CMPD /* Development Support Register Comparator D */ +#define CMPE SPRN_CMPE /* Development Support Register Comparator E */ +#define CMPF SPRN_CMPF /* Development Support Register Comparator F */ +#define CMPG SPRN_CMPG /* Development Support Register Comparator G */ +#define CMPH SPRN_CMPH /* Development Support Register Comparator H */ +#define COUNTA SPRN_COUNTA /* Development Support Register CounterA */ +#define COUNTB SPRN_COUNTB /* Development Support Register CounterB */ #define DAR SPRN_DAR /* Data Address Register */ #define DABR SPRN_DABR /* Data Address Breakpoint Register */ #define DBAT0L SPRN_DBAT0L /* Data BAT 0 Lower Register */ @@ -444,10 +469,13 @@ #define IBAT3L SPRN_IBAT3L /* Instruction BAT 3 Lower Register */ #define IBAT3U SPRN_IBAT3U /* Instruction BAT 3 Upper Register */ #define ICMP SPRN_ICMP /* Instruction TLB Compare Register */ +#define ICTRL SPRN_ICTRL2 /* Development Support Instruction Support Control Register */ #define IMISS SPRN_IMISS /* Instruction TLB Miss Register */ #define IMMR SPRN_IMMR /* PPC 860/821 Internal Memory Map Register */ #define L2CR SPRN_L2CR /* PPC 750 L2 control register */ #define L3CR SPRN_L3CR /* PPC 7450 L3 Cache control register */ +#define LCTRL1 SPRN_LCTRL1 /* Development Support Load/Store Support Comparators Control Register */ +#define LCTRL2 SPRN_LCTRL2 /* Development Support Load/Store Support AND-OR Control Register */ #define LR SPRN_LR #define PVR SPRN_PVR /* Processor Version */ #define RPA SPRN_RPA /* Required Physical Address Register */ --- /linux/include/asm-ppc/ptrace.h.orig 2005-01-25 14:57:10.183801872 +0100 +++ /linux/include/asm-ppc/ptrace.h 2005-01-25 14:59:49.425593440 +0100 @@ -32,6 +32,18 @@ unsigned long ccr; unsigned long mq; /* 601 only (not used at present) */ /* Used on APUS to hold IPL value. */ + unsigned long cmpa; + unsigned long cmpb; + unsigned long cmpc; + unsigned long cmpd; + unsigned long der; + unsigned long cmpe; + unsigned long cmpf; + unsigned long cmpg; + unsigned long cmph; + unsigned long lctrl1; + unsigned long lctrl2; + unsigned long ictrl; unsigned long trap; /* Reason for being here */ unsigned long dar; /* Fault registers */ unsigned long dsisr; @@ -109,10 +121,24 @@ #define PT_CCR 38 #define PT_MQ 39 -#define PT_FPR0 48 /* each FP reg occupies 2 slots in this space */ +#define PT_CMPA 40 +#define PT_CMPB 41 +#define PT_CMPC 42 +#define PT_CMPD 43 +#define PT_DER 44 +#define PT_CMPE 45 +#define PT_CMPF 46 +#define PT_CMPG 47 +#define PT_CMPH 48 +#define PT_LCTRL1 49 +#define PT_LCTRL2 50 +#define PT_ICTRL 51 + +#define PT_FPR0 60 /* each FP reg occupies 2 slots in this space */ #define PT_FPR31 (PT_FPR0 + 2*31) #define PT_FPSCR (PT_FPR0 + 2*32 + 1) + /* Get/set all the altivec registers vr0..vr31, vscr, vrsave, in one go */ #define PTRACE_GETVRREGS 18 #define PTRACE_SETVRREGS 19