[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] [qemu] Allow booting from more than one device.
# HG changeset patch # User Christian Limpach <Christian.Limpach@xxxxxxxxxxxxx> # Node ID fc3e7e65b9530bf1c0fe7a7f12320edd8a656185 # Parent 45a84091144e26ce326b32d8bb661a788ab2685e [qemu] Allow booting from more than one device. The rombios supports trying to boot from more than one device and then falling back. Set 'boot=dc' in your config file to try booting first from the CD and then the hard drive. Based on a patch from: Jeremy Katz <katzj@xxxxxxxxxx> Signed-off-by: Christian Limpach <Christian.Limpach@xxxxxxxxxxxxx> --- tools/examples/xmexample.hvm | 4 ++- tools/examples/xmexample.vti | 4 ++- tools/ioemu/hw/pc.c | 46 +++++++++++++++++++++++++------------------ tools/ioemu/vl.c | 19 ++++++++++------- tools/ioemu/vl.h | 4 +-- 5 files changed, 46 insertions(+), 31 deletions(-) diff -r 45a84091144e -r fc3e7e65b953 tools/examples/xmexample.hvm --- a/tools/examples/xmexample.hvm Sun Aug 20 17:55:33 2006 +0100 +++ b/tools/examples/xmexample.hvm Sun Aug 20 23:33:28 2006 +0100 @@ -116,7 +116,9 @@ device_model = '/usr/' + arch_libdir + ' #----------------------------------------------------------------------------- # boot on floppy (a), hard disk (c) or CD-ROM (d) -#boot=[a|c|d] +# default: hard disk, cd-rom, floppy +#boot="cda" + #----------------------------------------------------------------------------- # write to temporary files instead of disk image files #snapshot=1 diff -r 45a84091144e -r fc3e7e65b953 tools/examples/xmexample.vti --- a/tools/examples/xmexample.vti Sun Aug 20 17:55:33 2006 +0100 +++ b/tools/examples/xmexample.vti Sun Aug 20 23:33:28 2006 +0100 @@ -75,7 +75,9 @@ memmap = '/usr/lib/xen/boot/mem-map.sxp' #----------------------------------------------------------------------------- # boot on floppy (a), hard disk (c) or CD-ROM (d) -#boot=[a|c|d] +# default: hard disk, cd-rom, floppy +#boot="cda" + #----------------------------------------------------------------------------- # write to temporary files instead of disk image files #snapshot=1 diff -r 45a84091144e -r fc3e7e65b953 tools/ioemu/hw/pc.c --- a/tools/ioemu/hw/pc.c Sun Aug 20 17:55:33 2006 +0100 +++ b/tools/ioemu/hw/pc.c Sun Aug 20 23:33:28 2006 +0100 @@ -158,8 +158,23 @@ static void cmos_init_hd(int type_ofs, i rtc_set_memory(s, info_ofs + 8, sectors); } +static int get_bios_disk(char *boot_device, int index) { + + if (index < strlen(boot_device)) { + switch (boot_device[index]) { + case 'a': + return 0x01; /* floppy */ + case 'c': + return 0x02; /* hard drive */ + case 'd': + return 0x03; /* cdrom */ + } + } + return 0x00; /* no device */ +} + /* 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, char *boot_device, BlockDriverState **hd_table, time_t timeoffset) { RTCState *s = rtc_state; int val; @@ -205,21 +220,14 @@ static void cmos_init(uint64_t ram_size, 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 == NULL) { + /* default to hd, then cd, then floppy. */ + boot_device = "cda"; + } + rtc_set_memory(s, 0x3d, get_bios_disk(boot_device, 0) | + (get_bios_disk(boot_device, 1) << 4)); + rtc_set_memory(s, 0x38, (get_bios_disk(boot_device, 2) << 4) | + (!fd_bootchk ? 0x01 : 0x00)); /* floppy type */ @@ -617,7 +625,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, char *boot_device, DisplayState *ds, const char **fd_filename, int snapshot, const char *kernel_filename, const char *kernel_cmdline, const char *initrd_filename, time_t timeoffset, @@ -919,7 +927,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, char *boot_device, DisplayState *ds, const char **fd_filename, int snapshot, const char *kernel_filename, @@ -933,7 +941,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, char *boot_device, DisplayState *ds, const char **fd_filename, int snapshot, const char *kernel_filename, diff -r 45a84091144e -r fc3e7e65b953 tools/ioemu/vl.c --- a/tools/ioemu/vl.c Sun Aug 20 17:55:33 2006 +0100 +++ b/tools/ioemu/vl.c Sun Aug 20 23:33:28 2006 +0100 @@ -124,7 +124,7 @@ int vncunused; int vncunused; const char* keyboard_layout = NULL; int64_t ticks_per_sec; -int boot_device = 'c'; +char *boot_device = NULL; uint64_t ram_size; int pit_min_timer_count = 0; int nb_nics; @@ -6057,14 +6057,14 @@ int main(int argc, char **argv) break; #endif /* !CONFIG_DM */ case QEMU_OPTION_boot: - boot_device = optarg[0]; - if (boot_device != 'a' && + boot_device = strdup(optarg); + if (strspn(boot_device, "acd" #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); + "n" +#endif + ) != strlen(boot_device)) { + fprintf(stderr, "qemu: invalid boot device in '%s'\n", + boot_device); exit(1); } break; @@ -6328,6 +6328,7 @@ int main(int argc, char **argv) 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') @@ -6335,6 +6336,7 @@ int main(int argc, char **argv) else boot_device = 'd'; } +#endif #endif /* !CONFIG_DM */ setvbuf(stdout, NULL, _IOLBF, 0); @@ -6593,6 +6595,7 @@ int main(int argc, char **argv) ds, fd_filename, snapshot, kernel_filename, kernel_cmdline, initrd_filename, timeoffset); + free(boot_device); /* init USB devices */ if (usb_enabled) { diff -r 45a84091144e -r fc3e7e65b953 tools/ioemu/vl.h --- a/tools/ioemu/vl.h Sun Aug 20 17:55:33 2006 +0100 +++ b/tools/ioemu/vl.h Sun Aug 20 23:33:28 2006 +0100 @@ -575,7 +575,7 @@ int qcow_compress_cluster(BlockDriverSta #ifndef QEMU_TOOL typedef void QEMUMachineInitFunc(uint64_t ram_size, int vga_ram_size, - int boot_device, + char *boot_device, DisplayState *ds, const char **fd_filename, int snapshot, const char *kernel_filename, const char *kernel_cmdline, const char *initrd_filename, time_t timeoffset); @@ -1020,7 +1020,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, char *boot_device, uint32_t kernel_image, uint32_t kernel_size, const char *cmdline, uint32_t initrd_image, uint32_t initrd_size, _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |