Jeremy Katz
2006-Aug-09 20:09 UTC
[Xen-devel] [PATCH] [QEMU] Allow trying to boot from more than one device
The rombios supports trying to boot from more than one device and then falling back. The attached makes it so that we can take advantage of that in the device model. Just set ''boot=dc'' in your config file to try booting first from the CD and then the hard drive. Sent as an RFC to qemu-devel so that this can hopefully come in for free at some point. But it might be useful functionality to have before then. Signed-off-by: Jeremy Katz <katzj@redhat.com> Jeremy _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Jeremy Katz
2006-Aug-14 19:26 UTC
Re: [Xen-devel] [PATCH] [QEMU] Allow trying to boot from more than one device
On Wed, 2006-08-09 at 16:09 -0400, Jeremy Katz wrote:> The rombios supports trying to boot from more than one device and then > falling back. The attached makes it so that we can take advantage of > that in the device model. Just set ''boot=dc'' in your config file to try > booting first from the CD and then the hard drive. > > Sent as an RFC to qemu-devel so that this can hopefully come in for free > at some point. But it might be useful functionality to have before > then. > > Signed-off-by: Jeremy Katz <katzj@redhat.com>Anyone? Is this just completely bone-headed? :) Jeremy _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Philip R. Auld
2006-Aug-14 20:29 UTC
Re: [Xen-devel] [PATCH] [QEMU] Allow trying to boot from more than one device
Rumor has it that on Mon, Aug 14, 2006 at 03:26:32PM -0400 Jeremy Katz said:> On Wed, 2006-08-09 at 16:09 -0400, Jeremy Katz wrote: > > The rombios supports trying to boot from more than one device and then > > falling back. The attached makes it so that we can take advantage of > > that in the device model. Just set ''boot=dc'' in your config file to try > > booting first from the CD and then the hard drive. > > > > Sent as an RFC to qemu-devel so that this can hopefully come in for free > > at some point. But it might be useful functionality to have before > > then. > > > > Signed-off-by: Jeremy Katz <katzj@redhat.com> > > Anyone? Is this just completely bone-headed? :)I think it''s a good idea. It makes it work more like a "standard" system. fwiw, Phil> > Jeremy> diff -r b60ea69932b1 tools/ioemu/hw/pc.c > --- a/tools/ioemu/hw/pc.c Wed Aug 09 18:04:20 2006 +0100 > +++ b/tools/ioemu/hw/pc.c Wed Aug 09 15:55:12 2006 -0400 > @@ -158,8 +158,22 @@ static void cmos_init_hd(int type_ofs, i > rtc_set_memory(s, info_ofs + 8, sectors); > } > > +static int get_bios_disk(int device) { > + switch(device) { > + case ''a'': > + case ''b'': > + return 0x01; /* floppy */ > + default: > + case ''c'': > + return 0x02; /* hard drive */ > + case ''d'': > + return 0x03; /* cdrom */ > + } > + return 0x02; > +} > + > /* hd_table must contain 4 block drivers */ > -static void cmos_init(uint64_t ram_size, int boot_device, BlockDriverState **hd_table, time_t timeoffset) > +static void cmos_init(uint64_t ram_size, int boot_device[4], BlockDriverState **hd_table, time_t timeoffset) > { > RTCState *s = rtc_state; > int val; > @@ -204,23 +218,22 @@ static void cmos_init(uint64_t ram_size, > val = 65535; > rtc_set_memory(s, 0x34, val); > rtc_set_memory(s, 0x35, val >> 8); > - > - switch(boot_device) { > - case ''a'': > - case ''b'': > - rtc_set_memory(s, 0x3d, 0x01); /* floppy boot */ > - if (!fd_bootchk) > - rtc_set_memory(s, 0x38, 0x01); /* disable signature check */ > - break; > - default: > - case ''c'': > - rtc_set_memory(s, 0x3d, 0x02); /* hard drive boot */ > - break; > - case ''d'': > - rtc_set_memory(s, 0x3d, 0x03); /* CD-ROM boot */ > - break; > - } > - > + > + if (boot_device[0] == 0) { > + fprintf(stderr, "no boot device specified, using defaults\n"); > + /* default to floppy, then cd, then hd */ > + rtc_set_memory(s, 0x3d, 0x01 | (0x03 << 4)); > + rtc_set_memory(s, 0x38, 0x02 << 4); > + } else { > + if (boot_device[1] == 0) { > + rtc_set_memory(s, 0x3d, get_bios_disk(boot_device[0])); > + } else { > + rtc_set_memory(s, 0x3d, get_bios_disk(boot_device[0]) | (get_bios_disk(boot_device[1]) << 4)); > + if (boot_device[2] != 0) > + rtc_set_memory(s, 0x38, get_bios_disk(boot_device[2]) << 4); > + } > + } > + > /* floppy type */ > > fd0 = fdctrl_get_drive_type(floppy_controller, 0); > @@ -620,7 +633,7 @@ static void pc_init_ne2k_isa(NICInfo *nd > #define NOBIOS 1 > > /* PC hardware initialisation */ > -static void pc_init1(uint64_t ram_size, int vga_ram_size, int boot_device, > +static void pc_init1(uint64_t ram_size, int vga_ram_size, int boot_device[4], > DisplayState *ds, const char **fd_filename, int snapshot, > const char *kernel_filename, const char *kernel_cmdline, > const char *initrd_filename, time_t timeoffset, > @@ -915,7 +928,7 @@ static void pc_init1(uint64_t ram_size, > } > } > > -static void pc_init_pci(uint64_t ram_size, int vga_ram_size, int boot_device, > +static void pc_init_pci(uint64_t ram_size, int vga_ram_size, int boot_device[4], > DisplayState *ds, const char **fd_filename, > int snapshot, > const char *kernel_filename, > @@ -929,7 +942,7 @@ static void pc_init_pci(uint64_t ram_siz > initrd_filename, timeoffset, 1); > } > > -static void pc_init_isa(uint64_t ram_size, int vga_ram_size, int boot_device, > +static void pc_init_isa(uint64_t ram_size, int vga_ram_size, int boot_device[4], > DisplayState *ds, const char **fd_filename, > int snapshot, > const char *kernel_filename, > diff -r b60ea69932b1 tools/ioemu/vl.c > --- a/tools/ioemu/vl.c Wed Aug 09 18:04:20 2006 +0100 > +++ b/tools/ioemu/vl.c Wed Aug 09 15:55:43 2006 -0400 > @@ -124,7 +124,7 @@ int vncunused; > int vncunused; > const char* keyboard_layout = NULL; > int64_t ticks_per_sec; > -int boot_device = ''c''; > +int boot_device[4]; > uint64_t ram_size; > int pit_min_timer_count = 0; > int nb_nics; > @@ -5823,6 +5823,7 @@ int main(int argc, char **argv) > int start_emulation = 1; > char net_clients[MAX_NET_CLIENTS][256]; > int nb_net_clients; > + int nb_boot_devices; > int optind; > const char *r, *optarg; > CharDriverState *monitor_hd; > @@ -6056,15 +6057,17 @@ int main(int argc, char **argv) > break; > #endif /* !CONFIG_DM */ > case QEMU_OPTION_boot: > - boot_device = optarg[0]; > - if (boot_device != ''a'' && > + for (i = 0; optarg[i] && (nb_boot_devices < 4); i++) { > + if (optarg[i] != ''a'' && > #ifdef TARGET_SPARC > - // Network boot > - boot_device != ''n'' && > -#endif > - boot_device != ''c'' && boot_device != ''d'') { > - fprintf(stderr, "qemu: invalid boot device ''%c''\n", boot_device); > - exit(1); > + // Network boot > + optarg[i] != ''n'' && > +#endif > + optarg[i] != ''c'' && optarg[i] != ''d'') { > + fprintf(stderr, "qemu: invalid boot device ''%c''\n", optarg[0]); > + exit(1); > + } > + boot_device[nb_boot_devices++] = optarg[i]; > } > break; > case QEMU_OPTION_fda: > @@ -6326,7 +6329,8 @@ int main(int argc, char **argv) > (cdrom_index >= 0 && hd_filename[cdrom_index] == ''\0'') && > fd_filename[0] == ''\0'') > help(); > - > + > +#if 0 > /* boot to cd by default if no hard disk */ > if (hd_filename[0] == ''\0'' && boot_device == ''c'') { > if (fd_filename[0] != ''\0'') > @@ -6334,6 +6338,7 @@ int main(int argc, char **argv) > else > boot_device = ''d''; > } > +#endif > #endif /* !CONFIG_DM */ > > setvbuf(stdout, NULL, _IOLBF, 0); > diff -r b60ea69932b1 tools/ioemu/vl.h > --- a/tools/ioemu/vl.h Wed Aug 09 18:04:20 2006 +0100 > +++ b/tools/ioemu/vl.h Wed Aug 09 15:52:27 2006 -0400 > @@ -574,7 +574,7 @@ int qcow_compress_cluster(BlockDriverSta > #ifndef QEMU_TOOL > > typedef void QEMUMachineInitFunc(uint64_t ram_size, int vga_ram_size, > - int boot_device, > + int boot_device[4], > DisplayState *ds, const char **fd_filename, int snapshot, > const char *kernel_filename, const char *kernel_cmdline, > const char *initrd_filename, time_t timeoffset); > @@ -1016,7 +1016,7 @@ void NVRAM_set_crc (m48t59_t *nvram, uin > uint32_t start, uint32_t count); > int PPC_NVRAM_set_params (m48t59_t *nvram, uint16_t NVRAM_size, > const unsigned char *arch, > - uint32_t RAM_size, int boot_device, > + uint32_t RAM_size, int boot_device[4], > uint32_t kernel_image, uint32_t kernel_size, > const char *cmdline, > uint32_t initrd_image, uint32_t initrd_size,> _______________________________________________ > Xen-devel mailing list > Xen-devel@lists.xensource.com > http://lists.xensource.com/xen-devel-- Philip R. Auld, Ph.D. Egenera, Inc. Software Architect 165 Forest St. (508) 858-2628 Marlboro, MA 01752 _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Christian Limpach
2006-Aug-20 22:41 UTC
Re: [Xen-devel] [PATCH] [QEMU] Allow trying to boot from more than one device
On 8/14/06, Jeremy Katz <katzj@redhat.com> wrote:> On Wed, 2006-08-09 at 16:09 -0400, Jeremy Katz wrote: > > The rombios supports trying to boot from more than one device and then > > falling back. The attached makes it so that we can take advantage of > > that in the device model. Just set ''boot=dc'' in your config file to try > > booting first from the CD and then the hard drive. > > > > Sent as an RFC to qemu-devel so that this can hopefully come in for free > > at some point. But it might be useful functionality to have before > > then. > > > > Signed-off-by: Jeremy Katz <katzj@redhat.com> > > Anyone? Is this just completely bone-headed? :)No, it''s ok. I''ve checked in the attached changes now. christian _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel