diff options
| author | Kyle McMartin <kyle@parisc-linux.org> | 2006-06-21 12:49:38 -0400 |
|---|---|---|
| committer | Kyle McMartin <kyle@hera.kernel.org> | 2006-06-27 19:28:44 -0400 |
| commit | 1c63b4b8474700f3fb5e3442a78897766f153437 (patch) | |
| tree | 90a32c95e88a3efce329e62e923fa4b989608b9d | |
| parent | 67a061a191017f984a1ef0ff73ae988b9b15f6d3 (diff) | |
[PARISC] Refactor show_regs in traps.c
show_regs() was one bloaty function. Split it into a few cleaner
functions and define a clean macro to print a line of registers.
[And from Thibaut, only print fprs on a usermode trap.]
Signed-off-by: Kyle McMartin <kyle@parisc-linux.org>
| -rw-r--r-- | arch/parisc/kernel/traps.c | 84 |
1 files changed, 40 insertions, 44 deletions
diff --git a/arch/parisc/kernel/traps.c b/arch/parisc/kernel/traps.c index ff200608c851..348344a84bf7 100644 --- a/arch/parisc/kernel/traps.c +++ b/arch/parisc/kernel/traps.c | |||
| @@ -66,57 +66,42 @@ int printbinary(char *buf, unsigned long x, int nbits) | |||
| 66 | #else | 66 | #else |
| 67 | #define RFMT "%08lx" | 67 | #define RFMT "%08lx" |
| 68 | #endif | 68 | #endif |
| 69 | #define FFMT "%016llx" /* fpregs are 64-bit always */ | ||
| 69 | 70 | ||
| 70 | void show_regs(struct pt_regs *regs) | 71 | #define PRINTREGS(lvl,r,f,fmt,x) \ |
| 72 | printk("%s%s%02d-%02d " fmt " " fmt " " fmt " " fmt "\n", \ | ||
| 73 | lvl, f, (x), (x+3), (r)[(x)+0], (r)[(x)+1], \ | ||
| 74 | (r)[(x)+2], (r)[(x)+3]) | ||
| 75 | |||
| 76 | static void print_gr(char *level, struct pt_regs *regs) | ||
| 71 | { | 77 | { |
| 72 | int i; | 78 | int i; |
| 73 | char buf[128], *p; | 79 | char buf[64]; |
| 74 | char *level; | ||
| 75 | unsigned long cr30; | ||
| 76 | unsigned long cr31; | ||
| 77 | /* carlos says that gcc understands better memory in a struct, | ||
| 78 | * and it makes our life easier with fpregs -- T-Bone */ | ||
| 79 | struct { u32 sw[2]; } s; | ||
| 80 | |||
| 81 | level = user_mode(regs) ? KERN_DEBUG : KERN_CRIT; | ||
| 82 | |||
| 83 | printk("%s\n", level); /* don't want to have that pretty register dump messed up */ | ||
| 84 | 80 | ||
| 81 | printk("%s\n", level); | ||
| 85 | printk("%s YZrvWESTHLNXBCVMcbcbcbcbOGFRQPDI\n", level); | 82 | printk("%s YZrvWESTHLNXBCVMcbcbcbcbOGFRQPDI\n", level); |
| 86 | printbinary(buf, regs->gr[0], 32); | 83 | printbinary(buf, regs->gr[0], 32); |
| 87 | printk("%sPSW: %s %s\n", level, buf, print_tainted()); | 84 | printk("%sPSW: %s %s\n", level, buf, print_tainted()); |
| 88 | 85 | ||
| 89 | for (i = 0; i < 32; i += 4) { | 86 | for (i = 0; i < 32; i += 4) |
| 90 | int j; | 87 | PRINTREGS(level, regs->gr, "r", RFMT, i); |
| 91 | p = buf; | 88 | } |
| 92 | p += sprintf(p, "%sr%02d-%02d ", level, i, i + 3); | ||
| 93 | for (j = 0; j < 4; j++) { | ||
| 94 | p += sprintf(p, " " RFMT, (i+j) == 0 ? 0 : regs->gr[i + j]); | ||
| 95 | } | ||
| 96 | printk("%s\n", buf); | ||
| 97 | } | ||
| 98 | 89 | ||
| 99 | for (i = 0; i < 8; i += 4) { | 90 | static void print_fr(char *level, struct pt_regs *regs) |
| 100 | int j; | 91 | { |
| 101 | p = buf; | 92 | int i; |
| 102 | p += sprintf(p, "%ssr%d-%d ", level, i, i + 3); | 93 | char buf[64]; |
| 103 | for (j = 0; j < 4; j++) { | 94 | struct { u32 sw[2]; } s; |
| 104 | p += sprintf(p, " " RFMT, regs->sr[i + j]); | ||
| 105 | } | ||
| 106 | printk("%s\n", buf); | ||
| 107 | } | ||
| 108 | 95 | ||
| 109 | /* FR are 64bit everywhere. Need to use asm to get the content | 96 | /* FR are 64bit everywhere. Need to use asm to get the content |
| 110 | * of fpsr/fper1, and we assume that we won't have a FP Identify | 97 | * of fpsr/fper1, and we assume that we won't have a FP Identify |
| 111 | * in our way, otherwise we're screwed. | 98 | * in our way, otherwise we're screwed. |
| 112 | * The fldd is used to restore the T-bit if there was one, as the | 99 | * The fldd is used to restore the T-bit if there was one, as the |
| 113 | * store clears it anyway. | 100 | * store clears it anyway. |
| 114 | * BTW, PA2.0 book says "thou shall not use fstw on FPSR/FPERs". */ | 101 | * PA2.0 book says "thou shall not use fstw on FPSR/FPERs" - T-Bone */ |
| 115 | __asm__ ( | 102 | asm volatile ("fstd %%fr0,0(%1) \n\t" |
| 116 | "fstd %%fr0,0(%1) \n\t" | 103 | "fldd 0(%1),%%fr0 \n\t" |
| 117 | "fldd 0(%1),%%fr0 \n\t" | 104 | : "=m" (s) : "r" (&s) : "r0"); |
| 118 | : "=m" (s) : "r" (&s) : "%r0" | ||
| 119 | ); | ||
| 120 | 105 | ||
| 121 | printk("%s\n", level); | 106 | printk("%s\n", level); |
| 122 | printk("%s VZOUICununcqcqcqcqcqcrmunTDVZOUI\n", level); | 107 | printk("%s VZOUICununcqcqcqcqcqcrmunTDVZOUI\n", level); |
| @@ -125,14 +110,25 @@ void show_regs(struct pt_regs *regs) | |||
| 125 | printk("%sFPER1: %08x\n", level, s.sw[1]); | 110 | printk("%sFPER1: %08x\n", level, s.sw[1]); |
| 126 | 111 | ||
| 127 | /* here we'll print fr0 again, tho it'll be meaningless */ | 112 | /* here we'll print fr0 again, tho it'll be meaningless */ |
| 128 | for (i = 0; i < 32; i += 4) { | 113 | for (i = 0; i < 32; i += 4) |
| 129 | int j; | 114 | PRINTREGS(level, regs->fr, "fr", FFMT, i); |
| 130 | p = buf; | 115 | } |
| 131 | p += sprintf(p, "%sfr%02d-%02d ", level, i, i + 3); | 116 | |
| 132 | for (j = 0; j < 4; j++) | 117 | void show_regs(struct pt_regs *regs) |
| 133 | p += sprintf(p, " %016llx", (i+j) == 0 ? 0 : regs->fr[i+j]); | 118 | { |
| 134 | printk("%s\n", buf); | 119 | int i; |
| 135 | } | 120 | char *level; |
| 121 | unsigned long cr30, cr31; | ||
| 122 | |||
| 123 | level = user_mode(regs) ? KERN_DEBUG : KERN_CRIT; | ||
| 124 | |||
| 125 | print_gr(level, regs); | ||
| 126 | |||
| 127 | for (i = 0; i < 8; i += 4) | ||
| 128 | PRINTREGS(level, regs->sr, "sr", RFMT, i); | ||
| 129 | |||
| 130 | if (user_mode(regs)) | ||
| 131 | print_fr(level, regs); | ||
| 136 | 132 | ||
| 137 | cr30 = mfctl(30); | 133 | cr30 = mfctl(30); |
| 138 | cr31 = mfctl(31); | 134 | cr31 = mfctl(31); |
