summaryrefslogtreecommitdiff
path: root/usr.sbin/mopd/mopa.out/mopa.out.c
diff options
context:
space:
mode:
authorMats O Jansson <maja@cvs.openbsd.org>1996-09-21 13:49:18 +0000
committerMats O Jansson <maja@cvs.openbsd.org>1996-09-21 13:49:18 +0000
commitd94dff674a83ccc51db1a01ffeb6e5d45b58ea9d (patch)
treee1fdf2dca3d2654c695f000ec56cebc29dabbbf4 /usr.sbin/mopd/mopa.out/mopa.out.c
parent36f1b197c477854a9d173adfd44fd5b0e57f6f54 (diff)
Initial import of mopd-2.5.3. -moj
Diffstat (limited to 'usr.sbin/mopd/mopa.out/mopa.out.c')
-rw-r--r--usr.sbin/mopd/mopa.out/mopa.out.c154
1 files changed, 154 insertions, 0 deletions
diff --git a/usr.sbin/mopd/mopa.out/mopa.out.c b/usr.sbin/mopd/mopa.out/mopa.out.c
new file mode 100644
index 00000000000..b05f7733585
--- /dev/null
+++ b/usr.sbin/mopd/mopa.out/mopa.out.c
@@ -0,0 +1,154 @@
+
+/* mopa.out - Convert a Unix format kernel into something that
+ * can be transfered via MOP.
+ *
+ * This code was written while refering to the NetBSD/vax boot
+ * loader. Therefore anything that can be booted by the Vax
+ * should be convertable with this program.
+ *
+ * If necessary, the a.out header is stripped, and the program
+ * segments are padded out. The BSS segment is zero filled.
+ * A header is prepended that looks like an IHD header. In
+ * particular the Unix mahine ID is placed where mopd expects
+ * the image type to be (offset is IHD_W_ALIAS). If the machine
+ * ID could be mistaken for a DEC image type, then the conversion
+ * is aborted. The original a.out header is copied into the front
+ * of the header so that once we have detected the Unix machine
+ * ID we can haul the load address and the xfer address out.
+ */
+
+/*
+ * Copyright (c) 1996 Lloyd Parkes. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by Lloyd Parkes.
+ * 4. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef LINT
+static char rcsid[] = "$Id: mopa.out.c,v 1.1 1996/09/21 13:49:17 maja Exp $";
+#endif
+
+#include "os.h"
+#include "common/common.h"
+#include "common/mopdef.h"
+#include "common/file.h"
+#if defined(__NetBSD__) || defined(__OpenBSD__)
+#include <sys/exec_aout.h>
+#endif
+#if defined(__FreeBSD__)
+#include <sys/imgact_aout.h>
+#endif
+#if defined(__bsdi__)
+#include <a.out.h>
+#define NOAOUT
+#endif
+#if !defined(MID_VAX)
+#define MID_VAX 140
+#endif
+
+u_char header[512]; /* The VAX header we generate is 1 block. */
+struct exec ex, ex_swap;
+
+int
+main (int argc, char **argv)
+{
+ FILE *out; /* A FILE because that is easier. */
+ int i;
+ struct dllist dl;
+
+#ifdef NOAOUT
+ fprintf(stderr, "%s: has no function in OS/BSD\n", argv[0]);
+ return(1);
+#endif
+
+ if (argc != 3) {
+ fprintf (stderr, "usage: %s kernel-in sys-out\n", argv[0]);
+ return (1);
+ }
+
+ dl.ldfd = open (argv[1], O_RDONLY);
+ if (dl.ldfd == -1) {
+ perror (argv[1]);
+ return (2);
+ }
+
+ GetFileInfo(dl.ldfd,
+ &dl.loadaddr,
+ &dl.xferaddr,
+ &dl.aout,
+ &dl.a_text,&dl.a_text_fill,
+ &dl.a_data,&dl.a_data_fill,
+ &dl.a_bss ,&dl.a_bss_fill );
+
+ if (dl.aout == -1) {
+ fprintf(stderr,"s%: not an a.out file\n",argv[1]);
+ return (3);
+ }
+
+ if (dl.aout != MID_VAX) {
+ fprintf(stderr,"%s: file is not a VAX image (mid=%d)\n",
+ argv[1],dl.aout);
+ return (4);
+ }
+
+ i = dl.a_text + dl.a_text_fill + dl.a_data + dl.a_data_fill +
+ dl.a_bss + dl.a_bss_fill;
+ i = (i+1) / 512;
+
+ dl.nloadaddr = dl.loadaddr;
+ dl.lseek = lseek(dl.ldfd,0L,SEEK_CUR);
+ dl.a_lseek = 0;
+ dl.count = 0;
+ dl.dl_bsz = 512;
+
+ mopFilePutLX(header,IHD_W_SIZE,0xd4,2); /* Offset to ISD section. */
+ mopFilePutLX(header,IHD_W_ACTIVOFF,0x30,2);/* Offset to 1st section.*/
+ mopFilePutLX(header,IHD_W_ALIAS,IHD_C_NATIVE,2);/* It's a VAX image.*/
+ mopFilePutLX(header,IHD_B_HDRBLKCNT,1,1); /* Only one header block. */
+ mopFilePutLX(header,0x30+IHA_L_TFRADR1,dl.xferaddr,4); /* Xfer Addr */
+ mopFilePutLX(header,0xd4+ISD_W_PAGCNT,i,2);/* Imagesize in blks.*/
+
+ out = fopen (argv[2], "w");
+ if (!out) {
+ perror (argv[2]);
+ return (2);
+ }
+
+ /* Now we do the actual work. Write VAX MOP-image header */
+
+ fwrite (header, sizeof (header), 1, out);
+
+ fprintf (stderr, "copying %lu", dl.a_text);
+ fprintf (stderr, "+%lu", dl.a_data);
+ fprintf (stderr, "+%lu", dl.a_bss);
+ fprintf (stderr, "->%lu", dl.xferaddr);
+ fprintf (stderr, "\n");
+
+ while ((i = mopFileRead(&dl,header)) > 0) {
+ (void)fwrite(header, i, 1, out);
+ }
+
+ fclose (out);
+}