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