From 92ed83b0e8f51b1e39de70eee74cbf25eeaf06bd5fa45561e0b70f7aba2f4dc0 Mon Sep 17 00:00:00 2001 From: Charles Arnold Date: Wed, 13 Apr 2016 19:43:10 +0000 Subject: [PATCH] - Add patches from proposed upstream series to load BIOS's from the toolstack instead of embedding in hvmloader http://lists.xenproject.org/archives/html/xen-devel/2016-03/msg01626.html 0001-libxc-Rework-extra-module-initialisation.patch, 0002-libxc-Prepare-a-start-info-structure-for-hvmloader.patch, 0003-configure-define-SEABIOS_PATH-and-OVMF_PATH.patch, 0004-firmware-makefile-install-BIOS-blob.patch, 0005-libxl-Load-guest-BIOS-from-file.patch, 0006-xen-Move-the-hvm_start_info-C-representation-from-li.patch, 0007-hvmloader-Grab-the-hvm_start_info-pointer.patch, 0008-hvmloader-Locate-the-BIOS-blob.patch, 0009-hvmloader-Check-modules-whereabouts-in-perform_tests.patch, 0010-hvmloader-Load-SeaBIOS-from-hvm_start_info-modules.patch, 0011-hvmloader-Load-OVMF-from-modules.patch, 0012-hvmloader-Specific-bios_load-function-required.patch, 0013-hvmloader-Always-build-in-SeaBIOS-and-OVMF-loader.patch, 0014-configure-do-not-depend-on-SEABIOS_PATH-or-OVMF_PATH.patch - Enable support for UEFI on x86_64 using the ovmf-x86_64-ms.bin firmware from qemu-ovmf-x86_64. The firmware is preloaded with Microsoft keys to more closely resemble firmware on real hardware FATE#320490 OBS-URL: https://build.opensuse.org/package/show/Virtualization/xen?expand=0&rev=416 --- ...c-Rework-extra-module-initialisation.patch | 185 +++++++++++++ ...a-start-info-structure-for-hvmloader.patch | 261 ++++++++++++++++++ ...re-define-SEABIOS_PATH-and-OVMF_PATH.patch | 38 +++ ...-firmware-makefile-install-BIOS-blob.patch | 43 +++ 0005-libxl-Load-guest-BIOS-from-file.patch | 212 ++++++++++++++ ..._start_info-C-representation-from-li.patch | 99 +++++++ ...ader-Grab-the-hvm_start_info-pointer.patch | 55 ++++ 0008-hvmloader-Locate-the-BIOS-blob.patch | 139 ++++++++++ ...modules-whereabouts-in-perform_tests.patch | 44 +++ ...-SeaBIOS-from-hvm_start_info-modules.patch | 112 ++++++++ 0011-hvmloader-Load-OVMF-from-modules.patch | 131 +++++++++ ...Specific-bios_load-function-required.patch | 51 ++++ ...ays-build-in-SeaBIOS-and-OVMF-loader.patch | 65 +++++ ...-depend-on-SEABIOS_PATH-or-OVMF_PATH.patch | 84 ++++++ ...PSR_MODE_ELxx-to-match-linux-headers.patch | 2 +- ipxe.tar.bz2 | 4 +- ...-disable-disk-cache-flushes-in-qdisk.patch | 12 +- libxl.pvscsi.patch | 56 ++-- magic_ioport_compat.patch | 8 +- qemu-xen-traditional-dir-remote.tar.bz2 | 4 +- stdvga-cache.patch | 8 +- stubdom.tar.bz2 | 4 +- x86-cpufreq-report.patch | 14 +- x86-ioapic-ack-default.patch | 8 +- xen-4.7.0-testing-src.tar.bz2 | 4 +- xen.changes | 25 ++ xen.libxl.dmmd.patch | 52 ++-- xen.spec | 50 +++- xen.stubdom.newlib.patch | 14 +- xen_pvonhvm.xen_emul_unplug.patch | 10 +- 30 files changed, 1684 insertions(+), 110 deletions(-) create mode 100644 0001-libxc-Rework-extra-module-initialisation.patch create mode 100644 0002-libxc-Prepare-a-start-info-structure-for-hvmloader.patch create mode 100644 0003-configure-define-SEABIOS_PATH-and-OVMF_PATH.patch create mode 100644 0004-firmware-makefile-install-BIOS-blob.patch create mode 100644 0005-libxl-Load-guest-BIOS-from-file.patch create mode 100644 0006-xen-Move-the-hvm_start_info-C-representation-from-li.patch create mode 100644 0007-hvmloader-Grab-the-hvm_start_info-pointer.patch create mode 100644 0008-hvmloader-Locate-the-BIOS-blob.patch create mode 100644 0009-hvmloader-Check-modules-whereabouts-in-perform_tests.patch create mode 100644 0010-hvmloader-Load-SeaBIOS-from-hvm_start_info-modules.patch create mode 100644 0011-hvmloader-Load-OVMF-from-modules.patch create mode 100644 0012-hvmloader-Specific-bios_load-function-required.patch create mode 100644 0013-hvmloader-Always-build-in-SeaBIOS-and-OVMF-loader.patch create mode 100644 0014-configure-do-not-depend-on-SEABIOS_PATH-or-OVMF_PATH.patch diff --git a/0001-libxc-Rework-extra-module-initialisation.patch b/0001-libxc-Rework-extra-module-initialisation.patch new file mode 100644 index 0000000..7c84b79 --- /dev/null +++ b/0001-libxc-Rework-extra-module-initialisation.patch @@ -0,0 +1,185 @@ +From 270b8e85b5379fe93192f36966384ff07400fe7b Mon Sep 17 00:00:00 2001 +From: Anthony PERARD +Date: Mon, 14 Mar 2016 17:55:36 +0000 +Subject: [PATCH 01/15] libxc: Rework extra module initialisation + +This patch use xc_dom_alloc_segment() to allocate the memory space for the +ACPI modules and the SMBIOS modules. This is to replace the arbitrary +placement of 1MB after the hvmloader image. + +In later patches, while trying to load a firmware such as OVMF, the later +could easily be loaded past the address 4MB (OVMF is a 2MB binary), but +hvmloader use a range of memory from 4MB to 8MB to perform tests and in the +process, clear the memory, before loading the modules. + +Signed-off-by: Anthony PERARD +--- + tools/libxc/xc_dom_hvmloader.c | 131 ++++++++++++----------------------------- + 1 file changed, 38 insertions(+), 93 deletions(-) + +Index: xen-4.7.0-testing/tools/libxc/xc_dom_hvmloader.c +=================================================================== +--- xen-4.7.0-testing.orig/tools/libxc/xc_dom_hvmloader.c ++++ xen-4.7.0-testing/tools/libxc/xc_dom_hvmloader.c +@@ -129,98 +129,52 @@ static elf_errorstatus xc_dom_parse_hvm_ + return rc; + } + +-static int modules_init(struct xc_dom_image *dom, +- uint64_t vend, struct elf_binary *elf, +- uint64_t *mstart_out, uint64_t *mend_out) ++static int module_init_one(struct xc_dom_image *dom, ++ struct xc_hvm_firmware_module *module, ++ char *name) + { +-#define MODULE_ALIGN 1UL << 7 +-#define MB_ALIGN 1UL << 20 +-#define MKALIGN(x, a) (((uint64_t)(x) + (a) - 1) & ~(uint64_t)((a) - 1)) +- uint64_t total_len = 0, offset1 = 0; +- +- if ( dom->acpi_module.length == 0 && dom->smbios_module.length == 0 ) +- return 0; +- +- /* Find the total length for the firmware modules with a reasonable large +- * alignment size to align each the modules. +- */ +- total_len = MKALIGN(dom->acpi_module.length, MODULE_ALIGN); +- offset1 = total_len; +- total_len += MKALIGN(dom->smbios_module.length, MODULE_ALIGN); +- +- /* Want to place the modules 1Mb+change behind the loader image. */ +- *mstart_out = MKALIGN(elf->pend, MB_ALIGN) + (MB_ALIGN); +- *mend_out = *mstart_out + total_len; +- +- if ( *mend_out > vend ) +- return -1; +- +- if ( dom->acpi_module.length != 0 ) +- dom->acpi_module.guest_addr_out = *mstart_out; +- if ( dom->smbios_module.length != 0 ) +- dom->smbios_module.guest_addr_out = *mstart_out + offset1; ++ struct xc_dom_seg seg; ++ void *dest; ++ ++ if ( module->length ) ++ { ++ if ( xc_dom_alloc_segment(dom, &seg, name, 0, module->length) ) ++ goto err; ++ dest = xc_dom_seg_to_ptr(dom, &seg); ++ if ( dest == NULL ) ++ { ++ DOMPRINTF("%s: xc_dom_seg_to_ptr(dom, &seg) => NULL", ++ __FUNCTION__); ++ goto err; ++ } ++ memcpy(dest, module->data, module->length); ++ module->guest_addr_out = seg.vstart; ++ if ( module->guest_addr_out > UINT32_MAX || ++ module->guest_addr_out + module->length > UINT32_MAX ) ++ { ++ DOMPRINTF("%s: Module %s would be loaded abrove 4GB", ++ __FUNCTION__, name); ++ goto err; ++ } ++ } + + return 0; ++err: ++ return -1; + } + +-static int loadmodules(struct xc_dom_image *dom, +- uint64_t mstart, uint64_t mend, +- uint32_t domid) ++static int modules_init(struct xc_dom_image *dom) + { +- privcmd_mmap_entry_t *entries = NULL; +- unsigned long pfn_start; +- unsigned long pfn_end; +- size_t pages; +- uint32_t i; +- uint8_t *dest; +- int rc = -1; +- xc_interface *xch = dom->xch; +- +- if ( mstart == 0 || mend == 0 ) +- return 0; +- +- pfn_start = (unsigned long)(mstart >> PAGE_SHIFT); +- pfn_end = (unsigned long)((mend + PAGE_SIZE - 1) >> PAGE_SHIFT); +- pages = pfn_end - pfn_start; ++ int rc; + +- /* Map address space for module list. */ +- entries = calloc(pages, sizeof(privcmd_mmap_entry_t)); +- if ( entries == NULL ) +- goto error_out; ++ rc = module_init_one(dom, &dom->acpi_module, "acpi module"); ++ if ( rc ) goto err; ++ rc = module_init_one(dom, &dom->smbios_module, "smbios module"); ++ if ( rc ) goto err; + +- for ( i = 0; i < pages; i++ ) +- entries[i].mfn = (mstart >> PAGE_SHIFT) + i; +- +- dest = xc_map_foreign_ranges( +- xch, domid, pages << PAGE_SHIFT, PROT_READ | PROT_WRITE, 1 << PAGE_SHIFT, +- entries, pages); +- if ( dest == NULL ) +- goto error_out; +- +- /* Zero the range so padding is clear between modules */ +- memset(dest, 0, pages << PAGE_SHIFT); +- +- /* Load modules into range */ +- if ( dom->acpi_module.length != 0 ) +- { +- memcpy(dest, +- dom->acpi_module.data, +- dom->acpi_module.length); +- } +- if ( dom->smbios_module.length != 0 ) +- { +- memcpy(dest + (dom->smbios_module.guest_addr_out - mstart), +- dom->smbios_module.data, +- dom->smbios_module.length); +- } +- +- munmap(dest, pages << PAGE_SHIFT); +- rc = 0; +- +- error_out: +- free(entries); +- +- return rc; ++ return 0; ++err: ++ return -1; + } + + static elf_errorstatus xc_dom_load_hvm_kernel(struct xc_dom_image *dom) +@@ -229,7 +183,6 @@ static elf_errorstatus xc_dom_load_hvm_k + privcmd_mmap_entry_t *entries = NULL; + size_t pages = (elf->pend - elf->pstart + PAGE_SIZE - 1) >> PAGE_SHIFT; + elf_errorstatus rc; +- uint64_t m_start = 0, m_end = 0; + int i; + + /* Map address space for initial elf image. */ +@@ -262,15 +215,7 @@ static elf_errorstatus xc_dom_load_hvm_k + + munmap(elf->dest_base, elf->dest_size); + +- rc = modules_init(dom, dom->total_pages << PAGE_SHIFT, elf, &m_start, +- &m_end); +- if ( rc != 0 ) +- { +- DOMPRINTF("%s: insufficient space to load modules.", __func__); +- goto error; +- } +- +- rc = loadmodules(dom, m_start, m_end, dom->guest_domid); ++ rc = modules_init(dom); + if ( rc != 0 ) + { + DOMPRINTF("%s: unable to load modules.", __func__); diff --git a/0002-libxc-Prepare-a-start-info-structure-for-hvmloader.patch b/0002-libxc-Prepare-a-start-info-structure-for-hvmloader.patch new file mode 100644 index 0000000..351a129 --- /dev/null +++ b/0002-libxc-Prepare-a-start-info-structure-for-hvmloader.patch @@ -0,0 +1,261 @@ +From 34cd9218de8579722240d1acdcaae4e4278f667e Mon Sep 17 00:00:00 2001 +From: Anthony PERARD +Date: Mon, 14 Mar 2016 17:55:37 +0000 +Subject: [PATCH 02/15] libxc: Prepare a start info structure for hvmloader + +... and load BIOS into guest memory. + +This adds a new firmware module, bios_module. It is +loaded in the guest memory and final location is provided to hvmloader +via the hvm_start_info struct. + +This patch create the hvm_start_info struct for HVM guest that have a +device model, so this is now common code with HVM guest without device +model. + +Signed-off-by: Anthony PERARD +--- + tools/libxc/include/xc_dom.h | 3 + + tools/libxc/xc_dom_hvmloader.c | 2 + + tools/libxc/xc_dom_x86.c | 132 ++++++++++++++++++++++++++++------------- + xen/include/public/xen.h | 2 +- + 4 files changed, 96 insertions(+), 43 deletions(-) + +Index: xen-4.7.0-testing/tools/libxc/include/xc_dom.h +=================================================================== +--- xen-4.7.0-testing.orig/tools/libxc/include/xc_dom.h ++++ xen-4.7.0-testing/tools/libxc/include/xc_dom.h +@@ -209,6 +209,9 @@ struct xc_dom_image { + /* If unset disables the setup of the IOREQ pages. */ + bool device_model; + ++ /* BIOS passed to HVMLOADER */ ++ struct xc_hvm_firmware_module bios_module; ++ + /* Extra ACPI tables passed to HVMLOADER */ + struct xc_hvm_firmware_module acpi_module; + +Index: xen-4.7.0-testing/tools/libxc/xc_dom_hvmloader.c +=================================================================== +--- xen-4.7.0-testing.orig/tools/libxc/xc_dom_hvmloader.c ++++ xen-4.7.0-testing/tools/libxc/xc_dom_hvmloader.c +@@ -167,6 +167,8 @@ static int modules_init(struct xc_dom_im + { + int rc; + ++ rc = module_init_one(dom, &dom->bios_module, "bios module"); ++ if ( rc ) goto err; + rc = module_init_one(dom, &dom->acpi_module, "acpi module"); + if ( rc ) goto err; + rc = module_init_one(dom, &dom->smbios_module, "smbios module"); +Index: xen-4.7.0-testing/tools/libxc/xc_dom_x86.c +=================================================================== +--- xen-4.7.0-testing.orig/tools/libxc/xc_dom_x86.c ++++ xen-4.7.0-testing/tools/libxc/xc_dom_x86.c +@@ -69,6 +69,9 @@ + #define round_up(addr, mask) ((addr) | (mask)) + #define round_pg_up(addr) (((addr) + PAGE_SIZE_X86 - 1) & ~(PAGE_SIZE_X86 - 1)) + ++#define HVMLOADER_MODULE_MAX_COUNT 1 ++#define HVMLOADER_MODULE_NAME_SIZE 10 ++ + struct xc_dom_params { + unsigned levels; + xen_vaddr_t vaddr_mask; +@@ -590,6 +593,7 @@ static int alloc_magic_pages_hvm(struct + xen_pfn_t special_array[X86_HVM_NR_SPECIAL_PAGES]; + xen_pfn_t ioreq_server_array[NR_IOREQ_SERVER_PAGES]; + xc_interface *xch = dom->xch; ++ size_t start_info_size = sizeof(struct hvm_start_info); + + /* Allocate and clear special pages. */ + for ( i = 0; i < X86_HVM_NR_SPECIAL_PAGES; i++ ) +@@ -624,8 +628,6 @@ static int alloc_magic_pages_hvm(struct + + if ( !dom->device_model ) + { +- size_t start_info_size = sizeof(struct hvm_start_info); +- + if ( dom->cmdline ) + { + dom->cmdline_size = ROUNDUP(strlen(dom->cmdline) + 1, 8); +@@ -635,17 +637,26 @@ static int alloc_magic_pages_hvm(struct + /* Limited to one module. */ + if ( dom->ramdisk_blob ) + start_info_size += sizeof(struct hvm_modlist_entry); +- +- rc = xc_dom_alloc_segment(dom, &dom->start_info_seg, +- "HVMlite start info", 0, start_info_size); +- if ( rc != 0 ) +- { +- DOMPRINTF("Unable to reserve memory for the start info"); +- goto out; +- } + } + else + { ++ start_info_size += ++ sizeof(struct hvm_modlist_entry) * HVMLOADER_MODULE_MAX_COUNT; ++ /* Add extra space to write modules name */ ++ start_info_size += ++ HVMLOADER_MODULE_NAME_SIZE * HVMLOADER_MODULE_MAX_COUNT; ++ } ++ ++ rc = xc_dom_alloc_segment(dom, &dom->start_info_seg, ++ "HVMlite start info", 0, start_info_size); ++ if ( rc != 0 ) ++ { ++ DOMPRINTF("Unable to reserve memory for the start info"); ++ goto out; ++ } ++ ++ if ( dom->device_model ) ++ { + /* + * Allocate and clear additional ioreq server pages. The default + * server will use the IOREQ and BUFIOREQ special pages above. +@@ -1689,39 +1700,68 @@ static int alloc_pgtables_hvm(struct xc_ + return 0; + } + ++static void add_module_to_list(struct xc_dom_image *dom, ++ struct xc_hvm_firmware_module *module, ++ const char *name, ++ struct hvm_modlist_entry *modlist, ++ struct hvm_start_info *start_info) ++{ ++ uint32_t index = start_info->nr_modules; ++ if ( module->length == 0 ) ++ return; ++ ++ assert(start_info->nr_modules < HVMLOADER_MODULE_MAX_COUNT); ++ assert(strnlen(name, HVMLOADER_MODULE_NAME_SIZE) ++ < HVMLOADER_MODULE_NAME_SIZE); ++ ++ modlist[index].paddr = module->guest_addr_out; ++ modlist[index].size = module->length; ++ strncpy((char*)(modlist + HVMLOADER_MODULE_MAX_COUNT) ++ + HVMLOADER_MODULE_NAME_SIZE * index, ++ name, HVMLOADER_MODULE_NAME_SIZE); ++ modlist[index].cmdline_paddr = ++ (dom->start_info_seg.pfn << PAGE_SHIFT) + ++ ((uintptr_t)modlist - (uintptr_t)start_info) + ++ sizeof(struct hvm_modlist_entry) * HVMLOADER_MODULE_MAX_COUNT + ++ HVMLOADER_MODULE_NAME_SIZE * index; ++ ++ start_info->nr_modules++; ++} ++ + static int bootlate_hvm(struct xc_dom_image *dom) + { + uint32_t domid = dom->guest_domid; + xc_interface *xch = dom->xch; ++ struct hvm_start_info *start_info; ++ size_t start_info_size; ++ void *start_page; ++ struct hvm_modlist_entry *modlist; + +- if ( !dom->device_model ) +- { +- struct hvm_start_info *start_info; +- size_t start_info_size; +- void *start_page; +- +- start_info_size = sizeof(*start_info) + dom->cmdline_size; +- if ( dom->ramdisk_blob ) +- start_info_size += sizeof(struct hvm_modlist_entry); ++ start_info_size = sizeof(*start_info) + dom->cmdline_size; ++ if ( dom->ramdisk_blob ) ++ start_info_size += sizeof(struct hvm_modlist_entry); + +- if ( start_info_size > +- dom->start_info_seg.pages << XC_DOM_PAGE_SHIFT(dom) ) +- { +- DOMPRINTF("Trying to map beyond start_info_seg"); +- return -1; +- } ++ if ( start_info_size > ++ dom->start_info_seg.pages << XC_DOM_PAGE_SHIFT(dom) ) ++ { ++ DOMPRINTF("Trying to map beyond start_info_seg"); ++ return -1; ++ } + +- start_page = xc_map_foreign_range(xch, domid, start_info_size, +- PROT_READ | PROT_WRITE, +- dom->start_info_seg.pfn); +- if ( start_page == NULL ) +- { +- DOMPRINTF("Unable to map HVM start info page"); +- return -1; +- } ++ start_page = xc_map_foreign_range(xch, domid, start_info_size, ++ PROT_READ | PROT_WRITE, ++ dom->start_info_seg.pfn); ++ if ( start_page == NULL ) ++ { ++ DOMPRINTF("Unable to map HVM start info page"); ++ return -1; ++ } + +- start_info = start_page; ++ start_info = start_page; ++ modlist = start_page + sizeof(*start_info) + dom->cmdline_size; + ++ if ( !dom->device_model ) ++ { + if ( dom->cmdline ) + { + char *cmdline = start_page + sizeof(*start_info); +@@ -1733,22 +1773,30 @@ static int bootlate_hvm(struct xc_dom_im + + if ( dom->ramdisk_blob ) + { +- struct hvm_modlist_entry *modlist = +- start_page + sizeof(*start_info) + dom->cmdline_size; + + modlist[0].paddr = dom->ramdisk_seg.vstart - dom->parms.virt_base; + modlist[0].size = dom->ramdisk_seg.vend - dom->ramdisk_seg.vstart; +- start_info->modlist_paddr = (dom->start_info_seg.pfn << PAGE_SHIFT) + +- ((uintptr_t)modlist - (uintptr_t)start_info); + start_info->nr_modules = 1; + } +- +- start_info->magic = XEN_HVM_START_MAGIC_VALUE; +- +- munmap(start_page, start_info_size); + } + else + { ++ add_module_to_list(dom, &dom->bios_module, "bios", ++ modlist, start_info); ++ } ++ ++ if ( start_info->nr_modules ) ++ { ++ start_info->modlist_paddr = (dom->start_info_seg.pfn << PAGE_SHIFT) + ++ ((uintptr_t)modlist - (uintptr_t)start_info); ++ } ++ ++ start_info->magic = XEN_HVM_START_MAGIC_VALUE; ++ ++ munmap(start_page, start_info_size); ++ ++ if ( dom->device_model ) ++ { + void *hvm_info_page; + + if ( (hvm_info_page = xc_map_foreign_range( +Index: xen-4.7.0-testing/xen/include/public/xen.h +=================================================================== +--- xen-4.7.0-testing.orig/xen/include/public/xen.h ++++ xen-4.7.0-testing/xen/include/public/xen.h +@@ -815,7 +815,7 @@ struct start_info { + typedef struct start_info start_info_t; + + /* +- * Start of day structure passed to PVH guests in %ebx. ++ * Start of day structure passed to PVH guests and to HVM guests in %ebx. + * + * NOTE: nothing will be loaded at physical address 0, so a 0 value in any + * of the address fields should be treated as not present. diff --git a/0003-configure-define-SEABIOS_PATH-and-OVMF_PATH.patch b/0003-configure-define-SEABIOS_PATH-and-OVMF_PATH.patch new file mode 100644 index 0000000..4eb2c61 --- /dev/null +++ b/0003-configure-define-SEABIOS_PATH-and-OVMF_PATH.patch @@ -0,0 +1,38 @@ +From d12d422d347ca3a8fd8181b78ee2736561cd0e57 Mon Sep 17 00:00:00 2001 +From: Anthony PERARD +Date: Mon, 14 Mar 2016 17:55:38 +0000 +Subject: [PATCH 03/15] configure: #define SEABIOS_PATH and OVMF_PATH + +Those paths are to be used by libxl, in order to load the firmware in +memory. If a system path is not define via --with-system-seabios or +--with-system-ovmf, then this default to the Xen firmware directory. + +Signed-off-by: Anthony PERARD +--- + tools/configure.ac | 6 ++++++ + 1 file changed, 6 insertions(+) + +Index: xen-4.7.0-testing/tools/configure.ac +=================================================================== +--- xen-4.7.0-testing.orig/tools/configure.ac ++++ xen-4.7.0-testing/tools/configure.ac +@@ -218,6 +218,9 @@ AC_ARG_WITH([system-seabios], + esac + ],[]) + AC_SUBST(seabios_path) ++AC_DEFINE_UNQUOTED([SEABIOS_PATH], ++ ["${seabios_path:-$XENFIRMWAREDIR/seabios.bin}"], ++ [SeaBIOS path]) + + AC_ARG_WITH([system-ovmf], + AS_HELP_STRING([--with-system-ovmf@<:@=PATH@:>@], +@@ -229,6 +232,9 @@ AC_ARG_WITH([system-ovmf], + esac + ],[]) + AC_SUBST(ovmf_path) ++AC_DEFINE_UNQUOTED([OVMF_PATH], ++ ["${ovmf_path:-$XENFIRMWAREDIR/ovmf.bin}"], ++ [OVMF path]) + + AC_ARG_WITH([extra-qemuu-configure-args], + AS_HELP_STRING([--with-extra-qemuu-configure-args@<:@="--ARG1 ..."@:>@], diff --git a/0004-firmware-makefile-install-BIOS-blob.patch b/0004-firmware-makefile-install-BIOS-blob.patch new file mode 100644 index 0000000..623e126 --- /dev/null +++ b/0004-firmware-makefile-install-BIOS-blob.patch @@ -0,0 +1,43 @@ +From b44077cb7b2844d083ddae0d2174d4ae8a5101b6 Mon Sep 17 00:00:00 2001 +From: Anthony PERARD +Date: Mon, 14 Mar 2016 17:55:39 +0000 +Subject: [PATCH 04/15] firmware/makefile: install BIOS blob ... + +... into the firmware directory, along with hvmloader. + +Signed-off-by: Anthony PERARD +--- + tools/firmware/Makefile | 13 +++++++++++++ + 1 file changed, 13 insertions(+) + +Index: xen-4.7.0-testing/tools/firmware/Makefile +=================================================================== +--- xen-4.7.0-testing.orig/tools/firmware/Makefile ++++ xen-4.7.0-testing/tools/firmware/Makefile +@@ -19,6 +19,9 @@ SUBDIRS-y += hvmloader + + LD32BIT-$(CONFIG_FreeBSD) := LD32BIT_FLAG=-melf_i386_fbsd + ++SEABIOS_ROM := seabios-dir/out/bios.bin ++OVMF_ROM := ovmf-dir/ovmf.bin ++ + ovmf-dir: + GIT=$(GIT) $(XEN_ROOT)/scripts/git-checkout.sh $(OVMF_UPSTREAM_URL) $(OVMF_UPSTREAM_REVISION) ovmf-dir + cp ovmf-makefile ovmf-dir/Makefile; +@@ -45,6 +48,16 @@ endif + install: all + [ -d $(INST_DIR) ] || $(INSTALL_DIR) $(INST_DIR) + [ ! -e $(TARGET) ] || $(INSTALL_DATA) $(TARGET) $(INST_DIR) ++ifeq ($(CONFIG_SEABIOS),y) ++ifeq ($(SEABIOS_PATH),) ++ $(INSTALL_DATA) $(SEABIOS_ROM) $(INST_DIR)/seabios.bin ++endif ++endif ++ifeq ($(CONFIG_OVMF),y) ++ifeq ($(OVMF_PATH),) ++ $(INSTALL_DATA) $(OVMF_ROM) $(INST_DIR)/ovmf.bin ++endif ++endif + + .PHONY: clean + clean: subdirs-clean diff --git a/0005-libxl-Load-guest-BIOS-from-file.patch b/0005-libxl-Load-guest-BIOS-from-file.patch new file mode 100644 index 0000000..85d32c8 --- /dev/null +++ b/0005-libxl-Load-guest-BIOS-from-file.patch @@ -0,0 +1,212 @@ +From a8eef037b010662e73428907af761b6d2aef4eae Mon Sep 17 00:00:00 2001 +From: Anthony PERARD +Date: Mon, 14 Mar 2016 17:55:40 +0000 +Subject: [PATCH 05/15] libxl: Load guest BIOS from file + +The path to the BIOS blob can be override by the xl's bios_override option, +or provided by u.hvm.bios_firmware in the domain_build_info struct by other +libxl user. + +Signed-off-by: Anthony PERARD +--- + docs/man/xl.cfg.pod.5 | 9 +++++++ + tools/libxl/libxl.h | 8 +++++++ + tools/libxl/libxl_dom.c | 57 ++++++++++++++++++++++++++++++++++++++++++++ + tools/libxl/libxl_internal.h | 2 ++ + tools/libxl/libxl_paths.c | 10 ++++++++ + tools/libxl/libxl_types.idl | 1 + + tools/libxl/xl_cmdimpl.c | 11 ++++++--- + 7 files changed, 95 insertions(+), 3 deletions(-) + +Index: xen-4.7.0-testing/docs/man/xl.cfg.pod.5 +=================================================================== +--- xen-4.7.0-testing.orig/docs/man/xl.cfg.pod.5 ++++ xen-4.7.0-testing/docs/man/xl.cfg.pod.5 +@@ -1242,6 +1242,15 @@ Requires device_model_version=qemu-xen. + + =back + ++=item B ++ ++Override the path to the blob to be used as BIOS. The blob provided here MUST ++be consistent with the `bios` which you have specified. You should not normally ++need to specify this option. ++ ++This options does not have any effect if using bios="rombios" or ++device_model_version="qemu-xen-traditional". ++ + =item B + + Hide or expose the IA32 Physical Address Extensions. These extensions +Index: xen-4.7.0-testing/tools/libxl/libxl.h +=================================================================== +--- xen-4.7.0-testing.orig/tools/libxl/libxl.h ++++ xen-4.7.0-testing/tools/libxl/libxl.h +@@ -934,6 +934,14 @@ void libxl_mac_copy(libxl_ctx *ctx, libx + #define LIBXL_HAVE_CHECKPOINTED_STREAM 1 + + /* ++ * LIBXL_HAVE_BUILDINFO_HVM_BIOS_FIRMWARE ++ * ++ * libxl_domain_build_info has u.hvm.bios_firmware field which can be use ++ * to provide a different bios blob (like SeaBIOS or OVMF). ++ */ ++#define LIBXL_HAVE_BUILDINFO_HVM_BIOS_FIRMWARE ++ ++/* + * ERROR_REMUS_XXX error code only exists from Xen 4.5, Xen 4.6 and it + * is changed to ERROR_CHECKPOINT_XXX in Xen 4.7 + */ +Index: xen-4.7.0-testing/tools/libxl/libxl_dom.c +=================================================================== +--- xen-4.7.0-testing.orig/tools/libxl/libxl_dom.c ++++ xen-4.7.0-testing/tools/libxl/libxl_dom.c +@@ -866,6 +866,38 @@ err: + return ret; + } + ++static int libxl__load_hvm_firmware_module(libxl__gc *gc, ++ const char *filename, ++ const char *what, ++ struct xc_hvm_firmware_module *m) ++{ ++ int datalen = 0; ++ void *data = NULL; ++ int e; ++ ++ LOG(DEBUG, "Loading %s: %s", what, filename); ++ e = libxl_read_file_contents(CTX, filename, &data, &datalen); ++ if (e) { ++ /* ++ * Print a message only on ENOENT, other error are logged by the ++ * function libxl_read_file_contents(). ++ */ ++ if (e == ENOENT) ++ LOGEV(ERROR, e, "failed to read %s file", what); ++ return ERROR_FAIL; ++ } ++ libxl__ptr_add(gc, data); ++ if (datalen) { ++ /* Only accept non-empty files */ ++ m->data = data; ++ m->length = datalen; ++ } else { ++ LOG(ERROR, "file %s for %s is empty", filename, what); ++ return ERROR_INVAL; ++ } ++ return 0; ++} ++ + static int libxl__domain_firmware(libxl__gc *gc, + libxl_domain_build_info *info, + struct xc_dom_image *dom) +@@ -875,6 +907,7 @@ static int libxl__domain_firmware(libxl_ + int e, rc; + int datalen = 0; + void *data; ++ const char *bios_filename = NULL; + + if (info->u.hvm.firmware) + firmware = info->u.hvm.firmware; +@@ -918,6 +951,30 @@ static int libxl__domain_firmware(libxl_ + goto out; + } + ++ if (info->device_model_version == LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN) { ++ if (info->u.hvm.bios_firmware) { ++ bios_filename = info->u.hvm.bios_firmware; ++ } else { ++ switch (info->u.hvm.bios) { ++ case LIBXL_BIOS_TYPE_SEABIOS: ++ bios_filename = libxl__seabios_path(); ++ break; ++ case LIBXL_BIOS_TYPE_OVMF: ++ bios_filename = libxl__ovmf_path(); ++ break; ++ case LIBXL_BIOS_TYPE_ROMBIOS: ++ default: ++ abort(); ++ } ++ } ++ } ++ ++ if (bios_filename) { ++ rc = libxl__load_hvm_firmware_module(gc, bios_filename, "BIOS", ++ &dom->bios_module); ++ if (rc) goto out; ++ } ++ + if (info->u.hvm.smbios_firmware) { + data = NULL; + e = libxl_read_file_contents(ctx, info->u.hvm.smbios_firmware, +Index: xen-4.7.0-testing/tools/libxl/libxl_internal.h +=================================================================== +--- xen-4.7.0-testing.orig/tools/libxl/libxl_internal.h ++++ xen-4.7.0-testing/tools/libxl/libxl_internal.h +@@ -2314,6 +2314,8 @@ _hidden const char *libxl__xen_config_di + _hidden const char *libxl__xen_script_dir_path(void); + _hidden const char *libxl__lock_dir_path(void); + _hidden const char *libxl__run_dir_path(void); ++_hidden const char *libxl__seabios_path(void); ++_hidden const char *libxl__ovmf_path(void); + + /*----- subprocess execution with timeout -----*/ + +Index: xen-4.7.0-testing/tools/libxl/libxl_paths.c +=================================================================== +--- xen-4.7.0-testing.orig/tools/libxl/libxl_paths.c ++++ xen-4.7.0-testing/tools/libxl/libxl_paths.c +@@ -35,6 +35,16 @@ const char *libxl__run_dir_path(void) + return XEN_RUN_DIR; + } + ++const char *libxl__seabios_path(void) ++{ ++ return SEABIOS_PATH; ++} ++ ++const char *libxl__ovmf_path(void) ++{ ++ return OVMF_PATH; ++} ++ + /* + * Local variables: + * mode: C +Index: xen-4.7.0-testing/tools/libxl/libxl_types.idl +=================================================================== +--- xen-4.7.0-testing.orig/tools/libxl/libxl_types.idl ++++ xen-4.7.0-testing/tools/libxl/libxl_types.idl +@@ -511,6 +511,7 @@ libxl_domain_build_info = Struct("domain + ("timer_mode", libxl_timer_mode), + ("nested_hvm", libxl_defbool), + ("altp2m", libxl_defbool), ++ ("bios_firmware", string), + ("smbios_firmware", string), + ("acpi_firmware", string), + ("hdtype", libxl_hdtype), +Index: xen-4.7.0-testing/tools/libxl/xl_cmdimpl.c +=================================================================== +--- xen-4.7.0-testing.orig/tools/libxl/xl_cmdimpl.c ++++ xen-4.7.0-testing/tools/libxl/xl_cmdimpl.c +@@ -1680,12 +1680,17 @@ static void parse_config_data(const char + + xlu_cfg_replace_string (config, "firmware_override", + &b_info->u.hvm.firmware, 0); +- if (!xlu_cfg_get_string(config, "bios", &buf, 0) && +- libxl_bios_type_from_string(buf, &b_info->u.hvm.bios)) { ++ xlu_cfg_replace_string (config, "bios_override", ++ &b_info->u.hvm.bios_firmware, 0); ++ if (!xlu_cfg_get_string(config, "bios", &buf, 0)) { ++ if (libxl_bios_type_from_string(buf, &b_info->u.hvm.bios)) { + fprintf(stderr, "ERROR: invalid value \"%s\" for \"bios\"\n", + buf); + exit (1); +- } ++ } ++ } else if (b_info->u.hvm.bios_firmware) ++ fprintf(stderr, "WARNING: " ++ "bios_override given without specific bios name\n"); + + xlu_cfg_get_defbool(config, "pae", &b_info->u.hvm.pae, 0); + xlu_cfg_get_defbool(config, "apic", &b_info->u.hvm.apic, 0); diff --git a/0006-xen-Move-the-hvm_start_info-C-representation-from-li.patch b/0006-xen-Move-the-hvm_start_info-C-representation-from-li.patch new file mode 100644 index 0000000..c4b197b --- /dev/null +++ b/0006-xen-Move-the-hvm_start_info-C-representation-from-li.patch @@ -0,0 +1,99 @@ +From b920bea09b69c1cdd5bb4c5964ce20d0bf7ced8b Mon Sep 17 00:00:00 2001 +From: Anthony PERARD +Date: Mon, 14 Mar 2016 17:55:41 +0000 +Subject: [PATCH 06/15] xen: Move the hvm_start_info C representation from + libxc to public/xen.h + +Instead of having several representation of hvm_start_info in C, define +it in public/xen.h so both libxc and hvmloader can use it. + +Signed-off-by: Anthony PERARD +--- + tools/libxc/include/xc_dom.h | 31 ------------------------------- + xen/include/public/xen.h | 31 +++++++++++++++++++++++++++++++ + 2 files changed, 31 insertions(+), 31 deletions(-) + +Index: xen-4.7.0-testing/tools/libxc/include/xc_dom.h +=================================================================== +--- xen-4.7.0-testing.orig/tools/libxc/include/xc_dom.h ++++ xen-4.7.0-testing/tools/libxc/include/xc_dom.h +@@ -219,37 +219,6 @@ struct xc_dom_image { + struct xc_hvm_firmware_module smbios_module; + }; + +-#if defined(__i386__) || defined(__x86_64__) +-/* C representation of the x86/HVM start info layout. +- * +- * The canonical definition of this layout resides in public/xen.h, this +- * is just a way to represent the layout described there using C types. +- * +- * NB: the packed attribute is not really needed, but it helps us enforce +- * the fact this this is just a representation, and it might indeed +- * be required in the future if there are alignment changes. +- */ +-struct hvm_start_info { +- uint32_t magic; /* Contains the magic value 0x336ec578 */ +- /* ("xEn3" with the 0x80 bit of the "E" set).*/ +- uint32_t version; /* Version of this structure. */ +- uint32_t flags; /* SIF_xxx flags. */ +- uint32_t cmdline_paddr; /* Physical address of the command line. */ +- uint32_t nr_modules; /* Number of modules passed to the kernel. */ +- uint32_t modlist_paddr; /* Physical address of an array of */ +- /* hvm_modlist_entry. */ +- uint32_t rsdp_paddr; /* Physical address of the RSDP ACPI data */ +- /* structure. */ +-} __attribute__((packed)); +- +-struct hvm_modlist_entry { +- uint64_t paddr; /* Physical address of the module. */ +- uint64_t size; /* Size of the module in bytes. */ +- uint64_t cmdline_paddr; /* Physical address of the command line. */ +- uint64_t reserved; +-} __attribute__((packed)); +-#endif /* x86 */ +- + /* --- pluggable kernel loader ------------------------------------- */ + + struct xc_dom_loader { +Index: xen-4.7.0-testing/xen/include/public/xen.h +=================================================================== +--- xen-4.7.0-testing.orig/xen/include/public/xen.h ++++ xen-4.7.0-testing/xen/include/public/xen.h +@@ -858,6 +858,37 @@ typedef struct start_info start_info_t; + */ + #define XEN_HVM_START_MAGIC_VALUE 0x336ec578 + ++#if defined(__i386__) || defined(__x86_64__) ++/* C representation of the x86/HVM start info layout. ++ * ++ * The canonical definition of this layout is abrove, this is just a way to ++ * represent the layout described there using C types. ++ * ++ * NB: the packed attribute is not really needed, but it helps us enforce ++ * the fact this this is just a representation, and it might indeed ++ * be required in the future if there are alignment changes. ++ */ ++struct hvm_start_info { ++ uint32_t magic; /* Contains the magic value 0x336ec578 */ ++ /* ("xEn3" with the 0x80 bit of the "E" set).*/ ++ uint32_t version; /* Version of this structure. */ ++ uint32_t flags; /* SIF_xxx flags. */ ++ uint32_t cmdline_paddr; /* Physical address of the command line. */ ++ uint32_t nr_modules; /* Number of modules passed to the kernel. */ ++ uint32_t modlist_paddr; /* Physical address of an array of */ ++ /* hvm_modlist_entry. */ ++ uint32_t rsdp_paddr; /* Physical address of the RSDP ACPI data */ ++ /* structure. */ ++} __attribute__((packed)); ++ ++struct hvm_modlist_entry { ++ uint64_t paddr; /* Physical address of the module. */ ++ uint64_t size; /* Size of the module in bytes. */ ++ uint64_t cmdline_paddr; /* Physical address of the command line. */ ++ uint64_t reserved; ++} __attribute__((packed)); ++#endif /* x86 */ ++ + /* New console union for dom0 introduced in 0x00030203. */ + #if __XEN_INTERFACE_VERSION__ < 0x00030203 + #define console_mfn console.domU.mfn diff --git a/0007-hvmloader-Grab-the-hvm_start_info-pointer.patch b/0007-hvmloader-Grab-the-hvm_start_info-pointer.patch new file mode 100644 index 0000000..4c9b546 --- /dev/null +++ b/0007-hvmloader-Grab-the-hvm_start_info-pointer.patch @@ -0,0 +1,55 @@ +From e3d13cec19a919b06dea49edd64a50c68e1094a7 Mon Sep 17 00:00:00 2001 +From: Anthony PERARD +Date: Mon, 14 Mar 2016 17:55:42 +0000 +Subject: [PATCH 07/15] hvmloader: Grab the hvm_start_info pointer + +Signed-off-by: Anthony PERARD +--- + tools/firmware/hvmloader/hvmloader.c | 5 +++++ + tools/firmware/hvmloader/util.h | 3 +++ + 2 files changed, 8 insertions(+) + +Index: xen-4.7.0-testing/tools/firmware/hvmloader/hvmloader.c +=================================================================== +--- xen-4.7.0-testing.orig/tools/firmware/hvmloader/hvmloader.c ++++ xen-4.7.0-testing/tools/firmware/hvmloader/hvmloader.c +@@ -29,6 +29,8 @@ + #include + #include + ++const struct hvm_start_info *hvm_start_info; ++ + asm ( + " .text \n" + " .globl _start \n" +@@ -46,6 +48,8 @@ asm ( + " ljmp $"STR(SEL_CODE32)",$1f \n" + "1: movl $stack_top,%esp \n" + " movl %esp,%ebp \n" ++ /* store HVM start info ptr */ ++ " mov %ebx, hvm_start_info \n" + " call main \n" + /* Relocate real-mode trampoline to 0x0. */ + " mov $trampoline_start,%esi \n" +@@ -258,6 +262,7 @@ int main(void) + memset((void *)HYPERCALL_PHYSICAL_ADDRESS, 0xc3 /* RET */, PAGE_SIZE); + + printf("HVM Loader\n"); ++ BUG_ON(hvm_start_info->magic != XEN_HVM_START_MAGIC_VALUE); + + init_hypercalls(); + +Index: xen-4.7.0-testing/tools/firmware/hvmloader/util.h +=================================================================== +--- xen-4.7.0-testing.orig/tools/firmware/hvmloader/util.h ++++ xen-4.7.0-testing/tools/firmware/hvmloader/util.h +@@ -158,6 +158,9 @@ static inline void cpu_relax(void) + struct hvm_info_table *get_hvm_info_table(void) __attribute__ ((const)); + #define hvm_info (get_hvm_info_table()) + ++/* HVM start info */ ++extern const struct hvm_start_info *hvm_start_info; ++ + /* String and memory functions */ + int strcmp(const char *cs, const char *ct); + int strncmp(const char *s1, const char *s2, uint32_t n); diff --git a/0008-hvmloader-Locate-the-BIOS-blob.patch b/0008-hvmloader-Locate-the-BIOS-blob.patch new file mode 100644 index 0000000..e07fd81 --- /dev/null +++ b/0008-hvmloader-Locate-the-BIOS-blob.patch @@ -0,0 +1,139 @@ +From 463aedc4fd6e09518b4711e931048bf932b6ee39 Mon Sep 17 00:00:00 2001 +From: Anthony PERARD +Date: Mon, 14 Mar 2016 17:55:43 +0000 +Subject: [PATCH 08/15] hvmloader: Locate the BIOS blob + +The BIOS can be found an entry called "bios" of the modlist of the +hvm_start_info struct. + +The found BIOS blob is not loaded by this patch, but only passed as +argument to bios_load() function. It is going to be used by the next few +patches. + +Signed-off-by: Anthony PERARD +--- + tools/firmware/hvmloader/config.h | 2 +- + tools/firmware/hvmloader/hvmloader.c | 42 ++++++++++++++++++++++++++++++++++-- + tools/firmware/hvmloader/ovmf.c | 3 ++- + tools/firmware/hvmloader/rombios.c | 3 ++- + tools/firmware/hvmloader/util.h | 2 ++ + 5 files changed, 47 insertions(+), 5 deletions(-) + +Index: xen-4.7.0-testing/tools/firmware/hvmloader/config.h +=================================================================== +--- xen-4.7.0-testing.orig/tools/firmware/hvmloader/config.h ++++ xen-4.7.0-testing/tools/firmware/hvmloader/config.h +@@ -22,7 +22,7 @@ struct bios_config { + /* ROMS */ + void (*load_roms)(void); + +- void (*bios_load)(const struct bios_config *config); ++ void (*bios_load)(const struct bios_config *config, void *addr, uint32_t size); + + void (*bios_info_setup)(void); + void (*bios_info_finish)(void); +Index: xen-4.7.0-testing/tools/firmware/hvmloader/hvmloader.c +=================================================================== +--- xen-4.7.0-testing.orig/tools/firmware/hvmloader/hvmloader.c ++++ xen-4.7.0-testing/tools/firmware/hvmloader/hvmloader.c +@@ -253,10 +253,40 @@ static void acpi_enable_sci(void) + BUG_ON(!(pm1a_cnt_val & ACPI_PM1C_SCI_EN)); + } + ++const struct hvm_modlist_entry *get_module_entry( ++ const struct hvm_start_info *info, ++ const char *name) ++{ ++ const struct hvm_modlist_entry *modlist = ++ (struct hvm_modlist_entry *)info->modlist_paddr; ++ unsigned int i; ++ ++ if ( !modlist ) ++ return NULL; ++ ++ for ( i = 0; i < info->nr_modules; i++ ) ++ { ++ uint32_t module_name = modlist[i].cmdline_paddr; ++ ++ BUG_ON(!modlist[i].cmdline_paddr || ++ modlist[i].cmdline_paddr > UINT_MAX); ++ ++ if ( !strcmp(name, (char*)module_name) ) ++ { ++ BUG_ON(!modlist[i].paddr || modlist[i].paddr > UINT_MAX || ++ modlist[i].size > UINT_MAX); ++ return &modlist[i]; ++ } ++ } ++ ++ return NULL; ++} ++ + int main(void) + { + const struct bios_config *bios; + int acpi_enabled; ++ const struct hvm_modlist_entry *bios_module; + + /* Initialise hypercall stubs with RET, rendering them no-ops. */ + memset((void *)HYPERCALL_PHYSICAL_ADDRESS, 0xc3 /* RET */, PAGE_SIZE); +@@ -292,8 +322,16 @@ int main(void) + } + + printf("Loading %s ...\n", bios->name); +- if ( bios->bios_load ) +- bios->bios_load(bios); ++ bios_module = get_module_entry(hvm_start_info, "bios"); ++ if ( bios_module && bios->bios_load ) ++ { ++ uint32_t paddr = bios_module->paddr; ++ bios->bios_load(bios, (void*)paddr, bios_module->size); ++ } ++ else if ( bios->bios_load ) ++ { ++ bios->bios_load(bios, 0, 0); ++ } + else + { + BUG_ON(bios->bios_address + bios->image_size > +Index: xen-4.7.0-testing/tools/firmware/hvmloader/ovmf.c +=================================================================== +--- xen-4.7.0-testing.orig/tools/firmware/hvmloader/ovmf.c ++++ xen-4.7.0-testing/tools/firmware/hvmloader/ovmf.c +@@ -93,7 +93,8 @@ static void ovmf_finish_bios_info(void) + info->checksum = -checksum; + } + +-static void ovmf_load(const struct bios_config *config) ++static void ovmf_load(const struct bios_config *config, ++ void *bios_addr, uint32_t bios_length) + { + xen_pfn_t mfn; + uint64_t addr = OVMF_BEGIN; +Index: xen-4.7.0-testing/tools/firmware/hvmloader/rombios.c +=================================================================== +--- xen-4.7.0-testing.orig/tools/firmware/hvmloader/rombios.c ++++ xen-4.7.0-testing/tools/firmware/hvmloader/rombios.c +@@ -121,7 +121,8 @@ static void rombios_load_roms(void) + option_rom_phys_addr + option_rom_sz - 1); + } + +-static void rombios_load(const struct bios_config *config) ++static void rombios_load(const struct bios_config *config, ++ void *unused_addr, uint32_t unused_size) + { + uint32_t bioshigh; + struct rombios_info *info; +Index: xen-4.7.0-testing/tools/firmware/hvmloader/util.h +=================================================================== +--- xen-4.7.0-testing.orig/tools/firmware/hvmloader/util.h ++++ xen-4.7.0-testing/tools/firmware/hvmloader/util.h +@@ -34,6 +34,8 @@ enum { + #undef NULL + #define NULL ((void*)0) + ++#define UINT_MAX (~0U) ++ + void __assert_failed(char *assertion, char *file, int line) + __attribute__((noreturn)); + #define ASSERT(p) \ diff --git a/0009-hvmloader-Check-modules-whereabouts-in-perform_tests.patch b/0009-hvmloader-Check-modules-whereabouts-in-perform_tests.patch new file mode 100644 index 0000000..6ebdbc8 --- /dev/null +++ b/0009-hvmloader-Check-modules-whereabouts-in-perform_tests.patch @@ -0,0 +1,44 @@ +From c3f4c5bcf0d8d93b5116f3e368c4739abe2dc06d Mon Sep 17 00:00:00 2001 +From: Anthony PERARD +Date: Mon, 14 Mar 2016 17:55:44 +0000 +Subject: [PATCH 09/15] hvmloader: Check modules whereabouts in perform_tests + +As perform_tests() is going to clear memory past 4MB, we check that the +memory can be use or we skip the tests. + +Signed-off-by: Anthony PERARD +--- + tools/firmware/hvmloader/tests.c | 20 ++++++++++++++++++++ + 1 file changed, 20 insertions(+) + +Index: xen-4.7.0-testing/tools/firmware/hvmloader/tests.c +=================================================================== +--- xen-4.7.0-testing.orig/tools/firmware/hvmloader/tests.c ++++ xen-4.7.0-testing/tools/firmware/hvmloader/tests.c +@@ -210,6 +210,26 @@ void perform_tests(void) + return; + } + ++ /* Check that tests does not use memory where modules are stored */ ++ if ( ((uint32_t)hvm_start_info + sizeof(struct hvm_start_info)) > 4 << 20 ++ && (uint32_t)hvm_start_info < 8 << 20 ) ++ { ++ printf("Skipping tests due to memory used by hvm_start_info\n"); ++ return; ++ } ++ for ( unsigned i = 0; i < hvm_start_info->nr_modules; i++ ) ++ { ++ const struct hvm_modlist_entry *modlist = ++ (struct hvm_modlist_entry *)hvm_start_info->modlist_paddr; ++ if ( modlist[i].paddr ++ && modlist[i].paddr + modlist[i].size > 4ul << 20 ++ && modlist[i].paddr < 8ul << 20 ) ++ { ++ printf("Skipping tests due to memory used by a module\n"); ++ return; ++ } ++ } ++ + passed = skipped = 0; + for ( i = 0; tests[i].test; i++ ) + { diff --git a/0010-hvmloader-Load-SeaBIOS-from-hvm_start_info-modules.patch b/0010-hvmloader-Load-SeaBIOS-from-hvm_start_info-modules.patch new file mode 100644 index 0000000..f1a5528 --- /dev/null +++ b/0010-hvmloader-Load-SeaBIOS-from-hvm_start_info-modules.patch @@ -0,0 +1,112 @@ +From df9fdafcfc38c931181dae1de3e6a9eee28829d4 Mon Sep 17 00:00:00 2001 +From: Anthony PERARD +Date: Mon, 14 Mar 2016 17:55:45 +0000 +Subject: [PATCH 10/15] hvmloader: Load SeaBIOS from hvm_start_info modules + +... and do not include the SeaBIOS ROM into hvmloader anymore. + +This also fix the dependency on roms.inc, hvmloader.o does not include it. + +Signed-off-by: Anthony PERARD +--- + tools/firmware/hvmloader/Makefile | 15 +-------------- + tools/firmware/hvmloader/seabios.c | 24 ++++++++++++++---------- + 2 files changed, 15 insertions(+), 24 deletions(-) + +Index: xen-4.7.0-testing/tools/firmware/hvmloader/Makefile +=================================================================== +--- xen-4.7.0-testing.orig/tools/firmware/hvmloader/Makefile ++++ xen-4.7.0-testing/tools/firmware/hvmloader/Makefile +@@ -45,7 +45,6 @@ CIRRUSVGA_DEBUG ?= n + + OVMF_DIR := ../ovmf-dir + ROMBIOS_DIR := ../rombios +-SEABIOS_DIR := ../seabios-dir + + ifeq ($(CONFIG_ROMBIOS),y) + STDVGA_ROM := ../vgabios/VGABIOS-lgpl-latest.bin +@@ -80,19 +79,13 @@ endif + ifeq ($(CONFIG_SEABIOS),y) + OBJS += seabios.o + CFLAGS += -DENABLE_SEABIOS +-ifeq ($(SEABIOS_PATH),) +- SEABIOS_ROM := $(SEABIOS_DIR)/out/bios.bin +-else +- SEABIOS_ROM := $(SEABIOS_PATH) +-endif +-ROMS += $(SEABIOS_ROM) + endif + + .PHONY: all + all: subdirs-all + $(MAKE) hvmloader + +-ovmf.o rombios.o seabios.o hvmloader.o: roms.inc ++ovmf.o rombios.o: roms.inc + smbios.o: CFLAGS += -D__SMBIOS_DATE__="\"$(SMBIOS_REL_DATE)\"" + + hvmloader: $(OBJS) acpi/acpi.a +@@ -109,12 +102,6 @@ ifneq ($(ROMBIOS_ROM),) + echo "#endif" >> $@.new + endif + +-ifneq ($(SEABIOS_ROM),) +- echo "#ifdef ROM_INCLUDE_SEABIOS" >> $@.new +- sh ./mkhex seabios $(SEABIOS_ROM) >> $@.new +- echo "#endif" >> $@.new +-endif +- + ifneq ($(OVMF_ROM),) + echo "#ifdef ROM_INCLUDE_OVMF" >> $@.new + sh ./mkhex ovmf $(OVMF_ROM) >> $@.new +Index: xen-4.7.0-testing/tools/firmware/hvmloader/seabios.c +=================================================================== +--- xen-4.7.0-testing.orig/tools/firmware/hvmloader/seabios.c ++++ xen-4.7.0-testing/tools/firmware/hvmloader/seabios.c +@@ -27,9 +27,6 @@ + #include "smbios_types.h" + #include "acpi/acpi2_0.h" + +-#define ROM_INCLUDE_SEABIOS +-#include "roms.inc" +- + extern unsigned char dsdt_anycpu_qemu_xen[]; + extern int dsdt_anycpu_qemu_xen_len; + +@@ -127,22 +124,29 @@ static void seabios_setup_e820(void) + struct e820entry *e820 = scratch_alloc(sizeof(struct e820entry)*16, 0); + info->e820 = (uint32_t)e820; + ++ BUG_ON(seabios_config.bios_address < 0xc0000 || seabios_config.bios_address >= 0x100000); + /* SeaBIOS reserves memory in e820 as necessary so no low reservation. */ +- info->e820_nr = build_e820_table(e820, 0, 0x100000-sizeof(seabios)); ++ info->e820_nr = build_e820_table(e820, 0, seabios_config.bios_address); + dump_e820_table(e820, info->e820_nr); + } + +-struct bios_config seabios_config = { +- .name = "SeaBIOS", ++static void seabios_load(const struct bios_config *bios, ++ void *bios_addr, uint32_t bios_length) ++{ ++ unsigned int bios_dest = 0x100000 - bios_length; + +- .image = seabios, +- .image_size = sizeof(seabios), ++ BUG_ON(bios_dest + bios_length > HVMLOADER_PHYSICAL_ADDRESS); ++ memcpy((void *)bios_dest, bios_addr, bios_length); ++ seabios_config.bios_address = bios_dest; ++ seabios_config.image_size = bios_length; ++} + +- .bios_address = 0x100000 - sizeof(seabios), ++struct bios_config seabios_config = { ++ .name = "SeaBIOS", + + .load_roms = NULL, + +- .bios_load = NULL, ++ .bios_load = seabios_load, + + .bios_info_setup = seabios_setup_bios_info, + .bios_info_finish = seabios_finish_bios_info, diff --git a/0011-hvmloader-Load-OVMF-from-modules.patch b/0011-hvmloader-Load-OVMF-from-modules.patch new file mode 100644 index 0000000..18f45e1 --- /dev/null +++ b/0011-hvmloader-Load-OVMF-from-modules.patch @@ -0,0 +1,131 @@ +From 009fef2fc4bdffd1c9e5caf557157b4949d3842b Mon Sep 17 00:00:00 2001 +From: Anthony PERARD +Date: Mon, 14 Mar 2016 17:55:46 +0000 +Subject: [PATCH 11/15] hvmloader: Load OVMF from modules + +... and do not include the OVMF ROM into hvmloader anymore. + +Signed-off-by: Anthony PERARD +--- + tools/firmware/hvmloader/Makefile | 15 +-------------- + tools/firmware/hvmloader/ovmf.c | 30 +++++++++++++----------------- + 2 files changed, 14 insertions(+), 31 deletions(-) + +Index: xen-4.7.0-testing/tools/firmware/hvmloader/Makefile +=================================================================== +--- xen-4.7.0-testing.orig/tools/firmware/hvmloader/Makefile ++++ xen-4.7.0-testing/tools/firmware/hvmloader/Makefile +@@ -43,7 +43,6 @@ endif + + CIRRUSVGA_DEBUG ?= n + +-OVMF_DIR := ../ovmf-dir + ROMBIOS_DIR := ../rombios + + ifeq ($(CONFIG_ROMBIOS),y) +@@ -61,12 +60,6 @@ ROMS := + ifeq ($(CONFIG_OVMF),y) + OBJS += ovmf.o + CFLAGS += -DENABLE_OVMF +-ifeq ($(OVMF_PATH),) +- OVMF_ROM := $(OVMF_DIR)/ovmf.bin +-else +- OVMF_ROM := $(OVMF_PATH) +-endif +-ROMS += $(OVMF_ROM) + endif + + ifeq ($(CONFIG_ROMBIOS),y) +@@ -85,7 +78,7 @@ endif + all: subdirs-all + $(MAKE) hvmloader + +-ovmf.o rombios.o: roms.inc ++rombios.o: roms.inc + smbios.o: CFLAGS += -D__SMBIOS_DATE__="\"$(SMBIOS_REL_DATE)\"" + + hvmloader: $(OBJS) acpi/acpi.a +@@ -102,12 +95,6 @@ ifneq ($(ROMBIOS_ROM),) + echo "#endif" >> $@.new + endif + +-ifneq ($(OVMF_ROM),) +- echo "#ifdef ROM_INCLUDE_OVMF" >> $@.new +- sh ./mkhex ovmf $(OVMF_ROM) >> $@.new +- echo "#endif" >> $@.new +-endif +- + ifneq ($(STDVGA_ROM),) + echo "#ifdef ROM_INCLUDE_VGABIOS" >> $@.new + sh ./mkhex vgabios_stdvga $(STDVGA_ROM) >> $@.new +Index: xen-4.7.0-testing/tools/firmware/hvmloader/ovmf.c +=================================================================== +--- xen-4.7.0-testing.orig/tools/firmware/hvmloader/ovmf.c ++++ xen-4.7.0-testing/tools/firmware/hvmloader/ovmf.c +@@ -34,17 +34,10 @@ + #include + #include + +-#define ROM_INCLUDE_OVMF +-#include "roms.inc" +- +-#define OVMF_SIZE (sizeof(ovmf)) + #define OVMF_MAXOFFSET 0x000FFFFFULL +-#define OVMF_BEGIN (0x100000000ULL - ((OVMF_SIZE + OVMF_MAXOFFSET) & ~OVMF_MAXOFFSET)) +-#define OVMF_END (OVMF_BEGIN + OVMF_SIZE) + #define LOWCHUNK_BEGIN 0x000F0000 + #define LOWCHUNK_SIZE 0x00010000 + #define LOWCHUNK_MAXOFFSET 0x0000FFFF +-#define LOWCHUNK_END (OVMF_BEGIN + OVMF_SIZE) + #define OVMF_INFO_PHYSICAL_ADDRESS 0x00001000 + + extern unsigned char dsdt_anycpu_qemu_xen[]; +@@ -97,24 +90,31 @@ static void ovmf_load(const struct bios_ + void *bios_addr, uint32_t bios_length) + { + xen_pfn_t mfn; +- uint64_t addr = OVMF_BEGIN; ++ uint64_t addr = 0x100000000ULL ++ - ((bios_length + OVMF_MAXOFFSET) & ~OVMF_MAXOFFSET); ++ uint64_t ovmf_end = addr + bios_length; ++ ++ ovmf_config.bios_address = addr; ++ ovmf_config.image_size = bios_length; + + /* Copy low-reset vector portion. */ +- memcpy((void *) LOWCHUNK_BEGIN, (uint8_t *) config->image +- + OVMF_SIZE +- - LOWCHUNK_SIZE, ++ memcpy((void *) LOWCHUNK_BEGIN, ++ (uint8_t *) bios_addr + bios_length - LOWCHUNK_SIZE, + LOWCHUNK_SIZE); + + /* Ensure we have backing page prior to moving FD. */ +- while ( (addr >> PAGE_SHIFT) != (OVMF_END >> PAGE_SHIFT) ) ++ while ( (addr >> PAGE_SHIFT) != (ovmf_end >> PAGE_SHIFT) ) + { + mfn = (uint32_t) (addr >> PAGE_SHIFT); + addr += PAGE_SIZE; + mem_hole_populate_ram(mfn, 1); + } + ++ /* Check that source and destination does not overlaps. */ ++ BUG_ON(addr + bios_length > (unsigned)bios_addr ++ && addr < (unsigned)bios_addr + bios_length); + /* Copy FD. */ +- memcpy((void *) OVMF_BEGIN, config->image, OVMF_SIZE); ++ memcpy((void *) ovmf_config.bios_address, bios_addr, bios_length); + } + + static void ovmf_acpi_build_tables(void) +@@ -151,10 +151,6 @@ static void ovmf_setup_e820(void) + struct bios_config ovmf_config = { + .name = "OVMF", + +- .image = ovmf, +- .image_size = sizeof(ovmf), +- +- .bios_address = OVMF_BEGIN, + .bios_load = ovmf_load, + + .load_roms = 0, diff --git a/0012-hvmloader-Specific-bios_load-function-required.patch b/0012-hvmloader-Specific-bios_load-function-required.patch new file mode 100644 index 0000000..6b57635 --- /dev/null +++ b/0012-hvmloader-Specific-bios_load-function-required.patch @@ -0,0 +1,51 @@ +From 258c5050f08bdf69394dd8790398b6dfe453886e Mon Sep 17 00:00:00 2001 +From: Anthony PERARD +Date: Mon, 14 Mar 2016 17:55:47 +0000 +Subject: [PATCH 12/15] hvmloader: Specific bios_load function required + +All BIOS but ROMBIOS needs to be loaded via modules. + +ROMBIOS is handled as a special case. + +Signed-off-by: Anthony PERARD +Acked-by: Jan Beulich +--- + tools/firmware/hvmloader/hvmloader.c | 16 ++++++++++------ + 1 file changed, 10 insertions(+), 6 deletions(-) + +Index: xen-4.7.0-testing/tools/firmware/hvmloader/hvmloader.c +=================================================================== +--- xen-4.7.0-testing.orig/tools/firmware/hvmloader/hvmloader.c ++++ xen-4.7.0-testing/tools/firmware/hvmloader/hvmloader.c +@@ -323,21 +323,25 @@ int main(void) + + printf("Loading %s ...\n", bios->name); + bios_module = get_module_entry(hvm_start_info, "bios"); +- if ( bios_module && bios->bios_load ) ++ if ( bios_module ) + { + uint32_t paddr = bios_module->paddr; + bios->bios_load(bios, (void*)paddr, bios_module->size); + } +- else if ( bios->bios_load ) ++#ifdef ENABLE_ROMBIOS ++ else if ( bios == &rombios_config ) + { + bios->bios_load(bios, 0, 0); + } ++#endif + else + { +- BUG_ON(bios->bios_address + bios->image_size > +- HVMLOADER_PHYSICAL_ADDRESS); +- memcpy((void *)bios->bios_address, bios->image, +- bios->image_size); ++ /* ++ * If there is no BIOS module supplied and if there is no embeded BIOS ++ * image, then we failed. Only rombios might have an embedded bios blob. ++ */ ++ printf("no BIOS ROM image found\n"); ++ BUG(); + } + + if ( (hvm_info->nr_vcpus > 1) || hvm_info->apic_mode ) diff --git a/0013-hvmloader-Always-build-in-SeaBIOS-and-OVMF-loader.patch b/0013-hvmloader-Always-build-in-SeaBIOS-and-OVMF-loader.patch new file mode 100644 index 0000000..0808125 --- /dev/null +++ b/0013-hvmloader-Always-build-in-SeaBIOS-and-OVMF-loader.patch @@ -0,0 +1,65 @@ +From e7497ead178f01fd5c94cfb8506d31b77cc38c94 Mon Sep 17 00:00:00 2001 +From: Anthony PERARD +Date: Mon, 14 Mar 2016 17:55:48 +0000 +Subject: [PATCH 13/15] hvmloader: Always build-in SeaBIOS and OVMF loader + +Signed-off-by: Anthony PERARD +Acked-by: Jan Beulich +--- + tools/firmware/hvmloader/Makefile | 11 +---------- + tools/firmware/hvmloader/hvmloader.c | 4 ---- + 2 files changed, 1 insertion(+), 14 deletions(-) + +Index: xen-4.7.0-testing/tools/firmware/hvmloader/Makefile +=================================================================== +--- xen-4.7.0-testing.orig/tools/firmware/hvmloader/Makefile ++++ xen-4.7.0-testing/tools/firmware/hvmloader/Makefile +@@ -37,6 +37,7 @@ OBJS = hvmloader.o mp_tables.o util.o s + OBJS += smp.o cacheattr.o xenbus.o vnuma.o + OBJS += e820.o pci.o pir.o ctype.o + OBJS += hvm_param.o ++OBJS += ovmf.o seabios.o + ifeq ($(debug),y) + OBJS += tests.o + endif +@@ -57,11 +58,6 @@ endif + + ROMS := + +-ifeq ($(CONFIG_OVMF),y) +-OBJS += ovmf.o +-CFLAGS += -DENABLE_OVMF +-endif +- + ifeq ($(CONFIG_ROMBIOS),y) + OBJS += optionroms.o 32bitbios_support.o rombios.o + CFLAGS += -DENABLE_ROMBIOS +@@ -69,11 +65,6 @@ ROMBIOS_ROM := $(ROMBIOS_DIR)/BIOS-bochs + ROMS += $(ROMBIOS_ROM) $(STDVGA_ROM) $(CIRRUSVGA_ROM) $(ETHERBOOT_ROMS) + endif + +-ifeq ($(CONFIG_SEABIOS),y) +-OBJS += seabios.o +-CFLAGS += -DENABLE_SEABIOS +-endif +- + .PHONY: all + all: subdirs-all + $(MAKE) hvmloader +Index: xen-4.7.0-testing/tools/firmware/hvmloader/hvmloader.c +=================================================================== +--- xen-4.7.0-testing.orig/tools/firmware/hvmloader/hvmloader.c ++++ xen-4.7.0-testing/tools/firmware/hvmloader/hvmloader.c +@@ -209,12 +209,8 @@ struct bios_info { + #ifdef ENABLE_ROMBIOS + { "rombios", &rombios_config, }, + #endif +-#ifdef ENABLE_SEABIOS + { "seabios", &seabios_config, }, +-#endif +-#ifdef ENABLE_OVMF + { "ovmf", &ovmf_config, }, +-#endif + { NULL, NULL } + }; + diff --git a/0014-configure-do-not-depend-on-SEABIOS_PATH-or-OVMF_PATH.patch b/0014-configure-do-not-depend-on-SEABIOS_PATH-or-OVMF_PATH.patch new file mode 100644 index 0000000..e0c9b56 --- /dev/null +++ b/0014-configure-do-not-depend-on-SEABIOS_PATH-or-OVMF_PATH.patch @@ -0,0 +1,84 @@ +From d42d9e59472e2c637776245db8e80de0b907d46b Mon Sep 17 00:00:00 2001 +From: Anthony PERARD +Date: Mon, 14 Mar 2016 17:55:49 +0000 +Subject: [PATCH 14/15] configure: do not depend on SEABIOS_PATH or OVMF_PATH + ... + +... to compile SeaBIOS and OVMF. Only depends on CONFIG_*. + +If --with-system-* configure option is used, then set *_CONFIG=n to not +compile SEABIOS and OVMF. + +Signed-off-by: Anthony PERARD +--- + tools/configure.ac | 6 ++++-- + tools/firmware/Makefile | 8 -------- + 2 files changed, 4 insertions(+), 10 deletions(-) + +Index: xen-4.7.0-testing/tools/configure.ac +=================================================================== +--- xen-4.7.0-testing.orig/tools/configure.ac ++++ xen-4.7.0-testing/tools/configure.ac +@@ -212,12 +212,13 @@ AC_ARG_WITH([system-seabios], + AS_HELP_STRING([--with-system-seabios@<:@=PATH@:>@], + [Use system supplied seabios PATH instead of building and installing + our own version]),[ ++ # Disable compilation of SeaBIOS. ++ seabios=n + case $withval in + no) seabios_path= ;; + *) seabios_path=$withval ;; + esac + ],[]) +-AC_SUBST(seabios_path) + AC_DEFINE_UNQUOTED([SEABIOS_PATH], + ["${seabios_path:-$XENFIRMWAREDIR/seabios.bin}"], + [SeaBIOS path]) +@@ -226,12 +227,13 @@ AC_ARG_WITH([system-ovmf], + AS_HELP_STRING([--with-system-ovmf@<:@=PATH@:>@], + [Use system supplied OVMF PATH instead of building and installing + our own version]),[ ++ # Disable compilation of OVMF. ++ ovmf=n + case $withval in + no) ovmf_path= ;; + *) ovmf_path=$withval ;; + esac + ],[]) +-AC_SUBST(ovmf_path) + AC_DEFINE_UNQUOTED([OVMF_PATH], + ["${ovmf_path:-$XENFIRMWAREDIR/ovmf.bin}"], + [OVMF path]) +Index: xen-4.7.0-testing/tools/firmware/Makefile +=================================================================== +--- xen-4.7.0-testing.orig/tools/firmware/Makefile ++++ xen-4.7.0-testing/tools/firmware/Makefile +@@ -6,12 +6,8 @@ TARGET := hvmloader/hvmloader + INST_DIR := $(DESTDIR)$(XENFIRMWAREDIR) + + SUBDIRS-y := +-ifeq ($(OVMF_PATH),) + SUBDIRS-$(CONFIG_OVMF) += ovmf-dir +-endif +-ifeq ($(SEABIOS_PATH),) + SUBDIRS-$(CONFIG_SEABIOS) += seabios-dir +-endif + SUBDIRS-$(CONFIG_ROMBIOS) += rombios + SUBDIRS-$(CONFIG_ROMBIOS) += vgabios + SUBDIRS-$(CONFIG_ROMBIOS) += etherboot +@@ -49,15 +45,11 @@ install: all + [ -d $(INST_DIR) ] || $(INSTALL_DIR) $(INST_DIR) + [ ! -e $(TARGET) ] || $(INSTALL_DATA) $(TARGET) $(INST_DIR) + ifeq ($(CONFIG_SEABIOS),y) +-ifeq ($(SEABIOS_PATH),) + $(INSTALL_DATA) $(SEABIOS_ROM) $(INST_DIR)/seabios.bin + endif +-endif + ifeq ($(CONFIG_OVMF),y) +-ifeq ($(OVMF_PATH),) + $(INSTALL_DATA) $(OVMF_ROM) $(INST_DIR)/ovmf.bin + endif +-endif + + .PHONY: clean + clean: subdirs-clean diff --git a/aarch64-rename-PSR_MODE_ELxx-to-match-linux-headers.patch b/aarch64-rename-PSR_MODE_ELxx-to-match-linux-headers.patch index 0baa686..cfc36ae 100644 --- a/aarch64-rename-PSR_MODE_ELxx-to-match-linux-headers.patch +++ b/aarch64-rename-PSR_MODE_ELxx-to-match-linux-headers.patch @@ -14,7 +14,7 @@ Index: xen-4.7.0-testing/xen/include/public/arch-arm.h =================================================================== --- xen-4.7.0-testing.orig/xen/include/public/arch-arm.h +++ xen-4.7.0-testing/xen/include/public/arch-arm.h -@@ -362,13 +362,13 @@ typedef uint64_t xen_callback_t; +@@ -364,13 +364,13 @@ typedef uint64_t xen_callback_t; /* 64 bit modes */ #define PSR_MODE_BIT 0x10 /* Set iff AArch32 */ diff --git a/ipxe.tar.bz2 b/ipxe.tar.bz2 index eb9d603..e1c65b7 100644 --- a/ipxe.tar.bz2 +++ b/ipxe.tar.bz2 @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d1b2833f0d502a5d282da11389fc7e48ef674abf5d47777fbc8f7fcf7d744f57 -size 2877551 +oid sha256:5bc1dcb1e3c4d80009ec4710ff153cd7e0ec792741ad31a5939d828683c9b6b7 +size 2877725 diff --git a/libxl.add-option-to-disable-disk-cache-flushes-in-qdisk.patch b/libxl.add-option-to-disable-disk-cache-flushes-in-qdisk.patch index 62e71a9..466329f 100644 --- a/libxl.add-option-to-disable-disk-cache-flushes-in-qdisk.patch +++ b/libxl.add-option-to-disable-disk-cache-flushes-in-qdisk.patch @@ -11,7 +11,7 @@ Index: xen-4.7.0-testing/tools/libxl/libxl.c =================================================================== --- xen-4.7.0-testing.orig/tools/libxl/libxl.c +++ xen-4.7.0-testing/tools/libxl/libxl.c -@@ -2789,6 +2789,8 @@ static void device_disk_add(libxl__egc * +@@ -2826,6 +2826,8 @@ static void device_disk_add(libxl__egc * flexarray_append_pair(back, "discard-enable", libxl_defbool_val(disk->discard_enable) ? "1" : "0"); @@ -24,7 +24,7 @@ Index: xen-4.7.0-testing/tools/libxl/libxl.h =================================================================== --- xen-4.7.0-testing.orig/tools/libxl/libxl.h +++ xen-4.7.0-testing/tools/libxl/libxl.h -@@ -230,6 +230,18 @@ +@@ -247,6 +247,18 @@ #define LIBXL_HAVE_APIC_ASSIST 1 /* @@ -73,10 +73,10 @@ Index: xen-4.7.0-testing/tools/libxl/libxlu_disk_l.l =================================================================== --- xen-4.7.0-testing.orig/tools/libxl/libxlu_disk_l.l +++ xen-4.7.0-testing/tools/libxl/libxlu_disk_l.l -@@ -176,6 +176,7 @@ script=[^,]*,? { STRIP(','); SAVESTRING( - direct-io-safe,? { DPC->disk->direct_io_safe = 1; } - discard,? { libxl_defbool_set(&DPC->disk->discard_enable, true); } - no-discard,? { libxl_defbool_set(&DPC->disk->discard_enable, false); } +@@ -195,6 +195,7 @@ colo-port=[^,]*,? { STRIP(','); setcolop + colo-export=[^,]*,? { STRIP(','); SAVESTRING("colo-export", colo_export, FROMEQUALS); } + active-disk=[^,]*,? { STRIP(','); SAVESTRING("active-disk", active_disk, FROMEQUALS); } + hidden-disk=[^,]*,? { STRIP(','); SAVESTRING("hidden-disk", hidden_disk, FROMEQUALS); } +suse-diskcache-disable-flush,? { DPC->suse_diskcache_disable_flush = 1; } /* the target magic parameter, eats the rest of the string */ diff --git a/libxl.pvscsi.patch b/libxl.pvscsi.patch index 5d2061c..1be43eb 100644 --- a/libxl.pvscsi.patch +++ b/libxl.pvscsi.patch @@ -76,7 +76,7 @@ Index: xen-4.7.0-testing/docs/man/xl.pod.1 =================================================================== --- xen-4.7.0-testing.orig/docs/man/xl.pod.1 +++ xen-4.7.0-testing/docs/man/xl.pod.1 -@@ -1293,6 +1293,26 @@ List virtual trusted platform modules fo +@@ -1416,6 +1416,26 @@ List virtual trusted platform modules fo =back @@ -107,7 +107,7 @@ Index: xen-4.7.0-testing/tools/libxl/libxl.c =================================================================== --- xen-4.7.0-testing.orig/tools/libxl/libxl.c +++ xen-4.7.0-testing/tools/libxl/libxl.c -@@ -2278,6 +2278,273 @@ int libxl_devid_to_device_vtpm(libxl_ctx +@@ -2299,6 +2299,273 @@ int libxl_devid_to_device_vtpm(libxl_ctx return rc; } @@ -381,7 +381,7 @@ Index: xen-4.7.0-testing/tools/libxl/libxl.c /******************************************************************************/ -@@ -4104,6 +4371,8 @@ out: +@@ -4250,6 +4517,8 @@ out: * libxl_device_vfb_destroy * libxl_device_usbctrl_remove * libxl_device_usbctrl_destroy @@ -390,7 +390,7 @@ Index: xen-4.7.0-testing/tools/libxl/libxl.c */ #define DEFINE_DEVICE_REMOVE_EXT(type, remtype, removedestroy, f) \ int libxl_device_##type##_##removedestroy(libxl_ctx *ctx, \ -@@ -4169,6 +4438,10 @@ DEFINE_DEVICE_REMOVE_CUSTOM(usbctrl, des +@@ -4315,6 +4584,10 @@ DEFINE_DEVICE_REMOVE_CUSTOM(usbctrl, des * 1. add support for secondary consoles to xenconsoled * 2. dynamically add/remove qemu chardevs via qmp messages. */ @@ -401,7 +401,7 @@ Index: xen-4.7.0-testing/tools/libxl/libxl.c #undef DEFINE_DEVICE_REMOVE #undef DEFINE_DEVICE_REMOVE_CUSTOM #undef DEFINE_DEVICE_REMOVE_EXT -@@ -4182,6 +4455,7 @@ DEFINE_DEVICE_REMOVE_CUSTOM(usbctrl, des +@@ -4328,6 +4601,7 @@ DEFINE_DEVICE_REMOVE_CUSTOM(usbctrl, des * libxl_device_vtpm_add * libxl_device_usbctrl_add * libxl_device_usbdev_add @@ -409,7 +409,7 @@ Index: xen-4.7.0-testing/tools/libxl/libxl.c */ #define DEFINE_DEVICE_ADD(type) \ -@@ -4219,6 +4493,9 @@ DEFINE_DEVICE_ADD(usbctrl) +@@ -4365,6 +4639,9 @@ DEFINE_DEVICE_ADD(usbctrl) /* usb */ DEFINE_DEVICE_ADD(usbdev) @@ -419,7 +419,7 @@ Index: xen-4.7.0-testing/tools/libxl/libxl.c #undef DEFINE_DEVICE_ADD /******************************************************************************/ -@@ -6803,6 +7080,20 @@ out: +@@ -7328,6 +7605,20 @@ out: return rc; } @@ -444,7 +444,7 @@ Index: xen-4.7.0-testing/tools/libxl/libxl.h =================================================================== --- xen-4.7.0-testing.orig/tools/libxl/libxl.h +++ xen-4.7.0-testing/tools/libxl/libxl.h -@@ -1658,6 +1658,26 @@ libxl_device_vtpm *libxl_device_vtpm_lis +@@ -1721,6 +1721,26 @@ libxl_device_vtpm *libxl_device_vtpm_lis int libxl_device_vtpm_getinfo(libxl_ctx *ctx, uint32_t domid, libxl_device_vtpm *vtpm, libxl_vtpminfo *vtpminfo); @@ -471,7 +471,7 @@ Index: xen-4.7.0-testing/tools/libxl/libxl.h /* Keyboard */ int libxl_device_vkb_add(libxl_ctx *ctx, uint32_t domid, libxl_device_vkb *vkb, const libxl_asyncop_how *ao_how) -@@ -1966,6 +1986,27 @@ int libxl_fd_set_nonblock(libxl_ctx *ctx +@@ -2063,6 +2083,27 @@ int libxl_fd_set_nonblock(libxl_ctx *ctx #include @@ -503,7 +503,7 @@ Index: xen-4.7.0-testing/tools/libxl/libxl_create.c =================================================================== --- xen-4.7.0-testing.orig/tools/libxl/libxl_create.c +++ xen-4.7.0-testing/tools/libxl/libxl_create.c -@@ -1164,6 +1164,7 @@ static void domcreate_rebuild_done(libxl +@@ -1227,6 +1227,7 @@ static void domcreate_rebuild_done(libxl libxl__multidev_begin(ao, &dcs->multidev); dcs->multidev.callback = domcreate_launch_dm; libxl__add_disks(egc, ao, domid, d_config, &dcs->multidev); @@ -515,7 +515,7 @@ Index: xen-4.7.0-testing/tools/libxl/libxl_device.c =================================================================== --- xen-4.7.0-testing.orig/tools/libxl/libxl_device.c +++ xen-4.7.0-testing/tools/libxl/libxl_device.c -@@ -543,6 +543,7 @@ void libxl__multidev_prepared(libxl__egc +@@ -616,6 +616,7 @@ void libxl__multidev_prepared(libxl__egc * The following functions are defined: * libxl__add_disks * libxl__add_nics @@ -523,7 +523,7 @@ Index: xen-4.7.0-testing/tools/libxl/libxl_device.c * libxl__add_vtpms * libxl__add_usbctrls * libxl__add_usbs -@@ -567,9 +568,31 @@ DEFINE_DEVICES_ADD(nic) +@@ -640,9 +641,31 @@ DEFINE_DEVICES_ADD(nic) DEFINE_DEVICES_ADD(vtpm) DEFINE_DEVICES_ADD(usbctrl) DEFINE_DEVICES_ADD(usbdev) @@ -559,15 +559,15 @@ Index: xen-4.7.0-testing/tools/libxl/libxl_internal.h =================================================================== --- xen-4.7.0-testing.orig/tools/libxl/libxl_internal.h +++ xen-4.7.0-testing/tools/libxl/libxl_internal.h -@@ -1206,6 +1206,7 @@ _hidden int libxl__device_nic_setdefault - uint32_t domid, - libxl_domain_build_info *info); +@@ -1219,6 +1219,7 @@ _hidden int libxl__device_disk_setdefaul + _hidden int libxl__device_nic_setdefault(libxl__gc *gc, libxl_device_nic *nic, + uint32_t domid); _hidden int libxl__device_vtpm_setdefault(libxl__gc *gc, libxl_device_vtpm *vtpm); +_hidden int libxl__device_vscsi_setdefault(libxl__gc *gc, libxl_device_vscsi *vscsi); _hidden int libxl__device_vfb_setdefault(libxl__gc *gc, libxl_device_vfb *vfb); _hidden int libxl__device_vkb_setdefault(libxl__gc *gc, libxl_device_vkb *vkb); _hidden int libxl__device_pci_setdefault(libxl__gc *gc, libxl_device_pci *pci); -@@ -2593,6 +2594,10 @@ _hidden void libxl__device_usbdev_add(li +@@ -2638,6 +2639,10 @@ _hidden void libxl__device_usbdev_add(li libxl_device_usbdev *usbdev, libxl__ao_device *aodev); @@ -578,7 +578,7 @@ Index: xen-4.7.0-testing/tools/libxl/libxl_internal.h /* Internal function to connect a vkb device */ _hidden int libxl__device_vkb_add(libxl__gc *gc, uint32_t domid, libxl_device_vkb *vkb); -@@ -3358,6 +3363,10 @@ _hidden void libxl__add_usbdevs(libxl__e +@@ -3496,6 +3501,10 @@ _hidden void libxl__add_usbdevs(libxl__e uint32_t domid, libxl_domain_config *d_config, libxl__multidev *multidev); @@ -593,7 +593,7 @@ Index: xen-4.7.0-testing/tools/libxl/libxl_types.idl =================================================================== --- xen-4.7.0-testing.orig/tools/libxl/libxl_types.idl +++ xen-4.7.0-testing/tools/libxl/libxl_types.idl -@@ -666,6 +666,26 @@ libxl_device_channel = Struct("device_ch +@@ -696,6 +696,26 @@ libxl_device_channel = Struct("device_ch ])), ]) @@ -620,7 +620,7 @@ Index: xen-4.7.0-testing/tools/libxl/libxl_types.idl libxl_domain_config = Struct("domain_config", [ ("c_info", libxl_domain_create_info), ("b_info", libxl_domain_build_info), -@@ -683,6 +703,8 @@ libxl_domain_config = Struct("domain_con +@@ -713,6 +733,8 @@ libxl_domain_config = Struct("domain_con ("channels", Array(libxl_device_channel, "num_channels")), ("usbctrls", Array(libxl_device_usbctrl, "num_usbctrls")), ("usbdevs", Array(libxl_device_usbdev, "num_usbdevs")), @@ -629,7 +629,7 @@ Index: xen-4.7.0-testing/tools/libxl/libxl_types.idl ("on_poweroff", libxl_action_on_shutdown), ("on_reboot", libxl_action_on_shutdown), -@@ -741,6 +763,28 @@ libxl_usbctrlinfo = Struct("usbctrlinfo" +@@ -771,6 +793,28 @@ libxl_usbctrlinfo = Struct("usbctrlinfo" ("ref_conn", integer), ], dir=DIR_OUT) @@ -662,11 +662,11 @@ Index: xen-4.7.0-testing/tools/libxl/libxl_types_internal.idl =================================================================== --- xen-4.7.0-testing.orig/tools/libxl/libxl_types_internal.idl +++ xen-4.7.0-testing/tools/libxl/libxl_types_internal.idl -@@ -23,6 +23,7 @@ libxl__device_kind = Enumeration("device - (7, "CONSOLE"), +@@ -24,6 +24,7 @@ libxl__device_kind = Enumeration("device (8, "VTPM"), (9, "VUSB"), -+ (10, "VSCSI"), + (10, "QUSB"), ++ (11, "VSCSI"), ]) libxl__console_backend = Enumeration("console_backend", [ @@ -704,7 +704,7 @@ Index: xen-4.7.0-testing/tools/libxl/xl_cmdimpl.c #include #include "libxl.h" -@@ -633,6 +635,122 @@ static void set_default_nic_values(libxl +@@ -635,6 +637,122 @@ static void set_default_nic_values(libxl } } @@ -827,7 +827,7 @@ Index: xen-4.7.0-testing/tools/libxl/xl_cmdimpl.c static void split_string_into_string_list(const char *str, const char *delim, libxl_string_list *psl) -@@ -1322,7 +1440,7 @@ static void parse_config_data(const char +@@ -1326,7 +1444,7 @@ static void parse_config_data(const char XLU_Config *config; XLU_ConfigList *cpus, *vbds, *nics, *pcis, *cvfbs, *cpuids, *vtpms, *usbctrls, *usbdevs; @@ -836,7 +836,7 @@ Index: xen-4.7.0-testing/tools/libxl/xl_cmdimpl.c int num_ioports, num_irqs, num_iomem, num_cpus, num_viridian; int pci_power_mgmt = 0; int pci_msitranslate = 0; -@@ -1851,6 +1969,66 @@ static void parse_config_data(const char +@@ -1855,6 +1973,66 @@ static void parse_config_data(const char } } @@ -903,7 +903,7 @@ Index: xen-4.7.0-testing/tools/libxl/xl_cmdimpl.c if (!xlu_cfg_get_list(config, "vtpm", &vtpms, 0, 0)) { d_config->num_vtpms = 0; d_config->vtpms = NULL; -@@ -7058,6 +7236,256 @@ int main_blockdetach(int argc, char **ar +@@ -7412,6 +7590,256 @@ int main_blockdetach(int argc, char **ar return rc; } @@ -1164,7 +1164,7 @@ Index: xen-4.7.0-testing/tools/libxl/xl_cmdtable.c =================================================================== --- xen-4.7.0-testing.orig/tools/libxl/xl_cmdtable.c +++ xen-4.7.0-testing/tools/libxl/xl_cmdtable.c -@@ -351,6 +351,21 @@ struct cmd_spec cmd_table[] = { +@@ -354,6 +354,21 @@ struct cmd_spec cmd_table[] = { "Destroy a domain's virtual block device", " ", }, diff --git a/magic_ioport_compat.patch b/magic_ioport_compat.patch index 1d9db7b..0f8af2a 100644 --- a/magic_ioport_compat.patch +++ b/magic_ioport_compat.patch @@ -2,11 +2,11 @@ Make our PV drivers work with older hosts that do not recognize the new PV driv Signed-off-by: K. Y. Srinivasan -Index: xen-4.6.0-testing/unmodified_drivers/linux-2.6/platform-pci/platform-pci.c +Index: xen-4.7.0-testing/unmodified_drivers/linux-2.6/platform-pci/platform-pci.c =================================================================== ---- xen-4.6.0-testing.orig/unmodified_drivers/linux-2.6/platform-pci/platform-pci.c -+++ xen-4.6.0-testing/unmodified_drivers/linux-2.6/platform-pci/platform-pci.c -@@ -336,7 +336,10 @@ static int check_platform_magic(struct d +--- xen-4.7.0-testing.orig/unmodified_drivers/linux-2.6/platform-pci/platform-pci.c ++++ xen-4.7.0-testing/unmodified_drivers/linux-2.6/platform-pci/platform-pci.c +@@ -337,7 +337,10 @@ static int check_platform_magic(struct d if (magic != XEN_IOPORT_MAGIC_VAL) { err = "unrecognised magic value"; diff --git a/qemu-xen-traditional-dir-remote.tar.bz2 b/qemu-xen-traditional-dir-remote.tar.bz2 index 36a6a16..dd0aaf9 100644 --- a/qemu-xen-traditional-dir-remote.tar.bz2 +++ b/qemu-xen-traditional-dir-remote.tar.bz2 @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e4222728bdf6f6aa97d081e0f51074cb33d7da3e4b49b4071ba8766c0496c4ef -size 3236984 +oid sha256:941d427153a9d2bff090a23117ba43a0cb9f30dee252819edb7e967db07ccab0 +size 3236120 diff --git a/stdvga-cache.patch b/stdvga-cache.patch index 822da51..7e3ee7f 100644 --- a/stdvga-cache.patch +++ b/stdvga-cache.patch @@ -1,8 +1,8 @@ -Index: xen-4.6.1-testing/xen/arch/x86/hvm/stdvga.c +Index: xen-4.7.0-testing/xen/arch/x86/hvm/stdvga.c =================================================================== ---- xen-4.6.1-testing.orig/xen/arch/x86/hvm/stdvga.c -+++ xen-4.6.1-testing/xen/arch/x86/hvm/stdvga.c -@@ -166,7 +166,10 @@ static int stdvga_outb(uint64_t addr, ui +--- xen-4.7.0-testing.orig/xen/arch/x86/hvm/stdvga.c ++++ xen-4.7.0-testing/xen/arch/x86/hvm/stdvga.c +@@ -167,7 +167,10 @@ static int stdvga_outb(uint64_t addr, ui /* When in standard vga mode, emulate here all writes to the vram buffer * so we can immediately satisfy reads without waiting for qemu. */ diff --git a/stubdom.tar.bz2 b/stubdom.tar.bz2 index 52da7bb..16aec4d 100644 --- a/stubdom.tar.bz2 +++ b/stubdom.tar.bz2 @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:510ee7906630b096e522ce0bbf26e89c201a0fe33441df9a8114e8f8cb84b189 -size 17477234 +oid sha256:e6879a00cce1f705fa881fa38c707773f03c35e0dc30d5728e3f095157a6bc24 +size 17477288 diff --git a/x86-cpufreq-report.patch b/x86-cpufreq-report.patch index cc9dfa9..90b2f8e 100644 --- a/x86-cpufreq-report.patch +++ b/x86-cpufreq-report.patch @@ -1,7 +1,7 @@ -Index: xen-4.6.0-testing/xen/arch/x86/platform_hypercall.c +Index: xen-4.7.0-testing/xen/arch/x86/platform_hypercall.c =================================================================== ---- xen-4.6.0-testing.orig/xen/arch/x86/platform_hypercall.c -+++ xen-4.6.0-testing/xen/arch/x86/platform_hypercall.c +--- xen-4.7.0-testing.orig/xen/arch/x86/platform_hypercall.c ++++ xen-4.7.0-testing/xen/arch/x86/platform_hypercall.c @@ -26,7 +26,7 @@ #include #include @@ -11,7 +11,7 @@ Index: xen-4.6.0-testing/xen/arch/x86/platform_hypercall.c #include #include #include -@@ -825,6 +825,41 @@ ret_t do_platform_op(XEN_GUEST_HANDLE_PA +@@ -819,6 +819,41 @@ ret_t do_platform_op(XEN_GUEST_HANDLE_PA ret = -EFAULT; } break; @@ -53,10 +53,10 @@ Index: xen-4.6.0-testing/xen/arch/x86/platform_hypercall.c default: ret = -ENOSYS; -Index: xen-4.6.0-testing/xen/include/public/platform.h +Index: xen-4.7.0-testing/xen/include/public/platform.h =================================================================== ---- xen-4.6.0-testing.orig/xen/include/public/platform.h -+++ xen-4.6.0-testing/xen/include/public/platform.h +--- xen-4.7.0-testing.orig/xen/include/public/platform.h ++++ xen-4.7.0-testing/xen/include/public/platform.h @@ -547,6 +547,16 @@ struct xenpf_core_parking { typedef struct xenpf_core_parking xenpf_core_parking_t; DEFINE_XEN_GUEST_HANDLE(xenpf_core_parking_t); diff --git a/x86-ioapic-ack-default.patch b/x86-ioapic-ack-default.patch index 700c1c0..b362045 100644 --- a/x86-ioapic-ack-default.patch +++ b/x86-ioapic-ack-default.patch @@ -1,10 +1,10 @@ Change default IO-APIC ack mode for single IO-APIC systems to old-style. -Index: xen-4.5.0-testing/xen/arch/x86/io_apic.c +Index: xen-4.7.0-testing/xen/arch/x86/io_apic.c =================================================================== ---- xen-4.5.0-testing.orig/xen/arch/x86/io_apic.c -+++ xen-4.5.0-testing/xen/arch/x86/io_apic.c -@@ -2035,7 +2035,10 @@ void __init setup_IO_APIC(void) +--- xen-4.7.0-testing.orig/xen/arch/x86/io_apic.c ++++ xen-4.7.0-testing/xen/arch/x86/io_apic.c +@@ -2030,7 +2030,10 @@ void __init setup_IO_APIC(void) io_apic_irqs = ~PIC_IRQS; printk("ENABLING IO-APIC IRQs\n"); diff --git a/xen-4.7.0-testing-src.tar.bz2 b/xen-4.7.0-testing-src.tar.bz2 index ffd9a24..4527063 100644 --- a/xen-4.7.0-testing-src.tar.bz2 +++ b/xen-4.7.0-testing-src.tar.bz2 @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:06f60bae6de030ff284a995b951148f3d47a795feb4fbb64092bdd12ec3446cd -size 4363009 +oid sha256:458f600be1d287e71fd349df83b3f4c47dd8fff9ecc0f770509434ce7f5511cb +size 4409813 diff --git a/xen.changes b/xen.changes index b69ccbe..21e787b 100644 --- a/xen.changes +++ b/xen.changes @@ -1,3 +1,28 @@ +------------------------------------------------------------------- +Fri Apr 1 20:14:38 UTC 2016 - jfehlig@suse.com + +- Add patches from proposed upstream series to load BIOS's from + the toolstack instead of embedding in hvmloader + http://lists.xenproject.org/archives/html/xen-devel/2016-03/msg01626.html + 0001-libxc-Rework-extra-module-initialisation.patch, + 0002-libxc-Prepare-a-start-info-structure-for-hvmloader.patch, + 0003-configure-define-SEABIOS_PATH-and-OVMF_PATH.patch, + 0004-firmware-makefile-install-BIOS-blob.patch, + 0005-libxl-Load-guest-BIOS-from-file.patch, + 0006-xen-Move-the-hvm_start_info-C-representation-from-li.patch, + 0007-hvmloader-Grab-the-hvm_start_info-pointer.patch, + 0008-hvmloader-Locate-the-BIOS-blob.patch, + 0009-hvmloader-Check-modules-whereabouts-in-perform_tests.patch, + 0010-hvmloader-Load-SeaBIOS-from-hvm_start_info-modules.patch, + 0011-hvmloader-Load-OVMF-from-modules.patch, + 0012-hvmloader-Specific-bios_load-function-required.patch, + 0013-hvmloader-Always-build-in-SeaBIOS-and-OVMF-loader.patch, + 0014-configure-do-not-depend-on-SEABIOS_PATH-or-OVMF_PATH.patch +- Enable support for UEFI on x86_64 using the ovmf-x86_64-ms.bin + firmware from qemu-ovmf-x86_64. The firmware is preloaded with + Microsoft keys to more closely resemble firmware on real hardware + FATE#320490 + ------------------------------------------------------------------- Fri Mar 25 14:46:11 MDT 2016 - carnold@suse.com diff --git a/xen.libxl.dmmd.patch b/xen.libxl.dmmd.patch index c1819a9..4baeeeb 100644 --- a/xen.libxl.dmmd.patch +++ b/xen.libxl.dmmd.patch @@ -11,7 +11,7 @@ Index: xen-4.7.0-testing/tools/libxl/libxl.c =================================================================== --- xen-4.7.0-testing.orig/tools/libxl/libxl.c +++ xen-4.7.0-testing/tools/libxl/libxl.c -@@ -2748,6 +2748,10 @@ static void device_disk_add(libxl__egc * +@@ -2773,6 +2773,10 @@ static void device_disk_add(libxl__egc * /* now create a phy device to export the device to the guest */ goto do_backend_phy; case LIBXL_DISK_BACKEND_QDISK: @@ -26,7 +26,7 @@ Index: xen-4.7.0-testing/tools/libxl/libxl_device.c =================================================================== --- xen-4.7.0-testing.orig/tools/libxl/libxl_device.c +++ xen-4.7.0-testing/tools/libxl/libxl_device.c -@@ -235,7 +235,8 @@ static int disk_try_backend(disk_try_bac +@@ -240,7 +240,8 @@ static int disk_try_backend(disk_try_bac return backend; case LIBXL_DISK_BACKEND_QDISK: @@ -40,8 +40,8 @@ Index: xen-4.7.0-testing/tools/libxl/libxl_dm.c =================================================================== --- xen-4.7.0-testing.orig/tools/libxl/libxl_dm.c +++ xen-4.7.0-testing/tools/libxl/libxl_dm.c -@@ -751,6 +751,30 @@ static int libxl__dm_runas_helper(libxl_ - } +@@ -887,6 +887,30 @@ static char *qemu_disk_ide_drive_string( + return drive; } +static void libxl__suse_node_to_path(libxl__gc *gc, int domid, const libxl_device_disk *dp, const char **pdev_path) @@ -71,43 +71,33 @@ Index: xen-4.7.0-testing/tools/libxl/libxl_dm.c static int libxl__build_device_model_args_new(libxl__gc *gc, const char *dm, int guest_domid, const libxl_domain_config *guest_config, -@@ -1169,7 +1193,9 @@ static int libxl__build_device_model_arg +@@ -1308,9 +1332,11 @@ static int libxl__build_device_model_arg libxl__device_disk_dev_number(disks[i].vdev, &disk, &part); - const char *format = qemu_disk_format_string(disks[i].format); + const char *format; char *drive; -- const char *pdev_path; -+ const char *pdev_path = disks[i].pdev_path; -+ -+ libxl__suse_node_to_path(gc, guest_domid, disks + i, &pdev_path); +- const char *target_path = NULL; ++ const char *target_path = disks[i].pdev_path; + int colo_mode; ++ libxl__suse_node_to_path(gc, guest_domid, disks + i, &target_path); ++ if (dev_number == -1) { LOG(WARN, "unable to determine"" disk number for %s", -@@ -1185,7 +1211,7 @@ static int libxl__build_device_model_arg + disks[i].vdev); +@@ -1351,7 +1377,7 @@ static int libxl__build_device_model_arg + * the bootloader path. + */ + if (disks[i].backend == LIBXL_DISK_BACKEND_TAP) +- target_path = libxl__blktap_devpath(gc, disks[i].pdev_path, ++ target_path = libxl__blktap_devpath(gc, target_path, + disks[i].format); else - drive = libxl__sprintf - (gc, "file=%s,if=ide,index=%d,readonly=%s,media=cdrom,format=%s,cache=writeback,id=ide-%i", -- disks[i].pdev_path, disk, disks[i].readwrite ? "off" : "on", format, dev_number); -+ pdev_path, disk, disks[i].readwrite ? "off" : "on", format, dev_number); - } else { - if (disks[i].format == LIBXL_DISK_FORMAT_EMPTY) { - LOG(WARN, "cannot support"" empty disk format for %s", -@@ -1202,10 +1228,8 @@ static int libxl__build_device_model_arg - - if (disks[i].backend == LIBXL_DISK_BACKEND_TAP) { - format = qemu_disk_format_string(LIBXL_DISK_FORMAT_RAW); -- pdev_path = libxl__blktap_devpath(gc, disks[i].pdev_path, -+ pdev_path = libxl__blktap_devpath(gc, pdev_path, - disks[i].format); -- } else { -- pdev_path = disks[i].pdev_path; - } - - /* + target_path = libxl__device_disk_find_local_path(gc, Index: xen-4.7.0-testing/tools/libxl/libxlu_disk_l.l =================================================================== --- xen-4.7.0-testing.orig/tools/libxl/libxlu_disk_l.l +++ xen-4.7.0-testing/tools/libxl/libxlu_disk_l.l -@@ -209,6 +209,8 @@ target=.* { STRIP(','); SAVESTRING("targ +@@ -228,6 +228,8 @@ target=.* { STRIP(','); SAVESTRING("targ free(newscript); } diff --git a/xen.spec b/xen.spec index a15d23a..5639d2f 100644 --- a/xen.spec +++ b/xen.spec @@ -89,6 +89,10 @@ BuildRequires: libfdt1-devel BuildRequires: dev86 %endif #!BuildIgnore: gcc-PIE +# JWF: Until Anthony's series to load BIOS via toolstack is merged, +# autoconf is needed by autogen.sh. +# http://lists.xenproject.org/archives/html/xen-devel/2016-03/msg01626.html +BuildRequires: autoconf BuildRequires: bison BuildRequires: fdupes BuildRequires: figlet @@ -100,10 +104,6 @@ BuildRequires: libpixman-1-0-devel BuildRequires: libuuid-devel BuildRequires: libxml2-devel BuildRequires: libyajl-devel -# JWF: Temporary until we move to Xen 4.7 and Anthony' series to load -# firmwares from toolstack -# http://lists.xenproject.org/archives/html/xen-devel/2016-03/msg01626.html -BuildRequires: qemu-seabios %if %{?with_qemu_traditional}0 BuildRequires: SDL-devel BuildRequires: pciutils-devel @@ -286,6 +286,22 @@ Patch602: xen.build-compare.man.patch Patch603: ipxe-no-error-logical-not-parentheses.patch Patch604: ipxe-use-rpm-opt-flags.patch Patch605: gcc6-warnings-as-errors.patch +# Anthony's "load BIOS via toolstack" patches +# http://lists.xenproject.org/archives/html/xen-devel/2016-03/msg01626.html +Patch700: 0001-libxc-Rework-extra-module-initialisation.patch +Patch701: 0002-libxc-Prepare-a-start-info-structure-for-hvmloader.patch +Patch702: 0003-configure-define-SEABIOS_PATH-and-OVMF_PATH.patch +Patch703: 0004-firmware-makefile-install-BIOS-blob.patch +Patch704: 0005-libxl-Load-guest-BIOS-from-file.patch +Patch705: 0006-xen-Move-the-hvm_start_info-C-representation-from-li.patch +Patch706: 0007-hvmloader-Grab-the-hvm_start_info-pointer.patch +Patch707: 0008-hvmloader-Locate-the-BIOS-blob.patch +Patch708: 0009-hvmloader-Check-modules-whereabouts-in-perform_tests.patch +Patch709: 0010-hvmloader-Load-SeaBIOS-from-hvm_start_info-modules.patch +Patch710: 0011-hvmloader-Load-OVMF-from-modules.patch +Patch711: 0012-hvmloader-Specific-bios_load-function-required.patch +Patch712: 0013-hvmloader-Always-build-in-SeaBIOS-and-OVMF-loader.patch +Patch713: 0014-configure-do-not-depend-on-SEABIOS_PATH-or-OVMF_PATH.patch # Build patches Patch99996: xen.stubdom.newlib.patch Patch99998: tmp_build.patch @@ -376,12 +392,12 @@ Requires: bridge-utils %if %suse_version >= 1315 Requires: grub2-x86_64-xen %endif +Requires: qemu-ovmf-x86_64 Requires: qemu-x86 %endif %ifarch %arm aarch64 Requires: qemu-arm %endif -Requires: qemu-seabios Requires: multipath-tools Requires: python Requires: python-curses @@ -389,6 +405,7 @@ Requires: python-lxml Requires: python-openssl Requires: python-pam Requires: python-xml +Requires: qemu-seabios Requires: xen-libs = %{version} # subpackage existed in 10.3 Provides: xen-tools-ioemu = %{version} @@ -585,11 +602,31 @@ Authors: %patch603 -p1 %patch604 -p1 %patch605 -p1 +# Anthony's "load BIOS via toolstack" patches +# http://lists.xenproject.org/archives/html/xen-devel/2016-03/msg01626.html +%patch700 -p1 +%patch701 -p1 +%patch702 -p1 +%patch703 -p1 +%patch704 -p1 +%patch705 -p1 +%patch706 -p1 +%patch707 -p1 +%patch708 -p1 +%patch709 -p1 +%patch710 -p1 +%patch711 -p1 +%patch712 -p1 +%patch713 -p1 # Build patches %patch99996 -p1 %patch99998 -p1 %build +# JWF: Anthony's series to load BIOS from toolstack requires autogen.sh. +# http://lists.xenproject.org/archives/html/xen-devel/2016-03/msg01626.html +./autogen.sh + # we control the version info of this package # to gain control of filename of xen.gz XEN_VERSION=%{version} @@ -680,6 +717,7 @@ configure_flags="${configure_flags} --disable-qemu-traditional" %else --disable-systemd \ %endif + --with-system-ovmf=%{_datadir}/qemu/ovmf-x86_64-ms.bin \ --with-system-seabios=%{_datadir}/qemu/bios-256k.bin \ --with-system-qemu=%{_bindir}/qemu-system-%{_arch} \ ${configure_flags} @@ -959,6 +997,7 @@ rm -f $RPM_BUILD_ROOT/usr/libexec/qemu-bridge-helper #%endif /usr/bin/xencov_split /usr/bin/xentrace_format +/usr/bin/xen-cpuid /usr/sbin/tap* /usr/sbin/xenbaked /usr/sbin/xenconsoled @@ -1021,6 +1060,7 @@ rm -f $RPM_BUILD_ROOT/usr/libexec/qemu-bridge-helper /etc/xen/scripts/xen-hotplug-* /etc/xen/scripts/xen-network-common.sh /etc/xen/scripts/xen-script-common.sh +/etc/xen/scripts/colo-proxy-setup %{_libexecdir}/xen /var/adm/fillup-templates/sysconfig.pciback /var/adm/fillup-templates/sysconfig.xencommons diff --git a/xen.stubdom.newlib.patch b/xen.stubdom.newlib.patch index cea0d71..3d97245 100644 --- a/xen.stubdom.newlib.patch +++ b/xen.stubdom.newlib.patch @@ -24,10 +24,10 @@ E: xen no-return-in-nonvoid-function ../../../../newlib-1.16.0/libgloss/i386/cyg Signed-off-by: Olaf Hering -Index: xen-4.6.0-testing/stubdom/Makefile +Index: xen-4.7.0-testing/stubdom/Makefile =================================================================== ---- xen-4.6.0-testing.orig/stubdom/Makefile -+++ xen-4.6.0-testing/stubdom/Makefile +--- xen-4.7.0-testing.orig/stubdom/Makefile ++++ xen-4.7.0-testing/stubdom/Makefile @@ -80,6 +80,8 @@ newlib-$(NEWLIB_VERSION): newlib-$(NEWLI patch -d $@ -p0 < newlib.patch patch -d $@ -p0 < newlib-chk.patch @@ -37,10 +37,10 @@ Index: xen-4.6.0-testing/stubdom/Makefile find $@ -type f | xargs perl -i.bak \ -pe 's/\b_(tzname|daylight|timezone)\b/$$1/g' touch $@ -Index: xen-4.6.0-testing/stubdom/newlib-cygmon-gmon.patch +Index: xen-4.7.0-testing/stubdom/newlib-cygmon-gmon.patch =================================================================== --- /dev/null -+++ xen-4.6.0-testing/stubdom/newlib-cygmon-gmon.patch ++++ xen-4.7.0-testing/stubdom/newlib-cygmon-gmon.patch @@ -0,0 +1,60 @@ + +I: A function uses a 'return;' statement, but has actually a value @@ -102,10 +102,10 @@ Index: xen-4.6.0-testing/stubdom/newlib-cygmon-gmon.patch + moncontrol(mode) + int mode; + { -Index: xen-4.6.0-testing/stubdom/newlib-makedoc.patch +Index: xen-4.7.0-testing/stubdom/newlib-makedoc.patch =================================================================== --- /dev/null -+++ xen-4.6.0-testing/stubdom/newlib-makedoc.patch ++++ xen-4.7.0-testing/stubdom/newlib-makedoc.patch @@ -0,0 +1,10 @@ +--- newlib-1.16.0/newlib/doc/makedoc.c.orig 2015-04-08 11:56:39.283090914 +0200 ++++ newlib-1.16.0/newlib/doc/makedoc.c 2015-04-08 11:56:51.245227742 +0200 diff --git a/xen_pvonhvm.xen_emul_unplug.patch b/xen_pvonhvm.xen_emul_unplug.patch index 952e735..30ec7bb 100644 --- a/xen_pvonhvm.xen_emul_unplug.patch +++ b/xen_pvonhvm.xen_emul_unplug.patch @@ -9,11 +9,11 @@ what was requested. Kernel cmdline option is prefered over module option. unmodified_drivers/linux-2.6/platform-pci/platform-pci.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) -Index: xen-4.6.0-testing/unmodified_drivers/linux-2.6/platform-pci/platform-pci.c +Index: xen-4.7.0-testing/unmodified_drivers/linux-2.6/platform-pci/platform-pci.c =================================================================== ---- xen-4.6.0-testing.orig/unmodified_drivers/linux-2.6/platform-pci/platform-pci.c -+++ xen-4.6.0-testing/unmodified_drivers/linux-2.6/platform-pci/platform-pci.c -@@ -38,6 +38,9 @@ +--- xen-4.7.0-testing.orig/unmodified_drivers/linux-2.6/platform-pci/platform-pci.c ++++ xen-4.7.0-testing/unmodified_drivers/linux-2.6/platform-pci/platform-pci.c +@@ -39,6 +39,9 @@ #include #include #include @@ -23,7 +23,7 @@ Index: xen-4.6.0-testing/unmodified_drivers/linux-2.6/platform-pci/platform-pci. #ifdef __ia64__ #include #endif -@@ -289,6 +292,18 @@ static int check_platform_magic(struct d +@@ -290,6 +293,18 @@ static int check_platform_magic(struct d short magic, unplug = 0; char protocol, *p, *q, *err;