From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1MKT0V-000417-Te for qemu-devel@nongnu.org; Sat, 27 Jun 2009 04:11:31 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1MKT0R-0003zt-Qd for qemu-devel@nongnu.org; Sat, 27 Jun 2009 04:11:31 -0400 Received: from [199.232.76.173] (port=47105 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1MKT0R-0003zq-Lv for qemu-devel@nongnu.org; Sat, 27 Jun 2009 04:11:27 -0400 Received: from fmmailgate01.web.de ([217.72.192.221]:56885) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1MKT0Q-0000zx-TK for qemu-devel@nongnu.org; Sat, 27 Jun 2009 04:11:27 -0400 Message-ID: <4A45D428.9050600@web.de> Date: Sat, 27 Jun 2009 10:11:20 +0200 From: Jan Kiszka MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="------------enig5269D4AF16EF187CA75BFEE4" Sender: jan.kiszka@web.de Subject: [Qemu-devel] [RESEND][PATCH v2 1/2] Rework -boot option List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Anthony Liguori Cc: qemu-devel This is an OpenPGP/MIME signed message (RFC 2440 and 3156) --------------enig5269D4AF16EF187CA75BFEE4 Content-Type: text/plain; charset=ISO-8859-15 Content-Transfer-Encoding: quoted-printable This patch changes the boot command line option to the canonical format -boot [order=3D]drives[,interactive=3Don|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 --- 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_po= rt, fw_cfg_add_bytes(s, FW_CFG_UUID, qemu_uuid, 16); fw_cfg_add_i16(s, FW_CFG_NOGRAPHIC, (uint16_t)(display_type =3D=3D D= T_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_interactiv= e); =20 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 =20 #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 =20 DEF("boot", HAS_ARG, QEMU_OPTION_boot, - "-boot [a|c|d|n] boot on floppy (a), hard disk (c), CD-ROM (d), or n= etwork (n)\n") + "-boot [order=3Ddrives][,interactive=3Don|off]\n" + " 'drives': floppy (a), hard disk (c), CD-ROM (d), ne= twork (n)\n") STEXI -@item -boot [a|c|d|n] -Boot on floppy (a), hard disk (c), CD-ROM (d), or Etherboot (n). Hard di= sk boot -is the default. +@item -boot [order=3D@var{drives}][,interactive=3Don|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=3Dnc +@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 =20 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; =20 #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; =20 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 =3D ""; + char boot_devices[33] =3D ""; 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 =3D optarg; - /* We just do some generic consistency checks */ { - /* Could easily be extended to 64 devices if needed = */ - const char *p; - =20 - boot_devices_bitmap =3D 0; - for (p =3D boot_devices; *p !=3D '\0'; p++) { - /* Allowed boot devices are: - * a b : floppy disk drives - * c ... f : IDE disk drives - * g ... m : machine implementation dependant dr= ives - * n ... p : network devices - * It's up to each machine implementation to che= ck - * if the given boot devices match the actual ha= rdware - * implementation and firmware features. - */ - if (*p < 'a' || *p > 'q') { - fprintf(stderr, "Invalid boot device '%c'\n"= , *p); - exit(1); + static const char * const params[] =3D { + "order", "interactive", NULL + }; + int legacy =3D 0; + char buf[16]; + + if (!strchr(optarg, '=3D')) { + legacy =3D 1; + pstrcpy(boot_devices, sizeof(boot_devices), opta= rg); + } else if (check_params(buf, sizeof(buf), params, op= targ) < 0) { + fprintf(stderr, + "qemu: unknown boot parameter '%s' in '%= s'\n", + buf, optarg); + exit(1); + } + + if (legacy || + get_param_value(boot_devices, sizeof(boot_device= s), + "order", optarg)) { + /* We just do some generic consistency checks */= + const char *p; + + boot_devices_bitmap =3D 0; + for (p =3D boot_devices; *p !=3D '\0'; p++) { + /* Allowed boot devices are: + * a-b: floppy disk drives + * c-f: IDE disk drives + * g-m: machine implementation dependant dri= ves + * n-p: network devices + * It's up to each machine implementation to= check + * if the given boot devices match the actua= l + * hardware implementation and firmware feat= ures. + */ + 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 twic= e\n", + *p); + exit(1); + } + boot_devices_bitmap |=3D 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 =3D 1; + } else if (!strcmp(buf, "off")) { + boot_interactive =3D 0; + } else { + fprintf(stderr, + "qemu: invalid option value '%s'\n", = buf); + exit(1); } - boot_devices_bitmap |=3D 1 << (*p - 'a'); } } break; @@ -5832,7 +5865,7 @@ int main(int argc, char **argv, char **envp) =20 /* boot to floppy or the default cd if no hard disk defined yet */ if (!boot_devices[0]) { - boot_devices =3D "cad"; + strcpy(boot_devices, "cad"); } setvbuf(stdout, NULL, _IOLBF, 0); =20 --------------enig5269D4AF16EF187CA75BFEE4 Content-Type: application/pgp-signature; name="signature.asc" Content-Description: OpenPGP digital signature Content-Disposition: attachment; filename="signature.asc" -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.9 (GNU/Linux) Comment: Using GnuPG with SUSE - http://enigmail.mozdev.org iEYEARECAAYFAkpF1C0ACgkQniDOoMHTA+nIeACePqtmZT7cpdf+Ikf7Az/uagR4 +YwAnRWNLP5xjLw8VGjPfdmpfkgLZ49x =gbph -----END PGP SIGNATURE----- --------------enig5269D4AF16EF187CA75BFEE4--