can't reset it if not set up
[unix-history] / usr / src / usr.sbin / kgmon / kgmon.c
index b766b86..4ebc137 100644 (file)
@@ -1,11 +1,22 @@
-/* Copyright (c) 1982 Regents of the University of California */
+/*
+ * Copyright (c) 1983 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[] = "@(#)kgmon.c    4.7 83/03/10";
-#endif
+char copyright[] =
+"@(#) Copyright (c) 1983 Regents of the University of California.\n\
+ All rights reserved.\n";
+#endif not lint
+
+#ifndef lint
+static char sccsid[] = "@(#)kgmon.c    5.3 (Berkeley) %G%";
+#endif not lint
 
 #include <sys/param.h>
 #include <machine/pte.h>
 
 #include <sys/param.h>
 #include <machine/pte.h>
+#include <sys/file.h>
 #include <sys/vm.h>
 #include <stdio.h>
 #include <nlist.h>
 #include <sys/vm.h>
 #include <stdio.h>
 #include <nlist.h>
@@ -47,6 +58,13 @@ struct nlist nl[] = {
        0,
 };
 
        0,
 };
 
+#if defined(vax)
+#define        clear(x)        ((x) &~ 0x80000000)
+#endif
+#if defined(tahoe)
+#define        clear(x)        ((x) &~ 0xc0000000)
+#endif
+
 struct pte *Sysmap;
 
 char   *system = "/vmunix";
 struct pte *Sysmap;
 
 char   *system = "/vmunix";
@@ -59,26 +77,26 @@ main(argc, argv)
        int argc;
        char *argv[];
 {
        int argc;
        char *argv[];
 {
-       int mode, disp, openmode = 0;
+       int mode, disp, openmode = O_RDONLY;
 
        argc--, argv++;
 
        argc--, argv++;
-       while (argv[0][0] == '-') {
+       while (argc > 0 && argv[0][0] == '-') {
                switch (argv[0][1]) {
                case 'b':
                        bflag++;
                switch (argv[0][1]) {
                case 'b':
                        bflag++;
-                       openmode = 2;
+                       openmode = O_RDWR;
                        break;
                case 'h':
                        hflag++;
                        break;
                case 'h':
                        hflag++;
-                       openmode = 2;
+                       openmode = O_RDWR;
                        break;
                case 'r':
                        rflag++;
                        break;
                case 'r':
                        rflag++;
-                       openmode = 2;
+                       openmode = O_RDWR;
                        break;
                case 'p':
                        pflag++;
                        break;
                case 'p':
                        pflag++;
-                       openmode = 2;
+                       openmode = O_RDWR;
                        break;
                default:
                        printf("Usage: kgmon [ -b -h -r -p system memory ]\n");
                        break;
                default:
                        printf("Usage: kgmon [ -b -h -r -p system memory ]\n");
@@ -101,7 +119,7 @@ main(argc, argv)
        }
        kmem = open(kmemf, openmode);
        if (kmem < 0) {
        }
        kmem = open(kmemf, openmode);
        if (kmem < 0) {
-               openmode = 0;
+               openmode = O_RDONLY;
                kmem = open(kmemf, openmode);
                if (kmem < 0) {
                        fprintf(stderr, "cannot open ");
                kmem = open(kmemf, openmode);
                if (kmem < 0) {
                        fprintf(stderr, "cannot open ");
@@ -122,8 +140,8 @@ main(argc, argv)
        if (kflag) {
                off_t off;
 
        if (kflag) {
                off_t off;
 
-               off = nl[N_SYSMAP].n_value & 0x7fffffff;
-               lseek(kmem, off, 0);
+               off = clear(nl[N_SYSMAP].n_value);
+               lseek(kmem, off, L_SET);
                nl[N_SYSSIZE].n_value *= 4;
                Sysmap = (struct pte *)malloc(nl[N_SYSSIZE].n_value);
                if (Sysmap == 0) {
                nl[N_SYSSIZE].n_value *= 4;
                Sysmap = (struct pte *)malloc(nl[N_SYSSIZE].n_value);
                if (Sysmap == 0) {
@@ -140,7 +158,7 @@ main(argc, argv)
        else
                disp = mode;
        if (pflag) {
        else
                disp = mode;
        if (pflag) {
-               if (openmode == 0 && mode == PROFILING_ON)
+               if (openmode == O_RDONLY && mode == PROFILING_ON)
                        fprintf(stderr, "data may be inconsistent\n");
                dumpstate();
        }
                        fprintf(stderr, "data may be inconsistent\n");
                dumpstate();
        }
@@ -169,7 +187,7 @@ dumpstate()
        }
        ssiz = kfetch(N_SSIZ);
        sbuf = kfetch(N_SBUF);
        }
        ssiz = kfetch(N_SSIZ);
        sbuf = kfetch(N_SBUF);
-       klseek(kmem, (off_t)sbuf, 0);
+       klseek(kmem, (off_t)sbuf, L_SET);
        for (i = ssiz; i > 0; i -= BUFSIZ) {
                read(kmem, buf, i < BUFSIZ ? i : BUFSIZ);
                write(fd, buf, i < BUFSIZ ? i : BUFSIZ);
        for (i = ssiz; i > 0; i -= BUFSIZ) {
                read(kmem, buf, i < BUFSIZ ? i : BUFSIZ);
                write(fd, buf, i < BUFSIZ ? i : BUFSIZ);
@@ -178,7 +196,7 @@ dumpstate()
        fromssize = s_textsize / HASHFRACTION;
        froms = (u_short *)malloc(fromssize);
        kfroms = kfetch(N_FROMS);
        fromssize = s_textsize / HASHFRACTION;
        froms = (u_short *)malloc(fromssize);
        kfroms = kfetch(N_FROMS);
-       klseek(kmem, kfroms, 0);
+       klseek(kmem, kfroms, L_SET);
        i = read(kmem, ((char *)(froms)), fromssize);
        if (i != fromssize) {
                fprintf(stderr, "read froms: request %d, got %d", fromssize, i);
        i = read(kmem, ((char *)(froms)), fromssize);
        if (i != fromssize) {
                fprintf(stderr, "read froms: request %d, got %d", fromssize, i);
@@ -188,7 +206,7 @@ dumpstate()
        tossize = (s_textsize * ARCDENSITY / 100) * sizeof(struct tostruct);
        tos = (struct tostruct *)malloc(tossize);
        ktos = kfetch(N_TOS);
        tossize = (s_textsize * ARCDENSITY / 100) * sizeof(struct tostruct);
        tos = (struct tostruct *)malloc(tossize);
        ktos = kfetch(N_TOS);
-       klseek(kmem, ktos, 0);
+       klseek(kmem, ktos, L_SET);
        i = read(kmem, ((char *)(tos)), tossize);
        if (i != tossize) {
                fprintf(stderr, "read tos: request %d, got %d", tossize, i);
        i = read(kmem, ((char *)(tos)), tossize);
        if (i != tossize) {
                fprintf(stderr, "read tos: request %d, got %d", tossize, i);
@@ -233,7 +251,7 @@ resetstate()
        sbuf = kfetch(N_SBUF);
        ssiz -= sizeof(struct phdr);
        sbuf += sizeof(struct phdr);
        sbuf = kfetch(N_SBUF);
        ssiz -= sizeof(struct phdr);
        sbuf += sizeof(struct phdr);
-       klseek(kmem, (off_t)sbuf, 0);
+       klseek(kmem, (off_t)sbuf, L_SET);
        for (i = ssiz; i > 0; i -= BUFSIZ)
                if (write(kmem, buf, i < BUFSIZ ? i : BUFSIZ) < 0) {
                        perror("sbuf write");
        for (i = ssiz; i > 0; i -= BUFSIZ)
                if (write(kmem, buf, i < BUFSIZ ? i : BUFSIZ) < 0) {
                        perror("sbuf write");
@@ -242,7 +260,7 @@ resetstate()
        s_textsize = kfetch(N_S_TEXTSIZE);
        fromssize = s_textsize / HASHFRACTION;
        kfroms = kfetch(N_FROMS);
        s_textsize = kfetch(N_S_TEXTSIZE);
        fromssize = s_textsize / HASHFRACTION;
        kfroms = kfetch(N_FROMS);
-       klseek(kmem, kfroms, 0);
+       klseek(kmem, kfroms, L_SET);
        for (i = fromssize; i > 0; i -= BUFSIZ)
                if (write(kmem, buf, i < BUFSIZ ? i : BUFSIZ) < 0) {
                        perror("kforms write");
        for (i = fromssize; i > 0; i -= BUFSIZ)
                if (write(kmem, buf, i < BUFSIZ ? i : BUFSIZ) < 0) {
                        perror("kforms write");
@@ -250,7 +268,7 @@ resetstate()
                }
        tossize = (s_textsize * ARCDENSITY / 100) * sizeof(struct tostruct);
        ktos = kfetch(N_TOS);
                }
        tossize = (s_textsize * ARCDENSITY / 100) * sizeof(struct tostruct);
        ktos = kfetch(N_TOS);
-       klseek(kmem, ktos, 0);
+       klseek(kmem, ktos, L_SET);
        for (i = tossize; i > 0; i -= BUFSIZ)
                if (write(kmem, buf, i < BUFSIZ ? i : BUFSIZ) < 0) {
                        perror("ktos write");
        for (i = tossize; i > 0; i -= BUFSIZ)
                if (write(kmem, buf, i < BUFSIZ ? i : BUFSIZ) < 0) {
                        perror("ktos write");
@@ -267,7 +285,7 @@ turnonoff(onoff)
                printf("profiling: not defined in kernel\n");
                exit(10);
        }
                printf("profiling: not defined in kernel\n");
                exit(10);
        }
-       klseek(kmem, off, 0);
+       klseek(kmem, off, L_SET);
        write(kmem, (char *)&onoff, sizeof (onoff));
 }
 
        write(kmem, (char *)&onoff, sizeof (onoff));
 }
 
@@ -281,7 +299,7 @@ kfetch(index)
                printf("%s: not defined in kernel\n", nl[index].n_name);
                exit(11);
        }
                printf("%s: not defined in kernel\n", nl[index].n_name);
                exit(11);
        }
-       if (klseek(kmem, off, 0) == -1) {
+       if (klseek(kmem, off, L_SET) == -1) {
                perror("lseek");
                exit(12);
        }
                perror("lseek");
                exit(12);
        }
@@ -298,9 +316,7 @@ klseek(fd, base, off)
 
        if (kflag) {
                /* get kernel pte */
 
        if (kflag) {
                /* get kernel pte */
-#if vax
-               base &= 0x7fffffff;
-#endif
+               base = clear(base);
                base = ((int)ptob(Sysmap[btop(base)].pg_pfnum))+(base&(NBPG-1));
        }
        return (lseek(fd, base, off));
                base = ((int)ptob(Sysmap[btop(base)].pg_pfnum))+(base&(NBPG-1));
        }
        return (lseek(fd, base, off));