NetBSD-Bugs archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: port-amd64/59207: unexpected behavior of dev command in bootstrap code
The following reply was made to PR port-amd64/59207; it has been noted by GNATS.
From: RVP <rvp%SDF.ORG@localhost>
To: gnats-bugs%netbsd.org@localhost
Cc:
Subject: Re: port-amd64/59207: unexpected behavior of dev command in bootstrap
code
Date: Wed, 26 Mar 2025 07:44:21 +0000 (UTC)
On Sun, 23 Mar 2025, Paul Goyette via gnats wrote:
> It seems that the rndseed command behaves similarly, [...]
>
Yeah, the set of commands recognized in /boot.cfg differ from those
understood at the bootloader prompt.
For EFI on amd64, following the call sequence:
sys/arch/i386/stand/efiboot/efiboot.c:efi_main() ->
sys/arch/i386/stand/efiboot/boot.c:boot() ->
sys/arch/i386/stand/lib/bootmenu.c:parsebootconf() ->
sys/lib/libsa/bootcfg.c:perform_bootcfg()
we see that only these commands are recognized in /boot.cfg:
menu, banner, timeout, default, consdev, root, format, clear &
fs, load, userconf via the call-back function.
At the bootloader prompt, the `commands[]' array has the commands you can
type in:
sys/arch/i386/stand/efiboot/efiboot.c:efi_main() ->
sys/arch/i386/stand/efiboot/boot.c:boot() ->
sys/arch/i386/stand/lib/menuutils.c:bootmenu() -> docommand() ->
sys/arch/i386/stand/efiboot/boot.c: ->
struct bootblk_command commands[] = { ... };
There're probably good reasons for this...
Anyway, Paul, can you please try this patch?
Thx,
-RVP
---START patch---
diff -urN a/src/sys/arch/i386/stand/boot/boot2.c b/src/sys/arch/i386/stand/boot/boot2.c
--- a/src/sys/arch/i386/stand/boot/boot2.c 2022-06-08 21:43:45.000000000 +0000
+++ b/src/sys/arch/i386/stand/boot/boot2.c 2025-03-26 06:42:31.883704627 +0000
@@ -130,7 +130,6 @@
void command_quit(char *);
void command_boot(char *);
void command_pkboot(char *);
-void command_dev(char *);
void command_consdev(char *);
void command_root(char *);
#ifndef SMALL
diff -urN a/src/sys/arch/i386/stand/dosboot/main.c b/src/sys/arch/i386/stand/dosboot/main.c
--- a/src/sys/arch/i386/stand/dosboot/main.c 2024-09-12 05:58:29.835738814 +0000
+++ b/src/sys/arch/i386/stand/dosboot/main.c 2025-03-26 06:42:31.883704627 +0000
@@ -65,7 +65,6 @@
void command_quit(char *);
void command_boot(char *);
void command_mode(char *);
-void command_dev(char *);
const struct bootblk_command commands[] = {
{ "help", command_help },
diff -urN a/src/sys/arch/i386/stand/lib/bootmenu.c b/src/sys/arch/i386/stand/lib/bootmenu.c
--- a/src/sys/arch/i386/stand/lib/bootmenu.c 2024-11-28 01:49:47.366302337 +0000
+++ b/src/sys/arch/i386/stand/lib/bootmenu.c 2025-03-26 07:04:54.920298651 +0000
@@ -57,10 +57,14 @@
static void
do_bootcfg_command(const char *cmd, char *arg)
{
- if (strcmp(cmd, BOOTCFG_CMD_LOAD) == 0)
- module_add(arg);
- else if (strcmp(cmd, "fs") == 0)
+ if (strcmp(cmd, BOOTCFG_CMD_DEV) == 0)
+ command_dev(arg);
+ else if (strcmp(cmd, BOOTCFG_CMD_FS) == 0)
fs_add(arg);
+ else if (strcmp(cmd, BOOTCFG_CMD_LOAD) == 0)
+ module_add(arg);
+ else if (strcmp(cmd, BOOTCFG_CMD_RNDSEED) == 0)
+ rnd_add(arg);
else if (strcmp(cmd, BOOTCFG_CMD_USERCONF) == 0)
userconf_add(arg);
}
diff -urN a/src/sys/arch/i386/stand/lib/libi386.h b/src/sys/arch/i386/stand/lib/libi386.h
--- a/src/sys/arch/i386/stand/lib/libi386.h 2024-09-18 04:04:46.535251031 +0000
+++ b/src/sys/arch/i386/stand/lib/libi386.h 2025-03-26 06:42:31.883704627 +0000
@@ -150,6 +150,9 @@
void userconf_add(char *);
void module_add_split(const char *, uint8_t);
+/* Note: implementations differ in boot2, dosboot & efiboot */
+void command_dev(char *);
+
struct btinfo_framebuffer;
void framebuffer_configure(struct btinfo_framebuffer *);
diff -urN a/src/sys/lib/libsa/bootcfg.c b/src/sys/lib/libsa/bootcfg.c
--- a/src/sys/lib/libsa/bootcfg.c 2022-01-05 16:01:54.000000000 +0000
+++ b/src/sys/lib/libsa/bootcfg.c 2025-03-26 07:03:58.367307984 +0000
@@ -227,8 +227,6 @@
bootcfg_info.consdev = value;
} else if (!strncmp(key, "root", 4)) {
bootcfg_info.root = value;
- } else if (!strncmp(key, BOOTCFG_CMD_LOAD, 4)) {
- command(BOOTCFG_CMD_LOAD, value);
} else if (!strncmp(key, "format", 6)) {
printf("value:%c\n", *value);
switch (*value) {
@@ -251,8 +249,6 @@
}
} else if (!strncmp(key, "clear", 5)) {
bootcfg_info.clear = !!atoi(value);
- } else if (!strncmp(key, BOOTCFG_CMD_USERCONF, 8)) {
- command(BOOTCFG_CMD_USERCONF, value);
} else {
command(key, value);
}
diff -urN a/src/sys/lib/libsa/bootcfg.h b/src/sys/lib/libsa/bootcfg.h
--- a/src/sys/lib/libsa/bootcfg.h 2021-09-07 11:41:31.000000000 +0000
+++ b/src/sys/lib/libsa/bootcfg.h 2025-03-26 07:12:00.103744727 +0000
@@ -29,12 +29,15 @@
#ifndef _BOOTCFG_H
#define _BOOTCFG_H
-#define BOOTCFG_FILENAME "boot.cfg"
-#define BOOTCFG_MAXMENU 20
-#define BOOTCFG_MAXBANNER 12
+#define BOOTCFG_FILENAME "boot.cfg"
+#define BOOTCFG_MAXMENU 20
+#define BOOTCFG_MAXBANNER 12
-#define BOOTCFG_CMD_LOAD "load"
-#define BOOTCFG_CMD_USERCONF "userconf"
+#define BOOTCFG_CMD_DEV "dev"
+#define BOOTCFG_CMD_FS "fs"
+#define BOOTCFG_CMD_LOAD "load"
+#define BOOTCFG_CMD_RNDSEED "rndseed"
+#define BOOTCFG_CMD_USERCONF "userconf"
typedef void (*bootcfg_command)(const char *cmd, char *arg);
---END patch---
Home |
Main Index |
Thread Index |
Old Index