All of lore.kernel.org
 help / color / mirror / Atom feed
* [Qemu-devel] [RESEND][PATCH v2 1/2] Rework -boot option
@ 2009-06-27  8:11 Jan Kiszka
  2009-06-28 16:54 ` Avi Kivity
  2009-06-28 19:40 ` Sebastian Herbszt
  0 siblings, 2 replies; 5+ messages in thread
From: Jan Kiszka @ 2009-06-27  8:11 UTC (permalink / raw)
  To: Anthony Liguori; +Cc: qemu-devel

[-- Attachment #1: Type: text/plain, Size: 9077 bytes --]

This patch changes the boot command line option to the canonical format

 -boot [order=]drives[,interactive=on|off]

where 'drives' is using the same format as the old -boot. The format
switch allows to add the 'interactive' option and use the existing
infrastructure to parse it. However, the old format is still understood
and will be processed at least for a transition time.

The state of 'interactive' is transfered to the firmware via the new
configuration value FW_CFG_BOOT_INTERACTIVE.

Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
---

 hw/fw_cfg.c     |    1 +
 hw/fw_cfg.h     |    1 +
 qemu-options.hx |   22 ++++++++++++--
 sysemu.h        |    1 +
 vl.c            |   85 ++++++++++++++++++++++++++++++++++++++-----------------
 5 files changed, 80 insertions(+), 30 deletions(-)

diff --git a/hw/fw_cfg.c b/hw/fw_cfg.c
index 276c396..e6dafc5 100644
--- a/hw/fw_cfg.c
+++ b/hw/fw_cfg.c
@@ -279,6 +279,7 @@ void *fw_cfg_init(uint32_t ctl_port, uint32_t data_port,
     fw_cfg_add_bytes(s, FW_CFG_UUID, qemu_uuid, 16);
     fw_cfg_add_i16(s, FW_CFG_NOGRAPHIC, (uint16_t)(display_type == DT_NOGRAPHIC));
     fw_cfg_add_i16(s, FW_CFG_NB_CPUS, (uint16_t)smp_cpus);
+    fw_cfg_add_i16(s, FW_CFG_BOOT_INTERACTIVE, (uint16_t)boot_interactive);
 
     register_savevm("fw_cfg", -1, 1, fw_cfg_save, fw_cfg_load, s);
     qemu_register_reset(fw_cfg_reset, 0, s);
diff --git a/hw/fw_cfg.h b/hw/fw_cfg.h
index f616ed2..b881e2c 100644
--- a/hw/fw_cfg.h
+++ b/hw/fw_cfg.h
@@ -15,6 +15,7 @@
 #define FW_CFG_INITRD_SIZE      0x0b
 #define FW_CFG_BOOT_DEVICE      0x0c
 #define FW_CFG_NUMA             0x0d
+#define FW_CFG_BOOT_INTERACTIVE 0x0e
 #define FW_CFG_MAX_ENTRY        0x10
 
 #define FW_CFG_WRITE_CHANNEL    0x4000
diff --git a/qemu-options.hx b/qemu-options.hx
index 503da33..5cf40c8 100644
--- a/qemu-options.hx
+++ b/qemu-options.hx
@@ -221,11 +221,25 @@ Use 'file' as a parallel flash image.
 ETEXI
 
 DEF("boot", HAS_ARG, QEMU_OPTION_boot,
-    "-boot [a|c|d|n] boot on floppy (a), hard disk (c), CD-ROM (d), or network (n)\n")
+    "-boot [order=drives][,interactive=on|off]\n"
+    "                'drives': floppy (a), hard disk (c), CD-ROM (d), network (n)\n")
 STEXI
-@item -boot [a|c|d|n]
-Boot on floppy (a), hard disk (c), CD-ROM (d), or Etherboot (n). Hard disk boot
-is the default.
+@item -boot [order=@var{drives}][,interactive=on|off]
+
+Specify boot order @var{drives} as a string of drive letters. Valid
+drive letters depend on the target achitecture. The x86 PC uses: a, b
+(floppy 1 and 2), c (first hard disk), d (first CD-ROM), n-p (Etherboot
+from network adapter 1-4), hard disk boot is the default. Furthermore,
+interactive boot menus/prompts can be enabled as far as firmware/BIOS
+supports them. The default is non-interactive boot.
+
+@example
+# try to boot from network first, then from hard disk
+qemu -boot order=nc
+@end example
+
+Note: The legacy format '-boot @var{drives}' is still supported but its
+use is discouraged as it may be removed from future versions.
 ETEXI
 
 DEF("snapshot", 0, QEMU_OPTION_snapshot,
diff --git a/sysemu.h b/sysemu.h
index d77de09..6dcdc2e 100644
--- a/sysemu.h
+++ b/sysemu.h
@@ -123,6 +123,7 @@ extern int graphic_rotate;
 extern int no_quit;
 extern int semihosting_enabled;
 extern int old_param;
+extern int boot_interactive;
 
 #ifdef CONFIG_KQEMU
 extern int kqemu_allowed;
diff --git a/vl.c b/vl.c
index 60a00e1..9608813 100644
--- a/vl.c
+++ b/vl.c
@@ -269,6 +269,7 @@ const char *prom_envs[MAX_PROM_ENVS];
 #endif
 int nb_drives_opt;
 struct drive_opt drives_opt[MAX_DRIVES];
+int boot_interactive;
 
 int nb_numa_nodes;
 uint64_t node_mem[MAX_NODES];
@@ -4961,7 +4962,7 @@ int main(int argc, char **argv, char **envp)
     int snapshot, linux_boot, net_boot;
     const char *initrd_filename;
     const char *kernel_filename, *kernel_cmdline;
-    const char *boot_devices = "";
+    char boot_devices[33] = "";
     DisplayState *ds;
     DisplayChangeListener *dcl;
     int cyls, heads, secs, translation;
@@ -5250,33 +5251,65 @@ int main(int argc, char **argv, char **envp)
                 drive_add(optarg, CDROM_ALIAS);
                 break;
             case QEMU_OPTION_boot:
-                boot_devices = optarg;
-                /* We just do some generic consistency checks */
                 {
-                    /* Could easily be extended to 64 devices if needed */
-                    const char *p;
-                    
-                    boot_devices_bitmap = 0;
-                    for (p = boot_devices; *p != '\0'; p++) {
-                        /* Allowed boot devices are:
-                         * a b     : floppy disk drives
-                         * c ... f : IDE disk drives
-                         * g ... m : machine implementation dependant drives
-                         * n ... p : network devices
-                         * It's up to each machine implementation to check
-                         * if the given boot devices match the actual hardware
-                         * implementation and firmware features.
-                         */
-                        if (*p < 'a' || *p > 'q') {
-                            fprintf(stderr, "Invalid boot device '%c'\n", *p);
-                            exit(1);
+                    static const char * const params[] = {
+                        "order", "interactive", NULL
+                    };
+                    int legacy = 0;
+                    char buf[16];
+
+                    if (!strchr(optarg, '=')) {
+                        legacy = 1;
+                        pstrcpy(boot_devices, sizeof(boot_devices), optarg);
+                    } else if (check_params(buf, sizeof(buf), params, optarg) < 0) {
+                        fprintf(stderr,
+                                "qemu: unknown boot parameter '%s' in '%s'\n",
+                                buf, optarg);
+                        exit(1);
+                    }
+
+                    if (legacy ||
+                        get_param_value(boot_devices, sizeof(boot_devices),
+                                        "order", optarg)) {
+                        /* We just do some generic consistency checks */
+                        const char *p;
+
+                        boot_devices_bitmap = 0;
+                        for (p = boot_devices; *p != '\0'; p++) {
+                            /* Allowed boot devices are:
+                             * a-b: floppy disk drives
+                             * c-f: IDE disk drives
+                             * g-m: machine implementation dependant drives
+                             * n-p: network devices
+                             * It's up to each machine implementation to check
+                             * if the given boot devices match the actual
+                             * hardware implementation and firmware features.
+                             */
+                            if (*p < 'a' || *p > 'p') {
+                                fprintf(stderr, "Invalid boot device '%c'\n",
+                                        *p);
+                                exit(1);
+                            }
+                            if (boot_devices_bitmap & (1 << (*p - 'a'))) {
+                                fprintf(stderr,
+                                        "Boot device '%c' was given twice\n",
+                                        *p);
+                                exit(1);
+                             }
+                             boot_devices_bitmap |= 1 << (*p - 'a');
                         }
-                        if (boot_devices_bitmap & (1 << (*p - 'a'))) {
-                            fprintf(stderr,
-                                    "Boot device '%c' was given twice\n",*p);
-                            exit(1);
+                    }
+                    if (!legacy && get_param_value(buf, sizeof(buf),
+                                                   "interactive", optarg)) {
+                        if (!strcmp(buf, "on")) {
+                            boot_interactive = 1;
+                        } else if (!strcmp(buf, "off")) {
+                            boot_interactive = 0;
+                        } else {
+                           fprintf(stderr,
+                                   "qemu: invalid option value '%s'\n", buf);
+                           exit(1);
                         }
-                        boot_devices_bitmap |= 1 << (*p - 'a');
                     }
                 }
                 break;
@@ -5832,7 +5865,7 @@ int main(int argc, char **argv, char **envp)
 
     /* boot to floppy or the default cd if no hard disk defined yet */
     if (!boot_devices[0]) {
-        boot_devices = "cad";
+        strcpy(boot_devices, "cad");
     }
     setvbuf(stdout, NULL, _IOLBF, 0);
 


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 257 bytes --]

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [Qemu-devel] [RESEND][PATCH v2 1/2] Rework -boot option
  2009-06-27  8:11 [Qemu-devel] [RESEND][PATCH v2 1/2] Rework -boot option Jan Kiszka
@ 2009-06-28 16:54 ` Avi Kivity
  2009-06-28 18:15   ` [Qemu-devel] " Jan Kiszka
  2009-06-28 19:40 ` Sebastian Herbszt
  1 sibling, 1 reply; 5+ messages in thread
From: Avi Kivity @ 2009-06-28 16:54 UTC (permalink / raw)
  To: Jan Kiszka; +Cc: Anthony Liguori, qemu-devel

On 06/27/2009 11:11 AM, Jan Kiszka wrote:
> This patch changes the boot command line option to the canonical format
>
>   -boot [order=]drives[,interactive=on|off]
>
> where 'drives' is using the same format as the old -boot. The format
> switch allows to add the 'interactive' option and use the existing
> infrastructure to parse it. However, the old format is still understood
> and will be processed at least for a transition time.
>
> The state of 'interactive' is transfered to the firmware via the new
> configuration value FW_CFG_BOOT_INTERACTIVE.
>    

Perhaps interactive (and the boot order itself) should be forgotten 
after a successful boot?  A typical use case is to boot an installer off 
the cdrom; the next boot ought to try the hard disk.  But perhaps other 
use cases don't want that.

-- 
error compiling committee.c: too many arguments to function

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [Qemu-devel] Re: [RESEND][PATCH v2 1/2] Rework -boot option
  2009-06-28 16:54 ` Avi Kivity
@ 2009-06-28 18:15   ` Jan Kiszka
  0 siblings, 0 replies; 5+ messages in thread
From: Jan Kiszka @ 2009-06-28 18:15 UTC (permalink / raw)
  To: Avi Kivity; +Cc: Anthony Liguori, qemu-devel

[-- Attachment #1: Type: text/plain, Size: 1069 bytes --]

Avi Kivity wrote:
> On 06/27/2009 11:11 AM, Jan Kiszka wrote:
>> This patch changes the boot command line option to the canonical format
>>
>>   -boot [order=]drives[,interactive=on|off]
>>
>> where 'drives' is using the same format as the old -boot. The format
>> switch allows to add the 'interactive' option and use the existing
>> infrastructure to parse it. However, the old format is still understood
>> and will be processed at least for a transition time.
>>
>> The state of 'interactive' is transfered to the firmware via the new
>> configuration value FW_CFG_BOOT_INTERACTIVE.
>>    
> 
> Perhaps interactive (and the boot order itself) should be forgotten
> after a successful boot?  A typical use case is to boot an installer off
> the cdrom; the next boot ought to try the hard disk.  But perhaps other
> use cases don't want that.
> 

We could extend the new format to

  -boot [order=drives][,once=drives][,interactive=on|off]

where 'once' specifies the order to be used only for the very first boot
of this machine.

Jan


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 257 bytes --]

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [Qemu-devel] Re: [RESEND][PATCH v2 1/2] Rework -boot option
  2009-06-27  8:11 [Qemu-devel] [RESEND][PATCH v2 1/2] Rework -boot option Jan Kiszka
  2009-06-28 16:54 ` Avi Kivity
@ 2009-06-28 19:40 ` Sebastian Herbszt
  2009-06-29  6:50   ` Jan Kiszka
  1 sibling, 1 reply; 5+ messages in thread
From: Sebastian Herbszt @ 2009-06-28 19:40 UTC (permalink / raw)
  To: Jan Kiszka, Anthony Liguori; +Cc: qemu-devel

Jan Kiszka wrote:
> This patch changes the boot command line option to the canonical format
> 
>  -boot [order=]drives[,interactive=on|off]
> 
> where 'drives' is using the same format as the old -boot. The format
> switch allows to add the 'interactive' option and use the existing
> infrastructure to parse it. However, the old format is still understood
> and will be processed at least for a transition time.
> 
> The state of 'interactive' is transfered to the firmware via the new
> configuration value FW_CFG_BOOT_INTERACTIVE.

What about using "[boot]menu" instead of "interactive"?
The Phoenix BIOS i got here allows me to enable/disable the boot menu,
so this seems common.

- Sebastian

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [Qemu-devel] Re: [RESEND][PATCH v2 1/2] Rework -boot option
  2009-06-28 19:40 ` Sebastian Herbszt
@ 2009-06-29  6:50   ` Jan Kiszka
  0 siblings, 0 replies; 5+ messages in thread
From: Jan Kiszka @ 2009-06-29  6:50 UTC (permalink / raw)
  To: Sebastian Herbszt; +Cc: Anthony Liguori, qemu-devel

[-- Attachment #1: Type: text/plain, Size: 850 bytes --]

Sebastian Herbszt wrote:
> Jan Kiszka wrote:
>> This patch changes the boot command line option to the canonical format
>>
>>  -boot [order=]drives[,interactive=on|off]
>>
>> where 'drives' is using the same format as the old -boot. The format
>> switch allows to add the 'interactive' option and use the existing
>> infrastructure to parse it. However, the old format is still understood
>> and will be processed at least for a transition time.
>>
>> The state of 'interactive' is transfered to the firmware via the new
>> configuration value FW_CFG_BOOT_INTERACTIVE.
> 
> What about using "[boot]menu" instead of "interactive"?
> The Phoenix BIOS i got here allows me to enable/disable the boot menu,
> so this seems common.

Yes, short is beautiful. Will sent out a new series, addressing all
suggestions made so far.

Jan


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 257 bytes --]

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2009-06-29  6:50 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2009-06-27  8:11 [Qemu-devel] [RESEND][PATCH v2 1/2] Rework -boot option Jan Kiszka
2009-06-28 16:54 ` Avi Kivity
2009-06-28 18:15   ` [Qemu-devel] " Jan Kiszka
2009-06-28 19:40 ` Sebastian Herbszt
2009-06-29  6:50   ` Jan Kiszka

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.