changes designed so that ESIS and ARP may use routing table
[unix-history] / usr / src / usr.bin / systat / swap.c
index bd776a6..91ff969 100644 (file)
@@ -1,26 +1,37 @@
+/*
+ * Copyright (c) 1980 Regents of the University of California.
+ * All rights reserved.  The Berkeley software License Agreement
+ * specifies the terms and conditions for redistribution.
+ */
+
 #ifndef lint
 #ifndef lint
-static char *sccsid = "@(#)swap.c      1.4 (Lucasfilm) %G%";
-#endif
+static char sccsid[] = "@(#)swap.c     5.7 (Berkeley) %G%";
+#endif not lint
 
 #include "systat.h"
 
 #include "systat.h"
-
-#include <sys/map.h>
-#include <sys/conf.h>
+#include <sys/user.h>
+#include <sys/proc.h>
 #include <sys/text.h>
 #include <sys/text.h>
+#include <sys/conf.h>
+#include <sys/vmmac.h>
+#include <machine/pte.h>
+#include <paths.h>
 
 
-/* these don't belong here */
-#define X_PROC          0
-#define X_NPROC         1
-#define X_USRPTMAP      4
-#define X_USRPT         5
-#define X_NSWAP         6
-#define X_DMMIN         9
-#define X_DMMAX         10
-#define X_NSWDEV        11
-#define        X_SWDEVT        12
-#define        X_NTEXT         13
-#define        X_TEXT          14
-#define        X_DMTEXT        15
+WINDOW *
+openswap()
+{
+       return (subwin(stdscr, LINES-5-1, 0, 5, 0));
+}
+
+closeswap(w)
+       WINDOW *w;
+{
+       if (w == NULL)
+               return;
+       wclear(w);
+       wrefresh(w);
+       delwin(w);
+}
 
 int    dmmin;
 int    dmmax;
 
 int    dmmin;
 int    dmmax;
@@ -29,127 +40,17 @@ int        nswdev;
 #define        MAXSWAPDEV      4
 short  buckets[MAXSWAPDEV][NDMAP];
 struct swdevt *swdevt;
 #define        MAXSWAPDEV      4
 short  buckets[MAXSWAPDEV][NDMAP];
 struct swdevt *swdevt;
-struct proc *kprocp;
-int    ntext;
-int    textaddr;
-struct text *xtext;
-
-initswap()
-{
-
-        if (nswdev == 0) {
-                dmmin = getw(nlst[X_DMMIN].n_value);
-                dmmax = getw(nlst[X_DMMAX].n_value);
-                dmtext = getw(nlst[X_DMTEXT].n_value);
-                nswdev = getw(nlst[X_NSWDEV].n_value);
-               swdevt = (struct swdevt *)calloc(nswdev, sizeof (*swdevt));
-               klseek(kmem, nlst[X_SWDEVT].n_value, L_SET);
-               read(kmem, swdevt, nswdev * sizeof (struct swdevt));
-               ntext = getw(nlst[X_NTEXT].n_value);
-               textaddr = getw(nlst[X_TEXT].n_value);
-        }
-        if (procp == NULL) {
-                procp = getw(nlst[X_PROC].n_value);
-                nproc = getw(nlst[X_NPROC].n_value);
-        }
-       if (xtext == NULL)
-               xtext = (struct text *)calloc(ntext, sizeof (struct text));
-       if (kprocp == NULL)
-                kprocp = (struct proc *)calloc(nproc, sizeof (struct proc));
-        if (usrpt != NULL)
-                return;
-       usrpt = (struct pte *)nlst[X_USRPT].n_value;
-       Usrptma = (struct pte *)nlst[X_USRPTMAP].n_value;
-       if (pt == NULL)
-               pt = (struct p_times *)malloc(nproc * sizeof (struct p_times));
-}
-
-fetchswap()
-{
-
-       if (kprocp == NULL) {
-                kprocp = (struct proc *)malloc(sizeof (*kprocp) * nproc);
-               if (kprocp == NULL)
-                       return;
-       }
-        lseek(kmem, procp, L_SET);
-        if (read(kmem, kprocp, sizeof (struct proc) * nproc) !=
-           sizeof (struct proc) * nproc) {
-               error("couldn't read proc table");
-               return;
-       }
-       if (xtext == NULL) {
-               xtext = (struct text *)calloc(ntext, sizeof (struct text));
-               if (xtext == NULL)
-                       return;
-       }
-       lseek(kmem, textaddr, L_SET);
-       if (read(kmem, xtext, ntext * sizeof (struct text)) !=
-           sizeof (struct text) * ntext)
-               error("couldn't read text table");
-}
-
-#ifdef vax
-char   *devnames[] =
-     { "hp", "ht", "up", "rk", "sw", "tm", "ts", "mt", "tu", "ra", "ut",
-       "rb", "rx", "rl" };
-#endif
 int    colwidth;
 
 int    colwidth;
 
-labelswap()
-{
-       register int i, j;
-       register int row;
-
-       if (nswdev == 0)
-               initswap();
-       if (nswdev == 0) {
-               mvaddstr(22, 0, "Can't find number of swap devices.\n");
-               return;
-       }
-        move(5, 0);
-       colwidth = (70 - (nswdev - 1)) / nswdev;
-       row = swaplabel(5, dmtext, 1);
-       (void) swaplabel(row, dmmax, 0);
-}
-
-swaplabel(row, dmbound, donames)
-       register int row;
-       int dmbound, donames;
-{
-       register int i, j;
-
-       for (i = 0; i < nswdev; i++) {
-               if (donames) {
-                       move(row, 5 + i * (1 + colwidth) + (colwidth - 3) / 2);
-                       printw("%s%d", devnames[major(swdevt[i].sw_dev)],
-                           minor(swdevt[i].sw_dev) >> 3);
-               }
-               for (j = 0; j + 5 < colwidth; j += 5) {
-                       move(row + donames, 5 + i * (1 + colwidth) + j);
-                       printw("/%-2d  ", j);
-               }
-       }
-       row += 1 + donames;
-       for (j = 0, i = dmmin; i <= dmbound; i *= 2, j++, row++) {
-               int k;
-
-               mvprintw(row, 0, "%4d|", i);
-               for (k = 1; k < nswdev; k++)
-                       mvwaddch(wnd, row - 3, k * (1 + colwidth) - 1, '|');
-       }
-       return (row);
-}
-
 extern union {
 extern union {
-        struct  user user;
-        char    upages[UPAGES][NBPG];
+       struct  user user;
+       char    upages[UPAGES][NBPG];
 } user;
 #define u       user.user
 
 showswap()
 {
 } user;
 #define u       user.user
 
 showswap()
 {
-        register int i, j;
+       register int i, j;
        register struct proc *pp;
        register struct text *xp;
        register int row;
        register struct proc *pp;
        register struct text *xp;
        register int row;
@@ -159,7 +60,7 @@ showswap()
        if (xtext == 0)
                return;
        for (xp = xtext; xp < &xtext[ntext]; xp++) {
        if (xtext == 0)
                return;
        for (xp = xtext; xp < &xtext[ntext]; xp++) {
-               if (xp->x_iptr == NULL)
+               if (xp->x_vptr == NULL)
                        continue;
                ts = ctod(xp->x_size);
                dp = xp->x_daddr;
                        continue;
                ts = ctod(xp->x_size);
                dp = xp->x_daddr;
@@ -171,14 +72,14 @@ showswap()
                        buckets[swatodev(*dp)][dmtoindex(j)]++;
                        dp++;
                }
                        buckets[swatodev(*dp)][dmtoindex(j)]++;
                        dp++;
                }
-               if ((xp->x_flag & XPAGI) && xp->x_ptdaddr)
+               if ((xp->x_flag & XPAGV) && xp->x_ptdaddr)
                        buckets[swatodev(xp->x_ptdaddr)]
                            [dmtoindex(ctod(ctopt(xp->x_size)))]++;
        }
                        buckets[swatodev(xp->x_ptdaddr)]
                            [dmtoindex(ctod(ctopt(xp->x_size)))]++;
        }
-       row = swapdisplay(4, dmtext, 'X');
+       row = swapdisplay(2, dmtext, 'X');
        if (kprocp == NULL)
                return;
        if (kprocp == NULL)
                return;
-        for (i = 0, pp = kprocp; i < nproc; i++, pp++) {
+       for (i = 0, pp = kprocp; i < nproc; i++, pp++) {
                if (pp->p_stat == 0 || pp->p_stat == SZOMB)
                        continue;
                if (pp->p_flag & SSYS)
                if (pp->p_stat == 0 || pp->p_stat == SZOMB)
                        continue;
                if (pp->p_flag & SSYS)
@@ -191,10 +92,12 @@ showswap()
                if ((pp->p_flag & SLOAD) == 0)
                        vusize(pp);
 #endif
                if ((pp->p_flag & SLOAD) == 0)
                        vusize(pp);
 #endif
-        }
-       (void) swapdisplay(row + 1, dmmax, 'X');
+       }
+       (void) swapdisplay(1+row, dmmax, 'X');
 }
 
 }
 
+#define        OFFSET  5                       /* left hand column */
+
 swapdisplay(baserow, dmbound, c)
        int baserow, dmbound;
        char c;
 swapdisplay(baserow, dmbound, c)
        int baserow, dmbound;
        char c;
@@ -206,7 +109,7 @@ swapdisplay(baserow, dmbound, c)
        for (row = baserow, i = dmmin; i <= dmbound; i *= 2, row++) {
                for (j = 0; j < nswdev; j++) {
                        pb = &buckets[j][row - baserow];
        for (row = baserow, i = dmmin; i <= dmbound; i *= 2, row++) {
                for (j = 0; j < nswdev; j++) {
                        pb = &buckets[j][row - baserow];
-                       wmove(wnd, row, j * (1 + colwidth));
+                       wmove(wnd, row, OFFSET + j * (1 + colwidth));
                        k = MIN(*pb, colwidth);
                        if (*pb > colwidth) {
                                sprintf(buf, " %d", *pb);
                        k = MIN(*pb, colwidth);
                        if (*pb > colwidth) {
                                sprintf(buf, " %d", *pb);
@@ -260,3 +163,145 @@ dmtoindex(dm)
        error("dmtoindex(%d)", dm);
        return (NDMAP - 1);
 }
        error("dmtoindex(%d)", dm);
        return (NDMAP - 1);
 }
+
+static struct nlist nlst[] = {
+#define X_PROC          0
+       { "_proc" },
+#define X_NPROC         1
+       { "_nproc" },
+#define X_USRPTMAP      2
+       { "_Usrptmap" },
+#define X_USRPT         3
+       { "_usrpt" },
+#define X_NSWAP         4
+       { "_nswap" },
+#define X_DMMIN         5
+       { "_dmmin" },
+#define X_DMMAX         6
+       { "_dmmax" },
+#define        X_DMTEXT        7
+       { "_dmtext" },
+#define X_NSWDEV        8
+       { "_nswdev" },
+#define        X_SWDEVT        9
+       { "_swdevt" },
+#define        X_NTEXT         10
+       { "_ntext" },
+#define        X_TEXT          11
+       { "_text" },
+       { "" }
+};
+
+initswap()
+{
+       if (nlst[X_PROC].n_type == 0) {
+               nlist(_PATH_UNIX, nlst);
+               if (nlst[X_PROC].n_type == 0) {
+                       error("namelist on %s failed", _PATH_UNIX);
+                       return(0);
+               }
+       }
+       if (nswdev == 0) {
+               dmmin = getw(nlst[X_DMMIN].n_value);
+               dmmax = getw(nlst[X_DMMAX].n_value);
+               dmtext = getw(nlst[X_DMTEXT].n_value);
+               nswdev = getw(nlst[X_NSWDEV].n_value);
+               if (nswdev > MAXSWAPDEV)
+                       nswdev = MAXSWAPDEV;
+               swdevt = (struct swdevt *)calloc(nswdev, sizeof (*swdevt));
+               klseek(kmem, nlst[X_SWDEVT].n_value, L_SET);
+               read(kmem, swdevt, nswdev * sizeof (struct swdevt));
+               ntext = getw(nlst[X_NTEXT].n_value);
+               textp = getw(nlst[X_TEXT].n_value);
+       }
+       if (procp == NULL) {
+               procp = getw(nlst[X_PROC].n_value);
+               nproc = getw(nlst[X_NPROC].n_value);
+       }
+       if (xtext == NULL)
+               xtext = (struct text *)calloc(ntext, sizeof (struct text));
+       if (kprocp == NULL)
+               kprocp = (struct proc *)calloc(nproc, sizeof (struct proc));
+       if (usrpt != NULL)
+               return(1);
+       usrpt = (struct pte *)nlst[X_USRPT].n_value;
+       Usrptma = (struct pte *)nlst[X_USRPTMAP].n_value;
+       if (pt == NULL)
+               pt = (struct p_times *)malloc(nproc * sizeof (struct p_times));
+       return(1);
+}
+
+fetchswap()
+{
+       if (nlst[X_PROC].n_type == 0)
+               return;
+       if (kprocp == NULL) {
+               kprocp = (struct proc *)malloc(sizeof (*kprocp) * nproc);
+               if (kprocp == NULL)
+                       return;
+       }
+       lseek(kmem, procp, L_SET);
+       if (read(kmem, kprocp, sizeof (struct proc) * nproc) !=
+           sizeof (struct proc) * nproc) {
+               error("couldn't read proc table");
+               return;
+       }
+       if (xtext == NULL) {
+               xtext = (struct text *)calloc(ntext, sizeof (struct text));
+               if (xtext == NULL)
+                       return;
+       }
+       lseek(kmem, textp, L_SET);
+       if (read(kmem, xtext, ntext * sizeof (struct text)) !=
+           sizeof (struct text) * ntext)
+               error("couldn't read text table");
+}
+
+#ifdef vax
+char   *devnames[] =
+     { "hp", "ht", "up", "rk", "sw", "tm", "ts", "mt", "tu", "ra", "ut",
+       "rb", "rx", "rl" };
+#endif
+#ifdef tahoe
+char   *devnames[] = { "ud", "vd", "xp", "cy", "sw" };
+#endif
+
+labelswap()
+{
+       register int row;
+
+       if (nswdev == 0) {
+               error("Don't know how many swap devices.\n");
+               return;
+       }
+       colwidth = (COLS - OFFSET - (nswdev - 1)) / nswdev;
+       row = swaplabel(0, dmtext, 1);
+       (void) swaplabel(row, dmmax, 0);
+}
+
+swaplabel(row, dmbound, donames)
+       register int row;
+       int dmbound, donames;
+{
+       register int i, j;
+
+       for (i = 0; i < nswdev; i++) {
+               if (donames)
+                       mvwprintw(wnd,
+                           row, OFFSET + i*(1 + colwidth) + (colwidth - 3)/2,
+                           "%s%d", devnames[major(swdevt[i].sw_dev)],
+                               minor(swdevt[i].sw_dev) >> 3);
+               for (j = 0; j + 5 < colwidth; j += 5)
+                       mvwprintw(wnd, row + donames,
+                           OFFSET + i*(1 + colwidth) + j, "/%-2d  ", j);
+       }
+       row += 1 + donames;
+       for (j = 0, i = dmmin; i <= dmbound; i *= 2, j++, row++) {
+               int k;
+
+               mvwprintw(wnd, row, 0, "%4d|", i);
+               for (k = 1; k < nswdev; k++)
+                       mvwaddch(wnd, row, OFFSET + k*(1 + colwidth) - 1, '|');
+       }
+       return (row);
+}