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
|