NetBSD Problem Report #54455
From www@netbsd.org Sat Aug 10 23:43:26 2019
Return-Path: <www@netbsd.org>
Received: from mail.netbsd.org (mail.netbsd.org [199.233.217.200])
(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))
(Client CN "mail.NetBSD.org", Issuer "mail.NetBSD.org CA" (not verified))
by mollari.NetBSD.org (Postfix) with ESMTPS id 193F77A16B
for <gnats-bugs@gnats.NetBSD.org>; Sat, 10 Aug 2019 23:43:26 +0000 (UTC)
Message-Id: <20190810234325.4C3297A1B9@mollari.NetBSD.org>
Date: Sat, 10 Aug 2019 23:43:25 +0000 (UTC)
From: cmhanson@eschatologist.net
Reply-To: cmhanson@eschatologist.net
To: gnats-bugs@NetBSD.org
Subject: hp300 ISO should be encapsulated in LIF to be bootable
X-Send-Pr-Version: www-1.0
>Number: 54455
>Category: port-hp300
>Synopsis: hp300 ISO should be encapsulated in LIF to be bootable
>Confidential: no
>Severity: serious
>Priority: medium
>Responsible: tsutsui
>State: closed
>Class: change-request
>Submitter-Id: net
>Arrival-Date: Sat Aug 10 23:45:00 +0000 2019
>Closed-Date: Tue May 21 13:55:39 +0000 2024
>Last-Modified: Sat Jun 22 11:00:02 +0000 2024
>Originator: Chris Hanson
>Release: netbsd-8.0
>Organization:
>Environment:
>Description:
Some models of HP 9000-300 series system support booting from CD-ROM but none support booting directly from an ISO. The ISO image produced by NetBSD should be wrapped in or prefixed with a LIF filesystem containing the SYS_INST and SYS_UBOOT programs so they can be bootable.
>How-To-Repeat:
Download hp300 distribution ISO for NetBSD 8.0 or 8.1, attempt to boot it from a CD-ROM drive attached to an HP 9000-380 or HP 9000-425t and notice that it does not appear bootable.
>Fix:
For the moment to install on hp300 you essentially MUST netboot.
>Release-Note:
>Audit-Trail:
Responsible-Changed-From-To: port-hp300-maintainer->tsutsui
Responsible-Changed-By: tsutsui@NetBSD.org
Responsible-Changed-When: Wed, 08 May 2024 17:31:53 +0000
Responsible-Changed-Why:
I'm working on it.
State-Changed-From-To: open->analyzed
State-Changed-By: tsutsui@NetBSD.org
State-Changed-When: Wed, 08 May 2024 17:31:53 +0000
State-Changed-Why:
- concept confirmed (using a different approach from OpenBSD/hp300)
https://www.youtube.com/watch?v=seHEeoup6P0
- prepare a new uboot binary without LIF volume but only LIF file header
(four bytes entry address and four bytes file size at the top)
- put the uboot binary for CD on in a boot ISO by makefs(8)
- in ISO9660 all blocks for each file are contiguously allocated
so we can directly specify it in the LIF directory entry
without a boot partition
- prepare LIF volume and directory entry in the boot ISO
- write a block number of the uboot in the ISO image to
a directory entry in the LIF header
- needs to implement host tools to prepare necessary data in a boot ISO
- hp300/stand/mkboot option to add only LIF file header (no LIF volume)
- installboot support to detect block and length of a file in ISO9660 fs
as src/distrib/cdrom/macppc_installboot does
From: "Izumi Tsutsui" <tsutsui@netbsd.org>
To: gnats-bugs@gnats.NetBSD.org
Cc:
Subject: PR/54455 CVS commit: src/sys/arch/hp300/stand/common
Date: Thu, 9 May 2024 15:11:11 +0000
Module Name: src
Committed By: tsutsui
Date: Thu May 9 15:11:11 UTC 2024
Modified Files:
src/sys/arch/hp300/stand/common: conf.c conf.h devopen.c scsi.c
scsireg.h scsivar.h sd.c
Log Message:
Add a preliminary CD boot support to uboot for preparation of PR/54455.
Briefly tested on mame, but not enalbed yet.
To generate a diff of this commit:
cvs rdiff -u -r1.14 -r1.15 src/sys/arch/hp300/stand/common/conf.c \
src/sys/arch/hp300/stand/common/devopen.c
cvs rdiff -u -r1.3 -r1.4 src/sys/arch/hp300/stand/common/conf.h
cvs rdiff -u -r1.12 -r1.13 src/sys/arch/hp300/stand/common/scsi.c \
src/sys/arch/hp300/stand/common/sd.c
cvs rdiff -u -r1.5 -r1.6 src/sys/arch/hp300/stand/common/scsireg.h
cvs rdiff -u -r1.4 -r1.5 src/sys/arch/hp300/stand/common/scsivar.h
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
From: "Izumi Tsutsui" <tsutsui@netbsd.org>
To: gnats-bugs@gnats.NetBSD.org
Cc:
Subject: PR/54455 CVS commit: src/sys/arch/hp300/hp300
Date: Sat, 11 May 2024 19:16:20 +0000
Module Name: src
Committed By: tsutsui
Date: Sat May 11 19:16:19 UTC 2024
Modified Files:
src/sys/arch/hp300/hp300: autoconf.c
Log Message:
Recognize SCSI CD-ROM devices as a booted device properly.
Necessary for PR port-hp300/54455, to boot an md root root RAMDISK
kernel from CD-ROM without "WARNING: can't find match for bootdev:"
prompt.
To generate a diff of this commit:
cvs rdiff -u -r1.113 -r1.114 src/sys/arch/hp300/hp300/autoconf.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
From: Izumi Tsutsui <tsutsui@ceres.dti.ne.jp>
To: gnats-bugs@netbsd.org
Cc: netbsd-bugs@netbsd.org, tsutsui@ceres.dti.ne.jp
Subject: Re: port-hp300/54455 (hp300 ISO should be encapsulated in LIF to be
bootable)
Date: Fri, 17 May 2024 02:43:40 +0900
I've managed to get working hp300 installcd.
I wrote:
> Synopsis: hp300 ISO should be encapsulated in LIF to be bootable
:
> - concept confirmed (using a different approach from OpenBSD/hp300)
> https://www.youtube.com/watch?v=seHEeoup6P0
> - prepare a new uboot binary without LIF volume but only LIF file header
> (four bytes entry address and four bytes file size at the top)
This is not necessary, we can just add size of LIF volume and directory
(8192 bytes) to a block number in LIF directory entry as extra offset.
> - put the uboot binary for CD on in a boot ISO by makefs(8)
> - in ISO9660 all blocks for each file are contiguously allocated
> so we can directly specify it in the LIF directory entry
> without a boot partition
See attached diffs below.
> - prepare LIF volume and directory entry in the boot ISO
> - write a block number of the uboot in the ISO image to
> a directory entry in the LIF header
It turns out current installboot(8) already has these support.
> - needs to implement host tools to prepare necessary data in a boot ISO
> - hp300/stand/mkboot option to add only LIF file header (no LIF volume)
This is not necessary, as noted above.
> - installboot support to detect block and length of a file in ISO9660 fs
> as src/distrib/cdrom/macppc_installboot does
See the attached diffs.
I've also pushed all commits with full logs to my github:
https://github.com/tsutsui/netbsd-src/compare/689d5906...tsutsui:netbsd-src:tsutsui-hp300-cdboot-rebase
- sys/arch/hp300/stand/mkboot/Makefile
- enable SUPPORT_CD
- sys/fs/cd9660
- make cd9660_util.c usable with cd9660_extern.h from userland
- tools/Makefile.nbincludes
- install cd9660 sys headers for tools installboot build
(XXX: should we install these ones into /usr/include/fs ?)
- usr.sbin/installboot
- add cd9660 support to -t option
- make arch/hp300.c use it to make CD ISO bootable
- distrib/hp300/cdroms/installcd/Makefile
- install RAMDISK kernel and bootloader for hp300 installcd
- distrib/cdrom/macppc_installboot
- sync with usr.sbin/installboot/cd9660.c, for future merge
---
diff --git a/distrib/cdrom/macppc_installboot/Makefile b/distrib/cdrom/macppc_installboot/Makefile
index dcc9df2aa9c5..4bb078685c9d 100644
--- a/distrib/cdrom/macppc_installboot/Makefile
+++ b/distrib/cdrom/macppc_installboot/Makefile
@@ -16,6 +16,7 @@ HOST_CPPFLAGS+= -I. -I${.CURDIR}
${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
diff --git a/distrib/cdrom/macppc_installboot/cd9660.c b/distrib/cdrom/macppc_installboot/cd9660.c
index 02d1c9232a6e..008a5cec1822 100644
--- a/distrib/cdrom/macppc_installboot/cd9660.c
+++ b/distrib/cdrom/macppc_installboot/cd9660.c
@@ -51,6 +51,7 @@ __RCSID("$NetBSD: cd9660.c,v 1.4 2014/09/27 15:21:40 tsutsui Exp $");
#include <dirent.h>
#include <fs/cd9660/iso.h>
+#include <fs/cd9660/cd9660_extern.h>
#include "installboot.h"
@@ -87,7 +88,7 @@ cd9660_match(ib_params *params)
return 0;
}
- blocksize = isonum_723((char *)ipd.logical_block_size);
+ blocksize = isonum_723((u_char *)ipd.logical_block_size);
if (blocksize != ISO_DEFAULT_BLOCK_SIZE) {
warnx("Invalid blocksize %d in `%s'",
blocksize, params->filesystem);
@@ -104,10 +105,11 @@ int
cd9660_findstage2(ib_params *params, uint32_t *maxblk, ib_block *blocks)
{
uint8_t buf[ISO_DEFAULT_BLOCK_SIZE];
- char name[MAXNAMLEN];
- char *ofwboot;
+ char name[ISO_MAXNAMLEN];
+ char *stage2;
off_t loc;
- int rv, blocksize, found, i;
+ int rv, blocksize, found;
+ u_int i;
struct iso_primary_descriptor ipd;
struct iso_directory_record *idr;
@@ -122,20 +124,20 @@ cd9660_findstage2(ib_params *params, uint32_t *maxblk, ib_block *blocks)
#endif
/* The secondary bootstrap must be clearly in /. */
- strlcpy(name, params->stage2, MAXNAMLEN);
- ofwboot = name;
- if (ofwboot[0] == '/')
- ofwboot++;
- if (strchr(ofwboot, '/') != NULL) {
+ strlcpy(name, params->stage2, ISO_MAXNAMLEN);
+ stage2 = name;
+ if (stage2[0] == '/')
+ stage2++;
+ if (strchr(stage2, '/') != NULL) {
warnx("The secondary bootstrap `%s' must be in / "
"on filesystem `%s'", params->stage2, params->filesystem);
return 0;
}
- if (strchr(ofwboot, '.') == NULL) {
+ if (strchr(stage2, '.') == NULL) {
/*
* XXX should fix isofncmp()?
*/
- strlcat(ofwboot, ".", MAXNAMLEN);
+ strlcat(name, ".", ISO_MAXNAMLEN);
}
rv = pread(params->fsfd, &ipd, sizeof(ipd),
@@ -148,7 +150,7 @@ cd9660_findstage2(ib_params *params, uint32_t *maxblk, ib_block *blocks)
params->filesystem);
return 0;
}
- blocksize = isonum_723((char *)ipd.logical_block_size);
+ blocksize = isonum_723((u_char *)ipd.logical_block_size);
idr = (void *)ipd.root_directory_record;
loc = (off_t)isonum_733(idr->extent) * blocksize;
@@ -205,13 +207,12 @@ cd9660_findstage2(ib_params *params, uint32_t *maxblk, ib_block *blocks)
printf("\n");
}
#endif
- if (isofncmp(ofwboot, strlen(ofwboot),
- idr->name, isonum_711(idr->name_len), 0) == 0) {
+ if (isofncmp((u_char *)stage2, strlen(stage2),
+ (u_char *)idr->name,
+ isonum_711((u_char *)idr->name_len), 0) == 0) {
found = 1;
/* ISO filesystem always has contiguous file blocks */
blocks[0].block = (int64_t)isonum_733(idr->extent);
- /* XXX bootxx assumes blocksize is 512 */
- blocks[0].block *= blocksize / 512;
blocks[0].blocksize =
roundup(isonum_733(idr->size), blocksize);
*maxblk = 1;
diff --git a/distrib/cdrom/macppc_installboot/installboot.c b/distrib/cdrom/macppc_installboot/installboot.c
index e3af92bb8988..56da84961b8b 100644
--- a/distrib/cdrom/macppc_installboot/installboot.c
+++ b/distrib/cdrom/macppc_installboot/installboot.c
@@ -47,6 +47,12 @@ 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)
{
@@ -59,6 +65,7 @@ main(int argc, char **argv)
uint32_t nblk, maxblk, blk_i;
int rv;
ib_block *blocks;
+ uint64_t block;
setprogname(argv[0]);
params = &installboot_params;
@@ -70,11 +77,16 @@ main(int argc, char **argv)
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, ¶ms->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);
@@ -87,7 +99,7 @@ main(int argc, char **argv)
if (pread(params->fsfd, &pme, sizeof pme, BSIZE * 2) != sizeof(pme))
err(1, "read pme from file system `%s'", params->filesystem);
- if (strcmp(pme.pmPartName, "NetBSD_BootBlock"))
+ if (strcmp((char *)pme.pmPartName, "NetBSD_BootBlock"))
err(1, "invalid partition map in file system `%s'",
params->filesystem);
@@ -167,14 +179,16 @@ main(int argc, char **argv)
}
nblk = maxblk;
- if (!cd9660_findstage2(params, &nblk, blocks)) {
+ 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++) {
- bbinfop->bbi_block_table[blk_i] = htobe32(blocks[blk_i].block);
+ /* 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 "
diff --git a/distrib/cdrom/macppc_installboot/installboot.h b/distrib/cdrom/macppc_installboot/installboot.h
index 1875e300cc04..57d8ae09502f 100644
--- a/distrib/cdrom/macppc_installboot/installboot.h
+++ b/distrib/cdrom/macppc_installboot/installboot.h
@@ -43,10 +43,6 @@
#include <sys/stat.h>
#include <stdint.h>
-#ifndef MAXNAMLEN
-#define MAXNAMLEN 511
-#endif
-
typedef enum {
/* flags from global options */
IB_VERBOSE = 1<<0, /* verbose operation */
@@ -135,7 +131,4 @@ struct bbinfo_params {
int cd9660_match(ib_params *);
int cd9660_findstage2(ib_params *, uint32_t *, ib_block *);
-int isofncmp(const u_char *, size_t, const u_char *, size_t, int);
-void isofntrans(const u_char *, int, u_char *, u_short *, int, int, int, int);
-
#endif /* _INSTALLBOOT_H */
diff --git a/distrib/hp300/cdroms/installcd/Makefile b/distrib/hp300/cdroms/installcd/Makefile
index 96c9b1dfd1ec..7417897242a5 100644
--- a/distrib/hp300/cdroms/installcd/Makefile
+++ b/distrib/hp300/cdroms/installcd/Makefile
@@ -3,4 +3,18 @@ CDBASE= hp300cd # gives ${CDBASE}.iso
CDRELEASE= true # include $RELEASEDIR/$RELEASEMACHINEDIR
CDRELEASE_NODEBUG= true
+CDKERNELS= netbsd-RAMDISK.gz netbsd
+CDINSTKERNEL= ../../instkernel
+
+SYS_UBOOT= SYS_UBOOT
+BOOTDIR= ${DESTDIR}/usr/mdec/rbootd
+
+# make the CD bootable
+prepare_md_post:
+ ${INSTALL} ${COPY} -m 0644 ${BOOTDIR}/${SYS_UBOOT} cdrom
+
+image_md_post:
+ ${TOOL_INSTALLBOOT} -m ${MACHINE} \
+ ${CDIMAGE} ${BOOTDIR}/${SYS_UBOOT} /${SYS_UBOOT}
+
.include "${.CURDIR}/../../../common/Makefile.bootcd"
diff --git a/sys/arch/hp300/stand/uboot/Makefile b/sys/arch/hp300/stand/uboot/Makefile
index 6d0a833e2b77..3fe3a8882e39 100644
--- a/sys/arch/hp300/stand/uboot/Makefile
+++ b/sys/arch/hp300/stand/uboot/Makefile
@@ -6,6 +6,7 @@ NEWVERSWHAT= "Primary Boot"
CPPFLAGS+= -DSUPPORT_ETHERNET -DSUPPORT_TAPE -DSUPPORT_DISK
CPPFLAGS+= -DSUPPORT_UFS2
+CPPFLAGS+= -DSUPPORT_CD
LINKS= ${BINDIR}/${PROG} ${BINDIR}/rdboot
LINKS+= ${BINDIR}/${PROG} ${BINDIR}/bootrd
diff --git a/sys/fs/cd9660/cd9660_extern.h b/sys/fs/cd9660/cd9660_extern.h
index f58436bdb322..1276eac9a587 100644
--- a/sys/fs/cd9660/cd9660_extern.h
+++ b/sys/fs/cd9660/cd9660_extern.h
@@ -105,10 +105,11 @@ extern int (**cd9660_vnodeop_p)(void *);
extern int (**cd9660_specop_p)(void *);
extern int (**cd9660_fifoop_p)(void *);
+ino_t isodirino(struct iso_directory_record *, struct iso_mnt *);
+#endif /* _KERNEL */
+
int isochar(const u_char *, const u_char *, int, u_int16_t *);
int isofncmp(const u_char *, size_t, const u_char *, size_t, int);
void isofntrans(const u_char *, int, u_char *, u_short *, int, int, int, int);
-ino_t isodirino(struct iso_directory_record *, struct iso_mnt *);
-#endif /* _KERNEL */
#endif /* _ISOFS_CD9660_CD9660_EXTERN_H_ */
diff --git a/sys/fs/cd9660/cd9660_util.c b/sys/fs/cd9660/cd9660_util.c
index 3915ab1409bb..3d827e390926 100644
--- a/sys/fs/cd9660/cd9660_util.c
+++ b/sys/fs/cd9660/cd9660_util.c
@@ -66,11 +66,7 @@ __KERNEL_RCSID(0, "$NetBSD: cd9660_util.c,v 1.14 2016/03/09 20:18:17 christos Ex
#endif
#include <fs/cd9660/iso.h>
-#ifdef _KERNEL
#include <fs/cd9660/cd9660_extern.h>
-#else
-static int isochar(const u_char *, const u_char *, int, uint16_t *);
-#endif
#include <fs/unicode.h>
diff --git a/tools/Makefile.nbincludes b/tools/Makefile.nbincludes
index efff65fe8411..71d4e8baa8ab 100644
--- a/tools/Makefile.nbincludes
+++ b/tools/Makefile.nbincludes
@@ -6,12 +6,15 @@ _ARCHDIR:= ${.PARSEDIR}/../sys/arch
_INCDIR:= ${.PARSEDIR}/../include
_SYSDIR:= ${.PARSEDIR}/../sys/sys
_UFSDIR:= ${.PARSEDIR}/../sys/ufs
+_FSDIR:= ${.PARSEDIR}/../sys/fs
_SUBDIR!= cd ${_ARCHDIR} && ${MAKE} -V SUBDIR
.if make(depend) || make(all) || make(dependall) || make(install)
# There's no need to run these commands for "make cleandir" or "make obj",
# and TOOL_SED will not yet have been built.
_UFS_INCS!= cd ${_UFSDIR} && find ffs ufs -name '*.h'
+_FS_INCS!= cd ${_FSDIR} && find cd9660 -name '*.h'
+_FS_INCS+= unicode.h
_ARCH_INCS!= ${TOOL_SED} -e 's/^\#.*//' ${.PARSEDIR}/headerlist
.endif
@@ -34,6 +37,8 @@ beforedepend:
${HOST_INSTALL_DIR} ${TOOLDIR}/include/nbinclude
${HOST_INSTALL_DIR} ${TOOLDIR}/include/nbinclude/sys
${HOST_INSTALL_DIR} ${TOOLDIR}/include/nbinclude/ufs
+ ${HOST_INSTALL_DIR} ${TOOLDIR}/include/nbinclude/fs
+ ${HOST_INSTALL_DIR} ${TOOLDIR}/include/nbinclude/fs/cd9660
cd ${_ARCHDIR} && \
${TOOL_PAX} -s /include\\/// -rw ${_ARCH_INCS} \
${TOOLDIR}/include/nbinclude
@@ -43,5 +48,7 @@ beforedepend:
${TOOL_PAX} -rw ${_SYSINCS} ${TOOLDIR}/include/nbinclude/sys
cd ${_UFSDIR} && \
${TOOL_PAX} -rw ${_UFS_INCS} ${TOOLDIR}/include/nbinclude/ufs
+ cd ${_FSDIR} && \
+ ${TOOL_PAX} -rw ${_FS_INCS} ${TOOLDIR}/include/nbinclude/fs
cd ${TOOLDIR}/include/nbinclude && rm -f machine && \
${HOST_INSTALL_SYMLINK} ${MACHINE} machine
diff --git a/usr.sbin/installboot/Makefile b/usr.sbin/installboot/Makefile
index e31285b7776a..324ae24bddb9 100644
--- a/usr.sbin/installboot/Makefile
+++ b/usr.sbin/installboot/Makefile
@@ -69,9 +69,29 @@ SRCS+= ffs_bswap.c
#SRCS+= ext2fs.c ext2fs_bswap.c
.endif
+.if !empty(ARCH_FILES:C/(hp300|macppc)/cd9660/:Mcd9660.c)
+SRCS+= cd9660.c cd9660_util.c
+
+.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
+
UFSSRC= ${NETBSDSRCDIR}/sys/ufs
+CD9660SRC= ${NETBSDSRCDIR}/sys/fs/cd9660
CPPFLAGS+= -I${.CURDIR} -I.
-.PATH: ${.CURDIR}/arch ${UFSSRC}/ffs ${UFSSRC}/ext2fs
+.PATH: ${.CURDIR}/arch ${UFSSRC}/ffs ${UFSSRC}/ext2fs ${CD9660SRC}
.if !defined(HOSTPROGNAME)
.for f in i386 macppc
diff --git a/usr.sbin/installboot/arch/hp300.c b/usr.sbin/installboot/arch/hp300.c
index 118caa2c78c9..56cf9de18f07 100644
--- a/usr.sbin/installboot/arch/hp300.c
+++ b/usr.sbin/installboot/arch/hp300.c
@@ -62,6 +62,9 @@ __RCSID("$NetBSD: hp300.c,v 1.18 2024/05/11 22:10:27 tsutsui Exp $");
#include "installboot.h"
+#define HP300_MAXBLOCKS 1 /* Only contiguous blocks are expected. */
+#define LIF_VOLDIRSIZE 1024 /* size of LIF volume header and directory */
+
static int hp300_setboot(ib_params *);
struct ib_mach ib_mach_hp300 = {
@@ -77,6 +80,7 @@ hp300_setboot(ib_params *params)
{
int retval;
uint8_t *bootstrap;
+ size_t bootstrap_size;
ssize_t rv;
struct partition *boot;
struct hp300_lifdir *lifdir;
@@ -84,6 +88,8 @@ hp300_setboot(ib_params *params)
int i;
unsigned int secsize = HP300_SECTSIZE;
uint64_t boot_size, boot_offset;
+ uint32_t nblk;
+ ib_block *blocks;
struct disklabel *label;
assert(params != NULL);
@@ -101,7 +107,62 @@ hp300_setboot(ib_params *params)
goto done;
}
- if (params->flags & IB_APPEND) {
+ if (params->stage2 != NULL) {
+ /*
+ * Use contiguous blocks of SYS_BOOT in the target filesystem
+ * (assuming ISO9660) for a LIF directory entry used
+ * by BOOTROM on bootstrap.
+ */
+ if (strcmp(params->fstype->name, "cd9660") != 0) {
+ warn("Target filesystem `%s' is unexpected",
+ params->fstype->name);
+ }
+
+ if (S_ISREG(params->fsstat.st_mode)) {
+ if (fsync(params->fsfd) == -1)
+ warn("Synchronising file system `%s'",
+ params->filesystem);
+ } else {
+ /* Don't allow real file systems for sanity */
+ warnx("`%s' must be a regular file to append "
+ "a bootstrap", params->filesystem);
+ goto done;
+ }
+
+ /* Allocate space for our block list. */
+ nblk = HP300_MAXBLOCKS;
+ blocks = malloc(sizeof(*blocks) * nblk);
+ if (blocks == NULL) {
+ warn("Allocating %lu bytes for block list",
+ (unsigned long)sizeof(*blocks) * nblk);
+ goto done;
+ }
+
+ /* Check the block of for the SYS_UBOOT in the target fs */
+ if (!params->fstype->findstage2(params, &nblk, blocks))
+ goto done;
+
+ if (nblk == 0) {
+ warnx("Secondary bootstrap `%s' is empty",
+ params->stage2);
+ goto done;
+ } else if (nblk > 1) {
+ warnx("Secondary bootstrap `%s' doesn't have "
+ "contiguous blocks", params->stage2);
+ goto done;
+ }
+
+ boot_offset = blocks[0].block * params->fstype->blocksize;
+ /* need to read only LIF volume and directories */
+ bootstrap_size = LIF_VOLDIRSIZE;
+
+ if ((params->flags & IB_VERBOSE) != 0) {
+ printf("Bootstrap `%s' found at offset %lu in `%s'\n",
+ params->stage2, (unsigned long)boot_offset,
+ params->filesystem);
+ }
+
+ } else if (params->flags & IB_APPEND) {
if (!S_ISREG(params->fsstat.st_mode)) {
warnx(
"`%s' must be a regular file to append a bootstrap",
@@ -157,11 +218,24 @@ hp300_setboot(ib_params *params)
}
}
- bootstrap = mmap(NULL, params->s1stat.st_size, PROT_READ | PROT_WRITE,
- MAP_PRIVATE, params->s1fd, 0);
- if (bootstrap == MAP_FAILED) {
- warn("mmapping `%s'", params->stage1);
- goto done;
+ if (params->stage2 != NULL) {
+ /* Use bootstrap file in the target filesystem. */
+ bootstrap = mmap(NULL, bootstrap_size,
+ PROT_READ | PROT_WRITE, MAP_PRIVATE, params->fsfd,
+ boot_offset);
+ if (bootstrap == MAP_FAILED) {
+ warn("mmapping `%s'", params->filesystem);
+ goto done;
+ }
+ } else {
+ /* Use bootstrap specified as stage1. */
+ bootstrap_size = params->s1stat.st_size;
+ bootstrap = mmap(NULL, bootstrap_size,
+ PROT_READ | PROT_WRITE, MAP_PRIVATE, params->s1fd, 0);
+ if (bootstrap == MAP_FAILED) {
+ warn("mmapping `%s'", params->stage1);
+ goto done;
+ }
}
/* Relocate files, sanity check LIF directory on the way */
@@ -187,8 +261,8 @@ hp300_setboot(ib_params *params)
}
/* Write LIF volume header and directory to sectors 0 and 1 */
- rv = pwrite(params->fsfd, bootstrap, 1024, 0);
- if (rv != 1024) {
+ rv = pwrite(params->fsfd, bootstrap, LIF_VOLDIRSIZE, 0);
+ if (rv != LIF_VOLDIRSIZE) {
if (rv == -1)
warn("Writing `%s'", params->filesystem);
else
@@ -196,6 +270,15 @@ hp300_setboot(ib_params *params)
goto done;
}
+ if (params->stage2 != NULL) {
+ /*
+ * Bootstrap in the target filesystem is used.
+ * No need to write bootstrap to BOOT partition.
+ */
+ retval = 1;
+ goto done;
+ }
+
/* Write files to BOOT partition */
offset = boot_offset <= HP300_SECTSIZE * 16 ? HP300_SECTSIZE * 16 : 0;
i = roundup(params->s1stat.st_size, secsize) - offset;
@@ -216,6 +299,6 @@ hp300_setboot(ib_params *params)
if (label != NULL)
free(label);
if (bootstrap != MAP_FAILED)
- munmap(bootstrap, params->s1stat.st_size);
+ munmap(bootstrap, bootstrap_size);
return retval;
}
diff --git a/usr.sbin/installboot/cd9660.c b/usr.sbin/installboot/cd9660.c
new file mode 100644
index 000000000000..6cb682d1c5e2
--- /dev/null
+++ b/usr.sbin/installboot/cd9660.c
@@ -0,0 +1,234 @@
+/* $NetBSD$ */
+
+/*-
+ * 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 <sys/cdefs.h>
+#if defined(__RCSID) && !defined(__lint)
+__RCSID("$NetBSD$");
+#endif /* !__lint */
+
+#include <sys/param.h>
+
+#if !HAVE_NBTOOL_CONFIG_H
+#include <sys/mount.h>
+#endif
+
+#include <assert.h>
+#include <err.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <dirent.h>
+
+#include <fs/cd9660/iso.h>
+#include <fs/cd9660/cd9660_extern.h>
+
+#include "installboot.h"
+
+#define roundup(x, y) ((((x)+((y)-1))/(y))*(y))
+#define MAXLEN 16
+
+
+int
+cd9660_match(ib_params *params)
+{
+ int rv, blocksize;
+ struct iso_primary_descriptor ipd;
+
+ assert(params != NULL);
+ assert(params->fstype != NULL);
+ assert(params->fsfd != -1);
+
+ rv = pread(params->fsfd, &ipd, sizeof(ipd),
+ ISO_DEFAULT_BLOCK_SIZE * 16);
+ if (rv == -1) {
+ warn("Reading primary descriptor in `%s'", params->filesystem);
+ return 0;
+ } else if (rv != sizeof(ipd)) {
+ warnx("Reading primary descriptor in `%s': short read",
+ params->filesystem);
+ return 0;
+ }
+
+ if (ipd.type[0] != ISO_VD_PRIMARY ||
+ strncmp(ipd.id, ISO_STANDARD_ID, sizeof(ipd.id)) != 0 ||
+ ipd.version[0] != 1) {
+ warnx("Filesystem `%s' is not ISO9660 format",
+ params->filesystem);
+ return 0;
+ }
+
+ blocksize = isonum_723((u_char *)ipd.logical_block_size);
+ if (blocksize != ISO_DEFAULT_BLOCK_SIZE) {
+ warnx("Invalid blocksize %d in `%s'",
+ blocksize, params->filesystem);
+ return 0;
+ }
+
+ params->fstype->blocksize = blocksize;
+ params->fstype->needswap = 0;
+
+ return 1;
+}
+
+int
+cd9660_findstage2(ib_params *params, uint32_t *maxblk, ib_block *blocks)
+{
+ uint8_t buf[ISO_DEFAULT_BLOCK_SIZE];
+ char name[ISO_MAXNAMLEN];
+ char *stage2;
+ off_t loc;
+ int rv, blocksize, found;
+ u_int i;
+ struct iso_primary_descriptor ipd;
+ struct iso_directory_record *idr;
+
+ assert(params != NULL);
+ assert(params->stage2 != NULL);
+ assert(maxblk != NULL);
+ assert(blocks != NULL);
+
+#if 0
+ if (params->flags & IB_STAGE2START)
+ return hardcode_stage2(params, maxblk, blocks);
+#endif
+
+ /* The secondary bootstrap must be clearly in /. */
+ strlcpy(name, params->stage2, ISO_MAXNAMLEN);
+ stage2 = name;
+ if (stage2[0] == '/')
+ stage2++;
+ if (strchr(stage2, '/') != NULL) {
+ warnx("The secondary bootstrap `%s' must be in / "
+ "on filesystem `%s'", params->stage2, params->filesystem);
+ return 0;
+ }
+ if (strchr(stage2, '.') == NULL) {
+ /*
+ * XXX should fix isofncmp()?
+ */
+ strlcat(name, ".", ISO_MAXNAMLEN);
+ }
+
+ rv = pread(params->fsfd, &ipd, sizeof(ipd),
+ ISO_DEFAULT_BLOCK_SIZE * 16);
+ if (rv == -1) {
+ warn("Reading primary descriptor in `%s'", params->filesystem);
+ return 0;
+ } else if (rv != sizeof(ipd)) {
+ warnx("Reading primary descriptor in `%s': short read",
+ params->filesystem);
+ return 0;
+ }
+ blocksize = isonum_723((u_char *)ipd.logical_block_size);
+
+ idr = (void *)ipd.root_directory_record;
+ loc = (off_t)isonum_733(idr->extent) * blocksize;
+ rv = pread(params->fsfd, buf, blocksize, loc);
+ if (rv == -1) {
+ warn("Reading root directory record in `%s'",
+ params->filesystem);
+ return 0;
+ } else if (rv != sizeof(ipd)) {
+ warnx("Reading root directory record in `%s': short read",
+ params->filesystem);
+ return 0;
+ }
+
+ found = 0;
+ for (i = 0; i < blocksize - sizeof(struct iso_directory_record);
+ i += (u_char)idr->length[0]) {
+ idr = (void *)&buf[i];
+
+#ifdef DEBUG
+ printf("i = %d, idr->length[0] = %3d\n",
+ i, (u_char)idr->length[0]);
+#endif
+ /* check end of entries */
+ if (idr->length[0] == 0) {
+#ifdef DEBUG
+ printf("end of entries\n");
+#endif
+ break;
+ }
+
+ if (idr->flags[0] & 2) {
+ /* skip directory entries */
+#ifdef DEBUG
+ printf("skip directory entry\n");
+#endif
+ continue;
+ }
+ if (idr->name_len[0] == 1 &&
+ (idr->name[0] == 0 || idr->name[0] == 1)) {
+ /* skip "." and ".." */
+#ifdef DEBUG
+ printf("skip dot dot\n");
+#endif
+ continue;
+ }
+#ifdef DEBUG
+ {
+ int j;
+
+ printf("filename:");
+ for (j = 0; j < isonum_711(idr->name_len); j++)
+ printf("%c", idr->name[j]);
+ printf("\n");
+ }
+#endif
+ if (isofncmp((u_char *)stage2, strlen(stage2),
+ (u_char *)idr->name,
+ isonum_711((u_char *)idr->name_len), 0) == 0) {
+ found = 1;
+ /* ISO filesystem always has contiguous file blocks */
+ blocks[0].block = (int64_t)isonum_733(idr->extent);
+ blocks[0].blocksize =
+ roundup(isonum_733(idr->size), blocksize);
+ *maxblk = 1;
+#ifdef DEBUG
+ printf("block = %ld, blocksize = %ld\n",
+ (long)blocks[0].block, blocks[0].blocksize);
+#endif
+ break;
+ }
+ }
+
+ if (found == 0) {
+ warnx("Can't find secondary bootstrap `%s' in filesystem `%s'",
+ params->stage2, params->filesystem);
+ return 0;
+ }
+
+ return 1;
+}
diff --git a/usr.sbin/installboot/fstypes.c b/usr.sbin/installboot/fstypes.c
index 1b77f974fc5d..4bb720be6b5a 100644
--- a/usr.sbin/installboot/fstypes.c
+++ b/usr.sbin/installboot/fstypes.c
@@ -48,11 +48,31 @@ __RCSID("$NetBSD: fstypes.c,v 1.13 2010/01/14 16:27:49 tsutsui Exp $");
struct ib_fs fstypes[] = {
#ifndef NO_STAGE2
- { .name = "ffs", .match = ffs_match, .findstage2 = ffs_findstage2 },
- { .name = "raid", .match = raid_match, .findstage2 = ffs_findstage2 },
- { .name = "raw", .match = raw_match, .findstage2 = raw_findstage2 },
+ {
+ .name = "ffs",
+ .match = ffs_match,
+ .findstage2 = ffs_findstage2
+ },
+ {
+ .name = "raid",
+ .match = raid_match,
+ .findstage2 = ffs_findstage2
+ },
+ {
+ .name = "cd9660",
+ .match = cd9660_match,
+ .findstage2 = cd9660_findstage2
+ },
+ /* raw_match() always matches, so raw should be at the end. */
+ {
+ .name = "raw",
+ .match = raw_match,
+ .findstage2 = raw_findstage2
+ },
#endif
- { .name = NULL, }
+ {
+ .name = NULL
+ }
};
#ifndef NO_STAGE2
diff --git a/usr.sbin/installboot/installboot.8 b/usr.sbin/installboot/installboot.8
index b6eaf75fc974..71a4871eae1c 100644
--- a/usr.sbin/installboot/installboot.8
+++ b/usr.sbin/installboot/installboot.8
@@ -32,7 +32,7 @@
.\" Usage: \*(UB
.ds UB U\(hyBoot
.
-.Dd December 25, 2023
+.Dd May 12, 2024
.Dt INSTALLBOOT 8
.Os
.Sh NAME
@@ -479,6 +479,9 @@ Fast File System.
.It Ic raid
Mirrored RAIDframe File System.
.
+.It Ic cd9660
+ISO 9660 File System.
+.
.It Ic raw
.Dq Raw
image.
diff --git a/usr.sbin/installboot/installboot.h b/usr.sbin/installboot/installboot.h
index 468670c6fb14..b9e65b9a1660 100644
--- a/usr.sbin/installboot/installboot.h
+++ b/usr.sbin/installboot/installboot.h
@@ -171,15 +171,23 @@ int shared_bbinfo_clearboot(ib_params *, struct bbinfo_params *,
int shared_bbinfo_setboot(ib_params *, struct bbinfo_params *,
int (*)(ib_params *, struct bbinfo_params *, uint8_t *));
- /* fstypes.c */
-int hardcode_stage2(ib_params *, uint32_t *, ib_block *);
+ /* cd9660.c */
+int cd9660_match(ib_params *);
+int cd9660_findstage2(ib_params *, uint32_t *, ib_block *);
+
+ /* ext2fs.c */
+int ext2fs_match(ib_params *);
+int ext2fs_findstage2(ib_params *, uint32_t *, ib_block *);
+
+ /* ffs.c */
int ffs_match(ib_params *);
int ffs_findstage2(ib_params *, uint32_t *, ib_block *);
int raid_match(ib_params *);
+
+ /* fstypes.c */
+int hardcode_stage2(ib_params *, uint32_t *, ib_block *);
int raw_match(ib_params *);
int raw_findstage2(ib_params *, uint32_t *, ib_block *);
-int ext2fs_match(ib_params *);
-int ext2fs_findstage2(ib_params *, uint32_t *, ib_block *);
/* machines.c */
extern struct ib_mach ib_mach_alpha;
---
Izumi Tsutsui
From: Izumi Tsutsui <tsutsui@ceres.dti.ne.jp>
To: gnats-bugs@netbsd.org
Cc: tsutsui@ceres.dti.ne.jp
Subject: Re: port-hp300/54455 (hp300 ISO should be encapsulated in LIF to bebootable)
Date: Sat, 18 May 2024 13:47:45 +0900
> I've also pushed all commits with full logs to my github:
> https://github.com/tsutsui/netbsd-src/compare/689d5906...tsutsui:netbsd-src:tsutsui-hp300-cdboot-rebase
Needs more changes after several tests:
- Fix builds in SMALLPROG && !NO_STAGE2 && !hp300 && !macppc case.
- Omit cd9660 support in SMALLPROG (for installation programs) case.
diff --git a/usr.sbin/installboot/Makefile b/usr.sbin/installboot/Makefile
index 324ae24bddb9..56c70f79241b 100644
--- a/usr.sbin/installboot/Makefile
+++ b/usr.sbin/installboot/Makefile
@@ -69,7 +69,9 @@ SRCS+= ffs_bswap.c
#SRCS+= ext2fs.c ext2fs_bswap.c
.endif
-.if !empty(ARCH_FILES:C/(hp300|macppc)/cd9660/:Mcd9660.c)
+.if !empty(ARCH_FILES:C/(hp300|macppc)/cd9660/:Mcd9660.c) && \
+ !defined(SMALLPROG)
+CPPFLAGS+= -DSUPPORT_CD9660
SRCS+= cd9660.c cd9660_util.c
.if !make(obj) && !make(clean) && !make(cleandir)
diff --git a/usr.sbin/installboot/arch/hp300.c b/usr.sbin/installboot/arch/hp300.c
index 56cf9de18f07..1f782a48511a 100644
--- a/usr.sbin/installboot/arch/hp300.c
+++ b/usr.sbin/installboot/arch/hp300.c
@@ -88,8 +88,10 @@ hp300_setboot(ib_params *params)
int i;
unsigned int secsize = HP300_SECTSIZE;
uint64_t boot_size, boot_offset;
+#ifdef SUPPORT_CD9660
uint32_t nblk;
ib_block *blocks;
+#endif
struct disklabel *label;
assert(params != NULL);
@@ -107,6 +109,7 @@ hp300_setboot(ib_params *params)
goto done;
}
+#ifdef SUPPORT_CD9660
if (params->stage2 != NULL) {
/*
* Use contiguous blocks of SYS_BOOT in the target filesystem
@@ -162,7 +165,9 @@ hp300_setboot(ib_params *params)
params->filesystem);
}
- } else if (params->flags & IB_APPEND) {
+ } else
+#endif
+ if (params->flags & IB_APPEND) {
if (!S_ISREG(params->fsstat.st_mode)) {
warnx(
"`%s' must be a regular file to append a bootstrap",
@@ -218,6 +223,7 @@ hp300_setboot(ib_params *params)
}
}
+#ifdef SUPPORT_CD9660
if (params->stage2 != NULL) {
/* Use bootstrap file in the target filesystem. */
bootstrap = mmap(NULL, bootstrap_size,
@@ -227,7 +233,9 @@ hp300_setboot(ib_params *params)
warn("mmapping `%s'", params->filesystem);
goto done;
}
- } else {
+ } else
+#endif
+ {
/* Use bootstrap specified as stage1. */
bootstrap_size = params->s1stat.st_size;
bootstrap = mmap(NULL, bootstrap_size,
@@ -270,6 +278,7 @@ hp300_setboot(ib_params *params)
goto done;
}
+#ifdef SUPPORT_CD9660
if (params->stage2 != NULL) {
/*
* Bootstrap in the target filesystem is used.
@@ -278,6 +287,7 @@ hp300_setboot(ib_params *params)
retval = 1;
goto done;
}
+#endif
/* Write files to BOOT partition */
offset = boot_offset <= HP300_SECTSIZE * 16 ? HP300_SECTSIZE * 16 : 0;
diff --git a/usr.sbin/installboot/fstypes.c b/usr.sbin/installboot/fstypes.c
index 4bb720be6b5a..3f5b2ac80448 100644
--- a/usr.sbin/installboot/fstypes.c
+++ b/usr.sbin/installboot/fstypes.c
@@ -58,11 +58,13 @@ struct ib_fs fstypes[] = {
.match = raid_match,
.findstage2 = ffs_findstage2
},
+#ifdef SUPPORT_CD9660
{
.name = "cd9660",
.match = cd9660_match,
.findstage2 = cd9660_findstage2
},
+#endif
/* raw_match() always matches, so raw should be at the end. */
{
.name = "raw",
---
Izumi Tsutsui
From: "Izumi Tsutsui" <tsutsui@netbsd.org>
To: gnats-bugs@gnats.NetBSD.org
Cc:
Subject: PR/54455 CVS commit: src/usr.sbin/installboot
Date: Sun, 19 May 2024 15:48:58 +0000
Module Name: src
Committed By: tsutsui
Date: Sun May 19 15:48:58 UTC 2024
Modified Files:
src/usr.sbin/installboot: Makefile fstypes.c installboot.8
installboot.h
src/usr.sbin/installboot/arch: hp300.c
Added Files:
src/usr.sbin/installboot: cd9660.c
Log Message:
Add cd9660 support to search a bootloader file in the target file system.
Also add CD boot support for hp300, using a bootloader file in cd9660 fs.
This is a tool's part to close PR/54455.
HP 9000/300 machines read LIF directory entry allocated after
the LIF volume header at the top of the boot disk during bootstrap,
and a bootstrap file must be contiguously allocated on the disk
due to limitation of the LIF specification.
Current NetBSD/hp300's bootloader is larger than ~80KB so we have
to prepare a special 'boot' partition for FFS (that has only 8KB (ffsv1)
or 32KB (ffsv2) spaces) disks to put such a large bootloader.
On the other hand, on ISO9660 fs all files are allocated contiguously
so we can specify a bootloader file in the target ISO9660 directly
in the LIF directory entry.
Note we can simply use the existing "append" option to create bootable
CD ISO for hp300, but it looks some emulators (at leaset MAME) reject
such non-standard ISO files, i.e. with an appended bootloader file at
the end of the image.
To generate a diff of this commit:
cvs rdiff -u -r1.58 -r1.59 src/usr.sbin/installboot/Makefile
cvs rdiff -u -r0 -r1.1 src/usr.sbin/installboot/cd9660.c
cvs rdiff -u -r1.13 -r1.14 src/usr.sbin/installboot/fstypes.c
cvs rdiff -u -r1.108 -r1.109 src/usr.sbin/installboot/installboot.8
cvs rdiff -u -r1.44 -r1.45 src/usr.sbin/installboot/installboot.h
cvs rdiff -u -r1.18 -r1.19 src/usr.sbin/installboot/arch/hp300.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
From: "Izumi Tsutsui" <tsutsui@netbsd.org>
To: gnats-bugs@gnats.NetBSD.org
Cc:
Subject: PR/54455 CVS commit: src/distrib/hp300/cdroms/installcd
Date: Sun, 19 May 2024 15:50:01 +0000
Module Name: src
Committed By: tsutsui
Date: Sun May 19 15:50:00 UTC 2024
Modified Files:
src/distrib/hp300/cdroms/installcd: Makefile
Log Message:
Put a RAMDISK kernel and SYS_UBOOT into hp300 installcd to make it bootable.
This should finally close PR/54455.
To generate a diff of this commit:
cvs rdiff -u -r1.3 -r1.4 src/distrib/hp300/cdroms/installcd/Makefile
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
State-Changed-From-To: analyzed->closed
State-Changed-By: tsutsui@NetBSD.org
State-Changed-When: Tue, 21 May 2024 13:55:39 +0000
State-Changed-Why:
Confirmed NetBSD-10.99.10-hp300.iso from NetBSD-daily/HEAD/202405202140Z
can boot on my HP 9000/425t + SONY CDU-76S.
From: "Martin Husemann" <martin@netbsd.org>
To: gnats-bugs@gnats.NetBSD.org
Cc:
Subject: PR/54455 CVS commit: [netbsd-10] src
Date: Sat, 22 Jun 2024 10:57:12 +0000
Module Name: src
Committed By: martin
Date: Sat Jun 22 10:57:11 UTC 2024
Modified Files:
src/distrib/hp300/cdroms/installcd [netbsd-10]: Makefile
src/sys/arch/hp300/dev [netbsd-10]: dcm.c dcmreg.h diofbreg.h
diofbvar.h dma.c dnkbd.c dvbox.c frodoreg.h hpib.c mcclock_frodo.c
rbox.c rboxreg.h rtc.c sti_sgc.c topcatreg.h
src/sys/arch/hp300/hp300 [netbsd-10]: autoconf.c machdep.c trap.c
src/sys/arch/hp300/include [netbsd-10]: bus.h cpu.h
src/sys/arch/hp300/stand [netbsd-10]: Makefile.buildboot
src/sys/arch/hp300/stand/common [netbsd-10]: clock.c conf.c conf.h
devopen.c hil.c ite_dumb.c ite_sti.c machdep.c netio.c prf.c rd.c
scsi.c scsireg.h scsivar.h sd.c
src/sys/arch/hp300/stand/inst [netbsd-10]: Makefile inst.c
src/sys/arch/hp300/stand/mkboot [netbsd-10]: Makefile mkboot.c
src/sys/arch/hp300/stand/uboot [netbsd-10]: Makefile
src/sys/fs/cd9660 [netbsd-10]: cd9660_extern.h cd9660_util.c
src/sys/sys [netbsd-10]: bootblock.h
src/tools [netbsd-10]: Makefile.nbincludes
src/usr.sbin/installboot [netbsd-10]: Makefile fstypes.c installboot.8
installboot.h
src/usr.sbin/installboot/arch [netbsd-10]: hp300.c
Added Files:
src/usr.sbin/installboot [netbsd-10]: cd9660.c
Removed Files:
src/sys/arch/hp300/stand/mkboot [netbsd-10]: volhdr.h
Log Message:
Pull up following revision(s) (requested by tsutsui in ticket #722):
sys/fs/cd9660/cd9660_util.c: revision 1.16
sys/arch/hp300/stand/common/clock.c: revision 1.14
sys/arch/hp300/stand/common/scsireg.h: revision 1.5
sys/arch/hp300/stand/common/scsireg.h: revision 1.6
sys/arch/hp300/stand/Makefile.buildboot: revision 1.38
sys/arch/hp300/include/bus.h: revision 1.23
sys/arch/hp300/stand/Makefile.buildboot: revision 1.39
sys/arch/hp300/stand/common/sd.c: revision 1.12
sys/arch/hp300/stand/common/prf.c: revision 1.6
sys/arch/hp300/stand/common/sd.c: revision 1.13
usr.sbin/installboot/installboot.8: revision 1.106
usr.sbin/installboot/Makefile: revision 1.59
sys/arch/hp300/stand/common/devopen.c: revision 1.14
usr.sbin/installboot/installboot.8: revision 1.107
sys/arch/hp300/stand/common/ite_dumb.c: revision 1.2
sys/arch/hp300/stand/common/devopen.c: revision 1.15
usr.sbin/installboot/installboot.8: revision 1.108
sys/fs/cd9660/cd9660_extern.h: revision 1.29
usr.sbin/installboot/installboot.8: revision 1.109
tools/Makefile.nbincludes: revision 1.11 (patch)
sys/arch/hp300/dev/rboxreg.h: revision 1.3
sys/arch/hp300/stand/common/scsivar.h: revision 1.5
sys/arch/hp300/dev/dnkbd.c: revision 1.14
sys/arch/hp300/hp300/trap.c: revision 1.156
sys/arch/hp300/stand/mkboot/mkboot.c: revision 1.12
sys/arch/hp300/dev/frodoreg.h: revision 1.6
sys/arch/hp300/stand/mkboot/mkboot.c: revision 1.13
sys/arch/hp300/stand/common/ite_sti.c: revision 1.2
sys/arch/hp300/stand/common/hil.c: revision 1.15
usr.sbin/installboot/arch/hp300.c: revision 1.18
sys/arch/hp300/stand/mkboot/mkboot.c: revision 1.14
sys/arch/hp300/dev/rbox.c: revision 1.4
usr.sbin/installboot/arch/hp300.c: revision 1.19
sys/arch/hp300/stand/mkboot/mkboot.c: revision 1.15
sys/sys/bootblock.h: revision 1.59
sys/arch/hp300/stand/mkboot/mkboot.c: revision 1.16
usr.sbin/installboot/installboot.h: revision 1.44
sys/arch/hp300/stand/mkboot/volhdr.h: file removal
sys/arch/hp300/stand/mkboot/mkboot.c: revision 1.17
sys/arch/hp300/dev/hpib.c: revision 1.45
usr.sbin/installboot/installboot.h: revision 1.45
usr.sbin/installboot/cd9660.c: revision 1.1
sys/arch/hp300/stand/mkboot/mkboot.c: revision 1.18
sys/arch/hp300/dev/topcatreg.h: revision 1.3
usr.sbin/installboot/cd9660.c: revision 1.2
sys/arch/hp300/stand/mkboot/mkboot.c: revision 1.19
sys/arch/hp300/stand/inst/inst.c: revision 1.25
sys/arch/hp300/stand/uboot/Makefile: revision 1.12
sys/arch/hp300/dev/dvbox.c: revision 1.4
sys/arch/hp300/dev/dma.c: revision 1.45
sys/arch/hp300/stand/uboot/Makefile: revision 1.13
sys/arch/hp300/stand/common/rd.c: revision 1.16
sys/arch/hp300/stand/inst/Makefile: revision 1.12
distrib/hp300/cdroms/installcd/Makefile: revision 1.4
sys/arch/hp300/stand/mkboot/volhdr.h: revision 1.6
sys/arch/hp300/stand/common/machdep.c: revision 1.16
usr.sbin/installboot/fstypes.c: revision 1.14
sys/arch/hp300/hp300/machdep.c: revision 1.238
sys/arch/hp300/include/cpu.h: revision 1.73
sys/arch/hp300/dev/diofbreg.h: revision 1.4
sys/arch/hp300/stand/common/scsi.c: revision 1.12
sys/arch/hp300/stand/common/netio.c: revision 1.19
sys/arch/hp300/stand/common/scsi.c: revision 1.13
sys/arch/hp300/dev/sti_sgc.c: revision 1.8
sys/arch/hp300/dev/rtc.c: revision 1.22
sys/arch/hp300/stand/mkboot/mkboot.c: revision 1.20
sys/arch/hp300/stand/common/conf.h: revision 1.4
sys/arch/hp300/hp300/autoconf.c: revision 1.111
sys/arch/hp300/stand/common/conf.c: revision 1.15
sys/arch/hp300/stand/mkboot/Makefile: revision 1.12
sys/arch/hp300/stand/mkboot/Makefile: revision 1.13
sys/arch/hp300/hp300/autoconf.c: revision 1.114
sys/arch/hp300/dev/dcmreg.h: revision 1.11
sys/arch/hp300/dev/diofbvar.h: revision 1.4
sys/arch/hp300/dev/dcm.c: revision 1.91
sys/fs/cd9660/cd9660_util.c: revision 1.15
sys/arch/hp300/dev/mcclock_frodo.c: revision 1.2
TAB/space cleanup.
installboot(8): formatting improvements
Use Ar foo instead of <foo>; this is mdoc.
Other formatting tweaks.
installboot(8): fix up markup
Don't overuse .Sy - when everything is highlighted, nothing is. Use
.Ic for options &c to get correct PostScript output (both are bold in
plain text).
Use Aq Ar inside .Pa, as both Pa and Ar are rendered as underscored
text in plain text output, and the distinction is lost.
Don't set examples in bold, but give them .Pp space around - they are
much easier to read this way.
Use consistent -width in FILES.
document how to use installboot on netbsd/vax.
PR/57909: Jan-Benedict Glaw: Don't include (build) timestamp when doing a
reproducible build
fix usage string, improve error handling.
add missing chunk for repro-build. fix gcc warnings.
avoid stringop truncation, fix copyright string to prevent assembler warnings.
Fix build as a tool (Jan-Benedict Glaw)
Fix integer overflow of strtol(3) for "loadpoint" address on ILP32 hosts.
This strtol(3) was introduced in rev 1.12 for PR/57909 after netbsd-10,
but it returns LONG_MAX (0x7FFFFFFF) for 0xFFF00000 on ILP32 hosts and
the wrong loadpoint causes "NOT ENOUGH MEMORY" error by the BOOTROMs
on loading uboot.lif on (at least) my 9000/360 and 9000/425t.
Misc cosmetic changes for mostly readability.
- KNF and add some newlines per blocks
- define and use proper bintobcd() macro
- make local functions and variables static
The same uboot.lif binaries are generated.
Rename ${PROGAOUT} -> ${PROGELF} to reflect reality.
Use proper signedness for the LIF file system data structures.
Ancient 4.3BSD used short and int for location, file size, file type,
and addresses etc. but all of them should be unsigned.
Also rename several variables and add comments for readability.
The LIF file system info can be found in "The HPDir Project" page:
https://www.hp9845.net/9845/projects/hpdir/
The same uboot.lif binaries are generated.
Add a preliminary CD boot support to uboot for preparation of PR/54455.
Briefly tested on mame, but not enalbed yet.
Recognize SCSI CD-ROM devices as a booted device properly.
Necessary for PR port-hp300/54455, to boot an md root root RAMDISK
kernel from CD-ROM without "WARNING: can't find match for bootdev:"
prompt.
Sync with src/sys/arch/hp300/stand/mkboot/volhdr.h rev 1.6.
https://mail-index.netbsd.org/source-changes/2024/05/07/msg151195.html
Use proper signedness for the LIF file system data structures.
mkboot should use this MI <sys/bootblock.h> and volhdr.h should
be removed soon.
Use MI <sys/bootblock.h> to refer LIF filesystem structures.
This should have been done when LIF definitions were initially added
to <sys/bootblock.h> for MI installboot(8).
Enable SUPPORT_CD on uboot.
Make cd9660_util.c usable in userland tools like installboot(8).
This was partially done for src/distrib/cdrom/macppc_installboot,
but more strict prototypes are necessary for native binary builds.
Install cd9660 related system headers for tools installboot(8) builds.
Reorder function prototypes per source files.
Add cd9660 support to search a bootloader file in the target file system.
Also add CD boot support for hp300, using a bootloader file in cd9660 fs.
This is a tool's part to close PR/54455.
HP 9000/300 machines read LIF directory entry allocated after
the LIF volume header at the top of the boot disk during bootstrap,
and a bootstrap file must be contiguously allocated on the disk
due to limitation of the LIF specification.
Current NetBSD/hp300's bootloader is larger than ~80KB so we have
to prepare a special 'boot' partition for FFS (that has only 8KB (ffsv1)
or 32KB (ffsv2) spaces) disks to put such a large bootloader.
On the other hand, on ISO9660 fs all files are allocated contiguously
so we can specify a bootloader file in the target ISO9660 directly
in the LIF directory entry.
Note we can simply use the existing "append" option to create bootable
CD ISO for hp300, but it looks some emulators (at leaset MAME) reject
such non-standard ISO files, i.e. with an appended bootloader file at
the end of the image.
Put a RAMDISK kernel and SYS_UBOOT into hp300 installcd to make it bootable.
This should finally close PR/54455.
Fix tools build errors on Cygwin.
Appease warnings on building tools/installboot on Cygwin.
To generate a diff of this commit:
cvs rdiff -u -r1.3 -r1.3.8.1 src/distrib/hp300/cdroms/installcd/Makefile
cvs rdiff -u -r1.90 -r1.90.4.1 src/sys/arch/hp300/dev/dcm.c
cvs rdiff -u -r1.10 -r1.10.58.1 src/sys/arch/hp300/dev/dcmreg.h
cvs rdiff -u -r1.3 -r1.3.90.1 src/sys/arch/hp300/dev/diofbreg.h \
src/sys/arch/hp300/dev/dvbox.c src/sys/arch/hp300/dev/rbox.c
cvs rdiff -u -r1.3.90.1 -r1.3.90.2 src/sys/arch/hp300/dev/diofbvar.h
cvs rdiff -u -r1.44 -r1.44.4.1 src/sys/arch/hp300/dev/dma.c
cvs rdiff -u -r1.13 -r1.13.6.1 src/sys/arch/hp300/dev/dnkbd.c
cvs rdiff -u -r1.5 -r1.5.58.1 src/sys/arch/hp300/dev/frodoreg.h
cvs rdiff -u -r1.44 -r1.44.6.1 src/sys/arch/hp300/dev/hpib.c
cvs rdiff -u -r1.1 -r1.1.68.1 src/sys/arch/hp300/dev/mcclock_frodo.c
cvs rdiff -u -r1.2 -r1.2.90.1 src/sys/arch/hp300/dev/rboxreg.h
cvs rdiff -u -r1.21 -r1.21.58.1 src/sys/arch/hp300/dev/rtc.c
cvs rdiff -u -r1.7 -r1.7.4.1 src/sys/arch/hp300/dev/sti_sgc.c
cvs rdiff -u -r1.2.90.1 -r1.2.90.2 src/sys/arch/hp300/dev/topcatreg.h
cvs rdiff -u -r1.110.6.1 -r1.110.6.2 src/sys/arch/hp300/hp300/autoconf.c
cvs rdiff -u -r1.237 -r1.237.2.1 src/sys/arch/hp300/hp300/machdep.c
cvs rdiff -u -r1.155 -r1.155.4.1 src/sys/arch/hp300/hp300/trap.c
cvs rdiff -u -r1.22 -r1.22.18.1 src/sys/arch/hp300/include/bus.h
cvs rdiff -u -r1.72 -r1.72.26.1 src/sys/arch/hp300/include/cpu.h
cvs rdiff -u -r1.37 -r1.37.10.1 src/sys/arch/hp300/stand/Makefile.buildboot
cvs rdiff -u -r1.13 -r1.13.50.1 src/sys/arch/hp300/stand/common/clock.c
cvs rdiff -u -r1.14 -r1.14.2.1 src/sys/arch/hp300/stand/common/conf.c
cvs rdiff -u -r1.3 -r1.3.2.1 src/sys/arch/hp300/stand/common/conf.h
cvs rdiff -u -r1.13 -r1.13.2.1 src/sys/arch/hp300/stand/common/devopen.c
cvs rdiff -u -r1.14 -r1.14.86.1 src/sys/arch/hp300/stand/common/hil.c
cvs rdiff -u -r1.1 -r1.1.92.1 src/sys/arch/hp300/stand/common/ite_dumb.c
cvs rdiff -u -r1.1 -r1.1.68.1 src/sys/arch/hp300/stand/common/ite_sti.c
cvs rdiff -u -r1.15 -r1.15.86.1 src/sys/arch/hp300/stand/common/machdep.c
cvs rdiff -u -r1.18 -r1.18.16.1 src/sys/arch/hp300/stand/common/netio.c
cvs rdiff -u -r1.5 -r1.5.196.1 src/sys/arch/hp300/stand/common/prf.c
cvs rdiff -u -r1.15 -r1.15.2.1 src/sys/arch/hp300/stand/common/rd.c
cvs rdiff -u -r1.11 -r1.11.60.1 src/sys/arch/hp300/stand/common/scsi.c
cvs rdiff -u -r1.4 -r1.4.48.1 src/sys/arch/hp300/stand/common/scsireg.h
cvs rdiff -u -r1.4 -r1.4.196.1 src/sys/arch/hp300/stand/common/scsivar.h
cvs rdiff -u -r1.11 -r1.11.84.1 src/sys/arch/hp300/stand/common/sd.c
cvs rdiff -u -r1.10.26.1 -r1.10.26.2 src/sys/arch/hp300/stand/inst/Makefile
cvs rdiff -u -r1.24 -r1.24.2.1 src/sys/arch/hp300/stand/inst/inst.c
cvs rdiff -u -r1.11 -r1.11.196.1 src/sys/arch/hp300/stand/mkboot/Makefile
cvs rdiff -u -r1.11 -r1.11.50.1 src/sys/arch/hp300/stand/mkboot/mkboot.c
cvs rdiff -u -r1.5 -r0 src/sys/arch/hp300/stand/mkboot/volhdr.h
cvs rdiff -u -r1.10.2.1 -r1.10.2.2 src/sys/arch/hp300/stand/uboot/Makefile
cvs rdiff -u -r1.27 -r1.27.30.1 src/sys/fs/cd9660/cd9660_extern.h
cvs rdiff -u -r1.14 -r1.14.48.1 src/sys/fs/cd9660/cd9660_util.c
cvs rdiff -u -r1.58 -r1.58.40.1 src/sys/sys/bootblock.h
cvs rdiff -u -r1.5 -r1.5.24.1 src/tools/Makefile.nbincludes
cvs rdiff -u -r1.56 -r1.56.6.1 src/usr.sbin/installboot/Makefile
cvs rdiff -u -r0 -r1.2.2.2 src/usr.sbin/installboot/cd9660.c
cvs rdiff -u -r1.13 -r1.13.56.1 src/usr.sbin/installboot/fstypes.c
cvs rdiff -u -r1.105 -r1.105.2.1 src/usr.sbin/installboot/installboot.8
cvs rdiff -u -r1.43 -r1.43.2.1 src/usr.sbin/installboot/installboot.h
cvs rdiff -u -r1.17 -r1.17.2.1 src/usr.sbin/installboot/arch/hp300.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
>Unformatted:
(Contact us)
$NetBSD: query-full-pr,v 1.47 2022/09/11 19:34:41 kim Exp $
$NetBSD: gnats_config.sh,v 1.9 2014/08/02 14:16:04 spz Exp $
Copyright © 1994-2024
The NetBSD Foundation, Inc. ALL RIGHTS RESERVED.