lkml.org 
[lkml]   [2001]   [Jun]   [8]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
Date
From
Subjectalpha traps.c patch for improved oops output
This is a patch to arch/alpha/kernel/traps.c which changes its oops output
to be like other architectures: Output a trace, given in a series of hex
numbers, and then output the instructions surrounding the oops, in hex
numbers.

The disassemble() function and its associated data structures and helper
functions have been removed, since ksymoops and objdump do it better
anyway.

It applies to 2.4.5-ac[67] and 2.2.19 with a bit of fuzz.

Regards,

(posting from home since Compaq doesn't do ECN,)

Will Woods
Alpha Technology Solutions Group
Compaq Computer Corp.

--- linux/arch/alpha/kernel/traps.c Fri Jun 8 13:00:18 2001
+++ linux-2.4.5-ac7-ww/arch/alpha/kernel/traps.c Fri Jun 8 12:57:12 2001
@@ -61,202 +61,6 @@
"a0", "a1", "a2", "a3", "a4", "a5", "t8", "t9",
"t10", "t11", "ra", "pv", "at", "gp", "sp", "zero"};

-static char * inst_name[] = {"call_pal", "", "", "", "", "", "", "",
- "lda", "ldah", "ldbu", "ldq_u", "ldwu", "stw", "stb", "stq_u",
- "ALU", "ALU", "ALU", "ALU", "SQRT", "FVAX", "FIEEE", "FLOAT",
- "MISC", "PAL19", "JMP", "PAL1B", "GRAPH", "PAL1D", "PAL1E", "PAL1F",
- "ldf", "ldg", "lds", "ldt", "stf", "stg", "sts", "stt",
- "ldl", "ldq", "ldl_l", "ldq_l", "stl", "stq", "stl_c", "stq_c",
- "br", "fbeq", "fblt", "fble", "bsr", "fbne", "fbge", "fbgt"
- "blbc", "beq", "blt", "ble", "blbs", "bne", "bge", "bgt"
-};
-
-static char * jump_name[] = {"jmp", "jsr", "ret", "jsr_coroutine"};
-
-typedef struct {int func; char * text;} alist;
-
-static alist inta_name[] = {{0, "addl"}, {2, "s4addl"}, {9, "subl"},
- {0xb, "s4subl"}, {0xf, "cmpbge"}, {0x12, "s8addl"}, {0x1b, "s8subl"},
- {0x1d, "cmpult"}, {0x20, "addq"}, {0x22, "s4addq"}, {0x29, "subq"},
- {0x2b, "s4subq"}, {0x2d, "cmpeq"}, {0x32, "s8addq"}, {0x3b, "s8subq"},
- {0x3d, "cmpule"}, {0x40, "addl/v"}, {0x49, "subl/v"}, {0x4d, "cmplt"},
- {0x60, "addq/v"}, {0x69, "subq/v"}, {0x6d, "cmple"}, {-1, 0}};
-
-static alist intl_name[] = {{0, "and"}, {8, "andnot"}, {0x14, "cmovlbs"},
- {0x16, "cmovlbc"}, {0x20, "or"}, {0x24, "cmoveq"}, {0x26, "cmovne"},
- {0x28, "ornot"}, {0x40, "xor"}, {0x44, "cmovlt"}, {0x46, "cmovge"},
- {0x48, "eqv"}, {0x61, "amask"}, {0x64, "cmovle"}, {0x66, "cmovgt"},
- {0x6c, "implver"}, {-1, 0}};
-
-static alist ints_name[] = {{2, "mskbl"}, {6, "extbl"}, {0xb, "insbl"},
- {0x12, "mskwl"}, {0x16, "extwl"}, {0x1b, "inswl"}, {0x22, "mskll"},
- {0x26, "extll"}, {0x2b, "insll"}, {0x30, "zap"}, {0x31, "zapnot"},
- {0x32, "mskql"}, {0x34, "srl"}, {0x36, "extql"}, {0x39, "sll"},
- {0x3b, "insql"}, {0x3c, "sra"}, {0x52, "mskwh"}, {0x57, "inswh"},
- {0x5a, "extwh"}, {0x62, "msklh"}, {0x67, "inslh"}, {0x6a, "extlh"},
- {0x72, "mskqh"}, {0x77, "insqh"}, {0x7a, "extqh"}, {-1, 0}};
-
-static alist intm_name[] = {{0, "mull"}, {0x20, "mulq"}, {0x30, "umulh"},
- {0x40, "mull/v"}, {0x60, "mulq/v"}, {-1, 0}};
-
-static alist * int_name[] = {inta_name, intl_name, ints_name, intm_name};
-
-static char *
-assoc(int fcode, alist * a)
-{
- while ((fcode != a->func) && (a->func != -1))
- ++a;
- return a->text;
-}
-
-static char *
-iname(unsigned int instr)
-{
- int opcode = instr >> 26;
- char * name = inst_name[opcode];
-
- switch (opcode) {
- default:
- break;
-
- case 0x10:
- case 0x11:
- case 0x12:
- case 0x13: {
- char * specific_name
- = assoc((instr >> 5) & 0x3f, int_name[opcode - 0x10]);
- if (specific_name)
- name = specific_name;
- break;
- }
-
- case 0x1a:
- name = jump_name[(instr >> 14) & 3];
- break;
- }
-
- return name;
-}
-
-static enum {NOT_INST, PAL, BRANCH, MEMORY, JUMP, OPERATE, FOPERATE, MISC}
-iformat(int opcode)
-{
- if (opcode >= 0x30)
- return BRANCH;
- if (opcode >= 0x20)
- return MEMORY;
- if (opcode == 0)
- return PAL;
- if (opcode < 8)
- return NOT_INST;
- if (opcode < 0x10)
- return MEMORY;
- if (opcode < 0x14)
- return OPERATE;
- if (opcode < 0x18)
- return FOPERATE;
- switch (opcode) {
- case 0x18:
- return MISC;
- case 0x1A:
- return JUMP;
- case 0x1C:
- return OPERATE;
- default:
- return NOT_INST;
- }
-}
-
-/*
- * The purpose here is to provide useful clues about a kernel crash, so
- * less likely instructions, e.g. floating point, aren't fully decoded.
- */
-static void
-disassemble(unsigned int instr)
-{
- int optype = instr >> 26;
- char buf[40], *s = buf;
-
- s += sprintf(buf, "%08x %s ", instr, iname(instr));
- switch (iformat(optype)) {
- default:
- case NOT_INST:
- case MISC:
- break;
-
- case PAL:
- s += sprintf(s, "%d", instr);
- break;
-
- case BRANCH: {
- int reg = (instr >> 21) & 0x1f;
- int offset = instr & 0x1fffff;
-
- if (offset >= 0x100000)
- offset -= 0x200000;
- if (((optype & 3) == 0) || (optype >= 0x38)) {
- if ((optype != 0x30) || (reg != 0x1f))
- s += sprintf(s, "%s,", ireg_name[reg]);
- } else
- s += sprintf(s, "f%d,", reg);
- s += sprintf(s, ".%+d", (offset + 1) << 2);
- break;
- }
-
- case MEMORY: {
- int addr_reg = (instr >> 16) & 0x1f;
- int value_reg = (instr >> 21) & 0x1f;
- int offset = instr & 0xffff;
-
- if (offset >= 0x8000)
- offset -= 0x10000;
- if ((optype >= 0x20) && (optype < 0x28))
- s += sprintf(s, "f%d", value_reg);
- else
- s += sprintf(s, "%s", ireg_name[value_reg]);
-
- s += sprintf(s, ",%d(%s)", offset, ireg_name[addr_reg]);
- break;
- }
-
- case JUMP: {
- int target_reg = (instr >> 16) & 0x1f;
- int return_reg = (instr >> 21) & 0x1f;
-
- s += sprintf(s, "%s,", ireg_name[return_reg]);
- s += sprintf(s, "(%s)", ireg_name[target_reg]);
- break;
- }
-
- case OPERATE: {
- int areg = (instr >> 21) & 0x1f;
- int breg = (instr >> 16) & 0x1f;
- int creg = instr & 0x1f;
- int litflag = instr & (1<<12);
- int lit = (instr >> 13) & 0xff;
-
- s += sprintf(s, "%s,", ireg_name[areg]);
- if (litflag)
- s += sprintf(s, "%d", lit);
- else
- s += sprintf(s, "%s", ireg_name[breg]);
- s += sprintf(s, ",%s", ireg_name[creg]);
- break;
- }
-
- case FOPERATE: {
- int areg = (instr >> 21) & 0x1f;
- int breg = (instr >> 16) & 0x1f;
- int creg = instr & 0x1f;
-
- s += sprintf(s, "f%d,f%d,f%d", areg, breg, creg);
- break;
- }
- }
- buf[s-buf] = 0;
- printk("%s\n", buf);
-}
-
static void
dik_show_code(unsigned int *pc)
{
@@ -267,8 +71,7 @@
unsigned int insn;
if (__get_user(insn, pc+i))
break;
- printk("%c", i ? ' ' : '*');
- disassemble(insn);
+ printk("%c%08x%c", i ? ' ' : '<', insn, i ? ' ' : '>');
}
printk("\n");
}
@@ -331,8 +134,8 @@
#endif
printk("%s(%d): %s %ld\n", current->comm, current->pid, str, err);
dik_show_regs(regs, r9_15);
- dik_show_code((unsigned int *)regs->pc);
dik_show_trace((unsigned long *)(regs+1));
+ dik_show_code((unsigned int *)regs->pc);

if (current->thread.flags & (1UL << 63)) {
printk("die_if_kernel recursion detected.\n");
\
 
 \ /
  Last update: 2005-03-22 13:17    [W:0.036 / U:0.284 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site