date and time created 92/07/13 00:40:45 by torek
authorChris Torek <torek@ucbvax.Berkeley.EDU>
Mon, 13 Jul 1992 15:40:45 +0000 (07:40 -0800)
committerChris Torek <torek@ucbvax.Berkeley.EDU>
Mon, 13 Jul 1992 15:40:45 +0000 (07:40 -0800)
SCCS-vsn: sys/sparc/sunos/makesyscalls.sh 7.1
SCCS-vsn: sys/sparc/sunos/sun_disklabel.c 7.1
SCCS-vsn: sys/sparc/sunos/sun_disklabel.h 7.1

usr/src/sys/sparc/sunos/makesyscalls.sh [new file with mode: 0644]
usr/src/sys/sparc/sunos/sun_disklabel.c [new file with mode: 0644]
usr/src/sys/sparc/sunos/sun_disklabel.h [new file with mode: 0644]

diff --git a/usr/src/sys/sparc/sunos/makesyscalls.sh b/usr/src/sys/sparc/sunos/makesyscalls.sh
new file mode 100644 (file)
index 0000000..c44b2d9
--- /dev/null
@@ -0,0 +1,171 @@
+#! /bin/sh -
+#      @(#)makesyscalls.sh     7.1 (Berkeley) %G%
+
+set -e
+
+# name of compat option:
+compat=XXX_UNUSED
+
+# output files:
+sysnames="sun_syscalls.c"
+syshdr="sun_syscall.h"
+syssw="sun_sysent.c"
+
+# tmp files:
+sysdcl="sysent.dcl"
+syscompat="sysent.compat"
+sysent="sysent.switch"
+
+trap "rm $sysdcl $syscompat $sysent" 0
+
+case $# in
+    0) echo "Usage: $0 input-file" 1>&2
+       exit 1
+       ;;
+esac
+
+awk < $1 "
+       BEGIN {
+               sysdcl = \"$sysdcl\"
+               syscompat = \"$syscompat\"
+               sysent = \"$sysent\"
+               sysnames = \"$sysnames\"
+               syshdr = \"$syshdr\"
+               compat = \"$compat\"
+               infile = \"$1\"
+               "'
+
+               printf "/*\n * System call switch table.\n *\n" > sysdcl
+               printf " * DO NOT EDIT-- this file is automatically generated.\n" > sysdcl
+
+               printf "\n#ifdef %s\n", compat > syscompat
+               printf "#define compat(n, name) n, __CONCAT(o,name)\n\n" > syscompat
+
+               printf "/*\n * System call names.\n *\n" > sysnames
+               printf " * DO NOT EDIT-- this file is automatically generated.\n" > sysnames
+
+               printf "/*\n * System call numbers.\n *\n" > syshdr
+               printf " * DO NOT EDIT-- this file is automatically generated.\n" > syshdr
+       }
+       NR == 1 {
+               printf " * created from%s\n */\n\n", $0 > sysdcl
+               printf "#include \"param.h\"\n" > sysdcl
+               printf "#include \"systm.h\"\n\n" > sysdcl
+               printf "int\tnosys();\n\n" > sysdcl
+
+               printf "struct sysent sunsys[] = {\n" > sysent
+
+               printf " * created from%s\n */\n\n", $0 > sysnames
+               printf "char *syscallnames[] = {\n" > sysnames
+
+               printf " * created from%s\n */\n\n", $0 > syshdr
+               next
+       }
+       NF == 0 || $1 ~ /^;/ {
+               next
+       }
+       $1 ~ /^#[       ]*if/ {
+               print > sysent
+               print > sysdcl
+               print > syscompat
+               print > sysnames
+               savesyscall = syscall
+               next
+       }
+       $1 ~ /^#[       ]*else/ {
+               print > sysent
+               print > sysdcl
+               print > syscompat
+               print > sysnames
+               syscall = savesyscall
+               next
+       }
+       $1 ~ /^#/ {
+               print > sysent
+               print > sysdcl
+               print > syscompat
+               print > sysnames
+               next
+       }
+       syscall != $1 {
+               printf "%s: line %d: syscall number out of sync at %d\n", \
+                  infile, NR, syscall
+               printf "line is:\n"
+               print
+               exit 1
+       }
+       {       comment = $4
+               for (i = 5; i <= NF; i++)
+                       comment = comment " " $i
+               if (NF < 5)
+                       $5 = $4
+       }
+       $2 == "STD" {
+               printf("int\t%s();\n", $4) > sysdcl
+               printf("\t%d, %s,\t\t\t/* %d = %s */\n", \
+                   $3, $4, syscall, $5) > sysent
+               printf("\t\"%s\",\t\t\t/* %d = %s */\n", \
+                   $5, syscall, $5) > sysnames
+               printf("#define\tSYS_%s\t%d\n", \
+                   $5, syscall) > syshdr
+               syscall++
+               next
+       }
+       $2 == "COMPAT" {
+               printf("int\to%s();\n", $4) > syscompat
+               printf("\tcompat(%d,%s),\t\t/* %d = old %s */\n", \
+                   $3, $4, syscall, $5) > sysent
+               printf("\t\"old.%s\",\t\t/* %d = old %s */\n", \
+                   $5, syscall, $5) > sysnames
+               printf("\t\t\t\t/* %d is old %s */\n", \
+                   syscall, comment) > syshdr
+               syscall++
+               next
+       }
+       $2 == "LIBCOMPAT" {
+               printf("int\to%s();\n", $4) > syscompat
+               printf("\tcompat(%d,%s),\t\t/* %d = old %s */\n", \
+                   $3, $4, syscall, $5) > sysent
+               printf("\t\"old.%s\",\t\t/* %d = old %s */\n", \
+                   $5, syscall, $5) > sysnames
+               printf("#define\tSYS_%s\t%d\t/* compatibility; still used by libc */\n", \
+                   $5, syscall) > syshdr
+               syscall++
+               next
+       }
+       $2 == "OBSOL" {
+               printf("\t0, nosys,\t\t\t/* %d = obsolete %s */\n", \
+                   syscall, comment) > sysent
+               printf("\t\"obs_%s\",\t\t\t/* %d = obsolete %s */\n", \
+                   $4, syscall, comment) > sysnames
+               printf("\t\t\t\t/* %d is obsolete %s */\n", \
+                   syscall, comment) > syshdr
+               syscall++
+               next
+       }
+       $2 == "UNIMPL" {
+               printf("\t0, nosys,\t\t\t/* %d = %s */\n", \
+                   syscall, comment) > sysent
+               printf("\t\"#%d\",\t\t\t/* %d = %s */\n", \
+                   syscall, syscall, comment) > sysnames
+               syscall++
+               next
+       }
+       {
+               printf "%s: line %d: unrecognized keyword %s\n", infile, NR, $2
+               exit 1
+       }
+       END {
+               printf("\n#else /* %s */\n", compat) > syscompat
+               printf("#define compat(n, name) 0, nosys\n") > syscompat
+               printf("#endif /* %s */\n\n", compat) > syscompat
+
+               printf("};\n\n") > sysent
+               printf("int\tnsunsys = sizeof(sunsys) / sizeof(sunsys[0]);\n") > sysent
+
+               printf("};\n") > sysnames
+       } '
+
+cat $sysdcl $syscompat $sysent >$syssw
+
+chmod 444 $sysnames $syshdr $syssw
diff --git a/usr/src/sys/sparc/sunos/sun_disklabel.c b/usr/src/sys/sparc/sunos/sun_disklabel.c
new file mode 100644 (file)
index 0000000..c181ad6
--- /dev/null
@@ -0,0 +1,111 @@
+/*
+ * Copyright (c) 1992 The Regents of the University of California.
+ * All rights reserved.
+ *
+ * This software was developed by the Computer Systems Engineering group
+ * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and
+ * contributed to Berkeley.
+ *
+ * %sccs.include.redist.c%
+ *
+ *     @(#)sun_disklabel.c     7.1 (Berkeley) %G%
+ *
+ * from: $Header: sun_disklabel.c,v 1.5 92/06/17 07:04:12 torek Exp $
+ */
+
+/*
+ * SunOS disk label code.
+ */
+
+#include "sys/param.h"
+#include "sys/disklabel.h"
+#include "sys/device.h"
+#include "sys/disk.h"
+#include "sys/ioctl.h"
+
+#include "sun_disklabel.h"
+
+/*
+ * Take a sector (cp) containing a SunOS disk label and set lp to a BSD
+ * disk label.
+ */
+int
+sun_disklabel(cp, lp)
+       register caddr_t cp;
+       register struct disklabel *lp;
+{
+       register u_short *sp;
+       register struct sun_disklabel *sl;
+       register int i, v;
+
+       sp = (u_short *)(cp + sizeof(struct sun_disklabel));
+       --sp;
+       v = 0;
+       while (sp >= (u_short *)cp)
+               v ^= *sp--;
+       if (v)
+               return (0);
+       sl = (struct sun_disklabel *)cp;
+       lp->d_magic = 0;        /* denote as pseudo */
+       lp->d_ncylinders = sl->sl_ncylinders;
+       lp->d_acylinders = sl->sl_acylinders;
+       v = (lp->d_ntracks = sl->sl_ntracks) *
+           (lp->d_nsectors = sl->sl_nsectors);
+       lp->d_secpercyl = v;
+       lp->d_npartitions = 8;
+       for (i = 0; i < 8; i++) {
+               lp->d_partitions[i].p_offset =
+                   sl->sl_part[i].sdkp_cyloffset * v;
+               lp->d_partitions[i].p_size = sl->sl_part[i].sdkp_nsectors;
+       }
+       return (1);
+}
+
+int
+sun_dkioctl(dk, cmd, data, partition)
+       struct dkdevice *dk;
+       int cmd;
+       caddr_t data;
+       int partition;
+{
+       register struct partition *p;
+
+       switch (cmd) {
+
+       case DKIOCGGEOM:
+#define geom ((struct sun_dkgeom *)data)
+               bzero(data, sizeof(*geom));
+               geom->sdkc_ncylinders = dk->dk_label.d_ncylinders;
+               geom->sdkc_acylinders = dk->dk_label.d_acylinders;
+               geom->sdkc_ntracks = dk->dk_label.d_ntracks;
+               geom->sdkc_nsectors = dk->dk_label.d_nsectors;
+               geom->sdkc_interleave = dk->dk_label.d_interleave;
+               geom->sdkc_sparespercyl = dk->dk_label.d_sparespercyl;
+               geom->sdkc_rpm = dk->dk_label.d_rpm;
+               geom->sdkc_pcylinders =
+                   dk->dk_label.d_ncylinders + dk->dk_label.d_acylinders;
+#undef geom
+               break;
+
+       case DKIOCINFO:
+               /* Homey don't do DKIOCINFO */
+               bzero(data, sizeof(struct sun_dkctlr));
+               break;
+
+       case DKIOCGPART:
+               if (dk->dk_label.d_secpercyl == 0)
+                       return (ERANGE);        /* XXX */
+               p = &dk->dk_label.d_partitions[partition];
+               if (p->p_offset % dk->dk_label.d_secpercyl != 0)
+                       return (ERANGE);        /* XXX */
+#define part ((struct sun_dkpart *)data)
+               part->sdkp_cyloffset = p->p_offset / dk->dk_label.d_secpercyl;
+               part->sdkp_nsectors = p->p_size;
+#undef part
+               break;
+
+       default:
+               return (-1);
+       }
+       return (0);
+}
diff --git a/usr/src/sys/sparc/sunos/sun_disklabel.h b/usr/src/sys/sparc/sunos/sun_disklabel.h
new file mode 100644 (file)
index 0000000..cc11071
--- /dev/null
@@ -0,0 +1,82 @@
+/*
+ * Copyright (c) 1992 The Regents of the University of California.
+ * All rights reserved.
+ *
+ * This software was developed by the Computer Systems Engineering group
+ * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and
+ * contributed to Berkeley.
+ *
+ * %sccs.include.redist.c%
+ *
+ *     @(#)sun_disklabel.h     7.1 (Berkeley) %G%
+ *
+ * from: $Header: sun_disklabel.h,v 1.4 92/06/17 07:04:13 torek Exp $
+ */
+
+/*
+ * SunOS disk label layout (only relevant portions discovered here).
+ */
+
+#define        SUN_DKMAGIC     55998
+
+/* These are the guys that Sun's dkinfo needs... */
+#define DKIOCGGEOM     _IOR('d', 2, struct sun_dkgeom) /* geometry info */
+#define DKIOCINFO      _IOR('d', 8, struct sun_dkctlr) /* controller info */
+#define DKIOCGPART     _IOR('d', 4, struct sun_dkpart) /* partition info */
+
+/* geometry info */
+struct sun_dkgeom {
+       u_short sdkc_ncylinders;        /* data cylinders */
+       u_short sdkc_acylinders;        /* alternate cylinders */
+       u_short sdkc_xxx1;
+       u_short sdkc_ntracks;           /* tracks per cylinder */
+       u_short sdkc_xxx2;
+       u_short sdkc_nsectors;          /* sectors per track */
+       u_short sdkc_interleave;        /* interleave factor */
+       u_short sdkc_xxx3;
+       u_short sdkc_xxx4;
+       u_short sdkc_sparespercyl;      /* spare sectors per cylinder */
+       u_short sdkc_rpm;               /* rotational speed */
+       u_short sdkc_pcylinders;        /* physical cylinders */
+       u_short sdkc_xxx5[7];
+};
+
+/* controller info */
+struct sun_dkctlr {
+       int     sdkc_addr;              /* controller address */
+       short   sdkc_unit;              /* unit (slave) address */
+       short   sdkc_type;              /* controller type */
+       short   sdkc_flags;             /* flags */
+};
+
+/* partition info */
+struct sun_dkpart {
+       long    sdkp_cyloffset;         /* starting cylinder */
+       long    sdkp_nsectors;          /* number of sectors */
+};
+
+struct sun_disklabel {                 /* total size = 512 bytes */
+       char    sl_text[128];
+       char    sl_xxx1[292];
+       u_short sl_rpm;                 /* rotational speed */
+       char    sl_xxx2[2];
+       u_short sl_sparespercyl;        /* spare sectors per cylinder */
+       char    sl_xxx3[4];
+       u_short sl_interleave;          /* interleave factor */
+       u_short sl_ncylinders;          /* data cylinders */
+       u_short sl_acylinders;          /* alternate cylinders */
+       u_short sl_ntracks;             /* tracks per cylinder */
+       u_short sl_nsectors;            /* sectors per track */
+       char    sl_xxx4[4];
+       struct sun_dkpart sl_part[8];   /* partition layout */
+       u_short sl_magic;               /* == SUN_DKMAGIC */
+       u_short sl_cksum;               /* xor checksum of all shorts */
+};
+
+#ifdef KERNEL
+/* reads sun label in sector at [cp..cp+511] and sets *lp to BSD label */
+int    sun_disklabel __P((caddr_t, struct disklabel *)); /* true on success */
+
+/* compatability dk ioctl's */
+int    sun_dkioctl __P((struct dkdevice *, int, caddr_t, int));
+#endif