ps and pstat fixes to work on dumps in 4.2
Alex White
arwhite at watmath.UUCP
Fri Feb 17 17:03:57 AEST 1984
Subject: ps and pstat don't know about page tables for core dumps
Index: etc/pstat.c bin/ps.c 4.2BSD
Description:
ps -k vmunix.xx vmcore.xx
pstat -k vmunix.xx vmcore.xx
both blow up with garbage.
Repeat-By:
Procedure to repeat the problem.
Fix:
All accesses to the kernel if in a core dump must go thru the
kernel page tables. Diffs follow for both ps and pstat
*** ps.c Fri Feb 17 01:59:54 1984
--- /usr/distr/4.2/usr/src/bin/ps.c Sun Sep 25 21:05:05 1983
***************
*** 46,57
#define X_DMMIN 10
{ "_dmmax" },
#define X_DMMAX 11
- { "_u" },
- #define X_UAREA 12
- { "_Sysmap" },
- #define X_SYSMAP 13
- { "_Syssize" },
- #define X_SYSSIZE 14
{ "" },
};
--- 46,51 -----
#define X_DMMIN 10
{ "_dmmax" },
#define X_DMMAX 11
{ "" },
};
***************
*** 105,110
} user;
#define u user.user
int chkpid;
int aflg, cflg, eflg, gflg, kflg, lflg, rflg, sflg,
uflg, vflg, xflg;
--- 99,106 -----
} user;
#define u user.user
+ #define clear(x) ((int)x & 0x7fffffff)
+
int chkpid;
int aflg, cflg, eflg, gflg, kflg, lflg, sflg,
uflg, vflg, xflg;
***************
*** 106,112
#define u user.user
int chkpid;
! int aflg, cflg, eflg, gflg, kflg, lflg, rflg, sflg,
uflg, vflg, xflg;
char *tptr;
char *gettty(), *getcmd(), *getname(), *savestr(), *alloc(), *state();
--- 102,108 -----
#define clear(x) ((int)x & 0x7fffffff)
int chkpid;
! int aflg, cflg, eflg, gflg, kflg, lflg, sflg,
uflg, vflg, xflg;
char *tptr;
char *gettty(), *getcmd(), *getname(), *savestr(), *alloc(), *state();
***************
*** 182,190
case 'l':
lflg++;
break;
- case 'r':
- rflg++;
- break;
case 's':
sflg++;
break;
--- 178,183 -----
case 'l':
lflg++;
break;
case 's':
sflg++;
break;
***************
*** 272,280
mproc->p_stat == SSTOP))
continue;
}
- if (rflg && ! (mproc->p_stat == SRUN
- || mproc->p_pri < PZERO))
- continue;
save();
}
}
--- 265,270 -----
mproc->p_stat == SSTOP))
continue;
}
save();
}
}
***************
*** 323,337
int off;
{
! /*
! * If this is a dump, then the kernel isn't doing the page mapping
! * for us. Simulate it.
! */
! if (kflg && (loc & 0x80000000) != 0) {
! long v;
! long addr;
! struct pte pte;
!
loc &= 0x7fffffff;
v = btop(loc);
if(v >= nl[X_SYSSIZE].n_value) {
--- 313,319 -----
int off;
{
! if (kflg)
loc &= 0x7fffffff;
(void) lseek(fd, (long)loc, off);
}
***************
*** 333,355
struct pte pte;
loc &= 0x7fffffff;
- v = btop(loc);
- if(v >= nl[X_SYSSIZE].n_value) {
- printf("address botch %x\n", loc);
- return;
- }
- addr = (long)((struct pte *)nl[X_SYSMAP].n_value + v);
- lseek(kmem, addr&0x7fffffff, 0);
- if(read(kmem, (char *)&pte, sizeof(pte)) != sizeof(pte)) {
- printf("Error reading kmem for pte at %x\n", addr);
- return;
- }
- if (pte.pg_v == 0 && (pte.pg_fod || pte.pg_pfnum == 0)) {
- printf("pte bad for %x\n", addr);
- return;
- }
- loc = (long)ptob(pte.pg_pfnum) + (loc & PGOFSET);
- }
(void) lseek(fd, (long)loc, off);
}
--- 315,320 -----
if (kflg)
loc &= 0x7fffffff;
(void) lseek(fd, (long)loc, off);
}
***************
*** 397,402
fprintf(stderr, "%s: No namelist\n", nlistf);
exit(1);
}
usrpt = (struct pte *)nl[X_USRPT].n_value; /* don't clear!! */
Usrptma = (struct pte *)nl[X_USRPTMA].n_value;
klseek(kmem, (long)nl[X_NSWAP].n_value, 0);
--- 362,370 -----
fprintf(stderr, "%s: No namelist\n", nlistf);
exit(1);
}
+ if (kflg)
+ for (nlp = nl; nlp < &nl[sizeof (nl)/sizeof (nl[0])]; nlp++)
+ nlp->n_value = clear(nlp->n_value);
usrpt = (struct pte *)nl[X_USRPT].n_value; /* don't clear!! */
Usrptma = (struct pte *)nl[X_USRPTMA].n_value;
klseek(kmem, (long)nl[X_NSWAP].n_value, 0);
***************
*** 757,763
mproc->p_pid, swapf);
return (0);
}
! pcbpf = mproc->p_swaddr;
argaddr = 0;
return (1);
}
--- 725,731 -----
mproc->p_pid, swapf);
return (0);
}
! pcbpf = 0;
argaddr = 0;
return (1);
}
***************
*** 761,766
argaddr = 0;
return (1);
}
pteaddr = &Usrptma[btokmx(mproc->p_p0br) + mproc->p_szpt - 1];
klseek(kmem, (long)pteaddr, 0);
if (read(kmem, (char *)&apte, sizeof(apte)) != sizeof(apte)) {
--- 729,736 -----
argaddr = 0;
return (1);
}
+ if (kflg)
+ mproc->p_p0br = (struct pte *)clear(mproc->p_p0br);
pteaddr = &Usrptma[btokmx(mproc->p_p0br) + mproc->p_szpt - 1];
klseek(kmem, (long)pteaddr, 0);
if (read(kmem, (char *)&apte, sizeof(apte)) != sizeof(apte)) {
***************
*** 765,771
klseek(kmem, (long)pteaddr, 0);
if (read(kmem, (char *)&apte, sizeof(apte)) != sizeof(apte)) {
printf("ps: cant read indir pte to get u for pid %d from %s\n",
! mproc->p_pid, kmemf);
return (0);
}
klseek(mem,
--- 735,741 -----
klseek(kmem, (long)pteaddr, 0);
if (read(kmem, (char *)&apte, sizeof(apte)) != sizeof(apte)) {
printf("ps: cant read indir pte to get u for pid %d from %s\n",
! mproc->p_pid, swapf);
return (0);
}
klseek(mem,
***************
*** 883,889
}
char *lhdr =
! " F UID PID PPID CP PRI NI ADDR SZ RSS WCHAN STAT TT TIME";
lpr(sp)
struct savcom *sp;
{
--- 853,859 -----
}
char *lhdr =
! " F UID PID PPID CP PRI NI ADDR SZ RSS WCHAN STAT TT TIME";
lpr(sp)
struct savcom *sp;
{
***************
*** 894,905
ap->a_flag, ap->a_uid,
ap->a_pid, lp->l_ppid, lp->l_cpu&0377, ap->a_pri-PZERO,
ap->a_nice-NZERO, lp->l_addr, pgtok(ap->a_size), pgtok(ap->a_rss));
!
! if(lp->l_wchan == (caddr_t)nl[X_UAREA].n_value)
! printf(" pause");
! else
! printf(lp->l_wchan ? " %6x" : " ",
! (int)lp->l_wchan&~0x80000000);
printf(" %4.4s ", state(ap));
ptty(ap->a_tty);
ptime(ap);
--- 864,870 -----
ap->a_flag, ap->a_uid,
ap->a_pid, lp->l_ppid, lp->l_cpu&0377, ap->a_pri-PZERO,
ap->a_nice-NZERO, lp->l_addr, pgtok(ap->a_size), pgtok(ap->a_rss));
! printf(lp->l_wchan ? " %5x" : " ", (int)lp->l_wchan&0xfffff);
printf(" %4.4s ", state(ap));
ptty(ap->a_tty);
ptime(ap);
***************
*** 1103,1109
return (vp->v_swrss + (ap->a_xccount ? 0 : vp->v_txtswrss));
}
! #define NMAX 16 /* sizeof loginname (should be sizeof (utmp.ut_name)) */
#define NUID 2048 /* must not be a multiple of 5 */
struct nametable {
--- 1068,1074 -----
return (vp->v_swrss + (ap->a_xccount ? 0 : vp->v_txtswrss));
}
! #define NMAX 8 /* sizeof loginname (should be sizeof (utmp.ut_name)) */
#define NUID 2048 /* must not be a multiple of 5 */
struct nametable {
*** pstat.c Fri Feb 17 01:52:34 1984
--- /usr/distr/4.2/usr/src/etc/pstat.c Wed Nov 2 18:51:57 1983
***************
*** 74,83
{ "_nswdev" },
#define SSWDEVT 21
{ "_swdevt" },
- #define X_SYSMAP 22
- { "_Sysmap" },
- #define X_SYSSIZE 23
- { "_Syssize" },
{ "" }
};
--- 74,79 -----
{ "_nswdev" },
#define SSWDEVT 21
{ "_swdevt" },
{ "" }
};
***************
*** 175,184
printf("no namelist\n");
exit(1);
}
- if (kflg && (nl[X_SYSMAP].n_value == 0 || nl[X_SYSSIZE].n_value == 0)) {
- printf("No _Sysmap or _Syssize\n");
- exit(1);
- }
allflags = filf | totflg | inof | prcf | txtf | ttyf | usrf | swpf;
if (allflags == 0) {
printf("pstat: one or more of -[aixptfsu] is required\n");
--- 171,176 -----
printf("no namelist\n");
exit(1);
}
allflags = filf | totflg | inof | prcf | txtf | ttyf | usrf | swpf;
if (allflags == 0) {
printf("pstat: one or more of -[aixptfsu] is required\n");
***************
*** 216,222
nin = 0;
ninode = getw(nl[SNINODE].n_value);
xinode = (struct inode *)calloc(ninode, sizeof (struct inode));
! klseek(fc, (int)(ainode = (struct inode *)getw(nl[SINODE].n_value)), 0);
read(fc, xinode, ninode * sizeof(struct inode));
for (ip = xinode; ip < &xinode[ninode]; ip++)
if (ip->i_count)
--- 208,214 -----
nin = 0;
ninode = getw(nl[SNINODE].n_value);
xinode = (struct inode *)calloc(ninode, sizeof (struct inode));
! lseek(fc, (int)(ainode = (struct inode *)getw(nl[SINODE].n_value)), 0);
read(fc, xinode, ninode * sizeof(struct inode));
for (ip = xinode; ip < &xinode[ninode]; ip++)
if (ip->i_count)
***************
*** 263,269
{
int word;
! klseek(fc, loc, 0);
read(fc, &word, sizeof (word));
return (word);
}
--- 255,263 -----
{
int word;
! if (kflg)
! loc &= 0x7fffffff;
! lseek(fc, loc, 0);
read(fc, &word, sizeof (word));
if (kflg)
word &= 0x7fffffff;
***************
*** 265,270
klseek(fc, loc, 0);
read(fc, &word, sizeof (word));
return (word);
}
--- 259,266 -----
loc &= 0x7fffffff;
lseek(fc, loc, 0);
read(fc, &word, sizeof (word));
+ if (kflg)
+ word &= 0x7fffffff;
return (word);
}
***************
*** 286,292
ntx = 0;
ntext = getw(nl[SNTEXT].n_value);
xtext = (struct text *)calloc(ntext, sizeof (struct text));
! klseek(fc, (int)(atext = (struct text *)getw(nl[STEXT].n_value)), 0);
read(fc, xtext, ntext * sizeof (struct text));
for (xp = xtext; xp < &xtext[ntext]; xp++)
if (xp->x_iptr!=NULL)
--- 282,288 -----
ntx = 0;
ntext = getw(nl[SNTEXT].n_value);
xtext = (struct text *)calloc(ntext, sizeof (struct text));
! lseek(fc, (int)(atext = (struct text *)getw(nl[STEXT].n_value)), 0);
read(fc, xtext, ntext * sizeof (struct text));
for (xp = xtext; xp < &xtext[ntext]; xp++)
if (xp->x_iptr!=NULL)
***************
*** 330,336
nproc = getw(nl[SNPROC].n_value);
xproc = (struct proc *)calloc(nproc, sizeof (struct proc));
! klseek(fc, (int)(aproc = (struct proc *)getw(nl[SPROC].n_value)), 0);
read(fc, xproc, nproc * sizeof (struct proc));
np = 0;
for (pp=xproc; pp < &xproc[nproc]; pp++)
--- 326,332 -----
nproc = getw(nl[SNPROC].n_value);
xproc = (struct proc *)calloc(nproc, sizeof (struct proc));
! lseek(fc, (int)(aproc = (struct proc *)getw(nl[SPROC].n_value)), 0);
read(fc, xproc, nproc * sizeof (struct proc));
np = 0;
for (pp=xproc; pp < &xproc[nproc]; pp++)
***************
*** 359,365
printf(" %6d", pp->p_pgrp);
printf(" %6d", pp->p_pid);
printf(" %6d", pp->p_ppid);
! klseek(fc, (long)(Usrptma+btokmx(pp->p_addr)), 0);
read(fc, &apte, sizeof(apte));
printf(" %8x", ctob(apte.pg_pfnum+1) - sizeof(struct pte) * UPAGES);
printf(" %4x", pp->p_rssize);
--- 355,363 -----
printf(" %6d", pp->p_pgrp);
printf(" %6d", pp->p_pid);
printf(" %6d", pp->p_ppid);
! if (kflg)
! pp->p_addr = (struct pte *)clear((int)pp->p_addr);
! lseek(fc, (long)(Usrptma+btokmx(pp->p_addr)), 0);
read(fc, &apte, sizeof(apte));
printf(" %8x", ctob(apte.pg_pfnum+1) - sizeof(struct pte) * UPAGES);
printf(" %4x", pp->p_rssize);
***************
*** 380,386
register char *mesg;
printf("1 cons\n");
! klseek(fc, (long)nl[SKL].n_value, 0);
read(fc, dz_tty, sizeof(dz_tty[0]));
mesg = " # RAW CAN OUT MODE ADDR DEL COL STATE PGRP DISC\n";
printf(mesg);
--- 378,386 -----
register char *mesg;
printf("1 cons\n");
! if (kflg)
! nl[SKL].n_value = clear(nl[SKL].n_value);
! lseek(fc, (long)nl[SKL].n_value, 0);
read(fc, dz_tty, sizeof(dz_tty[0]));
mesg = " # RAW CAN OUT MODE ADDR DEL COL STATE PGRP DISC\n";
printf(mesg);
***************
*** 382,388
printf("1 cons\n");
klseek(fc, (long)nl[SKL].n_value, 0);
read(fc, dz_tty, sizeof(dz_tty[0]));
! mesg = " # RAW CAN OUT MODE ADDR DEL COL STATE PGRP DISC\n";
printf(mesg);
ttyprt(&dz_tty[0], 0);
if (nl[SNDZ].n_type == 0)
--- 382,388 -----
nl[SKL].n_value = clear(nl[SKL].n_value);
lseek(fc, (long)nl[SKL].n_value, 0);
read(fc, dz_tty, sizeof(dz_tty[0]));
! mesg = " # RAW CAN OUT MODE ADDR DEL COL STATE PGRP DISC\n";
printf(mesg);
ttyprt(&dz_tty[0], 0);
if (nl[SNDZ].n_type == 0)
***************
*** 387,393
ttyprt(&dz_tty[0], 0);
if (nl[SNDZ].n_type == 0)
goto dh;
! klseek(fc, (long)nl[SNDZ].n_value, 0);
read(fc, &ndz, sizeof(ndz));
printf("%d dz lines\n", ndz);
klseek(fc, (long)nl[SDZ].n_value, 0);
--- 387,397 -----
ttyprt(&dz_tty[0], 0);
if (nl[SNDZ].n_type == 0)
goto dh;
! if (kflg) {
! nl[SNDZ].n_value = clear(nl[SNDZ].n_value);
! nl[SDZ].n_value = clear(nl[SDZ].n_value);
! }
! lseek(fc, (long)nl[SNDZ].n_value, 0);
read(fc, &ndz, sizeof(ndz));
printf("%d dz lines\n", ndz);
lseek(fc, (long)nl[SDZ].n_value, 0);
***************
*** 390,396
klseek(fc, (long)nl[SNDZ].n_value, 0);
read(fc, &ndz, sizeof(ndz));
printf("%d dz lines\n", ndz);
! klseek(fc, (long)nl[SDZ].n_value, 0);
read(fc, dz_tty, ndz * sizeof (struct tty));
for (tp = dz_tty; tp < &dz_tty[ndz]; tp++)
ttyprt(tp, tp - dz_tty);
--- 394,400 -----
lseek(fc, (long)nl[SNDZ].n_value, 0);
read(fc, &ndz, sizeof(ndz));
printf("%d dz lines\n", ndz);
! lseek(fc, (long)nl[SDZ].n_value, 0);
read(fc, dz_tty, ndz * sizeof (struct tty));
for (tp = dz_tty; tp < &dz_tty[ndz]; tp++)
ttyprt(tp, tp - dz_tty);
***************
*** 397,403
dh:
if (nl[SNDH].n_type == 0)
goto pty;
! klseek(fc, (long)nl[SNDH].n_value, 0);
read(fc, &ndz, sizeof(ndz));
printf("%d dh lines\n", ndz);
klseek(fc, (long)nl[SDH].n_value, 0);
--- 401,411 -----
dh:
if (nl[SNDH].n_type == 0)
goto pty;
! if (kflg) {
! nl[SNDH].n_value = clear(nl[SNDH].n_value);
! nl[SDH].n_value = clear(nl[SDH].n_value);
! }
! lseek(fc, (long)nl[SNDH].n_value, 0);
read(fc, &ndz, sizeof(ndz));
printf("%d dh lines\n", ndz);
lseek(fc, (long)nl[SDH].n_value, 0);
***************
*** 400,406
klseek(fc, (long)nl[SNDH].n_value, 0);
read(fc, &ndz, sizeof(ndz));
printf("%d dh lines\n", ndz);
! klseek(fc, (long)nl[SDH].n_value, 0);
read(fc, dz_tty, ndz * sizeof(struct tty));
for (tp = dz_tty; tp < &dz_tty[ndz]; tp++)
ttyprt(tp, tp - dz_tty);
--- 408,414 -----
lseek(fc, (long)nl[SNDH].n_value, 0);
read(fc, &ndz, sizeof(ndz));
printf("%d dh lines\n", ndz);
! lseek(fc, (long)nl[SDH].n_value, 0);
read(fc, dz_tty, ndz * sizeof(struct tty));
for (tp = dz_tty; tp < &dz_tty[ndz]; tp++)
ttyprt(tp, tp - dz_tty);
***************
*** 407,412
pty:
if (nl[SPTY].n_type == 0)
goto pty;
printf("32 pty lines\n");
klseek(fc, (long)nl[SPTY].n_value, 0);
read(fc, dz_tty, 32*sizeof(struct tty));
--- 415,423 -----
pty:
if (nl[SPTY].n_type == 0)
goto pty;
+ if (kflg) {
+ nl[SPTY].n_value = clear(nl[SPTY].n_value);
+ }
printf("32 pty lines\n");
lseek(fc, (long)nl[SPTY].n_value, 0);
read(fc, dz_tty, 32*sizeof(struct tty));
***************
*** 408,414
if (nl[SPTY].n_type == 0)
goto pty;
printf("32 pty lines\n");
! klseek(fc, (long)nl[SPTY].n_value, 0);
read(fc, dz_tty, 32*sizeof(struct tty));
for (tp = dz_tty; tp < &dz_tty[32]; tp++)
ttyprt(tp, tp - dz_tty);
--- 419,425 -----
nl[SPTY].n_value = clear(nl[SPTY].n_value);
}
printf("32 pty lines\n");
! lseek(fc, (long)nl[SPTY].n_value, 0);
read(fc, dz_tty, 32*sizeof(struct tty));
for (tp = dz_tty; tp < &dz_tty[32]; tp++)
ttyprt(tp, tp - dz_tty);
***************
*** 449,456
putf(tp->t_state&TS_ASLEEP, 'A');
putf(tp->t_state&TS_XCLUDE, 'X');
putf(tp->t_state&TS_HUPCLS, 'H');
- putf(tp->t_state&TS_TTSTOP, 'S');
- putf(tp->t_state&TS_TBLOCK, 'Q');
printf("%6d", tp->t_pgrp);
switch (tp->t_line) {
--- 460,465 -----
putf(tp->t_state&TS_ASLEEP, 'A');
putf(tp->t_state&TS_XCLUDE, 'X');
putf(tp->t_state&TS_HUPCLS, 'H');
printf("%6d", tp->t_pgrp);
switch (tp->t_line) {
***************
*** 599,605
nf = 0;
nfile = getw(nl[SNFILE].n_value);
xfile = (struct file *)calloc(nfile, sizeof (struct file));
! klseek(fc, (int)(afile = (struct file *)getw(nl[SFIL].n_value)), 0);
read(fc, xfile, nfile * sizeof (struct file));
for (fp=xfile; fp < &xfile[nfile]; fp++)
if (fp->f_count)
--- 608,614 -----
nf = 0;
nfile = getw(nl[SNFILE].n_value);
xfile = (struct file *)calloc(nfile, sizeof (struct file));
! lseek(fc, (int)(afile = (struct file *)getw(nl[SFIL].n_value)), 0);
read(fc, xfile, nfile * sizeof (struct file));
for (fp=xfile; fp < &xfile[nfile]; fp++)
if (fp->f_count)
***************
*** 660,666
swapmap = (struct map *)calloc(nswapmap, sizeof (struct map));
nswdev = getw(nl[SNSWDEV].n_value);
swdevt = (struct swdevt *)calloc(nswdev, sizeof (struct swdevt));
! klseek(fc, nl[SSWDEVT].n_value, L_SET);
read(fc, swdevt, nswdev * sizeof (struct swdevt));
klseek(fc, getw(nl[SPROC].n_value), 0);
read(fc, proc, nproc * sizeof (struct proc));
--- 669,675 -----
swapmap = (struct map *)calloc(nswapmap, sizeof (struct map));
nswdev = getw(nl[SNSWDEV].n_value);
swdevt = (struct swdevt *)calloc(nswdev, sizeof (struct swdevt));
! lseek(fc, nl[SSWDEVT].n_value, L_SET);
read(fc, swdevt, nswdev * sizeof (struct swdevt));
lseek(fc, getw(nl[SPROC].n_value), 0);
read(fc, proc, nproc * sizeof (struct proc));
***************
*** 662,668
swdevt = (struct swdevt *)calloc(nswdev, sizeof (struct swdevt));
klseek(fc, nl[SSWDEVT].n_value, L_SET);
read(fc, swdevt, nswdev * sizeof (struct swdevt));
! klseek(fc, getw(nl[SPROC].n_value), 0);
read(fc, proc, nproc * sizeof (struct proc));
klseek(fc, getw(nl[STEXT].n_value), 0);
read(fc, xtext, ntext * sizeof (struct text));
--- 671,677 -----
swdevt = (struct swdevt *)calloc(nswdev, sizeof (struct swdevt));
lseek(fc, nl[SSWDEVT].n_value, L_SET);
read(fc, swdevt, nswdev * sizeof (struct swdevt));
! lseek(fc, getw(nl[SPROC].n_value), 0);
read(fc, proc, nproc * sizeof (struct proc));
lseek(fc, getw(nl[STEXT].n_value), 0);
read(fc, xtext, ntext * sizeof (struct text));
***************
*** 664,670
read(fc, swdevt, nswdev * sizeof (struct swdevt));
klseek(fc, getw(nl[SPROC].n_value), 0);
read(fc, proc, nproc * sizeof (struct proc));
! klseek(fc, getw(nl[STEXT].n_value), 0);
read(fc, xtext, ntext * sizeof (struct text));
klseek(fc, getw(nl[SWAPMAP].n_value), 0);
read(fc, swapmap, nswapmap * sizeof (struct map));
--- 673,679 -----
read(fc, swdevt, nswdev * sizeof (struct swdevt));
lseek(fc, getw(nl[SPROC].n_value), 0);
read(fc, proc, nproc * sizeof (struct proc));
! lseek(fc, getw(nl[STEXT].n_value), 0);
read(fc, xtext, ntext * sizeof (struct text));
lseek(fc, getw(nl[SWAPMAP].n_value), 0);
read(fc, swapmap, nswapmap * sizeof (struct map));
***************
*** 666,672
read(fc, proc, nproc * sizeof (struct proc));
klseek(fc, getw(nl[STEXT].n_value), 0);
read(fc, xtext, ntext * sizeof (struct text));
! klseek(fc, getw(nl[SWAPMAP].n_value), 0);
read(fc, swapmap, nswapmap * sizeof (struct map));
swapmap->m_name = "swap";
swapmap->m_limit = (struct mapent *)&swapmap[nswapmap];
--- 675,681 -----
read(fc, proc, nproc * sizeof (struct proc));
lseek(fc, getw(nl[STEXT].n_value), 0);
read(fc, xtext, ntext * sizeof (struct text));
! lseek(fc, getw(nl[SWAPMAP].n_value), 0);
read(fc, swapmap, nswapmap * sizeof (struct map));
swapmap->m_name = "swap";
swapmap->m_limit = (struct mapent *)&swapmap[nswapmap];
***************
*** 932,974
return;
badrmfree:
printf("bad rmfree\n");
- }
-
- /*
- * Stolen from ps asis.
- */
- klseek(fd, loc, off)
- int fd;
- long loc;
- int off;
- {
-
- /*
- * If this is a dump, then the kernel isn't doing the page mapping
- * for us. Simulate it.
- */
- if (kflg && (loc & 0x80000000) != 0) {
- long v;
- long addr;
- struct pte pte;
-
- loc &= 0x7fffffff;
- v = btop(loc);
- if(v >= nl[X_SYSSIZE].n_value) {
- printf("address botch %x\n", loc);
- return;
- }
- addr = (long)((struct pte *)nl[X_SYSMAP].n_value + v);
- lseek(fd, addr&0x7fffffff, 0);
- if(read(fd, (char *)&pte, sizeof(pte)) != sizeof(pte)) {
- printf("Error reading kmem for pte at %x\n", addr);
- return;
- }
- if (pte.pg_v == 0 && (pte.pg_fod || pte.pg_pfnum == 0)) {
- printf("pte bad for %x\n", addr);
- return;
- }
- loc = (long)ptob(pte.pg_pfnum) + (loc & PGOFSET);
- }
- (void) lseek(fd, (long)loc, off);
}
--- 941,944 -----
return;
badrmfree:
printf("bad rmfree\n");
}
More information about the Comp.bugs.4bsd.ucb-fixes
mailing list