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 9 #include <linux/kernel.h> 10 10 #include <linux/ptrace.h> 11 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 + 12 28 /* 13 29 * Unfortunately, the pt_regs structure is not laid out the same way as the 14 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) 15 38 */ 39 + 16 40 static bool fix_up_reg(struct pt_regs *fp, long *value, int grp, int reg) 17 41 { 18 42 long *val = &fp->r0; 43 + unsigned long tmp; 19 44 20 45 /* Only do Dregs and Pregs for now */ 21 - if (grp > 1) 46 + if (grp == 5 || 47 + (grp == 4 && (reg == 4 || reg == 5)) || 48 + (grp == 7)) 22 49 return false; 23 50 24 51 if (grp == 0 || (grp == 1 && reg < 6)) ··· 54 27 val = &fp->usp; 55 28 else if (grp == 1 && reg == 7) 56 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 + } 57 56 58 57 *value = *val; 59 58 return true; ··· 121 68 /* DBGA ( regs_lo , uimm16 ) */ 122 69 /* DBGAL ( regs , uimm16 ) */ 123 70 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)); 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)); 126 74 return false; 127 75 } 128 76 ··· 131 77 /* DBGA ( regs_hi , uimm16 ) */ 132 78 /* DBGAH ( regs , uimm16 ) */ 133 79 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)); 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)); 136 83 return false; 137 84 } 138 85 } ··· 171 116 if (!fix_up_reg(fp, &value, grp, reg)) 172 117 return false; 173 118 174 - pr_notice("DBG %s%d = %08lx\n", grp ? "P" : "R", reg, value); 119 + pr_notice("DBG %s = %08lx\n", get_allreg_name(grp, reg), value); 175 120 176 121 fp->pc += 2; 177 122 return true;