Port-i386 archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Proposal to enhance boot path selections
It has been pointed out to me (privately) that the recent changes I
made to the biosboot and efiboot code may introduce some confusion
regarding which paths are searched for the boot code. Particularly,
prior to the recent changes one might well use a "naked" boot command
for a primary normal boot, and use /onetbsd (or /netbsd.old or
anything with a leading slash) to request booting from a previous
kernel.
With the recent changes, specifying /onetbsd will only look for a
kernel in /onetbsd and /onetbsd.gz (both being regular files); it
will not look in /onetbsd/kernel or /onetbsd/kernel.gz as might be
expected.
If one is accustomed to booting with the leading slash it could be
disconcerting (or worse) to not having ingrained muscle-memory boot
the old kernel as expected.
So, I propose that the attached patches be made to the path selection
code. Simply stated, a leading slash '/' character in the specified
boot name will no longer prevent treating the boot name as a kernel
directory name. Other embedded slash characters (and multiple leading
slashes) will still prevent using the specified name as a kernel
directory name. So, for example, ``boot /old/netbsd'' will _not_
attempt to boot /old/netbsd/kernel or /old/netbsd/kernel.gz (with
or without the leading slash.)
I've tested this in qemu for both i38 and amd64 biosboot, and tested
on bare-metal amd64[*] efiboot, and it works well. The changes are
very localized and affect only the command_boot() code, and that code
is affected only when an explicit argument is given to the boot
command. A "naked" boot command is not affected by these changes.
[*] For the bare-metal testing I made sure to have a second bootable
media, just in case something broke. I did not have to resort to the
backup. :-)
+---------------------+--------------------------+----------------------+
| Paul Goyette (.sig) | PGP Key fingerprint: | E-mail addresses: |
| (Retired) | 1B11 1849 721C 56C8 F63A | paul%whooppee.com@localhost |
| Software Developer | 6E2E 05FD 15CE 9F2D 5102 | pgoyette%netbsd.org@localhost |
| & Network Engineer | | pgoyette99%gmail.com@localhost |
+---------------------+--------------------------+----------------------+
Index: boot/boot2.c
===================================================================
RCS file: /cvsroot/src/sys/arch/i386/stand/boot/boot2.c,v
retrieving revision 1.86
diff -u -p -r1.86 boot2.c
--- boot/boot2.c 6 May 2025 18:16:12 -0000 1.86
+++ boot/boot2.c 11 May 2025 05:01:43 -0000
@@ -489,14 +489,18 @@ command_boot(char *arg)
if (!parseboot(arg, &filename, &howto))
return;
- if (filename != NULL) {
+ if (filename != NULL && filename[0] != '\0') {
/* try old locations first to assist atf test beds */
snprintf(path, sizeof(path) - 4, "%s", filename);
bootit2(path, sizeof(path), howto);
- /* now treat given filename as a directory */
- if (strchr(filename, '/') == NULL) {
- snprintf(path, sizeof(path) - 4, "%s/kernel", filename);
+ /*
+ * now treat given filename as a directory unless there
+ * is already an embedded path-name separator '/' present
+ */
+ if (strchr(filename + 1, '/') == NULL) {
+ snprintf(path, sizeof(path) - 4, "%s/kernel",
+ filename);
bootit2(path, sizeof(path), howto);
}
} else {
Index: efiboot/boot.c
===================================================================
RCS file: /cvsroot/src/sys/arch/i386/stand/efiboot/boot.c,v
retrieving revision 1.29
diff -u -p -r1.29 boot.c
--- efiboot/boot.c 30 Apr 2025 06:24:47 -0000 1.29
+++ efiboot/boot.c 11 May 2025 05:01:43 -0000
@@ -464,14 +464,18 @@ command_boot(char *arg)
if (!parseboot(arg, &filename, &howto))
return;
- if (filename != NULL) {
+ if (filename != NULL && filename[0] != '\0') {
/* try old locations first to appease atf test beds */
snprintf(path, sizeof(path) - 4, "%s", filename);
bootit2(path, sizeof(path), howto);
- /* now treat given filename as a directory name */
- if (strchr(filename, '/') == NULL) {
- snprintf(path, sizeof(path) - 4, "%s/kernel", filename);
+ /*
+ * now treat given filename as a directory unless there
+ * is already an embedded path-name separator '/' present
+ */
+ if (strchr(filename + 1, '/') == NULL) {
+ snprintf(path, sizeof(path) - 4, "%s/kernel",
+ filename);
bootit2(path, sizeof(path), howto);
}
} else {
Home |
Main Index |
Thread Index |
Old Index