Skip to contentSkip to conversation

Port codes from qemu-kvm to support booting from SCSI disk image

PATCH Superseded Haishan Bai 2 participants 4 messages Aug 17, 2010 – Aug 18, 2010 Kbuild

v2 of 3 Superseded Latest is v3 →

lore
Share & tools
lore
#0 lore raw

PATCH v2 1/1 Port codes from qemu-kvm to support booting from SCSI disk image

There is code indentation errors in my previous post, I am sorry for that, please review this post.

The qemu-kvm could boot from SCSI disk image by utilizing seabios, this patch ported codes from qemu-kvm to let upstream qemu to support booting from SCSI disk image.

Add 'boot=on' option to qemu command line like following, qemu-system-x86_64 -drive file=scsi-disk.img,if=scsi,boot=on

---
 Makefile.target |    1 +
 blockdev.c      |   13 ++++++
 blockdev.h      |    2 +
 hw/extboot.c    |  123 
+++++++++++++++++++++++++++++++++++++++++++++++++++++++
 hw/pc.c         |   17 ++++++++
 hw/pc.h         |    4 ++
 qemu-config.c   |    4 ++
 7 files changed, 164 insertions(+), 0 deletions(-)
 create mode 100644 hw/extboot.c
Makefile.target +1 -0
index c8281e9..abba79c 100644
@@ -199,6 +199,7 @@ obj-i386-y += mc146818rtc.o i8259.o pc.o
 obj-i386-y += cirrus_vga.o apic.o ioapic.o piix_pci.o
 obj-i386-y += vmmouse.o vmport.o hpet.o applesmc.o
 obj-i386-y += device-hotplug.o pci-hotplug.o smbios.o wdt_ib700.o
+obj-i386-y += extboot.o
 obj-i386-y += debugcon.o multiboot.o
 obj-i386-y += pc_piix.o
 
blockdev.c +2 -0
index 01e402b..78c286c 100644
@@ -15,6 +15,8 @@
 #include "qemu-config.h"
 #include "sysemu.h"
 
+DriveInfo *extboot_drive = NULL;
+
 static QTAILQ_HEAD(drivelist, DriveInfo) drives = 

QTAILQ_HEAD_INITIALIZER(drives);

/*
@@ -150,6 +152,7 @@ DriveInfo *drive_init(QemuOpts *opts, int default_to_scsi, int *fatal_error)

     int on_read_error, on_write_error;
     const char *devaddr;
     DriveInfo *dinfo;
+    int is_extboot = 0;
     int snapshot = 0;
     int ret;

@@ -311,6 +314,12 @@ DriveInfo *drive_init(QemuOpts *opts, int default_to_scsi, int *fatal_error)

         }
     }

+ is_extboot = qemu_opt_get_bool(opts, "boot", 0);
+ if (is_extboot && extboot_drive) {
+ fprintf(stderr, "qemu: two bootable drives specified\n");
+ return NULL;
+ }
+

     on_write_error = BLOCK_ERR_STOP_ENOSPC;
     if ((buf = qemu_opt_get(opts, "werror")) != NULL) {
         if (type != IF_IDE && type != IF_SCSI && type != IF_VIRTIO && 
type != IF_NONE) {
@@ -421,6 +430,10 @@ DriveInfo *drive_init(QemuOpts *opts, int default_to_scsi, int *fatal_error)
         strncpy(dinfo->serial, serial, sizeof(dinfo->serial) - 1);
     QTAILQ_INSERT_TAIL(&drives, dinfo, next);

+ if (is_extboot) {
+ extboot_drive = dinfo;
+ }
+

     bdrv_set_on_error(dinfo->bdrv, on_read_error, on_write_error);

     switch(type) {
blockdev.h +2 -0
index 37f3a01..e707b87 100644
@@ -59,4 +59,6 @@ int do_block_set_passwd(Monitor *mon, const QDict *qdict, QObject **ret_data);
 int do_change_block(Monitor *mon, const char *device,
                     const char *filename, const char *fmt);
 
+extern DriveInfo *extboot_drive;
+
 #endif
hw/extboot.c new file +123 -0

123 lines not on this page · raw message

hw/pc.c +1 -0
index 58dea57..88f43aa 100644
@@ -54,6 +54,7 @@
 #endif
 
 #define BIOS_FILENAME "bios.bin"
+#define EXTBOOT_FILENAME "extboot.bin"
 
 #define PC_MAX_BIOS_SIZE (4 * 1024 * 1024)
 
@@ -953,6 +954,10 @@ void pc_memory_init(ram_addr_t ram_size,
                                  isa_bios_size,
                                  (bios_offset + bios_size - 

isa_bios_size) | IO_MEM_ROM);

+ if (extboot_drive) {
+ option_rom[nb_option_roms++] = qemu_strdup(EXTBOOT_FILENAME);
+ }
+

     option_rom_offset = qemu_ram_alloc(NULL, "pc.rom", PC_ROM_SIZE);
     cpu_register_physical_memory(PC_ROM_MIN_VGA, PC_ROM_SIZE, 

option_rom_offset);

@@ -1074,4 +1079,16 @@ void pc_pci_device_init(PCIBus *pci_bus)

     for (bus = 0; bus <= max_bus; bus++) {
         pci_create_simple(pci_bus, -1, "lsi53c895a");
     }

+
+ if (extboot_drive) {
+ DriveInfo *info = extboot_drive;
+ int cyls, heads, secs;
+
+ if (info->type != IF_IDE && info->type != IF_VIRTIO) {
+ bdrv_guess_geometry(info->bdrv, &cyls, &heads, &secs);
+ bdrv_set_geometry_hint(info->bdrv, cyls, heads, secs);
+ }
+
+ extboot_init(info->bdrv);
+ }
}

hw/pc.h +4 -0
index 63b0249..61882db 100644
@@ -167,6 +167,10 @@ void isa_cirrus_vga_init(void);
 
 void isa_ne2000_init(int base, int irq, NICInfo *nd);
 
+/* extboot.c */
+
+void extboot_init(BlockDriverState *bs);
+
 /* e820 types */
 #define E820_RAM        1
 #define E820_RESERVED   2
qemu-config.c +4 -0
index 95abe61..08ee553 100644
@@ -79,6 +79,10 @@ QemuOptsList qemu_drive_opts = {
         },{
             .name = "readonly",
             .type = QEMU_OPT_BOOL,
+        },{
+            .name = "boot",
+            .type = QEMU_OPT_BOOL,
+            .help = "make this a boot drive",
         },
         { /* end if list */ }
     },
Signature · 1 line
1.7.0.4
#1 lore raw
Quoted 11 lines · Haishan Bai

There is code indentation errors in my previous post, I am sorry for that, please review this post.

The qemu-kvm could boot from SCSI disk image by utilizing seabios, this patch ported codes
from qemu-kvm to let upstream qemu to support booting from SCSI disk image.

Add 'boot=on' option to qemu command line like following, qemu-system-x86_64 -drive file=scsi-disk.img,if=scsi,boot=on

This horrible hack should die instead of been ported. It introduce more problems that it solves. You want to boot from scsi disk? Add seabios support for it.

--
Gleb.

author
#2 lore raw
Quoted 9 lines · Gleb Natapov
Quoted 7 lines · Haishan Bai

There is code indentation errors in my previous post, I am sorry for that, please review this post.

The qemu-kvm could boot from SCSI disk image by utilizing seabios, this patch ported codes
from qemu-kvm to let upstream qemu to support booting from SCSI disk image.

Quoted 10 lines
Quoted 5 lines

Add 'boot=on' option to qemu command line like following, qemu-system-x86_64 -drive file=scsi-disk.img,if=scsi,boot=on

This horrible hack should die instead of been ported. It introduce more problems that it solves. You want to boot from scsi disk? Add seabios support for it.

Yes, I added seabios support, but still can not boot from scsi disk, because seabios seemed to depend on extboot.bin, I will investigate seabios SCSI further and try it.

Thanks
Shan Hai

Quoted 3 lines

--
Gleb.

#3 lore raw
Quoted 18 lines · haishan
Quoted 8 lines · Gleb Natapov
Quoted 7 lines · Haishan Bai

There is code indentation errors in my previous post, I am sorry for that, please review this post.

The qemu-kvm could boot from SCSI disk image by utilizing seabios, this patch ported codes
from qemu-kvm to let upstream qemu to support booting from SCSI disk image.

Quoted 8 lines
Quoted 4 lines

Add 'boot=on' option to qemu command line like following, qemu-system-x86_64 -drive file=scsi-disk.img,if=scsi,boot=on

This horrible hack should die instead of been ported. It introduce more problems that it solves. You want to boot from scsi disk? Add seabios support for it.

Quoted 5 lines

Yes, I added seabios support, but still can not boot from scsi disk, because seabios seemed
to depend on extboot.bin, I will investigate seabios SCSI further and try it.

Seabios has nothing to do with extboot.bin. Where is your patch to seabios?

--
Gleb.