|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1988 Regents of the University of California. ! 3: * All rights reserved. The Berkeley software License Agreement ! 4: * specifies the terms and conditions for redistribution. ! 5: * ! 6: * @(#)kdb_opset.c 7.6 (Berkeley) 6/22/90 ! 7: */ ! 8: ! 9: #include "../kdb/defs.h" ! 10: ! 11: /* ! 12: * Instruction printing. ! 13: */ ! 14: ! 15: REGLIST kdbreglist[] = { ! 16: "p2lr", &kdbpcb.pcb_p2lr, "p2br", (int *)&kdbpcb.pcb_p2br, ! 17: "p1lr", &kdbpcb.pcb_p1lr, "p1br", (int *)&kdbpcb.pcb_p1br, ! 18: "p0lr", &kdbpcb.pcb_p0lr, "p0br", (int *)&kdbpcb.pcb_p0br, ! 19: "ksp", &kdbpcb.pcb_ksp, "hfs", &kdbpcb.pcb_hfs, ! 20: "psl", &kdbpcb.pcb_psl, "pc", &kdbpcb.pcb_pc, ! 21: "ach", &kdbpcb.pcb_ach, "acl", &kdbpcb.pcb_acl, ! 22: "usp", &kdbpcb.pcb_usp, "fp", &kdbpcb.pcb_fp, ! 23: "r12", &kdbpcb.pcb_r12, "r11", &kdbpcb.pcb_r11, ! 24: "r10", &kdbpcb.pcb_r10, "r9", &kdbpcb.pcb_r9, ! 25: "r8", &kdbpcb.pcb_r8, "r7", &kdbpcb.pcb_r7, ! 26: "r6", &kdbpcb.pcb_r6, "r5", &kdbpcb.pcb_r5, ! 27: "r4", &kdbpcb.pcb_r4, "r3", &kdbpcb.pcb_r3, ! 28: "r2", &kdbpcb.pcb_r2, "r1", &kdbpcb.pcb_r1, ! 29: "r0", &kdbpcb.pcb_r0, ! 30: 0 ! 31: }; ! 32: ! 33: /* ! 34: * Argument access types ! 35: */ ! 36: #define ACCA (8<<3) /* address only */ ! 37: #define ACCR (1<<3) /* read */ ! 38: #define ACCW (2<<3) /* write */ ! 39: #define ACCM (3<<3) /* modify */ ! 40: #define ACCB (4<<3) /* branch displacement */ ! 41: #define ACCI (5<<3) /* XFC code */ ! 42: ! 43: /* ! 44: * Argument data types ! 45: */ ! 46: #define TYPB 0 /* byte */ ! 47: #define TYPW 1 /* word */ ! 48: #define TYPL 2 /* long */ ! 49: #define TYPQ 3 /* quad */ ! 50: #define TYPF 4 /* float */ ! 51: #define TYPD 5 /* double */ ! 52: ! 53: struct optab { ! 54: char *iname; ! 55: char val; ! 56: char nargs; ! 57: char argtype[6]; ! 58: }; ! 59: ! 60: static struct optab *ioptab[256]; /* index by opcode to optab */ ! 61: static struct optab optab[] = { /* opcode table */ ! 62: #define OP(a,b,c,d,e,f,g,h,i) {a,b,c,d,e,f,g,h,i} ! 63: #include "../tahoe/kdb_instrs" ! 64: 0}; ! 65: static char *regname[] = { ! 66: "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", ! 67: "r8", "r9", "r10", "r11", "r12", "fp", "sp", "pc" ! 68: }; ! 69: static int type, space, incp; ! 70: ! 71: /* set up ioptab */ ! 72: kdbsetup() ! 73: { ! 74: register struct optab *p; ! 75: ! 76: for (p = optab; p->iname; p++) ! 77: ioptab[p->val&LOBYTE] = p; ! 78: } ! 79: ! 80: static long ! 81: snarf(nbytes, idsp) ! 82: { ! 83: register long value; ! 84: ! 85: value = (u_int)kdbchkget((off_t)kdbinkdot(incp), idsp); ! 86: incp += nbytes; ! 87: return(value>>(4-nbytes)*8); ! 88: } ! 89: ! 90: kdbprintins(idsp, ins) ! 91: register long ins; ! 92: { ! 93: short argno; /* argument index */ ! 94: register mode; /* mode */ ! 95: register r; /* register name */ ! 96: register long d; /* assembled byte, word, long or float */ ! 97: register char *ap; ! 98: register struct optab *ip; ! 99: ! 100: type = DSYM; ! 101: space = idsp; ! 102: ins = byte(ins); ! 103: if ((ip = ioptab[ins]) == (struct optab *)0) { ! 104: kdbprintf("?%2x%8t", ins); ! 105: kdbdotinc = 1; ! 106: return; ! 107: } ! 108: kdbprintf("%s%8t",ip->iname); ! 109: incp = 1; ! 110: ap = ip->argtype; ! 111: for (argno = 0; argno < ip->nargs; argno++, ap++) { ! 112: kdbvar[argno] = 0x80000000; ! 113: if (argno!=0) kdbprintc(','); ! 114: top: ! 115: if (*ap&ACCB) ! 116: mode = 0xAF + ((*ap&7)<<5); /* branch displacement */ ! 117: else { ! 118: mode = kdbbchkget(kdbinkdot(incp),idsp); ++incp; ! 119: } ! 120: r = mode&0xF; ! 121: mode >>= 4; ! 122: switch ((int)mode) { ! 123: case 0: case 1: ! 124: case 2: case 3: /* short literal */ ! 125: kdbprintc('$'); ! 126: d = mode<<4|r; ! 127: goto immed; ! 128: case 4: /* [r] */ ! 129: kdbprintf("[%s]", regname[r]); ! 130: goto top; ! 131: case 5: /* r */ ! 132: kdbprintf("%s", regname[r]); ! 133: break; ! 134: case 6: /* (r) */ ! 135: kdbprintf("(%s)", regname[r]); ! 136: break; ! 137: case 7: /* -(r) */ ! 138: kdbprintf("-(%s)", regname[r]); ! 139: break; ! 140: case 9: /* *(r)+ */ ! 141: kdbprintc('*'); ! 142: case 8: /* (r)+ */ ! 143: if (r == 0xF || ! 144: mode == 8 && (r == 8 || r == 9)) { ! 145: kdbprintc('$'); ! 146: d = snarf((r&03)+1, idsp); ! 147: } else { /*it's not PC immediate or abs*/ ! 148: kdbprintf("(%s)+", regname[r]); ! 149: break; ! 150: } ! 151: immed: ! 152: if (ins == KCALL && d >= 0 && d < 200) { ! 153: kdbprintf("%R", d); ! 154: break; ! 155: } ! 156: goto disp; ! 157: case 0xB: /* byte displacement deferred */ ! 158: case 0xD: /* word displacement deferred */ ! 159: case 0xF: /* long displacement deferred */ ! 160: kdbprintc('*'); ! 161: case 0xA: /* byte displacement */ ! 162: case 0xC: /* word displacement */ ! 163: case 0xE: /* long displacement */ ! 164: d = snarf(1<<((mode>>1&03)-1), idsp); ! 165: if (r==0xF) { /* PC offset addressing */ ! 166: d += kdbdot+incp; ! 167: kdbpsymoff(d,type,""); ! 168: kdbvar[argno]=d; ! 169: break; ! 170: } ! 171: disp: ! 172: if (d >= 0 && d < kdbmaxoff) ! 173: kdbprintf("%R", d); ! 174: else ! 175: kdbpsymoff(d,type,""); ! 176: if (mode >= 0xA) ! 177: kdbprintf("(%s)", regname[r]); ! 178: kdbvar[argno] = d; ! 179: break; ! 180: } ! 181: } ! 182: if (ins == CASEL) { ! 183: if (kdbinkdot(incp)&01) /* align */ ! 184: incp++; ! 185: for (argno = 0; argno <= kdbvar[2]; ++argno) { ! 186: kdbprintc(EOR); ! 187: kdbprintf(" %R: ", argno+kdbvar[1]); ! 188: d = shorten(kdbget(kdbinkdot(incp+argno+argno), idsp)); ! 189: if (d&0x8000) ! 190: d -= 0x10000; ! 191: kdbpsymoff(kdbinkdot(incp)+d, type, ""); ! 192: } ! 193: incp += kdbvar[2]+kdbvar[2]+2; ! 194: } ! 195: kdbdotinc = incp; ! 196: } ! 197: ADDR kdblastframe; ! 198: ADDR kdbcallpc; ! 199: ! 200: ! 201: kdbstacktrace(dolocals) ! 202: int dolocals; ! 203: { ! 204: register int narg; ! 205: register ADDR argp, frame; ! 206: int tramp; ! 207: ! 208: if (kdbadrflg) { ! 209: frame = kdbadrval; ! 210: kdbcallpc = getprevpc(frame); ! 211: } else { ! 212: frame = kdbpcb.pcb_fp; ! 213: kdbcallpc = kdbpcb.pcb_pc; ! 214: } ! 215: kdblastframe = NOFRAME; ! 216: while (kdbcntval-- && frame != NOFRAME) { ! 217: char *name; ! 218: ! 219: kdbchkerr(); ! 220: /* check for pc in pcb (signal trampoline code) */ ! 221: if (issignalpc(kdbcallpc)) { ! 222: tramp = 1; ! 223: name = "sigtramp"; ! 224: } else { ! 225: tramp = 0; ! 226: (void) kdbfindsym((long)kdbcallpc, ISYM); ! 227: if (kdbcursym) ! 228: name = kdbcursym->n_un.n_name; ! 229: else ! 230: name = "?"; ! 231: } ! 232: kdbprintf("%s(", name); ! 233: narg = getnargs(frame); ! 234: if (narg > 10) ! 235: narg = 10; ! 236: argp = frame; ! 237: if (!tramp) ! 238: while (narg) { ! 239: kdbprintf("%R", ! 240: kdbget((off_t)(argp = nextarg(argp)), ! 241: DSP)); ! 242: if (--narg != 0) ! 243: kdbprintc(','); ! 244: } ! 245: kdbprintf(") at "); ! 246: kdbpsymoff((long)kdbcallpc, ISYM, "\n"); ! 247: ! 248: if (dolocals) { ! 249: register ADDR word; ! 250: ! 251: while (kdblocalsym((long)frame)) { ! 252: word = kdbget((off_t)kdblocalval, DSP); ! 253: kdbprintf("%8t%s:%10t", ! 254: kdbcursym->n_un.n_name); ! 255: if (kdberrflg) { ! 256: kdbprintf("?\n"); ! 257: kdberrflg = 0; ! 258: } else ! 259: kdbprintf("%R\n", word); ! 260: } ! 261: } ! 262: if (!tramp) { ! 263: kdbcallpc = getprevpc(frame); ! 264: kdblastframe = frame; ! 265: frame = getprevframe(frame); ! 266: } else ! 267: kdbcallpc = getsignalpc(kdblastframe); ! 268: if (!kdbadrflg && !INSTACK(frame)) ! 269: break; ! 270: } ! 271: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.