[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


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.