/* * Find the current stack frame when debugging the kernel. * If we're looking at a crash dump and this was not a ``clean'' * crash, then we must search the interrupt stack carefully * looking for a valid frame. */ findstackframe() { char *panicstr, buf[256]; register struct frame *fp; caddr_t addr; register char *cp; int mask; if (lookup("_panicstr") == 0) return; lseek(fcor, KVTOPH(cursym->n_value), L_SET); read(fcor, &panicstr, sizeof (panicstr)); if (panicstr == 0) return; lseek(fcor, KVTOPH((off_t)panicstr), L_SET); read(fcor, buf, sizeof (buf)); for (cp = buf; cp < &buf[sizeof (buf)] && *cp; cp++) if (!isascii(*cp) || (!isprint(*cp) && !isspace(*cp))) *cp = '?'; if (*cp) *cp = '\0'; printf("panic: %s\n", buf); /* * After a panic, look at the top of the rpb stack to * find a stack frame. If this was a clean crash, * i.e. one which left the interrupt and kernel stacks * in a reasonable state, then we should find a pointer * to the proper stack frame here (at location scb-4). * If we don't find a reasonable frame here, then we * must search down through the interrupt stack. */ intstack = lookup("_intstack")->n_value; #define NISP 3 /* from locore.s */ eintstack = intstack + NISP*NBPG; rpb = lookup("_rpb")->n_value; scb = lookup("_scb")->n_value; lookup("_u"); ustack = cursym->n_value + (int)&((struct user *)0)->u_stack[0]; eustack = cursym->n_value + ctob(UPAGES); physrw(fcor, KVTOPH((int)scb - sizeof (caddr_t)), &addr, 1); fp = getframe(fcor, addr); if (fp == 0) fp = checkintstack(); /* search kernel stack? */ if (fp == 0) { printf("can't locate stack frame\n"); return; } /* probably shouldn't clobber pcb, but for now this is easy */ pcb.pcb_fp = addr; pcb.pcb_pc = fp->fr_savpc; pcb.pcb_ap = addr + sizeof (struct frame) + fp->fr_spa; for (mask = fp->fr_mask; mask; mask >>= 1) if (mask & 01) pcb.pcb_ap += sizeof (caddr_t); }
getpcb() { lseek(fcor, KVTOPH(masterpcbb), L_SET); read(fcor, &pcb, sizeof (struct pcb)); printf("p0br %X p0lr %X p2br %X p2lr %X\n", pcb.pcb_p0br, pcb.pcb_p0lr, pcb.pcb_p2br, pcb.pcb_p2lr); }
getpcb() { lseek(fcor, KVTOPH(masterpcbb), L_SET); read(fcor, &pcb, sizeof (struct pcb)); pcb.pcb_p0lr &= ~AST_CLR; printf("p0br %x p0lr %x p1br %x p1lr %x\n", pcb.pcb_p0br, pcb.pcb_p0lr, pcb.pcb_p1br, pcb.pcb_p1lr); }
setcor() { fcor = datmap.ufd = getfile(corfil,2); if (kernel && fcor != -1 && INKERNEL(filhdr.a_entry)) { struct stat stb; kcore = 1; fstat(fcor, &stb); datmap.b1 = 0; datmap.e1 = -1; if (kernel == 0 && (stb.st_mode & S_IFREG)) datmap.b1 = 0x80000000; lookup("_Sysmap"); sbr = cursym->n_value; lookup("_Syssize"); slr = cursym->n_value; printf("sbr %x slr %x\n", sbr, slr); lookup("_masterpaddr"); physrw(fcor, KVTOPH(cursym->n_value), &masterpcbb, 1); masterpcbb = (masterpcbb&PG_PFNUM)*NBPG; getpcb(); findstackframe(); return; } if (read(fcor, (char *)&u, ctob(UPAGES))!=ctob(UPAGES) || !INUDOT(u.u_pcb.pcb_ksp) || !INSTACK(u.u_pcb.pcb_usp)) { datmap.e1 = MAXFILE; return; } signo = u.u_arg[0]; sigcode = u.u_code; filhdr.a_text = ctob(u.u_tsize); filhdr.a_data = ctob(u.u_dsize); stksiz = ctob(u.u_ssize); switch (filhdr.a_magic) { case OMAGIC: datmap.b1 = 0; datmap.e1 = filhdr.a_text+filhdr.a_data; datmap.f2 = ctob(UPAGES) + datmap.e1; break; case NMAGIC: case ZMAGIC: datmap.b1 = round(filhdr.a_text, PAGSIZ); datmap.e1 = datmap.b1 + filhdr.a_data; datmap.f2 = ctob(UPAGES) + filhdr.a_data; break; } datbas = datmap.b1; datmap.f1 = ctob(UPAGES); datmap.b2 = MAXSTOR - stksiz; datmap.e2 = MAXSTOR; }