static char *sccsid
= "@(#) (Berkeley) 82/05/10";
#define clear(x) ((int)x&0x7fffffff)
char *fcore
= "/dev/kmem";
char *fnlist
= "/vmunix";
while (argc
> 0 && **argv
== '-') {
sscanf( *argv
++, "%x", &ubase
);
if ((fc
= open(fcore
, 0)) < 0) {
printf("Can't find %s\n", fcore
);
usrpt
= (struct pte
*)nl
[USRPT
].n_value
;
Usrptma
= (struct pte
*)nl
[USRPTMA
].n_value
;
register struct inode
*ip
;
struct inode
*xinode
, *ainode
;
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
++)
printf("%3d/%3d inodes\n", nin
, ninode
);
printf("%d/%d active inodes\n", nin
, ninode
);
printf(" LOC FLAGS CNT DEVICE INO MODE NLK UID SIZE/DEV\n");
for (ip
= xinode
; ip
< &xinode
[ninode
]; ip
++) {
printf("%8.1x ", ainode
+ (ip
- xinode
));
putf(ip
->i_flag
&ILOCK
, 'L');
putf(ip
->i_flag
&IUPD
, 'U');
putf(ip
->i_flag
&IACC
, 'A');
putf(ip
->i_flag
&IMOUNT
, 'M');
putf(ip
->i_flag
&IWANT
, 'W');
putf(ip
->i_flag
&ITEXT
, 'T');
printf("%4d", ip
->i_count
&0377);
printf("%4d,%3d", major(ip
->i_dev
), minor(ip
->i_dev
));
printf("%6d", ip
->i_number
);
printf("%6x", ip
->i_mode
& 0xffff);
printf("%4d", ip
->i_nlink
);
printf("%4d", ip
->i_uid
);
if ((ip
->i_mode
&IFMT
)==IFBLK
|| (ip
->i_mode
&IFMT
)==IFCHR
)
printf("%6d,%3d", major(ip
->i_rdev
), minor(ip
->i_rdev
));
printf("%10ld", ip
->i_size
);
read(fc
, &word
, sizeof (word
));
register struct text
*xp
;
struct text
*xtext
, *atext
;
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
++)
printf("%3d/%3d texts\n", ntx
, ntext
);
printf("%d/%d active texts\n", ntx
, ntext
);
printf(" LOC FLAGS DADDR CADDR RSS SIZE IPTR CNT CCNT\n");
for (xp
= xtext
; xp
< &xtext
[ntext
]; xp
++) {
printf("%8.1x", atext
+ (xp
- xtext
));
putf(xp
->x_flag
&XPAGI
, 'P');
putf(xp
->x_flag
&XTRC
, 'T');
putf(xp
->x_flag
&XWRIT
, 'W');
putf(xp
->x_flag
&XLOAD
, 'L');
putf(xp
->x_flag
&XLOCK
, 'K');
putf(xp
->x_flag
&XWANT
, 'w');
printf("%5x", xp
->x_daddr
[0]);
printf("%11x", xp
->x_caddr
);
printf("%5d", xp
->x_rssize
);
printf("%5d", xp
->x_size
);
printf("%10.1x", xp
->x_iptr
);
printf("%5d", xp
->x_count
&0377);
printf("%5d", xp
->x_ccount
);
struct proc
*xproc
, *aproc
;
register struct proc
*pp
;
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
));
for (pp
=xproc
; pp
< &xproc
[nproc
]; pp
++)
printf("%3d/%3d processes\n", np
, nproc
);
printf("%d/%d processes\n", np
, nproc
);
printf(" LOC S F POIP PRI SIG UID SLP TIM CPU NI PGRP PID PPID ADDR RSS SRSS SIZE WCHAN LINK TEXTP CLKT\n");
for (pp
=xproc
; pp
<&xproc
[nproc
]; pp
++) {
if (pp
->p_stat
==0 && allflg
==0)
printf("%8x", aproc
+ (pp
- xproc
));
printf(" %2d", pp
->p_stat
);
printf(" %4x", pp
->p_flag
& 0xffff);
printf(" %4d", pp
->p_poip
);
printf(" %3d", pp
->p_pri
);
printf(" %8x", pp
->p_sig
);
printf(" %4d", pp
->p_uid
);
printf(" %3d", pp
->p_slptime
);
printf(" %3d", pp
->p_time
);
printf(" %4d", pp
->p_cpu
&0377);
printf(" %3d", pp
->p_nice
);
printf(" %6d", pp
->p_pgrp
);
printf(" %6d", pp
->p_pid
);
printf(" %6d", pp
->p_ppid
);
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
);
printf(" %4x", pp
->p_swrss
);
printf(" %5x", pp
->p_dsize
+pp
->p_ssize
);
printf(" %7x", clear(pp
->p_wchan
));
printf(" %7x", clear(pp
->p_link
));
printf(" %7x", clear(pp
->p_textp
));
printf(" %u", pp
->p_clktim
);
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";
if (nl
[SNDZ
].n_type
== 0)
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);
read(fc
, dz_tty
, ndz
* sizeof (struct tty
));
for (tp
= dz_tty
; tp
< &dz_tty
[ndz
]; tp
++)
if (nl
[SNDH
].n_type
== 0)
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);
read(fc
, dz_tty
, ndz
* sizeof(struct tty
));
for (tp
= dz_tty
; tp
< &dz_tty
[ndz
]; tp
++)
if (nl
[SPTY
].n_type
== 0)
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
++)
printf("%4d%4d", 0, tp->t_inbuf);
printf("%4d%4d", tp->t_inbuf, 0);
printf("%4d", tp
->t_rawq
.c_cc
);
printf("%4d", tp
->t_canq
.c_cc
);
printf("%4d", tp
->t_outq
.c_cc
);
printf("%8.1o", tp
->t_flags
);
printf(" %8.1x", tp
->t_addr
);
printf("%3d", tp
->t_delct
);
printf("%4d ", tp
->t_col
);
putf(tp
->t_state
&TS_TIMEOUT
, 'T');
putf(tp
->t_state
&TS_WOPEN
, 'W');
putf(tp
->t_state
&TS_ISOPEN
, 'O');
putf(tp
->t_state
&TS_CARR_ON
, 'C');
putf(tp
->t_state
&TS_BUSY
, 'B');
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
);
/* This wins only if PAGSIZ > sizeof (struct user) */
lseek(fc
, ubase
* NBPG
, 0);
while (ip
< &U
.u_arg
[0]) {
if ((ip
- (int *)&U
.u_pcb
) % 4 == 0)
if ((ip
- (int *)&U
.u_pcb
) % 4 == 0)
if ((ip
- (int *)&U
.u_pcb
) % 4 != 0)
printf(" %.1x", U
.u_arg
[i
]);
for (i
=0; i
<sizeof(label_t
)/sizeof(int); i
++) {
printf("%9.1x", U
.u_ssav
[i
]);
printf("segflg\t%d\nerror %d\n", U
.u_segflg
, U
.u_error
);
printf("uids\t%d,%d,%d,%d\n", U
.u_uid
,U
.u_gid
,U
.u_ruid
,U
.u_rgid
);
printf("procp\t%.1x\n", U
.u_procp
);
printf("ap\t%.1x\n", U
.u_ap
);
printf("r_val?\t%.1x %.1x\n", U
.u_r
.r_val1
, U
.u_r
.r_val2
);
printf("base, count, offset %.1x %.1x %ld\n", U
.u_base
,
printf("cdir rdir %.1x %.1x\n", U
.u_cdir
, U
.u_rdir
);
printf("dirp %.1x\n", U
.u_dirp
);
printf("dent %d %.14s\n", U
.u_dent
.d_ino
, U
.u_dent
.d_name
);
printf("pdir %.1o\n", U
.u_pdir
);
printf("%9.1x", U
.u_ofile
[i
]);
for (i
=10; i
<NOFILE
; i
++)
printf("%9.1x", U
.u_ofile
[i
]);
printf("%9.1x", U
.u_pofile
[i
]);
for (i
=10; i
<NOFILE
; i
++)
printf("%9.1x", U
.u_pofile
[i
]);
for (i
=0; i
<sizeof(label_t
)/sizeof(int); i
++) {
printf("%9.1x", U
.u_ssav
[i
]);
printf("%.1x ", U
.u_signal
[i
]);
printf("code\t%.1x\n", U
.u_code
);
printf("ar0\t%.1x\n", U
.u_ar0
);
printf("prof\t%X %X %X %X\n", U
.u_prof
.pr_base
, U
.u_prof
.pr_size
,
U
.u_prof
.pr_off
, U
.u_prof
.pr_scale
);
printf("\neosys\t%d\n", U
.u_eosys
);
printf("sep\t%d\n", U
.u_sep
);
printf("ttyp\t%.1x\n", U
.u_ttyp
);
printf("ttyd\t%d,%d\n", major(U
.u_ttyd
), minor(U
.u_ttyd
));
printf("comm %.14s\n", U
.u_comm
);
printf("start\t%D\n", U
.u_start
);
printf("acflag\t%D\n", U
.u_acflag
);
printf("fpflag\t%D\n", U
.u_fpflag
);
printf("cmask\t%D\n", U
.u_cmask
);
printf("sizes\t%.1x %.1x %.1x\n", U
.u_tsize
, U
.u_dsize
, U
.u_ssize
);
for (i
= 0; i
< sizeof(U
.u_vm
)/sizeof(int); i
++)
for (i
= 0; i
< sizeof(U
.u_vm
)/sizeof(int); i
++)
printf("%x ", 0140000+2*i);
struct file
*xfile
, *afile
;
register struct file
*fp
;
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
++)
printf("%3d/%3d files\n", nf
, nfile
);
printf("%d/%d open files\n", nf
, nfile
);
printf(" LOC FLG CNT INO OFFS|SOCK\n");
for (fp
=xfile
,loc
=nl
[SFIL
].n_value
; fp
< &xfile
[nfile
]; fp
++,loc
+=sizeof(xfile
[0])) {
putf(fp
->f_flag
&FREAD
, 'R');
putf(fp
->f_flag
&FWRITE
, 'W');
putf(fp
->f_flag
&FSOCKET
, 'S');
printf("%4d", mask(fp
->f_count
));
printf("%9.1x", fp
->f_inode
);
printf(" %x\n", fp
->f_socket
);
printf(" %ld\n", fp
->f_offset
);
register struct proc
*pp
;
int nswap
, used
, tused
, free
;
register struct mapent
*me
;
register struct text
*xp
;
nproc
= getw(nl
[SNPROC
].n_value
);
proc
= (struct proc
*)calloc(nproc
, sizeof (struct proc
));
lseek(fc
, getw(nl
[SPROC
].n_value
), 0);
read(fc
, proc
, nproc
* sizeof (struct proc
));
nswapmap
= getw(nl
[SNSWAPMAP
].n_value
);
swapmap
= (struct map
*)calloc(nswapmap
, sizeof (struct map
));
lseek(fc
, getw(nl
[SWAPMAP
].n_value
), 0);
read(fc
, swapmap
, nswapmap
* sizeof (struct map
));
nswap
= getw(nl
[SNSWAP
].n_value
);
for (me
= (struct mapent
*)(swapmap
+1);
me
< (struct mapent
*)&swapmap
[nswapmap
]; me
++)
ntext
= getw(nl
[SNTEXT
].n_value
);
xtext
= (struct text
*)calloc(ntext
, sizeof (struct text
));
lseek(fc
, getw(nl
[STEXT
].n_value
), 0);
read(fc
, xtext
, ntext
* sizeof (struct text
));
for (xp
= xtext
; xp
< &xtext
[ntext
]; xp
++)
for (pp
= proc
; pp
< &proc
[nproc
]; pp
++) {
if (pp
->p_stat
== 0 || pp
->p_stat
== SZOMB
)
used
+= up(pp
->p_dsize
) + up(pp
->p_ssize
);
if ((pp
->p_flag
&SLOAD
) == 0)
/* a DMMAX/2 block goes to argmap */
printf("%3d/%3d 00k swap\n", used
/2/100, (used
+free
)/2/100);
printf("%d used (%d text), %d free, %d missing\n",
used
/2, tused
/2, free
/2, (nswap
- DMMAX
/2 - (used
+ free
))/2);
register int tsz
= p
->p_tsize
/ NPTEPG
;
return (clrnd(UPAGES
+ clrnd(ctopt(p
->p_tsize
+p
->p_dsize
+p
->p_ssize
+UPAGES
)) - tsz
));
return (clrnd(xp
->x_size
+ ctopt(xp
->x_size
)));