diff --git a/recipes-extended/xen/files/fix-nesting-1.patch b/recipes-extended/xen/files/fix-nesting-1.patch new file mode 100644 index 0000000000..90191bcbf3 --- /dev/null +++ b/recipes-extended/xen/files/fix-nesting-1.patch @@ -0,0 +1,23 @@ +Index: xen-4.6.4/xen/arch/x86/hvm/vmx/vvmx.c +=================================================================== +--- xen-4.6.4.orig/xen/arch/x86/hvm/vmx/vvmx.c ++++ xen-4.6.4/xen/arch/x86/hvm/vmx/vvmx.c +@@ -1914,6 +1914,7 @@ int nvmx_msr_read_intercept(unsigned int + /* 1-seetings */ + data = PIN_BASED_EXT_INTR_MASK | + PIN_BASED_NMI_EXITING | ++ PIN_BASED_VIRTUAL_NMIS | + PIN_BASED_PREEMPT_TIMER; + data = gen_vmx_msr(data, VMX_PINBASED_CTLS_DEFAULT1, host_data); + break; +@@ -2278,8 +2279,10 @@ int nvmx_n2_vmexit_handler(struct cpu_us + if ( !++port ) + nvcpu->nv_vmexit_pending = 1; + } while ( !nvcpu->nv_vmexit_pending ); ++#if 0 + if ( !nvcpu->nv_vmexit_pending ) + printk(XENLOG_G_WARNING "L0 PIO %04x\n", port); ++#endif + } + else if ( ctrl & CPU_BASED_UNCOND_IO_EXITING ) + nvcpu->nv_vmexit_pending = 1; diff --git a/recipes-extended/xen/files/fix-nesting-2.patch b/recipes-extended/xen/files/fix-nesting-2.patch new file mode 100644 index 0000000000..91e2433e32 --- /dev/null +++ b/recipes-extended/xen/files/fix-nesting-2.patch @@ -0,0 +1,151 @@ +Index: xen-4.6.4/xen/arch/x86/mm/p2m.c +=================================================================== +--- xen-4.6.4.orig/xen/arch/x86/mm/p2m.c ++++ xen-4.6.4/xen/arch/x86/mm/p2m.c +@@ -2024,6 +2024,128 @@ p2m_get_p2m(struct vcpu *v) + return p2m_get_nestedp2m(v, nhvm_vcpu_p2m_base(v)); + } + ++ ++ ++static unsigned long paging_get_l1_pfn_from_l2_pa(struct vcpu *v, unsigned long l2_pa) ++{ ++ unsigned long l1_pfn; ++ ++ unsigned int page_order; ++ uint8_t ept_p2m_acc; ++ uint64_t exit_qual; ++ uint32_t exit_reason; ++ ++ /* BUG: We use access 0 here - but EPT requires we check the RWX/US from pfec*/ ++ ++ if (nept_translate_l2ga(v,l2_pa & PAGE_MASK, ++ &page_order, 0, &l1_pfn, &ept_p2m_acc, ++ &exit_qual, &exit_reason) != EPT_TRANSLATE_SUCCEED) ++ return INVALID_GFN; ++ ++ ++ return l1_pfn; ++} ++ ++ ++static int paging_read_l2_entry(struct vcpu *v, unsigned long l2_pa, uint64_t * entry) ++{ ++ void *page; ++ void *pte; ++ unsigned long l1_pfn; ++ ++ ++l1_pfn = paging_get_l1_pfn_from_l2_pa(v,l2_pa); ++if (l1_pfn == INVALID_GFN) return 1; ++ ++ pte = page = hvm_map_guest_frame_ro (l1_pfn, 0); ++ if (!page) { ++ *entry = ~0ULL; ++ return 1; ++ } ++ ++ pte += l2_pa & ~PAGE_MASK; ++ ++ memcpy (entry, pte, sizeof (pte)); ++ ++ hvm_unmap_guest_frame (page, 0); ++ ++ return 0; ++} ++ ++static unsigned int paging_get_l2_pa_from_l2_va(struct vcpu *v,unsigned long l2_va, unsigned long *l2_pa) ++{ ++ /* God awful hacked up code - doesn't check permisions, and only works in LM */ ++ unsigned long l2_cr3=v->arch.hvm_vcpu.guest_cr[3]; ++ ++ uint64_t pml4e_addr; ++ uint64_t pml4e; ++ ++ uint64_t pdpte_addr; ++ uint64_t pdpte; ++ ++ uint64_t pde_addr; ++ uint64_t pde; ++ ++ uint64_t pte_addr; ++ uint64_t pte; ++ ++ ++ pml4e_addr = l2_cr3 & 0xffffffffff000ULL; ++ pml4e_addr |= (l2_va >> 36) & 0xff8; ++ ++ if (paging_read_l2_entry (v, pml4e_addr, &pml4e)) ++ return 1; ++ ++ pdpte_addr = pml4e & 0xffffffffff000ULL; ++ pdpte_addr |= (l2_va >> 27) & 0xff8; ++ ++ if (paging_read_l2_entry (v, pdpte_addr, &pdpte)) ++ return 1;; ++ ++ if (pdpte & 0x80) { ++ (*l2_pa) = pdpte & 0xffffffffff000ULL; ++ (*l2_pa) |= l2_va & 0x3FFFFFFF; ++ return 0; ++ } ++ ++ pde_addr = pdpte & 0xffffffffff000ULL; ++ pde_addr |= (l2_va >> 18) & 0xff8; ++ ++ if (paging_read_l2_entry (v, pde_addr, &pde)) ++ return 1; ++ ++ if (pde & 0x80) ++ { ++ (*l2_pa) = pde & 0xffffffffff000ULL; ++ (*l2_pa) |= l2_va & 0x1FFFFF; ++ return 0; ++ } ++ ++ pte_addr = pde & 0xffffffffff000ULL; ++ pte_addr |= (l2_va >> 9) & 0xff8; ++ ++ if (paging_read_l2_entry (v, pte_addr, &pte)) ++ return 1; ++ ++ (*l2_pa) = pte & 0xffffffffff000ULL; ++ (*l2_pa) |= l2_va & 0xFFF; ++ ++ return 0; ++} ++ ++ ++static unsigned long paging_get_l1_pfn_from_l2_va(struct vcpu *v, unsigned long va,uint32_t *pfec) ++{ ++ /* BUG: We dont check access either EPT or the L2 guest page tables */ ++ ++ uint64_t l2_pa; ++ ++if (paging_get_l2_pa_from_l2_va(v,va,&l2_pa)) ++ return INVALID_GFN; ++ ++return paging_get_l1_pfn_from_l2_pa(v,l2_pa); ++} ++ + unsigned long paging_gva_to_gfn(struct vcpu *v, + unsigned long va, + uint32_t *pfec) +@@ -2033,6 +2155,7 @@ unsigned long paging_gva_to_gfn(struct v + + if ( is_hvm_vcpu(v) && paging_mode_hap(v->domain) && nestedhvm_is_n2(v) ) + { ++#if 0 + unsigned long l2_gfn, l1_gfn; + struct p2m_domain *p2m; + const struct paging_mode *mode; +@@ -2066,6 +2189,9 @@ unsigned long paging_gva_to_gfn(struct v + (l1_gfn & ((1ul << l1_page_order) - 1))); + + return l1_gfn; ++#else ++ return paging_get_l1_pfn_from_l2_va(v,va,pfec); ++#endif + } + + return hostmode->gva_to_gfn(v, hostp2m, va, pfec); diff --git a/recipes-extended/xen/files/hvmloader-nvram.patch b/recipes-extended/xen/files/hvmloader-nvram.patch new file mode 100644 index 0000000000..f97b9b78e6 --- /dev/null +++ b/recipes-extended/xen/files/hvmloader-nvram.patch @@ -0,0 +1,37 @@ +Index: xen-4.6.4/tools/firmware/hvmloader/ovmf.c +=================================================================== +--- xen-4.6.4.orig/tools/firmware/hvmloader/ovmf.c ++++ xen-4.6.4/tools/firmware/hvmloader/ovmf.c +@@ -38,8 +38,14 @@ + #include "roms.inc" + + #define OVMF_SIZE (sizeof(ovmf)) ++#define OVMF_VARS_SIZE 0x20000ULL ++#define OVMF_CODE_SIZE (OVMF_SIZE - OVMF_VARS_SIZE) ++ + #define OVMF_MAXOFFSET 0x000FFFFFULL + #define OVMF_BEGIN (0x100000000ULL - ((OVMF_SIZE + OVMF_MAXOFFSET) & ~OVMF_MAXOFFSET)) ++#define OVMF_VARS_BEGIN OVMF_BEGIN ++#define OVMF_VARS_END (OVMF_VARS_BEGIN + OVMF_VARS_SIZE) ++#define OVMF_CODE_BEGIN OVMF_VARS_END + #define OVMF_END (OVMF_BEGIN + OVMF_SIZE) + #define LOWCHUNK_BEGIN 0x000F0000 + #define LOWCHUNK_SIZE 0x00010000 +@@ -96,7 +102,7 @@ static void ovmf_finish_bios_info(void) + static void ovmf_load(const struct bios_config *config) + { + xen_pfn_t mfn; +- uint64_t addr = OVMF_BEGIN; ++ uint64_t addr = OVMF_CODE_BEGIN; + + /* Copy low-reset vector portion. */ + memcpy((void *) LOWCHUNK_BEGIN, (uint8_t *) config->image +@@ -113,7 +119,7 @@ static void ovmf_load(const struct bios_ + } + + /* Copy FD. */ +- memcpy((void *) OVMF_BEGIN, config->image, OVMF_SIZE); ++ memcpy((void *) OVMF_CODE_BEGIN, config->image + OVMF_VARS_SIZE, OVMF_CODE_SIZE); + } + + static void ovmf_acpi_build_tables(void) diff --git a/recipes-extended/xen/files/hvmloader-qemu-q35.patch b/recipes-extended/xen/files/hvmloader-qemu-q35.patch new file mode 100644 index 0000000000..de3ae4cc9f --- /dev/null +++ b/recipes-extended/xen/files/hvmloader-qemu-q35.patch @@ -0,0 +1,65 @@ +Index: xen-4.6.4/tools/firmware/hvmloader/pci.c +=================================================================== +--- xen-4.6.4.orig/tools/firmware/hvmloader/pci.c ++++ xen-4.6.4/tools/firmware/hvmloader/pci.c +@@ -131,19 +131,23 @@ void pci_setup(void) + if ( s ) + mmio_hole_size = strtoll(s, NULL, 0); + +- /* Program PCI-ISA bridge with appropriate link routes. */ +- isa_irq = 0; +- for ( link = 0; link < 4; link++ ) +- { +- do { isa_irq = (isa_irq + 1) & 15; +- } while ( !(PCI_ISA_IRQ_MASK & (1U << isa_irq)) ); +- pci_writeb(PCI_ISA_DEVFN, 0x60 + link, isa_irq); +- printf("PCI-ISA link %u routed to IRQ%u\n", link, isa_irq); +- } + +- /* Program ELCR to match PCI-wired IRQs. */ +- outb(0x4d0, (uint8_t)(PCI_ISA_IRQ_MASK >> 0)); +- outb(0x4d1, (uint8_t)(PCI_ISA_IRQ_MASK >> 8)); ++ if ((pci_readw(PCI_ISA_DEVFN, PCI_VENDOR_ID) == 0x8086) && ++ (pci_readw(PCI_ISA_DEVFN, PCI_VENDOR_ID) == 0x7000)) { ++ /* Program PCI-ISA bridge with appropriate link routes. */ ++ isa_irq = 0; ++ for ( link = 0; link < 4; link++ ) ++ { ++ do { isa_irq = (isa_irq + 1) & 15; ++ } while ( !(PCI_ISA_IRQ_MASK & (1U << isa_irq)) ); ++ pci_writeb(PCI_ISA_DEVFN, 0x60 + link, isa_irq); ++ printf("PCI-ISA link %u routed to IRQ%u\n", link, isa_irq); ++ } ++ ++ /* Program ELCR to match PCI-wired IRQs. */ ++ outb(0x4d0, (uint8_t)(PCI_ISA_IRQ_MASK >> 0)); ++ outb(0x4d1, (uint8_t)(PCI_ISA_IRQ_MASK >> 8)); ++ } + + /* Scan the PCI bus and map resources. */ + for ( devfn = 0; devfn < 256; devfn++ ) +@@ -154,8 +158,10 @@ void pci_setup(void) + if ( (vendor_id == 0xffff) && (device_id == 0xffff) ) + continue; + ++#if 0 + ASSERT((devfn != PCI_ISA_DEVFN) || + ((vendor_id == 0x8086) && (device_id == 0x7000))); ++#endif + + switch ( class ) + { +Index: xen-4.6.4/tools/firmware/hvmloader/acpi/dsdt.asl +=================================================================== +--- xen-4.6.4.orig/tools/firmware/hvmloader/acpi/dsdt.asl ++++ xen-4.6.4/tools/firmware/hvmloader/acpi/dsdt.asl +@@ -223,7 +223,8 @@ DefinitionBlock ("DSDT.aml", "DSDT", 2, + + Device (ISA) + { +- Name (_ADR, 0x00010000) /* device 1, fn 0 */ ++ //Name (_ADR, 0x00010000) /* device 1, fn 0 */ ++ Name (_ADR, 0x001f0000) /* device 1f, fn 0 */ + + OperationRegion(PIRQ, PCI_Config, 0x60, 0x4) + Scope(\) { diff --git a/recipes-extended/xen/files/libxl-stubdom-nvram.patch b/recipes-extended/xen/files/libxl-stubdom-nvram.patch new file mode 100644 index 0000000000..bfc7bcf54a --- /dev/null +++ b/recipes-extended/xen/files/libxl-stubdom-nvram.patch @@ -0,0 +1,27 @@ +Index: xen-4.6.4/tools/libxl/libxl_dm.c +=================================================================== +--- xen-4.6.4.orig/tools/libxl/libxl_dm.c ++++ xen-4.6.4/tools/libxl/libxl_dm.c +@@ -1159,11 +1159,17 @@ static int libxl__build_device_model_arg + * For other disks we translate devices 0..3 into + * hd[a-d] and ignore the rest. + */ +- if (strncmp(disks[i].vdev, "sd", 2) == 0) +- drive = libxl__sprintf +- (gc, "file=%s,if=scsi,bus=0,unit=%d,format=%s,cache=writeback", +- pdev_path, disk, format); +- else if (disk < 6 && b_info->u.hvm.hdtype == LIBXL_HDTYPE_AHCI) { ++ if (strncmp(disks[i].vdev, "sd", 2) == 0) { ++ if (b_info->stubdomain_version == LIBXL_STUBDOMAIN_VERSION_LINUX) { ++ drive = libxl__sprintf ++ (gc, "file=%s%c,if=scsi,bus=0,unit=%d,format=%s,cache=writeback", ++ "/dev/xvd", 'a'+disk, disk, format); ++ } else { ++ drive = libxl__sprintf ++ (gc, "file=%s,if=scsi,bus=0,unit=%d,format=%s,cache=writeback", ++ pdev_path, disk, format); ++ } ++ } else if (disk < 6 && b_info->u.hvm.hdtype == LIBXL_HDTYPE_AHCI) { + flexarray_vappend(dm_args, "-drive", + GCSPRINTF("file=%s,if=none,id=ahcidisk-%d,format=%s,cache=writeback", + pdev_path, disk, format), diff --git a/recipes-extended/xen/files/ovmf-stubdom.patch b/recipes-extended/xen/files/ovmf-stubdom.patch new file mode 100644 index 0000000000..1f81e7f68b --- /dev/null +++ b/recipes-extended/xen/files/ovmf-stubdom.patch @@ -0,0 +1,25 @@ +Index: xen-4.6.4/tools/libxl/libxl_dm.c +=================================================================== +--- xen-4.6.4.orig/tools/libxl/libxl_dm.c ++++ xen-4.6.4/tools/libxl/libxl_dm.c +@@ -1637,6 +1637,7 @@ void libxl__spawn_stub_dm(libxl__egc *eg + libxl__xs_get_dompath(gc, dm_domid)), + "%d", guest_domid); + if (guest_config->b_info.stubdomain_version == LIBXL_STUBDOMAIN_VERSION_LINUX) { ++#if 0 /* LIES */ + /* qemu-xen is used as a dm in the stubdomain, so we set the bios + * according to this */ + libxl__xs_write(gc, XBT_NULL, +@@ -1644,6 +1645,12 @@ void libxl__spawn_stub_dm(libxl__egc *eg + libxl__xs_get_dompath(gc, guest_domid)), + "%s", + libxl_bios_type_to_string(LIBXL_BIOS_TYPE_SEABIOS)); ++#else ++ libxl__xs_write(gc, XBT_NULL, ++ libxl__sprintf(gc, "%s/hvmloader/bios", ++ libxl__xs_get_dompath(gc, guest_domid)), ++ "%s", libxl_bios_type_to_string(guest_config->b_info.u.hvm.bios)); ++#endif + /* OpenXT: We use legacy roms, which is disabled by default in sebios */ + libxl__xs_write(gc, XBT_NULL, + libxl__sprintf(gc, "%s/hvmloader/seabios-legacy-load-roms", diff --git a/recipes-extended/xen/files/ovmf.patch b/recipes-extended/xen/files/ovmf.patch new file mode 100644 index 0000000000..8c152c6cc6 --- /dev/null +++ b/recipes-extended/xen/files/ovmf.patch @@ -0,0 +1,14 @@ +Index: xen-4.6.4/tools/firmware/hvmloader/Makefile +=================================================================== +--- xen-4.6.4.orig/tools/firmware/hvmloader/Makefile ++++ xen-4.6.4/tools/firmware/hvmloader/Makefile +@@ -25,6 +25,9 @@ SUBDIRS := acpi + # The HVM loader is started in 32-bit mode at the address below: + LOADADDR = 0x100000 + ++OVMF_PATH=${STAGING_LIBDIR}/../share/ovmf/OVMF.fd ++CONFIG_OVMF=y ++ + # SMBIOS spec requires format mm/dd/yyyy + SMBIOS_REL_DATE ?= $(shell date +%m/%d/%Y) + diff --git a/recipes-extended/xen/xen-common.inc b/recipes-extended/xen/xen-common.inc index df47117f96..3e97becc54 100644 --- a/recipes-extended/xen/xen-common.inc +++ b/recipes-extended/xen/xen-common.inc @@ -80,8 +80,17 @@ SRC_URI_append = " \ file://libxl-atapi-pt.patch \ file://libxl-iso-hotswap.patch \ file://tboot-xen-evtlog-support.patch \ + file://fix-nesting-1.patch \ + file://fix-nesting-2.patch \ + file://ovmf.patch \ + file://ovmf-stubdom.patch \ + file://hvmloader-nvram.patch \ + file://libxl-stubdom-nvram.patch \ " +# This patch adds experimental q35 support for hvmloader +# file://hvmloader-qemu-q35.patch + COMPATIBLE_HOST = 'i686-oe-linux|(x86_64.*).*-linux|aarch64.*-linux' PACKAGECONFIG =+ "xsm" diff --git a/recipes-extended/xen/xen.bb b/recipes-extended/xen/xen.bb index 390ff8aa88..c96dde5887 100644 --- a/recipes-extended/xen/xen.bb +++ b/recipes-extended/xen/xen.bb @@ -129,6 +129,10 @@ do_install() { -i ${D}${sysconfdir}/init.d/xenstored.${PN}-xenstored-c } +DEPENDS_append = "\ + ovmf \ + " + RDEPENDS_${PN}-base_remove = "\ ${PN}-blktap \ ${PN}-libblktapctl \ diff --git a/recipes-openxt/qemu-dm/qemu-dm-2.6.2/ahci-disable-ncq.patch b/recipes-openxt/qemu-dm/qemu-dm-2.6.2/ahci-disable-ncq.patch new file mode 100644 index 0000000000..0ba2322e85 --- /dev/null +++ b/recipes-openxt/qemu-dm/qemu-dm-2.6.2/ahci-disable-ncq.patch @@ -0,0 +1,13 @@ +Index: qemu-2.6.2/hw/ide/ahci.c +=================================================================== +--- qemu-2.6.2.orig/hw/ide/ahci.c ++++ qemu-2.6.2/hw/ide/ahci.c +@@ -488,7 +488,7 @@ static void ahci_reg_init(AHCIState *s) + s->control_regs.cap = (s->ports - 1) | + (AHCI_NUM_COMMAND_SLOTS << 8) | + (AHCI_SUPPORTED_SPEED_GEN1 << AHCI_SUPPORTED_SPEED) | +- HOST_CAP_NCQ | HOST_CAP_AHCI; ++ /*HOST_CAP_NCQ |*/ HOST_CAP_AHCI; + + s->control_regs.impl = (1 << s->ports) - 1; + diff --git a/recipes-openxt/qemu-dm/qemu-dm-2.6.2/ahci-fix-coincident-mappings.patch b/recipes-openxt/qemu-dm/qemu-dm-2.6.2/ahci-fix-coincident-mappings.patch new file mode 100644 index 0000000000..75ff7ec60d --- /dev/null +++ b/recipes-openxt/qemu-dm/qemu-dm-2.6.2/ahci-fix-coincident-mappings.patch @@ -0,0 +1,13 @@ +Index: qemu-2.6.2/dma-helpers.c +=================================================================== +--- qemu-2.6.2.orig/dma-helpers.c ++++ qemu-2.6.2/dma-helpers.c +@@ -136,7 +136,7 @@ static void dma_blk_cb(void *opaque, int + dma_complete(dbs, ret); + return; + } +- dma_blk_unmap(dbs); ++ //dma_blk_unmap(dbs); + + while (dbs->sg_cur_index < dbs->sg->nsg) { + cur_addr = dbs->sg->sg[dbs->sg_cur_index].base + dbs->sg_cur_byte; diff --git a/recipes-openxt/qemu-dm/qemu-dm-2.6.2/memcache-failure-non-fatal.patch b/recipes-openxt/qemu-dm/qemu-dm-2.6.2/memcache-failure-non-fatal.patch new file mode 100644 index 0000000000..cc33ccf977 --- /dev/null +++ b/recipes-openxt/qemu-dm/qemu-dm-2.6.2/memcache-failure-non-fatal.patch @@ -0,0 +1,12 @@ +Index: qemu-2.6.2/exec.c +=================================================================== +--- qemu-2.6.2.orig/exec.c ++++ qemu-2.6.2/exec.c +@@ -948,6 +948,7 @@ static RAMBlock *qemu_get_ram_block(ram_ + } + + fprintf(stderr, "Bad ram offset %" PRIx64 "\n", (uint64_t)addr); ++ return NULL; + abort(); + + found: diff --git a/recipes-openxt/qemu-dm/qemu-dm-2.6.2/ovmf-q35.patch b/recipes-openxt/qemu-dm/qemu-dm-2.6.2/ovmf-q35.patch new file mode 100644 index 0000000000..21818914ca --- /dev/null +++ b/recipes-openxt/qemu-dm/qemu-dm-2.6.2/ovmf-q35.patch @@ -0,0 +1,284 @@ +Index: qemu-2.6.2/hw/i386/pc_piix.c +=================================================================== +--- qemu-2.6.2.orig/hw/i386/pc_piix.c ++++ qemu-2.6.2/hw/i386/pc_piix.c +@@ -56,6 +56,8 @@ + #include "migration/migration.h" + #include "kvm_i386.h" + ++extern int xen_q35; ++ + #define MAX_IDE_BUS 2 + + static const int ide_iobase[MAX_IDE_BUS] = { 0x1f0, 0x170 }; +@@ -377,6 +379,8 @@ static void pc_xen_hvm_init_pci(MachineS + pci_type); + } + ++extern void pc_q35_init(MachineState *machine); ++ + static void pc_xen_hvm_init(MachineState *machine) + { + PCIBus *bus; +@@ -386,7 +390,10 @@ static void pc_xen_hvm_init(MachineState + exit(1); + } + +- pc_xen_hvm_init_pci(machine); ++ if (!xen_q35) ++ pc_xen_hvm_init_pci(machine); ++ else ++ pc_q35_init(machine); + + bus = pci_find_primary_bus(); + if (bus != NULL) { +@@ -419,7 +426,12 @@ static void pc_i440fx_machine_options(Ma + static void pc_i440fx_2_6_machine_options(MachineClass *m) + { + pc_i440fx_machine_options(m); +- m->alias = "pc"; ++ ++ if (!xen_q35) ++ m->alias = "pc"; ++ else ++ m->alias = "old-pc"; ++ + m->is_default = 1; + } + +Index: qemu-2.6.2/hw/i386/pc_q35.c +=================================================================== +--- qemu-2.6.2.orig/hw/i386/pc_q35.c ++++ qemu-2.6.2/hw/i386/pc_q35.c +@@ -28,6 +28,7 @@ + * THE SOFTWARE. + */ + #include "qemu/osdep.h" ++#include "sysemu/block-backend.h" + #include "hw/hw.h" + #include "hw/loader.h" + #include "sysemu/arch_init.h" +@@ -47,12 +48,88 @@ + #include "hw/usb.h" + #include "qemu/error-report.h" + #include "migration/migration.h" ++#include "hw/block/flash.h" ++#ifdef CONFIG_XEN ++# include ++#endif + + /* ICH9 AHCI has 6 ports */ + #define MAX_SATA_PORTS 6 + ++extern int xen_q35; ++ ++static void xen_map_efi_var_rom(MemoryRegion *rom_memory) ++{ ++ DriveInfo *pflash_drv; ++ BlockBackend *blk; ++ int64_t size; ++ ++ char *fatal_errmsg = NULL; ++ hwaddr phys_addr = 0xffe00000ULL; ++ int sector_bits, sector_size; ++ char name[64]; ++ ++ pflash_drv = drive_get(IF_PFLASH, 0, 0); ++ ++ if (!pflash_drv) { ++ error_report("XEN EFI NVRAM - No pflash device found\n"); ++ exit(1); ++ } ++ ++ ++ blk = blk_by_legacy_dinfo(pflash_drv); ++ size = blk_getlength(blk); ++ ++ sector_bits = 12; ++ sector_size = 1 << sector_bits; ++ ++ ++ if (size < 0) { ++ fatal_errmsg = g_strdup_printf("failed to get backing file size"); ++ } else if (size == 0) { ++ fatal_errmsg = g_strdup_printf("PC system firmware (pflash) " ++ "cannot have zero size"); ++ } else if ((size % sector_size) != 0) { ++ fatal_errmsg = g_strdup_printf("PC system firmware (pflash) " ++ "must be a multiple of 0x%x", sector_size); ++ } else if (size != 0x20000) { ++ fatal_errmsg = g_strdup_printf("image must be exactly 0x20000 bytes, yours is 0x%x",(unsigned) size); ++ } ++ ++ if (fatal_errmsg != NULL) { ++ Location loc; ++ ++ /* push a new, "none" location on the location stack; overwrite its ++ * contents with the location saved in the option; print the error ++ * (includes location); pop the top ++ */ ++ loc_push_none(&loc); ++ if (pflash_drv->opts != NULL) { ++ qemu_opts_loc_restore(pflash_drv->opts); ++ } ++ error_report("%s", fatal_errmsg); ++ loc_pop(&loc); ++ g_free(fatal_errmsg); ++ exit(1); ++ } ++ ++ /* pflash_cfi01_register() creates a deep copy of the name */ ++ snprintf(name, sizeof name, "system.flash0"); ++ pflash_cfi01_register(phys_addr, NULL /* qdev */, name, ++ size, blk, sector_size, ++ size >> sector_bits, ++ 1 /* width */, ++ 0x0000 /* id0 */, ++ 0x0000 /* id1 */, ++ 0x0000 /* id2 */, ++ 0x0000 /* id3 */, ++ 0 /* be */); ++} ++ ++void pc_q35_init(MachineState *machine); ++ + /* PC hardware initialisation */ +-static void pc_q35_init(MachineState *machine) ++void pc_q35_init(MachineState *machine) + { + PCMachineState *pcms = PC_MACHINE(machine); + PCMachineClass *pcmc = PC_MACHINE_GET_CLASS(pcms); +@@ -143,6 +220,8 @@ static void pc_q35_init(MachineState *ma + if (!xen_enabled()) { + pc_memory_init(pcms, get_system_memory(), + rom_memory, &ram_memory); ++ } else { ++ xen_map_efi_var_rom(rom_memory); + } + + /* irq lines */ +@@ -186,8 +265,16 @@ static void pc_q35_init(MachineState *ma + ich9_lpc = ICH9_LPC_DEVICE(lpc); + ich9_lpc->pic = gsi; + ich9_lpc->ioapic = gsi_state->ioapic_irq; +- pci_bus_irqs(host_bus, ich9_lpc_set_irq, ich9_lpc_map_irq, ich9_lpc, ++ ++#define XEN_PIIX_NUM_PIRQS 128ULL ++ ++ if (xen_enabled()) { ++ pci_bus_irqs(host_bus, xen_q35_set_irq, xen_pci_slot_get_pirq, ich9_lpc, XEN_PIIX_NUM_PIRQS); ++ } else { ++ pci_bus_irqs(host_bus, ich9_lpc_set_irq, ich9_lpc_map_irq, ich9_lpc, + ICH9_LPC_NB_PIRQS); ++ } ++ + pci_bus_set_route_irq_fn(host_bus, ich9_route_intx_pin_to_irq); + isa_bus = ich9_lpc->isa_bus; + +@@ -286,7 +373,10 @@ static void pc_q35_machine_options(Machi + static void pc_q35_2_6_machine_options(MachineClass *m) + { + pc_q35_machine_options(m); +- m->alias = "q35"; ++ if (xen_q35) ++ m->alias = "pc"; ++ else ++ m->alias = "q35"; + } + + DEFINE_Q35_MACHINE(v2_6, "pc-q35-2.6", NULL, +@@ -316,3 +406,5 @@ static void pc_q35_2_4_machine_options(M + + DEFINE_Q35_MACHINE(v2_4, "pc-q35-2.4", NULL, + pc_q35_2_4_machine_options); ++ ++ +Index: qemu-2.6.2/hw/i386/pc_sysfw.c +=================================================================== +--- qemu-2.6.2.orig/hw/i386/pc_sysfw.c ++++ qemu-2.6.2/hw/i386/pc_sysfw.c +@@ -35,6 +35,7 @@ + #include "sysemu/sysemu.h" + #include "hw/block/flash.h" + #include "sysemu/kvm.h" ++#include "hw/xen/xen.h" + + #define BIOS_FILENAME "bios.bin" + +@@ -166,7 +167,7 @@ static void pc_system_flash_init(MemoryR + 0x0000 /* id2 */, + 0x0000 /* id3 */, + 0 /* be */); +- if (unit == 0) { ++ if ((unit == 0) && (!xen_enabled())) { + flash_mem = pflash_cfi01_get_memory(system_flash); + pc_isa_bios_init(rom_memory, flash_mem, size); + } +Index: qemu-2.6.2/include/hw/xen/xen.h +=================================================================== +--- qemu-2.6.2.orig/include/hw/xen/xen.h ++++ qemu-2.6.2/include/hw/xen/xen.h +@@ -30,6 +30,7 @@ static inline bool xen_enabled(void) + + int xen_pci_slot_get_pirq(PCIDevice *pci_dev, int irq_num); + void xen_piix3_set_irq(void *opaque, int irq_num, int level); ++void xen_q35_set_irq(void *opaque, int irq_num, int level); + void xen_piix_pci_write_config_client(uint32_t address, uint32_t val, int len); + void xen_hvm_inject_msi(uint64_t addr, uint32_t data); + int xen_is_pirq_msi(uint32_t msi_data); +Index: qemu-2.6.2/xen-hvm.c +=================================================================== +--- qemu-2.6.2.orig/xen-hvm.c ++++ qemu-2.6.2/xen-hvm.c +@@ -147,6 +147,13 @@ void xen_piix3_set_irq(void *opaque, int + irq_num & 3, level); + } + ++void xen_q35_set_irq(void *opaque, int irq_num, int level) ++{ ++ xc_hvm_set_pci_intx_level(xen_xc, xen_domid, 0, 0, irq_num >> 2, ++ irq_num & 3, level); ++} ++ ++ + void xen_piix_pci_write_config_client(uint32_t address, uint32_t val, int len) + { + int i; +Index: qemu-2.6.2/qemu-options.hx +=================================================================== +--- qemu-2.6.2.orig/qemu-options.hx ++++ qemu-2.6.2/qemu-options.hx +@@ -3714,6 +3714,8 @@ ETEXI + HXCOMM Deprecated by -machine accel=tcg property + DEF("no-kvm", 0, QEMU_OPTION_no_kvm, "", QEMU_ARCH_I386) + ++DEF("xen-q35", 0, QEMU_OPTION_xen_q35, "", QEMU_ARCH_I386) ++ + HXCOMM Deprecated by kvm-pit driver properties + DEF("no-kvm-pit-reinjection", 0, QEMU_OPTION_no_kvm_pit_reinjection, + "", QEMU_ARCH_I386) +Index: qemu-2.6.2/vl.c +=================================================================== +--- qemu-2.6.2.orig/vl.c ++++ qemu-2.6.2/vl.c +@@ -203,6 +203,8 @@ bool xen_allowed; + uint32_t xen_domid; + enum xen_mode xen_mode = XEN_EMULATE; + ++int xen_q35; ++ + static int has_defaults = 1; + static int default_serial = 1; + static int default_parallel = 1; +@@ -3695,7 +3697,10 @@ int main(int argc, char **argv, char **e + exit(1); + } + break; +- case QEMU_OPTION_no_kvm: ++ case QEMU_OPTION_xen_q35: ++ xen_q35 = 1; ++ break; ++ case QEMU_OPTION_no_kvm: + olist = qemu_find_opts("machine"); + qemu_opts_parse_noisily(olist, "accel=tcg", false); + break; diff --git a/recipes-openxt/qemu-dm/qemu-dm-2.6.2/ovmf-xenpc.patch b/recipes-openxt/qemu-dm/qemu-dm-2.6.2/ovmf-xenpc.patch new file mode 100644 index 0000000000..04557a2f09 --- /dev/null +++ b/recipes-openxt/qemu-dm/qemu-dm-2.6.2/ovmf-xenpc.patch @@ -0,0 +1,1218 @@ +Index: qemu-2.6.2/hw/i386/pc_piix.c +=================================================================== +--- qemu-2.6.2.orig/hw/i386/pc_piix.c ++++ qemu-2.6.2/hw/i386/pc_piix.c +@@ -47,6 +47,7 @@ + #include "exec/memory.h" + #include "exec/address-spaces.h" + #include "hw/acpi/acpi.h" ++#include "hw/block/flash.h" + #include "cpu.h" + #include "qemu/error-report.h" + #ifdef CONFIG_XEN +@@ -55,6 +56,10 @@ + #endif + #include "migration/migration.h" + #include "kvm_i386.h" ++#include "sysemu/block-backend.h" ++#include "hw/i386/nvram.h" ++ ++extern int efi_nvram; + + #define MAX_IDE_BUS 2 + +@@ -62,6 +67,118 @@ static const int ide_iobase[MAX_IDE_BUS] + static const int ide_iobase2[MAX_IDE_BUS] = { 0x3f6, 0x376 }; + static const int ide_irq[MAX_IDE_BUS] = { 14, 15 }; + ++static uint8_t nvram_buf[512]; ++ ++static int ++initialize_nvram (BlockBackend * blk) ++{ ++ size_t i, sector, l; ++ uint8_t *src = nvram_ms_secureboot; ++ size_t src_len = sizeof (nvram_ms_secureboot); ++ ++ memset (nvram_buf, 0xff, sizeof (nvram_buf)); ++ for (i = 0, sector = 0; i < nvram_size; i += sizeof (nvram_buf), sector++) { ++ ++ if (blk_write (blk, sector, nvram_buf, 1) < 0) ++ return -1; ++ } ++ ++ for (i = 0, sector = 0; i < src_len; i += sizeof (nvram_buf), sector++) { ++ l = src_len - i; ++ if (l > sizeof (nvram_buf)) ++ l = sizeof (nvram_buf); ++ ++ memset (nvram_buf, 0xff, sizeof (nvram_buf)); ++ memcpy (nvram_buf, &src[i], l); ++ ++ if (blk_write (blk, sector, nvram_buf, 1) < 0) ++ return -1; ++ } ++ ++ ++ ++ sector = nvram_trailer_offset / sizeof (nvram_buf); ++ memset (nvram_buf, 0xff, sizeof (nvram_buf)); ++ memcpy (nvram_buf, nvram_trailer, sizeof (nvram_trailer)); ++ ++ if (blk_write (blk, sector, nvram_buf, 1) < 0) ++ return -1; ++ ++ return 0; ++} ++ ++ ++static void ++xen_map_efi_var_rom (MemoryRegion * rom_memory) ++{ ++ DriveInfo *pflash_drv; ++ BlockBackend *blk; ++ int64_t size; ++ ++ char *fatal_errmsg = NULL; ++ hwaddr phys_addr = 0xffe00000ULL; ++ int sector_bits, sector_size; ++ char name[64]; ++ ++ pflash_drv = drive_get (IF_SCSI, 0, 6); ++ ++ if (!pflash_drv) { ++ error_report ("XEN EFI NVRAM - nothing on SCSI bus 0, unit 6\n"); ++ exit (1); ++ } ++ ++ ++ blk = blk_by_legacy_dinfo (pflash_drv); ++ size = blk_getlength (blk); ++ ++ sector_bits = 12; ++ sector_size = 1 << sector_bits; ++ ++ ++ if (size < 0) { ++ fatal_errmsg = g_strdup_printf ("failed to get efi nvram file size"); ++ } else if (size == 0) { ++ fatal_errmsg = g_strdup_printf ("efi nvram cannot have zero size"); ++ } else if (blk_read (blk, 0, nvram_buf, 1) < 0) { ++ fatal_errmsg = ++ g_strdup_printf ("failed to read first sector of efi nvram"); ++ } else if (memcmp (&nvram_buf[0x10], &nvram_empty[0x10], 0x10) ++ && initialize_nvram (blk)) { ++ fatal_errmsg = g_strdup_printf ("failed to initialize empty efi_nvram"); ++ } ++ ++ if (fatal_errmsg != NULL) { ++ Location loc; ++ ++ /* push a new, "none" location on the location stack; overwrite its ++ * contents with the location saved in the option; print the error ++ * (includes location); pop the top ++ */ ++ loc_push_none (&loc); ++ if (pflash_drv->opts != NULL) ++ { ++ qemu_opts_loc_restore (pflash_drv->opts); ++ } ++ error_report ("%s", fatal_errmsg); ++ loc_pop (&loc); ++ g_free (fatal_errmsg); ++ exit (1); ++ } ++ ++ /* pflash_cfi01_register() creates a deep copy of the name */ ++ snprintf (name, sizeof name, "system.flash0"); ++ pflash_cfi01_register (phys_addr, NULL /* qdev */ , name, ++ nvram_size, blk, sector_size, ++ nvram_size >> sector_bits, 1 /* width */ , ++ 0x0000 /* id0 */ , ++ 0x0000 /* id1 */ , ++ 0x0000 /* id2 */ , ++ 0x0000 /* id3 */ , ++ 0 /* be */ ); ++} ++ ++ ++ + /* PC hardware initialisation */ + static void pc_init1(MachineState *machine, + const char *host_type, const char *pci_type) +@@ -160,6 +277,9 @@ static void pc_init1(MachineState *machi + xen_load_linux(pcms); + } + ++ if (efi_nvram) ++ xen_map_efi_var_rom(rom_memory); ++ + gsi_state = g_malloc0(sizeof(*gsi_state)); + if (kvm_ioapic_in_kernel()) { + kvm_pc_setup_irq_routing(pcmc->pci_enabled); +Index: qemu-2.6.2/qemu-options.hx +=================================================================== +--- qemu-2.6.2.orig/qemu-options.hx ++++ qemu-2.6.2/qemu-options.hx +@@ -3714,6 +3714,8 @@ ETEXI + HXCOMM Deprecated by -machine accel=tcg property + DEF("no-kvm", 0, QEMU_OPTION_no_kvm, "", QEMU_ARCH_I386) + ++DEF("efi-nvram", 0, QEMU_OPTION_efi_nvram, "", QEMU_ARCH_I386) ++ + HXCOMM Deprecated by kvm-pit driver properties + DEF("no-kvm-pit-reinjection", 0, QEMU_OPTION_no_kvm_pit_reinjection, + "", QEMU_ARCH_I386) +Index: qemu-2.6.2/vl.c +=================================================================== +--- qemu-2.6.2.orig/vl.c ++++ qemu-2.6.2/vl.c +@@ -203,6 +203,8 @@ bool xen_allowed; + uint32_t xen_domid; + enum xen_mode xen_mode = XEN_EMULATE; + ++int efi_nvram; ++ + static int has_defaults = 1; + static int default_serial = 1; + static int default_parallel = 1; +@@ -3695,7 +3697,10 @@ int main(int argc, char **argv, char **e + exit(1); + } + break; +- case QEMU_OPTION_no_kvm: ++ case QEMU_OPTION_efi_nvram: ++ efi_nvram = 1; ++ break; ++ case QEMU_OPTION_no_kvm: + olist = qemu_find_opts("machine"); + qemu_opts_parse_noisily(olist, "accel=tcg", false); + break; +Index: qemu-2.6.2/hw/i386/nvram.h +=================================================================== +--- /dev/null ++++ qemu-2.6.2/hw/i386/nvram.h +@@ -0,0 +1,1000 @@ ++uint8_t nvram_empty[] = { ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x8d, 0x2b, 0xf1, 0xff, 0x96, 0x76, 0x8b, 0x4c, ++ 0xa9, 0x85, 0x27, 0x47, 0x07, 0x5b, 0x4f, 0x50, 0x00, 0x00, 0x02, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x5f, 0x46, 0x56, 0x48, 0xff, 0xfe, 0x04, 0x00, ++ 0x48, 0x00, 0x19, 0xf9, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, ++ 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x78, 0x2c, 0xf3, 0xaa, 0x7b, 0x94, 0x9a, 0x43, 0xa1, 0x80, 0x2e, 0x14, ++ 0x4e, 0xc3, 0x77, 0x92, 0xb8, 0xdf, 0x00, 0x00, 0x5a, 0xfe, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, ++}; ++ ++static uint8_t nvram_ms_secureboot[] = { ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x8d, 0x2b, 0xf1, 0xff, 0x96, 0x76, 0x8b, 0x4c, ++ 0xa9, 0x85, 0x27, 0x47, 0x07, 0x5b, 0x4f, 0x50, 0x00, 0x00, 0x02, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x5f, 0x46, 0x56, 0x48, 0xff, 0xfe, 0x04, 0x00, ++ 0x48, 0x00, 0x19, 0xf9, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, ++ 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x78, 0x2c, 0xf3, 0xaa, 0x7b, 0x94, 0x9a, 0x43, 0xa1, 0x80, 0x2e, 0x14, ++ 0x4e, 0xc3, 0x77, 0x92, 0xb8, 0xdf, 0x00, 0x00, 0x5a, 0xfe, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0xaa, 0x55, 0x3f, 0x00, 0x17, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, ++ 0x78, 0x2c, 0xf3, 0xaa, 0x7b, 0x94, 0x9a, 0x43, 0xa1, 0x80, 0x2e, 0x14, ++ 0x4e, 0xc3, 0x77, 0x92, 0x41, 0x00, 0x75, 0x00, 0x74, 0x00, 0x68, 0x00, ++ 0x56, 0x00, 0x61, 0x00, 0x72, 0x00, 0x4b, 0x00, 0x65, 0x00, 0x79, 0x00, ++ 0x44, 0x00, 0x61, 0x00, 0x74, 0x00, 0x61, 0x00, 0x62, 0x00, 0x61, 0x00, ++ 0x73, 0x00, 0x65, 0x00, 0x00, 0x00, 0x00, 0xff, 0xaa, 0x55, 0x3c, 0x00, ++ 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, ++ 0x01, 0x00, 0x00, 0x00, 0x77, 0x3b, 0x57, 0x0c, 0x93, 0xeb, 0x3d, 0x4d, ++ 0xaf, 0xfc, 0x5f, 0xeb, 0xca, 0xfb, 0x65, 0xb0, 0x53, 0x00, 0x65, 0x00, ++ 0x63, 0x00, 0x75, 0x00, 0x72, 0x00, 0x65, 0x00, 0x42, 0x00, 0x6f, 0x00, ++ 0x6f, 0x00, 0x74, 0x00, 0x4d, 0x00, 0x6f, 0x00, 0x64, 0x00, 0x65, 0x00, ++ 0x00, 0x00, 0x01, 0xff, 0xaa, 0x55, 0x3c, 0x00, 0x03, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, ++ 0x0c, 0xec, 0x76, 0xc0, 0x28, 0x70, 0x99, 0x43, 0xa0, 0x72, 0x71, 0xee, ++ 0x5c, 0x44, 0x8b, 0x9f, 0x43, 0x00, 0x75, 0x00, 0x73, 0x00, 0x74, 0x00, ++ 0x6f, 0x00, 0x6d, 0x00, 0x4d, 0x00, 0x6f, 0x00, 0x64, 0x00, 0x65, 0x00, ++ 0x00, 0x00, 0x00, 0xff, 0xaa, 0x55, 0x3f, 0x00, 0x27, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, ++ 0x6e, 0xe5, 0xbe, 0xd9, 0xdc, 0x75, 0xd9, 0x49, 0xb4, 0xd7, 0xb5, 0x34, ++ 0x21, 0x0f, 0x63, 0x7a, 0x63, 0x00, 0x65, 0x00, 0x72, 0x00, 0x74, 0x00, ++ 0x64, 0x00, 0x62, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0xff, 0xff, ++ 0xaa, 0x55, 0x3c, 0x00, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x1a, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xe0, 0xe4, 0x73, 0x90, ++ 0xec, 0x60, 0x6e, 0x4b, 0x99, 0x03, 0x4c, 0x22, 0x3c, 0x26, 0x0f, 0x3c, ++ 0x56, 0x00, 0x65, 0x00, 0x6e, 0x00, 0x64, 0x00, 0x6f, 0x00, 0x72, 0x00, ++ 0x4b, 0x00, 0x65, 0x00, 0x79, 0x00, 0x73, 0x00, 0x4e, 0x00, 0x76, 0x00, ++ 0x00, 0x00, 0x01, 0xff, 0xaa, 0x55, 0x3c, 0x00, 0x07, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, ++ 0x11, 0x40, 0x70, 0xeb, 0x02, 0x14, 0xd3, 0x11, 0x8e, 0x77, 0x00, 0xa0, ++ 0xc9, 0x69, 0x72, 0x3b, 0x4d, 0x00, 0x54, 0x00, 0x43, 0x00, 0x00, 0x00, ++ 0x01, 0x00, 0x00, 0x00, 0xaa, 0x55, 0x3f, 0x00, 0x07, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, ++ 0x61, 0xdf, 0xe4, 0x8b, 0xca, 0x93, 0xd2, 0x11, 0xaa, 0x0d, 0x00, 0xe0, ++ 0x98, 0x03, 0x2b, 0x8c, 0x54, 0x00, 0x69, 0x00, 0x6d, 0x00, 0x65, 0x00, ++ 0x6f, 0x00, 0x75, 0x00, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, ++ 0xaa, 0x55, 0x3f, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x1a, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x61, 0xdf, 0xe4, 0x8b, ++ 0xca, 0x93, 0xd2, 0x11, 0xaa, 0x0d, 0x00, 0xe0, 0x98, 0x03, 0x2b, 0x8c, ++ 0x50, 0x00, 0x6c, 0x00, 0x61, 0x00, 0x74, 0x00, 0x66, 0x00, 0x6f, 0x00, ++ 0x72, 0x00, 0x6d, 0x00, 0x4c, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x67, 0x00, ++ 0x00, 0x00, 0x65, 0x6e, 0x00, 0xff, 0xff, 0xff, 0xaa, 0x55, 0x3f, 0x00, ++ 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, ++ 0x04, 0x00, 0x00, 0x00, 0x61, 0xdf, 0xe4, 0x8b, 0xca, 0x93, 0xd2, 0x11, ++ 0xaa, 0x0d, 0x00, 0xe0, 0x98, 0x03, 0x2b, 0x8c, 0x4c, 0x00, 0x61, 0x00, ++ 0x6e, 0x00, 0x67, 0x00, 0x00, 0x00, 0x65, 0x6e, 0x67, 0x00, 0xff, 0xff, ++ 0xaa, 0x55, 0x3f, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x1a, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xe8, 0x7f, 0xb3, 0x04, ++ 0xae, 0xf6, 0x0b, 0x48, 0xbd, 0xd5, 0x37, 0xd9, 0x8c, 0x5e, 0x89, 0xaa, ++ 0x56, 0x00, 0x61, 0x00, 0x72, 0x00, 0x45, 0x00, 0x72, 0x00, 0x72, 0x00, ++ 0x6f, 0x00, 0x72, 0x00, 0x46, 0x00, 0x6c, 0x00, 0x61, 0x00, 0x67, 0x00, ++ 0x00, 0x00, 0xff, 0xff, 0xaa, 0x55, 0x3c, 0x00, 0x07, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, ++ 0x61, 0xdf, 0xe4, 0x8b, 0xca, 0x93, 0xd2, 0x11, 0xaa, 0x0d, 0x00, 0xe0, ++ 0x98, 0x03, 0x2b, 0x8c, 0x43, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x49, 0x00, ++ 0x6e, 0x00, 0x00, 0x00, 0x02, 0x01, 0x0c, 0x00, 0xd0, 0x41, 0x03, 0x0a, ++ 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x06, 0x00, 0x00, 0x01, 0x02, 0x01, ++ 0x0c, 0x00, 0xd0, 0x41, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, ++ 0x04, 0x00, 0xff, 0xff, 0xaa, 0x55, 0x3c, 0x00, 0x07, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x49, 0x00, 0x00, 0x00, ++ 0x61, 0xdf, 0xe4, 0x8b, 0xca, 0x93, 0xd2, 0x11, 0xaa, 0x0d, 0x00, 0xe0, ++ 0x98, 0x03, 0x2b, 0x8c, 0x43, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x4f, 0x00, ++ 0x75, 0x00, 0x74, 0x00, 0x00, 0x00, 0x02, 0x01, 0x0c, 0x00, 0xd0, 0x41, ++ 0x03, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x06, 0x00, 0x00, 0x01, ++ 0x02, 0x01, 0x0c, 0x00, 0xd0, 0x41, 0x01, 0x05, 0x00, 0x00, 0x00, 0x00, ++ 0x03, 0x0e, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc2, 0x01, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x08, 0x01, 0x01, 0x03, 0x0a, 0x14, 0x00, 0x53, ++ 0x47, 0xc1, 0xe0, 0xbe, 0xf9, 0xd2, 0x11, 0x9a, 0x0c, 0x00, 0x90, 0x27, ++ 0x3f, 0xc1, 0x4d, 0x7f, 0xff, 0x04, 0x00, 0xff, 0xaa, 0x55, 0x3c, 0x00, ++ 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, ++ 0x6b, 0x00, 0x00, 0x00, 0x61, 0xdf, 0xe4, 0x8b, 0xca, 0x93, 0xd2, 0x11, ++ 0xaa, 0x0d, 0x00, 0xe0, 0x98, 0x03, 0x2b, 0x8c, 0x43, 0x00, 0x6f, 0x00, ++ 0x6e, 0x00, 0x49, 0x00, 0x6e, 0x00, 0x00, 0x00, 0x02, 0x01, 0x0c, 0x00, ++ 0xd0, 0x41, 0x03, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x06, 0x00, ++ 0x00, 0x01, 0x02, 0x01, 0x0c, 0x00, 0xd0, 0x41, 0x03, 0x03, 0x00, 0x00, ++ 0x00, 0x00, 0x7f, 0x01, 0x04, 0x00, 0x02, 0x01, 0x0c, 0x00, 0xd0, 0x41, ++ 0x03, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x06, 0x00, 0x00, 0x01, ++ 0x02, 0x01, 0x0c, 0x00, 0xd0, 0x41, 0x01, 0x05, 0x00, 0x00, 0x00, 0x00, ++ 0x03, 0x0e, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc2, 0x01, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x08, 0x01, 0x01, 0x03, 0x0a, 0x14, 0x00, 0x53, ++ 0x47, 0xc1, 0xe0, 0xbe, 0xf9, 0xd2, 0x11, 0x9a, 0x0c, 0x00, 0x90, 0x27, ++ 0x3f, 0xc1, 0x4d, 0x7f, 0xff, 0x04, 0x00, 0xff, 0xaa, 0x55, 0x3c, 0x00, ++ 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, ++ 0x49, 0x00, 0x00, 0x00, 0x61, 0xdf, 0xe4, 0x8b, 0xca, 0x93, 0xd2, 0x11, ++ 0xaa, 0x0d, 0x00, 0xe0, 0x98, 0x03, 0x2b, 0x8c, 0x45, 0x00, 0x72, 0x00, ++ 0x72, 0x00, 0x4f, 0x00, 0x75, 0x00, 0x74, 0x00, 0x00, 0x00, 0x02, 0x01, ++ 0x0c, 0x00, 0xd0, 0x41, 0x03, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, ++ 0x06, 0x00, 0x00, 0x01, 0x02, 0x01, 0x0c, 0x00, 0xd0, 0x41, 0x01, 0x05, ++ 0x00, 0x00, 0x00, 0x00, 0x03, 0x0e, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0xc2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x01, 0x01, 0x03, ++ 0x0a, 0x14, 0x00, 0x53, 0x47, 0xc1, 0xe0, 0xbe, 0xf9, 0xd2, 0x11, 0x9a, ++ 0x0c, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d, 0x7f, 0xff, 0x04, 0x00, 0xff, ++ 0xaa, 0x55, 0x3c, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x0e, 0x00, 0x00, 0x00, 0x92, 0x00, 0x00, 0x00, 0x61, 0xdf, 0xe4, 0x8b, ++ 0xca, 0x93, 0xd2, 0x11, 0xaa, 0x0d, 0x00, 0xe0, 0x98, 0x03, 0x2b, 0x8c, ++ 0x43, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x4f, 0x00, 0x75, 0x00, 0x74, 0x00, ++ 0x00, 0x00, 0x02, 0x01, 0x0c, 0x00, 0xd0, 0x41, 0x03, 0x0a, 0x00, 0x00, ++ 0x00, 0x00, 0x01, 0x01, 0x06, 0x00, 0x00, 0x01, 0x02, 0x01, 0x0c, 0x00, ++ 0xd0, 0x41, 0x01, 0x05, 0x00, 0x00, 0x00, 0x00, 0x03, 0x0e, 0x13, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0xc2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x08, 0x01, 0x01, 0x03, 0x0a, 0x14, 0x00, 0x53, 0x47, 0xc1, 0xe0, 0xbe, ++ 0xf9, 0xd2, 0x11, 0x9a, 0x0c, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d, 0x7f, ++ 0x01, 0x04, 0x00, 0x02, 0x01, 0x0c, 0x00, 0xd0, 0x41, 0x03, 0x0a, 0x00, ++ 0x00, 0x00, 0x00, 0x01, 0x01, 0x06, 0x00, 0x00, 0x01, 0x02, 0x01, 0x0c, ++ 0x00, 0xd0, 0x41, 0x01, 0x05, 0x01, 0x00, 0x00, 0x00, 0x03, 0x0e, 0x13, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc2, 0x01, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x08, 0x01, 0x01, 0x03, 0x0a, 0x14, 0x00, 0x53, 0x47, 0xc1, 0xe0, ++ 0xbe, 0xf9, 0xd2, 0x11, 0x9a, 0x0c, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d, ++ 0x7f, 0xff, 0x04, 0x00, 0xaa, 0x55, 0x3c, 0x00, 0x07, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, ++ 0x61, 0xdf, 0xe4, 0x8b, 0xca, 0x93, 0xd2, 0x11, 0xaa, 0x0d, 0x00, 0xe0, ++ 0x98, 0x03, 0x2b, 0x8c, 0x43, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x49, 0x00, ++ 0x6e, 0x00, 0x00, 0x00, 0x02, 0x01, 0x0c, 0x00, 0xd0, 0x41, 0x03, 0x0a, ++ 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x06, 0x00, 0x00, 0x01, 0x02, 0x01, ++ 0x0c, 0x00, 0xd0, 0x41, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x01, ++ 0x04, 0x00, 0x02, 0x01, 0x0c, 0x00, 0xd0, 0x41, 0x03, 0x0a, 0x00, 0x00, ++ 0x00, 0x00, 0x01, 0x01, 0x06, 0x00, 0x00, 0x01, 0x02, 0x01, 0x0c, 0x00, ++ 0xd0, 0x41, 0x01, 0x05, 0x00, 0x00, 0x00, 0x00, 0x03, 0x0e, 0x13, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0xc2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x08, 0x01, 0x01, 0x03, 0x0a, 0x14, 0x00, 0x53, 0x47, 0xc1, 0xe0, 0xbe, ++ 0xf9, 0xd2, 0x11, 0x9a, 0x0c, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d, 0x7f, ++ 0x01, 0x04, 0x00, 0x02, 0x01, 0x0c, 0x00, 0xd0, 0x41, 0x03, 0x0a, 0x00, ++ 0x00, 0x00, 0x00, 0x01, 0x01, 0x06, 0x00, 0x00, 0x01, 0x02, 0x01, 0x0c, ++ 0x00, 0xd0, 0x41, 0x01, 0x05, 0x01, 0x00, 0x00, 0x00, 0x03, 0x0e, 0x13, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc2, 0x01, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x08, 0x01, 0x01, 0x03, 0x0a, 0x14, 0x00, 0x53, 0x47, 0xc1, 0xe0, ++ 0xbe, 0xf9, 0xd2, 0x11, 0x9a, 0x0c, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d, ++ 0x7f, 0xff, 0x04, 0x00, 0xaa, 0x55, 0x3c, 0x00, 0x07, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x92, 0x00, 0x00, 0x00, ++ 0x61, 0xdf, 0xe4, 0x8b, 0xca, 0x93, 0xd2, 0x11, 0xaa, 0x0d, 0x00, 0xe0, ++ 0x98, 0x03, 0x2b, 0x8c, 0x45, 0x00, 0x72, 0x00, 0x72, 0x00, 0x4f, 0x00, ++ 0x75, 0x00, 0x74, 0x00, 0x00, 0x00, 0x02, 0x01, 0x0c, 0x00, 0xd0, 0x41, ++ 0x03, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x06, 0x00, 0x00, 0x01, ++ 0x02, 0x01, 0x0c, 0x00, 0xd0, 0x41, 0x01, 0x05, 0x00, 0x00, 0x00, 0x00, ++ 0x03, 0x0e, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc2, 0x01, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x08, 0x01, 0x01, 0x03, 0x0a, 0x14, 0x00, 0x53, ++ 0x47, 0xc1, 0xe0, 0xbe, 0xf9, 0xd2, 0x11, 0x9a, 0x0c, 0x00, 0x90, 0x27, ++ 0x3f, 0xc1, 0x4d, 0x7f, 0x01, 0x04, 0x00, 0x02, 0x01, 0x0c, 0x00, 0xd0, ++ 0x41, 0x03, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x06, 0x00, 0x00, ++ 0x01, 0x02, 0x01, 0x0c, 0x00, 0xd0, 0x41, 0x01, 0x05, 0x01, 0x00, 0x00, ++ 0x00, 0x03, 0x0e, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc2, 0x01, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x01, 0x01, 0x03, 0x0a, 0x14, 0x00, ++ 0x53, 0x47, 0xc1, 0xe0, 0xbe, 0xf9, 0xd2, 0x11, 0x9a, 0x0c, 0x00, 0x90, ++ 0x27, 0x3f, 0xc1, 0x4d, 0x7f, 0xff, 0x04, 0x00, 0xaa, 0x55, 0x3c, 0x00, ++ 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, ++ 0xb0, 0x00, 0x00, 0x00, 0x61, 0xdf, 0xe4, 0x8b, 0xca, 0x93, 0xd2, 0x11, ++ 0xaa, 0x0d, 0x00, 0xe0, 0x98, 0x03, 0x2b, 0x8c, 0x43, 0x00, 0x6f, 0x00, ++ 0x6e, 0x00, 0x4f, 0x00, 0x75, 0x00, 0x74, 0x00, 0x00, 0x00, 0x02, 0x01, ++ 0x0c, 0x00, 0xd0, 0x41, 0x03, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, ++ 0x06, 0x00, 0x00, 0x01, 0x02, 0x01, 0x0c, 0x00, 0xd0, 0x41, 0x01, 0x05, ++ 0x00, 0x00, 0x00, 0x00, 0x03, 0x0e, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0xc2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x01, 0x01, 0x03, ++ 0x0a, 0x14, 0x00, 0x53, 0x47, 0xc1, 0xe0, 0xbe, 0xf9, 0xd2, 0x11, 0x9a, ++ 0x0c, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d, 0x7f, 0x01, 0x04, 0x00, 0x02, ++ 0x01, 0x0c, 0x00, 0xd0, 0x41, 0x03, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x01, ++ 0x01, 0x06, 0x00, 0x00, 0x01, 0x02, 0x01, 0x0c, 0x00, 0xd0, 0x41, 0x01, ++ 0x05, 0x01, 0x00, 0x00, 0x00, 0x03, 0x0e, 0x13, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0xc2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x01, 0x01, ++ 0x03, 0x0a, 0x14, 0x00, 0x53, 0x47, 0xc1, 0xe0, 0xbe, 0xf9, 0xd2, 0x11, ++ 0x9a, 0x0c, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d, 0x7f, 0x01, 0x04, 0x00, ++ 0x02, 0x01, 0x0c, 0x00, 0xd0, 0x41, 0x03, 0x0a, 0x00, 0x00, 0x00, 0x00, ++ 0x01, 0x01, 0x06, 0x00, 0x00, 0x05, 0x02, 0x03, 0x08, 0x00, 0x00, 0x01, ++ 0x01, 0x80, 0x7f, 0xff, 0x04, 0x00, 0xff, 0xff, 0xaa, 0x55, 0x3c, 0x00, ++ 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, ++ 0x67, 0x00, 0x00, 0x00, 0x61, 0xdf, 0xe4, 0x8b, 0xca, 0x93, 0xd2, 0x11, ++ 0xaa, 0x0d, 0x00, 0xe0, 0x98, 0x03, 0x2b, 0x8c, 0x43, 0x00, 0x6f, 0x00, ++ 0x6e, 0x00, 0x4f, 0x00, 0x75, 0x00, 0x74, 0x00, 0x00, 0x00, 0x02, 0x01, ++ 0x0c, 0x00, 0xd0, 0x41, 0x03, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, ++ 0x06, 0x00, 0x00, 0x01, 0x02, 0x01, 0x0c, 0x00, 0xd0, 0x41, 0x01, 0x05, ++ 0x01, 0x00, 0x00, 0x00, 0x03, 0x0e, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0xc2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x01, 0x01, 0x03, ++ 0x0a, 0x14, 0x00, 0x53, 0x47, 0xc1, 0xe0, 0xbe, 0xf9, 0xd2, 0x11, 0x9a, ++ 0x0c, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d, 0x7f, 0x01, 0x04, 0x00, 0x02, ++ 0x01, 0x0c, 0x00, 0xd0, 0x41, 0x03, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x01, ++ 0x01, 0x06, 0x00, 0x00, 0x05, 0x02, 0x03, 0x08, 0x00, 0x00, 0x01, 0x01, ++ 0x80, 0x7f, 0xff, 0x04, 0x00, 0xff, 0xff, 0xff, 0xaa, 0x55, 0x3f, 0x00, ++ 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, ++ 0x1e, 0x00, 0x00, 0x00, 0x61, 0xdf, 0xe4, 0x8b, 0xca, 0x93, 0xd2, 0x11, ++ 0xaa, 0x0d, 0x00, 0xe0, 0x98, 0x03, 0x2b, 0x8c, 0x43, 0x00, 0x6f, 0x00, ++ 0x6e, 0x00, 0x4f, 0x00, 0x75, 0x00, 0x74, 0x00, 0x00, 0x00, 0x02, 0x01, ++ 0x0c, 0x00, 0xd0, 0x41, 0x03, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, ++ 0x06, 0x00, 0x00, 0x05, 0x02, 0x03, 0x08, 0x00, 0x00, 0x01, 0x01, 0x80, ++ 0x7f, 0xff, 0x04, 0x00, 0xaa, 0x55, 0x3c, 0x00, 0x07, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x6b, 0x00, 0x00, 0x00, ++ 0x61, 0xdf, 0xe4, 0x8b, 0xca, 0x93, 0xd2, 0x11, 0xaa, 0x0d, 0x00, 0xe0, ++ 0x98, 0x03, 0x2b, 0x8c, 0x43, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x49, 0x00, ++ 0x6e, 0x00, 0x00, 0x00, 0x02, 0x01, 0x0c, 0x00, 0xd0, 0x41, 0x03, 0x0a, ++ 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x06, 0x00, 0x00, 0x01, 0x02, 0x01, ++ 0x0c, 0x00, 0xd0, 0x41, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x01, ++ 0x04, 0x00, 0x02, 0x01, 0x0c, 0x00, 0xd0, 0x41, 0x03, 0x0a, 0x00, 0x00, ++ 0x00, 0x00, 0x01, 0x01, 0x06, 0x00, 0x00, 0x01, 0x02, 0x01, 0x0c, 0x00, ++ 0xd0, 0x41, 0x01, 0x05, 0x01, 0x00, 0x00, 0x00, 0x03, 0x0e, 0x13, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0xc2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x08, 0x01, 0x01, 0x03, 0x0a, 0x14, 0x00, 0x53, 0x47, 0xc1, 0xe0, 0xbe, ++ 0xf9, 0xd2, 0x11, 0x9a, 0x0c, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d, 0x7f, ++ 0xff, 0x04, 0x00, 0xff, 0xaa, 0x55, 0x3f, 0x00, 0x07, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, ++ 0x61, 0xdf, 0xe4, 0x8b, 0xca, 0x93, 0xd2, 0x11, 0xaa, 0x0d, 0x00, 0xe0, ++ 0x98, 0x03, 0x2b, 0x8c, 0x43, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x49, 0x00, ++ 0x6e, 0x00, 0x00, 0x00, 0x02, 0x01, 0x0c, 0x00, 0xd0, 0x41, 0x03, 0x0a, ++ 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x06, 0x00, 0x00, 0x01, 0x02, 0x01, ++ 0x0c, 0x00, 0xd0, 0x41, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, ++ 0x04, 0x00, 0xff, 0xff, 0xaa, 0x55, 0x3d, 0x00, 0x07, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x49, 0x00, 0x00, 0x00, ++ 0x61, 0xdf, 0xe4, 0x8b, 0xca, 0x93, 0xd2, 0x11, 0xaa, 0x0d, 0x00, 0xe0, ++ 0x98, 0x03, 0x2b, 0x8c, 0x45, 0x00, 0x72, 0x00, 0x72, 0x00, 0x4f, 0x00, ++ 0x75, 0x00, 0x74, 0x00, 0x00, 0x00, 0x02, 0x01, 0x0c, 0x00, 0xd0, 0x41, ++ 0x03, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x06, 0x00, 0x00, 0x01, ++ 0x02, 0x01, 0x0c, 0x00, 0xd0, 0x41, 0x01, 0x05, 0x01, 0x00, 0x00, 0x00, ++ 0x03, 0x0e, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc2, 0x01, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x08, 0x01, 0x01, 0x03, 0x0a, 0x14, 0x00, 0x53, ++ 0x47, 0xc1, 0xe0, 0xbe, 0xf9, 0xd2, 0x11, 0x9a, 0x0c, 0x00, 0x90, 0x27, ++ 0x3f, 0xc1, 0x4d, 0x7f, 0xff, 0x04, 0x00, 0xff, 0xaa, 0x55, 0x3f, 0x00, ++ 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, ++ 0x3e, 0x00, 0x00, 0x00, 0x61, 0xdf, 0xe4, 0x8b, 0xca, 0x93, 0xd2, 0x11, ++ 0xaa, 0x0d, 0x00, 0xe0, 0x98, 0x03, 0x2b, 0x8c, 0x42, 0x00, 0x6f, 0x00, ++ 0x6f, 0x00, 0x74, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, ++ 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x22, 0x00, 0x45, 0x00, 0x46, 0x00, ++ 0x49, 0x00, 0x20, 0x00, 0x46, 0x00, 0x6c, 0x00, 0x6f, 0x00, 0x70, 0x00, ++ 0x70, 0x00, 0x79, 0x00, 0x00, 0x00, 0x02, 0x01, 0x0c, 0x00, 0xd0, 0x41, ++ 0x03, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x06, 0x00, 0x00, 0x01, ++ 0x02, 0x01, 0x0c, 0x00, 0xd0, 0x41, 0x04, 0x06, 0x00, 0x00, 0x00, 0x00, ++ 0x7f, 0xff, 0x04, 0x00, 0xaa, 0x55, 0x3c, 0x00, 0x07, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, ++ 0x61, 0xdf, 0xe4, 0x8b, 0xca, 0x93, 0xd2, 0x11, 0xaa, 0x0d, 0x00, 0xe0, ++ 0x98, 0x03, 0x2b, 0x8c, 0x42, 0x00, 0x6f, 0x00, 0x6f, 0x00, 0x74, 0x00, ++ 0x4f, 0x00, 0x72, 0x00, 0x64, 0x00, 0x65, 0x00, 0x72, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0xff, 0xff, 0xaa, 0x55, 0x3f, 0x00, 0x07, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, ++ 0x61, 0xdf, 0xe4, 0x8b, 0xca, 0x93, 0xd2, 0x11, 0xaa, 0x0d, 0x00, 0xe0, ++ 0x98, 0x03, 0x2b, 0x8c, 0x42, 0x00, 0x6f, 0x00, 0x6f, 0x00, 0x74, 0x00, ++ 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x31, 0x00, 0x00, 0x00, 0x01, 0x00, ++ 0x00, 0x00, 0x22, 0x00, 0x45, 0x00, 0x46, 0x00, 0x49, 0x00, 0x20, 0x00, ++ 0x46, 0x00, 0x6c, 0x00, 0x6f, 0x00, 0x70, 0x00, 0x70, 0x00, 0x79, 0x00, ++ 0x20, 0x00, 0x31, 0x00, 0x00, 0x00, 0x02, 0x01, 0x0c, 0x00, 0xd0, 0x41, ++ 0x03, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x06, 0x00, 0x00, 0x01, ++ 0x02, 0x01, 0x0c, 0x00, 0xd0, 0x41, 0x04, 0x06, 0x01, 0x00, 0x00, 0x00, ++ 0x7f, 0xff, 0x04, 0x00, 0xaa, 0x55, 0x3c, 0x00, 0x07, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, ++ 0x61, 0xdf, 0xe4, 0x8b, 0xca, 0x93, 0xd2, 0x11, 0xaa, 0x0d, 0x00, 0xe0, ++ 0x98, 0x03, 0x2b, 0x8c, 0x42, 0x00, 0x6f, 0x00, 0x6f, 0x00, 0x74, 0x00, ++ 0x4f, 0x00, 0x72, 0x00, 0x64, 0x00, 0x65, 0x00, 0x72, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x01, 0x00, 0xaa, 0x55, 0x3f, 0x00, 0x07, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, ++ 0x61, 0xdf, 0xe4, 0x8b, 0xca, 0x93, 0xd2, 0x11, 0xaa, 0x0d, 0x00, 0xe0, ++ 0x98, 0x03, 0x2b, 0x8c, 0x42, 0x00, 0x6f, 0x00, 0x6f, 0x00, 0x74, 0x00, ++ 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x32, 0x00, 0x00, 0x00, 0x01, 0x00, ++ 0x00, 0x00, 0x1e, 0x00, 0x45, 0x00, 0x46, 0x00, 0x49, 0x00, 0x20, 0x00, ++ 0x44, 0x00, 0x56, 0x00, 0x44, 0x00, 0x2f, 0x00, 0x43, 0x00, 0x44, 0x00, ++ 0x52, 0x00, 0x4f, 0x00, 0x4d, 0x00, 0x00, 0x00, 0x02, 0x01, 0x0c, 0x00, ++ 0xd0, 0x41, 0x03, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x06, 0x00, ++ 0x01, 0x01, 0x03, 0x01, 0x08, 0x00, 0x01, 0x00, 0x00, 0x00, 0x7f, 0xff, ++ 0x04, 0x00, 0xff, 0xff, 0xaa, 0x55, 0x3c, 0x00, 0x07, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, ++ 0x61, 0xdf, 0xe4, 0x8b, 0xca, 0x93, 0xd2, 0x11, 0xaa, 0x0d, 0x00, 0xe0, ++ 0x98, 0x03, 0x2b, 0x8c, 0x42, 0x00, 0x6f, 0x00, 0x6f, 0x00, 0x74, 0x00, ++ 0x4f, 0x00, 0x72, 0x00, 0x64, 0x00, 0x65, 0x00, 0x72, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0xff, 0xff, 0xaa, 0x55, 0x3f, 0x00, ++ 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, ++ 0x42, 0x00, 0x00, 0x00, 0x61, 0xdf, 0xe4, 0x8b, 0xca, 0x93, 0xd2, 0x11, ++ 0xaa, 0x0d, 0x00, 0xe0, 0x98, 0x03, 0x2b, 0x8c, 0x42, 0x00, 0x6f, 0x00, ++ 0x6f, 0x00, 0x74, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x33, 0x00, ++ 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x45, 0x00, 0x46, 0x00, ++ 0x49, 0x00, 0x20, 0x00, 0x48, 0x00, 0x61, 0x00, 0x72, 0x00, 0x64, 0x00, ++ 0x20, 0x00, 0x44, 0x00, 0x72, 0x00, 0x69, 0x00, 0x76, 0x00, 0x65, 0x00, ++ 0x00, 0x00, 0x02, 0x01, 0x0c, 0x00, 0xd0, 0x41, 0x03, 0x0a, 0x00, 0x00, ++ 0x00, 0x00, 0x01, 0x01, 0x06, 0x00, 0x01, 0x01, 0x03, 0x01, 0x08, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0x04, 0x00, 0xaa, 0x55, 0x3c, 0x00, ++ 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, ++ 0x08, 0x00, 0x00, 0x00, 0x61, 0xdf, 0xe4, 0x8b, 0xca, 0x93, 0xd2, 0x11, ++ 0xaa, 0x0d, 0x00, 0xe0, 0x98, 0x03, 0x2b, 0x8c, 0x42, 0x00, 0x6f, 0x00, ++ 0x6f, 0x00, 0x74, 0x00, 0x4f, 0x00, 0x72, 0x00, 0x64, 0x00, 0x65, 0x00, ++ 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, ++ 0xaa, 0x55, 0x3f, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x12, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x61, 0xdf, 0xe4, 0x8b, ++ 0xca, 0x93, 0xd2, 0x11, 0xaa, 0x0d, 0x00, 0xe0, 0x98, 0x03, 0x2b, 0x8c, ++ 0x42, 0x00, 0x6f, 0x00, 0x6f, 0x00, 0x74, 0x00, 0x30, 0x00, 0x30, 0x00, ++ 0x30, 0x00, 0x34, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x30, 0x00, ++ 0x45, 0x00, 0x46, 0x00, 0x49, 0x00, 0x20, 0x00, 0x49, 0x00, 0x6e, 0x00, ++ 0x74, 0x00, 0x65, 0x00, 0x72, 0x00, 0x6e, 0x00, 0x61, 0x00, 0x6c, 0x00, ++ 0x20, 0x00, 0x53, 0x00, 0x68, 0x00, 0x65, 0x00, 0x6c, 0x00, 0x6c, 0x00, ++ 0x00, 0x00, 0x01, 0x03, 0x18, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x1f, 0x01, 0x00, 0x00, ++ 0x00, 0x00, 0x04, 0x06, 0x14, 0x00, 0x83, 0xa5, 0x04, 0x7c, 0x3e, 0x9e, ++ 0x1c, 0x4f, 0xad, 0x65, 0xe0, 0x52, 0x68, 0xd0, 0xb4, 0xd1, 0x7f, 0xff, ++ 0x04, 0x00, 0xff, 0xff, 0xaa, 0x55, 0x3f, 0x00, 0x07, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, ++ 0x61, 0xdf, 0xe4, 0x8b, 0xca, 0x93, 0xd2, 0x11, 0xaa, 0x0d, 0x00, 0xe0, ++ 0x98, 0x03, 0x2b, 0x8c, 0x42, 0x00, 0x6f, 0x00, 0x6f, 0x00, 0x74, 0x00, ++ 0x4f, 0x00, 0x72, 0x00, 0x64, 0x00, 0x65, 0x00, 0x72, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04, 0x00, 0xff, 0xff, ++ 0xaa, 0x55, 0x3f, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x2c, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x9f, 0x04, 0x19, 0x4c, ++ 0x37, 0x41, 0xd3, 0x4d, 0x9c, 0x10, 0x8b, 0x97, 0xa8, 0x3f, 0xfd, 0xfa, ++ 0x4d, 0x00, 0x65, 0x00, 0x6d, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x79, 0x00, ++ 0x54, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, 0x49, 0x00, 0x6e, 0x00, ++ 0x66, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x6d, 0x00, 0x61, 0x00, 0x74, 0x00, ++ 0x69, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, ++ 0x04, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, ++ 0x6a, 0x01, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x31, 0x01, 0x00, 0x00, ++ 0x03, 0x00, 0x00, 0x00, 0xef, 0x06, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, ++ 0x00, 0x0f, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0xaa, 0x55, 0x3c, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x11, 0x40, 0x70, 0xeb, ++ 0x02, 0x14, 0xd3, 0x11, 0x8e, 0x77, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b, ++ 0x4d, 0x00, 0x54, 0x00, 0x43, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, ++ 0xaa, 0x55, 0x3f, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x1a, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x5b, 0x54, 0x8c, 0x0e, ++ 0xee, 0xa2, 0x0d, 0x47, 0x8e, 0x26, 0xbd, 0xa1, 0xa1, 0x3c, 0x0a, 0xa3, ++ 0x4c, 0x00, 0x61, 0x00, 0x73, 0x00, 0x74, 0x00, 0x45, 0x00, 0x6e, 0x00, ++ 0x75, 0x00, 0x6d, 0x00, 0x4c, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x67, 0x00, ++ 0x00, 0x00, 0x65, 0x6e, 0x00, 0xff, 0xff, 0xff, 0xaa, 0x55, 0x3c, 0x00, ++ 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, ++ 0x01, 0x00, 0x00, 0x00, 0x0c, 0xec, 0x76, 0xc0, 0x28, 0x70, 0x99, 0x43, ++ 0xa0, 0x72, 0x71, 0xee, 0x5c, 0x44, 0x8b, 0x9f, 0x43, 0x00, 0x75, 0x00, ++ 0x73, 0x00, 0x74, 0x00, 0x6f, 0x00, 0x6d, 0x00, 0x4d, 0x00, 0x6f, 0x00, ++ 0x64, 0x00, 0x65, 0x00, 0x00, 0x00, 0x01, 0xff, 0xaa, 0x55, 0x3f, 0x00, ++ 0x27, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0xe1, 0x07, 0x04, 0x1d, 0x12, 0x0f, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, ++ 0x47, 0x0c, 0x00, 0x00, 0xcb, 0xb2, 0x19, 0xd7, 0x3a, 0x3d, 0x96, 0x45, ++ 0xa3, 0xbc, 0xda, 0xd0, 0x0e, 0x67, 0x65, 0x6f, 0x64, 0x00, 0x62, 0x00, ++ 0x00, 0x00, 0xa1, 0x59, 0xc0, 0xa5, 0xe4, 0x94, 0xa7, 0x4a, 0x87, 0xb5, ++ 0xab, 0x15, 0x5c, 0x2b, 0xf0, 0x72, 0x07, 0x06, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0xeb, 0x05, 0x00, 0x00, 0x0b, 0xdf, 0xc1, 0xd5, 0xac, 0x1b, ++ 0xdf, 0x4e, 0xba, 0x48, 0x08, 0x83, 0x40, 0x09, 0xca, 0x5a, 0x30, 0x82, ++ 0x05, 0xd7, 0x30, 0x82, 0x03, 0xbf, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, ++ 0x0a, 0x61, 0x07, 0x76, 0x56, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x30, ++ 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, ++ 0x05, 0x00, 0x30, 0x81, 0x88, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, ++ 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, ++ 0x55, 0x04, 0x08, 0x13, 0x0a, 0x57, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, ++ 0x74, 0x6f, 0x6e, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x07, ++ 0x13, 0x07, 0x52, 0x65, 0x64, 0x6d, 0x6f, 0x6e, 0x64, 0x31, 0x1e, 0x30, ++ 0x1c, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x15, 0x4d, 0x69, 0x63, 0x72, ++ 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x20, 0x43, 0x6f, 0x72, 0x70, 0x6f, 0x72, ++ 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x31, 0x32, 0x30, 0x30, 0x06, 0x03, 0x55, ++ 0x04, 0x03, 0x13, 0x29, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, ++ 0x74, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, ++ 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, ++ 0x72, 0x69, 0x74, 0x79, 0x20, 0x32, 0x30, 0x31, 0x30, 0x30, 0x1e, 0x17, ++ 0x0d, 0x31, 0x31, 0x31, 0x30, 0x31, 0x39, 0x31, 0x38, 0x34, 0x31, 0x34, ++ 0x32, 0x5a, 0x17, 0x0d, 0x32, 0x36, 0x31, 0x30, 0x31, 0x39, 0x31, 0x38, ++ 0x35, 0x31, 0x34, 0x32, 0x5a, 0x30, 0x81, 0x84, 0x31, 0x0b, 0x30, 0x09, ++ 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x13, 0x30, ++ 0x11, 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x0a, 0x57, 0x61, 0x73, 0x68, ++ 0x69, 0x6e, 0x67, 0x74, 0x6f, 0x6e, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, ++ 0x55, 0x04, 0x07, 0x13, 0x07, 0x52, 0x65, 0x64, 0x6d, 0x6f, 0x6e, 0x64, ++ 0x31, 0x1e, 0x30, 0x1c, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x15, 0x4d, ++ 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x20, 0x43, 0x6f, 0x72, ++ 0x70, 0x6f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x31, 0x2e, 0x30, 0x2c, ++ 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x25, 0x4d, 0x69, 0x63, 0x72, 0x6f, ++ 0x73, 0x6f, 0x66, 0x74, 0x20, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x73, ++ 0x20, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, ++ 0x50, 0x43, 0x41, 0x20, 0x32, 0x30, 0x31, 0x31, 0x30, 0x82, 0x01, 0x22, ++ 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, ++ 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, ++ 0x02, 0x82, 0x01, 0x01, 0x00, 0xdd, 0x0c, 0xbb, 0xa2, 0xe4, 0x2e, 0x09, ++ 0xe3, 0xe7, 0xc5, 0xf7, 0x96, 0x69, 0xbc, 0x00, 0x21, 0xbd, 0x69, 0x33, ++ 0x33, 0xef, 0xad, 0x04, 0xcb, 0x54, 0x80, 0xee, 0x06, 0x83, 0xbb, 0xc5, ++ 0x20, 0x84, 0xd9, 0xf7, 0xd2, 0x8b, 0xf3, 0x38, 0xb0, 0xab, 0xa4, 0xad, ++ 0x2d, 0x7c, 0x62, 0x79, 0x05, 0xff, 0xe3, 0x4a, 0x3f, 0x04, 0x35, 0x20, ++ 0x70, 0xe3, 0xc4, 0xe7, 0x6b, 0xe0, 0x9c, 0xc0, 0x36, 0x75, 0xe9, 0x8a, ++ 0x31, 0xdd, 0x8d, 0x70, 0xe5, 0xdc, 0x37, 0xb5, 0x74, 0x46, 0x96, 0x28, ++ 0x5b, 0x87, 0x60, 0x23, 0x2c, 0xbf, 0xdc, 0x47, 0xa5, 0x67, 0xf7, 0x51, ++ 0x27, 0x9e, 0x72, 0xeb, 0x07, 0xa6, 0xc9, 0xb9, 0x1e, 0x3b, 0x53, 0x35, ++ 0x7c, 0xe5, 0xd3, 0xec, 0x27, 0xb9, 0x87, 0x1c, 0xfe, 0xb9, 0xc9, 0x23, ++ 0x09, 0x6f, 0xa8, 0x46, 0x91, 0xc1, 0x6e, 0x96, 0x3c, 0x41, 0xd3, 0xcb, ++ 0xa3, 0x3f, 0x5d, 0x02, 0x6a, 0x4d, 0xec, 0x69, 0x1f, 0x25, 0x28, 0x5c, ++ 0x36, 0xff, 0xfd, 0x43, 0x15, 0x0a, 0x94, 0xe0, 0x19, 0xb4, 0xcf, 0xdf, ++ 0xc2, 0x12, 0xe2, 0xc2, 0x5b, 0x27, 0xee, 0x27, 0x78, 0x30, 0x8b, 0x5b, ++ 0x2a, 0x09, 0x6b, 0x22, 0x89, 0x53, 0x60, 0x16, 0x2c, 0xc0, 0x68, 0x1d, ++ 0x53, 0xba, 0xec, 0x49, 0xf3, 0x9d, 0x61, 0x8c, 0x85, 0x68, 0x09, 0x73, ++ 0x44, 0x5d, 0x7d, 0xa2, 0x54, 0x2b, 0xdd, 0x79, 0xf7, 0x15, 0xcf, 0x35, ++ 0x5d, 0x6c, 0x1c, 0x2b, 0x5c, 0xce, 0xbc, 0x9c, 0x23, 0x8b, 0x6f, 0x6e, ++ 0xb5, 0x26, 0xd9, 0x36, 0x13, 0xc3, 0x4f, 0xd6, 0x27, 0xae, 0xb9, 0x32, ++ 0x3b, 0x41, 0x92, 0x2c, 0xe1, 0xc7, 0xcd, 0x77, 0xe8, 0xaa, 0x54, 0x4e, ++ 0xf7, 0x5c, 0x0b, 0x04, 0x87, 0x65, 0xb4, 0x43, 0x18, 0xa8, 0xb2, 0xe0, ++ 0x6d, 0x19, 0x77, 0xec, 0x5a, 0x24, 0xfa, 0x48, 0x03, 0x02, 0x03, 0x01, ++ 0x00, 0x01, 0xa3, 0x82, 0x01, 0x43, 0x30, 0x82, 0x01, 0x3f, 0x30, 0x10, ++ 0x06, 0x09, 0x2b, 0x06, 0x01, 0x04, 0x01, 0x82, 0x37, 0x15, 0x01, 0x04, ++ 0x03, 0x02, 0x01, 0x00, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, ++ 0x16, 0x04, 0x14, 0xa9, 0x29, 0x02, 0x39, 0x8e, 0x16, 0xc4, 0x97, 0x78, ++ 0xcd, 0x90, 0xf9, 0x9e, 0x4f, 0x9a, 0xe1, 0x7c, 0x55, 0xaf, 0x53, 0x30, ++ 0x19, 0x06, 0x09, 0x2b, 0x06, 0x01, 0x04, 0x01, 0x82, 0x37, 0x14, 0x02, ++ 0x04, 0x0c, 0x1e, 0x0a, 0x00, 0x53, 0x00, 0x75, 0x00, 0x62, 0x00, 0x43, ++ 0x00, 0x41, 0x30, 0x0b, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x04, 0x04, 0x03, ++ 0x02, 0x01, 0x86, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, ++ 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x1f, 0x06, 0x03, ++ 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0xd5, 0xf6, 0x56, ++ 0xcb, 0x8f, 0xe8, 0xa2, 0x5c, 0x62, 0x68, 0xd1, 0x3d, 0x94, 0x90, 0x5b, ++ 0xd7, 0xce, 0x9a, 0x18, 0xc4, 0x30, 0x56, 0x06, 0x03, 0x55, 0x1d, 0x1f, ++ 0x04, 0x4f, 0x30, 0x4d, 0x30, 0x4b, 0xa0, 0x49, 0xa0, 0x47, 0x86, 0x45, ++ 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x63, 0x72, 0x6c, 0x2e, 0x6d, ++ 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x2e, 0x63, 0x6f, 0x6d, ++ 0x2f, 0x70, 0x6b, 0x69, 0x2f, 0x63, 0x72, 0x6c, 0x2f, 0x70, 0x72, 0x6f, ++ 0x64, 0x75, 0x63, 0x74, 0x73, 0x2f, 0x4d, 0x69, 0x63, 0x52, 0x6f, 0x6f, ++ 0x43, 0x65, 0x72, 0x41, 0x75, 0x74, 0x5f, 0x32, 0x30, 0x31, 0x30, 0x2d, ++ 0x30, 0x36, 0x2d, 0x32, 0x33, 0x2e, 0x63, 0x72, 0x6c, 0x30, 0x5a, 0x06, ++ 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x01, 0x01, 0x04, 0x4e, 0x30, ++ 0x4c, 0x30, 0x4a, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x30, ++ 0x02, 0x86, 0x3e, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, ++ 0x77, 0x2e, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x2e, ++ 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x6b, 0x69, 0x2f, 0x63, 0x65, 0x72, 0x74, ++ 0x73, 0x2f, 0x4d, 0x69, 0x63, 0x52, 0x6f, 0x6f, 0x43, 0x65, 0x72, 0x41, ++ 0x75, 0x74, 0x5f, 0x32, 0x30, 0x31, 0x30, 0x2d, 0x30, 0x36, 0x2d, 0x32, ++ 0x33, 0x2e, 0x63, 0x72, 0x74, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, ++ 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, 0x02, 0x01, ++ 0x00, 0x14, 0xfc, 0x7c, 0x71, 0x51, 0xa5, 0x79, 0xc2, 0x6e, 0xb2, 0xef, ++ 0x39, 0x3e, 0xbc, 0x3c, 0x52, 0x0f, 0x6e, 0x2b, 0x3f, 0x10, 0x13, 0x73, ++ 0xfe, 0xa8, 0x68, 0xd0, 0x48, 0xa6, 0x34, 0x4d, 0x8a, 0x96, 0x05, 0x26, ++ 0xee, 0x31, 0x46, 0x90, 0x61, 0x79, 0xd6, 0xff, 0x38, 0x2e, 0x45, 0x6b, ++ 0xf4, 0xc0, 0xe5, 0x28, 0xb8, 0xda, 0x1d, 0x8f, 0x8a, 0xdb, 0x09, 0xd7, ++ 0x1a, 0xc7, 0x4c, 0x0a, 0x36, 0x66, 0x6a, 0x8c, 0xec, 0x1b, 0xd7, 0x04, ++ 0x90, 0xa8, 0x18, 0x17, 0xa4, 0x9b, 0xb9, 0xe2, 0x40, 0x32, 0x36, 0x76, ++ 0xc4, 0xc1, 0x5a, 0xc6, 0xbf, 0xe4, 0x04, 0xc0, 0xea, 0x16, 0xd3, 0xac, ++ 0xc3, 0x68, 0xef, 0x62, 0xac, 0xdd, 0x54, 0x6c, 0x50, 0x30, 0x58, 0xa6, ++ 0xeb, 0x7c, 0xfe, 0x94, 0xa7, 0x4e, 0x8e, 0xf4, 0xec, 0x7c, 0x86, 0x73, ++ 0x57, 0xc2, 0x52, 0x21, 0x73, 0x34, 0x5a, 0xf3, 0xa3, 0x8a, 0x56, 0xc8, ++ 0x04, 0xda, 0x07, 0x09, 0xed, 0xf8, 0x8b, 0xe3, 0xce, 0xf4, 0x7e, 0x8e, ++ 0xae, 0xf0, 0xf6, 0x0b, 0x8a, 0x08, 0xfb, 0x3f, 0xc9, 0x1d, 0x72, 0x7f, ++ 0x53, 0xb8, 0xeb, 0xbe, 0x63, 0xe0, 0xe3, 0x3d, 0x31, 0x65, 0xb0, 0x81, ++ 0xe5, 0xf2, 0xac, 0xcd, 0x16, 0xa4, 0x9f, 0x3d, 0xa8, 0xb1, 0x9b, 0xc2, ++ 0x42, 0xd0, 0x90, 0x84, 0x5f, 0x54, 0x1d, 0xff, 0x89, 0xea, 0xba, 0x1d, ++ 0x47, 0x90, 0x6f, 0xb0, 0x73, 0x4e, 0x41, 0x9f, 0x40, 0x9f, 0x5f, 0xe5, ++ 0xa1, 0x2a, 0xb2, 0x11, 0x91, 0x73, 0x8a, 0x21, 0x28, 0xf0, 0xce, 0xde, ++ 0x73, 0x39, 0x5f, 0x3e, 0xab, 0x5c, 0x60, 0xec, 0xdf, 0x03, 0x10, 0xa8, ++ 0xd3, 0x09, 0xe9, 0xf4, 0xf6, 0x96, 0x85, 0xb6, 0x7f, 0x51, 0x88, 0x66, ++ 0x47, 0x19, 0x8d, 0xa2, 0xb0, 0x12, 0x3d, 0x81, 0x2a, 0x68, 0x05, 0x77, ++ 0xbb, 0x91, 0x4c, 0x62, 0x7b, 0xb6, 0xc1, 0x07, 0xc7, 0xba, 0x7a, 0x87, ++ 0x34, 0x03, 0x0e, 0x4b, 0x62, 0x7a, 0x99, 0xe9, 0xca, 0xfc, 0xce, 0x4a, ++ 0x37, 0xc9, 0x2d, 0xa4, 0x57, 0x7c, 0x1c, 0xfe, 0x3d, 0xdc, 0xb8, 0x0f, ++ 0x5a, 0xfa, 0xd6, 0xc4, 0xb3, 0x02, 0x85, 0x02, 0x3a, 0xea, 0xb3, 0xd9, ++ 0x6e, 0xe4, 0x69, 0x21, 0x37, 0xde, 0x81, 0xd1, 0xf6, 0x75, 0x19, 0x05, ++ 0x67, 0xd3, 0x93, 0x57, 0x5e, 0x29, 0x1b, 0x39, 0xc8, 0xee, 0x2d, 0xe1, ++ 0xcd, 0xe4, 0x45, 0x73, 0x5b, 0xd0, 0xd2, 0xce, 0x7a, 0xab, 0x16, 0x19, ++ 0x82, 0x46, 0x58, 0xd0, 0x5e, 0x9d, 0x81, 0xb3, 0x67, 0xaf, 0x6c, 0x35, ++ 0xf2, 0xbc, 0xe5, 0x3f, 0x24, 0xe2, 0x35, 0xa2, 0x0a, 0x75, 0x06, 0xf6, ++ 0x18, 0x56, 0x99, 0xd4, 0x78, 0x2c, 0xd1, 0x05, 0x1b, 0xeb, 0xd0, 0x88, ++ 0x01, 0x9d, 0xaa, 0x10, 0xf1, 0x05, 0xdf, 0xba, 0x7e, 0x2c, 0x63, 0xb7, ++ 0x06, 0x9b, 0x23, 0x21, 0xc4, 0xf9, 0x78, 0x6c, 0xe2, 0x58, 0x17, 0x06, ++ 0x36, 0x2b, 0x91, 0x12, 0x03, 0xcc, 0xa4, 0xd9, 0xf2, 0x2d, 0xba, 0xf9, ++ 0x94, 0x9d, 0x40, 0xed, 0x18, 0x45, 0xf1, 0xce, 0x8a, 0x5c, 0x6b, 0x3e, ++ 0xab, 0x03, 0xd3, 0x70, 0x18, 0x2a, 0x0a, 0x6a, 0xe0, 0x5f, 0x47, 0xd1, ++ 0xd5, 0x63, 0x0a, 0x32, 0xf2, 0xaf, 0xd7, 0x36, 0x1f, 0x2a, 0x70, 0x5a, ++ 0xe5, 0x42, 0x59, 0x08, 0x71, 0x4b, 0x57, 0xba, 0x7e, 0x83, 0x81, 0xf0, ++ 0x21, 0x3c, 0xf4, 0x1c, 0xc1, 0xc5, 0xb9, 0x90, 0x93, 0x0e, 0x88, 0x45, ++ 0x93, 0x86, 0xe9, 0xb1, 0x20, 0x99, 0xbe, 0x98, 0xcb, 0xc5, 0x95, 0xa4, ++ 0x5d, 0x62, 0xd6, 0xa0, 0x63, 0x08, 0x20, 0xbd, 0x75, 0x10, 0x77, 0x7d, ++ 0x3d, 0xf3, 0x45, 0xb9, 0x9f, 0x97, 0x9f, 0xcb, 0x57, 0x80, 0x6f, 0x33, ++ 0xa9, 0x04, 0xcf, 0x77, 0xa4, 0x62, 0x1c, 0x59, 0x7e, 0xa1, 0x59, 0xc0, ++ 0xa5, 0xe4, 0x94, 0xa7, 0x4a, 0x87, 0xb5, 0xab, 0x15, 0x5c, 0x2b, 0xf0, ++ 0x72, 0x40, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x06, 0x00, ++ 0x00, 0x0b, 0xdf, 0xc1, 0xd5, 0xac, 0x1b, 0xdf, 0x4e, 0xba, 0x48, 0x08, ++ 0x83, 0x40, 0x09, 0xca, 0x5a, 0x30, 0x82, 0x06, 0x10, 0x30, 0x82, 0x03, ++ 0xf8, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x0a, 0x61, 0x08, 0xd3, 0xc4, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, ++ 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, 0x81, 0x91, ++ 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, ++ 0x53, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x0a, ++ 0x57, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x74, 0x6f, 0x6e, 0x31, 0x10, ++ 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x07, 0x52, 0x65, 0x64, ++ 0x6d, 0x6f, 0x6e, 0x64, 0x31, 0x1e, 0x30, 0x1c, 0x06, 0x03, 0x55, 0x04, ++ 0x0a, 0x13, 0x15, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, ++ 0x20, 0x43, 0x6f, 0x72, 0x70, 0x6f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, ++ 0x31, 0x3b, 0x30, 0x39, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x32, 0x4d, ++ 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x20, 0x43, 0x6f, 0x72, ++ 0x70, 0x6f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x54, 0x68, 0x69, ++ 0x72, 0x64, 0x20, 0x50, 0x61, 0x72, 0x74, 0x79, 0x20, 0x4d, 0x61, 0x72, ++ 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x20, 0x52, 0x6f, 0x6f, ++ 0x74, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x31, 0x30, 0x36, 0x32, 0x37, 0x32, ++ 0x31, 0x32, 0x32, 0x34, 0x35, 0x5a, 0x17, 0x0d, 0x32, 0x36, 0x30, 0x36, ++ 0x32, 0x37, 0x32, 0x31, 0x33, 0x32, 0x34, 0x35, 0x5a, 0x30, 0x81, 0x81, ++ 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, ++ 0x53, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x0a, ++ 0x57, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x74, 0x6f, 0x6e, 0x31, 0x10, ++ 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x07, 0x52, 0x65, 0x64, ++ 0x6d, 0x6f, 0x6e, 0x64, 0x31, 0x1e, 0x30, 0x1c, 0x06, 0x03, 0x55, 0x04, ++ 0x0a, 0x13, 0x15, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, ++ 0x20, 0x43, 0x6f, 0x72, 0x70, 0x6f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, ++ 0x31, 0x2b, 0x30, 0x29, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x22, 0x4d, ++ 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x20, 0x43, 0x6f, 0x72, ++ 0x70, 0x6f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x55, 0x45, 0x46, ++ 0x49, 0x20, 0x43, 0x41, 0x20, 0x32, 0x30, 0x31, 0x31, 0x30, 0x82, 0x01, ++ 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, ++ 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, ++ 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xa5, 0x08, 0x6c, 0x4c, 0xc7, 0x45, ++ 0x09, 0x6a, 0x4b, 0x0c, 0xa4, 0xc0, 0x87, 0x7f, 0x06, 0x75, 0x0c, 0x43, ++ 0x01, 0x54, 0x64, 0xe0, 0x16, 0x7f, 0x07, 0xed, 0x92, 0x7d, 0x0b, 0xb2, ++ 0x73, 0xbf, 0x0c, 0x0a, 0xc6, 0x4a, 0x45, 0x61, 0xa0, 0xc5, 0x16, 0x2d, ++ 0x96, 0xd3, 0xf5, 0x2b, 0xa0, 0xfb, 0x4d, 0x49, 0x9b, 0x41, 0x80, 0x90, ++ 0x3c, 0xb9, 0x54, 0xfd, 0xe6, 0xbc, 0xd1, 0x9d, 0xc4, 0xa4, 0x18, 0x8a, ++ 0x7f, 0x41, 0x8a, 0x5c, 0x59, 0x83, 0x68, 0x32, 0xbb, 0x8c, 0x47, 0xc9, ++ 0xee, 0x71, 0xbc, 0x21, 0x4f, 0x9a, 0x8a, 0x7c, 0xff, 0x44, 0x3f, 0x8d, ++ 0x8f, 0x32, 0xb2, 0x26, 0x48, 0xae, 0x75, 0xb5, 0xee, 0xc9, 0x4c, 0x1e, ++ 0x4a, 0x19, 0x7e, 0xe4, 0x82, 0x9a, 0x1d, 0x78, 0x77, 0x4d, 0x0c, 0xb0, ++ 0xbd, 0xf6, 0x0f, 0xd3, 0x16, 0xd3, 0xbc, 0xfa, 0x2b, 0xa5, 0x51, 0x38, ++ 0x5d, 0xf5, 0xfb, 0xba, 0xdb, 0x78, 0x02, 0xdb, 0xff, 0xec, 0x0a, 0x1b, ++ 0x96, 0xd5, 0x83, 0xb8, 0x19, 0x13, 0xe9, 0xb6, 0xc0, 0x7b, 0x40, 0x7b, ++ 0xe1, 0x1f, 0x28, 0x27, 0xc9, 0xfa, 0xef, 0x56, 0x5e, 0x1c, 0xe6, 0x7e, ++ 0x94, 0x7e, 0xc0, 0xf0, 0x44, 0xb2, 0x79, 0x39, 0xe5, 0xda, 0xb2, 0x62, ++ 0x8b, 0x4d, 0xbf, 0x38, 0x70, 0xe2, 0x68, 0x24, 0x14, 0xc9, 0x33, 0xa4, ++ 0x08, 0x37, 0xd5, 0x58, 0x69, 0x5e, 0xd3, 0x7c, 0xed, 0xc1, 0x04, 0x53, ++ 0x08, 0xe7, 0x4e, 0xb0, 0x2a, 0x87, 0x63, 0x08, 0x61, 0x6f, 0x63, 0x15, ++ 0x59, 0xea, 0xb2, 0x2b, 0x79, 0xd7, 0x0c, 0x61, 0x67, 0x8a, 0x5b, 0xfd, ++ 0x5e, 0xad, 0x87, 0x7f, 0xba, 0x86, 0x67, 0x4f, 0x71, 0x58, 0x12, 0x22, ++ 0x04, 0x22, 0x22, 0xce, 0x8b, 0xef, 0x54, 0x71, 0x00, 0xce, 0x50, 0x35, ++ 0x58, 0x76, 0x95, 0x08, 0xee, 0x6a, 0xb1, 0xa2, 0x01, 0xd5, 0x02, 0x03, ++ 0x01, 0x00, 0x01, 0xa3, 0x82, 0x01, 0x76, 0x30, 0x82, 0x01, 0x72, 0x30, ++ 0x12, 0x06, 0x09, 0x2b, 0x06, 0x01, 0x04, 0x01, 0x82, 0x37, 0x15, 0x01, ++ 0x04, 0x05, 0x02, 0x03, 0x01, 0x00, 0x01, 0x30, 0x23, 0x06, 0x09, 0x2b, ++ 0x06, 0x01, 0x04, 0x01, 0x82, 0x37, 0x15, 0x02, 0x04, 0x16, 0x04, 0x14, ++ 0xf8, 0xc1, 0x6b, 0xb7, 0x7f, 0x77, 0x53, 0x4a, 0xf3, 0x25, 0x37, 0x1d, ++ 0x4e, 0xa1, 0x26, 0x7b, 0x0f, 0x20, 0x70, 0x80, 0x30, 0x1d, 0x06, 0x03, ++ 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x13, 0xad, 0xbf, 0x43, 0x09, ++ 0xbd, 0x82, 0x70, 0x9c, 0x8c, 0xd5, 0x4f, 0x31, 0x6e, 0xd5, 0x22, 0x98, ++ 0x8a, 0x1b, 0xd4, 0x30, 0x19, 0x06, 0x09, 0x2b, 0x06, 0x01, 0x04, 0x01, ++ 0x82, 0x37, 0x14, 0x02, 0x04, 0x0c, 0x1e, 0x0a, 0x00, 0x53, 0x00, 0x75, ++ 0x00, 0x62, 0x00, 0x43, 0x00, 0x41, 0x30, 0x0b, 0x06, 0x03, 0x55, 0x1d, ++ 0x0f, 0x04, 0x04, 0x03, 0x02, 0x01, 0x86, 0x30, 0x0f, 0x06, 0x03, 0x55, ++ 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, ++ 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, ++ 0x14, 0x45, 0x66, 0x52, 0x43, 0xe1, 0x7e, 0x58, 0x11, 0xbf, 0xd6, 0x4e, ++ 0x9e, 0x23, 0x55, 0x08, 0x3b, 0x3a, 0x22, 0x6a, 0xa8, 0x30, 0x5c, 0x06, ++ 0x03, 0x55, 0x1d, 0x1f, 0x04, 0x55, 0x30, 0x53, 0x30, 0x51, 0xa0, 0x4f, ++ 0xa0, 0x4d, 0x86, 0x4b, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x63, ++ 0x72, 0x6c, 0x2e, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, ++ 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x6b, 0x69, 0x2f, 0x63, 0x72, 0x6c, ++ 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x2f, 0x4d, 0x69, ++ 0x63, 0x43, 0x6f, 0x72, 0x54, 0x68, 0x69, 0x50, 0x61, 0x72, 0x4d, 0x61, ++ 0x72, 0x52, 0x6f, 0x6f, 0x5f, 0x32, 0x30, 0x31, 0x30, 0x2d, 0x31, 0x30, ++ 0x2d, 0x30, 0x35, 0x2e, 0x63, 0x72, 0x6c, 0x30, 0x60, 0x06, 0x08, 0x2b, ++ 0x06, 0x01, 0x05, 0x05, 0x07, 0x01, 0x01, 0x04, 0x54, 0x30, 0x52, 0x30, ++ 0x50, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x30, 0x02, 0x86, ++ 0x44, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, ++ 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x2e, 0x63, 0x6f, ++ 0x6d, 0x2f, 0x70, 0x6b, 0x69, 0x2f, 0x63, 0x65, 0x72, 0x74, 0x73, 0x2f, ++ 0x4d, 0x69, 0x63, 0x43, 0x6f, 0x72, 0x54, 0x68, 0x69, 0x50, 0x61, 0x72, ++ 0x4d, 0x61, 0x72, 0x52, 0x6f, 0x6f, 0x5f, 0x32, 0x30, 0x31, 0x30, 0x2d, ++ 0x31, 0x30, 0x2d, 0x30, 0x35, 0x2e, 0x63, 0x72, 0x74, 0x30, 0x0d, 0x06, ++ 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, ++ 0x03, 0x82, 0x02, 0x01, 0x00, 0x35, 0x08, 0x42, 0xff, 0x30, 0xcc, 0xce, ++ 0xf7, 0x76, 0x0c, 0xad, 0x10, 0x68, 0x58, 0x35, 0x29, 0x46, 0x32, 0x76, ++ 0x27, 0x7c, 0xef, 0x12, 0x41, 0x27, 0x42, 0x1b, 0x4a, 0xaa, 0x6d, 0x81, ++ 0x38, 0x48, 0x59, 0x13, 0x55, 0xf3, 0xe9, 0x58, 0x34, 0xa6, 0x16, 0x0b, ++ 0x82, 0xaa, 0x5d, 0xad, 0x82, 0xda, 0x80, 0x83, 0x41, 0x06, 0x8f, 0xb4, ++ 0x1d, 0xf2, 0x03, 0xb9, 0xf3, 0x1a, 0x5d, 0x1b, 0xf1, 0x50, 0x90, 0xf9, ++ 0xb3, 0x55, 0x84, 0x42, 0x28, 0x1c, 0x20, 0xbd, 0xb2, 0xae, 0x51, 0x14, ++ 0xc5, 0xc0, 0xac, 0x97, 0x95, 0x21, 0x1c, 0x90, 0xdb, 0x0f, 0xfc, 0x77, ++ 0x9e, 0x95, 0x73, 0x91, 0x88, 0xca, 0xbd, 0xbd, 0x52, 0xb9, 0x05, 0x50, ++ 0x0d, 0xdf, 0x57, 0x9e, 0xa0, 0x61, 0xed, 0x0d, 0xe5, 0x6d, 0x25, 0xd9, ++ 0x40, 0x0f, 0x17, 0x40, 0xc8, 0xce, 0xa3, 0x4a, 0xc2, 0x4d, 0xaf, 0x9a, ++ 0x12, 0x1d, 0x08, 0x54, 0x8f, 0xbd, 0xc7, 0xbc, 0xb9, 0x2b, 0x3d, 0x49, ++ 0x2b, 0x1f, 0x32, 0xfc, 0x6a, 0x21, 0x69, 0x4f, 0x9b, 0xc8, 0x7e, 0x42, ++ 0x34, 0xfc, 0x36, 0x06, 0x17, 0x8b, 0x8f, 0x20, 0x40, 0xc0, 0xb3, 0x9a, ++ 0x25, 0x75, 0x27, 0xcd, 0xc9, 0x03, 0xa3, 0xf6, 0x5d, 0xd1, 0xe7, 0x36, ++ 0x54, 0x7a, 0xb9, 0x50, 0xb5, 0xd3, 0x12, 0xd1, 0x07, 0xbf, 0xbb, 0x74, ++ 0xdf, 0xdc, 0x1e, 0x8f, 0x80, 0xd5, 0xed, 0x18, 0xf4, 0x2f, 0x14, 0x16, ++ 0x6b, 0x2f, 0xde, 0x66, 0x8c, 0xb0, 0x23, 0xe5, 0xc7, 0x84, 0xd8, 0xed, ++ 0xea, 0xc1, 0x33, 0x82, 0xad, 0x56, 0x4b, 0x18, 0x2d, 0xf1, 0x68, 0x95, ++ 0x07, 0xcd, 0xcf, 0xf0, 0x72, 0xf0, 0xae, 0xbb, 0xdd, 0x86, 0x85, 0x98, ++ 0x2c, 0x21, 0x4c, 0x33, 0x2b, 0xf0, 0x0f, 0x4a, 0xf0, 0x68, 0x87, 0xb5, ++ 0x92, 0x55, 0x32, 0x75, 0xa1, 0x6a, 0x82, 0x6a, 0x3c, 0xa3, 0x25, 0x11, ++ 0xa4, 0xed, 0xad, 0xd7, 0x04, 0xae, 0xcb, 0xd8, 0x40, 0x59, 0xa0, 0x84, ++ 0xd1, 0x95, 0x4c, 0x62, 0x91, 0x22, 0x1a, 0x74, 0x1d, 0x8c, 0x3d, 0x47, ++ 0x0e, 0x44, 0xa6, 0xe4, 0xb0, 0x9b, 0x34, 0x35, 0xb1, 0xfa, 0xb6, 0x53, ++ 0xa8, 0x2c, 0x81, 0xec, 0xa4, 0x05, 0x71, 0xc8, 0x9d, 0xb8, 0xba, 0xe8, ++ 0x1b, 0x44, 0x66, 0xe4, 0x47, 0x54, 0x0e, 0x8e, 0x56, 0x7f, 0xb3, 0x9f, ++ 0x16, 0x98, 0xb2, 0x86, 0xd0, 0x68, 0x3e, 0x90, 0x23, 0xb5, 0x2f, 0x5e, ++ 0x8f, 0x50, 0x85, 0x8d, 0xc6, 0x8d, 0x82, 0x5f, 0x41, 0xa1, 0xf4, 0x2e, ++ 0x0d, 0xe0, 0x99, 0xd2, 0x6c, 0x75, 0xe4, 0xb6, 0x69, 0xb5, 0x21, 0x86, ++ 0xfa, 0x07, 0xd1, 0xf6, 0xe2, 0x4d, 0xd1, 0xda, 0xad, 0x2c, 0x77, 0x53, ++ 0x1e, 0x25, 0x32, 0x37, 0xc7, 0x6c, 0x52, 0x72, 0x95, 0x86, 0xb0, 0xf1, ++ 0x35, 0x61, 0x6a, 0x19, 0xf5, 0xb2, 0x3b, 0x81, 0x50, 0x56, 0xa6, 0x32, ++ 0x2d, 0xfe, 0xa2, 0x89, 0xf9, 0x42, 0x86, 0x27, 0x18, 0x55, 0xa1, 0x82, ++ 0xca, 0x5a, 0x9b, 0xf8, 0x30, 0x98, 0x54, 0x14, 0xa6, 0x47, 0x96, 0x25, ++ 0x2f, 0xc8, 0x26, 0xe4, 0x41, 0x94, 0x1a, 0x5c, 0x02, 0x3f, 0xe5, 0x96, ++ 0xe3, 0x85, 0x5b, 0x3c, 0x3e, 0x3f, 0xbb, 0x47, 0x16, 0x72, 0x55, 0xe2, ++ 0x25, 0x22, 0xb1, 0xd9, 0x7b, 0xe7, 0x03, 0x06, 0x2a, 0xa3, 0xf7, 0x1e, ++ 0x90, 0x46, 0xc3, 0x00, 0x0d, 0xd6, 0x19, 0x89, 0xe3, 0x0e, 0x35, 0x27, ++ 0x62, 0x03, 0x71, 0x15, 0xa6, 0xef, 0xd0, 0x27, 0xa0, 0xa0, 0x59, 0x37, ++ 0x60, 0xf8, 0x38, 0x94, 0xb8, 0xe0, 0x78, 0x70, 0xf8, 0xba, 0x4c, 0x86, ++ 0x87, 0x94, 0xf6, 0xe0, 0xae, 0x02, 0x45, 0xee, 0x65, 0xc2, 0xb6, 0xa3, ++ 0x7e, 0x69, 0x16, 0x75, 0x07, 0x92, 0x9b, 0xf5, 0xa6, 0xbc, 0x59, 0x83, ++ 0x58, 0xff, 0xff, 0xff, 0xaa, 0x55, 0x3f, 0x00, 0x27, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe1, 0x07, 0x04, 0x1d, ++ 0x12, 0x0f, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x18, 0x06, 0x00, 0x00, ++ 0x61, 0xdf, 0xe4, 0x8b, 0xca, 0x93, 0xd2, 0x11, 0xaa, 0x0d, 0x00, 0xe0, ++ 0x98, 0x03, 0x2b, 0x8c, 0x4b, 0x00, 0x45, 0x00, 0x4b, 0x00, 0x00, 0x00, ++ 0xa1, 0x59, 0xc0, 0xa5, 0xe4, 0x94, 0xa7, 0x4a, 0x87, 0xb5, 0xab, 0x15, ++ 0x5c, 0x2b, 0xf0, 0x72, 0x18, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0xfc, 0x05, 0x00, 0x00, 0x0b, 0xdf, 0xc1, 0xd5, 0xac, 0x1b, 0xdf, 0x4e, ++ 0xba, 0x48, 0x08, 0x83, 0x40, 0x09, 0xca, 0x5a, 0x30, 0x82, 0x05, 0xe8, ++ 0x30, 0x82, 0x03, 0xd0, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x0a, 0x61, ++ 0x0a, 0xd1, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x30, 0x0d, 0x06, ++ 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, ++ 0x30, 0x81, 0x91, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, ++ 0x13, 0x02, 0x55, 0x53, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, ++ 0x08, 0x13, 0x0a, 0x57, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x74, 0x6f, ++ 0x6e, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x07, ++ 0x52, 0x65, 0x64, 0x6d, 0x6f, 0x6e, 0x64, 0x31, 0x1e, 0x30, 0x1c, 0x06, ++ 0x03, 0x55, 0x04, 0x0a, 0x13, 0x15, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, ++ 0x6f, 0x66, 0x74, 0x20, 0x43, 0x6f, 0x72, 0x70, 0x6f, 0x72, 0x61, 0x74, ++ 0x69, 0x6f, 0x6e, 0x31, 0x3b, 0x30, 0x39, 0x06, 0x03, 0x55, 0x04, 0x03, ++ 0x13, 0x32, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x20, ++ 0x43, 0x6f, 0x72, 0x70, 0x6f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, ++ 0x54, 0x68, 0x69, 0x72, 0x64, 0x20, 0x50, 0x61, 0x72, 0x74, 0x79, 0x20, ++ 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x20, ++ 0x52, 0x6f, 0x6f, 0x74, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x31, 0x30, 0x36, ++ 0x32, 0x34, 0x32, 0x30, 0x34, 0x31, 0x32, 0x39, 0x5a, 0x17, 0x0d, 0x32, ++ 0x36, 0x30, 0x36, 0x32, 0x34, 0x32, 0x30, 0x35, 0x31, 0x32, 0x39, 0x5a, ++ 0x30, 0x81, 0x80, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, ++ 0x13, 0x02, 0x55, 0x53, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, ++ 0x08, 0x13, 0x0a, 0x57, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x74, 0x6f, ++ 0x6e, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x07, ++ 0x52, 0x65, 0x64, 0x6d, 0x6f, 0x6e, 0x64, 0x31, 0x1e, 0x30, 0x1c, 0x06, ++ 0x03, 0x55, 0x04, 0x0a, 0x13, 0x15, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, ++ 0x6f, 0x66, 0x74, 0x20, 0x43, 0x6f, 0x72, 0x70, 0x6f, 0x72, 0x61, 0x74, ++ 0x69, 0x6f, 0x6e, 0x31, 0x2a, 0x30, 0x28, 0x06, 0x03, 0x55, 0x04, 0x03, ++ 0x13, 0x21, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x20, ++ 0x43, 0x6f, 0x72, 0x70, 0x6f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, ++ 0x4b, 0x45, 0x4b, 0x20, 0x43, 0x41, 0x20, 0x32, 0x30, 0x31, 0x31, 0x30, ++ 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, ++ 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, ++ 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xc4, 0xe8, 0xb5, 0x8a, ++ 0xbf, 0xad, 0x57, 0x26, 0xb0, 0x26, 0xc3, 0xea, 0xe7, 0xfb, 0x57, 0x7a, ++ 0x44, 0x02, 0x5d, 0x07, 0x0d, 0xda, 0x4a, 0xe5, 0x74, 0x2a, 0xe6, 0xb0, ++ 0x0f, 0xec, 0x6d, 0xeb, 0xec, 0x7f, 0xb9, 0xe3, 0x5a, 0x63, 0x32, 0x7c, ++ 0x11, 0x17, 0x4f, 0x0e, 0xe3, 0x0b, 0xa7, 0x38, 0x15, 0x93, 0x8e, 0xc6, ++ 0xf5, 0xe0, 0x84, 0xb1, 0x9a, 0x9b, 0x2c, 0xe7, 0xf5, 0xb7, 0x91, 0xd6, ++ 0x09, 0xe1, 0xe2, 0xc0, 0x04, 0xa8, 0xac, 0x30, 0x1c, 0xdf, 0x48, 0xf3, ++ 0x06, 0x50, 0x9a, 0x64, 0xa7, 0x51, 0x7f, 0xc8, 0x85, 0x4f, 0x8f, 0x20, ++ 0x86, 0xce, 0xfe, 0x2f, 0xe1, 0x9f, 0xff, 0x82, 0xc0, 0xed, 0xe9, 0xcd, ++ 0xce, 0xf4, 0x53, 0x6a, 0x62, 0x3a, 0x0b, 0x43, 0xb9, 0xe2, 0x25, 0xfd, ++ 0xfe, 0x05, 0xf9, 0xd4, 0xc4, 0x14, 0xab, 0x11, 0xe2, 0x23, 0x89, 0x8d, ++ 0x70, 0xb7, 0xa4, 0x1d, 0x4d, 0xec, 0xae, 0xe5, 0x9c, 0xfa, 0x16, 0xc2, ++ 0xd7, 0xc1, 0xcb, 0xd4, 0xe8, 0xc4, 0x2f, 0xe5, 0x99, 0xee, 0x24, 0x8b, ++ 0x03, 0xec, 0x8d, 0xf2, 0x8b, 0xea, 0xc3, 0x4a, 0xfb, 0x43, 0x11, 0x12, ++ 0x0b, 0x7e, 0xb5, 0x47, 0x92, 0x6c, 0xdc, 0xe6, 0x04, 0x89, 0xeb, 0xf5, ++ 0x33, 0x04, 0xeb, 0x10, 0x01, 0x2a, 0x71, 0xe5, 0xf9, 0x83, 0x13, 0x3c, ++ 0xff, 0x25, 0x09, 0x2f, 0x68, 0x76, 0x46, 0xff, 0xba, 0x4f, 0xbe, 0xdc, ++ 0xad, 0x71, 0x2a, 0x58, 0xaa, 0xfb, 0x0e, 0xd2, 0x79, 0x3d, 0xe4, 0x9b, ++ 0x65, 0x3b, 0xcc, 0x29, 0x2a, 0x9f, 0xfc, 0x72, 0x59, 0xa2, 0xeb, 0xae, ++ 0x92, 0xef, 0xf6, 0x35, 0x13, 0x80, 0xc6, 0x02, 0xec, 0xe4, 0x5f, 0xcc, ++ 0x9d, 0x76, 0xcd, 0xef, 0x63, 0x92, 0xc1, 0xaf, 0x79, 0x40, 0x84, 0x79, ++ 0x87, 0x7f, 0xe3, 0x52, 0xa8, 0xe8, 0x9d, 0x7b, 0x07, 0x69, 0x8f, 0x15, ++ 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x82, 0x01, 0x4f, 0x30, 0x82, 0x01, ++ 0x4b, 0x30, 0x10, 0x06, 0x09, 0x2b, 0x06, 0x01, 0x04, 0x01, 0x82, 0x37, ++ 0x15, 0x01, 0x04, 0x03, 0x02, 0x01, 0x00, 0x30, 0x1d, 0x06, 0x03, 0x55, ++ 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x62, 0xfc, 0x43, 0xcd, 0xa0, 0x3e, ++ 0xa4, 0xcb, 0x67, 0x12, 0xd2, 0x5b, 0xd9, 0x55, 0xac, 0x7b, 0xcc, 0xb6, ++ 0x8a, 0x5f, 0x30, 0x19, 0x06, 0x09, 0x2b, 0x06, 0x01, 0x04, 0x01, 0x82, ++ 0x37, 0x14, 0x02, 0x04, 0x0c, 0x1e, 0x0a, 0x00, 0x53, 0x00, 0x75, 0x00, ++ 0x62, 0x00, 0x43, 0x00, 0x41, 0x30, 0x0b, 0x06, 0x03, 0x55, 0x1d, 0x0f, ++ 0x04, 0x04, 0x03, 0x02, 0x01, 0x86, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, ++ 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, ++ 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, ++ 0x45, 0x66, 0x52, 0x43, 0xe1, 0x7e, 0x58, 0x11, 0xbf, 0xd6, 0x4e, 0x9e, ++ 0x23, 0x55, 0x08, 0x3b, 0x3a, 0x22, 0x6a, 0xa8, 0x30, 0x5c, 0x06, 0x03, ++ 0x55, 0x1d, 0x1f, 0x04, 0x55, 0x30, 0x53, 0x30, 0x51, 0xa0, 0x4f, 0xa0, ++ 0x4d, 0x86, 0x4b, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x63, 0x72, ++ 0x6c, 0x2e, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x2e, ++ 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x6b, 0x69, 0x2f, 0x63, 0x72, 0x6c, 0x2f, ++ 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x2f, 0x4d, 0x69, 0x63, ++ 0x43, 0x6f, 0x72, 0x54, 0x68, 0x69, 0x50, 0x61, 0x72, 0x4d, 0x61, 0x72, ++ 0x52, 0x6f, 0x6f, 0x5f, 0x32, 0x30, 0x31, 0x30, 0x2d, 0x31, 0x30, 0x2d, ++ 0x30, 0x35, 0x2e, 0x63, 0x72, 0x6c, 0x30, 0x60, 0x06, 0x08, 0x2b, 0x06, ++ 0x01, 0x05, 0x05, 0x07, 0x01, 0x01, 0x04, 0x54, 0x30, 0x52, 0x30, 0x50, ++ 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x30, 0x02, 0x86, 0x44, ++ 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6d, ++ 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x2e, 0x63, 0x6f, 0x6d, ++ 0x2f, 0x70, 0x6b, 0x69, 0x2f, 0x63, 0x65, 0x72, 0x74, 0x73, 0x2f, 0x4d, ++ 0x69, 0x63, 0x43, 0x6f, 0x72, 0x54, 0x68, 0x69, 0x50, 0x61, 0x72, 0x4d, ++ 0x61, 0x72, 0x52, 0x6f, 0x6f, 0x5f, 0x32, 0x30, 0x31, 0x30, 0x2d, 0x31, ++ 0x30, 0x2d, 0x30, 0x35, 0x2e, 0x63, 0x72, 0x74, 0x30, 0x0d, 0x06, 0x09, ++ 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, ++ 0x82, 0x02, 0x01, 0x00, 0xd4, 0x84, 0x88, 0xf5, 0x14, 0x94, 0x18, 0x02, ++ 0xca, 0x2a, 0x3c, 0xfb, 0x2a, 0x92, 0x1c, 0x0c, 0xd7, 0xa0, 0xd1, 0xf1, ++ 0xe8, 0x52, 0x66, 0xa8, 0xee, 0xa2, 0xb5, 0x75, 0x7a, 0x90, 0x00, 0xaa, ++ 0x2d, 0xa4, 0x76, 0x5a, 0xea, 0x79, 0xb7, 0xb9, 0x37, 0x6a, 0x51, 0x7b, ++ 0x10, 0x64, 0xf6, 0xe1, 0x64, 0xf2, 0x02, 0x67, 0xbe, 0xf7, 0xa8, 0x1b, ++ 0x78, 0xbd, 0xba, 0xce, 0x88, 0x58, 0x64, 0x0c, 0xd6, 0x57, 0xc8, 0x19, ++ 0xa3, 0x5f, 0x05, 0xd6, 0xdb, 0xc6, 0xd0, 0x69, 0xce, 0x48, 0x4b, 0x32, ++ 0xb7, 0xeb, 0x5d, 0xd2, 0x30, 0xf5, 0xc0, 0xf5, 0xb8, 0xba, 0x78, 0x07, ++ 0xa3, 0x2b, 0xfe, 0x9b, 0xdb, 0x34, 0x56, 0x84, 0xec, 0x82, 0xca, 0xae, ++ 0x41, 0x25, 0x70, 0x9c, 0x6b, 0xe9, 0xfe, 0x90, 0x0f, 0xd7, 0x96, 0x1f, ++ 0xe5, 0xe7, 0x94, 0x1f, 0xb2, 0x2a, 0x0c, 0x8d, 0x4b, 0xff, 0x28, 0x29, ++ 0x10, 0x7b, 0xf7, 0xd7, 0x7c, 0xa5, 0xd1, 0x76, 0xb9, 0x05, 0xc8, 0x79, ++ 0xed, 0x0f, 0x90, 0x92, 0x9c, 0xc2, 0xfe, 0xdf, 0x6f, 0x7e, 0x6c, 0x0f, ++ 0x7b, 0xd4, 0xc1, 0x45, 0xdd, 0x34, 0x51, 0x96, 0x39, 0x0f, 0xe5, 0x5e, ++ 0x56, 0xd8, 0x18, 0x05, 0x96, 0xf4, 0x07, 0xa6, 0x42, 0xb3, 0xa0, 0x77, ++ 0xfd, 0x08, 0x19, 0xf2, 0x71, 0x56, 0xcc, 0x9f, 0x86, 0x23, 0xa4, 0x87, ++ 0xcb, 0xa6, 0xfd, 0x58, 0x7e, 0xd4, 0x69, 0x67, 0x15, 0x91, 0x7e, 0x81, ++ 0xf2, 0x7f, 0x13, 0xe5, 0x0d, 0x8b, 0x8a, 0x3c, 0x87, 0x84, 0xeb, 0xe3, ++ 0xce, 0xbd, 0x43, 0xe5, 0xad, 0x2d, 0x84, 0x93, 0x8e, 0x6a, 0x2b, 0x5a, ++ 0x7c, 0x44, 0xfa, 0x52, 0xaa, 0x81, 0xc8, 0x2d, 0x1c, 0xbb, 0xe0, 0x52, ++ 0xdf, 0x00, 0x11, 0xf8, 0x9a, 0x3d, 0xc1, 0x60, 0xb0, 0xe1, 0x33, 0xb5, ++ 0xa3, 0x88, 0xd1, 0x65, 0x19, 0x0a, 0x1a, 0xe7, 0xac, 0x7c, 0xa4, 0xc1, ++ 0x82, 0x87, 0x4e, 0x38, 0xb1, 0x2f, 0x0d, 0xc5, 0x14, 0x87, 0x6f, 0xfd, ++ 0x8d, 0x2e, 0xbc, 0x39, 0xb6, 0xe7, 0xe6, 0xc3, 0xe0, 0xe4, 0xcd, 0x27, ++ 0x84, 0xef, 0x94, 0x42, 0xef, 0x29, 0x8b, 0x90, 0x46, 0x41, 0x3b, 0x81, ++ 0x1b, 0x67, 0xd8, 0xf9, 0x43, 0x59, 0x65, 0xcb, 0x0d, 0xbc, 0xfd, 0x00, ++ 0x92, 0x4f, 0xf4, 0x75, 0x3b, 0xa7, 0xa9, 0x24, 0xfc, 0x50, 0x41, 0x40, ++ 0x79, 0xe0, 0x2d, 0x4f, 0x0a, 0x6a, 0x27, 0x76, 0x6e, 0x52, 0xed, 0x96, ++ 0x69, 0x7b, 0xaf, 0x0f, 0xf7, 0x87, 0x05, 0xd0, 0x45, 0xc2, 0xad, 0x53, ++ 0x14, 0x81, 0x1f, 0xfb, 0x30, 0x04, 0xaa, 0x37, 0x36, 0x61, 0xda, 0x4a, ++ 0x69, 0x1b, 0x34, 0xd8, 0x68, 0xed, 0xd6, 0x02, 0xcf, 0x6c, 0x94, 0x0c, ++ 0xd3, 0xcf, 0x6c, 0x22, 0x79, 0xad, 0xb1, 0xf0, 0xbc, 0x03, 0xa2, 0x46, ++ 0x60, 0xa9, 0xc4, 0x07, 0xc2, 0x21, 0x82, 0xf1, 0xfd, 0xf2, 0xe8, 0x79, ++ 0x32, 0x60, 0xbf, 0xd8, 0xac, 0xa5, 0x22, 0x14, 0x4b, 0xca, 0xc1, 0xd8, ++ 0x4b, 0xeb, 0x7d, 0x3f, 0x57, 0x35, 0xb2, 0xe6, 0x4f, 0x75, 0xb4, 0xb0, ++ 0x60, 0x03, 0x22, 0x53, 0xae, 0x91, 0x79, 0x1d, 0xd6, 0x9b, 0x41, 0x1f, ++ 0x15, 0x86, 0x54, 0x70, 0xb2, 0xde, 0x0d, 0x35, 0x0f, 0x7c, 0xb0, 0x34, ++ 0x72, 0xba, 0x97, 0x60, 0x3b, 0xf0, 0x79, 0xeb, 0xa2, 0xb2, 0x1c, 0x5d, ++ 0xa2, 0x16, 0xb8, 0x87, 0xc5, 0xe9, 0x1b, 0xf6, 0xb5, 0x97, 0x25, 0x6f, ++ 0x38, 0x9f, 0xe3, 0x91, 0xfa, 0x8a, 0x79, 0x98, 0xc3, 0x69, 0x0e, 0xb7, ++ 0xa3, 0x1c, 0x20, 0x05, 0x97, 0xf8, 0xca, 0x14, 0xae, 0x00, 0xd7, 0xc4, ++ 0xf3, 0xc0, 0x14, 0x10, 0x75, 0x6b, 0x34, 0xa0, 0x1b, 0xb5, 0x99, 0x60, ++ 0xf3, 0x5c, 0xb0, 0xc5, 0x57, 0x4e, 0x36, 0xd2, 0x32, 0x84, 0xbf, 0x9e, ++ 0xaa, 0x55, 0x3f, 0x00, 0x27, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0xe1, 0x07, 0x04, 0x1d, 0x12, 0x0f, 0x1b, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x06, 0x00, 0x00, 0x00, 0x18, 0x06, 0x00, 0x00, 0x61, 0xdf, 0xe4, 0x8b, ++ 0xca, 0x93, 0xd2, 0x11, 0xaa, 0x0d, 0x00, 0xe0, 0x98, 0x03, 0x2b, 0x8c, ++ 0x50, 0x00, 0x4b, 0x00, 0x00, 0x00, 0xa1, 0x59, 0xc0, 0xa5, 0xe4, 0x94, ++ 0xa7, 0x4a, 0x87, 0xb5, 0xab, 0x15, 0x5c, 0x2b, 0xf0, 0x72, 0x18, 0x06, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x05, 0x00, 0x00, 0x0b, 0xdf, ++ 0xc1, 0xd5, 0xac, 0x1b, 0xdf, 0x4e, 0xba, 0x48, 0x08, 0x83, 0x40, 0x09, ++ 0xca, 0x5a, 0x30, 0x82, 0x05, 0xe8, 0x30, 0x82, 0x03, 0xd0, 0xa0, 0x03, ++ 0x02, 0x01, 0x02, 0x02, 0x0a, 0x61, 0x0a, 0xd1, 0x88, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x03, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, ++ 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, 0x81, 0x91, 0x31, 0x0b, 0x30, ++ 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x13, ++ 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x0a, 0x57, 0x61, 0x73, ++ 0x68, 0x69, 0x6e, 0x67, 0x74, 0x6f, 0x6e, 0x31, 0x10, 0x30, 0x0e, 0x06, ++ 0x03, 0x55, 0x04, 0x07, 0x13, 0x07, 0x52, 0x65, 0x64, 0x6d, 0x6f, 0x6e, ++ 0x64, 0x31, 0x1e, 0x30, 0x1c, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x15, ++ 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x20, 0x43, 0x6f, ++ 0x72, 0x70, 0x6f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x31, 0x3b, 0x30, ++ 0x39, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x32, 0x4d, 0x69, 0x63, 0x72, ++ 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x20, 0x43, 0x6f, 0x72, 0x70, 0x6f, 0x72, ++ 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x54, 0x68, 0x69, 0x72, 0x64, 0x20, ++ 0x50, 0x61, 0x72, 0x74, 0x79, 0x20, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, ++ 0x70, 0x6c, 0x61, 0x63, 0x65, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x30, 0x1e, ++ 0x17, 0x0d, 0x31, 0x31, 0x30, 0x36, 0x32, 0x34, 0x32, 0x30, 0x34, 0x31, ++ 0x32, 0x39, 0x5a, 0x17, 0x0d, 0x32, 0x36, 0x30, 0x36, 0x32, 0x34, 0x32, ++ 0x30, 0x35, 0x31, 0x32, 0x39, 0x5a, 0x30, 0x81, 0x80, 0x31, 0x0b, 0x30, ++ 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x13, ++ 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x0a, 0x57, 0x61, 0x73, ++ 0x68, 0x69, 0x6e, 0x67, 0x74, 0x6f, 0x6e, 0x31, 0x10, 0x30, 0x0e, 0x06, ++ 0x03, 0x55, 0x04, 0x07, 0x13, 0x07, 0x52, 0x65, 0x64, 0x6d, 0x6f, 0x6e, ++ 0x64, 0x31, 0x1e, 0x30, 0x1c, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x15, ++ 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x20, 0x43, 0x6f, ++ 0x72, 0x70, 0x6f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x31, 0x2a, 0x30, ++ 0x28, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x21, 0x4d, 0x69, 0x63, 0x72, ++ 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x20, 0x43, 0x6f, 0x72, 0x70, 0x6f, 0x72, ++ 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4b, 0x45, 0x4b, 0x20, 0x43, 0x41, ++ 0x20, 0x32, 0x30, 0x31, 0x31, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, ++ 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, ++ 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, ++ 0x01, 0x00, 0xc4, 0xe8, 0xb5, 0x8a, 0xbf, 0xad, 0x57, 0x26, 0xb0, 0x26, ++ 0xc3, 0xea, 0xe7, 0xfb, 0x57, 0x7a, 0x44, 0x02, 0x5d, 0x07, 0x0d, 0xda, ++ 0x4a, 0xe5, 0x74, 0x2a, 0xe6, 0xb0, 0x0f, 0xec, 0x6d, 0xeb, 0xec, 0x7f, ++ 0xb9, 0xe3, 0x5a, 0x63, 0x32, 0x7c, 0x11, 0x17, 0x4f, 0x0e, 0xe3, 0x0b, ++ 0xa7, 0x38, 0x15, 0x93, 0x8e, 0xc6, 0xf5, 0xe0, 0x84, 0xb1, 0x9a, 0x9b, ++ 0x2c, 0xe7, 0xf5, 0xb7, 0x91, 0xd6, 0x09, 0xe1, 0xe2, 0xc0, 0x04, 0xa8, ++ 0xac, 0x30, 0x1c, 0xdf, 0x48, 0xf3, 0x06, 0x50, 0x9a, 0x64, 0xa7, 0x51, ++ 0x7f, 0xc8, 0x85, 0x4f, 0x8f, 0x20, 0x86, 0xce, 0xfe, 0x2f, 0xe1, 0x9f, ++ 0xff, 0x82, 0xc0, 0xed, 0xe9, 0xcd, 0xce, 0xf4, 0x53, 0x6a, 0x62, 0x3a, ++ 0x0b, 0x43, 0xb9, 0xe2, 0x25, 0xfd, 0xfe, 0x05, 0xf9, 0xd4, 0xc4, 0x14, ++ 0xab, 0x11, 0xe2, 0x23, 0x89, 0x8d, 0x70, 0xb7, 0xa4, 0x1d, 0x4d, 0xec, ++ 0xae, 0xe5, 0x9c, 0xfa, 0x16, 0xc2, 0xd7, 0xc1, 0xcb, 0xd4, 0xe8, 0xc4, ++ 0x2f, 0xe5, 0x99, 0xee, 0x24, 0x8b, 0x03, 0xec, 0x8d, 0xf2, 0x8b, 0xea, ++ 0xc3, 0x4a, 0xfb, 0x43, 0x11, 0x12, 0x0b, 0x7e, 0xb5, 0x47, 0x92, 0x6c, ++ 0xdc, 0xe6, 0x04, 0x89, 0xeb, 0xf5, 0x33, 0x04, 0xeb, 0x10, 0x01, 0x2a, ++ 0x71, 0xe5, 0xf9, 0x83, 0x13, 0x3c, 0xff, 0x25, 0x09, 0x2f, 0x68, 0x76, ++ 0x46, 0xff, 0xba, 0x4f, 0xbe, 0xdc, 0xad, 0x71, 0x2a, 0x58, 0xaa, 0xfb, ++ 0x0e, 0xd2, 0x79, 0x3d, 0xe4, 0x9b, 0x65, 0x3b, 0xcc, 0x29, 0x2a, 0x9f, ++ 0xfc, 0x72, 0x59, 0xa2, 0xeb, 0xae, 0x92, 0xef, 0xf6, 0x35, 0x13, 0x80, ++ 0xc6, 0x02, 0xec, 0xe4, 0x5f, 0xcc, 0x9d, 0x76, 0xcd, 0xef, 0x63, 0x92, ++ 0xc1, 0xaf, 0x79, 0x40, 0x84, 0x79, 0x87, 0x7f, 0xe3, 0x52, 0xa8, 0xe8, ++ 0x9d, 0x7b, 0x07, 0x69, 0x8f, 0x15, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, ++ 0x82, 0x01, 0x4f, 0x30, 0x82, 0x01, 0x4b, 0x30, 0x10, 0x06, 0x09, 0x2b, ++ 0x06, 0x01, 0x04, 0x01, 0x82, 0x37, 0x15, 0x01, 0x04, 0x03, 0x02, 0x01, ++ 0x00, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, ++ 0x62, 0xfc, 0x43, 0xcd, 0xa0, 0x3e, 0xa4, 0xcb, 0x67, 0x12, 0xd2, 0x5b, ++ 0xd9, 0x55, 0xac, 0x7b, 0xcc, 0xb6, 0x8a, 0x5f, 0x30, 0x19, 0x06, 0x09, ++ 0x2b, 0x06, 0x01, 0x04, 0x01, 0x82, 0x37, 0x14, 0x02, 0x04, 0x0c, 0x1e, ++ 0x0a, 0x00, 0x53, 0x00, 0x75, 0x00, 0x62, 0x00, 0x43, 0x00, 0x41, 0x30, ++ 0x0b, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x04, 0x04, 0x03, 0x02, 0x01, 0x86, ++ 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, ++ 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, ++ 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0x45, 0x66, 0x52, 0x43, 0xe1, 0x7e, ++ 0x58, 0x11, 0xbf, 0xd6, 0x4e, 0x9e, 0x23, 0x55, 0x08, 0x3b, 0x3a, 0x22, ++ 0x6a, 0xa8, 0x30, 0x5c, 0x06, 0x03, 0x55, 0x1d, 0x1f, 0x04, 0x55, 0x30, ++ 0x53, 0x30, 0x51, 0xa0, 0x4f, 0xa0, 0x4d, 0x86, 0x4b, 0x68, 0x74, 0x74, ++ 0x70, 0x3a, 0x2f, 0x2f, 0x63, 0x72, 0x6c, 0x2e, 0x6d, 0x69, 0x63, 0x72, ++ 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x6b, ++ 0x69, 0x2f, 0x63, 0x72, 0x6c, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, ++ 0x74, 0x73, 0x2f, 0x4d, 0x69, 0x63, 0x43, 0x6f, 0x72, 0x54, 0x68, 0x69, ++ 0x50, 0x61, 0x72, 0x4d, 0x61, 0x72, 0x52, 0x6f, 0x6f, 0x5f, 0x32, 0x30, ++ 0x31, 0x30, 0x2d, 0x31, 0x30, 0x2d, 0x30, 0x35, 0x2e, 0x63, 0x72, 0x6c, ++ 0x30, 0x60, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x01, 0x01, ++ 0x04, 0x54, 0x30, 0x52, 0x30, 0x50, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, ++ 0x05, 0x07, 0x30, 0x02, 0x86, 0x44, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, ++ 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, ++ 0x66, 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x6b, 0x69, 0x2f, 0x63, ++ 0x65, 0x72, 0x74, 0x73, 0x2f, 0x4d, 0x69, 0x63, 0x43, 0x6f, 0x72, 0x54, ++ 0x68, 0x69, 0x50, 0x61, 0x72, 0x4d, 0x61, 0x72, 0x52, 0x6f, 0x6f, 0x5f, ++ 0x32, 0x30, 0x31, 0x30, 0x2d, 0x31, 0x30, 0x2d, 0x30, 0x35, 0x2e, 0x63, ++ 0x72, 0x74, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, ++ 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, 0x02, 0x01, 0x00, 0xd4, 0x84, ++ 0x88, 0xf5, 0x14, 0x94, 0x18, 0x02, 0xca, 0x2a, 0x3c, 0xfb, 0x2a, 0x92, ++ 0x1c, 0x0c, 0xd7, 0xa0, 0xd1, 0xf1, 0xe8, 0x52, 0x66, 0xa8, 0xee, 0xa2, ++ 0xb5, 0x75, 0x7a, 0x90, 0x00, 0xaa, 0x2d, 0xa4, 0x76, 0x5a, 0xea, 0x79, ++ 0xb7, 0xb9, 0x37, 0x6a, 0x51, 0x7b, 0x10, 0x64, 0xf6, 0xe1, 0x64, 0xf2, ++ 0x02, 0x67, 0xbe, 0xf7, 0xa8, 0x1b, 0x78, 0xbd, 0xba, 0xce, 0x88, 0x58, ++ 0x64, 0x0c, 0xd6, 0x57, 0xc8, 0x19, 0xa3, 0x5f, 0x05, 0xd6, 0xdb, 0xc6, ++ 0xd0, 0x69, 0xce, 0x48, 0x4b, 0x32, 0xb7, 0xeb, 0x5d, 0xd2, 0x30, 0xf5, ++ 0xc0, 0xf5, 0xb8, 0xba, 0x78, 0x07, 0xa3, 0x2b, 0xfe, 0x9b, 0xdb, 0x34, ++ 0x56, 0x84, 0xec, 0x82, 0xca, 0xae, 0x41, 0x25, 0x70, 0x9c, 0x6b, 0xe9, ++ 0xfe, 0x90, 0x0f, 0xd7, 0x96, 0x1f, 0xe5, 0xe7, 0x94, 0x1f, 0xb2, 0x2a, ++ 0x0c, 0x8d, 0x4b, 0xff, 0x28, 0x29, 0x10, 0x7b, 0xf7, 0xd7, 0x7c, 0xa5, ++ 0xd1, 0x76, 0xb9, 0x05, 0xc8, 0x79, 0xed, 0x0f, 0x90, 0x92, 0x9c, 0xc2, ++ 0xfe, 0xdf, 0x6f, 0x7e, 0x6c, 0x0f, 0x7b, 0xd4, 0xc1, 0x45, 0xdd, 0x34, ++ 0x51, 0x96, 0x39, 0x0f, 0xe5, 0x5e, 0x56, 0xd8, 0x18, 0x05, 0x96, 0xf4, ++ 0x07, 0xa6, 0x42, 0xb3, 0xa0, 0x77, 0xfd, 0x08, 0x19, 0xf2, 0x71, 0x56, ++ 0xcc, 0x9f, 0x86, 0x23, 0xa4, 0x87, 0xcb, 0xa6, 0xfd, 0x58, 0x7e, 0xd4, ++ 0x69, 0x67, 0x15, 0x91, 0x7e, 0x81, 0xf2, 0x7f, 0x13, 0xe5, 0x0d, 0x8b, ++ 0x8a, 0x3c, 0x87, 0x84, 0xeb, 0xe3, 0xce, 0xbd, 0x43, 0xe5, 0xad, 0x2d, ++ 0x84, 0x93, 0x8e, 0x6a, 0x2b, 0x5a, 0x7c, 0x44, 0xfa, 0x52, 0xaa, 0x81, ++ 0xc8, 0x2d, 0x1c, 0xbb, 0xe0, 0x52, 0xdf, 0x00, 0x11, 0xf8, 0x9a, 0x3d, ++ 0xc1, 0x60, 0xb0, 0xe1, 0x33, 0xb5, 0xa3, 0x88, 0xd1, 0x65, 0x19, 0x0a, ++ 0x1a, 0xe7, 0xac, 0x7c, 0xa4, 0xc1, 0x82, 0x87, 0x4e, 0x38, 0xb1, 0x2f, ++ 0x0d, 0xc5, 0x14, 0x87, 0x6f, 0xfd, 0x8d, 0x2e, 0xbc, 0x39, 0xb6, 0xe7, ++ 0xe6, 0xc3, 0xe0, 0xe4, 0xcd, 0x27, 0x84, 0xef, 0x94, 0x42, 0xef, 0x29, ++ 0x8b, 0x90, 0x46, 0x41, 0x3b, 0x81, 0x1b, 0x67, 0xd8, 0xf9, 0x43, 0x59, ++ 0x65, 0xcb, 0x0d, 0xbc, 0xfd, 0x00, 0x92, 0x4f, 0xf4, 0x75, 0x3b, 0xa7, ++ 0xa9, 0x24, 0xfc, 0x50, 0x41, 0x40, 0x79, 0xe0, 0x2d, 0x4f, 0x0a, 0x6a, ++ 0x27, 0x76, 0x6e, 0x52, 0xed, 0x96, 0x69, 0x7b, 0xaf, 0x0f, 0xf7, 0x87, ++ 0x05, 0xd0, 0x45, 0xc2, 0xad, 0x53, 0x14, 0x81, 0x1f, 0xfb, 0x30, 0x04, ++ 0xaa, 0x37, 0x36, 0x61, 0xda, 0x4a, 0x69, 0x1b, 0x34, 0xd8, 0x68, 0xed, ++ 0xd6, 0x02, 0xcf, 0x6c, 0x94, 0x0c, 0xd3, 0xcf, 0x6c, 0x22, 0x79, 0xad, ++ 0xb1, 0xf0, 0xbc, 0x03, 0xa2, 0x46, 0x60, 0xa9, 0xc4, 0x07, 0xc2, 0x21, ++ 0x82, 0xf1, 0xfd, 0xf2, 0xe8, 0x79, 0x32, 0x60, 0xbf, 0xd8, 0xac, 0xa5, ++ 0x22, 0x14, 0x4b, 0xca, 0xc1, 0xd8, 0x4b, 0xeb, 0x7d, 0x3f, 0x57, 0x35, ++ 0xb2, 0xe6, 0x4f, 0x75, 0xb4, 0xb0, 0x60, 0x03, 0x22, 0x53, 0xae, 0x91, ++ 0x79, 0x1d, 0xd6, 0x9b, 0x41, 0x1f, 0x15, 0x86, 0x54, 0x70, 0xb2, 0xde, ++ 0x0d, 0x35, 0x0f, 0x7c, 0xb0, 0x34, 0x72, 0xba, 0x97, 0x60, 0x3b, 0xf0, ++ 0x79, 0xeb, 0xa2, 0xb2, 0x1c, 0x5d, 0xa2, 0x16, 0xb8, 0x87, 0xc5, 0xe9, ++ 0x1b, 0xf6, 0xb5, 0x97, 0x25, 0x6f, 0x38, 0x9f, 0xe3, 0x91, 0xfa, 0x8a, ++ 0x79, 0x98, 0xc3, 0x69, 0x0e, 0xb7, 0xa3, 0x1c, 0x20, 0x05, 0x97, 0xf8, ++ 0xca, 0x14, 0xae, 0x00, 0xd7, 0xc4, 0xf3, 0xc0, 0x14, 0x10, 0x75, 0x6b, ++ 0x34, 0xa0, 0x1b, 0xb5, 0x99, 0x60, 0xf3, 0x5c, 0xb0, 0xc5, 0x57, 0x4e, ++ 0x36, 0xd2, 0x32, 0x84, 0xbf, 0x9e, 0xff, 0xff, 0xaa, 0x55, 0x3f, 0x00, ++ 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, ++ 0x01, 0x00, 0x00, 0x00, 0xe0, 0xe4, 0x73, 0x90, 0xec, 0x60, 0x6e, 0x4b, ++ 0x99, 0x03, 0x4c, 0x22, 0x3c, 0x26, 0x0f, 0x3c, 0x56, 0x00, 0x65, 0x00, ++ 0x6e, 0x00, 0x64, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x4b, 0x00, 0x65, 0x00, ++ 0x79, 0x00, 0x73, 0x00, 0x4e, 0x00, 0x76, 0x00, 0x00, 0x00, 0x00, 0xff, ++ 0xaa, 0x55, 0x3f, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x1e, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x77, 0x3b, 0x57, 0x0c, ++ 0x93, 0xeb, 0x3d, 0x4d, 0xaf, 0xfc, 0x5f, 0xeb, 0xca, 0xfb, 0x65, 0xb0, ++ 0x53, 0x00, 0x65, 0x00, 0x63, 0x00, 0x75, 0x00, 0x72, 0x00, 0x65, 0x00, ++ 0x42, 0x00, 0x6f, 0x00, 0x6f, 0x00, 0x74, 0x00, 0x4d, 0x00, 0x6f, 0x00, ++ 0x64, 0x00, 0x65, 0x00, 0x00, 0x00, 0x00, 0xff, 0xaa, 0x55, 0x3f, 0x00, ++ 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, ++ 0x01, 0x00, 0x00, 0x00, 0xc7, 0x0b, 0xa3, 0xf0, 0x08, 0xaf, 0x56, 0x45, ++ 0x99, 0xc4, 0x00, 0x10, 0x09, 0xc9, 0x3a, 0x44, 0x53, 0x00, 0x65, 0x00, ++ 0x63, 0x00, 0x75, 0x00, 0x72, 0x00, 0x65, 0x00, 0x42, 0x00, 0x6f, 0x00, ++ 0x6f, 0x00, 0x74, 0x00, 0x45, 0x00, 0x6e, 0x00, 0x61, 0x00, 0x62, 0x00, ++ 0x6c, 0x00, 0x65, 0x00, 0x00, 0x00, 0x01, 0xff, 0xaa, 0x55, 0x3f, 0x00, ++ 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, ++ 0x01, 0x00, 0x00, 0x00, 0x0c, 0xec, 0x76, 0xc0, 0x28, 0x70, 0x99, 0x43, ++ 0xa0, 0x72, 0x71, 0xee, 0x5c, 0x44, 0x8b, 0x9f, 0x43, 0x00, 0x75, 0x00, ++ 0x73, 0x00, 0x74, 0x00, 0x6f, 0x00, 0x6d, 0x00, 0x4d, 0x00, 0x6f, 0x00, ++ 0x64, 0x00, 0x65, 0x00, 0x00, 0x00, 0x00, 0xff, 0xaa, 0x55, 0x3f, 0x00, ++ 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, ++ 0x04, 0x00, 0x00, 0x00, 0x11, 0x40, 0x70, 0xeb, 0x02, 0x14, 0xd3, 0x11, ++ 0x8e, 0x77, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b, 0x4d, 0x00, 0x54, 0x00, ++ 0x43, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, ++}; ++ ++ ++static size_t nvram_trailer_offset = 0xf000; ++ ++static uint8_t nvram_trailer[]={ ++ 0x2b, 0x29, 0x58, 0x9e, 0x68, 0x7c, 0x7d, 0x49, 0xa0, 0xce, 0x65, 0x00, ++ 0xfd, 0x9f, 0x1b, 0x95, 0x2c, 0xaf, 0x2c, 0x64, 0xfe, 0xff, 0xff, 0xff, ++ 0xe0, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, ++}; ++ ++static size_t nvram_size=0x20000; +Index: qemu-2.6.2/hw/i386/pc.c +=================================================================== +--- qemu-2.6.2.orig/hw/i386/pc.c ++++ qemu-2.6.2/hw/i386/pc.c +@@ -68,6 +68,8 @@ + #include "qapi-visit.h" + #include "qom/cpu.h" + ++extern int efi_nvram; ++ + /* debug PC/ISA interrupts */ + //#define DEBUG_IRQ + +@@ -1561,6 +1563,9 @@ void pc_pci_device_init(PCIBus *pci_bus) + int max_bus; + int bus; + ++ if (efi_nvram) ++ return; ++ + max_bus = drive_get_max_bus(IF_SCSI); + for (bus = 0; bus <= max_bus; bus++) { + pci_create_simple(pci_bus, -1, "lsi53c895a"); diff --git a/recipes-openxt/qemu-dm/qemu-dm.inc b/recipes-openxt/qemu-dm/qemu-dm.inc index f2c792c7bb..3877bd8140 100644 --- a/recipes-openxt/qemu-dm/qemu-dm.inc +++ b/recipes-openxt/qemu-dm/qemu-dm.inc @@ -51,8 +51,18 @@ SRC_URI += "file://compile-time-stubdom-flag.patch \ file://CVE-2017-8284-tcg-i386-Check-the-size-of-instruction-being-transla.patch \ file://CVE-2017-8309-audio-release-capture-buffers.patch \ file://CVE-2017-8379-input-limit-kbd-queue-depth.patch \ + file://ovmf-xenpc.patch \ " +# Experimental patches for q35 support +# ovmf-q35.patch +# but AHCI is broken for windows (bug in qemu mapcache) +# you can work around this with +# +# memcache-failure-non-fatal.patch +# ahci-disable-ncq.patch +# ahci-fix-coincident-mappings.patch + SRC_URI[md5sum] = "bdf1f3d0c177ebeb35a079a4bc3fc74e" SRC_URI[sha256sum] = "9a7ec64f147b9e1e570c410e00ebe271869b5d4c85392ba047db7617c297faa3" @@ -73,6 +83,7 @@ FILES_${PN}-utils = "/usr/libexec/*" PACKAGES += "${PN}-extra-keymaps ${PN}-extra-roms ${PN}-utils" + EXTRA_OECONF += " \ --enable-xen \ --target-list=i386-softmmu \ diff --git a/recipes-openxt/xenclient/ovmf/files/0001-BaseTools-Force-tools-variables-to-host-toolchain.patch b/recipes-openxt/xenclient/ovmf/files/0001-BaseTools-Force-tools-variables-to-host-toolchain.patch new file mode 100644 index 0000000000..c0cc633340 --- /dev/null +++ b/recipes-openxt/xenclient/ovmf/files/0001-BaseTools-Force-tools-variables-to-host-toolchain.patch @@ -0,0 +1,48 @@ +From 6e24bde1979c2d7149b37d142fb882dfde0e9770 Mon Sep 17 00:00:00 2001 +From: Matt Fleming +Date: Fri, 27 Jun 2014 11:12:18 +0100 +Subject: [PATCH] BaseTools: Force tools variables to host toolchain + +Signed-off-by: Matt Fleming +--- + BaseTools/Source/C/Makefiles/app.makefile | 7 +++++++ + BaseTools/Source/C/VfrCompile/GNUmakefile | 5 +++++ + 2 files changed, 12 insertions(+) + +diff --git a/BaseTools/Source/C/Makefiles/app.makefile b/BaseTools/Source/C/Makefiles/app.makefile +index 19269a1..62aad0f 100644 +--- a/BaseTools/Source/C/Makefiles/app.makefile ++++ b/BaseTools/Source/C/Makefiles/app.makefile +@@ -16,6 +16,13 @@ include $(MAKEROOT)/Makefiles/header.makefile + + APPLICATION = $(MAKEROOT)/bin/$(APPNAME) + ++CC = gcc ++CXX = g++ ++AS = gcc ++AR = ar ++LD = ld ++LINKER = $(CC) ++ + .PHONY:all + all: $(MAKEROOT)/bin $(APPLICATION) + +diff --git a/BaseTools/Source/C/VfrCompile/GNUmakefile b/BaseTools/Source/C/VfrCompile/GNUmakefile +index 82005e1..5ac5f7e 100644 +--- a/BaseTools/Source/C/VfrCompile/GNUmakefile ++++ b/BaseTools/Source/C/VfrCompile/GNUmakefile +@@ -26,6 +26,11 @@ OBJECTS = AParser.o DLexerBase.o ATokenBuffer.o EfiVfrParser.o VfrLexer.o VfrSyn + + VFR_CPPFLAGS = -DPCCTS_USE_NAMESPACE_STD $(CPPFLAGS) + ++CC = gcc ++CXX = g++ ++AS = gcc ++AR = ar ++LD = ld + LINKER = $(CXX) + + EXTRA_CLEAN_OBJECTS = EfiVfrParser.cpp EfiVfrParser.h VfrParser.dlg VfrTokens.h VfrLexer.cpp VfrLexer.h VfrSyntax.cpp tokens.h +-- +1.9.0 + diff --git a/recipes-openxt/xenclient/ovmf/files/0001-EXCLUDE_SHELL_FROM_FD.patch b/recipes-openxt/xenclient/ovmf/files/0001-EXCLUDE_SHELL_FROM_FD.patch new file mode 100644 index 0000000000..ef1a2d0b8b --- /dev/null +++ b/recipes-openxt/xenclient/ovmf/files/0001-EXCLUDE_SHELL_FROM_FD.patch @@ -0,0 +1,68 @@ +From 935de6d9e5d8c8c3e139647fb068786769353b8c Mon Sep 17 00:00:00 2001 +From: Gerd Hoffmann +Date: Thu, 18 Feb 2016 10:52:44 +0100 +Subject: [PATCH] EXCLUDE_SHELL_FROM_FD + +--- + OvmfPkg/OvmfPkgIa32.fdf | 2 ++ + OvmfPkg/OvmfPkgIa32X64.fdf | 2 ++ + OvmfPkg/OvmfPkgX64.fdf | 2 ++ + 3 files changed, 6 insertions(+) + +diff --git a/OvmfPkg/OvmfPkgIa32.fdf b/OvmfPkg/OvmfPkgIa32.fdf +index 8251b62..3ed884b 100644 +--- a/OvmfPkg/OvmfPkgIa32.fdf ++++ b/OvmfPkg/OvmfPkgIa32.fdf +@@ -271,11 +271,13 @@ INF MdeModulePkg/Universal/Acpi/BootScriptExecutorDxe/BootScriptExecutorDxe.inf + + INF RuleOverride = BINARY FatBinPkg/EnhancedFatDxe/Fat.inf + ++!ifndef $(EXCLUDE_SHELL_FROM_FD) + !ifndef $(USE_OLD_SHELL) + INF ShellPkg/Application/Shell/Shell.inf + !else + INF RuleOverride = BINARY EdkShellBinPkg/FullShell/FullShell.inf + !endif ++!endif + + FILE FREEFORM = PCD(gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdLogoFile) { + SECTION RAW = MdeModulePkg/Logo/Logo.bmp +diff --git a/OvmfPkg/OvmfPkgIa32X64.fdf b/OvmfPkg/OvmfPkgIa32X64.fdf +index 4b6ab5a..6df1cf8 100644 +--- a/OvmfPkg/OvmfPkgIa32X64.fdf ++++ b/OvmfPkg/OvmfPkgIa32X64.fdf +@@ -271,11 +271,13 @@ INF MdeModulePkg/Universal/Acpi/BootScriptExecutorDxe/BootScriptExecutorDxe.inf + + INF RuleOverride = BINARY USE = X64 FatBinPkg/EnhancedFatDxe/Fat.inf + ++!ifndef $(EXCLUDE_SHELL_FROM_FD) + !ifndef $(USE_OLD_SHELL) + INF ShellPkg/Application/Shell/Shell.inf + !else + INF RuleOverride = BINARY USE = X64 EdkShellBinPkg/FullShell/FullShell.inf + !endif ++!endif + + FILE FREEFORM = PCD(gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdLogoFile) { + SECTION RAW = MdeModulePkg/Logo/Logo.bmp +diff --git a/OvmfPkg/OvmfPkgX64.fdf b/OvmfPkg/OvmfPkgX64.fdf +index 18036af..9d2fdfd 100644 +--- a/OvmfPkg/OvmfPkgX64.fdf ++++ b/OvmfPkg/OvmfPkgX64.fdf +@@ -271,11 +271,13 @@ INF MdeModulePkg/Universal/Acpi/BootScriptExecutorDxe/BootScriptExecutorDxe.inf + + INF RuleOverride = BINARY FatBinPkg/EnhancedFatDxe/Fat.inf + ++!ifndef $(EXCLUDE_SHELL_FROM_FD) + !ifndef $(USE_OLD_SHELL) + INF ShellPkg/Application/Shell/Shell.inf + !else + INF RuleOverride = BINARY EdkShellBinPkg/FullShell/FullShell.inf + !endif ++!endif + + FILE FREEFORM = PCD(gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdLogoFile) { + SECTION RAW = MdeModulePkg/Logo/Logo.bmp +-- +1.8.3.1 + diff --git a/recipes-openxt/xenclient/ovmf/files/0001-MdeModulePkg-TerminalDxe-add-other-text-resolutions.patch b/recipes-openxt/xenclient/ovmf/files/0001-MdeModulePkg-TerminalDxe-add-other-text-resolutions.patch new file mode 100644 index 0000000000..2de425e1bd --- /dev/null +++ b/recipes-openxt/xenclient/ovmf/files/0001-MdeModulePkg-TerminalDxe-add-other-text-resolutions.patch @@ -0,0 +1,113 @@ +From 45b4770755ba779a47ac207ff6836b7c146c2594 Mon Sep 17 00:00:00 2001 +From: Laszlo Ersek +Date: Tue, 25 Feb 2014 18:40:35 +0100 +Subject: [PATCH] MdeModulePkg: TerminalDxe: add other text resolutions + +When the console output is multiplexed to several devices by +ConSplitterDxe, then ConSplitterDxe builds an intersection of text modes +supported by all console output devices. + +Two notable output devices are provided by: +(1) MdeModulePkg/Universal/Console/GraphicsConsoleDxe, +(2) MdeModulePkg/Universal/Console/TerminalDxe. + +GraphicsConsoleDxe supports four modes at most -- see +InitializeGraphicsConsoleTextMode(): + +(1a) 80x25 (required by the UEFI spec as mode 0), +(1b) 80x50 (not necessarily supported, but if it is, then the UEFI spec + requires the driver to provide it as mode 1), +(1c) 100x31 (corresponding to graphics resolution 800x600, which the UEFI + spec requires from all plug-in graphics devices), +(1d) "full screen" resolution, derived form the underlying GOP's + horizontal and vertical resolutions with division by EFI_GLYPH_WIDTH + (8) and EFI_GLYPH_HEIGHT (19), respectively. + +The automatic "full screen resolution" makes GraphicsConsoleDxe's +character console very flexible. However, TerminalDxe (which runs on +serial ports) only provides the following fixed resolutions -- see +InitializeTerminalConsoleTextMode(): + +(2a) 80x25 (required by the UEFI spec as mode 0), +(2b) 80x50 (since the character resolution of a serial device cannot be + interrogated easily, this is added unconditionally as mode 1) +(2c) modes 2 and above come from "mTerminalConsoleModeData". This table + currently only contains one mode, 100x31. + +When ConSplitterDxe combines (1) and (2), multiplexing console output to +both video output and serial terminal, the list of commonly supported text +modes (ie. the "intersection") comprises: + +(3a) 80x25, unconditionally, from (1a) and (2a), +(3b) 80x50, if the graphics console provides at least 640x950 pixel + resolution, from (1b) and (2b) +(3c) 100x31, if the graphics device is a plug-in one (because in that case + 800x600 is a mandated pixel resolution), from (1c) and (2c). + +Unfortunately, the "full screen resolution" (1d) of the GOP-based text +console is not available in general. + +Mitigate this problem by extending "mTerminalConsoleModeData" with a +handful of text resolutions that are derived from widespread maximal pixel +resolutions. This way TerminalDxe won't cause ConSplitterDxe to filter out +the most frequent (1d) values from the intersection, and eg. the MODE +command in the UEFI shell will offer the "best" (ie. full screen) +resolution too. + +Contributed-under: TianoCore Contribution Agreement 1.0 +Signed-off-by: Laszlo Ersek +--- + .../Universal/Console/TerminalDxe/Terminal.c | 37 +++++++++++++++++++++- + 1 file changed, 36 insertions(+), 1 deletion(-) + +diff --git a/MdeModulePkg/Universal/Console/TerminalDxe/Terminal.c b/MdeModulePkg/Universal/Console/TerminalDxe/Terminal.c +index 5110948..f8604e4 100644 +--- a/MdeModulePkg/Universal/Console/TerminalDxe/Terminal.c ++++ b/MdeModulePkg/Universal/Console/TerminalDxe/Terminal.c +@@ -96,7 +96,42 @@ TERMINAL_DEV mTerminalDevTemplate = { + }; + + TERMINAL_CONSOLE_MODE_DATA mTerminalConsoleModeData[] = { +- {100, 31}, ++ { 100, 25 }, // from graphics resolution 800 x 480 ++ { 100, 31 }, // from graphics resolution 800 x 600 ++ { 104, 32 }, // from graphics resolution 832 x 624 ++ { 120, 33 }, // from graphics resolution 960 x 640 ++ { 128, 31 }, // from graphics resolution 1024 x 600 ++ { 128, 40 }, // from graphics resolution 1024 x 768 ++ { 144, 45 }, // from graphics resolution 1152 x 864 ++ { 144, 45 }, // from graphics resolution 1152 x 870 ++ { 160, 37 }, // from graphics resolution 1280 x 720 ++ { 160, 40 }, // from graphics resolution 1280 x 760 ++ { 160, 40 }, // from graphics resolution 1280 x 768 ++ { 160, 42 }, // from graphics resolution 1280 x 800 ++ { 160, 50 }, // from graphics resolution 1280 x 960 ++ { 160, 53 }, // from graphics resolution 1280 x 1024 ++ { 170, 40 }, // from graphics resolution 1360 x 768 ++ { 170, 40 }, // from graphics resolution 1366 x 768 ++ { 175, 55 }, // from graphics resolution 1400 x 1050 ++ { 180, 47 }, // from graphics resolution 1440 x 900 ++ { 200, 47 }, // from graphics resolution 1600 x 900 ++ { 200, 63 }, // from graphics resolution 1600 x 1200 ++ { 210, 55 }, // from graphics resolution 1680 x 1050 ++ { 240, 56 }, // from graphics resolution 1920 x 1080 ++ { 240, 63 }, // from graphics resolution 1920 x 1200 ++ { 240, 75 }, // from graphics resolution 1920 x 1440 ++ { 250, 105 }, // from graphics resolution 2000 x 2000 ++ { 256, 80 }, // from graphics resolution 2048 x 1536 ++ { 256, 107 }, // from graphics resolution 2048 x 2048 ++ { 320, 75 }, // from graphics resolution 2560 x 1440 ++ { 320, 84 }, // from graphics resolution 2560 x 1600 ++ { 320, 107 }, // from graphics resolution 2560 x 2048 ++ { 350, 110 }, // from graphics resolution 2800 x 2100 ++ { 400, 126 }, // from graphics resolution 3200 x 2400 ++ { 480, 113 }, // from graphics resolution 3840 x 2160 ++ { 512, 113 }, // from graphics resolution 4096 x 2160 ++ { 960, 227 }, // from graphics resolution 7680 x 4320 ++ { 1024, 227 }, // from graphics resolution 8192 x 4320 + // + // New modes can be added here. + // +-- +1.8.3.1 + diff --git a/recipes-openxt/xenclient/ovmf/files/0001-OvmfPkg-Don-t-build-in-QemuVideoDxe-when-we-have-CSM.patch b/recipes-openxt/xenclient/ovmf/files/0001-OvmfPkg-Don-t-build-in-QemuVideoDxe-when-we-have-CSM.patch new file mode 100644 index 0000000000..87376da26b --- /dev/null +++ b/recipes-openxt/xenclient/ovmf/files/0001-OvmfPkg-Don-t-build-in-QemuVideoDxe-when-we-have-CSM.patch @@ -0,0 +1,128 @@ +From eb46fe87cc0e594c5f78fc23b3904f8a55a9a08c Mon Sep 17 00:00:00 2001 +From: David Woodhouse +Date: Fri, 8 Feb 2013 21:44:08 +0000 +Subject: [PATCH] OvmfPkg: Don't build in QemuVideoDxe when we have CSM + +Windows 2008r2 will stupidly try to use int 10h calls even when booted +via EFI. If we don't have a VGA BIOS installed, it doesn't work very well. + +So where we can, just use BiosVideoDxe instead of the native QemuVideoDxe +and then Windows will work fine. + +Contributed-under: TianoCore Contribution Agreement 1.0 +Signed-off-by: David Woodhouse +Reviewed-by: Laszlo Ersek +--- + OvmfPkg/OvmfPkgIa32.dsc | 2 ++ + OvmfPkg/OvmfPkgIa32.fdf | 5 +++-- + OvmfPkg/OvmfPkgIa32X64.dsc | 2 ++ + OvmfPkg/OvmfPkgIa32X64.fdf | 5 +++-- + OvmfPkg/OvmfPkgX64.dsc | 2 ++ + OvmfPkg/OvmfPkgX64.fdf | 5 +++-- + 6 files changed, 15 insertions(+), 6 deletions(-) + +diff --git a/OvmfPkg/OvmfPkgIa32.dsc b/OvmfPkg/OvmfPkgIa32.dsc +index 6f2e7f3..5d86a6c 100644 +--- a/OvmfPkg/OvmfPkgIa32.dsc ++++ b/OvmfPkg/OvmfPkgIa32.dsc +@@ -551,10 +551,12 @@ + MdeModulePkg/Universal/DisplayEngineDxe/DisplayEngineDxe.inf + MdeModulePkg/Universal/MemoryTest/NullMemoryTestDxe/NullMemoryTestDxe.inf + ++!ifndef $(CSM_ENABLE) + OvmfPkg/QemuVideoDxe/QemuVideoDxe.inf { + + BltLib|OptionRomPkg/Library/FrameBufferBltLib/FrameBufferBltLib.inf + } ++!endif + + # + # ISA Support +diff --git a/OvmfPkg/OvmfPkgIa32.fdf b/OvmfPkg/OvmfPkgIa32.fdf +index 1c1936c..26ea838 100644 +--- a/OvmfPkg/OvmfPkgIa32.fdf ++++ b/OvmfPkg/OvmfPkgIa32.fdf +@@ -348,9 +348,10 @@ INF MdeModulePkg/Bus/Usb/UsbMassStorageDxe/UsbMassStorageDxe.inf + INF IntelFrameworkModulePkg/Csm/BiosThunk/VideoDxe/VideoDxe.inf + INF IntelFrameworkModulePkg/Csm/LegacyBiosDxe/LegacyBiosDxe.inf + INF RuleOverride=CSM OvmfPkg/Csm/Csm16/Csm16.inf +-!endif +- ++!else + INF OvmfPkg/QemuVideoDxe/QemuVideoDxe.inf ++!endif ++ + INF OvmfPkg/PlatformDxe/Platform.inf + + !if $(SMM_REQUIRE) == TRUE +diff --git a/OvmfPkg/OvmfPkgIa32X64.dsc b/OvmfPkg/OvmfPkgIa32X64.dsc +index 63fbb25..6b9268b 100644 +--- a/OvmfPkg/OvmfPkgIa32X64.dsc ++++ b/OvmfPkg/OvmfPkgIa32X64.dsc +@@ -558,10 +558,12 @@ + MdeModulePkg/Universal/DisplayEngineDxe/DisplayEngineDxe.inf + MdeModulePkg/Universal/MemoryTest/NullMemoryTestDxe/NullMemoryTestDxe.inf + ++!ifndef $(CSM_ENABLE) + OvmfPkg/QemuVideoDxe/QemuVideoDxe.inf { + + BltLib|OptionRomPkg/Library/FrameBufferBltLib/FrameBufferBltLib.inf + } ++!endif + + # + # ISA Support +diff --git a/OvmfPkg/OvmfPkgIa32X64.fdf b/OvmfPkg/OvmfPkgIa32X64.fdf +index ffed58a..c9d826c 100644 +--- a/OvmfPkg/OvmfPkgIa32X64.fdf ++++ b/OvmfPkg/OvmfPkgIa32X64.fdf +@@ -348,9 +348,10 @@ INF MdeModulePkg/Bus/Usb/UsbMassStorageDxe/UsbMassStorageDxe.inf + INF IntelFrameworkModulePkg/Csm/BiosThunk/VideoDxe/VideoDxe.inf + INF IntelFrameworkModulePkg/Csm/LegacyBiosDxe/LegacyBiosDxe.inf + INF RuleOverride=CSM OvmfPkg/Csm/Csm16/Csm16.inf +-!endif +- ++!else + INF OvmfPkg/QemuVideoDxe/QemuVideoDxe.inf ++!endif ++ + INF OvmfPkg/PlatformDxe/Platform.inf + + !if $(SMM_REQUIRE) == TRUE +diff --git a/OvmfPkg/OvmfPkgX64.dsc b/OvmfPkg/OvmfPkgX64.dsc +index 76ef00a..b12c6ed 100644 +--- a/OvmfPkg/OvmfPkgX64.dsc ++++ b/OvmfPkg/OvmfPkgX64.dsc +@@ -556,10 +556,12 @@ + MdeModulePkg/Universal/DisplayEngineDxe/DisplayEngineDxe.inf + MdeModulePkg/Universal/MemoryTest/NullMemoryTestDxe/NullMemoryTestDxe.inf + ++!ifndef $(CSM_ENABLE) + OvmfPkg/QemuVideoDxe/QemuVideoDxe.inf { + + BltLib|OptionRomPkg/Library/FrameBufferBltLib/FrameBufferBltLib.inf + } ++!endif + + # + # ISA Support +diff --git a/OvmfPkg/OvmfPkgX64.fdf b/OvmfPkg/OvmfPkgX64.fdf +index ae9f348..d6370a1 100644 +--- a/OvmfPkg/OvmfPkgX64.fdf ++++ b/OvmfPkg/OvmfPkgX64.fdf +@@ -348,9 +348,10 @@ INF MdeModulePkg/Bus/Usb/UsbMassStorageDxe/UsbMassStorageDxe.inf + INF IntelFrameworkModulePkg/Csm/BiosThunk/VideoDxe/VideoDxe.inf + INF IntelFrameworkModulePkg/Csm/LegacyBiosDxe/LegacyBiosDxe.inf + INF RuleOverride=CSM OvmfPkg/Csm/Csm16/Csm16.inf +-!endif +- ++!else + INF OvmfPkg/QemuVideoDxe/QemuVideoDxe.inf ++!endif ++ + INF OvmfPkg/PlatformDxe/Platform.inf + + !if $(SMM_REQUIRE) == TRUE +-- +1.8.3.1 + diff --git a/recipes-openxt/xenclient/ovmf/files/0001-OvmfPkg-EnrollDefaultKeys-application-for-enrolling-.patch b/recipes-openxt/xenclient/ovmf/files/0001-OvmfPkg-EnrollDefaultKeys-application-for-enrolling-.patch new file mode 100644 index 0000000000..913a90f09c --- /dev/null +++ b/recipes-openxt/xenclient/ovmf/files/0001-OvmfPkg-EnrollDefaultKeys-application-for-enrolling-.patch @@ -0,0 +1,1127 @@ +From b3bc8aa82eccda416297b7abf444e4e03a937b2c Mon Sep 17 00:00:00 2001 +From: Laszlo Ersek +Date: Mon, 6 Jul 2015 20:22:02 +0200 +Subject: [PATCH] OvmfPkg: EnrollDefaultKeys: application for enrolling default + keys + +(A port of the patch +to Gerd's public RPMs.) + +This application is meant to be invoked by the management layer, after +booting the UEFI shell and getting a shell prompt on the serial console. +The app enrolls a number of certificates (see below), and then reports +status to the serial console as well. The expected output is "info: +success": + +> Shell> EnrollDefaultKeys.efi +> info: SetupMode=1 SecureBoot=0 SecureBootEnable=0 CustomMode=0 VendorKeys=1 +> info: SetupMode=0 SecureBoot=1 SecureBootEnable=1 CustomMode=0 VendorKeys=0 +> info: success +> Shell> + +In case of success, the management layer can force off or reboot the VM +(for example with the "reset -s" or "reset -c" UEFI shell commands, +respectively), and start the guest installation with SecureBoot enabled. + +PK: +- A unique, static, ad-hoc certificate whose private half has been + destroyed (more precisely, never saved) and is therefore unusable for + signing. (The command for creating this certificate is saved in the + source code.) + +KEK: +- same ad-hoc certificate as used for the PK, +- "Microsoft Corporation KEK CA 2011" -- the dbx data in Fedora's dbxtool + package is signed (indirectly, through a chain) with this; enrolling + such a KEK should allow guests to install those updates. + +DB: +- "Microsoft Windows Production PCA 2011" -- to load Windows 8 and Windows + Server 2012 R2, +- "Microsoft Corporation UEFI CA 2011" -- to load Linux and signed PCI + oproms. + +Contributed-under: TianoCore Contribution Agreement 1.0 +Signed-off-by: Laszlo Ersek +--- + OvmfPkg/EnrollDefaultKeys/EnrollDefaultKeys.c | 961 ++++++++++++++++++++++++ + OvmfPkg/EnrollDefaultKeys/EnrollDefaultKeys.inf | 51 ++ + OvmfPkg/OvmfPkgIa32.dsc | 4 + + OvmfPkg/OvmfPkgIa32X64.dsc | 4 + + OvmfPkg/OvmfPkgX64.dsc | 4 + + 5 files changed, 1024 insertions(+) + create mode 100644 OvmfPkg/EnrollDefaultKeys/EnrollDefaultKeys.c + create mode 100644 OvmfPkg/EnrollDefaultKeys/EnrollDefaultKeys.inf + +diff --git a/OvmfPkg/EnrollDefaultKeys/EnrollDefaultKeys.c b/OvmfPkg/EnrollDefaultKeys/EnrollDefaultKeys.c +new file mode 100644 +index 0000000..29de6e2 +--- /dev/null ++++ b/OvmfPkg/EnrollDefaultKeys/EnrollDefaultKeys.c +@@ -0,0 +1,961 @@ ++/** @file ++ Enroll default PK, KEK, DB. ++ ++ Copyright (C) 2014, Red Hat, Inc. ++ ++ This program and the accompanying materials are licensed and made available ++ under the terms and conditions of the BSD License which accompanies this ++ distribution. The full text of the license may be found at ++ http://opensource.org/licenses/bsd-license. ++ ++ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, WITHOUT ++ WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. ++**/ ++#include // gEfiCustomModeEnableGuid ++#include // EFI_SETUP_MODE_NAME ++#include // EFI_IMAGE_SECURITY_DATABASE ++#include // CopyGuid() ++#include // ASSERT() ++#include // FreePool() ++#include // ShellAppMain() ++#include // AsciiPrint() ++#include // gRT ++ ++// ++// The example self-signed certificate below, which we'll use for both Platform ++// Key, and first Key Exchange Key, has been generated with the following ++// non-interactive openssl command. The passphrase is read from /dev/urandom, ++// and not saved, and the private key is written to /dev/null. In other words, ++// we can't sign anything else against this certificate, which is our purpose. ++// ++/* ++ openssl req \ ++ -passout file:<(head -c 16 /dev/urandom) \ ++ -x509 \ ++ -newkey rsa:2048 \ ++ -keyout /dev/null \ ++ -outform DER \ ++ -subj $( ++ printf /C=US ++ printf /ST=TestStateOrProvince ++ printf /L=TestLocality ++ printf /O=TestOrganization ++ printf /OU=TestOrganizationalUnit ++ printf /CN=TestCommonName ++ printf /emailAddress=test@example.com ++ ) \ ++ 2>/dev/null \ ++ | xxd -i ++*/ ++STATIC CONST UINT8 ExampleCert[] = { ++ 0x30, 0x82, 0x04, 0x45, 0x30, 0x82, 0x03, 0x2d, 0xa0, 0x03, 0x02, 0x01, 0x02, ++ 0x02, 0x09, 0x00, 0xcf, 0x9f, 0x51, 0xa3, 0x07, 0xdb, 0x54, 0xa1, 0x30, 0x0d, ++ 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, ++ 0x30, 0x81, 0xb8, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, ++ 0x02, 0x55, 0x53, 0x31, 0x1c, 0x30, 0x1a, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0c, ++ 0x13, 0x54, 0x65, 0x73, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x50, ++ 0x72, 0x6f, 0x76, 0x69, 0x6e, 0x63, 0x65, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, ++ 0x55, 0x04, 0x07, 0x0c, 0x0c, 0x54, 0x65, 0x73, 0x74, 0x4c, 0x6f, 0x63, 0x61, ++ 0x6c, 0x69, 0x74, 0x79, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x0a, ++ 0x0c, 0x10, 0x54, 0x65, 0x73, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, ++ 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x31, 0x1f, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x04, ++ 0x0b, 0x0c, 0x16, 0x54, 0x65, 0x73, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, ++ 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x55, 0x6e, 0x69, 0x74, 0x31, ++ 0x17, 0x30, 0x15, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x0e, 0x54, 0x65, 0x73, ++ 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x31, 0x1f, ++ 0x30, 0x1d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x01, ++ 0x16, 0x10, 0x74, 0x65, 0x73, 0x74, 0x40, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, ++ 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x34, 0x31, 0x30, ++ 0x30, 0x39, 0x31, 0x33, 0x32, 0x38, 0x32, 0x32, 0x5a, 0x17, 0x0d, 0x31, 0x34, ++ 0x31, 0x31, 0x30, 0x38, 0x31, 0x33, 0x32, 0x38, 0x32, 0x32, 0x5a, 0x30, 0x81, ++ 0xb8, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, ++ 0x53, 0x31, 0x1c, 0x30, 0x1a, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0c, 0x13, 0x54, ++ 0x65, 0x73, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x50, 0x72, 0x6f, ++ 0x76, 0x69, 0x6e, 0x63, 0x65, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, 0x04, ++ 0x07, 0x0c, 0x0c, 0x54, 0x65, 0x73, 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x69, ++ 0x74, 0x79, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x10, ++ 0x54, 0x65, 0x73, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, ++ 0x69, 0x6f, 0x6e, 0x31, 0x1f, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x0c, ++ 0x16, 0x54, 0x65, 0x73, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, ++ 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x55, 0x6e, 0x69, 0x74, 0x31, 0x17, 0x30, ++ 0x15, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x0e, 0x54, 0x65, 0x73, 0x74, 0x43, ++ 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x31, 0x1f, 0x30, 0x1d, ++ 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x01, 0x16, 0x10, ++ 0x74, 0x65, 0x73, 0x74, 0x40, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2e, ++ 0x63, 0x6f, 0x6d, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, ++ 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, ++ 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xbf, 0xf1, 0xce, ++ 0x17, 0x32, 0xac, 0xc4, 0x4b, 0xb2, 0xed, 0x84, 0x76, 0xe5, 0xd0, 0xf8, 0x21, ++ 0xac, 0x10, 0xf8, 0x18, 0x09, 0x0e, 0x07, 0x13, 0x76, 0x21, 0x5c, 0xc4, 0xcc, ++ 0xd5, 0xe6, 0x25, 0xa7, 0x26, 0x53, 0x79, 0x2f, 0x16, 0x4b, 0x85, 0xbd, 0xae, ++ 0x42, 0x64, 0x58, 0xcb, 0x5e, 0xe8, 0x6e, 0x5a, 0xd0, 0xc4, 0x0f, 0x38, 0x16, ++ 0xbe, 0xd3, 0x22, 0xa7, 0x3c, 0x9b, 0x8b, 0x5e, 0xcb, 0x62, 0x35, 0xc5, 0x9b, ++ 0xe2, 0x8e, 0x4c, 0x65, 0x57, 0x4f, 0xcb, 0x27, 0xad, 0xe7, 0x63, 0xa7, 0x77, ++ 0x2b, 0xd5, 0x02, 0x42, 0x70, 0x46, 0xac, 0xba, 0xb6, 0x60, 0x57, 0xd9, 0xce, ++ 0x31, 0xc5, 0x12, 0x03, 0x4a, 0xf7, 0x2a, 0x2b, 0x40, 0x06, 0xb4, 0xdb, 0x31, ++ 0xb7, 0x83, 0x6c, 0x67, 0x87, 0x98, 0x8b, 0xce, 0x1b, 0x30, 0x7a, 0xfa, 0x35, ++ 0x6c, 0x86, 0x20, 0x74, 0xc5, 0x7d, 0x32, 0x31, 0x18, 0xeb, 0x69, 0xf7, 0x2d, ++ 0x20, 0xc4, 0xf0, 0xd2, 0xfa, 0x67, 0x81, 0xc1, 0xbb, 0x23, 0xbb, 0x75, 0x1a, ++ 0xe4, 0xb4, 0x49, 0x99, 0xdf, 0x12, 0x4c, 0xe3, 0x6d, 0x76, 0x24, 0x85, 0x24, ++ 0xae, 0x5a, 0x9e, 0xbd, 0x54, 0x1c, 0xf9, 0x0e, 0xed, 0x96, 0xb5, 0xd8, 0xa2, ++ 0x0d, 0x2a, 0x38, 0x5d, 0x12, 0x97, 0xb0, 0x4d, 0x75, 0x85, 0x1e, 0x47, 0x6d, ++ 0xe1, 0x25, 0x59, 0xcb, 0xe9, 0x33, 0x86, 0x6a, 0xef, 0x98, 0x24, 0xa0, 0x2b, ++ 0x02, 0x7b, 0xc0, 0x9f, 0x88, 0x03, 0xb0, 0xbe, 0x22, 0x65, 0x83, 0x77, 0xb3, ++ 0x30, 0xba, 0xe0, 0x3b, 0x54, 0x31, 0x3a, 0x45, 0x81, 0x9c, 0x48, 0xaf, 0xc1, ++ 0x11, 0x5b, 0xf2, 0x3a, 0x1e, 0x33, 0x1b, 0x8f, 0x0e, 0x04, 0xa4, 0x16, 0xd4, ++ 0x6b, 0x57, 0xee, 0xe7, 0xba, 0xf5, 0xee, 0xaf, 0xe2, 0x4c, 0x50, 0xf8, 0x68, ++ 0x57, 0x88, 0xfb, 0x7f, 0xa3, 0xcf, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x50, ++ 0x30, 0x4e, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, ++ 0x1e, 0x44, 0xe5, 0xef, 0xcd, 0x6e, 0x1f, 0xdb, 0xcb, 0x4f, 0x94, 0x8f, 0xe3, ++ 0x3b, 0x1a, 0x8c, 0xe6, 0x95, 0x29, 0x61, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, ++ 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0x1e, 0x44, 0xe5, 0xef, 0xcd, 0x6e, ++ 0x1f, 0xdb, 0xcb, 0x4f, 0x94, 0x8f, 0xe3, 0x3b, 0x1a, 0x8c, 0xe6, 0x95, 0x29, ++ 0x61, 0x30, 0x0c, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x04, 0x05, 0x30, 0x03, 0x01, ++ 0x01, 0xff, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, ++ 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x12, 0x9c, 0x3e, 0x38, ++ 0xfc, 0x26, 0xea, 0x6d, 0xb7, 0x5c, 0x29, 0x3c, 0x76, 0x20, 0x0c, 0xb2, 0xa9, ++ 0x0f, 0xdf, 0xc0, 0x85, 0xfe, 0xeb, 0xec, 0x1d, 0x5d, 0x73, 0x84, 0xac, 0x8a, ++ 0xb4, 0x2a, 0x86, 0x38, 0x30, 0xaf, 0xd2, 0x2d, 0x2a, 0xde, 0x54, 0xc8, 0x5c, ++ 0x29, 0x90, 0x24, 0xf2, 0x39, 0xc1, 0xa5, 0x00, 0xb4, 0xb7, 0xd8, 0xdc, 0x59, ++ 0x64, 0x50, 0x62, 0x5f, 0x54, 0xf1, 0x73, 0x02, 0x4d, 0x43, 0xc5, 0xc3, 0xc4, ++ 0x0e, 0x62, 0x60, 0x8c, 0x53, 0x66, 0x57, 0x77, 0xb5, 0x81, 0xda, 0x1f, 0x81, ++ 0xda, 0xe9, 0xd6, 0x5e, 0x82, 0xce, 0xa7, 0x5c, 0xc0, 0xa6, 0xbe, 0x9c, 0x5c, ++ 0x7b, 0xa5, 0x15, 0xc8, 0xd7, 0x14, 0x53, 0xd3, 0x5c, 0x1c, 0x9f, 0x8a, 0x9f, ++ 0x66, 0x15, 0xd5, 0xd3, 0x2a, 0x27, 0x0c, 0xee, 0x9f, 0x80, 0x39, 0x88, 0x7b, ++ 0x24, 0xde, 0x0c, 0x61, 0xa3, 0x44, 0xd8, 0x8d, 0x2e, 0x79, 0xf8, 0x1e, 0x04, ++ 0x5a, 0xcb, 0xd6, 0x9c, 0xa3, 0x22, 0x8f, 0x09, 0x32, 0x1e, 0xe1, 0x65, 0x8f, ++ 0x10, 0x5f, 0xd8, 0x52, 0x56, 0xd5, 0x77, 0xac, 0x58, 0x46, 0x60, 0xba, 0x2e, ++ 0xe2, 0x3f, 0x58, 0x7d, 0x60, 0xfc, 0x31, 0x4a, 0x3a, 0xaf, 0x61, 0x55, 0x5f, ++ 0xfb, 0x68, 0x14, 0x74, 0xda, 0xdc, 0x42, 0x78, 0xcc, 0xee, 0xff, 0x5c, 0x03, ++ 0x24, 0x26, 0x2c, 0xb8, 0x3a, 0x81, 0xad, 0xdb, 0xe7, 0xed, 0xe1, 0x62, 0x84, ++ 0x07, 0x1a, 0xc8, 0xa4, 0x4e, 0xb0, 0x87, 0xf7, 0x96, 0xd8, 0x33, 0x9b, 0x0d, ++ 0xa7, 0x77, 0xae, 0x5b, 0xaf, 0xad, 0xe6, 0x5a, 0xc9, 0xfa, 0xa4, 0xe4, 0xe5, ++ 0x57, 0xbb, 0x97, 0xdd, 0x92, 0x85, 0xd8, 0x03, 0x45, 0xfe, 0xd8, 0x6b, 0xb1, ++ 0xdb, 0x85, 0x36, 0xb9, 0xd9, 0x28, 0xbf, 0x17, 0xae, 0x11, 0xde, 0x10, 0x19, ++ 0x26, 0x5b, 0xc0, 0x3d, 0xc7 ++}; ++ ++// ++// Second KEK: "Microsoft Corporation KEK CA 2011". ++// SHA1: 31:59:0b:fd:89:c9:d7:4e:d0:87:df:ac:66:33:4b:39:31:25:4b:30 ++// ++// "dbx" updates in "dbxtool" are signed with a key derived from this KEK. ++// ++STATIC CONST UINT8 MicrosoftKEK[] = { ++ 0x30, 0x82, 0x05, 0xe8, 0x30, 0x82, 0x03, 0xd0, 0xa0, 0x03, 0x02, 0x01, 0x02, ++ 0x02, 0x0a, 0x61, 0x0a, 0xd1, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x30, ++ 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, ++ 0x00, 0x30, 0x81, 0x91, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, ++ 0x13, 0x02, 0x55, 0x53, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x08, ++ 0x13, 0x0a, 0x57, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x74, 0x6f, 0x6e, 0x31, ++ 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x07, 0x52, 0x65, 0x64, ++ 0x6d, 0x6f, 0x6e, 0x64, 0x31, 0x1e, 0x30, 0x1c, 0x06, 0x03, 0x55, 0x04, 0x0a, ++ 0x13, 0x15, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x20, 0x43, ++ 0x6f, 0x72, 0x70, 0x6f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x31, 0x3b, 0x30, ++ 0x39, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x32, 0x4d, 0x69, 0x63, 0x72, 0x6f, ++ 0x73, 0x6f, 0x66, 0x74, 0x20, 0x43, 0x6f, 0x72, 0x70, 0x6f, 0x72, 0x61, 0x74, ++ 0x69, 0x6f, 0x6e, 0x20, 0x54, 0x68, 0x69, 0x72, 0x64, 0x20, 0x50, 0x61, 0x72, ++ 0x74, 0x79, 0x20, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, ++ 0x65, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x31, 0x30, ++ 0x36, 0x32, 0x34, 0x32, 0x30, 0x34, 0x31, 0x32, 0x39, 0x5a, 0x17, 0x0d, 0x32, ++ 0x36, 0x30, 0x36, 0x32, 0x34, 0x32, 0x30, 0x35, 0x31, 0x32, 0x39, 0x5a, 0x30, ++ 0x81, 0x80, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, ++ 0x55, 0x53, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x0a, ++ 0x57, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x74, 0x6f, 0x6e, 0x31, 0x10, 0x30, ++ 0x0e, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x07, 0x52, 0x65, 0x64, 0x6d, 0x6f, ++ 0x6e, 0x64, 0x31, 0x1e, 0x30, 0x1c, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x15, ++ 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x20, 0x43, 0x6f, 0x72, ++ 0x70, 0x6f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x31, 0x2a, 0x30, 0x28, 0x06, ++ 0x03, 0x55, 0x04, 0x03, 0x13, 0x21, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, ++ 0x66, 0x74, 0x20, 0x43, 0x6f, 0x72, 0x70, 0x6f, 0x72, 0x61, 0x74, 0x69, 0x6f, ++ 0x6e, 0x20, 0x4b, 0x45, 0x4b, 0x20, 0x43, 0x41, 0x20, 0x32, 0x30, 0x31, 0x31, ++ 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, ++ 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, ++ 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xc4, 0xe8, 0xb5, 0x8a, 0xbf, 0xad, ++ 0x57, 0x26, 0xb0, 0x26, 0xc3, 0xea, 0xe7, 0xfb, 0x57, 0x7a, 0x44, 0x02, 0x5d, ++ 0x07, 0x0d, 0xda, 0x4a, 0xe5, 0x74, 0x2a, 0xe6, 0xb0, 0x0f, 0xec, 0x6d, 0xeb, ++ 0xec, 0x7f, 0xb9, 0xe3, 0x5a, 0x63, 0x32, 0x7c, 0x11, 0x17, 0x4f, 0x0e, 0xe3, ++ 0x0b, 0xa7, 0x38, 0x15, 0x93, 0x8e, 0xc6, 0xf5, 0xe0, 0x84, 0xb1, 0x9a, 0x9b, ++ 0x2c, 0xe7, 0xf5, 0xb7, 0x91, 0xd6, 0x09, 0xe1, 0xe2, 0xc0, 0x04, 0xa8, 0xac, ++ 0x30, 0x1c, 0xdf, 0x48, 0xf3, 0x06, 0x50, 0x9a, 0x64, 0xa7, 0x51, 0x7f, 0xc8, ++ 0x85, 0x4f, 0x8f, 0x20, 0x86, 0xce, 0xfe, 0x2f, 0xe1, 0x9f, 0xff, 0x82, 0xc0, ++ 0xed, 0xe9, 0xcd, 0xce, 0xf4, 0x53, 0x6a, 0x62, 0x3a, 0x0b, 0x43, 0xb9, 0xe2, ++ 0x25, 0xfd, 0xfe, 0x05, 0xf9, 0xd4, 0xc4, 0x14, 0xab, 0x11, 0xe2, 0x23, 0x89, ++ 0x8d, 0x70, 0xb7, 0xa4, 0x1d, 0x4d, 0xec, 0xae, 0xe5, 0x9c, 0xfa, 0x16, 0xc2, ++ 0xd7, 0xc1, 0xcb, 0xd4, 0xe8, 0xc4, 0x2f, 0xe5, 0x99, 0xee, 0x24, 0x8b, 0x03, ++ 0xec, 0x8d, 0xf2, 0x8b, 0xea, 0xc3, 0x4a, 0xfb, 0x43, 0x11, 0x12, 0x0b, 0x7e, ++ 0xb5, 0x47, 0x92, 0x6c, 0xdc, 0xe6, 0x04, 0x89, 0xeb, 0xf5, 0x33, 0x04, 0xeb, ++ 0x10, 0x01, 0x2a, 0x71, 0xe5, 0xf9, 0x83, 0x13, 0x3c, 0xff, 0x25, 0x09, 0x2f, ++ 0x68, 0x76, 0x46, 0xff, 0xba, 0x4f, 0xbe, 0xdc, 0xad, 0x71, 0x2a, 0x58, 0xaa, ++ 0xfb, 0x0e, 0xd2, 0x79, 0x3d, 0xe4, 0x9b, 0x65, 0x3b, 0xcc, 0x29, 0x2a, 0x9f, ++ 0xfc, 0x72, 0x59, 0xa2, 0xeb, 0xae, 0x92, 0xef, 0xf6, 0x35, 0x13, 0x80, 0xc6, ++ 0x02, 0xec, 0xe4, 0x5f, 0xcc, 0x9d, 0x76, 0xcd, 0xef, 0x63, 0x92, 0xc1, 0xaf, ++ 0x79, 0x40, 0x84, 0x79, 0x87, 0x7f, 0xe3, 0x52, 0xa8, 0xe8, 0x9d, 0x7b, 0x07, ++ 0x69, 0x8f, 0x15, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x82, 0x01, 0x4f, 0x30, ++ 0x82, 0x01, 0x4b, 0x30, 0x10, 0x06, 0x09, 0x2b, 0x06, 0x01, 0x04, 0x01, 0x82, ++ 0x37, 0x15, 0x01, 0x04, 0x03, 0x02, 0x01, 0x00, 0x30, 0x1d, 0x06, 0x03, 0x55, ++ 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x62, 0xfc, 0x43, 0xcd, 0xa0, 0x3e, 0xa4, ++ 0xcb, 0x67, 0x12, 0xd2, 0x5b, 0xd9, 0x55, 0xac, 0x7b, 0xcc, 0xb6, 0x8a, 0x5f, ++ 0x30, 0x19, 0x06, 0x09, 0x2b, 0x06, 0x01, 0x04, 0x01, 0x82, 0x37, 0x14, 0x02, ++ 0x04, 0x0c, 0x1e, 0x0a, 0x00, 0x53, 0x00, 0x75, 0x00, 0x62, 0x00, 0x43, 0x00, ++ 0x41, 0x30, 0x0b, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x04, 0x04, 0x03, 0x02, 0x01, ++ 0x86, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, ++ 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, ++ 0x18, 0x30, 0x16, 0x80, 0x14, 0x45, 0x66, 0x52, 0x43, 0xe1, 0x7e, 0x58, 0x11, ++ 0xbf, 0xd6, 0x4e, 0x9e, 0x23, 0x55, 0x08, 0x3b, 0x3a, 0x22, 0x6a, 0xa8, 0x30, ++ 0x5c, 0x06, 0x03, 0x55, 0x1d, 0x1f, 0x04, 0x55, 0x30, 0x53, 0x30, 0x51, 0xa0, ++ 0x4f, 0xa0, 0x4d, 0x86, 0x4b, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x63, ++ 0x72, 0x6c, 0x2e, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x2e, ++ 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x6b, 0x69, 0x2f, 0x63, 0x72, 0x6c, 0x2f, 0x70, ++ 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x2f, 0x4d, 0x69, 0x63, 0x43, 0x6f, ++ 0x72, 0x54, 0x68, 0x69, 0x50, 0x61, 0x72, 0x4d, 0x61, 0x72, 0x52, 0x6f, 0x6f, ++ 0x5f, 0x32, 0x30, 0x31, 0x30, 0x2d, 0x31, 0x30, 0x2d, 0x30, 0x35, 0x2e, 0x63, ++ 0x72, 0x6c, 0x30, 0x60, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x01, ++ 0x01, 0x04, 0x54, 0x30, 0x52, 0x30, 0x50, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, ++ 0x05, 0x07, 0x30, 0x02, 0x86, 0x44, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, ++ 0x77, 0x77, 0x77, 0x2e, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, ++ 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x6b, 0x69, 0x2f, 0x63, 0x65, 0x72, 0x74, ++ 0x73, 0x2f, 0x4d, 0x69, 0x63, 0x43, 0x6f, 0x72, 0x54, 0x68, 0x69, 0x50, 0x61, ++ 0x72, 0x4d, 0x61, 0x72, 0x52, 0x6f, 0x6f, 0x5f, 0x32, 0x30, 0x31, 0x30, 0x2d, ++ 0x31, 0x30, 0x2d, 0x30, 0x35, 0x2e, 0x63, 0x72, 0x74, 0x30, 0x0d, 0x06, 0x09, ++ 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, ++ 0x02, 0x01, 0x00, 0xd4, 0x84, 0x88, 0xf5, 0x14, 0x94, 0x18, 0x02, 0xca, 0x2a, ++ 0x3c, 0xfb, 0x2a, 0x92, 0x1c, 0x0c, 0xd7, 0xa0, 0xd1, 0xf1, 0xe8, 0x52, 0x66, ++ 0xa8, 0xee, 0xa2, 0xb5, 0x75, 0x7a, 0x90, 0x00, 0xaa, 0x2d, 0xa4, 0x76, 0x5a, ++ 0xea, 0x79, 0xb7, 0xb9, 0x37, 0x6a, 0x51, 0x7b, 0x10, 0x64, 0xf6, 0xe1, 0x64, ++ 0xf2, 0x02, 0x67, 0xbe, 0xf7, 0xa8, 0x1b, 0x78, 0xbd, 0xba, 0xce, 0x88, 0x58, ++ 0x64, 0x0c, 0xd6, 0x57, 0xc8, 0x19, 0xa3, 0x5f, 0x05, 0xd6, 0xdb, 0xc6, 0xd0, ++ 0x69, 0xce, 0x48, 0x4b, 0x32, 0xb7, 0xeb, 0x5d, 0xd2, 0x30, 0xf5, 0xc0, 0xf5, ++ 0xb8, 0xba, 0x78, 0x07, 0xa3, 0x2b, 0xfe, 0x9b, 0xdb, 0x34, 0x56, 0x84, 0xec, ++ 0x82, 0xca, 0xae, 0x41, 0x25, 0x70, 0x9c, 0x6b, 0xe9, 0xfe, 0x90, 0x0f, 0xd7, ++ 0x96, 0x1f, 0xe5, 0xe7, 0x94, 0x1f, 0xb2, 0x2a, 0x0c, 0x8d, 0x4b, 0xff, 0x28, ++ 0x29, 0x10, 0x7b, 0xf7, 0xd7, 0x7c, 0xa5, 0xd1, 0x76, 0xb9, 0x05, 0xc8, 0x79, ++ 0xed, 0x0f, 0x90, 0x92, 0x9c, 0xc2, 0xfe, 0xdf, 0x6f, 0x7e, 0x6c, 0x0f, 0x7b, ++ 0xd4, 0xc1, 0x45, 0xdd, 0x34, 0x51, 0x96, 0x39, 0x0f, 0xe5, 0x5e, 0x56, 0xd8, ++ 0x18, 0x05, 0x96, 0xf4, 0x07, 0xa6, 0x42, 0xb3, 0xa0, 0x77, 0xfd, 0x08, 0x19, ++ 0xf2, 0x71, 0x56, 0xcc, 0x9f, 0x86, 0x23, 0xa4, 0x87, 0xcb, 0xa6, 0xfd, 0x58, ++ 0x7e, 0xd4, 0x69, 0x67, 0x15, 0x91, 0x7e, 0x81, 0xf2, 0x7f, 0x13, 0xe5, 0x0d, ++ 0x8b, 0x8a, 0x3c, 0x87, 0x84, 0xeb, 0xe3, 0xce, 0xbd, 0x43, 0xe5, 0xad, 0x2d, ++ 0x84, 0x93, 0x8e, 0x6a, 0x2b, 0x5a, 0x7c, 0x44, 0xfa, 0x52, 0xaa, 0x81, 0xc8, ++ 0x2d, 0x1c, 0xbb, 0xe0, 0x52, 0xdf, 0x00, 0x11, 0xf8, 0x9a, 0x3d, 0xc1, 0x60, ++ 0xb0, 0xe1, 0x33, 0xb5, 0xa3, 0x88, 0xd1, 0x65, 0x19, 0x0a, 0x1a, 0xe7, 0xac, ++ 0x7c, 0xa4, 0xc1, 0x82, 0x87, 0x4e, 0x38, 0xb1, 0x2f, 0x0d, 0xc5, 0x14, 0x87, ++ 0x6f, 0xfd, 0x8d, 0x2e, 0xbc, 0x39, 0xb6, 0xe7, 0xe6, 0xc3, 0xe0, 0xe4, 0xcd, ++ 0x27, 0x84, 0xef, 0x94, 0x42, 0xef, 0x29, 0x8b, 0x90, 0x46, 0x41, 0x3b, 0x81, ++ 0x1b, 0x67, 0xd8, 0xf9, 0x43, 0x59, 0x65, 0xcb, 0x0d, 0xbc, 0xfd, 0x00, 0x92, ++ 0x4f, 0xf4, 0x75, 0x3b, 0xa7, 0xa9, 0x24, 0xfc, 0x50, 0x41, 0x40, 0x79, 0xe0, ++ 0x2d, 0x4f, 0x0a, 0x6a, 0x27, 0x76, 0x6e, 0x52, 0xed, 0x96, 0x69, 0x7b, 0xaf, ++ 0x0f, 0xf7, 0x87, 0x05, 0xd0, 0x45, 0xc2, 0xad, 0x53, 0x14, 0x81, 0x1f, 0xfb, ++ 0x30, 0x04, 0xaa, 0x37, 0x36, 0x61, 0xda, 0x4a, 0x69, 0x1b, 0x34, 0xd8, 0x68, ++ 0xed, 0xd6, 0x02, 0xcf, 0x6c, 0x94, 0x0c, 0xd3, 0xcf, 0x6c, 0x22, 0x79, 0xad, ++ 0xb1, 0xf0, 0xbc, 0x03, 0xa2, 0x46, 0x60, 0xa9, 0xc4, 0x07, 0xc2, 0x21, 0x82, ++ 0xf1, 0xfd, 0xf2, 0xe8, 0x79, 0x32, 0x60, 0xbf, 0xd8, 0xac, 0xa5, 0x22, 0x14, ++ 0x4b, 0xca, 0xc1, 0xd8, 0x4b, 0xeb, 0x7d, 0x3f, 0x57, 0x35, 0xb2, 0xe6, 0x4f, ++ 0x75, 0xb4, 0xb0, 0x60, 0x03, 0x22, 0x53, 0xae, 0x91, 0x79, 0x1d, 0xd6, 0x9b, ++ 0x41, 0x1f, 0x15, 0x86, 0x54, 0x70, 0xb2, 0xde, 0x0d, 0x35, 0x0f, 0x7c, 0xb0, ++ 0x34, 0x72, 0xba, 0x97, 0x60, 0x3b, 0xf0, 0x79, 0xeb, 0xa2, 0xb2, 0x1c, 0x5d, ++ 0xa2, 0x16, 0xb8, 0x87, 0xc5, 0xe9, 0x1b, 0xf6, 0xb5, 0x97, 0x25, 0x6f, 0x38, ++ 0x9f, 0xe3, 0x91, 0xfa, 0x8a, 0x79, 0x98, 0xc3, 0x69, 0x0e, 0xb7, 0xa3, 0x1c, ++ 0x20, 0x05, 0x97, 0xf8, 0xca, 0x14, 0xae, 0x00, 0xd7, 0xc4, 0xf3, 0xc0, 0x14, ++ 0x10, 0x75, 0x6b, 0x34, 0xa0, 0x1b, 0xb5, 0x99, 0x60, 0xf3, 0x5c, 0xb0, 0xc5, ++ 0x57, 0x4e, 0x36, 0xd2, 0x32, 0x84, 0xbf, 0x9e ++}; ++ ++// ++// First DB entry: "Microsoft Windows Production PCA 2011" ++// SHA1: 58:0a:6f:4c:c4:e4:b6:69:b9:eb:dc:1b:2b:3e:08:7b:80:d0:67:8d ++// ++// Windows 8 and Windows Server 2012 R2 boot loaders are signed with a chain ++// rooted in this certificate. ++// ++STATIC CONST UINT8 MicrosoftPCA[] = { ++ 0x30, 0x82, 0x05, 0xd7, 0x30, 0x82, 0x03, 0xbf, 0xa0, 0x03, 0x02, 0x01, 0x02, ++ 0x02, 0x0a, 0x61, 0x07, 0x76, 0x56, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x30, ++ 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, ++ 0x00, 0x30, 0x81, 0x88, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, ++ 0x13, 0x02, 0x55, 0x53, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x08, ++ 0x13, 0x0a, 0x57, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x74, 0x6f, 0x6e, 0x31, ++ 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x07, 0x52, 0x65, 0x64, ++ 0x6d, 0x6f, 0x6e, 0x64, 0x31, 0x1e, 0x30, 0x1c, 0x06, 0x03, 0x55, 0x04, 0x0a, ++ 0x13, 0x15, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x20, 0x43, ++ 0x6f, 0x72, 0x70, 0x6f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x31, 0x32, 0x30, ++ 0x30, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x29, 0x4d, 0x69, 0x63, 0x72, 0x6f, ++ 0x73, 0x6f, 0x66, 0x74, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x65, 0x72, ++ 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x20, 0x41, 0x75, 0x74, 0x68, ++ 0x6f, 0x72, 0x69, 0x74, 0x79, 0x20, 0x32, 0x30, 0x31, 0x30, 0x30, 0x1e, 0x17, ++ 0x0d, 0x31, 0x31, 0x31, 0x30, 0x31, 0x39, 0x31, 0x38, 0x34, 0x31, 0x34, 0x32, ++ 0x5a, 0x17, 0x0d, 0x32, 0x36, 0x31, 0x30, 0x31, 0x39, 0x31, 0x38, 0x35, 0x31, ++ 0x34, 0x32, 0x5a, 0x30, 0x81, 0x84, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, ++ 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, ++ 0x04, 0x08, 0x13, 0x0a, 0x57, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x74, 0x6f, ++ 0x6e, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x07, 0x52, ++ 0x65, 0x64, 0x6d, 0x6f, 0x6e, 0x64, 0x31, 0x1e, 0x30, 0x1c, 0x06, 0x03, 0x55, ++ 0x04, 0x0a, 0x13, 0x15, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, ++ 0x20, 0x43, 0x6f, 0x72, 0x70, 0x6f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x31, ++ 0x2e, 0x30, 0x2c, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x25, 0x4d, 0x69, 0x63, ++ 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x20, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, ++ 0x73, 0x20, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, ++ 0x50, 0x43, 0x41, 0x20, 0x32, 0x30, 0x31, 0x31, 0x30, 0x82, 0x01, 0x22, 0x30, ++ 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, ++ 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, ++ 0x01, 0x00, 0xdd, 0x0c, 0xbb, 0xa2, 0xe4, 0x2e, 0x09, 0xe3, 0xe7, 0xc5, 0xf7, ++ 0x96, 0x69, 0xbc, 0x00, 0x21, 0xbd, 0x69, 0x33, 0x33, 0xef, 0xad, 0x04, 0xcb, ++ 0x54, 0x80, 0xee, 0x06, 0x83, 0xbb, 0xc5, 0x20, 0x84, 0xd9, 0xf7, 0xd2, 0x8b, ++ 0xf3, 0x38, 0xb0, 0xab, 0xa4, 0xad, 0x2d, 0x7c, 0x62, 0x79, 0x05, 0xff, 0xe3, ++ 0x4a, 0x3f, 0x04, 0x35, 0x20, 0x70, 0xe3, 0xc4, 0xe7, 0x6b, 0xe0, 0x9c, 0xc0, ++ 0x36, 0x75, 0xe9, 0x8a, 0x31, 0xdd, 0x8d, 0x70, 0xe5, 0xdc, 0x37, 0xb5, 0x74, ++ 0x46, 0x96, 0x28, 0x5b, 0x87, 0x60, 0x23, 0x2c, 0xbf, 0xdc, 0x47, 0xa5, 0x67, ++ 0xf7, 0x51, 0x27, 0x9e, 0x72, 0xeb, 0x07, 0xa6, 0xc9, 0xb9, 0x1e, 0x3b, 0x53, ++ 0x35, 0x7c, 0xe5, 0xd3, 0xec, 0x27, 0xb9, 0x87, 0x1c, 0xfe, 0xb9, 0xc9, 0x23, ++ 0x09, 0x6f, 0xa8, 0x46, 0x91, 0xc1, 0x6e, 0x96, 0x3c, 0x41, 0xd3, 0xcb, 0xa3, ++ 0x3f, 0x5d, 0x02, 0x6a, 0x4d, 0xec, 0x69, 0x1f, 0x25, 0x28, 0x5c, 0x36, 0xff, ++ 0xfd, 0x43, 0x15, 0x0a, 0x94, 0xe0, 0x19, 0xb4, 0xcf, 0xdf, 0xc2, 0x12, 0xe2, ++ 0xc2, 0x5b, 0x27, 0xee, 0x27, 0x78, 0x30, 0x8b, 0x5b, 0x2a, 0x09, 0x6b, 0x22, ++ 0x89, 0x53, 0x60, 0x16, 0x2c, 0xc0, 0x68, 0x1d, 0x53, 0xba, 0xec, 0x49, 0xf3, ++ 0x9d, 0x61, 0x8c, 0x85, 0x68, 0x09, 0x73, 0x44, 0x5d, 0x7d, 0xa2, 0x54, 0x2b, ++ 0xdd, 0x79, 0xf7, 0x15, 0xcf, 0x35, 0x5d, 0x6c, 0x1c, 0x2b, 0x5c, 0xce, 0xbc, ++ 0x9c, 0x23, 0x8b, 0x6f, 0x6e, 0xb5, 0x26, 0xd9, 0x36, 0x13, 0xc3, 0x4f, 0xd6, ++ 0x27, 0xae, 0xb9, 0x32, 0x3b, 0x41, 0x92, 0x2c, 0xe1, 0xc7, 0xcd, 0x77, 0xe8, ++ 0xaa, 0x54, 0x4e, 0xf7, 0x5c, 0x0b, 0x04, 0x87, 0x65, 0xb4, 0x43, 0x18, 0xa8, ++ 0xb2, 0xe0, 0x6d, 0x19, 0x77, 0xec, 0x5a, 0x24, 0xfa, 0x48, 0x03, 0x02, 0x03, ++ 0x01, 0x00, 0x01, 0xa3, 0x82, 0x01, 0x43, 0x30, 0x82, 0x01, 0x3f, 0x30, 0x10, ++ 0x06, 0x09, 0x2b, 0x06, 0x01, 0x04, 0x01, 0x82, 0x37, 0x15, 0x01, 0x04, 0x03, ++ 0x02, 0x01, 0x00, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, ++ 0x14, 0xa9, 0x29, 0x02, 0x39, 0x8e, 0x16, 0xc4, 0x97, 0x78, 0xcd, 0x90, 0xf9, ++ 0x9e, 0x4f, 0x9a, 0xe1, 0x7c, 0x55, 0xaf, 0x53, 0x30, 0x19, 0x06, 0x09, 0x2b, ++ 0x06, 0x01, 0x04, 0x01, 0x82, 0x37, 0x14, 0x02, 0x04, 0x0c, 0x1e, 0x0a, 0x00, ++ 0x53, 0x00, 0x75, 0x00, 0x62, 0x00, 0x43, 0x00, 0x41, 0x30, 0x0b, 0x06, 0x03, ++ 0x55, 0x1d, 0x0f, 0x04, 0x04, 0x03, 0x02, 0x01, 0x86, 0x30, 0x0f, 0x06, 0x03, ++ 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, ++ 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, ++ 0xd5, 0xf6, 0x56, 0xcb, 0x8f, 0xe8, 0xa2, 0x5c, 0x62, 0x68, 0xd1, 0x3d, 0x94, ++ 0x90, 0x5b, 0xd7, 0xce, 0x9a, 0x18, 0xc4, 0x30, 0x56, 0x06, 0x03, 0x55, 0x1d, ++ 0x1f, 0x04, 0x4f, 0x30, 0x4d, 0x30, 0x4b, 0xa0, 0x49, 0xa0, 0x47, 0x86, 0x45, ++ 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x63, 0x72, 0x6c, 0x2e, 0x6d, 0x69, ++ 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, ++ 0x6b, 0x69, 0x2f, 0x63, 0x72, 0x6c, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, ++ 0x74, 0x73, 0x2f, 0x4d, 0x69, 0x63, 0x52, 0x6f, 0x6f, 0x43, 0x65, 0x72, 0x41, ++ 0x75, 0x74, 0x5f, 0x32, 0x30, 0x31, 0x30, 0x2d, 0x30, 0x36, 0x2d, 0x32, 0x33, ++ 0x2e, 0x63, 0x72, 0x6c, 0x30, 0x5a, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, ++ 0x07, 0x01, 0x01, 0x04, 0x4e, 0x30, 0x4c, 0x30, 0x4a, 0x06, 0x08, 0x2b, 0x06, ++ 0x01, 0x05, 0x05, 0x07, 0x30, 0x02, 0x86, 0x3e, 0x68, 0x74, 0x74, 0x70, 0x3a, ++ 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, ++ 0x66, 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x6b, 0x69, 0x2f, 0x63, 0x65, ++ 0x72, 0x74, 0x73, 0x2f, 0x4d, 0x69, 0x63, 0x52, 0x6f, 0x6f, 0x43, 0x65, 0x72, ++ 0x41, 0x75, 0x74, 0x5f, 0x32, 0x30, 0x31, 0x30, 0x2d, 0x30, 0x36, 0x2d, 0x32, ++ 0x33, 0x2e, 0x63, 0x72, 0x74, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, ++ 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, 0x02, 0x01, 0x00, 0x14, ++ 0xfc, 0x7c, 0x71, 0x51, 0xa5, 0x79, 0xc2, 0x6e, 0xb2, 0xef, 0x39, 0x3e, 0xbc, ++ 0x3c, 0x52, 0x0f, 0x6e, 0x2b, 0x3f, 0x10, 0x13, 0x73, 0xfe, 0xa8, 0x68, 0xd0, ++ 0x48, 0xa6, 0x34, 0x4d, 0x8a, 0x96, 0x05, 0x26, 0xee, 0x31, 0x46, 0x90, 0x61, ++ 0x79, 0xd6, 0xff, 0x38, 0x2e, 0x45, 0x6b, 0xf4, 0xc0, 0xe5, 0x28, 0xb8, 0xda, ++ 0x1d, 0x8f, 0x8a, 0xdb, 0x09, 0xd7, 0x1a, 0xc7, 0x4c, 0x0a, 0x36, 0x66, 0x6a, ++ 0x8c, 0xec, 0x1b, 0xd7, 0x04, 0x90, 0xa8, 0x18, 0x17, 0xa4, 0x9b, 0xb9, 0xe2, ++ 0x40, 0x32, 0x36, 0x76, 0xc4, 0xc1, 0x5a, 0xc6, 0xbf, 0xe4, 0x04, 0xc0, 0xea, ++ 0x16, 0xd3, 0xac, 0xc3, 0x68, 0xef, 0x62, 0xac, 0xdd, 0x54, 0x6c, 0x50, 0x30, ++ 0x58, 0xa6, 0xeb, 0x7c, 0xfe, 0x94, 0xa7, 0x4e, 0x8e, 0xf4, 0xec, 0x7c, 0x86, ++ 0x73, 0x57, 0xc2, 0x52, 0x21, 0x73, 0x34, 0x5a, 0xf3, 0xa3, 0x8a, 0x56, 0xc8, ++ 0x04, 0xda, 0x07, 0x09, 0xed, 0xf8, 0x8b, 0xe3, 0xce, 0xf4, 0x7e, 0x8e, 0xae, ++ 0xf0, 0xf6, 0x0b, 0x8a, 0x08, 0xfb, 0x3f, 0xc9, 0x1d, 0x72, 0x7f, 0x53, 0xb8, ++ 0xeb, 0xbe, 0x63, 0xe0, 0xe3, 0x3d, 0x31, 0x65, 0xb0, 0x81, 0xe5, 0xf2, 0xac, ++ 0xcd, 0x16, 0xa4, 0x9f, 0x3d, 0xa8, 0xb1, 0x9b, 0xc2, 0x42, 0xd0, 0x90, 0x84, ++ 0x5f, 0x54, 0x1d, 0xff, 0x89, 0xea, 0xba, 0x1d, 0x47, 0x90, 0x6f, 0xb0, 0x73, ++ 0x4e, 0x41, 0x9f, 0x40, 0x9f, 0x5f, 0xe5, 0xa1, 0x2a, 0xb2, 0x11, 0x91, 0x73, ++ 0x8a, 0x21, 0x28, 0xf0, 0xce, 0xde, 0x73, 0x39, 0x5f, 0x3e, 0xab, 0x5c, 0x60, ++ 0xec, 0xdf, 0x03, 0x10, 0xa8, 0xd3, 0x09, 0xe9, 0xf4, 0xf6, 0x96, 0x85, 0xb6, ++ 0x7f, 0x51, 0x88, 0x66, 0x47, 0x19, 0x8d, 0xa2, 0xb0, 0x12, 0x3d, 0x81, 0x2a, ++ 0x68, 0x05, 0x77, 0xbb, 0x91, 0x4c, 0x62, 0x7b, 0xb6, 0xc1, 0x07, 0xc7, 0xba, ++ 0x7a, 0x87, 0x34, 0x03, 0x0e, 0x4b, 0x62, 0x7a, 0x99, 0xe9, 0xca, 0xfc, 0xce, ++ 0x4a, 0x37, 0xc9, 0x2d, 0xa4, 0x57, 0x7c, 0x1c, 0xfe, 0x3d, 0xdc, 0xb8, 0x0f, ++ 0x5a, 0xfa, 0xd6, 0xc4, 0xb3, 0x02, 0x85, 0x02, 0x3a, 0xea, 0xb3, 0xd9, 0x6e, ++ 0xe4, 0x69, 0x21, 0x37, 0xde, 0x81, 0xd1, 0xf6, 0x75, 0x19, 0x05, 0x67, 0xd3, ++ 0x93, 0x57, 0x5e, 0x29, 0x1b, 0x39, 0xc8, 0xee, 0x2d, 0xe1, 0xcd, 0xe4, 0x45, ++ 0x73, 0x5b, 0xd0, 0xd2, 0xce, 0x7a, 0xab, 0x16, 0x19, 0x82, 0x46, 0x58, 0xd0, ++ 0x5e, 0x9d, 0x81, 0xb3, 0x67, 0xaf, 0x6c, 0x35, 0xf2, 0xbc, 0xe5, 0x3f, 0x24, ++ 0xe2, 0x35, 0xa2, 0x0a, 0x75, 0x06, 0xf6, 0x18, 0x56, 0x99, 0xd4, 0x78, 0x2c, ++ 0xd1, 0x05, 0x1b, 0xeb, 0xd0, 0x88, 0x01, 0x9d, 0xaa, 0x10, 0xf1, 0x05, 0xdf, ++ 0xba, 0x7e, 0x2c, 0x63, 0xb7, 0x06, 0x9b, 0x23, 0x21, 0xc4, 0xf9, 0x78, 0x6c, ++ 0xe2, 0x58, 0x17, 0x06, 0x36, 0x2b, 0x91, 0x12, 0x03, 0xcc, 0xa4, 0xd9, 0xf2, ++ 0x2d, 0xba, 0xf9, 0x94, 0x9d, 0x40, 0xed, 0x18, 0x45, 0xf1, 0xce, 0x8a, 0x5c, ++ 0x6b, 0x3e, 0xab, 0x03, 0xd3, 0x70, 0x18, 0x2a, 0x0a, 0x6a, 0xe0, 0x5f, 0x47, ++ 0xd1, 0xd5, 0x63, 0x0a, 0x32, 0xf2, 0xaf, 0xd7, 0x36, 0x1f, 0x2a, 0x70, 0x5a, ++ 0xe5, 0x42, 0x59, 0x08, 0x71, 0x4b, 0x57, 0xba, 0x7e, 0x83, 0x81, 0xf0, 0x21, ++ 0x3c, 0xf4, 0x1c, 0xc1, 0xc5, 0xb9, 0x90, 0x93, 0x0e, 0x88, 0x45, 0x93, 0x86, ++ 0xe9, 0xb1, 0x20, 0x99, 0xbe, 0x98, 0xcb, 0xc5, 0x95, 0xa4, 0x5d, 0x62, 0xd6, ++ 0xa0, 0x63, 0x08, 0x20, 0xbd, 0x75, 0x10, 0x77, 0x7d, 0x3d, 0xf3, 0x45, 0xb9, ++ 0x9f, 0x97, 0x9f, 0xcb, 0x57, 0x80, 0x6f, 0x33, 0xa9, 0x04, 0xcf, 0x77, 0xa4, ++ 0x62, 0x1c, 0x59, 0x7e ++}; ++ ++// ++// Second DB entry: "Microsoft Corporation UEFI CA 2011" ++// SHA1: 46:de:f6:3b:5c:e6:1c:f8:ba:0d:e2:e6:63:9c:10:19:d0:ed:14:f3 ++// ++// To verify the "shim" binary and PCI expansion ROMs with. ++// ++STATIC CONST UINT8 MicrosoftUefiCA[] = { ++ 0x30, 0x82, 0x06, 0x10, 0x30, 0x82, 0x03, 0xf8, 0xa0, 0x03, 0x02, 0x01, 0x02, ++ 0x02, 0x0a, 0x61, 0x08, 0xd3, 0xc4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x30, ++ 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, ++ 0x00, 0x30, 0x81, 0x91, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, ++ 0x13, 0x02, 0x55, 0x53, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x08, ++ 0x13, 0x0a, 0x57, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x74, 0x6f, 0x6e, 0x31, ++ 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x07, 0x52, 0x65, 0x64, ++ 0x6d, 0x6f, 0x6e, 0x64, 0x31, 0x1e, 0x30, 0x1c, 0x06, 0x03, 0x55, 0x04, 0x0a, ++ 0x13, 0x15, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x20, 0x43, ++ 0x6f, 0x72, 0x70, 0x6f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x31, 0x3b, 0x30, ++ 0x39, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x32, 0x4d, 0x69, 0x63, 0x72, 0x6f, ++ 0x73, 0x6f, 0x66, 0x74, 0x20, 0x43, 0x6f, 0x72, 0x70, 0x6f, 0x72, 0x61, 0x74, ++ 0x69, 0x6f, 0x6e, 0x20, 0x54, 0x68, 0x69, 0x72, 0x64, 0x20, 0x50, 0x61, 0x72, ++ 0x74, 0x79, 0x20, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x70, 0x6c, 0x61, 0x63, ++ 0x65, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x31, 0x30, ++ 0x36, 0x32, 0x37, 0x32, 0x31, 0x32, 0x32, 0x34, 0x35, 0x5a, 0x17, 0x0d, 0x32, ++ 0x36, 0x30, 0x36, 0x32, 0x37, 0x32, 0x31, 0x33, 0x32, 0x34, 0x35, 0x5a, 0x30, ++ 0x81, 0x81, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, ++ 0x55, 0x53, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x0a, ++ 0x57, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x74, 0x6f, 0x6e, 0x31, 0x10, 0x30, ++ 0x0e, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x07, 0x52, 0x65, 0x64, 0x6d, 0x6f, ++ 0x6e, 0x64, 0x31, 0x1e, 0x30, 0x1c, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x15, ++ 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x20, 0x43, 0x6f, 0x72, ++ 0x70, 0x6f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x31, 0x2b, 0x30, 0x29, 0x06, ++ 0x03, 0x55, 0x04, 0x03, 0x13, 0x22, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, ++ 0x66, 0x74, 0x20, 0x43, 0x6f, 0x72, 0x70, 0x6f, 0x72, 0x61, 0x74, 0x69, 0x6f, ++ 0x6e, 0x20, 0x55, 0x45, 0x46, 0x49, 0x20, 0x43, 0x41, 0x20, 0x32, 0x30, 0x31, ++ 0x31, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, ++ 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, ++ 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xa5, 0x08, 0x6c, 0x4c, 0xc7, ++ 0x45, 0x09, 0x6a, 0x4b, 0x0c, 0xa4, 0xc0, 0x87, 0x7f, 0x06, 0x75, 0x0c, 0x43, ++ 0x01, 0x54, 0x64, 0xe0, 0x16, 0x7f, 0x07, 0xed, 0x92, 0x7d, 0x0b, 0xb2, 0x73, ++ 0xbf, 0x0c, 0x0a, 0xc6, 0x4a, 0x45, 0x61, 0xa0, 0xc5, 0x16, 0x2d, 0x96, 0xd3, ++ 0xf5, 0x2b, 0xa0, 0xfb, 0x4d, 0x49, 0x9b, 0x41, 0x80, 0x90, 0x3c, 0xb9, 0x54, ++ 0xfd, 0xe6, 0xbc, 0xd1, 0x9d, 0xc4, 0xa4, 0x18, 0x8a, 0x7f, 0x41, 0x8a, 0x5c, ++ 0x59, 0x83, 0x68, 0x32, 0xbb, 0x8c, 0x47, 0xc9, 0xee, 0x71, 0xbc, 0x21, 0x4f, ++ 0x9a, 0x8a, 0x7c, 0xff, 0x44, 0x3f, 0x8d, 0x8f, 0x32, 0xb2, 0x26, 0x48, 0xae, ++ 0x75, 0xb5, 0xee, 0xc9, 0x4c, 0x1e, 0x4a, 0x19, 0x7e, 0xe4, 0x82, 0x9a, 0x1d, ++ 0x78, 0x77, 0x4d, 0x0c, 0xb0, 0xbd, 0xf6, 0x0f, 0xd3, 0x16, 0xd3, 0xbc, 0xfa, ++ 0x2b, 0xa5, 0x51, 0x38, 0x5d, 0xf5, 0xfb, 0xba, 0xdb, 0x78, 0x02, 0xdb, 0xff, ++ 0xec, 0x0a, 0x1b, 0x96, 0xd5, 0x83, 0xb8, 0x19, 0x13, 0xe9, 0xb6, 0xc0, 0x7b, ++ 0x40, 0x7b, 0xe1, 0x1f, 0x28, 0x27, 0xc9, 0xfa, 0xef, 0x56, 0x5e, 0x1c, 0xe6, ++ 0x7e, 0x94, 0x7e, 0xc0, 0xf0, 0x44, 0xb2, 0x79, 0x39, 0xe5, 0xda, 0xb2, 0x62, ++ 0x8b, 0x4d, 0xbf, 0x38, 0x70, 0xe2, 0x68, 0x24, 0x14, 0xc9, 0x33, 0xa4, 0x08, ++ 0x37, 0xd5, 0x58, 0x69, 0x5e, 0xd3, 0x7c, 0xed, 0xc1, 0x04, 0x53, 0x08, 0xe7, ++ 0x4e, 0xb0, 0x2a, 0x87, 0x63, 0x08, 0x61, 0x6f, 0x63, 0x15, 0x59, 0xea, 0xb2, ++ 0x2b, 0x79, 0xd7, 0x0c, 0x61, 0x67, 0x8a, 0x5b, 0xfd, 0x5e, 0xad, 0x87, 0x7f, ++ 0xba, 0x86, 0x67, 0x4f, 0x71, 0x58, 0x12, 0x22, 0x04, 0x22, 0x22, 0xce, 0x8b, ++ 0xef, 0x54, 0x71, 0x00, 0xce, 0x50, 0x35, 0x58, 0x76, 0x95, 0x08, 0xee, 0x6a, ++ 0xb1, 0xa2, 0x01, 0xd5, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x82, 0x01, 0x76, ++ 0x30, 0x82, 0x01, 0x72, 0x30, 0x12, 0x06, 0x09, 0x2b, 0x06, 0x01, 0x04, 0x01, ++ 0x82, 0x37, 0x15, 0x01, 0x04, 0x05, 0x02, 0x03, 0x01, 0x00, 0x01, 0x30, 0x23, ++ 0x06, 0x09, 0x2b, 0x06, 0x01, 0x04, 0x01, 0x82, 0x37, 0x15, 0x02, 0x04, 0x16, ++ 0x04, 0x14, 0xf8, 0xc1, 0x6b, 0xb7, 0x7f, 0x77, 0x53, 0x4a, 0xf3, 0x25, 0x37, ++ 0x1d, 0x4e, 0xa1, 0x26, 0x7b, 0x0f, 0x20, 0x70, 0x80, 0x30, 0x1d, 0x06, 0x03, ++ 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x13, 0xad, 0xbf, 0x43, 0x09, 0xbd, ++ 0x82, 0x70, 0x9c, 0x8c, 0xd5, 0x4f, 0x31, 0x6e, 0xd5, 0x22, 0x98, 0x8a, 0x1b, ++ 0xd4, 0x30, 0x19, 0x06, 0x09, 0x2b, 0x06, 0x01, 0x04, 0x01, 0x82, 0x37, 0x14, ++ 0x02, 0x04, 0x0c, 0x1e, 0x0a, 0x00, 0x53, 0x00, 0x75, 0x00, 0x62, 0x00, 0x43, ++ 0x00, 0x41, 0x30, 0x0b, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x04, 0x04, 0x03, 0x02, ++ 0x01, 0x86, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, ++ 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, ++ 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0x45, 0x66, 0x52, 0x43, 0xe1, 0x7e, 0x58, ++ 0x11, 0xbf, 0xd6, 0x4e, 0x9e, 0x23, 0x55, 0x08, 0x3b, 0x3a, 0x22, 0x6a, 0xa8, ++ 0x30, 0x5c, 0x06, 0x03, 0x55, 0x1d, 0x1f, 0x04, 0x55, 0x30, 0x53, 0x30, 0x51, ++ 0xa0, 0x4f, 0xa0, 0x4d, 0x86, 0x4b, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, ++ 0x63, 0x72, 0x6c, 0x2e, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, ++ 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x6b, 0x69, 0x2f, 0x63, 0x72, 0x6c, 0x2f, ++ 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x2f, 0x4d, 0x69, 0x63, 0x43, ++ 0x6f, 0x72, 0x54, 0x68, 0x69, 0x50, 0x61, 0x72, 0x4d, 0x61, 0x72, 0x52, 0x6f, ++ 0x6f, 0x5f, 0x32, 0x30, 0x31, 0x30, 0x2d, 0x31, 0x30, 0x2d, 0x30, 0x35, 0x2e, ++ 0x63, 0x72, 0x6c, 0x30, 0x60, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, ++ 0x01, 0x01, 0x04, 0x54, 0x30, 0x52, 0x30, 0x50, 0x06, 0x08, 0x2b, 0x06, 0x01, ++ 0x05, 0x05, 0x07, 0x30, 0x02, 0x86, 0x44, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, ++ 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, ++ 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x6b, 0x69, 0x2f, 0x63, 0x65, 0x72, ++ 0x74, 0x73, 0x2f, 0x4d, 0x69, 0x63, 0x43, 0x6f, 0x72, 0x54, 0x68, 0x69, 0x50, ++ 0x61, 0x72, 0x4d, 0x61, 0x72, 0x52, 0x6f, 0x6f, 0x5f, 0x32, 0x30, 0x31, 0x30, ++ 0x2d, 0x31, 0x30, 0x2d, 0x30, 0x35, 0x2e, 0x63, 0x72, 0x74, 0x30, 0x0d, 0x06, ++ 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, ++ 0x82, 0x02, 0x01, 0x00, 0x35, 0x08, 0x42, 0xff, 0x30, 0xcc, 0xce, 0xf7, 0x76, ++ 0x0c, 0xad, 0x10, 0x68, 0x58, 0x35, 0x29, 0x46, 0x32, 0x76, 0x27, 0x7c, 0xef, ++ 0x12, 0x41, 0x27, 0x42, 0x1b, 0x4a, 0xaa, 0x6d, 0x81, 0x38, 0x48, 0x59, 0x13, ++ 0x55, 0xf3, 0xe9, 0x58, 0x34, 0xa6, 0x16, 0x0b, 0x82, 0xaa, 0x5d, 0xad, 0x82, ++ 0xda, 0x80, 0x83, 0x41, 0x06, 0x8f, 0xb4, 0x1d, 0xf2, 0x03, 0xb9, 0xf3, 0x1a, ++ 0x5d, 0x1b, 0xf1, 0x50, 0x90, 0xf9, 0xb3, 0x55, 0x84, 0x42, 0x28, 0x1c, 0x20, ++ 0xbd, 0xb2, 0xae, 0x51, 0x14, 0xc5, 0xc0, 0xac, 0x97, 0x95, 0x21, 0x1c, 0x90, ++ 0xdb, 0x0f, 0xfc, 0x77, 0x9e, 0x95, 0x73, 0x91, 0x88, 0xca, 0xbd, 0xbd, 0x52, ++ 0xb9, 0x05, 0x50, 0x0d, 0xdf, 0x57, 0x9e, 0xa0, 0x61, 0xed, 0x0d, 0xe5, 0x6d, ++ 0x25, 0xd9, 0x40, 0x0f, 0x17, 0x40, 0xc8, 0xce, 0xa3, 0x4a, 0xc2, 0x4d, 0xaf, ++ 0x9a, 0x12, 0x1d, 0x08, 0x54, 0x8f, 0xbd, 0xc7, 0xbc, 0xb9, 0x2b, 0x3d, 0x49, ++ 0x2b, 0x1f, 0x32, 0xfc, 0x6a, 0x21, 0x69, 0x4f, 0x9b, 0xc8, 0x7e, 0x42, 0x34, ++ 0xfc, 0x36, 0x06, 0x17, 0x8b, 0x8f, 0x20, 0x40, 0xc0, 0xb3, 0x9a, 0x25, 0x75, ++ 0x27, 0xcd, 0xc9, 0x03, 0xa3, 0xf6, 0x5d, 0xd1, 0xe7, 0x36, 0x54, 0x7a, 0xb9, ++ 0x50, 0xb5, 0xd3, 0x12, 0xd1, 0x07, 0xbf, 0xbb, 0x74, 0xdf, 0xdc, 0x1e, 0x8f, ++ 0x80, 0xd5, 0xed, 0x18, 0xf4, 0x2f, 0x14, 0x16, 0x6b, 0x2f, 0xde, 0x66, 0x8c, ++ 0xb0, 0x23, 0xe5, 0xc7, 0x84, 0xd8, 0xed, 0xea, 0xc1, 0x33, 0x82, 0xad, 0x56, ++ 0x4b, 0x18, 0x2d, 0xf1, 0x68, 0x95, 0x07, 0xcd, 0xcf, 0xf0, 0x72, 0xf0, 0xae, ++ 0xbb, 0xdd, 0x86, 0x85, 0x98, 0x2c, 0x21, 0x4c, 0x33, 0x2b, 0xf0, 0x0f, 0x4a, ++ 0xf0, 0x68, 0x87, 0xb5, 0x92, 0x55, 0x32, 0x75, 0xa1, 0x6a, 0x82, 0x6a, 0x3c, ++ 0xa3, 0x25, 0x11, 0xa4, 0xed, 0xad, 0xd7, 0x04, 0xae, 0xcb, 0xd8, 0x40, 0x59, ++ 0xa0, 0x84, 0xd1, 0x95, 0x4c, 0x62, 0x91, 0x22, 0x1a, 0x74, 0x1d, 0x8c, 0x3d, ++ 0x47, 0x0e, 0x44, 0xa6, 0xe4, 0xb0, 0x9b, 0x34, 0x35, 0xb1, 0xfa, 0xb6, 0x53, ++ 0xa8, 0x2c, 0x81, 0xec, 0xa4, 0x05, 0x71, 0xc8, 0x9d, 0xb8, 0xba, 0xe8, 0x1b, ++ 0x44, 0x66, 0xe4, 0x47, 0x54, 0x0e, 0x8e, 0x56, 0x7f, 0xb3, 0x9f, 0x16, 0x98, ++ 0xb2, 0x86, 0xd0, 0x68, 0x3e, 0x90, 0x23, 0xb5, 0x2f, 0x5e, 0x8f, 0x50, 0x85, ++ 0x8d, 0xc6, 0x8d, 0x82, 0x5f, 0x41, 0xa1, 0xf4, 0x2e, 0x0d, 0xe0, 0x99, 0xd2, ++ 0x6c, 0x75, 0xe4, 0xb6, 0x69, 0xb5, 0x21, 0x86, 0xfa, 0x07, 0xd1, 0xf6, 0xe2, ++ 0x4d, 0xd1, 0xda, 0xad, 0x2c, 0x77, 0x53, 0x1e, 0x25, 0x32, 0x37, 0xc7, 0x6c, ++ 0x52, 0x72, 0x95, 0x86, 0xb0, 0xf1, 0x35, 0x61, 0x6a, 0x19, 0xf5, 0xb2, 0x3b, ++ 0x81, 0x50, 0x56, 0xa6, 0x32, 0x2d, 0xfe, 0xa2, 0x89, 0xf9, 0x42, 0x86, 0x27, ++ 0x18, 0x55, 0xa1, 0x82, 0xca, 0x5a, 0x9b, 0xf8, 0x30, 0x98, 0x54, 0x14, 0xa6, ++ 0x47, 0x96, 0x25, 0x2f, 0xc8, 0x26, 0xe4, 0x41, 0x94, 0x1a, 0x5c, 0x02, 0x3f, ++ 0xe5, 0x96, 0xe3, 0x85, 0x5b, 0x3c, 0x3e, 0x3f, 0xbb, 0x47, 0x16, 0x72, 0x55, ++ 0xe2, 0x25, 0x22, 0xb1, 0xd9, 0x7b, 0xe7, 0x03, 0x06, 0x2a, 0xa3, 0xf7, 0x1e, ++ 0x90, 0x46, 0xc3, 0x00, 0x0d, 0xd6, 0x19, 0x89, 0xe3, 0x0e, 0x35, 0x27, 0x62, ++ 0x03, 0x71, 0x15, 0xa6, 0xef, 0xd0, 0x27, 0xa0, 0xa0, 0x59, 0x37, 0x60, 0xf8, ++ 0x38, 0x94, 0xb8, 0xe0, 0x78, 0x70, 0xf8, 0xba, 0x4c, 0x86, 0x87, 0x94, 0xf6, ++ 0xe0, 0xae, 0x02, 0x45, 0xee, 0x65, 0xc2, 0xb6, 0xa3, 0x7e, 0x69, 0x16, 0x75, ++ 0x07, 0x92, 0x9b, 0xf5, 0xa6, 0xbc, 0x59, 0x83, 0x58 ++}; ++ ++// ++// The most important thing about the variable payload is that it is a list of ++// lists, where the element size of any given *inner* list is constant. ++// ++// Since X509 certificates vary in size, each of our *inner* lists will contain ++// one element only (one X.509 certificate). This is explicitly mentioned in ++// the UEFI specification, in "28.4.1 Signature Database", in a Note. ++// ++// The list structure looks as follows: ++// ++// struct EFI_VARIABLE_AUTHENTICATION_2 { | ++// struct EFI_TIME { | ++// UINT16 Year; | ++// UINT8 Month; | ++// UINT8 Day; | ++// UINT8 Hour; | ++// UINT8 Minute; | ++// UINT8 Second; | ++// UINT8 Pad1; | ++// UINT32 Nanosecond; | ++// INT16 TimeZone; | ++// UINT8 Daylight; | ++// UINT8 Pad2; | ++// } TimeStamp; | ++// | ++// struct WIN_CERTIFICATE_UEFI_GUID { | | ++// struct WIN_CERTIFICATE { | | ++// UINT32 dwLength; ----------------------------------------+ | ++// UINT16 wRevision; | | ++// UINT16 wCertificateType; | | ++// } Hdr; | +- DataSize ++// | | ++// EFI_GUID CertType; | | ++// UINT8 CertData[1] = { <--- "struct hack" | | ++// struct EFI_SIGNATURE_LIST { | | | ++// EFI_GUID SignatureType; | | | ++// UINT32 SignatureListSize; -------------------------+ | | ++// UINT32 SignatureHeaderSize; | | | ++// UINT32 SignatureSize; ---------------------------+ | | | ++// UINT8 SignatureHeader[SignatureHeaderSize]; | | | | ++// v | | | ++// struct EFI_SIGNATURE_DATA { | | | | ++// EFI_GUID SignatureOwner; | | | | ++// UINT8 SignatureData[1] = { <--- "struct hack" | | | | ++// X.509 payload | | | | ++// } | | | | ++// } Signatures[]; | | | ++// } SigLists[]; | | ++// }; | | ++// } AuthInfo; | | ++// }; | ++// ++// Given that the "struct hack" invokes undefined behavior (which is why C99 ++// introduced the flexible array member), and because subtracting those pesky ++// sizes of 1 is annoying, and because the format is fully specified in the ++// UEFI specification, we'll introduce two matching convenience structures that ++// are customized for our X.509 purposes. ++// ++#pragma pack(1) ++typedef struct { ++ EFI_TIME TimeStamp; ++ ++ // ++ // dwLength covers data below ++ // ++ UINT32 dwLength; ++ UINT16 wRevision; ++ UINT16 wCertificateType; ++ EFI_GUID CertType; ++} SINGLE_HEADER; ++ ++typedef struct { ++ // ++ // SignatureListSize covers data below ++ // ++ EFI_GUID SignatureType; ++ UINT32 SignatureListSize; ++ UINT32 SignatureHeaderSize; // constant 0 ++ UINT32 SignatureSize; ++ ++ // ++ // SignatureSize covers data below ++ // ++ EFI_GUID SignatureOwner; ++ ++ // ++ // X.509 certificate follows ++ // ++} REPEATING_HEADER; ++#pragma pack() ++ ++/** ++ Enroll a set of DER-formatted X.509 certificates in a global variable, ++ overwriting it. ++ ++ The variable will be rewritten with NV+BS+RT+AT attributes. ++ ++ @param[in] VariableName The name of the variable to overwrite. ++ ++ @param[in] VendorGuid The namespace (ie. vendor GUID) of the variable to ++ overwrite. ++ ++ @param[in] ... A list of ++ ++ IN CONST UINT8 *Cert, ++ IN UINTN CertSize, ++ IN CONST EFI_GUID *OwnerGuid ++ ++ triplets. If the first component of a triplet is ++ NULL, then the other two components are not ++ accessed, and processing is terminated. The list of ++ X.509 certificates is enrolled in the variable ++ specified, overwriting it. The OwnerGuid component ++ identifies the agent installing the certificate. ++ ++ @retval EFI_INVALID_PARAMETER The triplet list is empty (ie. the first Cert ++ value is NULL), or one of the CertSize values ++ is 0, or one of the CertSize values would ++ overflow the accumulated UINT32 data size. ++ ++ @retval EFI_OUT_OF_RESOURCES Out of memory while formatting variable ++ payload. ++ ++ @retval EFI_SUCCESS Enrollment successful; the variable has been ++ overwritten (or created). ++ ++ @return Error codes from gRT->GetTime() and ++ gRT->SetVariable(). ++**/ ++STATIC ++EFI_STATUS ++EFIAPI ++EnrollListOfX509Certs ( ++ IN CHAR16 *VariableName, ++ IN EFI_GUID *VendorGuid, ++ ... ++ ) ++{ ++ UINTN DataSize; ++ SINGLE_HEADER *SingleHeader; ++ REPEATING_HEADER *RepeatingHeader; ++ VA_LIST Marker; ++ CONST UINT8 *Cert; ++ EFI_STATUS Status; ++ UINT8 *Data; ++ UINT8 *Position; ++ ++ // ++ // compute total size first, for UINT32 range check, and allocation ++ // ++ DataSize = sizeof *SingleHeader; ++ VA_START (Marker, VendorGuid); ++ for (Cert = VA_ARG (Marker, CONST UINT8 *); ++ Cert != NULL; ++ Cert = VA_ARG (Marker, CONST UINT8 *)) { ++ UINTN CertSize; ++ CONST EFI_GUID *OwnerGuid; ++ ++ CertSize = VA_ARG (Marker, UINTN); ++ OwnerGuid = VA_ARG (Marker, CONST EFI_GUID *); ++ ++ if (CertSize == 0 || ++ CertSize > MAX_UINT32 - sizeof *RepeatingHeader || ++ DataSize > MAX_UINT32 - sizeof *RepeatingHeader - CertSize) { ++ Status = EFI_INVALID_PARAMETER; ++ break; ++ } ++ DataSize += sizeof *RepeatingHeader + CertSize; ++ } ++ VA_END (Marker); ++ ++ if (DataSize == sizeof *SingleHeader) { ++ Status = EFI_INVALID_PARAMETER; ++ } ++ if (EFI_ERROR (Status)) { ++ goto Out; ++ } ++ ++ Data = AllocatePool (DataSize); ++ if (Data == NULL) { ++ Status = EFI_OUT_OF_RESOURCES; ++ goto Out; ++ } ++ ++ Position = Data; ++ ++ SingleHeader = (SINGLE_HEADER *)Position; ++ Status = gRT->GetTime (&SingleHeader->TimeStamp, NULL); ++ if (EFI_ERROR (Status)) { ++ goto FreeData; ++ } ++ SingleHeader->TimeStamp.Pad1 = 0; ++ SingleHeader->TimeStamp.Nanosecond = 0; ++ SingleHeader->TimeStamp.TimeZone = 0; ++ SingleHeader->TimeStamp.Daylight = 0; ++ SingleHeader->TimeStamp.Pad2 = 0; ++#if 0 ++ SingleHeader->dwLength = DataSize - sizeof SingleHeader->TimeStamp; ++#else ++ // ++ // This looks like a bug in edk2. According to the UEFI specification, ++ // dwLength is "The length of the entire certificate, including the length of ++ // the header, in bytes". That shouldn't stop right after CertType -- it ++ // should include everything below it. ++ // ++ SingleHeader->dwLength = sizeof *SingleHeader ++ - sizeof SingleHeader->TimeStamp; ++#endif ++ SingleHeader->wRevision = 0x0200; ++ SingleHeader->wCertificateType = WIN_CERT_TYPE_EFI_GUID; ++ CopyGuid (&SingleHeader->CertType, &gEfiCertPkcs7Guid); ++ Position += sizeof *SingleHeader; ++ ++ VA_START (Marker, VendorGuid); ++ for (Cert = VA_ARG (Marker, CONST UINT8 *); ++ Cert != NULL; ++ Cert = VA_ARG (Marker, CONST UINT8 *)) { ++ UINTN CertSize; ++ CONST EFI_GUID *OwnerGuid; ++ ++ CertSize = VA_ARG (Marker, UINTN); ++ OwnerGuid = VA_ARG (Marker, CONST EFI_GUID *); ++ ++ RepeatingHeader = (REPEATING_HEADER *)Position; ++ CopyGuid (&RepeatingHeader->SignatureType, &gEfiCertX509Guid); ++ RepeatingHeader->SignatureListSize = sizeof *RepeatingHeader + CertSize; ++ RepeatingHeader->SignatureHeaderSize = 0; ++ RepeatingHeader->SignatureSize = ++ sizeof RepeatingHeader->SignatureOwner + CertSize; ++ CopyGuid (&RepeatingHeader->SignatureOwner, OwnerGuid); ++ Position += sizeof *RepeatingHeader; ++ ++ CopyMem (Position, Cert, CertSize); ++ Position += CertSize; ++ } ++ VA_END (Marker); ++ ++ ASSERT (Data + DataSize == Position); ++ ++ Status = gRT->SetVariable (VariableName, VendorGuid, ++ (EFI_VARIABLE_NON_VOLATILE | ++ EFI_VARIABLE_BOOTSERVICE_ACCESS | ++ EFI_VARIABLE_RUNTIME_ACCESS | ++ EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS), ++ DataSize, Data); ++ ++FreeData: ++ FreePool (Data); ++ ++Out: ++ if (EFI_ERROR (Status)) { ++ AsciiPrint ("error: %a(\"%s\", %g): %r\n", __FUNCTION__, VariableName, ++ VendorGuid, Status); ++ } ++ return Status; ++} ++ ++ ++STATIC ++EFI_STATUS ++EFIAPI ++GetExact ( ++ IN CHAR16 *VariableName, ++ IN EFI_GUID *VendorGuid, ++ OUT VOID *Data, ++ IN UINTN DataSize, ++ IN BOOLEAN AllowMissing ++ ) ++{ ++ UINTN Size; ++ EFI_STATUS Status; ++ ++ Size = DataSize; ++ Status = gRT->GetVariable (VariableName, VendorGuid, NULL, &Size, Data); ++ if (EFI_ERROR (Status)) { ++ if (Status == EFI_NOT_FOUND && AllowMissing) { ++ ZeroMem (Data, DataSize); ++ return EFI_SUCCESS; ++ } ++ ++ AsciiPrint ("error: GetVariable(\"%s\", %g): %r\n", VariableName, ++ VendorGuid, Status); ++ return Status; ++ } ++ ++ if (Size != DataSize) { ++ AsciiPrint ("error: GetVariable(\"%s\", %g): expected size 0x%Lx, " ++ "got 0x%Lx\n", VariableName, VendorGuid, (UINT64)DataSize, (UINT64)Size); ++ return EFI_PROTOCOL_ERROR; ++ } ++ ++ return EFI_SUCCESS; ++} ++ ++typedef struct { ++ UINT8 SetupMode; ++ UINT8 SecureBoot; ++ UINT8 SecureBootEnable; ++ UINT8 CustomMode; ++ UINT8 VendorKeys; ++} SETTINGS; ++ ++STATIC ++EFI_STATUS ++EFIAPI ++GetSettings ( ++ OUT SETTINGS *Settings ++ ) ++{ ++ EFI_STATUS Status; ++ ++ Status = GetExact (EFI_SETUP_MODE_NAME, &gEfiGlobalVariableGuid, ++ &Settings->SetupMode, sizeof Settings->SetupMode, FALSE); ++ if (EFI_ERROR (Status)) { ++ return Status; ++ } ++ ++ Status = GetExact (EFI_SECURE_BOOT_MODE_NAME, &gEfiGlobalVariableGuid, ++ &Settings->SecureBoot, sizeof Settings->SecureBoot, FALSE); ++ if (EFI_ERROR (Status)) { ++ return Status; ++ } ++ ++ Status = GetExact (EFI_SECURE_BOOT_ENABLE_NAME, ++ &gEfiSecureBootEnableDisableGuid, &Settings->SecureBootEnable, ++ sizeof Settings->SecureBootEnable, TRUE); ++ if (EFI_ERROR (Status)) { ++ return Status; ++ } ++ ++ Status = GetExact (EFI_CUSTOM_MODE_NAME, &gEfiCustomModeEnableGuid, ++ &Settings->CustomMode, sizeof Settings->CustomMode, FALSE); ++ if (EFI_ERROR (Status)) { ++ return Status; ++ } ++ ++ Status = GetExact (EFI_VENDOR_KEYS_VARIABLE_NAME, &gEfiGlobalVariableGuid, ++ &Settings->VendorKeys, sizeof Settings->VendorKeys, FALSE); ++ return Status; ++} ++ ++STATIC ++VOID ++EFIAPI ++PrintSettings ( ++ IN CONST SETTINGS *Settings ++ ) ++{ ++ AsciiPrint ("info: SetupMode=%d SecureBoot=%d SecureBootEnable=%d " ++ "CustomMode=%d VendorKeys=%d\n", Settings->SetupMode, Settings->SecureBoot, ++ Settings->SecureBootEnable, Settings->CustomMode, Settings->VendorKeys); ++} ++ ++ ++INTN ++EFIAPI ++ShellAppMain ( ++ IN UINTN Argc, ++ IN CHAR16 **Argv ++ ) ++{ ++ EFI_STATUS Status; ++ SETTINGS Settings; ++ ++ Status = GetSettings (&Settings); ++ if (EFI_ERROR (Status)) { ++ return 1; ++ } ++ PrintSettings (&Settings); ++ ++ if (Settings.SetupMode != 1) { ++ AsciiPrint ("error: already in User Mode\n"); ++ return 1; ++ } ++ ++ if (Settings.CustomMode != CUSTOM_SECURE_BOOT_MODE) { ++ Settings.CustomMode = CUSTOM_SECURE_BOOT_MODE; ++ Status = gRT->SetVariable (EFI_CUSTOM_MODE_NAME, &gEfiCustomModeEnableGuid, ++ (EFI_VARIABLE_NON_VOLATILE | ++ EFI_VARIABLE_BOOTSERVICE_ACCESS), ++ sizeof Settings.CustomMode, &Settings.CustomMode); ++ if (EFI_ERROR (Status)) { ++ AsciiPrint ("error: SetVariable(\"%s\", %g): %r\n", EFI_CUSTOM_MODE_NAME, ++ &gEfiCustomModeEnableGuid, Status); ++ return 1; ++ } ++ } ++ ++ Status = EnrollListOfX509Certs ( ++ EFI_IMAGE_SECURITY_DATABASE, ++ &gEfiImageSecurityDatabaseGuid, ++ MicrosoftPCA, sizeof MicrosoftPCA, &gEfiCallerIdGuid, ++ MicrosoftUefiCA, sizeof MicrosoftUefiCA, &gEfiCallerIdGuid, ++ NULL); ++ if (EFI_ERROR (Status)) { ++ return 1; ++ } ++ ++ Status = EnrollListOfX509Certs ( ++ EFI_KEY_EXCHANGE_KEY_NAME, ++ &gEfiGlobalVariableGuid, ++ ExampleCert, sizeof ExampleCert, &gEfiCallerIdGuid, ++ MicrosoftKEK, sizeof MicrosoftKEK, &gEfiCallerIdGuid, ++ NULL); ++ if (EFI_ERROR (Status)) { ++ return 1; ++ } ++ ++ Status = EnrollListOfX509Certs ( ++ EFI_PLATFORM_KEY_NAME, ++ &gEfiGlobalVariableGuid, ++ ExampleCert, sizeof ExampleCert, &gEfiGlobalVariableGuid, ++ NULL); ++ if (EFI_ERROR (Status)) { ++ return 1; ++ } ++ ++ Settings.CustomMode = STANDARD_SECURE_BOOT_MODE; ++ Status = gRT->SetVariable (EFI_CUSTOM_MODE_NAME, &gEfiCustomModeEnableGuid, ++ EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS, ++ sizeof Settings.CustomMode, &Settings.CustomMode); ++ if (EFI_ERROR (Status)) { ++ AsciiPrint ("error: SetVariable(\"%s\", %g): %r\n", EFI_CUSTOM_MODE_NAME, ++ &gEfiCustomModeEnableGuid, Status); ++ return 1; ++ } ++ ++ Status = GetSettings (&Settings); ++ if (EFI_ERROR (Status)) { ++ return 1; ++ } ++ PrintSettings (&Settings); ++ ++ if (Settings.SetupMode != 0 || Settings.SecureBoot != 1 || ++ Settings.SecureBootEnable != 1 || Settings.CustomMode != 0 || ++ Settings.VendorKeys != 0) { ++ AsciiPrint ("error: unexpected\n"); ++ return 1; ++ } ++ ++ AsciiPrint ("info: success\n"); ++ return 0; ++} +diff --git a/OvmfPkg/EnrollDefaultKeys/EnrollDefaultKeys.inf b/OvmfPkg/EnrollDefaultKeys/EnrollDefaultKeys.inf +new file mode 100644 +index 0000000..ac919bb +--- /dev/null ++++ b/OvmfPkg/EnrollDefaultKeys/EnrollDefaultKeys.inf +@@ -0,0 +1,51 @@ ++## @file ++# Enroll default PK, KEK, DB. ++# ++# Copyright (C) 2014, Red Hat, Inc. ++# ++# This program and the accompanying materials are licensed and made available ++# under the terms and conditions of the BSD License which accompanies this ++# distribution. The full text of the license may be found at ++# http://opensource.org/licenses/bsd-license. ++# ++# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, ++# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR ++# IMPLIED. ++## ++ ++[Defines] ++ INF_VERSION = 0x00010006 ++ BASE_NAME = EnrollDefaultKeys ++ FILE_GUID = D5C1DF0B-1BAC-4EDF-BA48-08834009CA5A ++ MODULE_TYPE = UEFI_APPLICATION ++ VERSION_STRING = 0.1 ++ ENTRY_POINT = ShellCEntryLib ++ ++# ++# VALID_ARCHITECTURES = IA32 X64 ++# ++ ++[Sources] ++ EnrollDefaultKeys.c ++ ++[Packages] ++ MdePkg/MdePkg.dec ++ MdeModulePkg/MdeModulePkg.dec ++ SecurityPkg/SecurityPkg.dec ++ ShellPkg/ShellPkg.dec ++ ++[Guids] ++ gEfiCertPkcs7Guid ++ gEfiCertX509Guid ++ gEfiCustomModeEnableGuid ++ gEfiGlobalVariableGuid ++ gEfiImageSecurityDatabaseGuid ++ gEfiSecureBootEnableDisableGuid ++ ++[LibraryClasses] ++ BaseMemoryLib ++ DebugLib ++ MemoryAllocationLib ++ ShellCEntryLib ++ UefiLib ++ UefiRuntimeServicesTableLib +diff --git a/OvmfPkg/OvmfPkgIa32.dsc b/OvmfPkg/OvmfPkgIa32.dsc +index bb008f6..543029f 100644 +--- a/OvmfPkg/OvmfPkgIa32.dsc ++++ b/OvmfPkg/OvmfPkgIa32.dsc +@@ -597,6 +597,10 @@ + + !if $(SECURE_BOOT_ENABLE) == TRUE + SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootConfigDxe.inf ++ OvmfPkg/EnrollDefaultKeys/EnrollDefaultKeys.inf { ++ ++ ShellCEntryLib|ShellPkg/Library/UefiShellCEntryLib/UefiShellCEntryLib.inf ++ } + !endif + + OvmfPkg/PlatformDxe/Platform.inf +diff --git a/OvmfPkg/OvmfPkgIa32X64.dsc b/OvmfPkg/OvmfPkgIa32X64.dsc +index fed584f..8268652 100644 +--- a/OvmfPkg/OvmfPkgIa32X64.dsc ++++ b/OvmfPkg/OvmfPkgIa32X64.dsc +@@ -604,6 +604,10 @@ + + !if $(SECURE_BOOT_ENABLE) == TRUE + SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootConfigDxe.inf ++ OvmfPkg/EnrollDefaultKeys/EnrollDefaultKeys.inf { ++ ++ ShellCEntryLib|ShellPkg/Library/UefiShellCEntryLib/UefiShellCEntryLib.inf ++ } + !endif + + OvmfPkg/PlatformDxe/Platform.inf +diff --git a/OvmfPkg/OvmfPkgX64.dsc b/OvmfPkg/OvmfPkgX64.dsc +index 92af10f..d6921d0 100644 +--- a/OvmfPkg/OvmfPkgX64.dsc ++++ b/OvmfPkg/OvmfPkgX64.dsc +@@ -602,6 +602,10 @@ + + !if $(SECURE_BOOT_ENABLE) == TRUE + SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootConfigDxe.inf ++ OvmfPkg/EnrollDefaultKeys/EnrollDefaultKeys.inf { ++ ++ ShellCEntryLib|ShellPkg/Library/UefiShellCEntryLib/UefiShellCEntryLib.inf ++ } + !endif + + OvmfPkg/PlatformDxe/Platform.inf +-- +1.8.3.1 + diff --git a/recipes-openxt/xenclient/ovmf/files/0001-OvmfPkg-SmbiosPlatformDxe-install-legacy-QEMU-tables.patch b/recipes-openxt/xenclient/ovmf/files/0001-OvmfPkg-SmbiosPlatformDxe-install-legacy-QEMU-tables.patch new file mode 100644 index 0000000000..43fa070f27 --- /dev/null +++ b/recipes-openxt/xenclient/ovmf/files/0001-OvmfPkg-SmbiosPlatformDxe-install-legacy-QEMU-tables.patch @@ -0,0 +1,1084 @@ +From 0e182f2305a84fdf62ff2631de6e363a5a881287 Mon Sep 17 00:00:00 2001 +From: Laszlo Ersek +Date: Wed, 5 Jun 2013 10:14:34 +0200 +Subject: [PATCH 1/3] OvmfPkg/SmbiosPlatformDxe: install legacy QEMU tables and + save fields (X86) + +Introduce basic legacy SMBIOS machinery for the QEMU platform: +- Install SMBIOS tables that QEMU passes down in complete form via fw_cfg. +- Stash individual fields that QEMU passes down to override the boot + firmware's default SMBIOS tables. +- Add helper functions that OVMF's default SMBIOS tables will need. + +Contributed-under: TianoCore Contribution Agreement 1.0 +Signed-off-by: Laszlo Ersek +--- + OvmfPkg/SmbiosPlatformDxe/QemuLegacy.c | 694 ++++++++++++++++++++++++ + OvmfPkg/SmbiosPlatformDxe/QemuLegacy.h | 52 ++ + OvmfPkg/SmbiosPlatformDxe/QemuLegacyInternal.h | 221 ++++++++ + OvmfPkg/SmbiosPlatformDxe/SmbiosPlatformDxe.c | 17 +- + OvmfPkg/SmbiosPlatformDxe/SmbiosPlatformDxe.inf | 2 + + 5 files changed, 983 insertions(+), 3 deletions(-) + create mode 100644 OvmfPkg/SmbiosPlatformDxe/QemuLegacy.c + create mode 100644 OvmfPkg/SmbiosPlatformDxe/QemuLegacy.h + create mode 100644 OvmfPkg/SmbiosPlatformDxe/QemuLegacyInternal.h + +diff --git a/OvmfPkg/SmbiosPlatformDxe/QemuLegacy.c b/OvmfPkg/SmbiosPlatformDxe/QemuLegacy.c +new file mode 100644 +index 0000000..9c57558 +--- /dev/null ++++ b/OvmfPkg/SmbiosPlatformDxe/QemuLegacy.c +@@ -0,0 +1,694 @@ ++/** @file ++ This file fetches and installs SMBIOS tables on the QEMU hypervisor. ++ ++ Copyright (C) 2013, Red Hat, Inc. ++ ++ This program and the accompanying materials are licensed and made available ++ under the terms and conditions of the BSD License which accompanies this ++ distribution. The full text of the license may be found at ++ http://opensource.org/licenses/bsd-license.php ++ ++ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, WITHOUT ++ WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. ++**/ ++ ++#include ++ ++#include "QemuLegacy.h" ++#include "QemuLegacyInternal.h" ++ ++ ++// ++// An SMBIOS entry exported by QEMU over fw_cfg can have one of the following ++// types. ++// ++typedef enum ++{ ++ ET_FIELD, // defines one field in some SMBIOS table ++ ET_TABLE // defines an SMBIOS table instance in entirety ++} FW_CFG_SMBIOS_ENTRY_TYPE; ++ ++// ++// Header type introducing each entry in the QemuFwCfgItemX86SmbiosTables ++// fw_cfg blob. ++// ++#pragma pack(1) ++typedef struct { ++ UINT16 Size; // including payload and this header ++ UINT8 Type; // value from FW_CFG_SMBIOS_ENTRY_TYPE ++} FW_CFG_SMBIOS_ENTRY_HDR; ++#pragma pack() ++ ++// ++// Fields included at the beginning of the the payload in QEMU SMBIOS entries ++// with ET_FIELD type. ++// ++#pragma pack(1) ++typedef struct { ++ UINT8 TableType; // SMBIOS table type to patch ++ UINT16 Offset; // offset of a field in the formatted area ++} FW_CFG_SMBIOS_FIELD; ++#pragma pack() ++ ++ ++/** ++ Initialize a context object tracking SMBIOS table installation and patches ++ for fields. ++ ++ @param[out] Context A BUILD_CONTEXT object allocated dynamically and ++ initialized. ++ ++ @retval EFI_OUT_OF_RESOURCES Memory allocation failed. ++ @retval EFI_SUCCESS Allocation and initialization successful. ++**/ ++STATIC ++EFI_STATUS ++EFIAPI ++InitSmbiosContext ( ++ OUT BUILD_CONTEXT **Context ++ ) ++{ ++ *Context = AllocateZeroPool (sizeof **Context); ++ if (*Context == NULL) { ++ DEBUG ((DEBUG_ERROR, "%a: out of memory\n", __FUNCTION__)); ++ return EFI_OUT_OF_RESOURCES; ++ } ++ return EFI_SUCCESS; ++} ++ ++ ++/** ++ Release a context object tracking SMBIOS table installation and patches for ++ fields. ++ ++ @param[in,out] Context The BUILD_CONTEXT object to tear down. ++**/ ++STATIC ++VOID ++EFIAPI ++UninitSmbiosContext ( ++ IN OUT BUILD_CONTEXT *Context ++ ) ++{ ++ INT32 Type; ++ INT32 Idx; ++ ++ // ++ // free all patches ++ // ++ for (Type = 0; Type < TABLE_TYPE_LIMIT; ++Type) { ++ for (Idx = 0; Idx < PATCH_SUBSCRIPT_LIMIT; ++Idx) { ++ PATCH *Patch; ++ ++ Patch = &Context->Table[Type].Patch[Idx]; ++ if (Patch->Base != NULL) { ++ FreePool (Patch->Base); ++ } ++ } ++ } ++ FreePool (Context); ++} ++ ++ ++/** ++ Save a patch targeting an SMBIOS field in dynamically allocated memory. ++ ++ @param[in,out] Context The initialized BUILD_CONTEXT object to save the ++ patch in. ++ @param[in] TableType The patch to be saved targets this table type. ++ Patches for table types equal to or greater than ++ TABLE_TYPE_LIMIT are ignored. ++ @param[in] FieldOffset The patch to be saved targets the field that ++ begins at offset FieldOffset in SMBIOS table type ++ TableType. FieldOffset is enforced not to point ++ into the SMBIOS table header. A FieldOffset value ++ equal to or greater than 255 is rejected, since ++ the formatted area of an SMBIOS table never ++ exceeds 255 bytes. FieldOffset is not validated ++ against actual field offsets here, it is only ++ saved for later lookup. ++ @param[in] PatchData Byte array constituting the patch body. ++ @param[in] PatchSize Number of bytes in PatchData. ++ ++ @retval EFI_SUCCESS Patch has been either ignored due to not ++ meeting the criterion on TableType, or it has ++ been saved successfully. ++ @retval EFI_INVALID_PARAMETER FieldOffset is invalid. ++ @retval EFI_OUT_OF_RESOURCES Couldn't allocate memory for the patch. ++**/ ++STATIC ++EFI_STATUS ++EFIAPI ++SaveSmbiosPatch ( ++ IN OUT BUILD_CONTEXT *Context, ++ IN UINT8 TableType, ++ IN UINT16 FieldOffset, ++ IN UINT8 *PatchData, ++ IN UINT16 PatchSize ++) ++{ ++ UINT8 *NewBase; ++ PATCH *Patch; ++ ++ if (TableType >= TABLE_TYPE_LIMIT) { ++ DEBUG ((DEBUG_VERBOSE, ++ "%a: ignoring patch for unsupported table type %d\n", ++ __FUNCTION__, TableType)); ++ return EFI_SUCCESS; ++ } ++ ++ if (FieldOffset < FIELD_OFFSET_MINIMUM ++ || FieldOffset - FIELD_OFFSET_MINIMUM >= PATCH_SUBSCRIPT_LIMIT) { ++ DEBUG ((DEBUG_ERROR, ++ "%a: invalid patch for table type %d field offset %d\n", ++ __FUNCTION__, TableType, FieldOffset)); ++ return EFI_INVALID_PARAMETER; ++ } ++ ++ NewBase = AllocateCopyPool (PatchSize, PatchData); ++ if (PatchSize > 0 && NewBase == NULL) { ++ DEBUG ((DEBUG_ERROR, "%a: table type %d field offset %d: out of memory\n", ++ __FUNCTION__, TableType, FieldOffset)); ++ return EFI_OUT_OF_RESOURCES; ++ } ++ ++ Patch = &Context->Table[TableType].Patch[FieldOffset - FIELD_OFFSET_MINIMUM]; ++ // ++ // replace previous patch if it exists ++ // ++ if (Patch->Base != NULL) { ++ DEBUG ((DEBUG_VERBOSE, ++ "%a: replacing prior patch for table type %d field offset %d\n", ++ __FUNCTION__, TableType, FieldOffset)); ++ FreePool (Patch->Base); ++ } ++ ++ Patch->Base = NewBase; ++ Patch->Size = PatchSize; ++ return EFI_SUCCESS; ++} ++ ++ ++/** ++ Apply a saved patch to a field located in the formatted are of a not yet ++ installed SMBIOS table. ++ ++ The patch is looked up based on (Context, TableType, FieldOffset). ++ ++ @param[in] Context The BUILD_CONTEXT object storing saved patches. ++ @param[in] TableType Selects the table type for which the patch has been ++ saved. It is assumed that the caller has validated ++ TableType against TABLE_TYPE_LIMIT (upper ++ exclusive). ++ @param[in] FieldOffset Selects the SMBIOS field for which the patch has ++ been saved. It is assumed that the caller has ++ validated FieldOffset against FIELD_OFFSET_MINIMUM ++ (lower inclusive) and 255 (upper exclusive). ++ @param[in] FieldSize The caller supplies the size of the field to patch ++ in FieldSize. The patch saved for ++ TableType:FieldOffset, if any, is only applied if ++ its size equals FieldSize. ++ @param[out] TableBase Base of the SMBIOS table of type TableType in which ++ the field starting at FieldOffset needs to be ++ patched. ++ ++ @retval EFI_NOT_FOUND No patch found for TableType:FieldOffset in ++ Context. This return value is considered ++ informative (ie. non-fatal). ++ @retval EFI_INVALID_PARAMETER Patch found for TableType:FieldOffset, but its ++ size doesn't match FieldSize. This result is ++ considered a fatal error of the patch origin. ++ @retval EFI_SUCCESS The SMBIOS table at TableBase has been patched ++ starting at FieldOffset for a length of ++ FieldSize. ++**/ ++EFI_STATUS ++EFIAPI ++PatchSmbiosFormatted ( ++ IN BUILD_CONTEXT *Context, ++ IN UINT8 TableType, ++ IN UINT16 FieldOffset, ++ IN UINT16 FieldSize, ++ OUT UINT8 *TableBase ++ ) ++{ ++ PATCH *Patch; ++ ++ ASSERT (TableType < TABLE_TYPE_LIMIT); ++ ASSERT (FieldOffset >= FIELD_OFFSET_MINIMUM); ++ ASSERT (FieldOffset - FIELD_OFFSET_MINIMUM < PATCH_SUBSCRIPT_LIMIT); ++ ++ Patch = &Context->Table[TableType].Patch[FieldOffset - FIELD_OFFSET_MINIMUM]; ++ if (Patch->Base == NULL) { ++ return EFI_NOT_FOUND; ++ } ++ ++ if (Patch->Size != FieldSize) { ++ DEBUG ((DEBUG_ERROR, "%a: table type %d, field offset %d: " ++ "patch size %d doesn't match field size %d\n", ++ __FUNCTION__, TableType, FieldOffset, Patch->Size, FieldSize)); ++ return EFI_INVALID_PARAMETER; ++ } ++ ++ CopyMem (TableBase + FieldOffset, Patch->Base, FieldSize); ++ return EFI_SUCCESS; ++} ++ ++ ++/** ++ Apply a saved patch to a text string located in the unformatted area of an ++ already installed SMBIOS table. ++ ++ The patch is looked up based on (Context, TableType, FieldOffset). ++ ++ @param[in] Smbios The EFI_SMBIOS_PROTOCOL instance used previously ++ for installing the SMBIOS table. ++ @param[in] SmbiosHandle The EFI_SMBIOS_HANDLE previously returned by ++ Smbios->Add(). ++ @param[in] Context The BUILD_CONTEXT object storing saved patches. ++ @param[in] TableType Selects the table type for which the patch has been ++ saved. It is assumed that the caller has validated ++ TableType against TABLE_TYPE_LIMIT (upper ++ exclusive). ++ @param[in] FieldOffset Selects the SMBIOS field for which the patch has ++ been saved. It is assumed that the caller has ++ validated FieldOffset against FIELD_OFFSET_MINIMUM ++ (lower inclusive) and 255 (upper exclusive). ++ It is also assumed that TableBase[FieldOffset] ++ accesses a field of type SMBIOS_TABLE_STRING, ie. a ++ field in the formatted area that identifies an ++ existent text string in the unformatted area. Text ++ string identifiers are one-based. ++ @param[out] TableBase Base of the SMBIOS table of type TableType in which ++ the SMBIOS_TABLE_STRING field at FieldOffset ++ identifies the existent text string to update. ++ ++ @retval EFI_NOT_FOUND No patch found for TableType:FieldOffset in ++ Context. This return value is considered ++ informative (ie. non-fatal). ++ @retval EFI_INVALID_PARAMETER Patch found for TableType:FieldOffset, but it ++ doesn't end with a NUL character. This result ++ is considered a fatal error of the patch ++ origin. ++ @retval EFI_SUCCESS The text string identified by ++ TableBase[FieldOffset] has been replaced in ++ the installed SMBIOS table under SmbiosHandle. ++ @return Error codes returned by ++ Smbios->UpdateString(). EFI_NOT_FOUND shall ++ not be returned. ++**/ ++EFI_STATUS ++EFIAPI ++PatchSmbiosUnformatted ( ++ IN EFI_SMBIOS_PROTOCOL *Smbios, ++ IN EFI_SMBIOS_HANDLE SmbiosHandle, ++ IN BUILD_CONTEXT *Context, ++ IN UINT8 TableType, ++ IN UINT16 FieldOffset, ++ IN UINT8 *TableBase ++ ) ++{ ++ PATCH *Patch; ++ UINTN StringNumber; ++ EFI_STATUS Status; ++ ++ ASSERT (TableType < TABLE_TYPE_LIMIT); ++ ASSERT (FieldOffset >= FIELD_OFFSET_MINIMUM); ++ ASSERT (FieldOffset - FIELD_OFFSET_MINIMUM < PATCH_SUBSCRIPT_LIMIT); ++ ++ Patch = &Context->Table[TableType].Patch[FieldOffset - FIELD_OFFSET_MINIMUM]; ++ if (Patch->Base == NULL) { ++ return EFI_NOT_FOUND; ++ } ++ ++ if (Patch->Size == 0 || Patch->Base[Patch->Size - 1] != '\0') { ++ DEBUG ((DEBUG_ERROR, "%a: table type %d, field offset %d: " ++ "missing terminator, or trailing garbage\n", ++ __FUNCTION__, TableType, FieldOffset)); ++ return EFI_INVALID_PARAMETER; ++ } ++ ++ StringNumber = TableBase[FieldOffset]; ++ ASSERT (StringNumber != 0); ++ ++ Status = Smbios->UpdateString (Smbios, &SmbiosHandle, &StringNumber, ++ (CHAR8 *)Patch->Base); ++ if (EFI_ERROR (Status)) { ++ ASSERT (Status != EFI_NOT_FOUND); ++ DEBUG ((DEBUG_ERROR, "%a: table type %d, field offset %d, " ++ "string number %d: Smbios->UpdateString(): %r\n", __FUNCTION__, ++ TableType, FieldOffset, TableBase[FieldOffset], Status)); ++ return Status; ++ } ++ return EFI_SUCCESS; ++} ++ ++ ++/** ++ Process an SMBIOS firmware configuration entry with ET_FIELD type, exported ++ by QEMU under QemuFwCfgItemX86SmbiosTables. ++ ++ Such entries describe patches to be saved with SaveSmbiosPatch(). ++ ++ @param[in,out] Context The BUILD_CONTEXT object tracking saved patches. ++ @param[in] Payload Points to the buffer to parse as ++ FW_CFG_SMBIOS_FIELD. ++ @param[in] PayloadSize Number of bytes in Payload. ++ ++ @retval EFI_INVALID_PARAMETER PayloadSize is less than the size of ++ FW_CFG_SMBIOS_FIELD -- fields describing ++ the patch are incomplete. ++ @retval EFI_SUCCESS Payload has been parsed and patch has been ++ saved successfully. ++ @return Error codes returned by SaveSmbiosPatch(). ++**/ ++STATIC ++EFI_STATUS ++EFIAPI ++VisitSmbiosField ( ++ IN OUT BUILD_CONTEXT *Context, ++ IN UINT8 *Payload, ++ IN UINT16 PayloadSize ++ ) ++{ ++ FW_CFG_SMBIOS_FIELD *Field; ++ ++ if (PayloadSize < (INT32) sizeof *Field) { ++ DEBUG ((DEBUG_ERROR, "%a: required minimum size %d, available %d\n", ++ __FUNCTION__, (INT32) sizeof *Field, PayloadSize)); ++ return EFI_INVALID_PARAMETER; ++ } ++ ++ Field = (FW_CFG_SMBIOS_FIELD *) Payload; ++ return SaveSmbiosPatch (Context, Field->TableType, Field->Offset, ++ Payload + sizeof *Field, (UINT16) (PayloadSize - sizeof *Field)); ++} ++ ++ ++/** ++ Process an SMBIOS firmware configuration entry with ET_TABLE type, exported ++ by QEMU under QemuFwCfgItemX86SmbiosTables. ++ ++ Such entries describe entire SMBIOS table instances to install verbatim. This ++ module never overrides tables installed in this manner with default tables. ++ ++ @param[in] Smbios The EFI_SMBIOS_PROTOCOL instance used for ++ installing SMBIOS tables. ++ @param[in] ProducerHandle Passed on to Smbios->Add(), ProducerHandle ++ tracks the origin of installed SMBIOS tables. ++ @param[in,out] Context The BUILD_CONTEXT object tracking installed ++ tables. ++ @param[in] Payload Points to the buffer to install as an SMBIOS ++ table. ++ @param[in] PayloadSize Number of bytes in Payload. ++ ++ @retval EFI_INVALID_PARAMETER The buffer at Payload, interpreted as an ++ SMBIOS table, failed basic sanity checks. ++ @retval EFI_SUCCESS Payload has been installed successfully as an ++ SMBIOS table. ++ @return Error codes returned by Smbios->Add(). ++**/ ++STATIC ++EFI_STATUS ++EFIAPI ++VisitSmbiosTable ( ++ IN EFI_SMBIOS_PROTOCOL *Smbios, ++ IN EFI_HANDLE ProducerHandle, ++ IN OUT BUILD_CONTEXT *Context, ++ IN UINT8 *Payload, ++ IN UINT16 PayloadSize ++ ) ++{ ++ SMBIOS_STRUCTURE *SmbiosHeader; ++ UINT16 MinimumSize; ++ EFI_SMBIOS_HANDLE SmbiosHandle; ++ EFI_STATUS Status; ++ ++ // ++ // Basic sanity checks only in order to help debugging and to catch blatantly ++ // invalid data passed with "-smbios file=binary_file" on the QEMU command ++ // line. Beyond these we don't enforce correct, type-specific SMBIOS table ++ // formatting. ++ // ++ if (PayloadSize < (INT32) sizeof *SmbiosHeader) { ++ DEBUG ((DEBUG_ERROR, "%a: required minimum size %d, available %d\n", ++ __FUNCTION__, (INT32) sizeof *SmbiosHeader, PayloadSize)); ++ return EFI_INVALID_PARAMETER; ++ } ++ ++ SmbiosHeader = (SMBIOS_STRUCTURE *) Payload; ++ ++ if (SmbiosHeader->Length < (INT32) sizeof *SmbiosHeader) { ++ DEBUG ((DEBUG_ERROR, "%a: required minimum size %d, stated %d\n", ++ __FUNCTION__, (INT32) sizeof *SmbiosHeader, SmbiosHeader->Length)); ++ return EFI_INVALID_PARAMETER; ++ } ++ ++ MinimumSize = (UINT16) (SmbiosHeader->Length + 2); ++ ++ if (PayloadSize < MinimumSize) { ++ DEBUG ((DEBUG_ERROR, ++ "%a: minimum for formatted area plus terminator is %d, available %d\n", ++ __FUNCTION__, MinimumSize, PayloadSize)); ++ return EFI_INVALID_PARAMETER; ++ } ++ ++ if (Payload[PayloadSize - 2] != '\0' || ++ Payload[PayloadSize - 1] != '\0') { ++ DEBUG ((DEBUG_ERROR, "%a: missing terminator, or trailing garbage\n", ++ __FUNCTION__)); ++ return EFI_INVALID_PARAMETER; ++ } ++ ++ // ++ // request unique handle ++ // ++ SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED; ++ Status = Smbios->Add (Smbios, ProducerHandle, &SmbiosHandle, ++ (EFI_SMBIOS_TABLE_HEADER *) SmbiosHeader); ++ if (EFI_ERROR (Status)) { ++ DEBUG ((DEBUG_ERROR, "%a: Smbios->Add(): %r\n", __FUNCTION__, Status)); ++ return Status; ++ } ++ ++ // ++ // track known tables ++ // ++ if (SmbiosHeader->Type < TABLE_TYPE_LIMIT) { ++ Context->Table[SmbiosHeader->Type].Installed = TRUE; ++ } ++ return EFI_SUCCESS; ++} ++ ++ ++/** ++ Traverse the SMBIOS firmware configuration blob exported by QEMU under ++ QemuFwCfgItemX86SmbiosTables, processing each entry in turn. ++ ++ Entries with ET_FIELD type are parsed as patches for the SMBIOS tables this ++ module installs as fallbacks, while entries of type ET_TABLE are parsed and ++ installed as verbatim SMBIOS tables. ++ ++ Unknown entry types are silently skipped. Any error encountered during ++ traversal (for example, a recognized but malformed entry) aborts the ++ iteration, leaving the function with a possibly incomplete set of installed ++ tables. ++ ++ @param[in] Smbios The EFI_SMBIOS_PROTOCOL instance used for ++ installing SMBIOS tables. ++ @param[in] ProducerHandle Passed on to Smbios->Add(), ProducerHandle ++ tracks the origin of installed SMBIOS tables. ++ @param[in,out] Context The BUILD_CONTEXT object tracking installed ++ tables and saved patches. ++ ++ @retval EFI_SUCCESS The firmware configuration interface is ++ unavailable (no patches saved, no tables ++ installed). ++ @retval EFI_SUCCESS Traversal complete. Tables provided by QEMU ++ have been installed. Patches have been saved ++ for any default tables that will be necessary. ++ @retval EFI_INVALID_PARAMETER Encountered a corrupt entry in the SMBIOS ++ firmware configuration blob. ++ @retval EFI_OUT_OF_RESOURCES Memory allocation failed. ++ @return Error codes returned by VisitSmbiosField() and ++ VisitSmbiosTable(). ++**/ ++STATIC ++EFI_STATUS ++EFIAPI ++ScanQemuSmbios ( ++ IN EFI_SMBIOS_PROTOCOL *Smbios, ++ IN EFI_HANDLE ProducerHandle, ++ IN OUT BUILD_CONTEXT *Context ++ ) ++{ ++ EFI_STATUS Status; ++ UINT16 NumEntries; ++ UINT16 CurEntry; ++ ++ Status = EFI_SUCCESS; ++ ++ if (!QemuFwCfgIsAvailable ()) { ++ return Status; ++ } ++ ++ QemuFwCfgSelectItem (QemuFwCfgItemX86SmbiosTables); ++ ++ NumEntries = QemuFwCfgRead16 (); ++ for (CurEntry = 0; CurEntry < NumEntries && !EFI_ERROR (Status); ++ ++CurEntry) { ++ FW_CFG_SMBIOS_ENTRY_HDR Header; ++ UINT16 PayloadSize; ++ UINT8 *Payload; ++ ++ QemuFwCfgReadBytes (sizeof Header, &Header); ++ ++ if (Header.Size < (INT32) sizeof Header) { ++ DEBUG ((DEBUG_ERROR, "%a: invalid header size %d in entry %d\n", ++ __FUNCTION__, Header.Size, CurEntry)); ++ return EFI_INVALID_PARAMETER; ++ } ++ ++ PayloadSize = (UINT16) (Header.Size - sizeof Header); ++ Payload = AllocatePool (PayloadSize); ++ ++ if (PayloadSize > 0 && Payload == NULL) { ++ DEBUG ((DEBUG_ERROR, "%a: failed to allocate %d bytes for entry %d\n", ++ __FUNCTION__, PayloadSize, CurEntry)); ++ return EFI_OUT_OF_RESOURCES; ++ } ++ ++ QemuFwCfgReadBytes (PayloadSize, Payload); ++ ++ // ++ // dump the payload ++ // ++ DEBUG_CODE ( ++ UINT16 Idx; ++ ++ DEBUG ((DEBUG_VERBOSE, ++ "%a: entry %d, type %d, payload size %d, payload hex dump follows:", ++ __FUNCTION__, CurEntry, Header.Type, PayloadSize)); ++ for (Idx = 0; Idx < PayloadSize; ++Idx) { ++ switch (Idx % 16) { ++ case 0: ++ DEBUG ((DEBUG_VERBOSE, "\n%04X:", Idx)); ++ break; ++ case 8: ++ DEBUG ((DEBUG_VERBOSE, " ")); ++ break; ++ default: ++ ; ++ } ++ DEBUG ((DEBUG_VERBOSE, " %02X", Payload[Idx])); ++ } ++ DEBUG ((DEBUG_VERBOSE, "\n")); ++ ); ++ ++ switch (Header.Type) { ++ case ET_FIELD: ++ Status = VisitSmbiosField (Context, Payload, PayloadSize); ++ break; ++ case ET_TABLE: ++ Status = VisitSmbiosTable (Smbios, ProducerHandle, Context, Payload, ++ PayloadSize); ++ break; ++ default: ++ ; ++ } ++ ++ FreePool (Payload); ++ } ++ ++ return Status; ++} ++ ++ ++/** ++ Install some of the default SMBIOS tables for table types that QEMU hasn't ++ provided under QemuFwCfgItemX86SmbiosTables, but are required by the ++ SMBIOS-2.7.1 specification. ++ ++ @param[in] Smbios The EFI_SMBIOS_PROTOCOL instance used for ++ installing SMBIOS tables. ++ @param[in] ProducerHandle Passed on to Smbios->Add(), ProducerHandle ++ tracks the origin of installed SMBIOS tables. ++ @param[in,out] Context The BUILD_CONTEXT object tracking installed ++ tables and saved patches. ++ ++ @return Status codes returned by the InstallSmbiosTypeXX() functions, ++ including the final EFI_SUCCESS if all such calls succeed. ++**/ ++STATIC ++EFI_STATUS ++EFIAPI ++InstallDefaultTables ( ++ IN EFI_SMBIOS_PROTOCOL *Smbios, ++ IN EFI_HANDLE ProducerHandle, ++ IN OUT BUILD_CONTEXT *Context ++ ) ++{ ++ return EFI_SUCCESS; ++} ++ ++ ++/** ++ Fetch and install SMBIOS tables on the QEMU hypervisor. ++ ++ First, tables provided by QEMU in entirety are installed verbatim. ++ ++ Then the function prepares some of the remaining tables required by the ++ SMBIOS-2.7.1 specification. For each such table, ++ - if QEMU provides any fields for the table, they take effect verbatim, ++ - remaining fields are set by this function. ++ ++ @param[in] Smbios The EFI_SMBIOS_PROTOCOL instance used for installing ++ the SMBIOS tables. ++ @param[in] ImageHandle The image handle of the calling module, passed as ++ ProducerHandle to the Smbios->Add() call. ++ ++ @retval EFI_SUCCESS All tables have been installed. ++ @retval EFI_UNSUPPORTED The pair (Smbios->MajorVersion, ++ Smbios->MinorVersion) precedes (2, 3) ++ lexicographically. ++ @return Error codes returned by Smbios->Add() or ++ internal functions. Some tables may not have ++ been installed or fully patched. ++**/ ++EFI_STATUS ++EFIAPI ++InstallQemuSmbiosTables ( ++ IN EFI_SMBIOS_PROTOCOL *Smbios, ++ IN EFI_HANDLE ImageHandle ++ ) ++{ ++ EFI_STATUS Status; ++ BUILD_CONTEXT *Context; ++ ++ if (Smbios->MajorVersion < 2 || Smbios->MinorVersion < 3) { ++ DEBUG ((DEBUG_ERROR, "%a: unsupported Smbios version %d.%d\n", ++ __FUNCTION__, Smbios->MajorVersion, Smbios->MinorVersion)); ++ return EFI_UNSUPPORTED; ++ } ++ ++ Status = InitSmbiosContext (&Context); ++ if (EFI_ERROR (Status)) { ++ return Status; ++ } ++ ++ // ++ // and must agree. ++ // ++ ASSERT (sizeof(SMBIOS_STRUCTURE) == sizeof(EFI_SMBIOS_TABLE_HEADER)); ++ ++ Status = ScanQemuSmbios (Smbios, ImageHandle, Context); ++ if (EFI_ERROR (Status)) { ++ goto Cleanup; ++ } ++ ++ Status = InstallDefaultTables (Smbios, ImageHandle, Context); ++ ++Cleanup: ++ UninitSmbiosContext (Context); ++ return Status; ++} +diff --git a/OvmfPkg/SmbiosPlatformDxe/QemuLegacy.h b/OvmfPkg/SmbiosPlatformDxe/QemuLegacy.h +new file mode 100644 +index 0000000..40d5ad3 +--- /dev/null ++++ b/OvmfPkg/SmbiosPlatformDxe/QemuLegacy.h +@@ -0,0 +1,52 @@ ++/** @file ++ This header file provides QEMU-specific public prototypes for the main driver ++ file, "SmbiosPlatformDxe.c". ++ ++ Copyright (C) 2013, Red Hat, Inc. ++ ++ This program and the accompanying materials are licensed and made available ++ under the terms and conditions of the BSD License which accompanies this ++ distribution. The full text of the license may be found at ++ http://opensource.org/licenses/bsd-license.php ++ ++ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, WITHOUT ++ WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. ++**/ ++ ++#ifndef _QEMU_LEGACY_H_ ++#define _QEMU_LEGACY_H_ ++ ++#include ++ ++ ++/** ++ Fetch and install SMBIOS tables on the QEMU hypervisor. ++ ++ First, tables provided by QEMU in entirety are installed verbatim. ++ ++ Then the function prepares some of the remaining tables required by the ++ SMBIOS-2.7.1 specification. For each such table, ++ - if QEMU provides any fields for the table, they take effect verbatim, ++ - remaining fields are set by this function. ++ ++ @param[in] Smbios The EFI_SMBIOS_PROTOCOL instance used for installing ++ the SMBIOS tables. ++ @param[in] ImageHandle The image handle of the calling module, passed as ++ ProducerHandle to the Smbios->Add() call. ++ ++ @retval EFI_SUCCESS All tables have been installed. ++ @retval EFI_UNSUPPORTED The pair (Smbios->MajorVersion, ++ Smbios->MinorVersion) precedes (2, 3) ++ lexicographically. ++ @return Error codes returned by Smbios->Add() or ++ internal functions. Some tables may not have ++ been installed or fully patched. ++**/ ++EFI_STATUS ++EFIAPI ++InstallQemuSmbiosTables ( ++ IN EFI_SMBIOS_PROTOCOL *Smbios, ++ IN EFI_HANDLE ImageHandle ++ ); ++ ++#endif +diff --git a/OvmfPkg/SmbiosPlatformDxe/QemuLegacyInternal.h b/OvmfPkg/SmbiosPlatformDxe/QemuLegacyInternal.h +new file mode 100644 +index 0000000..8613407 +--- /dev/null ++++ b/OvmfPkg/SmbiosPlatformDxe/QemuLegacyInternal.h +@@ -0,0 +1,221 @@ ++/** @file ++ This header provides common includes, and communicates internal types, ++ function prototypes and macros between "Qemu.c" and "QemuTypeXX.c", that ++ relate to the installation and patching of SMBIOS tables on the QEMU ++ platform. ++ ++ Copyright (C) 2013, Red Hat, Inc. ++ ++ This program and the accompanying materials are licensed and made available ++ under the terms and conditions of the BSD License which accompanies this ++ distribution. The full text of the license may be found at ++ http://opensource.org/licenses/bsd-license.php ++ ++ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, WITHOUT ++ WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. ++**/ ++ ++#ifndef _QEMU_LEGACY_INTERNAL_H_ ++#define _QEMU_LEGACY_INTERNAL_H_ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++ ++ ++// ++// Type identifiers of all tables mandated by the SMBIOS-2.7.1 specification ++// fall strictly under this limit. ++// ++#define TABLE_TYPE_LIMIT (EFI_SMBIOS_TYPE_SYSTEM_BOOT_INFORMATION + 1) ++ ++ ++// ++// Track a patch in dynamic memory, originating from a QEMU SMBIOS firmware ++// configuration entry with ET_FIELD type. ++// ++typedef struct { ++ UINT8 *Base; ++ UINT16 Size; ++} PATCH; ++ ++ ++#define FIELD_OFFSET_MINIMUM ((INT32) sizeof(SMBIOS_STRUCTURE)) ++#define PATCH_SUBSCRIPT_LIMIT (255 - FIELD_OFFSET_MINIMUM) ++ ++// ++// The following structure tracks the installation of each SMBIOS table with a ++// type below TABLE_TYPE_LIMIT, and captures QEMU SMBIOS firmware configuration ++// entries with ET_FIELD type that target the default table for the same type. ++// ++typedef struct { ++ BOOLEAN Installed; // at least one instance of the type has been installed ++ ++ PATCH Patch[PATCH_SUBSCRIPT_LIMIT]; // Patches indexed by the field offset ++ // that they target in this specific ++ // table type. Patching the SMBIOS table ++ // header is not allowed, hence we can ++ // shift down field offsets. An unused ++ // element has zeroed-out fields. ++} TABLE_CONTEXT; ++ ++ ++// ++// Track the installation of, and stored patches for, all table types below ++// TABLE_TYPE_LIMIT. ++// ++typedef struct { ++ TABLE_CONTEXT Table[TABLE_TYPE_LIMIT]; ++} BUILD_CONTEXT; ++ ++ ++// ++// Convenience / safety macro for defining C structure types for default SMBIOS ++// tables. ++// ++// Rules of use: ++// - Use only within #pragma pack(1). ++// - This macro depends on the macro ++// "OVMF_TYPE ## TableType ## _STRINGS" specifying the text strings ++// (unformatted area) for TableType. Each "QemuTypeXX.c" file needs to ++// provide said macro before using the one below. ++// ++#define OVMF_SMBIOS(TableType) \ ++ typedef struct { \ ++ SMBIOS_TABLE_TYPE##TableType Base; \ ++ UINT8 Strings[sizeof OVMF_TYPE##TableType##_STRINGS]; \ ++ } OVMF_TYPE##TableType ++ ++ ++// ++// Convenience / safety macro for patching a field in the formatted area of ++// an SMBIOS table. ++// ++#define PATCH_FORMATTED(Context, TableType, OvmfTablePtr, FieldName) \ ++ PatchSmbiosFormatted ( \ ++ Context, \ ++ TableType, \ ++ (UINT16) OFFSET_OF (SMBIOS_TABLE_TYPE##TableType, FieldName), \ ++ (UINT16) sizeof (OvmfTablePtr)->Base.FieldName, \ ++ (UINT8 *) (OvmfTablePtr) \ ++ ) ++ ++ ++/** ++ Apply a saved patch to a field located in the formatted are of a not yet ++ installed SMBIOS table. ++ ++ The patch is looked up based on (Context, TableType, FieldOffset). ++ ++ @param[in] Context The BUILD_CONTEXT object storing saved patches. ++ @param[in] TableType Selects the table type for which the patch has been ++ saved. It is assumed that the caller has validated ++ TableType against TABLE_TYPE_LIMIT (upper ++ exclusive). ++ @param[in] FieldOffset Selects the SMBIOS field for which the patch has ++ been saved. It is assumed that the caller has ++ validated FieldOffset against FIELD_OFFSET_MINIMUM ++ (lower inclusive) and 255 (upper exclusive). ++ @param[in] FieldSize The caller supplies the size of the field to patch ++ in FieldSize. The patch saved for ++ TableType:FieldOffset, if any, is only applied if ++ its size equals FieldSize. ++ @param[out] TableBase Base of the SMBIOS table of type TableType in which ++ the field starting at FieldOffset needs to be ++ patched. ++ ++ @retval EFI_NOT_FOUND No patch found for TableType:FieldOffset in ++ Context. This return value is considered ++ informative (ie. non-fatal). ++ @retval EFI_INVALID_PARAMETER Patch found for TableType:FieldOffset, but its ++ size doesn't match FieldSize. This result is ++ considered a fatal error of the patch origin. ++ @retval EFI_SUCCESS The SMBIOS table at TableBase has been patched ++ starting at FieldOffset for a length of ++ FieldSize. ++**/ ++EFI_STATUS ++EFIAPI ++PatchSmbiosFormatted ( ++ IN BUILD_CONTEXT *Context, ++ IN UINT8 TableType, ++ IN UINT16 FieldOffset, ++ IN UINT16 FieldSize, ++ OUT UINT8 *TableBase ++ ); ++ ++ ++// ++// Convenience / safety macro for patching a string in the unformatted area of ++// an SMBIOS table. ++// ++#define PATCH_UNFORMATTED(Smbios, SmbiosHandle, Context, TableType, \ ++ OvmfTablePtr, FieldName) \ ++ \ ++ PatchSmbiosUnformatted ( \ ++ Smbios, \ ++ SmbiosHandle, \ ++ Context, \ ++ TableType, \ ++ (UINT16) OFFSET_OF (SMBIOS_TABLE_TYPE##TableType, FieldName), \ ++ (UINT8 *) (OvmfTablePtr) \ ++ ) ++ ++ ++/** ++ Apply a saved patch to a text string located in the unformatted area of an ++ already installed SMBIOS table. ++ ++ The patch is looked up based on (Context, TableType, FieldOffset). ++ ++ @param[in] Smbios The EFI_SMBIOS_PROTOCOL instance used previously ++ for installing the SMBIOS table. ++ @param[in] SmbiosHandle The EFI_SMBIOS_HANDLE previously returned by ++ Smbios->Add(). ++ @param[in] Context The BUILD_CONTEXT object storing saved patches. ++ @param[in] TableType Selects the table type for which the patch has been ++ saved. It is assumed that the caller has validated ++ TableType against TABLE_TYPE_LIMIT (upper ++ exclusive). ++ @param[in] FieldOffset Selects the SMBIOS field for which the patch has ++ been saved. It is assumed that the caller has ++ validated FieldOffset against FIELD_OFFSET_MINIMUM ++ (lower inclusive) and 255 (upper exclusive). ++ It is also assumed that TableBase[FieldOffset] ++ accesses a field of type SMBIOS_TABLE_STRING, ie. a ++ field in the formatted area that identifies an ++ existent text string in the unformatted area. Text ++ string identifiers are one-based. ++ @param[out] TableBase Base of the SMBIOS table of type TableType in which ++ the SMBIOS_TABLE_STRING field at FieldOffset ++ identifies the existent text string to update. ++ ++ @retval EFI_NOT_FOUND No patch found for TableType:FieldOffset in ++ Context. This return value is considered ++ informative (ie. non-fatal). ++ @retval EFI_INVALID_PARAMETER Patch found for TableType:FieldOffset, but it ++ doesn't end with a NUL character. This result ++ is considered a fatal error of the patch ++ origin. ++ @retval EFI_SUCCESS The text string identified by ++ TableBase[FieldOffset] has been replaced in ++ the installed SMBIOS table under SmbiosHandle. ++ @return Error codes returned by ++ Smbios->UpdateString(). EFI_NOT_FOUND shall ++ not be returned. ++**/ ++EFI_STATUS ++EFIAPI ++PatchSmbiosUnformatted ( ++ IN EFI_SMBIOS_PROTOCOL *Smbios, ++ IN EFI_SMBIOS_HANDLE SmbiosHandle, ++ IN BUILD_CONTEXT *Context, ++ IN UINT8 TableType, ++ IN UINT16 FieldOffset, ++ IN UINT8 *TableBase ++ ); ++ ++#endif +diff --git a/OvmfPkg/SmbiosPlatformDxe/SmbiosPlatformDxe.c b/OvmfPkg/SmbiosPlatformDxe/SmbiosPlatformDxe.c +index 29948a4..b7c1d0d 100644 +--- a/OvmfPkg/SmbiosPlatformDxe/SmbiosPlatformDxe.c ++++ b/OvmfPkg/SmbiosPlatformDxe/SmbiosPlatformDxe.c +@@ -1,6 +1,7 @@ + /** @file + This driver installs SMBIOS information for OVMF + ++ Copyright (C) 2013, Red Hat, Inc. + Copyright (c) 2011, Bei Guan + Copyright (c) 2011 - 2015, Intel Corporation. All rights reserved.
+ +@@ -15,6 +16,9 @@ + **/ + + #include "SmbiosPlatformDxe.h" ++#if defined (MDE_CPU_IA32) || defined (MDE_CPU_X64) ++#include "QemuLegacy.h" ++#endif + + #define TYPE0_STRINGS \ + "EFI Development Kit II / OVMF\0" /* Vendor */ \ +@@ -27,10 +31,10 @@ + typedef struct { + SMBIOS_TABLE_TYPE0 Base; + UINT8 Strings[sizeof(TYPE0_STRINGS)]; +-} OVMF_TYPE0; ++} OVMF_DEFAULT_TYPE0; + #pragma pack() + +-STATIC CONST OVMF_TYPE0 mOvmfDefaultType0 = { ++STATIC CONST OVMF_DEFAULT_TYPE0 mOvmfDefaultType0 = { + { + // SMBIOS_STRUCTURE Hdr + { +@@ -202,7 +206,14 @@ SmbiosTablePublishEntry ( + SmbiosTables = GetQemuSmbiosTables (); + } + +- if (SmbiosTables != NULL) { ++ if (SmbiosTables == NULL) { ++#if defined (MDE_CPU_IA32) || defined (MDE_CPU_X64) ++ // ++ // Handle QEMU's legacy SMBIOS interface. ++ // ++ Status = InstallQemuSmbiosTables (Smbios, ImageHandle); ++#endif ++ } else { + Status = InstallAllStructures (Smbios, SmbiosTables); + + // +diff --git a/OvmfPkg/SmbiosPlatformDxe/SmbiosPlatformDxe.inf b/OvmfPkg/SmbiosPlatformDxe/SmbiosPlatformDxe.inf +index 3b90aac..8c9f43c 100644 +--- a/OvmfPkg/SmbiosPlatformDxe/SmbiosPlatformDxe.inf ++++ b/OvmfPkg/SmbiosPlatformDxe/SmbiosPlatformDxe.inf +@@ -1,6 +1,7 @@ + ## @file + # This driver installs SMBIOS information for OVMF + # ++# Copyright (C) 2013, Red Hat, Inc. + # Copyright (c) 2011, Bei Guan + # Copyright (c) 2011, Intel Corporation. All rights reserved.
+ # +@@ -35,6 +36,7 @@ + + [Sources.IA32, Sources.X64] + X86Xen.c ++ QemuLegacy.c + + [Sources.ARM, Sources.AARCH64] + ArmXen.c +-- +1.8.3.1 + diff --git a/recipes-openxt/xenclient/ovmf/files/0001-OvmfPkg-disable-multi-processor-support-for-boot-tim.patch b/recipes-openxt/xenclient/ovmf/files/0001-OvmfPkg-disable-multi-processor-support-for-boot-tim.patch new file mode 100644 index 0000000000..2592b07c43 --- /dev/null +++ b/recipes-openxt/xenclient/ovmf/files/0001-OvmfPkg-disable-multi-processor-support-for-boot-tim.patch @@ -0,0 +1,68 @@ +From dd48ac51d1df4f718b4401b188d2824aebcc341c Mon Sep 17 00:00:00 2001 +From: Laszlo Ersek +Date: Wed, 26 Nov 2014 16:32:06 +0100 +Subject: [PATCH] OvmfPkg: disable multi-processor support for boot time + +We have no useful workload for APs, so let's not start them up, because +they would spin indefinitely until ExitBootServices(). + +Setting gUefiCpuPkgTokenSpaceGuid.PcdCpuMaxLogicalProcessorNumber to 1 +causes InitializeMpSupport() in "UefiCpuPkg/CpuDxe/CpuMp.c" to return +early. + +Contributed-under: TianoCore Contribution Agreement 1.0 +Signed-off-by: Laszlo Ersek +--- + OvmfPkg/OvmfPkgIa32.dsc | 4 ++++ + OvmfPkg/OvmfPkgIa32X64.dsc | 4 ++++ + OvmfPkg/OvmfPkgX64.dsc | 4 ++++ + 3 files changed, 12 insertions(+) + +diff --git a/OvmfPkg/OvmfPkgIa32.dsc b/OvmfPkg/OvmfPkgIa32.dsc +index 6598102..1730812 100644 +--- a/OvmfPkg/OvmfPkgIa32.dsc ++++ b/OvmfPkg/OvmfPkgIa32.dsc +@@ -329,6 +329,10 @@ + # IRQs 5, 9, 10, 11 are level-triggered + gPcAtChipsetPkgTokenSpaceGuid.Pcd8259LegacyModeEdgeLevel|0x0E20 + ++ # We have no useful workload for APs, so let's not start them up, because ++ # they would spin indefinitely until ExitBootServices(). ++ gUefiCpuPkgTokenSpaceGuid.PcdCpuMaxLogicalProcessorNumber|1 ++ + ################################################################################ + # + # Pcd Dynamic Section - list of all EDK II PCD Entries defined by this Platform +diff --git a/OvmfPkg/OvmfPkgIa32X64.dsc b/OvmfPkg/OvmfPkgIa32X64.dsc +index 4de961f..370ae50 100644 +--- a/OvmfPkg/OvmfPkgIa32X64.dsc ++++ b/OvmfPkg/OvmfPkgIa32X64.dsc +@@ -335,6 +335,10 @@ + # IRQs 5, 9, 10, 11 are level-triggered + gPcAtChipsetPkgTokenSpaceGuid.Pcd8259LegacyModeEdgeLevel|0x0E20 + ++ # We have no useful workload for APs, so let's not start them up, because ++ # they would spin indefinitely until ExitBootServices(). ++ gUefiCpuPkgTokenSpaceGuid.PcdCpuMaxLogicalProcessorNumber|1 ++ + ################################################################################ + # + # Pcd Dynamic Section - list of all EDK II PCD Entries defined by this Platform +diff --git a/OvmfPkg/OvmfPkgX64.dsc b/OvmfPkg/OvmfPkgX64.dsc +index 6c38081..175d5f4 100644 +--- a/OvmfPkg/OvmfPkgX64.dsc ++++ b/OvmfPkg/OvmfPkgX64.dsc +@@ -334,6 +334,10 @@ + # IRQs 5, 9, 10, 11 are level-triggered + gPcAtChipsetPkgTokenSpaceGuid.Pcd8259LegacyModeEdgeLevel|0x0E20 + ++ # We have no useful workload for APs, so let's not start them up, because ++ # they would spin indefinitely until ExitBootServices(). ++ gUefiCpuPkgTokenSpaceGuid.PcdCpuMaxLogicalProcessorNumber|1 ++ + ################################################################################ + # + # Pcd Dynamic Section - list of all EDK II PCD Entries defined by this Platform +-- +1.8.3.1 + diff --git a/recipes-openxt/xenclient/ovmf/files/0001-OvmfPkg-don-t-lock-lock-umb-when-running-csm.patch b/recipes-openxt/xenclient/ovmf/files/0001-OvmfPkg-don-t-lock-lock-umb-when-running-csm.patch new file mode 100644 index 0000000000..c059340ff5 --- /dev/null +++ b/recipes-openxt/xenclient/ovmf/files/0001-OvmfPkg-don-t-lock-lock-umb-when-running-csm.patch @@ -0,0 +1,27 @@ +From e4659d5bc55ca8b0a9202f0af17ecd70749d150b Mon Sep 17 00:00:00 2001 +From: Gerd Hoffmann +Date: Tue, 20 Aug 2013 14:00:55 +0200 +Subject: [PATCH] OvmfPkg: don't lock lock umb when running csm + +--- + IntelFrameworkModulePkg/Csm/LegacyBiosDxe/LegacyBootSupport.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/IntelFrameworkModulePkg/Csm/LegacyBiosDxe/LegacyBootSupport.c b/IntelFrameworkModulePkg/Csm/LegacyBiosDxe/LegacyBootSupport.c +index 6c2688b..a391a05 100644 +--- a/IntelFrameworkModulePkg/Csm/LegacyBiosDxe/LegacyBootSupport.c ++++ b/IntelFrameworkModulePkg/Csm/LegacyBiosDxe/LegacyBootSupport.c +@@ -1234,8 +1234,8 @@ GenericLegacyBoot ( + // + Private->LegacyRegion->Lock ( + Private->LegacyRegion, +- 0xc0000, +- 0x40000, ++ 0xe0000, ++ 0x10000, + &Granularity + ); + +-- +1.8.3.1 + diff --git a/recipes-openxt/xenclient/ovmf/files/0001-pick-up-any-display-device-not-only-vga.patch b/recipes-openxt/xenclient/ovmf/files/0001-pick-up-any-display-device-not-only-vga.patch new file mode 100644 index 0000000000..de874d2a09 --- /dev/null +++ b/recipes-openxt/xenclient/ovmf/files/0001-pick-up-any-display-device-not-only-vga.patch @@ -0,0 +1,25 @@ +From 71de9d92e78ae0a7c351f9daf84109bbbaca400a Mon Sep 17 00:00:00 2001 +From: Gerd Hoffmann +Date: Thu, 13 Mar 2014 08:08:41 +0100 +Subject: [PATCH] pick up any display device, not only vga + +--- + OvmfPkg/Library/PlatformBdsLib/BdsPlatform.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/OvmfPkg/Library/PlatformBdsLib/BdsPlatform.c b/OvmfPkg/Library/PlatformBdsLib/BdsPlatform.c +index ab9c93e..d3f5908 100644 +--- a/OvmfPkg/Library/PlatformBdsLib/BdsPlatform.c ++++ b/OvmfPkg/Library/PlatformBdsLib/BdsPlatform.c +@@ -593,7 +593,7 @@ DetectAndPreparePlatformPciDevicePath ( + // + // Here we decide which VGA device to enable in PCI bus + // +- if (IS_PCI_VGA (Pci)) { ++ if (IS_PCI_DISPLAY (Pci)) { + // + // Add them to ConOut. + // +-- +1.8.3.1 + diff --git a/recipes-openxt/xenclient/ovmf/files/0001-tools_def.template-take-GCC4-_-IA32-X64-prefixes-fro.patch b/recipes-openxt/xenclient/ovmf/files/0001-tools_def.template-take-GCC4-_-IA32-X64-prefixes-fro.patch new file mode 100644 index 0000000000..2e2c9fc57f --- /dev/null +++ b/recipes-openxt/xenclient/ovmf/files/0001-tools_def.template-take-GCC4-_-IA32-X64-prefixes-fro.patch @@ -0,0 +1,66 @@ +From c2462a1fcd6cf2224e05bc437cb8625a594d70fe Mon Sep 17 00:00:00 2001 +From: Laszlo Ersek +Date: Wed, 29 Jan 2014 13:13:11 +0100 +Subject: [PATCH] tools_def.template: take GCC4?_(IA32|X64) prefixes from the + environment + +The default BaseTools compiler configuration hard-codes the prefix for gcc +(== /usr/bin). While this matches the gcc-4.x installation path on most +distributions, it prevents users from specifying gcc-4.x binaries in +different locations. + +Replace the hard-coded prefixes with environment variables. Users can set +the prefixes explicitly, or leave the variables unset, in which case PATH +will be searched as usual. + +A practical use case for this patch is distcc, installed in "masquerade +mode". edk2 supports parallel builds, and distcc can greatly speed it up. + +Signed-off-by: Laszlo Ersek +--- + BaseTools/Conf/tools_def.template | 24 ++++++++++++------------ + 1 file changed, 12 insertions(+), 12 deletions(-) + +diff --git a/BaseTools/Conf/tools_def.template b/BaseTools/Conf/tools_def.template +index c0f505c..53f3c8f 100644 +--- a/BaseTools/Conf/tools_def.template ++++ b/BaseTools/Conf/tools_def.template +@@ -165,23 +165,23 @@ DEFINE CYGWIN_BINIA32 = c:/cygwin/opt/tiano/i386-tiano-pe/i386-tiano-pe + DEFINE CYGWIN_BINX64 = c:/cygwin/opt/tiano/x86_64-pc-mingw64/x86_64-pc-mingw64/bin/ + DEFINE CYGWIN_BINIPF = c:/cygwin/opt/tiano/gcc/ipf/bin/ia64-pc-elf- + +-DEFINE GCC44_IA32_PREFIX = ENV(GCC44_BIN) +-DEFINE GCC44_X64_PREFIX = ENV(GCC44_BIN) ++DEFINE GCC44_IA32_PREFIX = ENV(GCC44_BIN)ENV(GCC44_IA32_PREFIX) ++DEFINE GCC44_X64_PREFIX = ENV(GCC44_BIN)ENV(GCC44_X64_PREFIX) + +-DEFINE GCC45_IA32_PREFIX = ENV(GCC45_BIN) +-DEFINE GCC45_X64_PREFIX = ENV(GCC45_BIN) ++DEFINE GCC45_IA32_PREFIX = ENV(GCC45_BIN)ENV(GCC45_IA32_PREFIX) ++DEFINE GCC45_X64_PREFIX = ENV(GCC45_BIN)ENV(GCC45_X64_PREFIX) + +-DEFINE GCC46_IA32_PREFIX = ENV(GCC46_BIN) +-DEFINE GCC46_X64_PREFIX = ENV(GCC46_BIN) ++DEFINE GCC46_IA32_PREFIX = ENV(GCC46_BIN)ENV(GCC46_IA32_PREFIX) ++DEFINE GCC46_X64_PREFIX = ENV(GCC46_BIN)ENV(GCC46_X64_PREFIX) + +-DEFINE GCC47_IA32_PREFIX = ENV(GCC47_BIN) +-DEFINE GCC47_X64_PREFIX = ENV(GCC47_BIN) ++DEFINE GCC47_IA32_PREFIX = ENV(GCC47_BIN)ENV(GCC47_IA32_PREFIX) ++DEFINE GCC47_X64_PREFIX = ENV(GCC47_BIN)ENV(GCC47_X64_PREFIX) + +-DEFINE GCC48_IA32_PREFIX = ENV(GCC48_BIN) +-DEFINE GCC48_X64_PREFIX = ENV(GCC48_BIN) ++DEFINE GCC48_IA32_PREFIX = ENV(GCC48_BIN)ENV(GCC48_IA32_PREFIX) ++DEFINE GCC48_X64_PREFIX = ENV(GCC48_BIN)ENV(GCC48_X64_PREFIX) + +-DEFINE GCC49_IA32_PREFIX = ENV(GCC49_BIN) +-DEFINE GCC49_X64_PREFIX = ENV(GCC49_BIN) ++DEFINE GCC49_IA32_PREFIX = ENV(GCC49_BIN)ENV(GCC49_IA32_PREFIX) ++DEFINE GCC49_X64_PREFIX = ENV(GCC49_BIN)ENV(GCC49_X64_PREFIX) + + DEFINE UNIX_IASL_BIN = ENV(IASL_PREFIX)iasl + DEFINE WIN_ASL_BIN_DIR = C:\ASL +-- +1.8.3.1 + diff --git a/recipes-openxt/xenclient/ovmf/files/0002-OvmfPkg-SmbiosPlatformDxe-install-patch-default-lega.patch b/recipes-openxt/xenclient/ovmf/files/0002-OvmfPkg-SmbiosPlatformDxe-install-patch-default-lega.patch new file mode 100644 index 0000000000..8a4d751ada --- /dev/null +++ b/recipes-openxt/xenclient/ovmf/files/0002-OvmfPkg-SmbiosPlatformDxe-install-patch-default-lega.patch @@ -0,0 +1,272 @@ +From 26146b77f6d54c44fbb984bacf8bf31683e8d477 Mon Sep 17 00:00:00 2001 +From: Laszlo Ersek +Date: Wed, 5 Jun 2013 10:25:13 +0200 +Subject: [PATCH 2/3] OvmfPkg/SmbiosPlatformDxe: install+patch default legacy + type0 table (X86) + +Contributed-under: TianoCore Contribution Agreement 1.0 +Signed-off-by: Laszlo Ersek +--- + OvmfPkg/SmbiosPlatformDxe/QemuLegacy.c | 5 +- + OvmfPkg/SmbiosPlatformDxe/QemuLegacyInternal.h | 30 ++++ + OvmfPkg/SmbiosPlatformDxe/QemuType0.c | 180 ++++++++++++++++++++++++ + OvmfPkg/SmbiosPlatformDxe/SmbiosPlatformDxe.inf | 1 + + 4 files changed, 215 insertions(+), 1 deletion(-) + create mode 100644 OvmfPkg/SmbiosPlatformDxe/QemuType0.c + +diff --git a/OvmfPkg/SmbiosPlatformDxe/QemuLegacy.c b/OvmfPkg/SmbiosPlatformDxe/QemuLegacy.c +index 9c57558..ed75a01 100644 +--- a/OvmfPkg/SmbiosPlatformDxe/QemuLegacy.c ++++ b/OvmfPkg/SmbiosPlatformDxe/QemuLegacy.c +@@ -628,7 +628,10 @@ InstallDefaultTables ( + IN OUT BUILD_CONTEXT *Context + ) + { +- return EFI_SUCCESS; ++ EFI_STATUS Status; ++ ++ Status = InstallSmbiosType0 (Smbios, ProducerHandle, Context); ++ return Status; + } + + +diff --git a/OvmfPkg/SmbiosPlatformDxe/QemuLegacyInternal.h b/OvmfPkg/SmbiosPlatformDxe/QemuLegacyInternal.h +index 8613407..ca776b5 100644 +--- a/OvmfPkg/SmbiosPlatformDxe/QemuLegacyInternal.h ++++ b/OvmfPkg/SmbiosPlatformDxe/QemuLegacyInternal.h +@@ -218,4 +218,34 @@ PatchSmbiosUnformatted ( + IN UINT8 *TableBase + ); + ++ ++/** ++ Install default (fallback) table for SMBIOS Type 0. ++ ++ In case QEMU has provided no Type 0 SMBIOS table in whole, prepare one here, ++ patch it with any referring saved patches, and install it. ++ ++ @param[in] Smbios The EFI_SMBIOS_PROTOCOL instance used for ++ installing SMBIOS tables. ++ @param[in] ProducerHandle Passed on to Smbios->Add(), ProducerHandle ++ tracks the origin of installed SMBIOS tables. ++ @param[in,out] Context The BUILD_CONTEXT object tracking installed ++ tables and saved patches. ++ ++ @retval EFI_SUCCESS A Type 0 table has already been installed from the ++ SMBIOS firmware configuration blob. ++ @retval EFI_SUCCESS No Type 0 table was installed previously, and installing ++ the default here has succeeded. ++ @return Error codes from the PATCH_FORMATTED() and ++ PATCH_UNFORMATTED() macros, except EFI_NOT_FOUND, which ++ is only an informative result of theirs. ++**/ ++EFI_STATUS ++EFIAPI ++InstallSmbiosType0 ( ++ IN EFI_SMBIOS_PROTOCOL *Smbios, ++ IN EFI_HANDLE ProducerHandle, ++ IN OUT BUILD_CONTEXT *Context ++ ); ++ + #endif +diff --git a/OvmfPkg/SmbiosPlatformDxe/QemuType0.c b/OvmfPkg/SmbiosPlatformDxe/QemuType0.c +new file mode 100644 +index 0000000..9ec5d76 +--- /dev/null ++++ b/OvmfPkg/SmbiosPlatformDxe/QemuType0.c +@@ -0,0 +1,180 @@ ++/** @file ++ Install the default Type 0 SMBIOS table if QEMU doesn't provide one through ++ the firmware configuration interface. ++ ++ Copyright (C) 2013, Red Hat, Inc. ++ ++ This program and the accompanying materials are licensed and made available ++ under the terms and conditions of the BSD License which accompanies this ++ distribution. The full text of the license may be found at ++ http://opensource.org/licenses/bsd-license.php ++ ++ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, WITHOUT ++ WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. ++**/ ++ ++#include "QemuLegacyInternal.h" ++ ++ ++// ++// Text strings (unformatted area) for the default Tpe 0 SMBIOS table. ++// ++// All possible strings must be provided because Smbios->UpdateString() can ++// only update existing strings, it can't introduce new ones. ++// ++#define OVMF_TYPE0_STRINGS \ ++ "EFI Development Kit II / OVMF\0" /* Vendor */ \ ++ "0.1\0" /* BiosVersion */ \ ++ "06/03/2013\0" /* BiosReleaseDate */ ++ ++ ++// ++// Type definition and contents of the default Type 0 SMBIOS table. ++// ++#pragma pack(1) ++OVMF_SMBIOS (0); ++#pragma pack() ++ ++STATIC CONST OVMF_TYPE0 mOvmfType0 = { ++ { ++ // SMBIOS_STRUCTURE Hdr ++ { ++ EFI_SMBIOS_TYPE_BIOS_INFORMATION, // UINT8 Type ++ sizeof (SMBIOS_TABLE_TYPE0) // UINT8 Length ++ }, ++ 1, // SMBIOS_TABLE_STRING Vendor ++ 2, // SMBIOS_TABLE_STRING BiosVersion ++ 0xE800,// UINT16 BiosSegment ++ 3, // SMBIOS_TABLE_STRING BiosReleaseDate ++ 0, // UINT8 BiosSize ++ { 0 }, // MISC_BIOS_CHARACTERISTICS BiosCharacteristics ++ { 0 }, // UINT8 BIOSCharacteristicsExtensionBytes[2] ++ 0, // UINT8 SystemBiosMajorRelease ++ 1, // UINT8 SystemBiosMinorRelease ++ 0xFF, // UINT8 EmbeddedControllerFirmwareMajorRelease ++ 0xFF // UINT8 EmbeddedControllerFirmwareMinorRelease ++ }, ++ OVMF_TYPE0_STRINGS ++}; ++ ++ ++/** ++ Install default (fallback) table for SMBIOS Type 0. ++ ++ In case QEMU has provided no Type 0 SMBIOS table in whole, prepare one here, ++ patch it with any referring saved patches, and install it. ++ ++ @param[in] Smbios The EFI_SMBIOS_PROTOCOL instance used for ++ installing SMBIOS tables. ++ @param[in] ProducerHandle Passed on to Smbios->Add(), ProducerHandle ++ tracks the origin of installed SMBIOS tables. ++ @param[in,out] Context The BUILD_CONTEXT object tracking installed ++ tables and saved patches. ++ ++ @retval EFI_SUCCESS A Type 0 table has already been installed from the ++ SMBIOS firmware configuration blob. ++ @retval EFI_SUCCESS No Type 0 table was installed previously, and installing ++ the default here has succeeded. ++ @return Error codes from the PATCH_FORMATTED() and ++ PATCH_UNFORMATTED() macros, except EFI_NOT_FOUND, which ++ is only an informative result of theirs. ++**/ ++EFI_STATUS ++EFIAPI ++InstallSmbiosType0 ( ++ IN EFI_SMBIOS_PROTOCOL *Smbios, ++ IN EFI_HANDLE ProducerHandle, ++ IN OUT BUILD_CONTEXT *Context ++ ) ++{ ++ TABLE_CONTEXT *Table; ++ OVMF_TYPE0 OvmfType0; ++ MISC_BIOS_CHARACTERISTICS_EXTENSION *Ext; ++ EFI_STATUS Status; ++ EFI_SMBIOS_HANDLE SmbiosHandle; ++ ++ Table = &Context->Table[0]; ++ if (Table->Installed) { ++ return EFI_SUCCESS; ++ } ++ ++ CopyMem (&OvmfType0, &mOvmfType0, sizeof OvmfType0); ++ Ext = (VOID *) &OvmfType0.Base.BIOSCharacteristicsExtensionBytes[0]; ++ ++ OvmfType0.Base.BiosCharacteristics.BiosCharacteristicsNotSupported = 1; ++ Ext->SystemReserved.UefiSpecificationSupported = 1; ++ Ext->SystemReserved.VirtualMachineSupported = 1; ++ ++ // ++ // Default contents ready. Formatted fields must be patched before installing ++ // the table, while strings in the unformatted area will be patched ++ // afterwards. ++ // ++ Status = PATCH_FORMATTED (Context, 0, &OvmfType0, BiosSegment); ++ if (Status != EFI_NOT_FOUND && Status != EFI_SUCCESS) { ++ return Status; ++ } ++ Status = PATCH_FORMATTED (Context, 0, &OvmfType0, BiosSize); ++ if (Status != EFI_NOT_FOUND && Status != EFI_SUCCESS) { ++ return Status; ++ } ++ Status = PATCH_FORMATTED (Context, 0, &OvmfType0, BiosCharacteristics); ++ if (Status != EFI_NOT_FOUND && Status != EFI_SUCCESS) { ++ return Status; ++ } ++ Status = PATCH_FORMATTED (Context, 0, &OvmfType0, ++ BIOSCharacteristicsExtensionBytes); ++ if (Status != EFI_NOT_FOUND && Status != EFI_SUCCESS) { ++ return Status; ++ } ++ Status = PATCH_FORMATTED (Context, 0, &OvmfType0, SystemBiosMajorRelease); ++ if (Status != EFI_NOT_FOUND && Status != EFI_SUCCESS) { ++ return Status; ++ } ++ Status = PATCH_FORMATTED (Context, 0, &OvmfType0, SystemBiosMinorRelease); ++ if (Status != EFI_NOT_FOUND && Status != EFI_SUCCESS) { ++ return Status; ++ } ++ Status = PATCH_FORMATTED (Context, 0, &OvmfType0, ++ EmbeddedControllerFirmwareMajorRelease); ++ if (Status != EFI_NOT_FOUND && Status != EFI_SUCCESS) { ++ return Status; ++ } ++ Status = PATCH_FORMATTED (Context, 0, &OvmfType0, ++ EmbeddedControllerFirmwareMinorRelease); ++ if (Status != EFI_NOT_FOUND && Status != EFI_SUCCESS) { ++ return Status; ++ } ++ ++ // ++ // Install SMBIOS table with patched formatted area and default strings. ++ // ++ SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED; ++ Status = Smbios->Add (Smbios, ProducerHandle, &SmbiosHandle, ++ (EFI_SMBIOS_TABLE_HEADER *) &OvmfType0); ++ if (EFI_ERROR (Status)) { ++ DEBUG ((DEBUG_ERROR, "%a: Smbios->Add(): %r\n", __FUNCTION__, Status)); ++ return Status; ++ } ++ Table->Installed = TRUE; ++ ++ // ++ // Patch strings in the unformatted area of the installed table. ++ // ++ Status = PATCH_UNFORMATTED (Smbios, SmbiosHandle, Context, 0, &OvmfType0, ++ Vendor); ++ if (Status != EFI_NOT_FOUND && Status != EFI_SUCCESS) { ++ return Status; ++ } ++ Status = PATCH_UNFORMATTED (Smbios, SmbiosHandle, Context, 0, &OvmfType0, ++ BiosVersion); ++ if (Status != EFI_NOT_FOUND && Status != EFI_SUCCESS) { ++ return Status; ++ } ++ Status = PATCH_UNFORMATTED (Smbios, SmbiosHandle, Context, 0, &OvmfType0, ++ BiosReleaseDate); ++ if (Status != EFI_NOT_FOUND && Status != EFI_SUCCESS) { ++ return Status; ++ } ++ return EFI_SUCCESS; ++} +diff --git a/OvmfPkg/SmbiosPlatformDxe/SmbiosPlatformDxe.inf b/OvmfPkg/SmbiosPlatformDxe/SmbiosPlatformDxe.inf +index 8c9f43c..3483b9c 100644 +--- a/OvmfPkg/SmbiosPlatformDxe/SmbiosPlatformDxe.inf ++++ b/OvmfPkg/SmbiosPlatformDxe/SmbiosPlatformDxe.inf +@@ -37,6 +37,7 @@ + [Sources.IA32, Sources.X64] + X86Xen.c + QemuLegacy.c ++ QemuType0.c + + [Sources.ARM, Sources.AARCH64] + ArmXen.c +-- +1.8.3.1 + diff --git a/recipes-openxt/xenclient/ovmf/files/0003-OvmfPkg-SmbiosPlatformDxe-install-patch-default-lega.patch b/recipes-openxt/xenclient/ovmf/files/0003-OvmfPkg-SmbiosPlatformDxe-install-patch-default-lega.patch new file mode 100644 index 0000000000..bf2254fa18 --- /dev/null +++ b/recipes-openxt/xenclient/ovmf/files/0003-OvmfPkg-SmbiosPlatformDxe-install-patch-default-lega.patch @@ -0,0 +1,270 @@ +From 1b10131728dd1cff48ef1ce46820d89f21708852 Mon Sep 17 00:00:00 2001 +From: Laszlo Ersek +Date: Wed, 5 Jun 2013 10:28:09 +0200 +Subject: [PATCH 3/3] OvmfPkg/SmbiosPlatformDxe: install+patch default legacy + type1 table (X86) + +Contributed-under: TianoCore Contribution Agreement 1.0 +Signed-off-by: Laszlo Ersek +--- + OvmfPkg/SmbiosPlatformDxe/QemuLegacy.c | 5 + + OvmfPkg/SmbiosPlatformDxe/QemuLegacyInternal.h | 30 ++++ + OvmfPkg/SmbiosPlatformDxe/QemuType1.c | 178 ++++++++++++++++++++++++ + OvmfPkg/SmbiosPlatformDxe/SmbiosPlatformDxe.inf | 1 + + 4 files changed, 214 insertions(+) + create mode 100644 OvmfPkg/SmbiosPlatformDxe/QemuType1.c + +diff --git a/OvmfPkg/SmbiosPlatformDxe/QemuLegacy.c b/OvmfPkg/SmbiosPlatformDxe/QemuLegacy.c +index ed75a01..6507cc0 100644 +--- a/OvmfPkg/SmbiosPlatformDxe/QemuLegacy.c ++++ b/OvmfPkg/SmbiosPlatformDxe/QemuLegacy.c +@@ -631,6 +631,11 @@ InstallDefaultTables ( + EFI_STATUS Status; + + Status = InstallSmbiosType0 (Smbios, ProducerHandle, Context); ++ if (EFI_ERROR (Status)) { ++ return Status; ++ } ++ ++ Status = InstallSmbiosType1 (Smbios, ProducerHandle, Context); + return Status; + } + +diff --git a/OvmfPkg/SmbiosPlatformDxe/QemuLegacyInternal.h b/OvmfPkg/SmbiosPlatformDxe/QemuLegacyInternal.h +index ca776b5..4a2e824 100644 +--- a/OvmfPkg/SmbiosPlatformDxe/QemuLegacyInternal.h ++++ b/OvmfPkg/SmbiosPlatformDxe/QemuLegacyInternal.h +@@ -248,4 +248,34 @@ InstallSmbiosType0 ( + IN OUT BUILD_CONTEXT *Context + ); + ++ ++/** ++ Install default (fallback) table for SMBIOS Type 1. ++ ++ In case QEMU has provided no Type 1 SMBIOS table in whole, prepare one here, ++ patch it with any referring saved patches, and install it. ++ ++ @param[in] Smbios The EFI_SMBIOS_PROTOCOL instance used for ++ installing SMBIOS tables. ++ @param[in] ProducerHandle Passed on to Smbios->Add(), ProducerHandle ++ tracks the origin of installed SMBIOS tables. ++ @param[in,out] Context The BUILD_CONTEXT object tracking installed ++ tables and saved patches. ++ ++ @retval EFI_SUCCESS A Type 1 table has already been installed from the ++ SMBIOS firmware configuration blob. ++ @retval EFI_SUCCESS No Type 1 table was installed previously, and installing ++ the default here has succeeded. ++ @return Error codes from the PATCH_FORMATTED() and ++ PATCH_UNFORMATTED() macros, except EFI_NOT_FOUND, which ++ is only an informative result of theirs. ++**/ ++EFI_STATUS ++EFIAPI ++InstallSmbiosType1 ( ++ IN EFI_SMBIOS_PROTOCOL *Smbios, ++ IN EFI_HANDLE ProducerHandle, ++ IN OUT BUILD_CONTEXT *Context ++ ); ++ + #endif +diff --git a/OvmfPkg/SmbiosPlatformDxe/QemuType1.c b/OvmfPkg/SmbiosPlatformDxe/QemuType1.c +new file mode 100644 +index 0000000..ff48164 +--- /dev/null ++++ b/OvmfPkg/SmbiosPlatformDxe/QemuType1.c +@@ -0,0 +1,178 @@ ++/** @file ++ Install the default Type 1 SMBIOS table if QEMU doesn't provide one through ++ the firmware configuration interface. ++ ++ Copyright (C) 2013, Red Hat, Inc. ++ ++ This program and the accompanying materials are licensed and made available ++ under the terms and conditions of the BSD License which accompanies this ++ distribution. The full text of the license may be found at ++ http://opensource.org/licenses/bsd-license.php ++ ++ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, WITHOUT ++ WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. ++**/ ++ ++#include "QemuLegacyInternal.h" ++ ++ ++// ++// Text strings (unformatted area) for the default Tpe 1 SMBIOS table. ++// ++// All possible strings must be provided because Smbios->UpdateString() can ++// only update existing strings, it can't introduce new ones. ++// ++#define OVMF_TYPE1_STRINGS \ ++ "QEMU\0" /* Manufacturer */ \ ++ "QEMU Virtual Machine\0" /* ProductName */ \ ++ "n/a\0" /* Version */ \ ++ "n/a\0" /* SerialNumber */ \ ++ "n/a\0" /* SKUNumber */ \ ++ "n/a\0" /* Family */ ++ ++ ++// ++// Type definition and contents of the default Type 1 SMBIOS table. ++// ++#pragma pack(1) ++OVMF_SMBIOS (1); ++#pragma pack() ++ ++STATIC CONST OVMF_TYPE1 mOvmfType1 = { ++ { ++ // SMBIOS_STRUCTURE Hdr ++ { ++ EFI_SMBIOS_TYPE_SYSTEM_INFORMATION, // UINT8 Type ++ sizeof (SMBIOS_TABLE_TYPE1) // UINT8 Length ++ }, ++ 1, // SMBIOS_TABLE_STRING Manufacturer ++ 2, // SMBIOS_TABLE_STRING ProductName ++ 3, // SMBIOS_TABLE_STRING Version ++ 4, // SMBIOS_TABLE_STRING SerialNumber ++ { 0 }, // GUID Uuid ++ SystemWakeupTypePowerSwitch, // UINT8 WakeUpType ++ 5, // SMBIOS_TABLE_STRING SKUNumber ++ 6, // SMBIOS_TABLE_STRING Family ++ }, ++ OVMF_TYPE1_STRINGS ++}; ++ ++ ++/** ++ Install default (fallback) table for SMBIOS Type 1. ++ ++ In case QEMU has provided no Type 1 SMBIOS table in whole, prepare one here, ++ patch it with any referring saved patches, and install it. ++ ++ @param[in] Smbios The EFI_SMBIOS_PROTOCOL instance used for ++ installing SMBIOS tables. ++ @param[in] ProducerHandle Passed on to Smbios->Add(), ProducerHandle ++ tracks the origin of installed SMBIOS tables. ++ @param[in,out] Context The BUILD_CONTEXT object tracking installed ++ tables and saved patches. ++ ++ @retval EFI_SUCCESS A Type 1 table has already been installed from the ++ SMBIOS firmware configuration blob. ++ @retval EFI_SUCCESS No Type 1 table was installed previously, and installing ++ the default here has succeeded. ++ @return Error codes from the PATCH_FORMATTED() and ++ PATCH_UNFORMATTED() macros, except EFI_NOT_FOUND, which ++ is only an informative result of theirs. ++**/ ++EFI_STATUS ++EFIAPI ++InstallSmbiosType1 ( ++ IN EFI_SMBIOS_PROTOCOL *Smbios, ++ IN EFI_HANDLE ProducerHandle, ++ IN OUT BUILD_CONTEXT *Context ++ ) ++{ ++ TABLE_CONTEXT *Table; ++ OVMF_TYPE1 OvmfType1; ++ EFI_STATUS Status; ++ EFI_SMBIOS_HANDLE SmbiosHandle; ++ ++ Table = &Context->Table[1]; ++ if (Table->Installed) { ++ return EFI_SUCCESS; ++ } ++ ++ CopyMem (&OvmfType1, &mOvmfType1, sizeof OvmfType1); ++ ++ QemuFwCfgSelectItem (QemuFwCfgItemSystemUuid); ++ OvmfType1.Base.Uuid.Data1 = SwapBytes32 (QemuFwCfgRead32 ()); ++ OvmfType1.Base.Uuid.Data2 = SwapBytes16 (QemuFwCfgRead16 ()); ++ OvmfType1.Base.Uuid.Data3 = SwapBytes16 (QemuFwCfgRead16 ()); ++ QemuFwCfgReadBytes (sizeof OvmfType1.Base.Uuid.Data4, ++ &OvmfType1.Base.Uuid.Data4); ++ ++ // ++ // Default contents ready. Formatted fields must be patched before installing ++ // the table, while strings in the unformatted area will be patched ++ // afterwards. ++ // ++ Status = PATCH_FORMATTED (Context, 1, &OvmfType1, Uuid); ++ switch (Status) { ++ case EFI_NOT_FOUND: ++ break; ++ case EFI_SUCCESS: ++ OvmfType1.Base.Uuid.Data1 = SwapBytes32 (OvmfType1.Base.Uuid.Data1); ++ OvmfType1.Base.Uuid.Data2 = SwapBytes16 (OvmfType1.Base.Uuid.Data2); ++ OvmfType1.Base.Uuid.Data3 = SwapBytes16 (OvmfType1.Base.Uuid.Data3); ++ break; ++ default: ++ return Status; ++ } ++ ++ Status = PATCH_FORMATTED (Context, 1, &OvmfType1, WakeUpType); ++ if (Status != EFI_NOT_FOUND && Status != EFI_SUCCESS) { ++ return Status; ++ } ++ ++ // ++ // Install SMBIOS table with patched formatted area and default strings. ++ // ++ SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED; ++ Status = Smbios->Add (Smbios, ProducerHandle, &SmbiosHandle, ++ (EFI_SMBIOS_TABLE_HEADER *) &OvmfType1); ++ if (EFI_ERROR (Status)) { ++ DEBUG ((DEBUG_ERROR, "%a: Smbios->Add(): %r\n", __FUNCTION__, Status)); ++ return Status; ++ } ++ Table->Installed = TRUE; ++ ++ // ++ // Patch strings in the unformatted area of the installed table. ++ // ++ Status = PATCH_UNFORMATTED (Smbios, SmbiosHandle, Context, 1, &OvmfType1, ++ Manufacturer); ++ if (Status != EFI_NOT_FOUND && Status != EFI_SUCCESS) { ++ return Status; ++ } ++ Status = PATCH_UNFORMATTED (Smbios, SmbiosHandle, Context, 1, &OvmfType1, ++ ProductName); ++ if (Status != EFI_NOT_FOUND && Status != EFI_SUCCESS) { ++ return Status; ++ } ++ Status = PATCH_UNFORMATTED (Smbios, SmbiosHandle, Context, 1, &OvmfType1, ++ Version); ++ if (Status != EFI_NOT_FOUND && Status != EFI_SUCCESS) { ++ return Status; ++ } ++ Status = PATCH_UNFORMATTED (Smbios, SmbiosHandle, Context, 1, &OvmfType1, ++ SerialNumber); ++ if (Status != EFI_NOT_FOUND && Status != EFI_SUCCESS) { ++ return Status; ++ } ++ Status = PATCH_UNFORMATTED (Smbios, SmbiosHandle, Context, 1, &OvmfType1, ++ SKUNumber); ++ if (Status != EFI_NOT_FOUND && Status != EFI_SUCCESS) { ++ return Status; ++ } ++ Status = PATCH_UNFORMATTED (Smbios, SmbiosHandle, Context, 1, &OvmfType1, ++ Family); ++ if (Status != EFI_NOT_FOUND && Status != EFI_SUCCESS) { ++ return Status; ++ } ++ return EFI_SUCCESS; ++} +diff --git a/OvmfPkg/SmbiosPlatformDxe/SmbiosPlatformDxe.inf b/OvmfPkg/SmbiosPlatformDxe/SmbiosPlatformDxe.inf +index 3483b9c..1f7dfca 100644 +--- a/OvmfPkg/SmbiosPlatformDxe/SmbiosPlatformDxe.inf ++++ b/OvmfPkg/SmbiosPlatformDxe/SmbiosPlatformDxe.inf +@@ -38,6 +38,7 @@ + X86Xen.c + QemuLegacy.c + QemuType0.c ++ QemuType1.c + + [Sources.ARM, Sources.AARCH64] + ArmXen.c +-- +1.8.3.1 + diff --git a/recipes-openxt/xenclient/ovmf/files/ovmf-q35-xen-support.patch b/recipes-openxt/xenclient/ovmf/files/ovmf-q35-xen-support.patch new file mode 100644 index 0000000000..56e5d22f0a --- /dev/null +++ b/recipes-openxt/xenclient/ovmf/files/ovmf-q35-xen-support.patch @@ -0,0 +1,662 @@ +diff --git a/MdeModulePkg/Bus/Pci/PciBusDxe/PciDeviceSupport.c b/MdeModulePkg/Bus/Pci/PciBusDxe/PciDeviceSupport.c +index c0227fa..f30b789 100644 +--- a/MdeModulePkg/Bus/Pci/PciBusDxe/PciDeviceSupport.c ++++ b/MdeModulePkg/Bus/Pci/PciBusDxe/PciDeviceSupport.c +@@ -799,6 +799,7 @@ StartPciDevices ( + IN EFI_HANDLE Controller + ) + { ++#if 0 + PCI_IO_DEVICE *RootBridge; + EFI_HANDLE ThisHostBridge; + LIST_ENTRY *CurrentLink; +@@ -827,8 +828,30 @@ StartPciDevices ( + + CurrentLink = CurrentLink->ForwardLink; + } ++#else ++ PCI_IO_DEVICE *RootBridge; ++ LIST_ENTRY *CurrentLink; ++ ++ CurrentLink = mPciDevicePool.ForwardLink; ++ ++ while (CurrentLink != NULL && CurrentLink != &mPciDevicePool) { ++ ++ RootBridge = PCI_IO_DEVICE_FROM_LINK (CurrentLink); ++ // ++ // Locate the right root bridge to start ++ // ++ StartPciDevicesOnBridge ( ++ RootBridge->Handle, ++ RootBridge, ++ NULL, ++ NULL, ++ NULL ++ ); + ++ CurrentLink = CurrentLink->ForwardLink; ++ } + return EFI_SUCCESS; ++#endif + } + + /** +diff --git a/MdeModulePkg/Bus/Pci/PciHostBridgeDxe/PciRootBridgeIo.c b/MdeModulePkg/Bus/Pci/PciHostBridgeDxe/PciRootBridgeIo.c +index cda9b49..e12a51b 100644 +--- a/MdeModulePkg/Bus/Pci/PciHostBridgeDxe/PciRootBridgeIo.c ++++ b/MdeModulePkg/Bus/Pci/PciHostBridgeDxe/PciRootBridgeIo.c +@@ -98,24 +98,28 @@ CreateRootBridge ( + if (Bridge->Mem.Base < Bridge->Mem.Limit) { + ASSERT (Bridge->Mem.Limit < SIZE_4GB); + if (Bridge->Mem.Limit >= SIZE_4GB) { ++ ASSERT(!"Root bridge sadness #0"); + return NULL; + } + } + if (Bridge->MemAbove4G.Base < Bridge->MemAbove4G.Limit) { + ASSERT (Bridge->MemAbove4G.Base >= SIZE_4GB); + if (Bridge->MemAbove4G.Base < SIZE_4GB) { ++ ASSERT(!"Root bridge sadness #1"); + return NULL; + } + } + if (Bridge->PMem.Base < Bridge->PMem.Limit) { + ASSERT (Bridge->PMem.Limit < SIZE_4GB); + if (Bridge->PMem.Limit >= SIZE_4GB) { ++ ASSERT(!"Root bridge sadness #2"); + return NULL; + } + } + if (Bridge->PMemAbove4G.Base < Bridge->PMemAbove4G.Limit) { + ASSERT (Bridge->PMemAbove4G.Base >= SIZE_4GB); + if (Bridge->PMemAbove4G.Base < SIZE_4GB) { ++ ASSERT(!"Root bridge sadness #3"); + return NULL; + } + } +@@ -131,6 +135,7 @@ CreateRootBridge ( + if ((Bridge->PMem.Base < Bridge->PMem.Limit) || + (Bridge->PMemAbove4G.Base < Bridge->PMemAbove4G.Limit) + ) { ++ ASSERT(!"Root bridge sadness #4"); + return NULL; + } + } +@@ -145,9 +150,11 @@ CreateRootBridge ( + if ((Bridge->MemAbove4G.Base < Bridge->MemAbove4G.Limit) || + (Bridge->PMemAbove4G.Base < Bridge->PMemAbove4G.Limit) + ) { ++ ASSERT(!"Root bridge sadness #5"); + return NULL; + } + } ++ DEBUG ((EFI_D_INFO, "FISH FISH FISH Rootbridge OK\n")); + + RootBridge = AllocateZeroPool (sizeof (PCI_ROOT_BRIDGE_INSTANCE)); + ASSERT (RootBridge != NULL); +diff --git a/OvmfPkg/AcpiPlatformDxe/AcpiPlatform.c b/OvmfPkg/AcpiPlatformDxe/AcpiPlatform.c +index 61166c6..8840084 100644 +--- a/OvmfPkg/AcpiPlatformDxe/AcpiPlatform.c ++++ b/OvmfPkg/AcpiPlatformDxe/AcpiPlatform.c +@@ -14,6 +14,12 @@ + + #include "AcpiPlatform.h" + ++#define FISH \ ++ do { \ ++ DEBUG ((EFI_D_INFO, "%a:%a:%d\n", __FILE__,__FUNCTION__,__LINE__)); \ ++ } while (0) ++ ++ + EFI_STATUS + EFIAPI + InstallAcpiTable ( +@@ -246,16 +252,23 @@ InstallAcpiTables ( + { + EFI_STATUS Status; + ++ ++ FISH; ++ + if (XenDetected ()) { ++ FISH; + Status = InstallXenTables (AcpiTable); + } else { ++ FISH; + Status = InstallQemuFwCfgTables (AcpiTable); + } + + if (EFI_ERROR (Status)) { ++ FISH; + Status = InstallOvmfFvTables (AcpiTable); + } + ++ FISH; + return Status; + } + +diff --git a/OvmfPkg/AcpiPlatformDxe/EntryPoint.c b/OvmfPkg/AcpiPlatformDxe/EntryPoint.c +index d713b0d..5bc9e4d 100644 +--- a/OvmfPkg/AcpiPlatformDxe/EntryPoint.c ++++ b/OvmfPkg/AcpiPlatformDxe/EntryPoint.c +@@ -65,7 +65,9 @@ AcpiPlatformEntryPoint ( + EFI_STATUS Status; + VOID *Interface; + EFI_EVENT PciEnumerated; ++#if 0 + VOID *Registration; ++#endif + + // + // If the platform doesn't support PCI, or PCI enumeration has been disabled, +@@ -102,6 +104,7 @@ AcpiPlatformEntryPoint ( + return Status; + } + ++#if 0 + Status = gBS->RegisterProtocolNotify ( + &gEfiPciEnumerationCompleteProtocolGuid, PciEnumerated, + &Registration); +@@ -111,6 +114,11 @@ AcpiPlatformEntryPoint ( + DEBUG ((EFI_D_INFO, "%a: PCI enumeration pending, registered callback\n", + __FUNCTION__)); + } ++#else ++ DEBUG ((EFI_D_INFO, "%a: Screw this - installing ACPI anyway\n", ++ __FUNCTION__)); ++ return InstallAcpiTables (FindAcpiTableProtocol ()); ++#endif + + return Status; + } +diff --git a/OvmfPkg/AcpiPlatformDxe/Xen.c b/OvmfPkg/AcpiPlatformDxe/Xen.c +index 618ac58..c7c7f1d 100644 +--- a/OvmfPkg/AcpiPlatformDxe/Xen.c ++++ b/OvmfPkg/AcpiPlatformDxe/Xen.c +@@ -24,6 +24,11 @@ + + EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER *XenAcpiRsdpStructurePtr = NULL; + ++#define FISH \ ++ do { \ ++ DEBUG ((EFI_D_INFO, "%a:%a:%d\n", __FILE__,__FUNCTION__,__LINE__)); \ ++ } while (0) ++ + /** + This function detects if OVMF is running on Xen. + +@@ -155,19 +160,24 @@ InstallXenTables ( + TableHandle = 0; + NumberOfTableEntries = 0; + ++ ++ FISH; + // + // Try to find Xen ACPI tables + // + Status = GetXenAcpiRsdp (&XenAcpiRsdpStructurePtr); + if (EFI_ERROR (Status)) { ++ FISH; + return Status; + } + ++ FISH; + // + // If XSDT table is find, just install its tables. + // Otherwise, try to find and install the RSDT tables. + // + if (XenAcpiRsdpStructurePtr->XsdtAddress) { ++ FISH; + // + // Retrieve the addresses of XSDT and + // calculate the number of its table entries. +@@ -182,6 +192,7 @@ InstallXenTables ( + // Install ACPI tables found in XSDT. + // + for (Index = 0; Index < NumberOfTableEntries; Index++) { ++ FISH; + // + // Get the table entry from XSDT + // +@@ -202,6 +213,7 @@ InstallXenTables ( + ); + + if (EFI_ERROR (Status)) { ++ FISH; + return Status; + } + +@@ -209,6 +221,7 @@ InstallXenTables ( + // Get the FACS and DSDT table address from the table FADT + // + if (!AsciiStrnCmp ((CHAR8 *) &CurrentTable->Signature, "FACP", 4)) { ++ FISH; + Fadt2Table = (EFI_ACPI_2_0_FIXED_ACPI_DESCRIPTION_TABLE *) + (UINTN) CurrentTablePointer; + Facs2Table = (EFI_ACPI_2_0_FIRMWARE_ACPI_CONTROL_STRUCTURE *) +@@ -218,6 +231,7 @@ InstallXenTables ( + } + } + else if (XenAcpiRsdpStructurePtr->RsdtAddress) { ++ FISH; + // + // Retrieve the addresses of RSDT and + // calculate the number of its table entries. +@@ -232,6 +246,7 @@ InstallXenTables ( + // Install ACPI tables found in XSDT. + // + for (Index = 0; Index < NumberOfTableEntries; Index++) { ++ FISH; + // + // Get the table entry from RSDT + // +@@ -252,6 +267,7 @@ InstallXenTables ( + ); + + if (EFI_ERROR (Status)) { ++ FISH; + return Status; + } + +@@ -267,6 +283,7 @@ InstallXenTables ( + } + } + } ++ FISH; + + // + // Install the FACS table. +@@ -282,6 +299,7 @@ InstallXenTables ( + &TableHandle + ); + if (EFI_ERROR (Status)) { ++ FISH; + return Status; + } + } +@@ -296,10 +314,12 @@ InstallXenTables ( + &TableHandle + ); + if (EFI_ERROR (Status)) { ++ FISH; + return Status; + } + } + ++ FISH; + // + // Install DSDT table. + // +@@ -310,9 +330,11 @@ InstallXenTables ( + &TableHandle + ); + if (EFI_ERROR (Status)) { ++ FISH; + return Status; + } + ++ FISH; + return EFI_SUCCESS; + } + +diff --git a/OvmfPkg/EnrollDefaultKeys/EnrollDefaultKeys.c b/OvmfPkg/EnrollDefaultKeys/EnrollDefaultKeys.c +index 29de6e2..a3f8635 100644 +--- a/OvmfPkg/EnrollDefaultKeys/EnrollDefaultKeys.c ++++ b/OvmfPkg/EnrollDefaultKeys/EnrollDefaultKeys.c +@@ -843,18 +377,21 @@ GetSettings ( + &gEfiSecureBootEnableDisableGuid, &Settings->SecureBootEnable, + sizeof Settings->SecureBootEnable, TRUE); + if (EFI_ERROR (Status)) { +- return Status; ++ Settings->SecureBootEnable=FALSE; + } + + Status = GetExact (EFI_CUSTOM_MODE_NAME, &gEfiCustomModeEnableGuid, + &Settings->CustomMode, sizeof Settings->CustomMode, FALSE); + if (EFI_ERROR (Status)) { +- return Status; ++ Settings->CustomMode=TRUE; + } + + Status = GetExact (EFI_VENDOR_KEYS_VARIABLE_NAME, &gEfiGlobalVariableGuid, + &Settings->VendorKeys, sizeof Settings->VendorKeys, FALSE); +- return Status; ++ if (EFI_ERROR (Status)) { ++ Settings->VendorKeys=FALSE; ++ } ++ return EFI_SUCCESS; + } + + STATIC +@@ -881,14 +418,16 @@ ShellAppMain ( + SETTINGS Settings; + + Status = GetSettings (&Settings); ++#if 0 + if (EFI_ERROR (Status)) { + return 1; + } ++#endif + PrintSettings (&Settings); + + if (Settings.SetupMode != 1) { + AsciiPrint ("error: already in User Mode\n"); +- return 1; ++// return 1; + } + + if (Settings.CustomMode != CUSTOM_SECURE_BOOT_MODE) { +@@ -917,8 +464,7 @@ ShellAppMain ( + Status = EnrollListOfX509Certs ( + EFI_KEY_EXCHANGE_KEY_NAME, + &gEfiGlobalVariableGuid, +- ExampleCert, sizeof ExampleCert, &gEfiCallerIdGuid, + MicrosoftKEK, sizeof MicrosoftKEK, &gEfiCallerIdGuid, + NULL); + if (EFI_ERROR (Status)) { + return 1; +@@ -927,7 +473,7 @@ ShellAppMain ( + Status = EnrollListOfX509Certs ( + EFI_PLATFORM_KEY_NAME, + &gEfiGlobalVariableGuid, +- ExampleCert, sizeof ExampleCert, &gEfiGlobalVariableGuid, ++ MicrosoftKEK, sizeof MicrosoftKEK, &gEfiCallerIdGuid, + NULL); + if (EFI_ERROR (Status)) { + return 1; +diff --git a/OvmfPkg/Library/PlatformBdsLib/BdsPlatform.c b/OvmfPkg/Library/PlatformBdsLib/BdsPlatform.c +index e345b47..461f818 100644 +--- a/OvmfPkg/Library/PlatformBdsLib/BdsPlatform.c ++++ b/OvmfPkg/Library/PlatformBdsLib/BdsPlatform.c +@@ -1337,6 +1337,11 @@ Returns: + // + PlatformBdsConnectSequence (); + ++#ifdef TPM_ENABLED ++ TcgPhysicalPresenceLibProcessRequest(); ++#endif ++ ++ + // + // Process QEMU's -kernel command line option + // +diff --git a/OvmfPkg/OvmfPkg.dec b/OvmfPkg/OvmfPkg.dec +index 784542f..98c9d04 100644 +--- a/OvmfPkg/OvmfPkg.dec ++++ b/OvmfPkg/OvmfPkg.dec +@@ -65,6 +65,8 @@ + gXenBusProtocolGuid = {0x3d3ca290, 0xb9a5, 0x11e3, {0xb7, 0x5d, 0xb8, 0xac, 0x6f, 0x7d, 0x65, 0xe6}} + gXenIoProtocolGuid = {0x6efac84f, 0x0ab0, 0x4747, {0x81, 0xbe, 0x85, 0x55, 0x62, 0x59, 0x04, 0x49}} + ++ ++ + [PcdsFixedAtBuild] + gUefiOvmfPkgTokenSpaceGuid.PcdOvmfPeiMemFvBase|0x0|UINT32|0 + gUefiOvmfPkgTokenSpaceGuid.PcdOvmfPeiMemFvSize|0x0|UINT32|1 +@@ -72,7 +74,7 @@ + gUefiOvmfPkgTokenSpaceGuid.PcdOvmfDxeMemFvSize|0x0|UINT32|0x16 + + ## This flag is used to control the destination port for PlatformDebugLibIoPort +- gUefiOvmfPkgTokenSpaceGuid.PcdDebugIoPort|0x402|UINT16|4 ++ gUefiOvmfPkgTokenSpaceGuid.PcdDebugIoPort|0xe9|UINT16|4 + + ## This flag determines the Power Management Base Address of choice, written + # to PIIX4 function 3 offset 0x40-0x43 bits [15:6]. +diff --git a/OvmfPkg/OvmfPkgX64.dsc b/OvmfPkg/OvmfPkgX64.dsc +index a18858f..454dcff 100644 +--- a/OvmfPkg/OvmfPkgX64.dsc ++++ b/OvmfPkg/OvmfPkgX64.dsc +@@ -33,7 +33,8 @@ + # Defines for default states. These can be changed on the command line. + # -D FLAG=VALUE + # +- DEFINE SECURE_BOOT_ENABLE = FALSE ++ DEFINE SECURE_BOOT_ENABLE = TRUE ++ DEFINE TPM_ENABLED = TRUE + DEFINE NETWORK_IP6_ENABLE = FALSE + DEFINE HTTP_BOOT_ENABLE = FALSE + DEFINE SMM_REQUIRE = FALSE +@@ -129,11 +130,20 @@ + LocalApicLib|UefiCpuPkg/Library/BaseXApicX2ApicLib/BaseXApicX2ApicLib.inf + DebugPrintErrorLevelLib|MdePkg/Library/BaseDebugPrintErrorLevelLib/BaseDebugPrintErrorLevelLib.inf + ++!if $(TPM_ENABLED) == TRUE ++ TpmCommLib|SecurityPkg/Library/TpmCommLib/TpmCommLib.inf ++ Tpm12CommandLib|SecurityPkg/Library/Tpm12CommandLib/Tpm12CommandLib.inf ++ Tpm12DeviceLib|SecurityPkg/Library/Tpm12DeviceLibDTpm/Tpm12DeviceLibDTpm.inf ++!endif ++ + !if $(SECURE_BOOT_ENABLE) == TRUE + PlatformSecureLib|OvmfPkg/Library/PlatformSecureLib/PlatformSecureLib.inf + IntrinsicLib|CryptoPkg/Library/IntrinsicLib/IntrinsicLib.inf + OpensslLib|CryptoPkg/Library/OpensslLib/OpensslLib.inf + TpmMeasurementLib|SecurityPkg/Library/DxeTpmMeasurementLib/DxeTpmMeasurementLib.inf ++!if $(TPM_ENABLED) == TRUE ++ TrEEPhysicalPresenceLib|SecurityPkg/Library/DxeTrEEPhysicalPresenceLib/DxeTrEEPhysicalPresenceLib.inf ++!endif + AuthVariableLib|SecurityPkg/Library/AuthVariableLib/AuthVariableLib.inf + !if $(NETWORK_IP6_ENABLE) == TRUE + TcpIoLib|MdeModulePkg/Library/DxeTcpIoLib/DxeTcpIoLib.inf +@@ -225,6 +235,9 @@ + DebugLib|OvmfPkg/Library/PlatformDebugLibIoPort/PlatformDebugLibIoPort.inf + !endif + ExtractGuidedSectionLib|MdePkg/Library/DxeExtractGuidedSectionLib/DxeExtractGuidedSectionLib.inf ++!if $(TPM_ENABLED) == TRUE ++ TcgPhysicalPresenceLib|SecurityPkg/Library/DxeTcgPhysicalPresenceLib/DxeTcgPhysicalPresenceLib.inf ++!endif + !ifdef $(SOURCE_DEBUG_ENABLE) + DebugAgentLib|SourceLevelDebugPkg/Library/DebugAgent/DxeDebugAgentLib.inf + !endif +@@ -456,6 +469,12 @@ + gEfiMdeModulePkgTokenSpaceGuid.PcdSetNxForStack|FALSE + gEfiMdeModulePkgTokenSpaceGuid.PcdPropertiesTableEnable|FALSE + ++ !if $(TPM_ENABLED) == TRUE ++ gEfiSecurityPkgTokenSpaceGuid.PcdTpmInstanceGuid|{0x7b, 0x3a, 0xcd, 0x72, 0xA5, 0xFE, 0x5e, 0x4f, 0x91, 0x65, 0x4d, 0xd1, 0x21, 0x87, 0xbb, 0x13} ++ gEfiSecurityPkgTokenSpaceGuid.PcdTpmInitializationPolicy|1 ++ gEfiSecurityPkgTokenSpaceGuid.PcdTpmScrtmPolicy|1 ++ !endif ++ + ################################################################################ + # + # Components Section - list of all EDK II Modules needed by this Platform. +@@ -503,6 +522,7 @@ + PcdLib|MdePkg/Library/PeiPcdLib/PeiPcdLib.inf + } + !endif ++ + + # + # DXE Phase modules +@@ -525,28 +545,64 @@ + MdeModulePkg/Universal/SecurityStubDxe/SecurityStubDxe.inf { + + NULL|SecurityPkg/Library/DxeImageVerificationLib/DxeImageVerificationLib.inf ++!if $(TPM_ENABLED) == TRUE ++ NULL|SecurityPkg/Library/DxeTpmMeasureBootLib/DxeTpmMeasureBootLib.inf ++!endif + } + !else + MdeModulePkg/Universal/SecurityStubDxe/SecurityStubDxe.inf + !endif ++ ++ ++!if $(TPM_ENABLED) == TRUE ++ SecurityPkg/Tcg/TrEEConfig/TrEEConfigPei.inf { ++ ++ Tpm12DeviceLib|SecurityPkg/Library/Tpm12DeviceLibDTpm/Tpm12DeviceLibDTpm.inf ++ PcdLib|MdePkg/Library/PeiPcdLib/PeiPcdLib.inf ++ } ++ ++ SecurityPkg/Tcg/TcgConfigDxe/TcgConfigDxe.inf { ++ ++ PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf ++ ++ # ++ # specify GUID gEfiIfrNotInTPVPageGuid, this page will not ++ # be showed in TPV page. ++ # ++ #*_*_*_VFR_FLAGS = -g e58809f8-fbc1-48e2-883a-a30fdc4b441e ++ } ++ ++ SecurityPkg/Tcg/TcgDxe/TcgDxe.inf { ++ ++ PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf ++ } ++# SecurityPkg/Tcg/TcgSmm/TcgSmm.inf ++!endif ++ + + MdeModulePkg/Universal/EbcDxe/EbcDxe.inf + PcAtChipsetPkg/8259InterruptControllerDxe/8259.inf + UefiCpuPkg/CpuIo2Dxe/CpuIo2Dxe.inf + UefiCpuPkg/CpuDxe/CpuDxe.inf + PcAtChipsetPkg/8254TimerDxe/8254Timer.inf +-!if $(USE_OLD_PCI_HOST) == TRUE +- OvmfPkg/PciHostBridgeDxe/PciHostBridgeDxe.inf +-!else +- MdeModulePkg/Bus/Pci/PciHostBridgeDxe/PciHostBridgeDxe.inf { +- +- PciHostBridgeLib|OvmfPkg/Library/PciHostBridgeLib/PciHostBridgeLib.inf +- } +-!endif +- MdeModulePkg/Bus/Pci/PciBusDxe/PciBusDxe.inf { +- +- PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf +- } ++#!if $(USE_OLD_PCI_HOST) == TRUE ++# OvmfPkg/PciHostBridgeDxe/PciHostBridgeDxe.inf ++#!else ++# MdeModulePkg/Bus/Pci/PciHostBridgeDxe/PciHostBridgeDxe.inf { ++# ++# PciHostBridgeLib|OvmfPkg/Library/PciHostBridgeLib/PciHostBridgeLib.inf ++# } ++#!endif ++# ++ DuetPkg/PciRootBridgeNoEnumerationDxe/PciRootBridgeNoEnumeration.inf ++ DuetPkg/PciBusNoEnumerationDxe/PciBusNoEnumeration.inf ++ ++# MdeModulePkg/Bus/Pci/PciBusDxe/PciBusDxe.inf { ++# ++# PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf ++# } ++ ++ + PcAtChipsetPkg/KbcResetDxe/Reset.inf + MdeModulePkg/Universal/Metronome/Metronome.inf + PcAtChipsetPkg/PcatRealTimeClockRuntimeDxe/PcatRealTimeClockRuntimeDxe.inf +diff --git a/OvmfPkg/OvmfPkgX64.fdf b/OvmfPkg/OvmfPkgX64.fdf +index 711f47a..ec4de24 100644 +--- a/OvmfPkg/OvmfPkgX64.fdf ++++ b/OvmfPkg/OvmfPkgX64.fdf +@@ -163,6 +163,8 @@ INF UefiCpuPkg/Universal/Acpi/S3Resume2Pei/S3Resume2Pei.inf + INF OvmfPkg/SmmAccess/SmmAccessPei.inf + !endif + ++ ++ + ################################################################################ + + [FV.DXEFV] +@@ -207,12 +209,23 @@ INF PcAtChipsetPkg/8259InterruptControllerDxe/8259.inf + INF UefiCpuPkg/CpuIo2Dxe/CpuIo2Dxe.inf + INF UefiCpuPkg/CpuDxe/CpuDxe.inf + INF PcAtChipsetPkg/8254TimerDxe/8254Timer.inf +-!if $(USE_OLD_PCI_HOST) == TRUE +-INF OvmfPkg/PciHostBridgeDxe/PciHostBridgeDxe.inf +-!else +-INF MdeModulePkg/Bus/Pci/PciHostBridgeDxe/PciHostBridgeDxe.inf ++#!if $(USE_OLD_PCI_HOST) == TRUE ++#INF OvmfPkg/PciHostBridgeDxe/PciHostBridgeDxe.inf ++#!else ++#INF MdeModulePkg/Bus/Pci/PciHostBridgeDxe/PciHostBridgeDxe.inf ++#!endif ++# ++INF DuetPkg/PciRootBridgeNoEnumerationDxe/PciRootBridgeNoEnumeration.inf ++INF DuetPkg/PciBusNoEnumerationDxe/PciBusNoEnumeration.inf ++ ++!if $(TPM_ENABLED) == TRUE ++INF SecurityPkg/Tcg/TcgConfigDxe/TcgConfigDxe.inf ++INF SecurityPkg/Tcg/TcgDxe/TcgDxe.inf ++#INF RuleOverride = DRIVER_ACPITABLE SecurityPkg/Tcg/TcgSmm/TcgSmm.inf + !endif +-INF MdeModulePkg/Bus/Pci/PciBusDxe/PciBusDxe.inf ++ ++#INF MdeModulePkg/Bus/Pci/PciBusDxe/PciBusDxe.inf ++ + INF PcAtChipsetPkg/KbcResetDxe/Reset.inf + INF MdeModulePkg/Universal/Metronome/Metronome.inf + INF PcAtChipsetPkg/PcatRealTimeClockRuntimeDxe/PcatRealTimeClockRuntimeDxe.inf +diff --git a/OvmfPkg/PlatformPei/Platform.c b/OvmfPkg/PlatformPei/Platform.c +index 7d09412..6cdea84 100644 +--- a/OvmfPkg/PlatformPei/Platform.c ++++ b/OvmfPkg/PlatformPei/Platform.c +@@ -242,6 +242,8 @@ MemMapInitialization ( + // 0xFEE00000 LAPIC 1 MB + // + PciSize = 0xFC000000 - PciBase; ++ ++ + AddIoMemoryBaseSizeHob (PciBase, PciSize); + PcdSet64 (PcdPciMmio32Base, PciBase); + PcdSet64 (PcdPciMmio32Size, PciSize); +diff --git a/OvmfPkg/PlatformPei/Xen.c b/OvmfPkg/PlatformPei/Xen.c +index 7fa9019..f91bcb1 100644 +--- a/OvmfPkg/PlatformPei/Xen.c ++++ b/OvmfPkg/PlatformPei/Xen.c +@@ -225,7 +225,19 @@ InitializeXen ( + // + AddReservedMemoryBaseSizeHob (0xFC000000, 0x1000000, FALSE); + +- PcdSetBool (PcdPciDisableBusEnumeration, TRUE); ++ //PcdSetBool (PcdPciDisableBusEnumeration, TRUE); ++ ++ PcdSet64 (PcdPciMmio32Base, 0x80000000); ++ PcdSet64 (PcdPciMmio32Size, 0x7c000000); ++ ++# if 0 ++ ++ AddIoMemoryBaseSizeHob (0xFEC00000, SIZE_4KB); ++ AddIoMemoryBaseSizeHob (0xFED00000, SIZE_1KB); ++ AddIoMemoryBaseSizeHob (ICH9_ROOT_COMPLEX_BASE, SIZE_16KB); ++ AddIoMemoryBaseSizeHob (PcdGet32(PcdCpuLocalApicBaseAddress), SIZE_1MB); ++#endif ++ + + return EFI_SUCCESS; + } +diff --git a/OvmfPkg/XenBusDxe/XenBusDxe.c b/OvmfPkg/XenBusDxe/XenBusDxe.c +index 439b060..86c4181 100644 +--- a/OvmfPkg/XenBusDxe/XenBusDxe.c ++++ b/OvmfPkg/XenBusDxe/XenBusDxe.c +@@ -320,6 +320,8 @@ XenBusDxeDriverBindingStart ( + XENIO_PROTOCOL *XenIo; + EFI_DEVICE_PATH_PROTOCOL *DevicePath; + ++ return EFI_UNSUPPORTED; ++ + Status = gBS->OpenProtocol ( + ControllerHandle, + &gXenIoProtocolGuid, +diff --git a/OvmfPkg/XenPvBlkDxe/XenPvBlkDxe.c b/OvmfPkg/XenPvBlkDxe/XenPvBlkDxe.c +index caaa9b4..b94fd94 100644 +--- a/OvmfPkg/XenPvBlkDxe/XenPvBlkDxe.c ++++ b/OvmfPkg/XenPvBlkDxe/XenPvBlkDxe.c +@@ -192,6 +192,8 @@ XenPvBlkDxeDriverBindingSupported ( + EFI_STATUS Status; + XENBUS_PROTOCOL *XenBusIo; + ++ return EFI_UNSUPPORTED; ++ + Status = gBS->OpenProtocol ( + ControllerHandle, + &gXenBusProtocolGuid, +@@ -263,6 +265,8 @@ XenPvBlkDxeDriverBindingStart ( + XEN_BLOCK_FRONT_DEVICE *Dev; + EFI_BLOCK_IO_MEDIA *Media; + ++ return EFI_UNSUPPORTED; ++ + Status = gBS->OpenProtocol ( + ControllerHandle, + &gXenBusProtocolGuid, diff --git a/recipes-openxt/xenclient/ovmf/ovmf_git.bb b/recipes-openxt/xenclient/ovmf/ovmf_git.bb new file mode 100644 index 0000000000..6c6dc08e8e --- /dev/null +++ b/recipes-openxt/xenclient/ovmf/ovmf_git.bb @@ -0,0 +1,138 @@ +DESCRIPTION = "OVMF - UEFI firmware for Qemu and KVM" +HOMEPAGE = "http://sourceforge.net/apps/mediawiki/tianocore/index.php?title=OVMF" +LICENSE = "BSD" +LIC_FILES_CHKSUM = "file://OvmfPkg/License.txt;md5=343dc88e82ff33d042074f62050c3496" + +SRC_URI = " \ + git://github.com/tianocore/edk2.git;branch=master \ + https://ftp.openssl.org/source/old/1.0.2/openssl-1.0.2f.tar.gz;unpack=0 \ + file://0001-BaseTools-Force-tools-variables-to-host-toolchain.patch \ + file://0001-OvmfPkg-Don-t-build-in-QemuVideoDxe-when-we-have-CSM.patch \ + file://0001-pick-up-any-display-device-not-only-vga.patch \ + file://0001-OvmfPkg-don-t-lock-lock-umb-when-running-csm.patch \ + file://0001-MdeModulePkg-TerminalDxe-add-other-text-resolutions.patch \ + file://0001-EXCLUDE_SHELL_FROM_FD.patch \ + file://0001-OvmfPkg-SmbiosPlatformDxe-install-legacy-QEMU-tables.patch \ + file://0002-OvmfPkg-SmbiosPlatformDxe-install-patch-default-lega.patch \ + file://0003-OvmfPkg-SmbiosPlatformDxe-install-patch-default-lega.patch \ + file://0001-OvmfPkg-EnrollDefaultKeys-application-for-enrolling-.patch \ + file://0001-tools_def.template-take-GCC4-_-IA32-X64-prefixes-fro.patch \ + file://0001-OvmfPkg-disable-multi-processor-support-for-boot-tim.patch \ + file://ovmf-q35-xen-support.patch \ +" + + +SRC_URI[sha256sum] = "932b4ee4def2b434f85435d9e3e19ca8ba99ce9a065a61524b429a9d5e9b2e9c" +SRC_URI[md5sum] = "b3bf73f507172be9292ea2a8c28b659d" + +SRCREV="196ccda08fc481dae4fc97db8f2938df87801edb" + +S = "${WORKDIR}/git" + +DEPENDS_class-native="util-linux-native iasl-native" + +# OVMF has trouble building with the default optimization of -O2. +BUILD_OPTIMIZATION="-pipe" + +# OVMF supports IA only, although it could conceivably support ARM someday. +COMPATIBLE_HOST='(i.86|x86_64).*' + +do_patch_append() { + bb.build.exec_func('do_fix_iasl', d) + bb.build.exec_func('do_fix_toolchain', d) + bb.build.exec_func('do_inject_openssl', d) +} + +do_inject_openssl() { + tar -C ${S}/CryptoPkg/Library/OpensslLib -xf ${WORKDIR}/openssl-1.0.2f.tar.gz + (cd ${S}/CryptoPkg/Library/OpensslLib/openssl-1.0.2f && patch -p1 < ../EDKII_openssl-1.0.2f.patch) + (cd ${S}/CryptoPkg/Library/OpensslLib && ./Install.sh ) +} + +do_fix_iasl() { + sed -i -e 's#/usr/bin/iasl#${STAGING_BINDIR_NATIVE}/iasl#' ${S}/BaseTools/Conf/tools_def.template +} + +do_fix_toolchain(){ + sed -i -e 's#DEF(ELFGCC_BIN)/#${TARGET_PREFIX}#' ${S}/BaseTools/Conf/tools_def.template + sed -i -e 's#DEF(GCC.*PREFIX)#${TARGET_PREFIX}#' ${S}/BaseTools/Conf/tools_def.template + sed -i -e 's#${TARGET_PREFIX}make#make#g' ${S}/BaseTools/Conf/tools_def.template + sed -i -e "s#^LINKER\(.*\)#LINKER\1\nLFLAGS += ${BUILD_LDFLAGS}#" ${S}/BaseTools/Source/C/Makefiles/app.makefile + sed -i -e "s#^LINKER\(.*\)#LINKER\1\nCFLAGS += ${BUILD_CFLAGS}#" ${S}/BaseTools/Source/C/Makefiles/app.makefile + sed -i -e "s#^LINKER\(.*\)#LINKER\1\nLFLAGS += ${BUILD_LDFLAGS}#" ${S}/BaseTools/Source/C/VfrCompile/GNUmakefile + sed -i -e "s#^LINKER\(.*\)#LINKER\1\nCFLAGS += ${BUILD_CFLAGS}#" ${S}/BaseTools/Source/C/VfrCompile/GNUmakefile +} + +GCC_VER="$(${CC} -v 2>&1 | tail -n1 | awk '{print $3}' | awk -F. '{print $1$2}')" + +do_compile() { + + export LFLAGS="${LDFLAGS}" + OVMF_ARCH="X64" + + ( + cd ${S} + + . ./edksetup.sh + + if [ ! -f basetools.stamp ]; then + make -C BaseTools && touch basetools.stamp + fi + + GCCVER=$(${CC} --version | awk '{ print $3; exit}') + case "$GCCVER" in + 4.4*) CC_FLAGS="-t GCC44";; + 4.5*) CC_FLAGS="-t GCC45";; + 4.6*) CC_FLAGS="-t GCC46";; + 4.7*) CC_FLAGS="-t GCC47";; + 4.8*) CC_FLAGS="-t GCC48";; + 4.9*) CC_FLAGS="-t GCC49";; + 5.0*) CC_FLAGS="-t GCC49";; + 5.1*) CC_FLAGS="-t GCC49";; + 5.2*) CC_FLAGS="-t GCC49";; + 5.3*) CC_FLAGS="-t GCC49";; + esac + + + OVMF_FLAGS="$CC_FLAGS -D HTTP_BOOT_ENABLE" + + build $OVMF_FLAGS -a X64 -p OvmfPkg/OvmfPkgX64.dsc + ) +} + +do_install() { + + GCCVER=$(${CC} --version | awk '{ print $3; exit}') + case "$GCCVER" in + 4.4*) OUTPATH="DEBUG_GCC44";; + 4.5*) OUTPATH="DEBUG_GCC45";; + 4.6*) OUTPATH="DEBUG_GCC46";; + 4.7*) OUTPATH="DEBUG_GCC47";; + 4.8*) OUTPATH="DEBUG_GCC48";; + 4.9*) OUTPATH="DEBUG_GCC49";; + 5.0*) OUTPATH="DEBUG_GCC49";; + 5.1*) OUTPATH="DEBUG_GCC49";; + 5.2*) OUTPATH="DEBUG_GCC49";; + 5.3*) OUTPATH="DEBUG_GCC49";; + esac + + + build_dir="${S}/Build/OvmfX64/${OUTPATH}" + + install -d ${D}${datadir}/ovmf + install -m 0755 ${build_dir}/FV/OVMF.fd \ + ${D}${datadir}/ovmf/OVMF.fd + install -m 0755 ${build_dir}/FV/OVMF_VARS.fd \ + ${D}${datadir}/ovmf/OVMF_VARS.fd + install -m 0755 ${build_dir}/X64/EnrollDefaultKeys.efi \ + ${D}${datadir}/ovmf/EnrollDefaultKeys.efi + +# install -d ${STAGING_DATADIR}/ovmf +# install -m 0755 ${build_dir}/FV/OVMF.fd \ +# ${STAGING_DATADIR}/ovmf/OVMF.fd +# install -m 0755 ${build_dir}/FV/OVMF_VARS.fd \ +# ${STAGING_DATADIR}/ovmf/OVMF_VARS.fd + +} + +BBCLASSEXTEND = "native" diff --git a/recipes-openxt/xenclient/xenclient-idl/ovmf.patch b/recipes-openxt/xenclient/xenclient-idl/ovmf.patch new file mode 100644 index 0000000000..06691e68af --- /dev/null +++ b/recipes-openxt/xenclient/xenclient-idl/ovmf.patch @@ -0,0 +1,20 @@ +Index: git/interfaces/xenmgr_vm.xml +=================================================================== +--- git.orig/interfaces/xenmgr_vm.xml ++++ git/interfaces/xenmgr_vm.xml +@@ -201,6 +201,7 @@ + Domain timer mode + Enable nested virtualization + Serial port specification ++ Use OVMF (UEFI) firmware + + + Get the value of a VM db key. +@@ -537,6 +538,7 @@ + Domain timer mode + Enable nested virtualization + Serial port specification ++ Use OVMF (UEFI) firmware + + + diff --git a/recipes-openxt/xenclient/xenclient-idl_git.bb b/recipes-openxt/xenclient/xenclient-idl_git.bb index f1de277b30..d0676a80eb 100644 --- a/recipes-openxt/xenclient/xenclient-idl_git.bb +++ b/recipes-openxt/xenclient/xenclient-idl_git.bb @@ -5,7 +5,10 @@ LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/GPL-2.0;md5=801f80980d171dd6425 PV = "0+git${SRCPV}" SRCREV = "${AUTOREV}" -SRC_URI = "git://${OPENXT_GIT_MIRROR}/idl.git;protocol=${OPENXT_GIT_PROTOCOL};branch=${OPENXT_BRANCH}" +SRC_URI = " \ + git://${OPENXT_GIT_MIRROR}/idl.git;protocol=${OPENXT_GIT_PROTOCOL};branch=${OPENXT_BRANCH} \ + file://ovmf.patch;patch=1 \ + " S = "${WORKDIR}/git" inherit xenclient diff --git a/recipes-openxt/xenclient/xenmgr/files/fix-nesting.patch b/recipes-openxt/xenclient/xenmgr/files/fix-nesting.patch new file mode 100644 index 0000000000..18027f0e1b --- /dev/null +++ b/recipes-openxt/xenclient/xenmgr/files/fix-nesting.patch @@ -0,0 +1,13 @@ +Index: openxt-20170425/build/tmp-glibc/work/core2-32-oe-linux/xenmgr/0+gitAUTOINC+8ac754b951-r0/git/xenmgr/Vm/Config.hs +=================================================================== +--- xenmgr/Vm/Config.hs ++++ xenmgr/Vm/Config.hs +@@ -770,7 +770,7 @@ miscSpecs cfg = do + timer_mode = readConfigPropertyDef uuid vmTimerMode vmTimerModeDefault >>= + \ v -> return ["timer_mode=" ++ (show v)] + nested = readConfigPropertyDef uuid vmNestedHvm False >>= +- \ v -> if v then return ["nested=true"] else return [] ++ \ v -> if v then return ["nestedhvm=1"] else return [] + + acpi_table = do + case (vmcfgAcpi cfg) of diff --git a/recipes-openxt/xenclient/xenmgr/files/ovmf.patch b/recipes-openxt/xenclient/xenmgr/files/ovmf.patch new file mode 100644 index 0000000000..979429a53a --- /dev/null +++ b/recipes-openxt/xenclient/xenmgr/files/ovmf.patch @@ -0,0 +1,98 @@ +Index: xenmgr/Vm/Config.hs +=================================================================== +--- xenmgr.orig/Vm/Config.hs ++++ xenmgr/Vm/Config.hs +@@ -80,6 +80,7 @@ module Vm.Config ( + , vmTimerMode, vmTimerModeDefault + , vmNestedHvm + , vmSerial ++ , vmOvmf + ) where + + import Control.Arrow +@@ -446,6 +447,7 @@ vmTimerMode = property "config.timer-mod + vmTimerModeDefault = "no_delay_for_missed_ticks" + vmNestedHvm = property "config.nestedhvm" + vmSerial = property "config.serial" ++vmOvmf = property "config.ovmf" + vmStubdomMemory = property "config.stubdom-memory" + vmStubdomCmdline = property "config.stubdom-cmdline" + +@@ -737,6 +739,7 @@ miscSpecs cfg = do + hpet_ <- hpet + timer_mode_ <- timer_mode + nested_ <- nested ++ ovmf_ <- ovmf + dm_override_ <- liftRpc dm_override + extra_hvms <- readConfigPropertyDef uuid vmExtraHvms [] + acpi_table_ <- liftIO $ acpi_table +@@ -751,6 +754,7 @@ miscSpecs cfg = do + ++ hpet_ + ++ timer_mode_ + ++ nested_ ++ ++ ovmf_ + ++ dm_override_ + ++ acpi_table_ + where +@@ -771,6 +775,8 @@ miscSpecs cfg = do + \ v -> return ["timer_mode=" ++ (show v)] + nested = readConfigPropertyDef uuid vmNestedHvm False >>= + \ v -> if v then return ["nestedhvm=1"] else return [] ++ ovmf = readConfigPropertyDef uuid vmOvmf False >>= ++ \ v -> if v then return ["bios='ovmf'"] else return [] + + acpi_table = do + case (vmcfgAcpi cfg) of +Index: xenmgr/Vm/Actions.hs +=================================================================== +--- xenmgr.orig/Vm/Actions.hs ++++ xenmgr/Vm/Actions.hs +@@ -116,6 +116,7 @@ module Vm.Actions + , setVmAutolockCdDrives + , cleanupV4VDevice + , EventHookFailMode(..) ++ , setVmOvmf + ) where + + import Prelude hiding (catch, mapM, mapM_) +@@ -1846,6 +1847,7 @@ setVmHpet uuid v = saveConfigProperty uu + setVmTimerMode uuid v = saveConfigProperty uuid vmTimerMode (v::String) + setVmNestedHvm uuid v = saveConfigProperty uuid vmNestedHvm (v::Bool) + setVmSerial uuid v = saveConfigProperty uuid vmSerial (v::String) ++setVmOvmf uuid v = saveConfigProperty uuid vmOvmf (v::Bool) + + -- set autolock flag on the vm xenstore tree, per cd device + -- cd devices which have sticky bit are not subject to autolock ever +Index: xenmgr/Vm/Queries.hs +=================================================================== +--- xenmgr.orig/Vm/Queries.hs ++++ xenmgr/Vm/Queries.hs +@@ -121,6 +121,7 @@ module Vm.Queries + , getVmTimerMode + , getVmNestedHvm + , getVmSerial ++ , getVmOvmf + ) where + + import Data.String +@@ -1016,3 +1017,4 @@ getVmHpet uuid = readConfigPropertyDef u + getVmTimerMode uuid = readConfigPropertyDef uuid vmTimerMode vmTimerModeDefault + getVmNestedHvm uuid = readConfigPropertyDef uuid vmNestedHvm False + getVmSerial uuid = readConfigPropertyDef uuid vmSerial "" ++getVmOvmf uuid = readConfigPropertyDef uuid vmOvmf False +Index: xenmgr/XenMgr/Expose/VmObject.hs +=================================================================== +--- xenmgr.orig/XenMgr/Expose/VmObject.hs ++++ xenmgr/XenMgr/Expose/VmObject.hs +@@ -651,6 +651,11 @@ implementationFor xm uuid = self where + , comCitrixXenclientXenmgrVmSetSerial = restrict' $ setVmSerial uuid + , comCitrixXenclientXenmgrVmUnrestrictedSetSerial = setVmSerial uuid + ++ , comCitrixXenclientXenmgrVmGetOvmf = getVmOvmf uuid ++ , comCitrixXenclientXenmgrVmUnrestrictedGetOvmf = getVmOvmf uuid ++ , comCitrixXenclientXenmgrVmSetOvmf = restrict' $ setVmOvmf uuid ++ , comCitrixXenclientXenmgrVmUnrestrictedSetOvmf = setVmOvmf uuid ++ + } where + stom "" = Nothing + stom x = Just x diff --git a/recipes-openxt/xenclient/xenmgr/xenmgr_git.bb b/recipes-openxt/xenclient/xenmgr/xenmgr_git.bb index 1c91e98db0..039e1c4760 100644 --- a/recipes-openxt/xenclient/xenmgr/xenmgr_git.bb +++ b/recipes-openxt/xenclient/xenmgr/xenmgr_git.bb @@ -14,6 +14,8 @@ SRC_URI = "git://${OPENXT_GIT_MIRROR}/manager.git;protocol=${OPENXT_GIT_PROTOCOL SRC_URI += "file://xenmgr_dbus.conf \ file://xenstore-init-extra \ file://xenmgr.initscript \ + file://fix-nesting.patch;patch=1 \ + file://ovmf.patch;patch=1 \ " S = "${WORKDIR}/git/xenmgr"