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; }
/* * Determine whether we are looking at a kernel core dump, and if so, * set sbr and slr and the current pcb. */ getkcore() { struct nlist *sm, *ss, *mp; if ((sm = lookup("_Sysmap")) == NULL || (ss = lookup("_Syssize")) == NULL || (mp = lookup("_masterpaddr")) == NULL) return (0); /* a.out is not a vmunix */ datmap.m1.b = 0; datmap.m1.e = -1L; /* must set sbr, slr before setpcb() */ sbr = (struct pte *)sm->n_value; slr = ss->n_value; adbprintf("sbr %X slr %X\n", sbr, slr); setpcb((addr_t)mp->n_value); getpcb(); findstackframe(); return (1); }