Commit ef3adf68f802da54b2096da8aa3ce97bde54be2e
Committed by
Anthony Liguori
1 parent
e8b2a1c6
Rework -boot option
This patch changes the boot command line option to the canonical format -boot [order=drives][,...] where 'drives' is using the same format as the old -boot. The format switch allows to add the 'menu' and 'once' options in later patches. The old format is still understood and will be processed at least for a transition time. Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
Showing
1 changed file
with
50 additions
and
31 deletions
vl.c
@@ -2356,6 +2356,35 @@ int drive_init(struct drive_opt *arg, int snapshot, void *opaque) | @@ -2356,6 +2356,35 @@ int drive_init(struct drive_opt *arg, int snapshot, void *opaque) | ||
2356 | return drives_table_idx; | 2356 | return drives_table_idx; |
2357 | } | 2357 | } |
2358 | 2358 | ||
2359 | +static int parse_bootdevices(char *devices) | ||
2360 | +{ | ||
2361 | + /* We just do some generic consistency checks */ | ||
2362 | + const char *p; | ||
2363 | + int bitmap = 0; | ||
2364 | + | ||
2365 | + for (p = devices; *p != '\0'; p++) { | ||
2366 | + /* Allowed boot devices are: | ||
2367 | + * a-b: floppy disk drives | ||
2368 | + * c-f: IDE disk drives | ||
2369 | + * g-m: machine implementation dependant drives | ||
2370 | + * n-p: network devices | ||
2371 | + * It's up to each machine implementation to check if the given boot | ||
2372 | + * devices match the actual hardware implementation and firmware | ||
2373 | + * features. | ||
2374 | + */ | ||
2375 | + if (*p < 'a' || *p > 'p') { | ||
2376 | + fprintf(stderr, "Invalid boot device '%c'\n", *p); | ||
2377 | + exit(1); | ||
2378 | + } | ||
2379 | + if (bitmap & (1 << (*p - 'a'))) { | ||
2380 | + fprintf(stderr, "Boot device '%c' was given twice\n", *p); | ||
2381 | + exit(1); | ||
2382 | + } | ||
2383 | + bitmap |= 1 << (*p - 'a'); | ||
2384 | + } | ||
2385 | + return bitmap; | ||
2386 | +} | ||
2387 | + | ||
2359 | static void numa_add(const char *optarg) | 2388 | static void numa_add(const char *optarg) |
2360 | { | 2389 | { |
2361 | char option[128]; | 2390 | char option[128]; |
@@ -4765,7 +4794,7 @@ int main(int argc, char **argv, char **envp) | @@ -4765,7 +4794,7 @@ int main(int argc, char **argv, char **envp) | ||
4765 | int snapshot, linux_boot, net_boot; | 4794 | int snapshot, linux_boot, net_boot; |
4766 | const char *initrd_filename; | 4795 | const char *initrd_filename; |
4767 | const char *kernel_filename, *kernel_cmdline; | 4796 | const char *kernel_filename, *kernel_cmdline; |
4768 | - const char *boot_devices = ""; | 4797 | + char boot_devices[33] = "cad"; /* default to HD->floppy->CD-ROM */ |
4769 | DisplayState *ds; | 4798 | DisplayState *ds; |
4770 | DisplayChangeListener *dcl; | 4799 | DisplayChangeListener *dcl; |
4771 | int cyls, heads, secs, translation; | 4800 | int cyls, heads, secs, translation; |
@@ -5054,33 +5083,27 @@ int main(int argc, char **argv, char **envp) | @@ -5054,33 +5083,27 @@ int main(int argc, char **argv, char **envp) | ||
5054 | drive_add(optarg, CDROM_ALIAS); | 5083 | drive_add(optarg, CDROM_ALIAS); |
5055 | break; | 5084 | break; |
5056 | case QEMU_OPTION_boot: | 5085 | case QEMU_OPTION_boot: |
5057 | - boot_devices = optarg; | ||
5058 | - /* We just do some generic consistency checks */ | ||
5059 | { | 5086 | { |
5060 | - /* Could easily be extended to 64 devices if needed */ | ||
5061 | - const char *p; | ||
5062 | - | ||
5063 | - boot_devices_bitmap = 0; | ||
5064 | - for (p = boot_devices; *p != '\0'; p++) { | ||
5065 | - /* Allowed boot devices are: | ||
5066 | - * a b : floppy disk drives | ||
5067 | - * c ... f : IDE disk drives | ||
5068 | - * g ... m : machine implementation dependant drives | ||
5069 | - * n ... p : network devices | ||
5070 | - * It's up to each machine implementation to check | ||
5071 | - * if the given boot devices match the actual hardware | ||
5072 | - * implementation and firmware features. | ||
5073 | - */ | ||
5074 | - if (*p < 'a' || *p > 'q') { | ||
5075 | - fprintf(stderr, "Invalid boot device '%c'\n", *p); | ||
5076 | - exit(1); | ||
5077 | - } | ||
5078 | - if (boot_devices_bitmap & (1 << (*p - 'a'))) { | ||
5079 | - fprintf(stderr, | ||
5080 | - "Boot device '%c' was given twice\n",*p); | ||
5081 | - exit(1); | ||
5082 | - } | ||
5083 | - boot_devices_bitmap |= 1 << (*p - 'a'); | 5087 | + static const char * const params[] = { |
5088 | + "order", NULL | ||
5089 | + }; | ||
5090 | + char buf[sizeof(boot_devices)]; | ||
5091 | + int legacy = 0; | ||
5092 | + | ||
5093 | + if (!strchr(optarg, '=')) { | ||
5094 | + legacy = 1; | ||
5095 | + pstrcpy(buf, sizeof(buf), optarg); | ||
5096 | + } else if (check_params(buf, sizeof(buf), params, optarg) < 0) { | ||
5097 | + fprintf(stderr, | ||
5098 | + "qemu: unknown boot parameter '%s' in '%s'\n", | ||
5099 | + buf, optarg); | ||
5100 | + exit(1); | ||
5101 | + } | ||
5102 | + | ||
5103 | + if (legacy || | ||
5104 | + get_param_value(buf, sizeof(buf), "order", optarg)) { | ||
5105 | + boot_devices_bitmap = parse_bootdevices(buf); | ||
5106 | + pstrcpy(boot_devices, sizeof(boot_devices), buf); | ||
5084 | } | 5107 | } |
5085 | } | 5108 | } |
5086 | break; | 5109 | break; |
@@ -5649,10 +5672,6 @@ int main(int argc, char **argv, char **envp) | @@ -5649,10 +5672,6 @@ int main(int argc, char **argv, char **envp) | ||
5649 | exit(1); | 5672 | exit(1); |
5650 | } | 5673 | } |
5651 | 5674 | ||
5652 | - /* boot to floppy or the default cd if no hard disk defined yet */ | ||
5653 | - if (!boot_devices[0]) { | ||
5654 | - boot_devices = "cad"; | ||
5655 | - } | ||
5656 | setvbuf(stdout, NULL, _IOLBF, 0); | 5675 | setvbuf(stdout, NULL, _IOLBF, 0); |
5657 | 5676 | ||
5658 | init_timers(); | 5677 | init_timers(); |