- struct proc *proc;
- int nproc;
- struct text *xtext;
- int ntext;
- struct map *swapmap;
- int nswapmap;
- struct swdevt *swdevt, *sw;
- register struct proc *pp;
- int nswap, used, tused, free, waste;
- int db, sb;
- register struct mapent *me;
- register struct text *xp;
- int i, j;
- long rmalloc();
-
- nproc = getword(nl[SNPROC].n_value);
- ntext = getword(nl[SNTEXT].n_value);
- if (nproc < 0 || nproc > 10000 || ntext < 0 || ntext > 10000) {
- fprintf(stderr, "number of procs/texts is preposterous (%d, %d)\n",
- nproc, ntext);
- return;
- }
- proc = (struct proc *)calloc(nproc, sizeof (struct proc));
- if (proc == NULL) {
- fprintf(stderr, "can't allocate memory for proc table\n");
- exit(1);
- }
- xtext = (struct text *)calloc(ntext, sizeof (struct text));
- if (xtext == NULL) {
- fprintf(stderr, "can't allocate memory for text table\n");
- exit(1);
- }
- nswapmap = getword(nl[SNSWAPMAP].n_value);
- swapmap = (struct map *)calloc(nswapmap, sizeof (struct map));
- if (swapmap == NULL) {
- fprintf(stderr, "can't allocate memory for swapmap\n");
- exit(1);
- }
- nswdev = getword(nl[SNSWDEV].n_value);
- swdevt = (struct swdevt *)calloc(nswdev, sizeof (struct swdevt));
- if (swdevt == NULL) {
- fprintf(stderr, "can't allocate memory for swdevt table\n");
- exit(1);
- }
- kvm_read(nl[SSWDEVT].n_value, swdevt,
- nswdev * sizeof (struct swdevt));
- kvm_read(getword(nl[SPROC].n_value), proc,
- nproc * sizeof (struct proc));
- kvm_read(getword(nl[STEXT].n_value), xtext,
- ntext * sizeof (struct text));
- kvm_read(getword(nl[SWAPMAP].n_value), swapmap,
- nswapmap * sizeof (struct map));
-
- swapmap->m_name = "swap";
- swapmap->m_limit = (struct mapent *)&swapmap[nswapmap];
- dmmin = getword(nl[SDMMIN].n_value);
- dmmax = getword(nl[SDMMAX].n_value);
- nswap = 0;
- for (sw = swdevt; sw < &swdevt[nswdev]; sw++)
- if (sw->sw_freed)
- nswap += sw->sw_nblks;
- free = 0;
- for (me = (struct mapent *)(swapmap+1);
- me < (struct mapent *)&swapmap[nswapmap]; me++)
- free += me->m_size;
- tused = 0;
- for (xp = xtext; xp < &xtext[ntext]; xp++)
- if (xp->x_vptr!=NULL) {
- tused += ctod(clrnd(xp->x_size));
- if (xp->x_flag & XPAGV)
- tused += ctod(clrnd(ctopt(xp->x_size)));
- }
- used = tused;
- waste = 0;
- for (pp = proc; pp < &proc[nproc]; pp++) {
- if (pp->p_stat == 0 || pp->p_stat == SZOMB)
- continue;
- if (pp->p_flag & SSYS)
- continue;
- db = ctod(pp->p_dsize), sb = up(db);
- used += sb;
- waste += sb - db;
- db = ctod(pp->p_ssize), sb = up(db);
- used += sb;
- waste += sb - db;
- if ((pp->p_flag&SLOAD) == 0)
- used += ctod(vusize(pp));
- }
- if (totflg) {
-#define btok(x) ((x) / (1024 / DEV_BSIZE))
- printf("%3d/%3d 00k swap\n",
- btok(used/100), btok((used+free)/100));
- return;
- }
- printf("%dk used (%dk text), %dk free, %dk wasted, %dk missing\n",
- btok(used), btok(tused), btok(free), btok(waste),
-/* a dmmax/2 block goes to argmap */
- btok(nswap - dmmax/2 - (used + free)));
- printf("avail: ");
- for (i = dmmax; i >= dmmin; i /= 2) {
- j = 0;
- while (rmalloc(swapmap, i) != 0)
- j++;
- if (j) printf("%d*%dk ", j, btok(i));
- }
- free = 0;
- for (me = (struct mapent *)(swapmap+1);
- me < (struct mapent *)&swapmap[nswapmap]; me++)
- free += me->m_size;
- printf("%d*1k\n", btok(free));
-}