WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-devel

Re: [Xen-devel] [PATCH] [QEMU] Allow trying to boot from more than one d

To: Jeremy Katz <katzj@xxxxxxxxxx>
Subject: Re: [Xen-devel] [PATCH] [QEMU] Allow trying to boot from more than one device
From: "Philip R. Auld" <pauld@xxxxxxxxxxx>
Date: Mon, 14 Aug 2006 16:29:52 -0400
Cc: xen-devel <xen-devel@xxxxxxxxxxxxxxxxxxx>
Delivery-date: Mon, 14 Aug 2006 13:31:24 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxx
In-reply-to: <1155583592.22107.34.camel@xxxxxxxxxxxxxx>
List-help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-id: Xen developer discussion <xen-devel.lists.xensource.com>
List-post: <mailto:xen-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
References: <1155154186.22203.15.camel@xxxxxxxxxxxxxx> <1155583592.22107.34.camel@xxxxxxxxxxxxxx>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
User-agent: Mutt/1.5.9i
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