From 591fd60492abf36e4c07d349b836ff40228df09e Mon Sep 17 00:00:00 2001 From: Waldemar Brodkorb Date: Fri, 28 Apr 2017 19:47:09 +0200 Subject: mopd: add new package for alpha netboot --- package/mopd/src/mopa.out/mopa.out.c | 147 +++++++++++++++++++++++++++++++++++ 1 file changed, 147 insertions(+) create mode 100644 package/mopd/src/mopa.out/mopa.out.c (limited to 'package/mopd/src/mopa.out/mopa.out.c') diff --git a/package/mopd/src/mopa.out/mopa.out.c b/package/mopd/src/mopa.out/mopa.out.c new file mode 100644 index 000000000..177e8116a --- /dev/null +++ b/package/mopd/src/mopa.out/mopa.out.c @@ -0,0 +1,147 @@ +/* $NetBSD: mopa.out.c,v 1.5 1997/10/16 23:25:09 lukem Exp $ */ + +/* 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. + */ + +#include +#ifndef lint +__RCSID("$NetBSD: mopa.out.c,v 1.5 1997/10/16 23:25:09 lukem Exp $"); +#endif + +#include "os.h" +#include "common/common.h" +#include "common/mopdef.h" +#include "common/file.h" +#if defined(__NetBSD__) || defined(__OpenBSD__) +#include +#endif +#if defined(__FreeBSD__) +#include +#endif +#if defined(__bsdi__) || defined(__Linux__) +#include +#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; + + extern char *__progname; /* from crt0.o */ + +#ifdef NOAOUT + errx(1, "has no function in NetBSD"); +#endif + + if (argc != 3) { + fprintf (stderr, "usage: %s kernel-in sys-out\n", __progname); + return (1); + } + + dl.ldfd = open (argv[1], O_RDONLY); + if (dl.ldfd == -1) + err(2, "open `%s'", argv[1]); + + 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) + errx(3, "`%s' is not an a.out file", argv[1]); + + if (dl.aout != MID_VAX) + printf("WARNING: `%s' is not a VAX image (mid=%d)\n", + argv[1], dl.aout); + + 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) + err(2, "writing `%s'", argv[2]); + + /* Now we do the actual work. Write VAX MOP-image header */ + + fwrite (header, sizeof (header), 1, out); + + fprintf(stderr, "copying %u+%u+%u->%u\n", dl.a_text, + dl.a_data, dl.a_bss, dl.xferaddr); + + while ((i = mopFileRead(&dl,header)) > 0) { + (void)fwrite(header, i, 1, out); + } + + fclose (out); + return (0); +} -- cgit v1.2.3