[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] 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@xxxxxxxxxx> > > 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@xxxxxxxxxxxxxxxxxxx > 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@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |