11 #include <linux/kernel.h>
12 #include <linux/string.h>
49 static struct sh_opcode_info {
295 int nibs[4] = { (insn >> 12) & 0xf, (insn >> 8) & 0xf, (insn >> 4) & 0xf, insn & 0xf};
297 struct sh_opcode_info *
op = sh_table;
299 for (; op->name; op++) {
306 int disp_pc_addr = 0;
308 for (n = 0; n < 4; n++) {
309 int i = op->nibbles[
n];
318 imm = (nibs[2] << 4) | (nibs[3]);
321 imm = ((
char)imm) * 2 + 4 ;
324 imm = ((nibs[1]) << 8) | (nibs[2] << 4) | (nibs[3]);
339 imm = (nibs[2] << 4) | nibs[3];
342 imm = ((nibs[2] << 4) | nibs[3]) <<1;
346 imm = ((nibs[2] << 4) | nibs[3]) <<2;
350 imm = ((nibs[2] << 4) | nibs[3]) <<1;
353 imm = ((nibs[2] << 4) | nibs[3]) <<2;
356 imm = (nibs[2] << 4) | (nibs[3]);
368 rn = (nibs[
n] & 0xc) >> 2;
369 rm = (nibs[
n] & 0x3);
380 printk(
"%-8s ", op->name);
381 lastsp = (op->arg[0] ==
A_END);
383 for (n = 0; n < 6 && op->arg[
n] !=
A_END; n++) {
384 if (n && op->arg[1] !=
A_END)
386 switch (op->arg[n]) {
388 printk(
"#%d", (
char)(imm));
406 printk(
"@(%d,r%d)", imm, rn);
421 printk(
"@(%d,r%d)", imm, rm);
428 disp_pc_addr = imm + 4 + (memaddr & relmask);
429 printk(
"%08x <%pS>", disp_pc_addr,
430 (
void *)disp_pc_addr);
446 printk(
"%08x", imm + memaddr);
529 if (disp_pc &&
strcmp(op->name,
"mova") != 0) {
537 printk(
" ! %08x <%pS>", val, (
void *)val);
546 printk(
".word 0x%x%x%x%x", nibs[0], nibs[1], nibs[2], nibs[3]);
551 unsigned short *
pc = (
unsigned short *)regs->
pc;
559 for (i = -3 ; i < 6 ; i++) {
563 printk(
" (Bad address in pc)\n");
567 printk(
"%s%08lx: ", (i ?
" ":
"->"), (
unsigned long)(pc + i));
568 print_sh_insn((
unsigned long)(pc + i), insn);