Blackfin: support all possible registers in the pseudo instructions

Rather than decoding just the common R/P registers, handle all of them.

Signed-off-by: Robin Getz <robin.getz@analog.com>
Signed-off-by: Mike Frysinger <vapier@gentoo.org>

authored by Robin Getz and committed by Mike Frysinger 5a132f7a dc89d97f

+61 -6
+61 -6
arch/blackfin/kernel/pseudodbg.c
··· 9 #include <linux/kernel.h> 10 #include <linux/ptrace.h> 11 12 /* 13 * Unfortunately, the pt_regs structure is not laid out the same way as the 14 * hardware register file, so we need to do some fix ups. 15 */ 16 static bool fix_up_reg(struct pt_regs *fp, long *value, int grp, int reg) 17 { 18 long *val = &fp->r0; 19 20 /* Only do Dregs and Pregs for now */ 21 - if (grp > 1) 22 return false; 23 24 if (grp == 0 || (grp == 1 && reg < 6)) ··· 54 val = &fp->usp; 55 else if (grp == 1 && reg == 7) 56 val = &fp->fp; 57 58 *value = *val; 59 return true; ··· 121 /* DBGA ( regs_lo , uimm16 ) */ 122 /* DBGAL ( regs , uimm16 ) */ 123 if (expected != (value & 0xFFFF)) { 124 - pr_notice("DBGA (%s%i.L,0x%x) failure, got 0x%x\n", grp ? "P" : "R", 125 - regtest, expected, (unsigned int)(value & 0xFFFF)); 126 return false; 127 } 128 ··· 131 /* DBGA ( regs_hi , uimm16 ) */ 132 /* DBGAH ( regs , uimm16 ) */ 133 if (expected != ((value >> 16) & 0xFFFF)) { 134 - pr_notice("DBGA (%s%i.H,0x%x) failure, got 0x%x\n", grp ? "P" : "R", 135 - regtest, expected, (unsigned int)((value >> 16) & 0xFFFF)); 136 return false; 137 } 138 } ··· 171 if (!fix_up_reg(fp, &value, grp, reg)) 172 return false; 173 174 - pr_notice("DBG %s%d = %08lx\n", grp ? "P" : "R", reg, value); 175 176 fp->pc += 2; 177 return true;
··· 9 #include <linux/kernel.h> 10 #include <linux/ptrace.h> 11 12 + const char * const greg_names[] = { 13 + "R0", "R1", "R2", "R3", "R4", "R5", "R6", "R7", 14 + "P0", "P1", "P2", "P3", "P4", "P5", "SP", "FP", 15 + "I0", "I1", "I2", "I3", "M0", "M1", "M2", "M3", 16 + "B0", "B1", "B2", "B3", "L0", "L1", "L2", "L3", 17 + "A0.X", "A0.W", "A1.X", "A1.W", "<res>", "<res>", "ASTAT", "RETS", 18 + "<res>", "<res>", "<res>", "<res>", "<res>", "<res>", "<res>", "<res>", 19 + "LC0", "LT0", "LB0", "LC1", "LT1", "LB1", "CYCLES", "CYCLES2", 20 + "USP", "SEQSTAT", "SYSCFG", "RETI", "RETX", "RETN", "RETE", "EMUDAT", 21 + }; 22 + 23 + static const char *get_allreg_name(int grp, int reg) 24 + { 25 + return greg_names[(grp << 3) | reg]; 26 + } 27 + 28 /* 29 * Unfortunately, the pt_regs structure is not laid out the same way as the 30 * hardware register file, so we need to do some fix ups. 31 + * 32 + * CYCLES is not stored in the pt_regs structure - so, we just read it from 33 + * the hardware. 34 + * 35 + * Don't support: 36 + * - All reserved registers 37 + * - All in group 7 are (supervisors only) 38 */ 39 + 40 static bool fix_up_reg(struct pt_regs *fp, long *value, int grp, int reg) 41 { 42 long *val = &fp->r0; 43 + unsigned long tmp; 44 45 /* Only do Dregs and Pregs for now */ 46 + if (grp == 5 || 47 + (grp == 4 && (reg == 4 || reg == 5)) || 48 + (grp == 7)) 49 return false; 50 51 if (grp == 0 || (grp == 1 && reg < 6)) ··· 27 val = &fp->usp; 28 else if (grp == 1 && reg == 7) 29 val = &fp->fp; 30 + else if (grp == 2) { 31 + val = &fp->i0; 32 + val -= reg; 33 + } else if (grp == 3 && reg >= 4) { 34 + val = &fp->l0; 35 + val -= (reg - 4); 36 + } else if (grp == 3 && reg < 4) { 37 + val = &fp->b0; 38 + val -= reg; 39 + } else if (grp == 4 && reg < 4) { 40 + val = &fp->a0x; 41 + val -= reg; 42 + } else if (grp == 4 && reg == 6) 43 + val = &fp->astat; 44 + else if (grp == 4 && reg == 7) 45 + val = &fp->rets; 46 + else if (grp == 6 && reg < 6) { 47 + val = &fp->lc0; 48 + val -= reg; 49 + } else if (grp == 6 && reg == 6) { 50 + __asm__ __volatile__("%0 = cycles;\n" : "=d"(tmp)); 51 + val = &tmp; 52 + } else if (grp == 6 && reg == 7) { 53 + __asm__ __volatile__("%0 = cycles2;\n" : "=d"(tmp)); 54 + val = &tmp; 55 + } 56 57 *value = *val; 58 return true; ··· 68 /* DBGA ( regs_lo , uimm16 ) */ 69 /* DBGAL ( regs , uimm16 ) */ 70 if (expected != (value & 0xFFFF)) { 71 + pr_notice("DBGA (%s.L,0x%x) failure, got 0x%x\n", 72 + get_allreg_name(grp, regtest), 73 + expected, (unsigned int)(value & 0xFFFF)); 74 return false; 75 } 76 ··· 77 /* DBGA ( regs_hi , uimm16 ) */ 78 /* DBGAH ( regs , uimm16 ) */ 79 if (expected != ((value >> 16) & 0xFFFF)) { 80 + pr_notice("DBGA (%s.H,0x%x) failure, got 0x%x\n", 81 + get_allreg_name(grp, regtest), 82 + expected, (unsigned int)((value >> 16) & 0xFFFF)); 83 return false; 84 } 85 } ··· 116 if (!fix_up_reg(fp, &value, grp, reg)) 117 return false; 118 119 + pr_notice("DBG %s = %08lx\n", get_allreg_name(grp, reg), value); 120 121 fp->pc += 2; 122 return true;