Module Name:    src
Committed By:   tsutsui
Date:           Sun Sep 15 03:56:58 UTC 2024

Modified Files:
        src/distrib/sets/lists/base: md.macppc
        src/etc/etc.macppc: Makefile.inc
        src/share/mk: bsd.own.mk
        src/sys/arch/macppc/stand: Makefile
        src/tools: Makefile
        src/tools/macppc_installboot: Makefile
Added Files:
        src/etc/etc.macppc: hfsmap.lst hide-hfs.lst hide-jol.lst
        src/sys/arch/macppc/stand/boothfs: Makefile
        src/sys/arch/macppc/stand/installboot: Makefile installboot.c
            installboot.h
        src/sys/arch/macppc/stand/mkboothfs: Makefile mkboothfs.c
        src/tools/macppc_mkboothfs: Makefile
Removed Files:
        src/distrib/cdrom/macppc_installboot: Makefile installboot.c
            installboot.h
        src/distrib/cdrom/macppc_mkboothfs: Makefile mkboothfs.c

Log Message:
Move macppc bootable installcd stuff to sys/arch/macppc/stand dirs.

- move installboot (for CD ISO) and mkboothfs (for mkhybrid(8)) tools to
  sys/arch/macppc/stand
- also build mkboothfs as ${TOOL_MACPPCMKBOOTHFS} in src/tools
- explicitly generate boothfs file (for mkhybrid(8)) in
  sys/arch/macppc/stand/boothfs and install it into /usr/mdec
- use installed /usr/mdec/boothfs to create macppc bootable iso
- move list files for mkhybrid(8) hfs options to etc/etc.macppc


To generate a diff of this commit:
cvs rdiff -u -r1.14 -r0 src/distrib/cdrom/macppc_installboot/Makefile
cvs rdiff -u -r1.7 -r0 src/distrib/cdrom/macppc_installboot/installboot.c
cvs rdiff -u -r1.5 -r0 src/distrib/cdrom/macppc_installboot/installboot.h
cvs rdiff -u -r1.6 -r0 src/distrib/cdrom/macppc_mkboothfs/Makefile
cvs rdiff -u -r1.4 -r0 src/distrib/cdrom/macppc_mkboothfs/mkboothfs.c
cvs rdiff -u -r1.37 -r1.38 src/distrib/sets/lists/base/md.macppc
cvs rdiff -u -r1.13 -r1.14 src/etc/etc.macppc/Makefile.inc
cvs rdiff -u -r0 -r1.1 src/etc/etc.macppc/hfsmap.lst \
    src/etc/etc.macppc/hide-hfs.lst src/etc/etc.macppc/hide-jol.lst
cvs rdiff -u -r1.1400 -r1.1401 src/share/mk/bsd.own.mk
cvs rdiff -u -r1.7 -r1.8 src/sys/arch/macppc/stand/Makefile
cvs rdiff -u -r0 -r1.1 src/sys/arch/macppc/stand/boothfs/Makefile
cvs rdiff -u -r0 -r1.5 src/sys/arch/macppc/stand/installboot/Makefile
cvs rdiff -u -r0 -r1.9 src/sys/arch/macppc/stand/installboot/installboot.c
cvs rdiff -u -r0 -r1.1 src/sys/arch/macppc/stand/installboot/installboot.h
cvs rdiff -u -r0 -r1.1 src/sys/arch/macppc/stand/mkboothfs/Makefile \
    src/sys/arch/macppc/stand/mkboothfs/mkboothfs.c
cvs rdiff -u -r1.225 -r1.226 src/tools/Makefile
cvs rdiff -u -r1.1 -r1.2 src/tools/macppc_installboot/Makefile
cvs rdiff -u -r0 -r1.1 src/tools/macppc_mkboothfs/Makefile

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/distrib/sets/lists/base/md.macppc
diff -u src/distrib/sets/lists/base/md.macppc:1.37 src/distrib/sets/lists/base/md.macppc:1.38
--- src/distrib/sets/lists/base/md.macppc:1.37	Thu Jul 11 20:41:06 2024
+++ src/distrib/sets/lists/base/md.macppc	Sun Sep 15 03:56:57 2024
@@ -1,5 +1,6 @@
-# $NetBSD: md.macppc,v 1.37 2024/07/11 20:41:06 riastradh Exp $
+# $NetBSD: md.macppc,v 1.38 2024/09/15 03:56:57 tsutsui Exp $
 #
+./usr/mdec/boothfs				base-sysutil-bin
 ./usr/mdec/bootxx				base-sysutil-bin
 ./usr/mdec/installboot				base-obsolete		obsolete
 ./usr/mdec/mbr					base-obsolete		obsolete

Index: src/etc/etc.macppc/Makefile.inc
diff -u src/etc/etc.macppc/Makefile.inc:1.13 src/etc/etc.macppc/Makefile.inc:1.14
--- src/etc/etc.macppc/Makefile.inc:1.13	Sat Jun  8 13:07:48 2024
+++ src/etc/etc.macppc/Makefile.inc	Sun Sep 15 03:56:57 2024
@@ -1,4 +1,4 @@
-#	$NetBSD: Makefile.inc,v 1.13 2024/06/08 13:07:48 tsutsui Exp $
+#	$NetBSD: Makefile.inc,v 1.14 2024/09/15 03:56:57 tsutsui Exp $
 #
 #	etc.macppc/Makefile.inc -- macppc-specific etc Makefile targets
 #
@@ -17,19 +17,15 @@ INSTALLATION_DIRS+=	installation/floppy
 
 # For "make iso-image"
 # mkisofs arguments to create a hybrid (HFS/Rockridge) CD-ROM image.
-# XXX: files in ${DISTRIB_CDROMDIR} should be moved under distrib/macppc/cdrom?
-DISTRIB_CDROMDIR=	${NETBSDSRCDIR}/distrib/cdrom
+ETCMACHINEDIR=		${.CURDIR}/etc.${MACHINE}
 
-BOOTHFS=		boothfs
-UUDECODE_FILES=		${BOOTHFS}
-.SUFFIXES:	.uue
-.PATH.uue: ${DISTRIB_CDROMDIR}
+BOOTHFS=		${DESTDIR}/usr/mdec/boothfs
 
 MKISOFS_FLAGS+=	-hide-rr-moved \
-	-hfs -part -hide-hfs-list ${DISTRIB_CDROMDIR}/hide-hfs.lst \
-	--macbin -map ${DISTRIB_CDROMDIR}/hfsmap.lst \
-	-hide-joliet-list ${DISTRIB_CDROMDIR}/hide-jol.lst \
-	-boot-hfs-file ${.OBJDIR}/${BOOTHFS}
+	-hfs -part -hide-hfs-list ${ETCMACHINEDIR}/hide-hfs.lst \
+	--macbin -map ${ETCMACHINEDIR}/hfsmap.lst \
+	-hide-joliet-list ${ETCMACHINEDIR}/hide-jol.lst \
+	-boot-hfs-file ${BOOTHFS}
 # exclude large debug sets to avoid 700MB overflow
 MKISOFS_FLAGS+=	-m debug.tgz -m xdebug.tgz
 

Index: src/share/mk/bsd.own.mk
diff -u src/share/mk/bsd.own.mk:1.1400 src/share/mk/bsd.own.mk:1.1401
--- src/share/mk/bsd.own.mk:1.1400	Tue Aug 27 21:52:39 2024
+++ src/share/mk/bsd.own.mk	Sun Sep 15 03:56:57 2024
@@ -1,4 +1,4 @@
-#	$NetBSD: bsd.own.mk,v 1.1400 2024/08/27 21:52:39 christos Exp $
+#	$NetBSD: bsd.own.mk,v 1.1401 2024/09/15 03:56:57 tsutsui Exp $
 
 # This needs to be before bsd.init.mk
 .if defined(BSD_MK_COMPAT_FILE)
@@ -502,6 +502,7 @@ TOOL_LLVM_TBLGEN=	${TOOLDIR}/bin/${_TOOL
 TOOL_M4=		${TOOLDIR}/bin/${_TOOL_PREFIX}m4
 TOOL_MACPPCFIXCOFF=	${TOOLDIR}/bin/${_TOOL_PREFIX}macppc-fixcoff
 TOOL_MACPPCINSTALLBOOT=	${TOOLDIR}/bin/${_TOOL_PREFIX}macppc_installboot
+TOOL_MACPPCMKBOOTHFS=	${TOOLDIR}/bin/${_TOOL_PREFIX}macppc_mkboothfs
 TOOL_MAKEFS=		${TOOLDIR}/bin/${_TOOL_PREFIX}makefs
 TOOL_MAKEINFO=		${TOOLDIR}/bin/${_TOOL_PREFIX}makeinfo
 TOOL_MAKEKEYS=		${TOOLDIR}/bin/${_TOOL_PREFIX}makekeys

Index: src/sys/arch/macppc/stand/Makefile
diff -u src/sys/arch/macppc/stand/Makefile:1.7 src/sys/arch/macppc/stand/Makefile:1.8
--- src/sys/arch/macppc/stand/Makefile:1.7	Sun Dec 11 12:18:06 2005
+++ src/sys/arch/macppc/stand/Makefile	Sun Sep 15 03:56:57 2024
@@ -1,10 +1,11 @@
-#	$NetBSD: Makefile,v 1.7 2005/12/11 12:18:06 christos Exp $
+#	$NetBSD: Makefile,v 1.8 2024/09/15 03:56:57 tsutsui Exp $
 
 .include <bsd.own.mk>
 
 .if (${USETOOLS} != "yes")
-SUBDIR=		fixcoff .WAIT
+SUBDIR=		fixcoff mkboothfs .WAIT
 .endif
 SUBDIR+=	bootxx ofwboot
+SUBDIR+=	boothfs
 
 .include <bsd.subdir.mk>

Index: src/tools/Makefile
diff -u src/tools/Makefile:1.225 src/tools/Makefile:1.226
--- src/tools/Makefile:1.225	Sun Aug 18 14:11:21 2024
+++ src/tools/Makefile	Sun Sep 15 03:56:58 2024
@@ -1,4 +1,4 @@
-#	$NetBSD: Makefile,v 1.225 2024/08/18 14:11:21 christos Exp $
+#	$NetBSD: Makefile,v 1.226 2024/09/15 03:56:58 tsutsui Exp $
 
 .include <bsd.own.mk>
 .include <bsd.endian.mk>
@@ -173,6 +173,7 @@ SUBDIR+=	ibmnws-ncdcs
 .if ${MACHINE} == "macppc"
 SUBDIR+=	macppc-fixcoff
 SUBDIR+=	macppc_installboot
+SUBDIR+=	macppc_mkboothfs
 .endif
 
 .if (${MACHINE} == "prep" || ${MACHINE} == "rs6000" || ${MACHINE} == "bebox")

Index: src/tools/macppc_installboot/Makefile
diff -u src/tools/macppc_installboot/Makefile:1.1 src/tools/macppc_installboot/Makefile:1.2
--- src/tools/macppc_installboot/Makefile:1.1	Sat Jun  8 13:03:41 2024
+++ src/tools/macppc_installboot/Makefile	Sun Sep 15 03:56:58 2024
@@ -1,9 +1,9 @@
-#	$NetBSD: Makefile,v 1.1 2024/06/08 13:03:41 tsutsui Exp $
+#	$NetBSD: Makefile,v 1.2 2024/09/15 03:56:58 tsutsui Exp $
 
 .include <bsd.hostinit.mk>
 
 HOSTPROGNAME=	${_TOOL_PREFIX}macppc_installboot
-HOST_SRCDIR=	distrib/cdrom/macppc_installboot
+HOST_SRCDIR=	sys/arch/macppc/stand/installboot
 
 .include "${.CURDIR}/../Makefile.nbincludes"
 .include "${.CURDIR}/../Makefile.host"

Added files:

Index: src/etc/etc.macppc/hfsmap.lst
diff -u /dev/null src/etc/etc.macppc/hfsmap.lst:1.1
--- /dev/null	Sun Sep 15 03:56:58 2024
+++ src/etc/etc.macppc/hfsmap.lst	Sun Sep 15 03:56:57 2024
@@ -0,0 +1,8 @@
+.hqx - 'BnHq' 'TEXT'
+.txt - 'ttxt' 'TEXT'
+.ps - 'ASPS' 'TEXT'
+.gz - 'GNUz' 'TEXT'
+.tgz - 'GNUz' 'TEXT'
+.html - 'nbsd' 'TEXT'
+.chrp - 'chrp' 'tbxi'
+* - 'nbsd' 'TEXT'
Index: src/etc/etc.macppc/hide-hfs.lst
diff -u /dev/null src/etc/etc.macppc/hide-hfs.lst:1.1
--- /dev/null	Sun Sep 15 03:56:58 2024
+++ src/etc/etc.macppc/hide-hfs.lst	Sun Sep 15 03:56:57 2024
@@ -0,0 +1,8 @@
+MD5
+SHA512
+TRANS.TBL
+INSTALL.more
+./boot
+./boot.*
+./netbsd*
+./packages
Index: src/etc/etc.macppc/hide-jol.lst
diff -u /dev/null src/etc/etc.macppc/hide-jol.lst:1.1
--- /dev/null	Sun Sep 15 03:56:58 2024
+++ src/etc/etc.macppc/hide-jol.lst	Sun Sep 15 03:56:57 2024
@@ -0,0 +1,5 @@
+./boot
+./boot.*
+./netbsd*
+./ofwboot*
+./mac68k/installation/misc/*.bin

Index: src/sys/arch/macppc/stand/boothfs/Makefile
diff -u /dev/null src/sys/arch/macppc/stand/boothfs/Makefile:1.1
--- /dev/null	Sun Sep 15 03:56:58 2024
+++ src/sys/arch/macppc/stand/boothfs/Makefile	Sun Sep 15 03:56:57 2024
@@ -0,0 +1,14 @@
+#	$NetBSD: Makefile,v 1.1 2024/09/15 03:56:57 tsutsui Exp $
+
+PROG=		boothfs
+NOMAN=		# defined
+BINMODE=	444
+
+SRCS=		# generated from ${TOOL_MACPPCMKBOOTHFS}
+
+${PROG}:
+	${TOOL_MACPPCMKBOOTHFS} ${.TARGET}
+
+CLEANFILES+=	${BOOTHFS}
+
+.include <bsd.prog.mk>

Index: src/sys/arch/macppc/stand/installboot/Makefile
diff -u /dev/null src/sys/arch/macppc/stand/installboot/Makefile:1.5
--- /dev/null	Sun Sep 15 03:56:58 2024
+++ src/sys/arch/macppc/stand/installboot/Makefile	Sun Sep 15 03:56:57 2024
@@ -0,0 +1,30 @@
+#	$NetBSD: Makefile,v 1.5 2024/09/15 03:56:57 tsutsui Exp $
+
+NOMAN=	# defined
+PROG=	macppc_installboot
+SRCS=	installboot.c cd9660.c cd9660_util.c
+
+.PATH.c: ${.CURDIR}
+.PATH.c: ${NETBSDSRCDIR}/usr.sbin/installboot ${NETBSDSRCDIR}/sys/fs/cd9660
+
+CPPFLAGS+=	-I. -I${.CURDIR}
+#CPPFLAGS+=	-DDEBUG
+
+.if !defined(HOSTPROGNAME)
+.if !make(obj) && !make(clean) && !make(cleandir)
+.BEGIN:
+	-rm -rf fs
+	${HOST_INSTALL_DIR} fs
+	${HOST_INSTALL_DIR} fs/cd9660
+	${HOST_LN} -s ${NETBSDSRCDIR}/sys/fs/unicode.h fs
+	${HOST_LN} -s ${NETBSDSRCDIR}/sys/fs/cd9660/iso.h fs/cd9660
+	${HOST_LN} -s ${NETBSDSRCDIR}/sys/fs/cd9660/cd9660_extern.h fs/cd9660
+.endif
+
+cleandir distclean: cleaninc
+
+cleaninc:
+	-rm -rf fs
+.endif	# !defined(HOSTPROGNAME)
+
+.include <bsd.prog.mk>

Index: src/sys/arch/macppc/stand/installboot/installboot.c
diff -u /dev/null src/sys/arch/macppc/stand/installboot/installboot.c:1.9
--- /dev/null	Sun Sep 15 03:56:58 2024
+++ src/sys/arch/macppc/stand/installboot/installboot.c	Sun Sep 15 03:56:57 2024
@@ -0,0 +1,230 @@
+/*	$NetBSD: installboot.c,v 1.9 2024/09/15 03:56:57 tsutsui Exp $	*/
+
+/*-
+ * Copyright (c) 2005 Izumi Tsutsui.  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.
+ *
+ * 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.
+ */
+
+#if HAVE_NBTOOL_CONFIG_H
+#include "nbtool_config.h"
+#endif
+
+#include <err.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+
+#include "installboot.h"
+
+#define BSIZE		512
+#define MAX_SB_SIZE	(64 * 1024)	/* XXX */
+#define roundup(x, y)	((((x)+((y)-1))/(y))*(y))
+
+static	void usage(void);
+
+static	ib_params	installboot_params;
+
+static	struct ib_fs cd9660_fstype = {
+	.name = "cd9660",
+	.match = cd9660_match,
+	.findstage2 = cd9660_findstage2
+};
+
+int
+main(int argc, char **argv)
+{
+	ib_params *params;
+	uint8_t *bb;
+	struct apple_part_map_entry pme;
+	size_t bbi;
+	struct shared_bbinfo *bbinfop;
+	off_t partoff;
+	uint32_t nblk, maxblk, blk_i;
+	int rv;
+	ib_block *blocks;
+	uint64_t block;
+
+	setprogname(argv[0]);
+	params = &installboot_params;
+	memset(params, 0, sizeof(*params));
+	params->fsfd = -1;
+	params->s1fd = -1;
+
+	if (argc != 4)
+		usage();
+
+	params->filesystem = argv[1];
+	params->fstype = &cd9660_fstype;
+
+	if ((params->fsfd = open(params->filesystem, O_RDWR, 0600)) == -1)
+		err(1, "Opening file system `%s' read", params->filesystem);
+	if (fstat(params->fsfd, &params->fsstat) == -1)
+		err(1, "Examining file system `%s'", params->filesystem);
+	if (!params->fstype->match(params))
+		errx(1, "File system `%s' is not of type %s",
+		    params->filesystem, params->fstype->name);
+
+#ifdef DEBUG
+	printf("file system: %s, %ld bytes\n",
+	    params->filesystem, (long)params->fsstat.st_size);
+#endif
+
+	/*
+	 * Find space for primary boot from the second (NetBSD_BootBlock)
+	 * partition.
+	 */
+	if (pread(params->fsfd, &pme, sizeof pme, BSIZE * 2) != sizeof(pme))
+		err(1, "read pme from file system `%s'", params->filesystem);
+
+	if (strcmp((char *)pme.pmPartName, "NetBSD_BootBlock"))
+		err(1, "invalid partition map in file system `%s'",
+		    params->filesystem);
+
+	/* pmPyPartStart is written by mkisofs */
+	partoff = BSIZE * be32toh(pme.pmPyPartStart);
+
+#ifdef DEBUG
+	printf("NetBSD partition offset = %ld\n", (long)partoff);
+#endif
+
+	params->stage1 = argv[2];
+
+	if ((params->s1fd = open(params->stage1, O_RDONLY, 0600)) == -1)
+		err(1, "Opening primary bootstrap `%s'", params->stage1);
+	if (fstat(params->s1fd, &params->s1stat) == -1)
+		err(1, "Examining primary bootstrap `%s'", params->stage1);
+	if (!S_ISREG(params->s1stat.st_mode))
+		err(1, "`%s' must be a regular file", params->stage1);
+
+	if (params->s1stat.st_size > MACPPC_BOOT_BLOCK_MAX_SIZE)
+		err(1, "primary bootrap `%s' too large (%ld bytes)",
+		    params->stage1, (long)params->s1stat.st_size);
+
+#ifdef DEBUG
+	printf("primary boot: %s, %ld bytes\n",
+	    params->stage1, (long)params->s1stat.st_size);
+#endif
+
+	params->stage2 = argv[3];
+
+	bb = calloc(1, MACPPC_BOOT_BLOCK_MAX_SIZE);
+	if (bb == NULL)
+		err(1, "Allocating %ul bytes for bbinfo",
+		    MACPPC_BOOT_BLOCK_MAX_SIZE);
+
+	rv = read(params->s1fd, bb, params->s1stat.st_size);
+
+	if (rv == -1)
+		err(1, "Reading `%s'", params->stage1);
+
+	if (memcmp(bb + 1, "ELF", strlen("ELF")) == 0) {
+		warnx("`%s' is an ELF executable; need raw binary",
+		    params->stage1);
+	}
+
+	/* look for the bbinfo structure */
+	for (bbi = 0; bbi < MACPPC_BOOT_BLOCK_MAX_SIZE;
+	    bbi += sizeof(uint32_t)) {
+		bbinfop = (void *)(bb + bbi);
+		if (memcmp(bbinfop->bbi_magic, MACPPC_BBINFO_MAGIC,
+		    sizeof(bbinfop->bbi_magic)) == 0) {
+#ifdef DEBUG
+			printf("magic found: %s\n", bbinfop->bbi_magic);
+#endif
+			break;
+		}
+	}
+	if (bbi >= MACPPC_BOOT_BLOCK_MAX_SIZE)
+		err(1, "bbinfo structure not found in `%s'", params->stage1);
+
+	maxblk = be32toh(bbinfop->bbi_block_count);
+	if (maxblk == 0 ||
+	    maxblk > (MACPPC_BOOT_BLOCK_MAX_SIZE / sizeof(uint32_t)))
+		err(1, "bbinfo structure in `%s' has preposterous size `%u'",
+		    params->stage1, maxblk);
+	
+	blocks = malloc(sizeof(*blocks) * maxblk);
+	if (blocks == NULL) {
+		err(1, "Allocating %lu bytes for blocks",
+		    (unsigned long)sizeof(*blocks) * maxblk);
+	}
+
+	if (S_ISREG(params->fsstat.st_mode)) {
+		if (fsync(params->fsfd) == -1)
+			err(1, "Synchronising file system `%s'",
+			    params->filesystem);
+	}
+
+	nblk = maxblk;
+	if (!params->fstype->findstage2(params, &nblk, blocks)) {
+		exit(1);
+	}
+
+	bbinfop->bbi_block_count = htobe32(nblk);
+	bbinfop->bbi_block_size = htobe32(blocks[0].blocksize);
+	for (blk_i = 0; blk_i < nblk; blk_i++) {
+		/* XXX bootxx assumes blocksize is 512 */
+		block = blocks[blk_i].block * (params->fstype->blocksize / 512);
+		bbinfop->bbi_block_table[blk_i] = htobe32(block);
+		if (blocks[blk_i].blocksize < blocks[0].blocksize &&
+		    blk_i + 1 != nblk) {
+			warnx("Secondary bootstrap `%s' blocks do not have "
+			    "a uniform size", params->stage2);
+			exit(1);
+		}
+	}
+
+	/* XXX no write option */
+
+	if (pwrite(params->fsfd, bb, MACPPC_BOOT_BLOCK_MAX_SIZE, partoff) !=
+	    MACPPC_BOOT_BLOCK_MAX_SIZE)
+		err(1, "write bootblock");
+
+	if (S_ISREG(params->fsstat.st_mode)) {
+		if (fsync(params->fsfd) == -1)
+			err(1, "Synchronising file system `%s'",
+			    params->filesystem);
+	}
+
+	free(bb);
+
+	if (close(params->fsfd) == -1)
+		err(1, "Closing file system `%s'", params->filesystem);
+	if (close(params->s1fd) == -1)
+		err(1, "Closing primary bootstrap `%s'", params->stage1);
+
+	return 0;
+}
+
+static void
+usage(void)
+{
+	const char *prog;
+
+	prog = getprogname();
+	fprintf(stderr, "usage: %s hybrid-cd-image primary secondary\n", prog);
+	exit(1);
+}

Index: src/sys/arch/macppc/stand/installboot/installboot.h
diff -u /dev/null src/sys/arch/macppc/stand/installboot/installboot.h:1.1
--- /dev/null	Sun Sep 15 03:56:58 2024
+++ src/sys/arch/macppc/stand/installboot/installboot.h	Sun Sep 15 03:56:57 2024
@@ -0,0 +1,134 @@
+/*	$NetBSD: installboot.h,v 1.1 2024/09/15 03:56:57 tsutsui Exp $	*/
+
+/*-
+ * Copyright (c) 2002 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Luke Mewburn of Wasabi Systems.
+ *
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``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 FOUNDATION OR CONTRIBUTORS
+ * 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	_INSTALLBOOT_H
+#define	_INSTALLBOOT_H
+
+#if HAVE_NBTOOL_CONFIG_H
+#include "nbtool_config.h"
+#include "../../sys/sys/bootblock.h"
+#else
+#include <sys/bootblock.h>
+#include <sys/endian.h>
+#endif
+
+#include <sys/stat.h>
+#include <stdint.h>
+
+typedef enum {
+				/* flags from global options */
+	IB_VERBOSE =	1<<0,		/* verbose operation */
+	IB_NOWRITE =	1<<1,		/* don't write */
+	IB_CLEAR =	1<<2,		/* clear boot block */
+
+				/* flags from -o options */
+	IB_ALPHASUM =	1<<8,		/* set Alpha checksum */
+	IB_APPEND =	1<<9,		/* append stage 1 to EO(regular)F */
+	IB_SUNSUM =	1<<10,		/* set Sun checksum */
+	IB_STAGE1START=	1<<11,		/* start block for stage 1 provided */
+	IB_STAGE2START=	1<<12,		/* start block for stage 2 provided */
+	IB_COMMAND = 	1<<13,		/* Amiga commandline option */
+	IB_RESETVIDEO =	1<<14,		/* i386 reset video */
+	IB_CONSOLE =	1<<15,		/* i386 console */
+	IB_CONSPEED =	1<<16,		/* i386 console baud rate */
+	IB_TIMEOUT =	1<<17,		/* i386 boot timeout */
+	IB_PASSWORD =	1<<18,		/* i386 boot password */
+	IB_KEYMAP = 	1<<19,		/* i386 console keymap */
+	IB_CONSADDR = 	1<<20,		/* i386 console io address */
+} ib_flags;
+
+typedef struct {
+	ib_flags	 flags;		/* flags (see above) */
+	struct ib_mach	*machine;	/* machine details (see below) */
+	struct ib_fs	*fstype;	/* file system details (see below) */
+	const char	*filesystem;	/* name of target file system */
+	int		 fsfd;		/*  open fd to filesystem */
+	struct stat	 fsstat;	/*  fstat(2) of fsfd */
+	const char	*stage1;	/* name of stage1 bootstrap */
+	int		 s1fd;		/*  open fd to stage1 */
+	struct stat	 s1stat;	/*  fstat(2) of s1fd */
+	uint64_t	 s1start;	/*  start block of stage1 */
+	const char	*stage2;	/* name of stage2 bootstrap */
+	uint64_t	 s2start;	/*  start block of stage2 */
+		/* parsed -o option=value data */
+	const char	*command;	/* name of command string */
+	const char	*console;	/* name of console */
+	int		 conspeed;	/* console baud rate */
+	int		 consaddr;	/* console io address */
+	const char	*password;	/* boot password */
+	int		 timeout;	/* interactive boot timeout */
+	const char	*keymap;	/* keyboard translations */
+} ib_params;
+
+typedef struct {
+	uint64_t	block;
+	uint32_t	blocksize;
+} ib_block;
+
+struct ib_mach {
+	const char	*name;
+	int		(*setboot)	(ib_params *);
+	int		(*clearboot)	(ib_params *);
+	ib_flags	valid_flags;
+};
+
+struct ib_fs {
+		/* compile time parameters */
+	const char	*name;
+	int		(*match)	(ib_params *);
+	int		(*findstage2)	(ib_params *, uint32_t *, ib_block *);
+		/* run time fs specific parameters */
+	uint32_t	 blocksize;
+	uint32_t	 needswap;
+	off_t		sblockloc;	/* location of superblock */
+};
+
+typedef enum {
+	BBINFO_BIG_ENDIAN =	0,
+	BBINFO_LITTLE_ENDIAN =	1,
+} bbinfo_endian;
+
+struct bbinfo_params {
+	const char	*magic;		/* magic string to look for */
+	uint32_t	offset;		/* offset to write start of stage1 */
+	uint32_t	blocksize;	/* blocksize of stage1 */
+	uint32_t	maxsize;	/* max size of stage1 */
+	uint32_t	headeroffset;	/*
+					 * header offset (relative to offset)
+					 * to read stage1 into
+					 */
+	bbinfo_endian	endian;
+};
+
+int		cd9660_match(ib_params *);
+int		cd9660_findstage2(ib_params *, uint32_t *, ib_block *);
+
+#endif	/* _INSTALLBOOT_H */

Index: src/sys/arch/macppc/stand/mkboothfs/Makefile
diff -u /dev/null src/sys/arch/macppc/stand/mkboothfs/Makefile:1.1
--- /dev/null	Sun Sep 15 03:56:58 2024
+++ src/sys/arch/macppc/stand/mkboothfs/Makefile	Sun Sep 15 03:56:58 2024
@@ -0,0 +1,9 @@
+#	$NetBSD: Makefile,v 1.1 2024/09/15 03:56:58 tsutsui Exp $
+
+WARNS?=		5
+NOMAN=		# defined
+
+PROG=		mkboothfs
+SRCS=		mkboothfs.c
+
+.include <bsd.prog.mk>
Index: src/sys/arch/macppc/stand/mkboothfs/mkboothfs.c
diff -u /dev/null src/sys/arch/macppc/stand/mkboothfs/mkboothfs.c:1.1
--- /dev/null	Sun Sep 15 03:56:58 2024
+++ src/sys/arch/macppc/stand/mkboothfs/mkboothfs.c	Sun Sep 15 03:56:58 2024
@@ -0,0 +1,167 @@
+/*	$NetBSD: mkboothfs.c,v 1.1 2024/09/15 03:56:58 tsutsui Exp $	*/
+
+/*-
+ * Copyright (c) 2005, 2006 Izumi Tsutsui.  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.
+ *
+ * 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.
+ */
+
+#if HAVE_NBTOOL_CONFIG_H
+#include "nbtool_config.h"
+#include "../../sys/sys/bootblock.h"
+#else
+#include <sys/bootblock.h>
+#endif
+#if !HAVE_NBTOOL_CONFIG_H || HAVE_SYS_ENDIAN_H
+#include <sys/endian.h>
+#endif
+
+#include <err.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+
+#define BUFSIZE		(64 * 1024)
+
+#define BSIZE		512
+#define BOOTPARTSIZE	32768	/* XXX: not sure how much required */
+#define BOOTDATASIZE	(BOOTPARTSIZE - MACPPC_BOOT_BLOCK_MAX_SIZE)
+
+#define HFS_BLKSIZE	512
+#define HFS_MAGICOFFSET	(BOOTDATASIZE - (HFS_BLKSIZE * 2))
+#define HFS_MAGIC	0x4c4b
+
+#define SIZETOBLK512(size)	((size) / 512)
+#define SIZETOBLK2048(size)	((size) / 2048)
+
+static void usage(void);
+
+/*
+ * Creates a file for use by mkisofs's -boot-hfs-file.
+ */
+
+int
+main(int argc, char **argv)
+{
+	char *boothfs;
+	int ofd;
+	struct apple_drvr_map dm;
+	struct apple_part_map_entry pme;
+	char *buf;
+
+	if (argc != 2)
+		usage();
+
+	boothfs = argv[1];
+
+	buf = malloc(BUFSIZE);
+	if (buf == NULL)
+		err(1, "malloc write buffer");
+
+	/* create output boot-hfs-file */
+	if ((ofd = open(boothfs, O_CREAT | O_TRUNC | O_WRONLY, 0644)) == -1)
+		err(1, "create output boot-hfs-file `%s'", boothfs);
+	
+	/*
+	 * Populate 18 byte driver map header in the first 512 byte block
+	 */
+	memset(&dm, 0, sizeof dm);
+	dm.sbSig = htobe16(APPLE_DRVR_MAP_MAGIC);
+	dm.sbBlockSize = htobe16(2048);
+	dm.sbBlkCount = htobe32(0);	/* XXX */
+	dm.sbDevType = htobe16(1);
+	dm.sbDevID = htobe16(1);
+	dm.sbData = 0;
+	dm.sbDrvrCount = 0;
+
+	memset(buf, 0, BSIZE);
+	memcpy(buf, &dm, sizeof(dm));
+	write(ofd, buf, BSIZE);
+
+	/*
+	 * Write 2048-byte/sector map in the second 512 byte block
+	 */
+	memset(&pme, 0, sizeof(pme));
+	pme.pmSig =		htobe16(APPLE_PART_MAP_ENTRY_MAGIC);
+	pme.pmMapBlkCnt =	htobe32(1);
+	pme.pmPyPartStart =	htobe32(1);
+	pme.pmPartBlkCnt =	htobe32(SIZETOBLK2048(BOOTPARTSIZE));
+	pme.pmDataCnt =		htobe32(SIZETOBLK2048(BOOTDATASIZE));
+	strlcpy(pme.pmPartName, "NetBSD_BootBlock", sizeof(pme.pmPartName));
+	strlcpy(pme.pmPartType, "Apple_Driver", sizeof(pme.pmPartType));
+	pme.pmPartStatus =	htobe32(0x3b);
+	pme.pmBootSize =	htobe32(MACPPC_BOOT_BLOCK_MAX_SIZE);
+	pme.pmBootLoad =	htobe32(0x4000);
+	pme.pmBootEntry =	htobe32(0x4000);
+	strlcpy(pme.pmProcessor, "PowerPC", sizeof(pme.pmProcessor));
+
+	memset(buf, 0, BSIZE);
+	memcpy(buf, &pme, sizeof(pme));
+	write(ofd, buf, BSIZE);
+
+	/*
+	 * Write 512-byte/sector map in the third 512 byte block
+	 */
+	pme.pmPyPartStart =	htobe32(4);
+	pme.pmPartBlkCnt =	htobe32(SIZETOBLK512(BOOTPARTSIZE));
+	pme.pmDataCnt =		htobe32(SIZETOBLK512(BOOTDATASIZE));
+	memset(buf, 0, BSIZE);
+	memcpy(buf, &pme, sizeof(pme));
+	write(ofd, buf, BSIZE);
+
+	/*
+	 * Placeholder for 2048 byte padding
+	 */
+	memset(buf, 0, BSIZE);
+	write(ofd, buf, BSIZE);
+
+	/*
+	 * Placeholder for NetBSD bootblock
+	 */
+	memset(buf, 0, MACPPC_BOOT_BLOCK_MAX_SIZE);
+	write(ofd, buf, MACPPC_BOOT_BLOCK_MAX_SIZE);
+
+	/*
+	 * Prepare HFS "bootblock"; enough to pacify mkisofs.
+	 */
+	memset(buf, 0, BOOTDATASIZE);
+	be16enc(&buf[HFS_MAGICOFFSET], HFS_MAGIC);
+	if (write(ofd, buf, BOOTDATASIZE) != BOOTDATASIZE)
+		err(1, "write boot-hfs-file `%s'", boothfs);
+ 
+	free(buf);
+	close(ofd);
+	return 0;
+}
+
+static void
+usage(void)
+{
+	const char *prog;
+
+	prog = getprogname();
+	fprintf(stderr, "usage: %s boot-hfs-file\n", prog);
+	exit(1);
+}

Index: src/tools/macppc_mkboothfs/Makefile
diff -u /dev/null src/tools/macppc_mkboothfs/Makefile:1.1
--- /dev/null	Sun Sep 15 03:56:58 2024
+++ src/tools/macppc_mkboothfs/Makefile	Sun Sep 15 03:56:58 2024
@@ -0,0 +1,9 @@
+#	$NetBSD: Makefile,v 1.1 2024/09/15 03:56:58 tsutsui Exp $
+
+.include <bsd.hostinit.mk>
+
+HOSTPROGNAME=	${_TOOL_PREFIX}macppc_mkboothfs
+HOST_SRCDIR=	sys/arch/macppc/stand/mkboothfs
+
+.include "${.CURDIR}/../Makefile.nbincludes"
+.include "${.CURDIR}/../Makefile.host"

Reply via email to