From mboxrd@z Thu Jan 1 00:00:00 1970 Received: by 2002:adf:a111:0:0:0:0:0 with SMTP id o17-v6csp2029506wro; Sun, 4 Nov 2018 17:42:15 -0800 (PST) X-Google-Smtp-Source: AJdET5dHp/8SFbYsinx9Cj0+OpzR/jueJswI+5eYA7S2Q0og144DF15fkqLD65vymPTHo2dol1Bn X-Received: by 2002:a0c:c11b:: with SMTP id f27mr19749889qvh.225.1541382135864; Sun, 04 Nov 2018 17:42:15 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1541382135; cv=none; d=google.com; s=arc-20160816; b=dfc/fVbkbILKx26+kOEX9PE2iDWWEPktgF2+1cXvb74YnyMni5xqDLhRK9nn+JPGYh RjxEoy7TaNWXF7z1W6WD9mqKuKtppSpGfT0Jl7nStBU/2vp6+agiF2C+gTIilpBk37z7 Y6EQQm3QEDDGSggo5n/mfg1LZvdF6bh16P4d/EksIk2yZF/brX2oF18n1LmlmTTazibD RirjQwz7CWFcyRYrJQtjyna77ZC5+aSo7n0LrhdrRrRqSG4NYFjNm1WMi+ss4bDQMoJ6 cd+VkkViwVkXysbgewMNVWh4pNGlHv63L8lZwc3NKV4Q2mkLsabEMkmjfZijD8kfK84k ZZfQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:cc:list-subscribe:list-help:list-post:list-archive :list-unsubscribe:list-id:precedence:subject :content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:to:from; bh=9TbPOM7lPgEkH9vLu21xPPOEsuvKBOKVn5l2jjyJhIM=; b=DAe4SGhvhmPI8WOSr+J8Bk/frN+dbY1sD82xv5hEamCL0PZ2lDr+IbwvOhxHsuxGFr D9bQ14SpOpnQpdV0xxpIv/BelCwHsjmxm64K2k0dk+50hJWIF7xfKDG4W7EFumwWMbT5 roQoZXnX/6fqlXfuQMj2zH+S04DXOgPKGTSP4RXN6+Mgkhgau1sQ0VDhCqaZAov3LtAJ FMBqooqTUmY+S4Torvj+d2zOF9f1dsh7Vh+JDetVEnWBeNLcxmLZIZ/bjC3ndlmLA8ME NYSDhn4l29daKiOUDnwDb7q19pR9GXatWuPmRsn69n7yQQVFO8U1MRbo6ZQd9aBrldIO KhSQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of qemu-arm-bounces+alex.bennee=linaro.org@nongnu.org designates 2001:4830:134:3::11 as permitted sender) smtp.mailfrom="qemu-arm-bounces+alex.bennee=linaro.org@nongnu.org"; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from lists.gnu.org (lists.gnu.org. [2001:4830:134:3::11]) by mx.google.com with ESMTPS id c5-v6si131258qtj.372.2018.11.04.17.42.15 for (version=TLS1 cipher=AES128-SHA bits=128/128); Sun, 04 Nov 2018 17:42:15 -0800 (PST) Received-SPF: pass (google.com: domain of qemu-arm-bounces+alex.bennee=linaro.org@nongnu.org designates 2001:4830:134:3::11 as permitted sender) client-ip=2001:4830:134:3::11; Authentication-Results: mx.google.com; spf=pass (google.com: domain of qemu-arm-bounces+alex.bennee=linaro.org@nongnu.org designates 2001:4830:134:3::11 as permitted sender) smtp.mailfrom="qemu-arm-bounces+alex.bennee=linaro.org@nongnu.org"; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: from localhost ([::1]:60844 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gJTuB-0006Ao-77 for alex.bennee@linaro.org; Sun, 04 Nov 2018 20:42:15 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:46800) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gJTtt-000679-G3 for qemu-arm@nongnu.org; Sun, 04 Nov 2018 20:42:01 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gJTtp-0001Nr-Km for qemu-arm@nongnu.org; Sun, 04 Nov 2018 20:41:57 -0500 Received: from mga03.intel.com ([134.134.136.65]:21934) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1gJTtf-0000tf-HN; Sun, 04 Nov 2018 20:41:43 -0500 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga005.fm.intel.com ([10.253.24.32]) by orsmga103.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 04 Nov 2018 17:41:41 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.54,466,1534834800"; d="scan'208";a="277074245" Received: from emurphy1-mobl1.ger.corp.intel.com (HELO localhost.localdomain) ([10.252.26.250]) by fmsmga005.fm.intel.com with ESMTP; 04 Nov 2018 17:41:35 -0800 From: Samuel Ortiz To: qemu-devel@nongnu.org Date: Mon, 5 Nov 2018 02:40:24 +0100 Message-Id: <20181105014047.26447-2-sameo@linux.intel.com> X-Mailer: git-send-email 2.19.1 In-Reply-To: <20181105014047.26447-1-sameo@linux.intel.com> References: <20181105014047.26447-1-sameo@linux.intel.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 134.134.136.65 Subject: [Qemu-arm] [PATCH v5 01/24] hw: i386: Decouple the ACPI build from the PC machine type X-BeenThere: qemu-arm@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Peter Maydell , Stefano Stabellini , Eduardo Habkost , "Michael S. Tsirkin" , Shannon Zhao , Igor Mammedov , qemu-arm@nongnu.org, Marcel Apfelbaum , Paolo Bonzini , Anthony Perard , xen-devel@lists.xenproject.org, Richard Henderson Errors-To: qemu-arm-bounces+alex.bennee=linaro.org@nongnu.org Sender: "Qemu-arm" X-TUID: aBnQ2+hWU6pg ACPI tables are platform and machine type and even architecture agnostic, and as such we want to provide an internal ACPI API that only depends on platform agnostic information. For the x86 architecture, in order to build ACPI tables independently from the PC or Q35 machine types, we are moving a few MachineState structure fields into a machine type agnostic structure called AcpiConfiguration. The structure fields we move are: HotplugHandler *acpi_dev AcpiNVDIMMState acpi_nvdimm_state; FWCfgState *fw_cfg ram_addr_t below_4g_mem_size, above_4g_mem_size bool apic_xrupt_override unsigned apic_id_limit uint64_t numa_nodes uint64_t numa_mem Signed-off-by: Samuel Ortiz --- hw/i386/acpi-build.h | 4 +- include/hw/acpi/acpi.h | 44 ++++++++++ include/hw/i386/pc.h | 19 ++--- hw/acpi/cpu_hotplug.c | 9 +- hw/arm/virt-acpi-build.c | 10 --- hw/i386/acpi-build.c | 136 ++++++++++++++---------------- hw/i386/pc.c | 176 ++++++++++++++++++++++++--------------- hw/i386/pc_piix.c | 21 ++--- hw/i386/pc_q35.c | 21 ++--- hw/i386/xen/xen-hvm.c | 19 +++-- 10 files changed, 257 insertions(+), 202 deletions(-) diff --git a/hw/i386/acpi-build.h b/hw/i386/acpi-build.h index 007332e51c..065a1d8250 100644 --- a/hw/i386/acpi-build.h +++ b/hw/i386/acpi-build.h @@ -2,6 +2,8 @@ #ifndef HW_I386_ACPI_BUILD_H #define HW_I386_ACPI_BUILD_H -void acpi_setup(void); +#include "hw/acpi/acpi.h" + +void acpi_setup(MachineState *machine, AcpiConfiguration *acpi_conf); #endif diff --git a/include/hw/acpi/acpi.h b/include/hw/acpi/acpi.h index c20ace0d0b..254c8d0cfc 100644 --- a/include/hw/acpi/acpi.h +++ b/include/hw/acpi/acpi.h @@ -24,6 +24,8 @@ #include "exec/memory.h" #include "hw/irq.h" #include "hw/acpi/acpi_dev_interface.h" +#include "hw/hotplug.h" +#include "hw/mem/nvdimm.h" /* * current device naming scheme supports up to 256 memory devices @@ -186,6 +188,48 @@ extern int acpi_enabled; extern char unsigned *acpi_tables; extern size_t acpi_tables_len; +typedef +struct AcpiBuildState { + /* Copy of table in RAM (for patching). */ + MemoryRegion *table_mr; + /* Is table patched? */ + bool patched; + void *rsdp; + MemoryRegion *rsdp_mr; + MemoryRegion *linker_mr; +} AcpiBuildState; + +typedef +struct AcpiConfiguration { + /* Machine class ACPI settings */ + int legacy_acpi_table_size; + bool rsdp_in_ram; + unsigned acpi_data_size; + + /* Machine state ACPI settings */ + HotplugHandler *acpi_dev; + AcpiNVDIMMState acpi_nvdimm_state; + + /* + * The fields below are machine settings that + * are not ACPI specific. However they are needed + * for building ACPI tables and as such should be + * carried through the ACPI configuration structure. + */ + bool legacy_cpu_hotplug; + bool linuxboot_dma_enabled; + FWCfgState *fw_cfg; + ram_addr_t below_4g_mem_size, above_4g_mem_size;; + uint64_t numa_nodes; + uint64_t *node_mem; + bool apic_xrupt_override; + unsigned apic_id_limit; + PCIHostState *pci_host; + + /* Build state */ + AcpiBuildState *build_state; +} AcpiConfiguration; + uint8_t *acpi_table_first(void); uint8_t *acpi_table_next(uint8_t *current); unsigned acpi_table_len(void *current); diff --git a/include/hw/i386/pc.h b/include/hw/i386/pc.h index 136fe497b6..fed136fcdd 100644 --- a/include/hw/i386/pc.h +++ b/include/hw/i386/pc.h @@ -12,6 +12,7 @@ #include "qemu/range.h" #include "qemu/bitmap.h" #include "sysemu/sysemu.h" +#include "hw/acpi/acpi.h" #include "hw/pci/pci.h" #include "hw/compat.h" #include "hw/mem/pc-dimm.h" @@ -35,10 +36,8 @@ struct PCMachineState { Notifier machine_done; /* Pointers to devices and objects: */ - HotplugHandler *acpi_dev; ISADevice *rtc; PCIBus *bus; - FWCfgState *fw_cfg; qemu_irq *gsi; /* Configuration options: */ @@ -46,28 +45,20 @@ struct PCMachineState { OnOffAuto vmport; OnOffAuto smm; - AcpiNVDIMMState acpi_nvdimm_state; - bool acpi_build_enabled; bool smbus; bool sata; bool pit; - /* RAM information (sizes, addresses, configuration): */ - ram_addr_t below_4g_mem_size, above_4g_mem_size; - - /* CPU and apic information: */ - bool apic_xrupt_override; - unsigned apic_id_limit; + /* CPU information */ uint16_t boot_cpus; - /* NUMA information: */ - uint64_t numa_nodes; - uint64_t *node_mem; - /* Address space used by IOAPIC device. All IOAPIC interrupts * will be translated to MSI messages in the address space. */ AddressSpace *ioapic_as; + + /* ACPI configuration */ + AcpiConfiguration acpi_configuration; }; #define PC_MACHINE_ACPI_DEVICE_PROP "acpi-device" diff --git a/hw/acpi/cpu_hotplug.c b/hw/acpi/cpu_hotplug.c index 5243918125..634dc3b846 100644 --- a/hw/acpi/cpu_hotplug.c +++ b/hw/acpi/cpu_hotplug.c @@ -237,9 +237,9 @@ void build_legacy_cpu_hotplug_aml(Aml *ctx, MachineState *machine, /* The current AML generator can cover the APIC ID range [0..255], * inclusive, for VCPU hotplug. */ QEMU_BUILD_BUG_ON(ACPI_CPU_HOTPLUG_ID_LIMIT > 256); - if (pcms->apic_id_limit > ACPI_CPU_HOTPLUG_ID_LIMIT) { + if (pcms->acpi_configuration.apic_id_limit > ACPI_CPU_HOTPLUG_ID_LIMIT) { error_report("max_cpus is too large. APIC ID of last CPU is %u", - pcms->apic_id_limit - 1); + pcms->acpi_configuration.apic_id_limit - 1); exit(1); } @@ -316,8 +316,9 @@ void build_legacy_cpu_hotplug_aml(Aml *ctx, MachineState *machine, * ith up to 255 elements. Windows guests up to win2k8 fail when * VarPackageOp is used. */ - pkg = pcms->apic_id_limit <= 255 ? aml_package(pcms->apic_id_limit) : - aml_varpackage(pcms->apic_id_limit); + pkg = pcms->acpi_configuration.apic_id_limit <= 255 ? + aml_package(pcms->acpi_configuration.apic_id_limit) : + aml_varpackage(pcms->acpi_configuration.apic_id_limit); for (i = 0, apic_idx = 0; i < apic_ids->len; i++) { int apic_id = apic_ids->cpus[i].arch_id; diff --git a/hw/arm/virt-acpi-build.c b/hw/arm/virt-acpi-build.c index 5785fb697c..f28a2faa53 100644 --- a/hw/arm/virt-acpi-build.c +++ b/hw/arm/virt-acpi-build.c @@ -790,16 +790,6 @@ build_dsdt(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms) free_aml_allocator(); } -typedef -struct AcpiBuildState { - /* Copy of table in RAM (for patching). */ - MemoryRegion *table_mr; - MemoryRegion *rsdp_mr; - MemoryRegion *linker_mr; - /* Is table patched? */ - bool patched; -} AcpiBuildState; - static void virt_acpi_build(VirtMachineState *vms, AcpiBuildTables *tables) { diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c index 1599caa7c5..d0362e1382 100644 --- a/hw/i386/acpi-build.c +++ b/hw/i386/acpi-build.c @@ -338,13 +338,14 @@ void pc_madt_cpu_entry(AcpiDeviceIf *adev, int uid, } static void -build_madt(GArray *table_data, BIOSLinker *linker, PCMachineState *pcms) +build_madt(GArray *table_data, BIOSLinker *linker, + MachineState *ms, AcpiConfiguration *acpi_conf) { - MachineClass *mc = MACHINE_GET_CLASS(pcms); - const CPUArchIdList *apic_ids = mc->possible_cpu_arch_ids(MACHINE(pcms)); + MachineClass *mc = MACHINE_GET_CLASS(ms); + const CPUArchIdList *apic_ids = mc->possible_cpu_arch_ids(ms); int madt_start = table_data->len; - AcpiDeviceIfClass *adevc = ACPI_DEVICE_IF_GET_CLASS(pcms->acpi_dev); - AcpiDeviceIf *adev = ACPI_DEVICE_IF(pcms->acpi_dev); + AcpiDeviceIfClass *adevc = ACPI_DEVICE_IF_GET_CLASS(acpi_conf->acpi_dev); + AcpiDeviceIf *adev = ACPI_DEVICE_IF(acpi_conf->acpi_dev); bool x2apic_mode = false; AcpiMultipleApicTable *madt; @@ -370,7 +371,7 @@ build_madt(GArray *table_data, BIOSLinker *linker, PCMachineState *pcms) io_apic->address = cpu_to_le32(IO_APIC_DEFAULT_ADDRESS); io_apic->interrupt = cpu_to_le32(0); - if (pcms->apic_xrupt_override) { + if (acpi_conf->apic_xrupt_override) { intsrcovr = acpi_data_push(table_data, sizeof *intsrcovr); intsrcovr->type = ACPI_APIC_XRUPT_OVERRIDE; intsrcovr->length = sizeof(*intsrcovr); @@ -1786,13 +1787,12 @@ static Aml *build_q35_osc_method(void) static void build_dsdt(GArray *table_data, BIOSLinker *linker, AcpiPmInfo *pm, AcpiMiscInfo *misc, - Range *pci_hole, Range *pci_hole64, MachineState *machine) + Range *pci_hole, Range *pci_hole64, + MachineState *machine, AcpiConfiguration *acpi_conf) { CrsRangeEntry *entry; Aml *dsdt, *sb_scope, *scope, *dev, *method, *field, *pkg, *crs; CrsRangeSet crs_range_set; - PCMachineState *pcms = PC_MACHINE(machine); - PCMachineClass *pcmc = PC_MACHINE_GET_CLASS(machine); uint32_t nr_mem = machine->ram_slots; int root_bus_limit = 0xFF; PCIBus *bus = NULL; @@ -1836,7 +1836,7 @@ build_dsdt(GArray *table_data, BIOSLinker *linker, build_q35_pci0_int(dsdt); } - if (pcmc->legacy_cpu_hotplug) { + if (acpi_conf->legacy_cpu_hotplug) { build_legacy_cpu_hotplug_aml(dsdt, machine, pm->cpu_hp_io_base); } else { CPUHotplugFeatures opts = { @@ -1860,7 +1860,7 @@ build_dsdt(GArray *table_data, BIOSLinker *linker, aml_append(scope, method); } - if (pcms->acpi_nvdimm_state.is_enabled) { + if (acpi_conf->acpi_nvdimm_state.is_enabled) { method = aml_method("_E04", 0, AML_NOTSERIALIZED); aml_append(method, aml_notify(aml_name("\\_SB.NVDR"), aml_int(0x80))); @@ -2041,7 +2041,7 @@ build_dsdt(GArray *table_data, BIOSLinker *linker, * with half of the 16-bit control register. Hence, the total size * of the i/o region used is FW_CFG_CTL_SIZE; when using DMA, the * DMA control register is located at FW_CFG_DMA_IO_BASE + 4 */ - uint8_t io_size = object_property_get_bool(OBJECT(pcms->fw_cfg), + uint8_t io_size = object_property_get_bool(OBJECT(acpi_conf->fw_cfg), "dma_enabled", NULL) ? ROUND_UP(FW_CFG_CTL_SIZE, 4) + sizeof(dma_addr_t) : FW_CFG_CTL_SIZE; @@ -2252,7 +2252,8 @@ build_tpm2(GArray *table_data, BIOSLinker *linker, GArray *tcpalog) #define HOLE_640K_END (1 * MiB) static void -build_srat(GArray *table_data, BIOSLinker *linker, MachineState *machine) +build_srat(GArray *table_data, BIOSLinker *linker, + MachineState *machine, AcpiConfiguration *acpi_conf) { AcpiSystemResourceAffinityTable *srat; AcpiSratMemoryAffinity *numamem; @@ -2262,9 +2263,8 @@ build_srat(GArray *table_data, BIOSLinker *linker, MachineState *machine) uint64_t mem_len, mem_base, next_base; MachineClass *mc = MACHINE_GET_CLASS(machine); const CPUArchIdList *apic_ids = mc->possible_cpu_arch_ids(machine); - PCMachineState *pcms = PC_MACHINE(machine); ram_addr_t hotplugabble_address_space_size = - object_property_get_int(OBJECT(pcms), PC_MACHINE_DEVMEM_REGION_SIZE, + object_property_get_int(OBJECT(machine), PC_MACHINE_DEVMEM_REGION_SIZE, NULL); srat_start = table_data->len; @@ -2306,9 +2306,9 @@ build_srat(GArray *table_data, BIOSLinker *linker, MachineState *machine) next_base = 0; numa_start = table_data->len; - for (i = 1; i < pcms->numa_nodes + 1; ++i) { + for (i = 1; i < acpi_conf->numa_nodes + 1; ++i) { mem_base = next_base; - mem_len = pcms->node_mem[i - 1]; + mem_len = acpi_conf->node_mem[i - 1]; next_base = mem_base + mem_len; /* Cut out the 640K hole */ @@ -2331,16 +2331,16 @@ build_srat(GArray *table_data, BIOSLinker *linker, MachineState *machine) } /* Cut out the ACPI_PCI hole */ - if (mem_base <= pcms->below_4g_mem_size && - next_base > pcms->below_4g_mem_size) { - mem_len -= next_base - pcms->below_4g_mem_size; + if (mem_base <= acpi_conf->below_4g_mem_size && + next_base > acpi_conf->below_4g_mem_size) { + mem_len -= next_base - acpi_conf->below_4g_mem_size; if (mem_len > 0) { numamem = acpi_data_push(table_data, sizeof *numamem); build_srat_memory(numamem, mem_base, mem_len, i - 1, MEM_AFFINITY_ENABLED); } mem_base = 1ULL << 32; - mem_len = next_base - pcms->below_4g_mem_size; + mem_len = next_base - acpi_conf->below_4g_mem_size; next_base = mem_base + mem_len; } @@ -2351,7 +2351,7 @@ build_srat(GArray *table_data, BIOSLinker *linker, MachineState *machine) } } slots = (table_data->len - numa_start) / sizeof *numamem; - for (; slots < pcms->numa_nodes + 2; slots++) { + for (; slots < acpi_conf->numa_nodes + 2; slots++) { numamem = acpi_data_push(table_data, sizeof *numamem); build_srat_memory(numamem, 0, 0, 0, MEM_AFFINITY_NOFLAGS); } @@ -2367,7 +2367,8 @@ build_srat(GArray *table_data, BIOSLinker *linker, MachineState *machine) if (hotplugabble_address_space_size) { numamem = acpi_data_push(table_data, sizeof *numamem); build_srat_memory(numamem, machine->device_memory->base, - hotplugabble_address_space_size, pcms->numa_nodes - 1, + hotplugabble_address_space_size, + acpi_conf->numa_nodes - 1, MEM_AFFINITY_HOTPLUGGABLE | MEM_AFFINITY_ENABLED); } @@ -2546,17 +2547,6 @@ build_rsdp(GArray *rsdp_table, BIOSLinker *linker, unsigned rsdt_tbl_offset) return rsdp_table; } -typedef -struct AcpiBuildState { - /* Copy of table in RAM (for patching). */ - MemoryRegion *table_mr; - /* Is table patched? */ - uint8_t patched; - void *rsdp; - MemoryRegion *rsdp_mr; - MemoryRegion *linker_mr; -} AcpiBuildState; - static bool acpi_get_mcfg(AcpiMcfgInfo *mcfg) { Object *pci_host; @@ -2580,10 +2570,9 @@ static bool acpi_get_mcfg(AcpiMcfgInfo *mcfg) } static -void acpi_build(AcpiBuildTables *tables, MachineState *machine) +void acpi_build(AcpiBuildTables *tables, + MachineState *machine, AcpiConfiguration *acpi_conf) { - PCMachineState *pcms = PC_MACHINE(machine); - PCMachineClass *pcmc = PC_MACHINE_GET_CLASS(pcms); GArray *table_offsets; unsigned facs, dsdt, rsdt, fadt; AcpiPmInfo pm; @@ -2621,7 +2610,7 @@ void acpi_build(AcpiBuildTables *tables, MachineState *machine) /* DSDT is pointed to by FADT */ dsdt = tables_blob->len; build_dsdt(tables_blob, tables->linker, &pm, &misc, - &pci_hole, &pci_hole64, machine); + &pci_hole, &pci_hole64, machine, acpi_conf); /* Count the size of the DSDT and SSDT, we will need it for legacy * sizing of ACPI tables. @@ -2639,7 +2628,7 @@ void acpi_build(AcpiBuildTables *tables, MachineState *machine) aml_len += tables_blob->len - fadt; acpi_add_table(table_offsets, tables_blob); - build_madt(tables_blob, tables->linker, pcms); + build_madt(tables_blob, tables->linker, machine, acpi_conf); vmgenid_dev = find_vmgenid_dev(); if (vmgenid_dev) { @@ -2661,9 +2650,9 @@ void acpi_build(AcpiBuildTables *tables, MachineState *machine) build_tpm2(tables_blob, tables->linker, tables->tcpalog); } } - if (pcms->numa_nodes) { + if (acpi_conf->numa_nodes) { acpi_add_table(table_offsets, tables_blob); - build_srat(tables_blob, tables->linker, machine); + build_srat(tables_blob, tables->linker, machine, acpi_conf); if (have_numa_distance) { acpi_add_table(table_offsets, tables_blob); build_slit(tables_blob, tables->linker); @@ -2683,9 +2672,9 @@ void acpi_build(AcpiBuildTables *tables, MachineState *machine) build_dmar_q35(tables_blob, tables->linker); } } - if (pcms->acpi_nvdimm_state.is_enabled) { + if (acpi_conf->acpi_nvdimm_state.is_enabled) { nvdimm_build_acpi(table_offsets, tables_blob, tables->linker, - &pcms->acpi_nvdimm_state, machine->ram_slots); + &acpi_conf->acpi_nvdimm_state, machine->ram_slots); } /* Add tables supplied by user (if any) */ @@ -2721,13 +2710,13 @@ void acpi_build(AcpiBuildTables *tables, MachineState *machine) * * All this is for PIIX4, since QEMU 2.0 didn't support Q35 migration. */ - if (pcmc->legacy_acpi_table_size) { + if (acpi_conf->legacy_acpi_table_size) { /* Subtracting aml_len gives the size of fixed tables. Then add the * size of the PIIX4 DSDT/SSDT in QEMU 2.0. */ int legacy_aml_len = - pcmc->legacy_acpi_table_size + - ACPI_BUILD_LEGACY_CPU_AML_SIZE * pcms->apic_id_limit; + acpi_conf->legacy_acpi_table_size + + ACPI_BUILD_LEGACY_CPU_AML_SIZE * acpi_conf->apic_id_limit; int legacy_table_size = ROUND_UP(tables_blob->len - aml_len + legacy_aml_len, ACPI_BUILD_ALIGN_SIZE); @@ -2772,9 +2761,17 @@ static void acpi_ram_update(MemoryRegion *mr, GArray *data) static void acpi_build_update(void *build_opaque) { - AcpiBuildState *build_state = build_opaque; + AcpiConfiguration *acpi_conf = build_opaque; + AcpiBuildState *build_state; AcpiBuildTables tables; + /* No ACPI configuration? Nothing to do. */ + if (!acpi_conf) { + return; + } + + build_state = acpi_conf->build_state; + /* No state to update or already patched? Nothing to do. */ if (!build_state || build_state->patched) { return; @@ -2783,7 +2780,7 @@ static void acpi_build_update(void *build_opaque) acpi_build_tables_init(&tables); - acpi_build(&tables, MACHINE(qdev_get_machine())); + acpi_build(&tables, MACHINE(qdev_get_machine()), acpi_conf); acpi_ram_update(build_state->table_mr, tables.table_data); @@ -2803,12 +2800,12 @@ static void acpi_build_reset(void *build_opaque) build_state->patched = 0; } -static MemoryRegion *acpi_add_rom_blob(AcpiBuildState *build_state, +static MemoryRegion *acpi_add_rom_blob(AcpiConfiguration *acpi_conf, GArray *blob, const char *name, uint64_t max_size) { return rom_add_blob(name, blob->data, acpi_data_len(blob), max_size, -1, - name, acpi_build_update, build_state, NULL, true); + name, acpi_build_update, acpi_conf, NULL, true); } static const VMStateDescription vmstate_acpi_build = { @@ -2816,59 +2813,48 @@ static const VMStateDescription vmstate_acpi_build = { .version_id = 1, .minimum_version_id = 1, .fields = (VMStateField[]) { - VMSTATE_UINT8(patched, AcpiBuildState), + VMSTATE_BOOL(patched, AcpiBuildState), VMSTATE_END_OF_LIST() }, }; -void acpi_setup(void) +void acpi_setup(MachineState *machine, AcpiConfiguration *acpi_conf) { - PCMachineState *pcms = PC_MACHINE(qdev_get_machine()); - PCMachineClass *pcmc = PC_MACHINE_GET_CLASS(pcms); AcpiBuildTables tables; AcpiBuildState *build_state; Object *vmgenid_dev; - if (!pcms->fw_cfg) { - ACPI_BUILD_DPRINTF("No fw cfg. Bailing out.\n"); - return; - } - - if (!pcms->acpi_build_enabled) { - ACPI_BUILD_DPRINTF("ACPI build disabled. Bailing out.\n"); - return; - } - - if (!acpi_enabled) { - ACPI_BUILD_DPRINTF("ACPI disabled. Bailing out.\n"); + if (!acpi_conf) { + ACPI_BUILD_DPRINTF("No ACPI config. Bailing out.\n"); return; } build_state = g_malloc0(sizeof *build_state); + acpi_conf->build_state = build_state; acpi_build_tables_init(&tables); - acpi_build(&tables, MACHINE(pcms)); + acpi_build(&tables, machine, acpi_conf); /* Now expose it all to Guest */ - build_state->table_mr = acpi_add_rom_blob(build_state, tables.table_data, + build_state->table_mr = acpi_add_rom_blob(acpi_conf, tables.table_data, ACPI_BUILD_TABLE_FILE, ACPI_BUILD_TABLE_MAX_SIZE); assert(build_state->table_mr != NULL); build_state->linker_mr = - acpi_add_rom_blob(build_state, tables.linker->cmd_blob, + acpi_add_rom_blob(acpi_conf, tables.linker->cmd_blob, "etc/table-loader", 0); - fw_cfg_add_file(pcms->fw_cfg, ACPI_BUILD_TPMLOG_FILE, + fw_cfg_add_file(acpi_conf->fw_cfg, ACPI_BUILD_TPMLOG_FILE, tables.tcpalog->data, acpi_data_len(tables.tcpalog)); vmgenid_dev = find_vmgenid_dev(); if (vmgenid_dev) { - vmgenid_add_fw_cfg(VMGENID(vmgenid_dev), pcms->fw_cfg, + vmgenid_add_fw_cfg(VMGENID(vmgenid_dev), acpi_conf->fw_cfg, tables.vmgenid); } - if (!pcmc->rsdp_in_ram) { + if (!acpi_conf->rsdp_in_ram) { /* * Keep for compatibility with old machine types. * Though RSDP is small, its contents isn't immutable, so @@ -2877,13 +2863,13 @@ void acpi_setup(void) uint32_t rsdp_size = acpi_data_len(tables.rsdp); build_state->rsdp = g_memdup(tables.rsdp->data, rsdp_size); - fw_cfg_add_file_callback(pcms->fw_cfg, ACPI_BUILD_RSDP_FILE, - acpi_build_update, NULL, build_state, + fw_cfg_add_file_callback(acpi_conf->fw_cfg, ACPI_BUILD_RSDP_FILE, + acpi_build_update, NULL, acpi_conf, build_state->rsdp, rsdp_size, true); build_state->rsdp_mr = NULL; } else { build_state->rsdp = NULL; - build_state->rsdp_mr = acpi_add_rom_blob(build_state, tables.rsdp, + build_state->rsdp_mr = acpi_add_rom_blob(acpi_conf, tables.rsdp, ACPI_BUILD_RSDP_FILE, 0); } diff --git a/hw/i386/pc.c b/hw/i386/pc.c index f095725dba..090f969933 100644 --- a/hw/i386/pc.c +++ b/hw/i386/pc.c @@ -444,17 +444,18 @@ void pc_cmos_init(PCMachineState *pcms, { int val; static pc_cmos_init_late_arg arg; + AcpiConfiguration *acpi_conf = &pcms->acpi_configuration; /* various important CMOS locations needed by PC/Bochs bios */ /* memory size */ /* base memory (first MiB) */ - val = MIN(pcms->below_4g_mem_size / KiB, 640); + val = MIN(acpi_conf->below_4g_mem_size / KiB, 640); rtc_set_memory(s, 0x15, val); rtc_set_memory(s, 0x16, val >> 8); /* extended memory (next 64MiB) */ - if (pcms->below_4g_mem_size > 1 * MiB) { - val = (pcms->below_4g_mem_size - 1 * MiB) / KiB; + if (acpi_conf->below_4g_mem_size > 1 * MiB) { + val = (acpi_conf->below_4g_mem_size - 1 * MiB) / KiB; } else { val = 0; } @@ -465,8 +466,8 @@ void pc_cmos_init(PCMachineState *pcms, rtc_set_memory(s, 0x30, val); rtc_set_memory(s, 0x31, val >> 8); /* memory between 16MiB and 4GiB */ - if (pcms->below_4g_mem_size > 16 * MiB) { - val = (pcms->below_4g_mem_size - 16 * MiB) / (64 * KiB); + if (acpi_conf->below_4g_mem_size > 16 * MiB) { + val = (acpi_conf->below_4g_mem_size - 16 * MiB) / (64 * KiB); } else { val = 0; } @@ -475,7 +476,7 @@ void pc_cmos_init(PCMachineState *pcms, rtc_set_memory(s, 0x34, val); rtc_set_memory(s, 0x35, val >> 8); /* memory above 4GiB */ - val = pcms->above_4g_mem_size / 65536; + val = acpi_conf->above_4g_mem_size / 65536; rtc_set_memory(s, 0x5b, val); rtc_set_memory(s, 0x5c, val >> 8); rtc_set_memory(s, 0x5d, val >> 16); @@ -714,13 +715,14 @@ static void pc_build_smbios(PCMachineState *pcms) unsigned i, array_count; MachineState *ms = MACHINE(pcms); X86CPU *cpu = X86_CPU(ms->possible_cpus->cpus[0].cpu); + AcpiConfiguration *acpi_conf = &pcms->acpi_configuration; /* tell smbios about cpuid version and features */ smbios_set_cpuid(cpu->env.cpuid_version, cpu->env.features[FEAT_1_EDX]); smbios_tables = smbios_get_table_legacy(&smbios_tables_len); if (smbios_tables) { - fw_cfg_add_bytes(pcms->fw_cfg, FW_CFG_SMBIOS_ENTRIES, + fw_cfg_add_bytes(acpi_conf->fw_cfg, FW_CFG_SMBIOS_ENTRIES, smbios_tables, smbios_tables_len); } @@ -741,9 +743,9 @@ static void pc_build_smbios(PCMachineState *pcms) g_free(mem_array); if (smbios_anchor) { - fw_cfg_add_file(pcms->fw_cfg, "etc/smbios/smbios-tables", + fw_cfg_add_file(acpi_conf->fw_cfg, "etc/smbios/smbios-tables", smbios_tables, smbios_tables_len); - fw_cfg_add_file(pcms->fw_cfg, "etc/smbios/smbios-anchor", + fw_cfg_add_file(acpi_conf->fw_cfg, "etc/smbios/smbios-anchor", smbios_anchor, smbios_anchor_len); } } @@ -755,6 +757,7 @@ static FWCfgState *bochs_bios_init(AddressSpace *as, PCMachineState *pcms) int i; const CPUArchIdList *cpus; MachineClass *mc = MACHINE_GET_CLASS(pcms); + AcpiConfiguration *acpi_conf = &pcms->acpi_configuration; fw_cfg = fw_cfg_init_io_dma(FW_CFG_IO_BASE, FW_CFG_IO_BASE + 4, as); fw_cfg_add_i16(fw_cfg, FW_CFG_NB_CPUS, pcms->boot_cpus); @@ -771,7 +774,7 @@ static FWCfgState *bochs_bios_init(AddressSpace *as, PCMachineState *pcms) * So for compatibility reasons with old BIOSes we are stuck with * "etc/max-cpus" actually being apic_id_limit */ - fw_cfg_add_i16(fw_cfg, FW_CFG_MAX_CPUS, (uint16_t)pcms->apic_id_limit); + fw_cfg_add_i16(fw_cfg, FW_CFG_MAX_CPUS, (uint16_t)acpi_conf->apic_id_limit); fw_cfg_add_i64(fw_cfg, FW_CFG_RAM_SIZE, (uint64_t)ram_size); fw_cfg_add_bytes(fw_cfg, FW_CFG_ACPI_TABLES, acpi_tables, acpi_tables_len); @@ -787,20 +790,21 @@ static FWCfgState *bochs_bios_init(AddressSpace *as, PCMachineState *pcms) * of nodes, one word for each VCPU->node and one word for each node to * hold the amount of memory. */ - numa_fw_cfg = g_new0(uint64_t, 1 + pcms->apic_id_limit + nb_numa_nodes); + numa_fw_cfg = g_new0(uint64_t, + 1 + acpi_conf->apic_id_limit + nb_numa_nodes); numa_fw_cfg[0] = cpu_to_le64(nb_numa_nodes); cpus = mc->possible_cpu_arch_ids(MACHINE(pcms)); for (i = 0; i < cpus->len; i++) { unsigned int apic_id = cpus->cpus[i].arch_id; - assert(apic_id < pcms->apic_id_limit); + assert(apic_id < acpi_conf->apic_id_limit); numa_fw_cfg[apic_id + 1] = cpu_to_le64(cpus->cpus[i].props.node_id); } for (i = 0; i < nb_numa_nodes; i++) { - numa_fw_cfg[pcms->apic_id_limit + 1 + i] = + numa_fw_cfg[acpi_conf->apic_id_limit + 1 + i] = cpu_to_le64(numa_info[i].node_mem); } fw_cfg_add_bytes(fw_cfg, FW_CFG_NUMA, numa_fw_cfg, - (1 + pcms->apic_id_limit + nb_numa_nodes) * + (1 + acpi_conf->apic_id_limit + nb_numa_nodes) * sizeof(*numa_fw_cfg)); return fw_cfg; @@ -848,6 +852,7 @@ static void load_linux(PCMachineState *pcms, char *vmode; MachineState *machine = MACHINE(pcms); PCMachineClass *pcmc = PC_MACHINE_GET_CLASS(pcms); + AcpiConfiguration *acpi_conf = &pcms->acpi_configuration; struct setup_data *setup_data; const char *kernel_filename = machine->kernel_filename; const char *initrd_filename = machine->initrd_filename; @@ -917,8 +922,8 @@ static void load_linux(PCMachineState *pcms, initrd_max = 0x37ffffff; } - if (initrd_max >= pcms->below_4g_mem_size - pcmc->acpi_data_size) { - initrd_max = pcms->below_4g_mem_size - pcmc->acpi_data_size - 1; + if (initrd_max >= acpi_conf->below_4g_mem_size - pcmc->acpi_data_size) { + initrd_max = acpi_conf->below_4g_mem_size - pcmc->acpi_data_size - 1; } fw_cfg_add_i32(fw_cfg, FW_CFG_CMDLINE_ADDR, cmdline_addr); @@ -1154,7 +1159,8 @@ void pc_cpus_init(PCMachineState *pcms) * * This is used for FW_CFG_MAX_CPUS. See comments on bochs_bios_init(). */ - pcms->apic_id_limit = x86_cpu_apic_id_from_index(max_cpus - 1) + 1; + pcms->acpi_configuration.apic_id_limit = + x86_cpu_apic_id_from_index(max_cpus - 1) + 1; possible_cpus = mc->possible_cpu_arch_ids(ms); for (i = 0; i < smp_cpus; i++) { pc_new_cpu(possible_cpus->cpus[i].type, possible_cpus->cpus[i].arch_id, @@ -1188,7 +1194,8 @@ static void pc_build_feature_control_file(PCMachineState *pcms) val = g_malloc(sizeof(*val)); *val = cpu_to_le64(feature_control_bits | FEATURE_CONTROL_LOCKED); - fw_cfg_add_file(pcms->fw_cfg, "etc/msr_feature_control", val, sizeof(*val)); + fw_cfg_add_file(pcms->acpi_configuration.fw_cfg, + "etc/msr_feature_control", val, sizeof(*val)); } static void rtc_set_cpus_count(ISADevice *rtc, uint16_t cpus_count) @@ -1204,11 +1211,26 @@ static void rtc_set_cpus_count(ISADevice *rtc, uint16_t cpus_count) } } +static void acpi_conf_pc_init(PCMachineState *pcms) +{ + PCMachineClass *pcmc = PC_MACHINE_GET_CLASS(pcms); + AcpiConfiguration *acpi_conf = &pcms->acpi_configuration; + + /* Machine class settings */ + acpi_conf->legacy_acpi_table_size = pcmc->legacy_acpi_table_size; + acpi_conf->legacy_cpu_hotplug = pcmc->legacy_cpu_hotplug; + acpi_conf->rsdp_in_ram = pcmc->rsdp_in_ram; + + /* ACPI build state */ + acpi_conf->build_state = NULL; +} + static void pc_machine_done(Notifier *notifier, void *data) { PCMachineState *pcms = container_of(notifier, PCMachineState, machine_done); + AcpiConfiguration *acpi_conf = &pcms->acpi_configuration; PCIBus *bus = pcms->bus; /* set the number of CPUs */ @@ -1223,23 +1245,27 @@ void pc_machine_done(Notifier *notifier, void *data) extra_hosts++; } } - if (extra_hosts && pcms->fw_cfg) { + if (extra_hosts && acpi_conf->fw_cfg) { uint64_t *val = g_malloc(sizeof(*val)); *val = cpu_to_le64(extra_hosts); - fw_cfg_add_file(pcms->fw_cfg, + fw_cfg_add_file(acpi_conf->fw_cfg, "etc/extra-pci-roots", val, sizeof(*val)); } } - acpi_setup(); - if (pcms->fw_cfg) { + if (pcms->acpi_build_enabled) { + acpi_conf_pc_init(pcms); + acpi_setup(MACHINE(pcms), acpi_conf); + } + + if (acpi_conf->fw_cfg) { pc_build_smbios(pcms); pc_build_feature_control_file(pcms); /* update FW_CFG_NB_CPUS to account for -device added CPUs */ - fw_cfg_modify_i16(pcms->fw_cfg, FW_CFG_NB_CPUS, pcms->boot_cpus); + fw_cfg_modify_i16(acpi_conf->fw_cfg, FW_CFG_NB_CPUS, pcms->boot_cpus); } - if (pcms->apic_id_limit > 255 && !xen_enabled()) { + if (acpi_conf->apic_id_limit > 255 && !xen_enabled()) { IntelIOMMUState *iommu = INTEL_IOMMU_DEVICE(x86_iommu_get_default()); if (!iommu || !iommu->x86_iommu.intr_supported || @@ -1256,13 +1282,14 @@ void pc_machine_done(Notifier *notifier, void *data) void pc_guest_info_init(PCMachineState *pcms) { int i; + AcpiConfiguration *acpi_conf = &pcms->acpi_configuration; - pcms->apic_xrupt_override = kvm_allows_irq0_override(); - pcms->numa_nodes = nb_numa_nodes; - pcms->node_mem = g_malloc0(pcms->numa_nodes * - sizeof *pcms->node_mem); + acpi_conf->apic_xrupt_override = kvm_allows_irq0_override(); + acpi_conf->numa_nodes = nb_numa_nodes; + acpi_conf->node_mem = g_malloc0(acpi_conf->numa_nodes * + sizeof *acpi_conf->node_mem); for (i = 0; i < nb_numa_nodes; i++) { - pcms->node_mem[i] = numa_info[i].node_mem; + acpi_conf->node_mem[i] = numa_info[i].node_mem; } pcms->machine_done.notify = pc_machine_done; @@ -1323,7 +1350,7 @@ void xen_load_linux(PCMachineState *pcms) !strcmp(option_rom[i].name, "multiboot.bin")); rom_add_option(option_rom[i].name, option_rom[i].bootindex); } - pcms->fw_cfg = fw_cfg; + pcms->acpi_configuration.fw_cfg = fw_cfg; } void pc_memory_init(PCMachineState *pcms, @@ -1337,9 +1364,10 @@ void pc_memory_init(PCMachineState *pcms, FWCfgState *fw_cfg; MachineState *machine = MACHINE(pcms); PCMachineClass *pcmc = PC_MACHINE_GET_CLASS(pcms); + AcpiConfiguration *acpi_conf = &pcms->acpi_configuration; - assert(machine->ram_size == pcms->below_4g_mem_size + - pcms->above_4g_mem_size); + assert(machine->ram_size == acpi_conf->below_4g_mem_size + + acpi_conf->above_4g_mem_size); linux_boot = (machine->kernel_filename != NULL); @@ -1353,17 +1381,17 @@ void pc_memory_init(PCMachineState *pcms, *ram_memory = ram; ram_below_4g = g_malloc(sizeof(*ram_below_4g)); memory_region_init_alias(ram_below_4g, NULL, "ram-below-4g", ram, - 0, pcms->below_4g_mem_size); + 0, acpi_conf->below_4g_mem_size); memory_region_add_subregion(system_memory, 0, ram_below_4g); - e820_add_entry(0, pcms->below_4g_mem_size, E820_RAM); - if (pcms->above_4g_mem_size > 0) { + e820_add_entry(0, acpi_conf->below_4g_mem_size, E820_RAM); + if (acpi_conf->above_4g_mem_size > 0) { ram_above_4g = g_malloc(sizeof(*ram_above_4g)); memory_region_init_alias(ram_above_4g, NULL, "ram-above-4g", ram, - pcms->below_4g_mem_size, - pcms->above_4g_mem_size); + acpi_conf->below_4g_mem_size, + acpi_conf->above_4g_mem_size); memory_region_add_subregion(system_memory, 0x100000000ULL, ram_above_4g); - e820_add_entry(0x100000000ULL, pcms->above_4g_mem_size, E820_RAM); + e820_add_entry(0x100000000ULL, acpi_conf->above_4g_mem_size, E820_RAM); } if (!pcmc->has_reserved_memory && @@ -1398,7 +1426,7 @@ void pc_memory_init(PCMachineState *pcms, } machine->device_memory->base = - ROUND_UP(0x100000000ULL + pcms->above_4g_mem_size, 1 * GiB); + ROUND_UP(0x100000000ULL + acpi_conf->above_4g_mem_size, 1 * GiB); if (pcmc->enforce_aligned_dimm) { /* size device region assuming 1G page max alignment per slot */ @@ -1455,7 +1483,7 @@ void pc_memory_init(PCMachineState *pcms, for (i = 0; i < nb_option_roms; i++) { rom_add_option(option_rom[i].name, option_rom[i].bootindex); } - pcms->fw_cfg = fw_cfg; + acpi_conf->fw_cfg = fw_cfg; /* Init default IOAPIC address space */ pcms->ioapic_as = &address_space_memory; @@ -1478,7 +1506,8 @@ uint64_t pc_pci_hole64_start(void) hole64_start += memory_region_size(&ms->device_memory->mr); } } else { - hole64_start = 0x100000000ULL + pcms->above_4g_mem_size; + hole64_start = + 0x100000000ULL + pcms->acpi_configuration.above_4g_mem_size; } return ROUND_UP(hole64_start, 1 * GiB); @@ -1685,21 +1714,22 @@ static void pc_memory_pre_plug(HotplugHandler *hotplug_dev, DeviceState *dev, { const PCMachineState *pcms = PC_MACHINE(hotplug_dev); const PCMachineClass *pcmc = PC_MACHINE_GET_CLASS(pcms); + const AcpiConfiguration *acpi_conf = &pcms->acpi_configuration; const bool is_nvdimm = object_dynamic_cast(OBJECT(dev), TYPE_NVDIMM); const uint64_t legacy_align = TARGET_PAGE_SIZE; /* * When -no-acpi is used with Q35 machine type, no ACPI is built, - * but pcms->acpi_dev is still created. Check !acpi_enabled in + * but acpi_dev is still created. Check !acpi_enabled in * addition to cover this case. */ - if (!pcms->acpi_dev || !acpi_enabled) { + if (!acpi_conf->acpi_dev || !acpi_enabled) { error_setg(errp, "memory hotplug is not enabled: missing acpi device or acpi disabled"); return; } - if (is_nvdimm && !pcms->acpi_nvdimm_state.is_enabled) { + if (is_nvdimm && !acpi_conf->acpi_nvdimm_state.is_enabled) { error_setg(errp, "nvdimm is not enabled: missing 'nvdimm' in '-M'"); return; } @@ -1715,6 +1745,7 @@ static void pc_memory_plug(HotplugHandler *hotplug_dev, Error *local_err = NULL; PCMachineState *pcms = PC_MACHINE(hotplug_dev); bool is_nvdimm = object_dynamic_cast(OBJECT(dev), TYPE_NVDIMM); + AcpiConfiguration *acpi_conf = &pcms->acpi_configuration; pc_dimm_plug(PC_DIMM(dev), MACHINE(pcms), &local_err); if (local_err) { @@ -1722,11 +1753,11 @@ static void pc_memory_plug(HotplugHandler *hotplug_dev, } if (is_nvdimm) { - nvdimm_plug(&pcms->acpi_nvdimm_state); + nvdimm_plug(&acpi_conf->acpi_nvdimm_state); } - hhc = HOTPLUG_HANDLER_GET_CLASS(pcms->acpi_dev); - hhc->plug(HOTPLUG_HANDLER(pcms->acpi_dev), dev, &error_abort); + hhc = HOTPLUG_HANDLER_GET_CLASS(acpi_conf->acpi_dev); + hhc->plug(HOTPLUG_HANDLER(acpi_conf->acpi_dev), dev, &error_abort); out: error_propagate(errp, local_err); } @@ -1737,13 +1768,14 @@ static void pc_memory_unplug_request(HotplugHandler *hotplug_dev, HotplugHandlerClass *hhc; Error *local_err = NULL; PCMachineState *pcms = PC_MACHINE(hotplug_dev); + AcpiConfiguration *acpi_conf = &pcms->acpi_configuration; /* * When -no-acpi is used with Q35 machine type, no ACPI is built, - * but pcms->acpi_dev is still created. Check !acpi_enabled in + * but acpi_dev is still created. Check !acpi_enabled in * addition to cover this case. */ - if (!pcms->acpi_dev || !acpi_enabled) { + if (!acpi_conf->acpi_dev || !acpi_enabled) { error_setg(&local_err, "memory hotplug is not enabled: missing acpi device or acpi disabled"); goto out; @@ -1755,8 +1787,8 @@ static void pc_memory_unplug_request(HotplugHandler *hotplug_dev, goto out; } - hhc = HOTPLUG_HANDLER_GET_CLASS(pcms->acpi_dev); - hhc->unplug_request(HOTPLUG_HANDLER(pcms->acpi_dev), dev, &local_err); + hhc = HOTPLUG_HANDLER_GET_CLASS(acpi_conf->acpi_dev); + hhc->unplug_request(HOTPLUG_HANDLER(acpi_conf->acpi_dev), dev, &local_err); out: error_propagate(errp, local_err); @@ -1766,11 +1798,12 @@ static void pc_memory_unplug(HotplugHandler *hotplug_dev, DeviceState *dev, Error **errp) { PCMachineState *pcms = PC_MACHINE(hotplug_dev); + AcpiConfiguration *acpi_conf = &pcms->acpi_configuration; HotplugHandlerClass *hhc; Error *local_err = NULL; - hhc = HOTPLUG_HANDLER_GET_CLASS(pcms->acpi_dev); - hhc->unplug(HOTPLUG_HANDLER(pcms->acpi_dev), dev, &local_err); + hhc = HOTPLUG_HANDLER_GET_CLASS(acpi_conf->acpi_dev); + hhc->unplug(HOTPLUG_HANDLER(acpi_conf->acpi_dev), dev, &local_err); if (local_err) { goto out; @@ -1817,10 +1850,11 @@ static void pc_cpu_plug(HotplugHandler *hotplug_dev, Error *local_err = NULL; X86CPU *cpu = X86_CPU(dev); PCMachineState *pcms = PC_MACHINE(hotplug_dev); + AcpiConfiguration *acpi_conf = &pcms->acpi_configuration; - if (pcms->acpi_dev) { - hhc = HOTPLUG_HANDLER_GET_CLASS(pcms->acpi_dev); - hhc->plug(HOTPLUG_HANDLER(pcms->acpi_dev), dev, &local_err); + if (acpi_conf->acpi_dev) { + hhc = HOTPLUG_HANDLER_GET_CLASS(acpi_conf->acpi_dev); + hhc->plug(HOTPLUG_HANDLER(acpi_conf->acpi_dev), dev, &local_err); if (local_err) { goto out; } @@ -1831,8 +1865,8 @@ static void pc_cpu_plug(HotplugHandler *hotplug_dev, if (pcms->rtc) { rtc_set_cpus_count(pcms->rtc, pcms->boot_cpus); } - if (pcms->fw_cfg) { - fw_cfg_modify_i16(pcms->fw_cfg, FW_CFG_NB_CPUS, pcms->boot_cpus); + if (acpi_conf->fw_cfg) { + fw_cfg_modify_i16(acpi_conf->fw_cfg, FW_CFG_NB_CPUS, pcms->boot_cpus); } found_cpu = pc_find_cpu_slot(MACHINE(pcms), cpu->apic_id, NULL); @@ -1848,8 +1882,9 @@ static void pc_cpu_unplug_request_cb(HotplugHandler *hotplug_dev, Error *local_err = NULL; X86CPU *cpu = X86_CPU(dev); PCMachineState *pcms = PC_MACHINE(hotplug_dev); + AcpiConfiguration *acpi_conf = &pcms->acpi_configuration; - if (!pcms->acpi_dev) { + if (!acpi_conf->acpi_dev) { error_setg(&local_err, "CPU hot unplug not supported without ACPI"); goto out; } @@ -1861,8 +1896,8 @@ static void pc_cpu_unplug_request_cb(HotplugHandler *hotplug_dev, goto out; } - hhc = HOTPLUG_HANDLER_GET_CLASS(pcms->acpi_dev); - hhc->unplug_request(HOTPLUG_HANDLER(pcms->acpi_dev), dev, &local_err); + hhc = HOTPLUG_HANDLER_GET_CLASS(acpi_conf->acpi_dev); + hhc->unplug_request(HOTPLUG_HANDLER(acpi_conf->acpi_dev), dev, &local_err); if (local_err) { goto out; @@ -1881,9 +1916,10 @@ static void pc_cpu_unplug_cb(HotplugHandler *hotplug_dev, Error *local_err = NULL; X86CPU *cpu = X86_CPU(dev); PCMachineState *pcms = PC_MACHINE(hotplug_dev); + AcpiConfiguration *acpi_conf = &pcms->acpi_configuration; - hhc = HOTPLUG_HANDLER_GET_CLASS(pcms->acpi_dev); - hhc->unplug(HOTPLUG_HANDLER(pcms->acpi_dev), dev, &local_err); + hhc = HOTPLUG_HANDLER_GET_CLASS(acpi_conf->acpi_dev); + hhc->unplug(HOTPLUG_HANDLER(acpi_conf->acpi_dev), dev, &local_err); if (local_err) { goto out; @@ -1897,7 +1933,7 @@ static void pc_cpu_unplug_cb(HotplugHandler *hotplug_dev, pcms->boot_cpus--; /* Update the number of CPUs in CMOS */ rtc_set_cpus_count(pcms->rtc, pcms->boot_cpus); - fw_cfg_modify_i16(pcms->fw_cfg, FW_CFG_NB_CPUS, pcms->boot_cpus); + fw_cfg_modify_i16(acpi_conf->fw_cfg, FW_CFG_NB_CPUS, pcms->boot_cpus); out: error_propagate(errp, local_err); } @@ -2181,28 +2217,30 @@ static bool pc_machine_get_nvdimm(Object *obj, Error **errp) { PCMachineState *pcms = PC_MACHINE(obj); - return pcms->acpi_nvdimm_state.is_enabled; + return pcms->acpi_configuration.acpi_nvdimm_state.is_enabled; } static void pc_machine_set_nvdimm(Object *obj, bool value, Error **errp) { PCMachineState *pcms = PC_MACHINE(obj); + AcpiConfiguration *acpi_conf = &pcms->acpi_configuration; - pcms->acpi_nvdimm_state.is_enabled = value; + acpi_conf->acpi_nvdimm_state.is_enabled = value; } static char *pc_machine_get_nvdimm_persistence(Object *obj, Error **errp) { PCMachineState *pcms = PC_MACHINE(obj); + AcpiConfiguration *acpi_conf = &pcms->acpi_configuration; - return g_strdup(pcms->acpi_nvdimm_state.persistence_string); + return g_strdup(acpi_conf->acpi_nvdimm_state.persistence_string); } static void pc_machine_set_nvdimm_persistence(Object *obj, const char *value, Error **errp) { PCMachineState *pcms = PC_MACHINE(obj); - AcpiNVDIMMState *nvdimm_state = &pcms->acpi_nvdimm_state; + AcpiNVDIMMState *nvdimm_state = &pcms->acpi_configuration.acpi_nvdimm_state; if (strcmp(value, "cpu") == 0) nvdimm_state->persistence = 3; @@ -2268,7 +2306,7 @@ static void pc_machine_initfn(Object *obj) pcms->smm = ON_OFF_AUTO_AUTO; pcms->vmport = ON_OFF_AUTO_AUTO; /* nvdimm is disabled on default. */ - pcms->acpi_nvdimm_state.is_enabled = false; + pcms->acpi_configuration.acpi_nvdimm_state.is_enabled = false; /* acpi build is enabled by default if machine supports it */ pcms->acpi_build_enabled = PC_MACHINE_GET_CLASS(pcms)->has_acpi_build; pcms->smbus = true; diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c index dc09466b3e..0620d10715 100644 --- a/hw/i386/pc_piix.c +++ b/hw/i386/pc_piix.c @@ -71,6 +71,7 @@ static void pc_init1(MachineState *machine, { PCMachineState *pcms = PC_MACHINE(machine); PCMachineClass *pcmc = PC_MACHINE_GET_CLASS(pcms); + AcpiConfiguration *acpi_conf = &pcms->acpi_configuration; MemoryRegion *system_memory = get_system_memory(); MemoryRegion *system_io = get_system_io(); int i; @@ -142,11 +143,11 @@ static void pc_init1(MachineState *machine, } if (machine->ram_size >= lowmem) { - pcms->above_4g_mem_size = machine->ram_size - lowmem; - pcms->below_4g_mem_size = lowmem; + acpi_conf->above_4g_mem_size = machine->ram_size - lowmem; + acpi_conf->below_4g_mem_size = lowmem; } else { - pcms->above_4g_mem_size = 0; - pcms->below_4g_mem_size = machine->ram_size; + acpi_conf->above_4g_mem_size = 0; + acpi_conf->below_4g_mem_size = machine->ram_size; } } @@ -199,8 +200,8 @@ static void pc_init1(MachineState *machine, pci_type, &i440fx_state, &piix3_devfn, &isa_bus, pcms->gsi, system_memory, system_io, machine->ram_size, - pcms->below_4g_mem_size, - pcms->above_4g_mem_size, + acpi_conf->below_4g_mem_size, + acpi_conf->above_4g_mem_size, pci_memory, ram_memory); pcms->bus = pci_bus; } else { @@ -289,16 +290,16 @@ static void pc_init1(MachineState *machine, object_property_add_link(OBJECT(machine), PC_MACHINE_ACPI_DEVICE_PROP, TYPE_HOTPLUG_HANDLER, - (Object **)&pcms->acpi_dev, + (Object **)&acpi_conf->acpi_dev, object_property_allow_set_link, OBJ_PROP_LINK_STRONG, &error_abort); object_property_set_link(OBJECT(machine), OBJECT(piix4_pm), PC_MACHINE_ACPI_DEVICE_PROP, &error_abort); } - if (pcms->acpi_nvdimm_state.is_enabled) { - nvdimm_init_acpi_state(&pcms->acpi_nvdimm_state, system_io, - pcms->fw_cfg, OBJECT(pcms)); + if (acpi_conf->acpi_nvdimm_state.is_enabled) { + nvdimm_init_acpi_state(&acpi_conf->acpi_nvdimm_state, system_io, + acpi_conf->fw_cfg, OBJECT(pcms)); } } diff --git a/hw/i386/pc_q35.c b/hw/i386/pc_q35.c index 532241e3f8..cdde4a4beb 100644 --- a/hw/i386/pc_q35.c +++ b/hw/i386/pc_q35.c @@ -63,6 +63,7 @@ static void pc_q35_init(MachineState *machine) { PCMachineState *pcms = PC_MACHINE(machine); PCMachineClass *pcmc = PC_MACHINE_GET_CLASS(pcms); + AcpiConfiguration *acpi_conf = &pcms->acpi_configuration; Q35PCIHost *q35_host; PCIHostState *phb; PCIBus *host_bus; @@ -116,11 +117,11 @@ static void pc_q35_init(MachineState *machine) } if (machine->ram_size >= lowmem) { - pcms->above_4g_mem_size = machine->ram_size - lowmem; - pcms->below_4g_mem_size = lowmem; + acpi_conf->above_4g_mem_size = machine->ram_size - lowmem; + acpi_conf->below_4g_mem_size = lowmem; } else { - pcms->above_4g_mem_size = 0; - pcms->below_4g_mem_size = machine->ram_size; + acpi_conf->above_4g_mem_size = 0; + acpi_conf->below_4g_mem_size = machine->ram_size; } if (xen_enabled()) { @@ -179,9 +180,9 @@ static void pc_q35_init(MachineState *machine) MCH_HOST_PROP_SYSTEM_MEM, NULL); object_property_set_link(OBJECT(q35_host), OBJECT(system_io), MCH_HOST_PROP_IO_MEM, NULL); - object_property_set_int(OBJECT(q35_host), pcms->below_4g_mem_size, + object_property_set_int(OBJECT(q35_host), acpi_conf->below_4g_mem_size, PCI_HOST_BELOW_4G_MEM_SIZE, NULL); - object_property_set_int(OBJECT(q35_host), pcms->above_4g_mem_size, + object_property_set_int(OBJECT(q35_host), acpi_conf->above_4g_mem_size, PCI_HOST_ABOVE_4G_MEM_SIZE, NULL); /* pci */ qdev_init_nofail(DEVICE(q35_host)); @@ -194,7 +195,7 @@ static void pc_q35_init(MachineState *machine) object_property_add_link(OBJECT(machine), PC_MACHINE_ACPI_DEVICE_PROP, TYPE_HOTPLUG_HANDLER, - (Object **)&pcms->acpi_dev, + (Object **)&acpi_conf->acpi_dev, object_property_allow_set_link, OBJ_PROP_LINK_STRONG, &error_abort); object_property_set_link(OBJECT(machine), OBJECT(lpc), @@ -276,9 +277,9 @@ static void pc_q35_init(MachineState *machine) pc_vga_init(isa_bus, host_bus); pc_nic_init(pcmc, isa_bus, host_bus); - if (pcms->acpi_nvdimm_state.is_enabled) { - nvdimm_init_acpi_state(&pcms->acpi_nvdimm_state, system_io, - pcms->fw_cfg, OBJECT(pcms)); + if (acpi_conf->acpi_nvdimm_state.is_enabled) { + nvdimm_init_acpi_state(&acpi_conf->acpi_nvdimm_state, system_io, + acpi_conf->fw_cfg, OBJECT(pcms)); } } diff --git a/hw/i386/xen/xen-hvm.c b/hw/i386/xen/xen-hvm.c index 935a3676c8..0459fb7340 100644 --- a/hw/i386/xen/xen-hvm.c +++ b/hw/i386/xen/xen-hvm.c @@ -190,6 +190,7 @@ qemu_irq *xen_interrupt_controller_init(void) static void xen_ram_init(PCMachineState *pcms, ram_addr_t ram_size, MemoryRegion **ram_memory_p) { + AcpiConfiguration *acpi_conf = &pcms->acpi_configuration; MemoryRegion *sysmem = get_system_memory(); ram_addr_t block_len; uint64_t user_lowmem = object_property_get_uint(qdev_get_machine(), @@ -207,20 +208,20 @@ static void xen_ram_init(PCMachineState *pcms, } if (ram_size >= user_lowmem) { - pcms->above_4g_mem_size = ram_size - user_lowmem; - pcms->below_4g_mem_size = user_lowmem; + acpi_conf->above_4g_mem_size = ram_size - user_lowmem; + acpi_conf->below_4g_mem_size = user_lowmem; } else { - pcms->above_4g_mem_size = 0; - pcms->below_4g_mem_size = ram_size; + acpi_conf->above_4g_mem_size = 0; + acpi_conf->below_4g_mem_size = ram_size; } - if (!pcms->above_4g_mem_size) { + if (!acpi_conf->above_4g_mem_size) { block_len = ram_size; } else { /* * Xen does not allocate the memory continuously, it keeps a * hole of the size computed above or passed in. */ - block_len = (1ULL << 32) + pcms->above_4g_mem_size; + block_len = (1ULL << 32) + acpi_conf->above_4g_mem_size; } memory_region_init_ram(&ram_memory, NULL, "xen.ram", block_len, &error_fatal); @@ -237,12 +238,12 @@ static void xen_ram_init(PCMachineState *pcms, */ memory_region_init_alias(&ram_lo, NULL, "xen.ram.lo", &ram_memory, 0xc0000, - pcms->below_4g_mem_size - 0xc0000); + acpi_conf->below_4g_mem_size - 0xc0000); memory_region_add_subregion(sysmem, 0xc0000, &ram_lo); - if (pcms->above_4g_mem_size > 0) { + if (acpi_conf->above_4g_mem_size > 0) { memory_region_init_alias(&ram_hi, NULL, "xen.ram.hi", &ram_memory, 0x100000000ULL, - pcms->above_4g_mem_size); + acpi_conf->above_4g_mem_size); memory_region_add_subregion(sysmem, 0x100000000ULL, &ram_hi); } } -- 2.19.1 From mboxrd@z Thu Jan 1 00:00:00 1970 From: Samuel Ortiz Subject: [PATCH v5 01/24] hw: i386: Decouple the ACPI build from the PC machine type Date: Mon, 5 Nov 2018 02:40:24 +0100 Message-ID: <20181105014047.26447-2-sameo@linux.intel.com> References: <20181105014047.26447-1-sameo@linux.intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from all-amaz-eas1.inumbo.com ([34.197.232.57] helo=us1-amaz-eas2.inumbo.com) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1gJTti-0003Tv-2p for xen-devel@lists.xenproject.org; Mon, 05 Nov 2018 01:41:46 +0000 In-Reply-To: <20181105014047.26447-1-sameo@linux.intel.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Sender: "Xen-devel" To: qemu-devel@nongnu.org Cc: Peter Maydell , Stefano Stabellini , Eduardo Habkost , "Michael S. Tsirkin" , Shannon Zhao , Igor Mammedov , qemu-arm@nongnu.org, Marcel Apfelbaum , Paolo Bonzini , Anthony Perard , xen-devel@lists.xenproject.org, Richard Henderson List-Id: xen-devel@lists.xenproject.org QUNQSSB0YWJsZXMgYXJlIHBsYXRmb3JtIGFuZCBtYWNoaW5lIHR5cGUgYW5kIGV2ZW4gYXJjaGl0 ZWN0dXJlCmFnbm9zdGljLCBhbmQgYXMgc3VjaCB3ZSB3YW50IHRvIHByb3ZpZGUgYW4gaW50ZXJu YWwgQUNQSSBBUEkgdGhhdApvbmx5IGRlcGVuZHMgb24gcGxhdGZvcm0gYWdub3N0aWMgaW5mb3Jt YXRpb24uCgpGb3IgdGhlIHg4NiBhcmNoaXRlY3R1cmUsIGluIG9yZGVyIHRvIGJ1aWxkIEFDUEkg dGFibGVzIGluZGVwZW5kZW50bHkKZnJvbSB0aGUgUEMgb3IgUTM1IG1hY2hpbmUgdHlwZXMsIHdl IGFyZSBtb3ZpbmcgYSBmZXcgTWFjaGluZVN0YXRlCnN0cnVjdHVyZSBmaWVsZHMgaW50byBhIG1h Y2hpbmUgdHlwZSBhZ25vc3RpYyBzdHJ1Y3R1cmUgY2FsbGVkCkFjcGlDb25maWd1cmF0aW9uLiBU aGUgc3RydWN0dXJlIGZpZWxkcyB3ZSBtb3ZlIGFyZToKCiAgIEhvdHBsdWdIYW5kbGVyICphY3Bp X2RldgogICBBY3BpTlZESU1NU3RhdGUgYWNwaV9udmRpbW1fc3RhdGU7CiAgIEZXQ2ZnU3RhdGUg KmZ3X2NmZwogICByYW1fYWRkcl90IGJlbG93XzRnX21lbV9zaXplLCBhYm92ZV80Z19tZW1fc2l6 ZQogICBib29sIGFwaWNfeHJ1cHRfb3ZlcnJpZGUKICAgdW5zaWduZWQgYXBpY19pZF9saW1pdAog ICB1aW50NjRfdCBudW1hX25vZGVzCiAgIHVpbnQ2NF90IG51bWFfbWVtCgpTaWduZWQtb2ZmLWJ5 OiBTYW11ZWwgT3J0aXogPHNhbWVvQGxpbnV4LmludGVsLmNvbT4KLS0tCiBody9pMzg2L2FjcGkt YnVpbGQuaCAgICAgfCAgIDQgKy0KIGluY2x1ZGUvaHcvYWNwaS9hY3BpLmggICB8ICA0NCArKysr KysrKysrCiBpbmNsdWRlL2h3L2kzODYvcGMuaCAgICAgfCAgMTkgKystLS0KIGh3L2FjcGkvY3B1 X2hvdHBsdWcuYyAgICB8ICAgOSArLQogaHcvYXJtL3ZpcnQtYWNwaS1idWlsZC5jIHwgIDEwIC0t LQogaHcvaTM4Ni9hY3BpLWJ1aWxkLmMgICAgIHwgMTM2ICsrKysrKysrKysrKysrLS0tLS0tLS0t LS0tLS0tLQogaHcvaTM4Ni9wYy5jICAgICAgICAgICAgIHwgMTc2ICsrKysrKysrKysrKysrKysr KysrKysrKy0tLS0tLS0tLS0tLS0tLQogaHcvaTM4Ni9wY19waWl4LmMgICAgICAgIHwgIDIxICsr LS0tCiBody9pMzg2L3BjX3EzNS5jICAgICAgICAgfCAgMjEgKystLS0KIGh3L2kzODYveGVuL3hl bi1odm0uYyAgICB8ICAxOSArKystLQogMTAgZmlsZXMgY2hhbmdlZCwgMjU3IGluc2VydGlvbnMo KyksIDIwMiBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9ody9pMzg2L2FjcGktYnVpbGQuaCBi L2h3L2kzODYvYWNwaS1idWlsZC5oCmluZGV4IDAwNzMzMmU1MWMuLjA2NWExZDgyNTAgMTAwNjQ0 Ci0tLSBhL2h3L2kzODYvYWNwaS1idWlsZC5oCisrKyBiL2h3L2kzODYvYWNwaS1idWlsZC5oCkBA IC0yLDYgKzIsOCBAQAogI2lmbmRlZiBIV19JMzg2X0FDUElfQlVJTERfSAogI2RlZmluZSBIV19J Mzg2X0FDUElfQlVJTERfSAogCi12b2lkIGFjcGlfc2V0dXAodm9pZCk7CisjaW5jbHVkZSAiaHcv YWNwaS9hY3BpLmgiCisKK3ZvaWQgYWNwaV9zZXR1cChNYWNoaW5lU3RhdGUgKm1hY2hpbmUsIEFj cGlDb25maWd1cmF0aW9uICphY3BpX2NvbmYpOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1 ZGUvaHcvYWNwaS9hY3BpLmggYi9pbmNsdWRlL2h3L2FjcGkvYWNwaS5oCmluZGV4IGMyMGFjZTBk MGIuLjI1NGM4ZDBjZmMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvaHcvYWNwaS9hY3BpLmgKKysrIGIv aW5jbHVkZS9ody9hY3BpL2FjcGkuaApAQCAtMjQsNiArMjQsOCBAQAogI2luY2x1ZGUgImV4ZWMv bWVtb3J5LmgiCiAjaW5jbHVkZSAiaHcvaXJxLmgiCiAjaW5jbHVkZSAiaHcvYWNwaS9hY3BpX2Rl dl9pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJody9ob3RwbHVnLmgiCisjaW5jbHVkZSAiaHcvbWVt L252ZGltbS5oIgogCiAvKgogICogY3VycmVudCBkZXZpY2UgbmFtaW5nIHNjaGVtZSBzdXBwb3J0 cyB1cCB0byAyNTYgbWVtb3J5IGRldmljZXMKQEAgLTE4Niw2ICsxODgsNDggQEAgZXh0ZXJuIGlu dCBhY3BpX2VuYWJsZWQ7CiBleHRlcm4gY2hhciB1bnNpZ25lZCAqYWNwaV90YWJsZXM7CiBleHRl cm4gc2l6ZV90IGFjcGlfdGFibGVzX2xlbjsKIAordHlwZWRlZgorc3RydWN0IEFjcGlCdWlsZFN0 YXRlIHsKKyAgICAvKiBDb3B5IG9mIHRhYmxlIGluIFJBTSAoZm9yIHBhdGNoaW5nKS4gKi8KKyAg ICBNZW1vcnlSZWdpb24gKnRhYmxlX21yOworICAgIC8qIElzIHRhYmxlIHBhdGNoZWQ/ICovCisg ICAgYm9vbCBwYXRjaGVkOworICAgIHZvaWQgKnJzZHA7CisgICAgTWVtb3J5UmVnaW9uICpyc2Rw X21yOworICAgIE1lbW9yeVJlZ2lvbiAqbGlua2VyX21yOworfSBBY3BpQnVpbGRTdGF0ZTsKKwor dHlwZWRlZgorc3RydWN0IEFjcGlDb25maWd1cmF0aW9uIHsKKyAgICAvKiBNYWNoaW5lIGNsYXNz IEFDUEkgc2V0dGluZ3MgKi8KKyAgICBpbnQgbGVnYWN5X2FjcGlfdGFibGVfc2l6ZTsKKyAgICBi b29sIHJzZHBfaW5fcmFtOworICAgIHVuc2lnbmVkIGFjcGlfZGF0YV9zaXplOworCisgICAgLyog TWFjaGluZSBzdGF0ZSBBQ1BJIHNldHRpbmdzICovCisgICAgSG90cGx1Z0hhbmRsZXIgKmFjcGlf ZGV2OworICAgIEFjcGlOVkRJTU1TdGF0ZSBhY3BpX252ZGltbV9zdGF0ZTsKKworICAgIC8qCisg ICAgICogVGhlIGZpZWxkcyBiZWxvdyBhcmUgbWFjaGluZSBzZXR0aW5ncyB0aGF0CisgICAgICog YXJlIG5vdCBBQ1BJIHNwZWNpZmljLiBIb3dldmVyIHRoZXkgYXJlIG5lZWRlZAorICAgICAqIGZv ciBidWlsZGluZyBBQ1BJIHRhYmxlcyBhbmQgYXMgc3VjaCBzaG91bGQgYmUKKyAgICAgKiBjYXJy aWVkIHRocm91Z2ggdGhlIEFDUEkgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUuCisgICAgICovCisg ICAgYm9vbCBsZWdhY3lfY3B1X2hvdHBsdWc7CisgICAgYm9vbCBsaW51eGJvb3RfZG1hX2VuYWJs ZWQ7CisgICAgRldDZmdTdGF0ZSAqZndfY2ZnOworICAgIHJhbV9hZGRyX3QgYmVsb3dfNGdfbWVt X3NpemUsIGFib3ZlXzRnX21lbV9zaXplOzsKKyAgICB1aW50NjRfdCBudW1hX25vZGVzOworICAg IHVpbnQ2NF90ICpub2RlX21lbTsKKyAgICBib29sIGFwaWNfeHJ1cHRfb3ZlcnJpZGU7CisgICAg dW5zaWduZWQgYXBpY19pZF9saW1pdDsKKyAgICBQQ0lIb3N0U3RhdGUgKnBjaV9ob3N0OworCisg ICAgLyogQnVpbGQgc3RhdGUgKi8KKyAgICBBY3BpQnVpbGRTdGF0ZSAqYnVpbGRfc3RhdGU7Cit9 IEFjcGlDb25maWd1cmF0aW9uOworCiB1aW50OF90ICphY3BpX3RhYmxlX2ZpcnN0KHZvaWQpOwog dWludDhfdCAqYWNwaV90YWJsZV9uZXh0KHVpbnQ4X3QgKmN1cnJlbnQpOwogdW5zaWduZWQgYWNw aV90YWJsZV9sZW4odm9pZCAqY3VycmVudCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2h3L2kzODYv cGMuaCBiL2luY2x1ZGUvaHcvaTM4Ni9wYy5oCmluZGV4IDEzNmZlNDk3YjYuLmZlZDEzNmZjZGQg MTAwNjQ0Ci0tLSBhL2luY2x1ZGUvaHcvaTM4Ni9wYy5oCisrKyBiL2luY2x1ZGUvaHcvaTM4Ni9w Yy5oCkBAIC0xMiw2ICsxMiw3IEBACiAjaW5jbHVkZSAicWVtdS9yYW5nZS5oIgogI2luY2x1ZGUg InFlbXUvYml0bWFwLmgiCiAjaW5jbHVkZSAic3lzZW11L3N5c2VtdS5oIgorI2luY2x1ZGUgImh3 L2FjcGkvYWNwaS5oIgogI2luY2x1ZGUgImh3L3BjaS9wY2kuaCIKICNpbmNsdWRlICJody9jb21w YXQuaCIKICNpbmNsdWRlICJody9tZW0vcGMtZGltbS5oIgpAQCAtMzUsMTAgKzM2LDggQEAgc3Ry dWN0IFBDTWFjaGluZVN0YXRlIHsKICAgICBOb3RpZmllciBtYWNoaW5lX2RvbmU7CiAKICAgICAv KiBQb2ludGVycyB0byBkZXZpY2VzIGFuZCBvYmplY3RzOiAqLwotICAgIEhvdHBsdWdIYW5kbGVy ICphY3BpX2RldjsKICAgICBJU0FEZXZpY2UgKnJ0YzsKICAgICBQQ0lCdXMgKmJ1czsKLSAgICBG V0NmZ1N0YXRlICpmd19jZmc7CiAgICAgcWVtdV9pcnEgKmdzaTsKIAogICAgIC8qIENvbmZpZ3Vy YXRpb24gb3B0aW9uczogKi8KQEAgLTQ2LDI4ICs0NSwyMCBAQCBzdHJ1Y3QgUENNYWNoaW5lU3Rh dGUgewogICAgIE9uT2ZmQXV0byB2bXBvcnQ7CiAgICAgT25PZmZBdXRvIHNtbTsKIAotICAgIEFj cGlOVkRJTU1TdGF0ZSBhY3BpX252ZGltbV9zdGF0ZTsKLQogICAgIGJvb2wgYWNwaV9idWlsZF9l bmFibGVkOwogICAgIGJvb2wgc21idXM7CiAgICAgYm9vbCBzYXRhOwogICAgIGJvb2wgcGl0Owog Ci0gICAgLyogUkFNIGluZm9ybWF0aW9uIChzaXplcywgYWRkcmVzc2VzLCBjb25maWd1cmF0aW9u KTogKi8KLSAgICByYW1fYWRkcl90IGJlbG93XzRnX21lbV9zaXplLCBhYm92ZV80Z19tZW1fc2l6 ZTsKLQotICAgIC8qIENQVSBhbmQgYXBpYyBpbmZvcm1hdGlvbjogKi8KLSAgICBib29sIGFwaWNf eHJ1cHRfb3ZlcnJpZGU7Ci0gICAgdW5zaWduZWQgYXBpY19pZF9saW1pdDsKKyAgICAvKiBDUFUg aW5mb3JtYXRpb24gKi8KICAgICB1aW50MTZfdCBib290X2NwdXM7CiAKLSAgICAvKiBOVU1BIGlu Zm9ybWF0aW9uOiAqLwotICAgIHVpbnQ2NF90IG51bWFfbm9kZXM7Ci0gICAgdWludDY0X3QgKm5v ZGVfbWVtOwotCiAgICAgLyogQWRkcmVzcyBzcGFjZSB1c2VkIGJ5IElPQVBJQyBkZXZpY2UuIEFs bCBJT0FQSUMgaW50ZXJydXB0cwogICAgICAqIHdpbGwgYmUgdHJhbnNsYXRlZCB0byBNU0kgbWVz c2FnZXMgaW4gdGhlIGFkZHJlc3Mgc3BhY2UuICovCiAgICAgQWRkcmVzc1NwYWNlICppb2FwaWNf YXM7CisKKyAgICAvKiBBQ1BJIGNvbmZpZ3VyYXRpb24gKi8KKyAgICBBY3BpQ29uZmlndXJhdGlv biBhY3BpX2NvbmZpZ3VyYXRpb247CiB9OwogCiAjZGVmaW5lIFBDX01BQ0hJTkVfQUNQSV9ERVZJ Q0VfUFJPUCAiYWNwaS1kZXZpY2UiCmRpZmYgLS1naXQgYS9ody9hY3BpL2NwdV9ob3RwbHVnLmMg Yi9ody9hY3BpL2NwdV9ob3RwbHVnLmMKaW5kZXggNTI0MzkxODEyNS4uNjM0ZGMzYjg0NiAxMDA2 NDQKLS0tIGEvaHcvYWNwaS9jcHVfaG90cGx1Zy5jCisrKyBiL2h3L2FjcGkvY3B1X2hvdHBsdWcu YwpAQCAtMjM3LDkgKzIzNyw5IEBAIHZvaWQgYnVpbGRfbGVnYWN5X2NwdV9ob3RwbHVnX2FtbChB bWwgKmN0eCwgTWFjaGluZVN0YXRlICptYWNoaW5lLAogICAgIC8qIFRoZSBjdXJyZW50IEFNTCBn ZW5lcmF0b3IgY2FuIGNvdmVyIHRoZSBBUElDIElEIHJhbmdlIFswLi4yNTVdLAogICAgICAqIGlu Y2x1c2l2ZSwgZm9yIFZDUFUgaG90cGx1Zy4gKi8KICAgICBRRU1VX0JVSUxEX0JVR19PTihBQ1BJ X0NQVV9IT1RQTFVHX0lEX0xJTUlUID4gMjU2KTsKLSAgICBpZiAocGNtcy0+YXBpY19pZF9saW1p dCA+IEFDUElfQ1BVX0hPVFBMVUdfSURfTElNSVQpIHsKKyAgICBpZiAocGNtcy0+YWNwaV9jb25m aWd1cmF0aW9uLmFwaWNfaWRfbGltaXQgPiBBQ1BJX0NQVV9IT1RQTFVHX0lEX0xJTUlUKSB7CiAg ICAgICAgIGVycm9yX3JlcG9ydCgibWF4X2NwdXMgaXMgdG9vIGxhcmdlLiBBUElDIElEIG9mIGxh c3QgQ1BVIGlzICV1IiwKLSAgICAgICAgICAgICAgICAgICAgIHBjbXMtPmFwaWNfaWRfbGltaXQg LSAxKTsKKyAgICAgICAgICAgICAgICAgICAgIHBjbXMtPmFjcGlfY29uZmlndXJhdGlvbi5hcGlj X2lkX2xpbWl0IC0gMSk7CiAgICAgICAgIGV4aXQoMSk7CiAgICAgfQogCkBAIC0zMTYsOCArMzE2 LDkgQEAgdm9pZCBidWlsZF9sZWdhY3lfY3B1X2hvdHBsdWdfYW1sKEFtbCAqY3R4LCBNYWNoaW5l U3RhdGUgKm1hY2hpbmUsCiAgICAgICogaXRoIHVwIHRvIDI1NSBlbGVtZW50cy4gV2luZG93cyBn dWVzdHMgdXAgdG8gd2luMms4IGZhaWwgd2hlbgogICAgICAqIFZhclBhY2thZ2VPcCBpcyB1c2Vk LgogICAgICAqLwotICAgIHBrZyA9IHBjbXMtPmFwaWNfaWRfbGltaXQgPD0gMjU1ID8gYW1sX3Bh Y2thZ2UocGNtcy0+YXBpY19pZF9saW1pdCkgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgYW1sX3ZhcnBhY2thZ2UocGNtcy0+YXBpY19pZF9saW1pdCk7CisgICAgcGtn ID0gcGNtcy0+YWNwaV9jb25maWd1cmF0aW9uLmFwaWNfaWRfbGltaXQgPD0gMjU1ID8KKyAgICAg ICAgYW1sX3BhY2thZ2UocGNtcy0+YWNwaV9jb25maWd1cmF0aW9uLmFwaWNfaWRfbGltaXQpIDoK KyAgICAgICAgYW1sX3ZhcnBhY2thZ2UocGNtcy0+YWNwaV9jb25maWd1cmF0aW9uLmFwaWNfaWRf bGltaXQpOwogCiAgICAgZm9yIChpID0gMCwgYXBpY19pZHggPSAwOyBpIDwgYXBpY19pZHMtPmxl bjsgaSsrKSB7CiAgICAgICAgIGludCBhcGljX2lkID0gYXBpY19pZHMtPmNwdXNbaV0uYXJjaF9p ZDsKZGlmZiAtLWdpdCBhL2h3L2FybS92aXJ0LWFjcGktYnVpbGQuYyBiL2h3L2FybS92aXJ0LWFj cGktYnVpbGQuYwppbmRleCA1Nzg1ZmI2OTdjLi5mMjhhMmZhYTUzIDEwMDY0NAotLS0gYS9ody9h cm0vdmlydC1hY3BpLWJ1aWxkLmMKKysrIGIvaHcvYXJtL3ZpcnQtYWNwaS1idWlsZC5jCkBAIC03 OTAsMTYgKzc5MCw2IEBAIGJ1aWxkX2RzZHQoR0FycmF5ICp0YWJsZV9kYXRhLCBCSU9TTGlua2Vy ICpsaW5rZXIsIFZpcnRNYWNoaW5lU3RhdGUgKnZtcykKICAgICBmcmVlX2FtbF9hbGxvY2F0b3Io KTsKIH0KIAotdHlwZWRlZgotc3RydWN0IEFjcGlCdWlsZFN0YXRlIHsKLSAgICAvKiBDb3B5IG9m IHRhYmxlIGluIFJBTSAoZm9yIHBhdGNoaW5nKS4gKi8KLSAgICBNZW1vcnlSZWdpb24gKnRhYmxl X21yOwotICAgIE1lbW9yeVJlZ2lvbiAqcnNkcF9tcjsKLSAgICBNZW1vcnlSZWdpb24gKmxpbmtl cl9tcjsKLSAgICAvKiBJcyB0YWJsZSBwYXRjaGVkPyAqLwotICAgIGJvb2wgcGF0Y2hlZDsKLX0g QWNwaUJ1aWxkU3RhdGU7Ci0KIHN0YXRpYwogdm9pZCB2aXJ0X2FjcGlfYnVpbGQoVmlydE1hY2hp bmVTdGF0ZSAqdm1zLCBBY3BpQnVpbGRUYWJsZXMgKnRhYmxlcykKIHsKZGlmZiAtLWdpdCBhL2h3 L2kzODYvYWNwaS1idWlsZC5jIGIvaHcvaTM4Ni9hY3BpLWJ1aWxkLmMKaW5kZXggMTU5OWNhYTdj NS4uZDAzNjJlMTM4MiAxMDA2NDQKLS0tIGEvaHcvaTM4Ni9hY3BpLWJ1aWxkLmMKKysrIGIvaHcv aTM4Ni9hY3BpLWJ1aWxkLmMKQEAgLTMzOCwxMyArMzM4LDE0IEBAIHZvaWQgcGNfbWFkdF9jcHVf ZW50cnkoQWNwaURldmljZUlmICphZGV2LCBpbnQgdWlkLAogfQogCiBzdGF0aWMgdm9pZAotYnVp bGRfbWFkdChHQXJyYXkgKnRhYmxlX2RhdGEsIEJJT1NMaW5rZXIgKmxpbmtlciwgUENNYWNoaW5l U3RhdGUgKnBjbXMpCitidWlsZF9tYWR0KEdBcnJheSAqdGFibGVfZGF0YSwgQklPU0xpbmtlciAq bGlua2VyLAorICAgICAgICAgICBNYWNoaW5lU3RhdGUgKm1zLCBBY3BpQ29uZmlndXJhdGlvbiAq YWNwaV9jb25mKQogewotICAgIE1hY2hpbmVDbGFzcyAqbWMgPSBNQUNISU5FX0dFVF9DTEFTUyhw Y21zKTsKLSAgICBjb25zdCBDUFVBcmNoSWRMaXN0ICphcGljX2lkcyA9IG1jLT5wb3NzaWJsZV9j cHVfYXJjaF9pZHMoTUFDSElORShwY21zKSk7CisgICAgTWFjaGluZUNsYXNzICptYyA9IE1BQ0hJ TkVfR0VUX0NMQVNTKG1zKTsKKyAgICBjb25zdCBDUFVBcmNoSWRMaXN0ICphcGljX2lkcyA9IG1j LT5wb3NzaWJsZV9jcHVfYXJjaF9pZHMobXMpOwogICAgIGludCBtYWR0X3N0YXJ0ID0gdGFibGVf ZGF0YS0+bGVuOwotICAgIEFjcGlEZXZpY2VJZkNsYXNzICphZGV2YyA9IEFDUElfREVWSUNFX0lG X0dFVF9DTEFTUyhwY21zLT5hY3BpX2Rldik7Ci0gICAgQWNwaURldmljZUlmICphZGV2ID0gQUNQ SV9ERVZJQ0VfSUYocGNtcy0+YWNwaV9kZXYpOworICAgIEFjcGlEZXZpY2VJZkNsYXNzICphZGV2 YyA9IEFDUElfREVWSUNFX0lGX0dFVF9DTEFTUyhhY3BpX2NvbmYtPmFjcGlfZGV2KTsKKyAgICBB Y3BpRGV2aWNlSWYgKmFkZXYgPSBBQ1BJX0RFVklDRV9JRihhY3BpX2NvbmYtPmFjcGlfZGV2KTsK ICAgICBib29sIHgyYXBpY19tb2RlID0gZmFsc2U7CiAKICAgICBBY3BpTXVsdGlwbGVBcGljVGFi bGUgKm1hZHQ7CkBAIC0zNzAsNyArMzcxLDcgQEAgYnVpbGRfbWFkdChHQXJyYXkgKnRhYmxlX2Rh dGEsIEJJT1NMaW5rZXIgKmxpbmtlciwgUENNYWNoaW5lU3RhdGUgKnBjbXMpCiAgICAgaW9fYXBp Yy0+YWRkcmVzcyA9IGNwdV90b19sZTMyKElPX0FQSUNfREVGQVVMVF9BRERSRVNTKTsKICAgICBp b19hcGljLT5pbnRlcnJ1cHQgPSBjcHVfdG9fbGUzMigwKTsKIAotICAgIGlmIChwY21zLT5hcGlj X3hydXB0X292ZXJyaWRlKSB7CisgICAgaWYgKGFjcGlfY29uZi0+YXBpY194cnVwdF9vdmVycmlk ZSkgewogICAgICAgICBpbnRzcmNvdnIgPSBhY3BpX2RhdGFfcHVzaCh0YWJsZV9kYXRhLCBzaXpl b2YgKmludHNyY292cik7CiAgICAgICAgIGludHNyY292ci0+dHlwZSAgID0gQUNQSV9BUElDX1hS VVBUX09WRVJSSURFOwogICAgICAgICBpbnRzcmNvdnItPmxlbmd0aCA9IHNpemVvZigqaW50c3Jj b3ZyKTsKQEAgLTE3ODYsMTMgKzE3ODcsMTIgQEAgc3RhdGljIEFtbCAqYnVpbGRfcTM1X29zY19t ZXRob2Qodm9pZCkKIHN0YXRpYyB2b2lkCiBidWlsZF9kc2R0KEdBcnJheSAqdGFibGVfZGF0YSwg QklPU0xpbmtlciAqbGlua2VyLAogICAgICAgICAgICBBY3BpUG1JbmZvICpwbSwgQWNwaU1pc2NJ bmZvICptaXNjLAotICAgICAgICAgICBSYW5nZSAqcGNpX2hvbGUsIFJhbmdlICpwY2lfaG9sZTY0 LCBNYWNoaW5lU3RhdGUgKm1hY2hpbmUpCisgICAgICAgICAgIFJhbmdlICpwY2lfaG9sZSwgUmFu Z2UgKnBjaV9ob2xlNjQsCisgICAgICAgICAgIE1hY2hpbmVTdGF0ZSAqbWFjaGluZSwgQWNwaUNv bmZpZ3VyYXRpb24gKmFjcGlfY29uZikKIHsKICAgICBDcnNSYW5nZUVudHJ5ICplbnRyeTsKICAg ICBBbWwgKmRzZHQsICpzYl9zY29wZSwgKnNjb3BlLCAqZGV2LCAqbWV0aG9kLCAqZmllbGQsICpw a2csICpjcnM7CiAgICAgQ3JzUmFuZ2VTZXQgY3JzX3JhbmdlX3NldDsKLSAgICBQQ01hY2hpbmVT dGF0ZSAqcGNtcyA9IFBDX01BQ0hJTkUobWFjaGluZSk7Ci0gICAgUENNYWNoaW5lQ2xhc3MgKnBj bWMgPSBQQ19NQUNISU5FX0dFVF9DTEFTUyhtYWNoaW5lKTsKICAgICB1aW50MzJfdCBucl9tZW0g PSBtYWNoaW5lLT5yYW1fc2xvdHM7CiAgICAgaW50IHJvb3RfYnVzX2xpbWl0ID0gMHhGRjsKICAg ICBQQ0lCdXMgKmJ1cyA9IE5VTEw7CkBAIC0xODM2LDcgKzE4MzYsNyBAQCBidWlsZF9kc2R0KEdB cnJheSAqdGFibGVfZGF0YSwgQklPU0xpbmtlciAqbGlua2VyLAogICAgICAgICBidWlsZF9xMzVf cGNpMF9pbnQoZHNkdCk7CiAgICAgfQogCi0gICAgaWYgKHBjbWMtPmxlZ2FjeV9jcHVfaG90cGx1 ZykgeworICAgIGlmIChhY3BpX2NvbmYtPmxlZ2FjeV9jcHVfaG90cGx1ZykgewogICAgICAgICBi dWlsZF9sZWdhY3lfY3B1X2hvdHBsdWdfYW1sKGRzZHQsIG1hY2hpbmUsIHBtLT5jcHVfaHBfaW9f YmFzZSk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgQ1BVSG90cGx1Z0ZlYXR1cmVzIG9wdHMgPSB7 CkBAIC0xODYwLDcgKzE4NjAsNyBAQCBidWlsZF9kc2R0KEdBcnJheSAqdGFibGVfZGF0YSwgQklP U0xpbmtlciAqbGlua2VyLAogICAgICAgICAgICAgYW1sX2FwcGVuZChzY29wZSwgbWV0aG9kKTsK ICAgICAgICAgfQogCi0gICAgICAgIGlmIChwY21zLT5hY3BpX252ZGltbV9zdGF0ZS5pc19lbmFi bGVkKSB7CisgICAgICAgIGlmIChhY3BpX2NvbmYtPmFjcGlfbnZkaW1tX3N0YXRlLmlzX2VuYWJs ZWQpIHsKICAgICAgICAgICAgIG1ldGhvZCA9IGFtbF9tZXRob2QoIl9FMDQiLCAwLCBBTUxfTk9U U0VSSUFMSVpFRCk7CiAgICAgICAgICAgICBhbWxfYXBwZW5kKG1ldGhvZCwgYW1sX25vdGlmeShh bWxfbmFtZSgiXFxfU0IuTlZEUiIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgYW1sX2ludCgweDgwKSkpOwpAQCAtMjA0MSw3ICsyMDQxLDcgQEAgYnVpbGRfZHNk dChHQXJyYXkgKnRhYmxlX2RhdGEsIEJJT1NMaW5rZXIgKmxpbmtlciwKICAgICAgICAgICogd2l0 aCBoYWxmIG9mIHRoZSAxNi1iaXQgY29udHJvbCByZWdpc3Rlci4gSGVuY2UsIHRoZSB0b3RhbCBz aXplCiAgICAgICAgICAqIG9mIHRoZSBpL28gcmVnaW9uIHVzZWQgaXMgRldfQ0ZHX0NUTF9TSVpF OyB3aGVuIHVzaW5nIERNQSwgdGhlCiAgICAgICAgICAqIERNQSBjb250cm9sIHJlZ2lzdGVyIGlz IGxvY2F0ZWQgYXQgRldfQ0ZHX0RNQV9JT19CQVNFICsgNCAqLwotICAgICAgICB1aW50OF90IGlv X3NpemUgPSBvYmplY3RfcHJvcGVydHlfZ2V0X2Jvb2woT0JKRUNUKHBjbXMtPmZ3X2NmZyksCisg ICAgICAgIHVpbnQ4X3QgaW9fc2l6ZSA9IG9iamVjdF9wcm9wZXJ0eV9nZXRfYm9vbChPQkpFQ1Qo YWNwaV9jb25mLT5md19jZmcpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgImRtYV9lbmFibGVkIiwgTlVMTCkgPwogICAgICAgICAgICAgICAgICAg ICAgICAgICBST1VORF9VUChGV19DRkdfQ1RMX1NJWkUsIDQpICsgc2l6ZW9mKGRtYV9hZGRyX3Qp IDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgRldfQ0ZHX0NUTF9TSVpFOwpAQCAtMjI1Miw3 ICsyMjUyLDggQEAgYnVpbGRfdHBtMihHQXJyYXkgKnRhYmxlX2RhdGEsIEJJT1NMaW5rZXIgKmxp bmtlciwgR0FycmF5ICp0Y3BhbG9nKQogI2RlZmluZSBIT0xFXzY0MEtfRU5EICAgKDEgKiBNaUIp CiAKIHN0YXRpYyB2b2lkCi1idWlsZF9zcmF0KEdBcnJheSAqdGFibGVfZGF0YSwgQklPU0xpbmtl ciAqbGlua2VyLCBNYWNoaW5lU3RhdGUgKm1hY2hpbmUpCitidWlsZF9zcmF0KEdBcnJheSAqdGFi bGVfZGF0YSwgQklPU0xpbmtlciAqbGlua2VyLAorICAgICAgICAgICBNYWNoaW5lU3RhdGUgKm1h Y2hpbmUsIEFjcGlDb25maWd1cmF0aW9uICphY3BpX2NvbmYpCiB7CiAgICAgQWNwaVN5c3RlbVJl c291cmNlQWZmaW5pdHlUYWJsZSAqc3JhdDsKICAgICBBY3BpU3JhdE1lbW9yeUFmZmluaXR5ICpu dW1hbWVtOwpAQCAtMjI2Miw5ICsyMjYzLDggQEAgYnVpbGRfc3JhdChHQXJyYXkgKnRhYmxlX2Rh dGEsIEJJT1NMaW5rZXIgKmxpbmtlciwgTWFjaGluZVN0YXRlICptYWNoaW5lKQogICAgIHVpbnQ2 NF90IG1lbV9sZW4sIG1lbV9iYXNlLCBuZXh0X2Jhc2U7CiAgICAgTWFjaGluZUNsYXNzICptYyA9 IE1BQ0hJTkVfR0VUX0NMQVNTKG1hY2hpbmUpOwogICAgIGNvbnN0IENQVUFyY2hJZExpc3QgKmFw aWNfaWRzID0gbWMtPnBvc3NpYmxlX2NwdV9hcmNoX2lkcyhtYWNoaW5lKTsKLSAgICBQQ01hY2hp bmVTdGF0ZSAqcGNtcyA9IFBDX01BQ0hJTkUobWFjaGluZSk7CiAgICAgcmFtX2FkZHJfdCBob3Rw bHVnYWJibGVfYWRkcmVzc19zcGFjZV9zaXplID0KLSAgICAgICAgb2JqZWN0X3Byb3BlcnR5X2dl dF9pbnQoT0JKRUNUKHBjbXMpLCBQQ19NQUNISU5FX0RFVk1FTV9SRUdJT05fU0laRSwKKyAgICAg ICAgb2JqZWN0X3Byb3BlcnR5X2dldF9pbnQoT0JKRUNUKG1hY2hpbmUpLCBQQ19NQUNISU5FX0RF Vk1FTV9SRUdJT05fU0laRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7 CiAKICAgICBzcmF0X3N0YXJ0ID0gdGFibGVfZGF0YS0+bGVuOwpAQCAtMjMwNiw5ICsyMzA2LDkg QEAgYnVpbGRfc3JhdChHQXJyYXkgKnRhYmxlX2RhdGEsIEJJT1NMaW5rZXIgKmxpbmtlciwgTWFj aGluZVN0YXRlICptYWNoaW5lKQogICAgIG5leHRfYmFzZSA9IDA7CiAgICAgbnVtYV9zdGFydCA9 IHRhYmxlX2RhdGEtPmxlbjsKIAotICAgIGZvciAoaSA9IDE7IGkgPCBwY21zLT5udW1hX25vZGVz ICsgMTsgKytpKSB7CisgICAgZm9yIChpID0gMTsgaSA8IGFjcGlfY29uZi0+bnVtYV9ub2RlcyAr IDE7ICsraSkgewogICAgICAgICBtZW1fYmFzZSA9IG5leHRfYmFzZTsKLSAgICAgICAgbWVtX2xl biA9IHBjbXMtPm5vZGVfbWVtW2kgLSAxXTsKKyAgICAgICAgbWVtX2xlbiA9IGFjcGlfY29uZi0+ bm9kZV9tZW1baSAtIDFdOwogICAgICAgICBuZXh0X2Jhc2UgPSBtZW1fYmFzZSArIG1lbV9sZW47 CiAKICAgICAgICAgLyogQ3V0IG91dCB0aGUgNjQwSyBob2xlICovCkBAIC0yMzMxLDE2ICsyMzMx LDE2IEBAIGJ1aWxkX3NyYXQoR0FycmF5ICp0YWJsZV9kYXRhLCBCSU9TTGlua2VyICpsaW5rZXIs IE1hY2hpbmVTdGF0ZSAqbWFjaGluZSkKICAgICAgICAgfQogCiAgICAgICAgIC8qIEN1dCBvdXQg dGhlIEFDUElfUENJIGhvbGUgKi8KLSAgICAgICAgaWYgKG1lbV9iYXNlIDw9IHBjbXMtPmJlbG93 XzRnX21lbV9zaXplICYmCi0gICAgICAgICAgICBuZXh0X2Jhc2UgPiBwY21zLT5iZWxvd180Z19t ZW1fc2l6ZSkgewotICAgICAgICAgICAgbWVtX2xlbiAtPSBuZXh0X2Jhc2UgLSBwY21zLT5iZWxv d180Z19tZW1fc2l6ZTsKKyAgICAgICAgaWYgKG1lbV9iYXNlIDw9IGFjcGlfY29uZi0+YmVsb3df NGdfbWVtX3NpemUgJiYKKyAgICAgICAgICAgIG5leHRfYmFzZSA+IGFjcGlfY29uZi0+YmVsb3df NGdfbWVtX3NpemUpIHsKKyAgICAgICAgICAgIG1lbV9sZW4gLT0gbmV4dF9iYXNlIC0gYWNwaV9j b25mLT5iZWxvd180Z19tZW1fc2l6ZTsKICAgICAgICAgICAgIGlmIChtZW1fbGVuID4gMCkgewog ICAgICAgICAgICAgICAgIG51bWFtZW0gPSBhY3BpX2RhdGFfcHVzaCh0YWJsZV9kYXRhLCBzaXpl b2YgKm51bWFtZW0pOwogICAgICAgICAgICAgICAgIGJ1aWxkX3NyYXRfbWVtb3J5KG51bWFtZW0s IG1lbV9iYXNlLCBtZW1fbGVuLCBpIC0gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBNRU1fQUZGSU5JVFlfRU5BQkxFRCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBt ZW1fYmFzZSA9IDFVTEwgPDwgMzI7Ci0gICAgICAgICAgICBtZW1fbGVuID0gbmV4dF9iYXNlIC0g cGNtcy0+YmVsb3dfNGdfbWVtX3NpemU7CisgICAgICAgICAgICBtZW1fbGVuID0gbmV4dF9iYXNl IC0gYWNwaV9jb25mLT5iZWxvd180Z19tZW1fc2l6ZTsKICAgICAgICAgICAgIG5leHRfYmFzZSA9 IG1lbV9iYXNlICsgbWVtX2xlbjsKICAgICAgICAgfQogCkBAIC0yMzUxLDcgKzIzNTEsNyBAQCBi dWlsZF9zcmF0KEdBcnJheSAqdGFibGVfZGF0YSwgQklPU0xpbmtlciAqbGlua2VyLCBNYWNoaW5l U3RhdGUgKm1hY2hpbmUpCiAgICAgICAgIH0KICAgICB9CiAgICAgc2xvdHMgPSAodGFibGVfZGF0 YS0+bGVuIC0gbnVtYV9zdGFydCkgLyBzaXplb2YgKm51bWFtZW07Ci0gICAgZm9yICg7IHNsb3Rz IDwgcGNtcy0+bnVtYV9ub2RlcyArIDI7IHNsb3RzKyspIHsKKyAgICBmb3IgKDsgc2xvdHMgPCBh Y3BpX2NvbmYtPm51bWFfbm9kZXMgKyAyOyBzbG90cysrKSB7CiAgICAgICAgIG51bWFtZW0gPSBh Y3BpX2RhdGFfcHVzaCh0YWJsZV9kYXRhLCBzaXplb2YgKm51bWFtZW0pOwogICAgICAgICBidWls ZF9zcmF0X21lbW9yeShudW1hbWVtLCAwLCAwLCAwLCBNRU1fQUZGSU5JVFlfTk9GTEFHUyk7CiAg ICAgfQpAQCAtMjM2Nyw3ICsyMzY3LDggQEAgYnVpbGRfc3JhdChHQXJyYXkgKnRhYmxlX2RhdGEs IEJJT1NMaW5rZXIgKmxpbmtlciwgTWFjaGluZVN0YXRlICptYWNoaW5lKQogICAgIGlmIChob3Rw bHVnYWJibGVfYWRkcmVzc19zcGFjZV9zaXplKSB7CiAgICAgICAgIG51bWFtZW0gPSBhY3BpX2Rh dGFfcHVzaCh0YWJsZV9kYXRhLCBzaXplb2YgKm51bWFtZW0pOwogICAgICAgICBidWlsZF9zcmF0 X21lbW9yeShudW1hbWVtLCBtYWNoaW5lLT5kZXZpY2VfbWVtb3J5LT5iYXNlLAotICAgICAgICAg ICAgICAgICAgICAgICAgICBob3RwbHVnYWJibGVfYWRkcmVzc19zcGFjZV9zaXplLCBwY21zLT5u dW1hX25vZGVzIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaG90cGx1Z2FiYmxlX2Fk ZHJlc3Nfc3BhY2Vfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYWNwaV9jb25mLT5u dW1hX25vZGVzIC0gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVNX0FGRklOSVRZX0hP VFBMVUdHQUJMRSB8IE1FTV9BRkZJTklUWV9FTkFCTEVEKTsKICAgICB9CiAKQEAgLTI1NDYsMTcg KzI1NDcsNiBAQCBidWlsZF9yc2RwKEdBcnJheSAqcnNkcF90YWJsZSwgQklPU0xpbmtlciAqbGlu a2VyLCB1bnNpZ25lZCByc2R0X3RibF9vZmZzZXQpCiAgICAgcmV0dXJuIHJzZHBfdGFibGU7CiB9 CiAKLXR5cGVkZWYKLXN0cnVjdCBBY3BpQnVpbGRTdGF0ZSB7Ci0gICAgLyogQ29weSBvZiB0YWJs ZSBpbiBSQU0gKGZvciBwYXRjaGluZykuICovCi0gICAgTWVtb3J5UmVnaW9uICp0YWJsZV9tcjsK LSAgICAvKiBJcyB0YWJsZSBwYXRjaGVkPyAqLwotICAgIHVpbnQ4X3QgcGF0Y2hlZDsKLSAgICB2 b2lkICpyc2RwOwotICAgIE1lbW9yeVJlZ2lvbiAqcnNkcF9tcjsKLSAgICBNZW1vcnlSZWdpb24g Kmxpbmtlcl9tcjsKLX0gQWNwaUJ1aWxkU3RhdGU7Ci0KIHN0YXRpYyBib29sIGFjcGlfZ2V0X21j ZmcoQWNwaU1jZmdJbmZvICptY2ZnKQogewogICAgIE9iamVjdCAqcGNpX2hvc3Q7CkBAIC0yNTgw LDEwICsyNTcwLDkgQEAgc3RhdGljIGJvb2wgYWNwaV9nZXRfbWNmZyhBY3BpTWNmZ0luZm8gKm1j ZmcpCiB9CiAKIHN0YXRpYwotdm9pZCBhY3BpX2J1aWxkKEFjcGlCdWlsZFRhYmxlcyAqdGFibGVz LCBNYWNoaW5lU3RhdGUgKm1hY2hpbmUpCit2b2lkIGFjcGlfYnVpbGQoQWNwaUJ1aWxkVGFibGVz ICp0YWJsZXMsCisgICAgICAgICAgICAgICAgTWFjaGluZVN0YXRlICptYWNoaW5lLCBBY3BpQ29u ZmlndXJhdGlvbiAqYWNwaV9jb25mKQogewotICAgIFBDTWFjaGluZVN0YXRlICpwY21zID0gUENf TUFDSElORShtYWNoaW5lKTsKLSAgICBQQ01hY2hpbmVDbGFzcyAqcGNtYyA9IFBDX01BQ0hJTkVf R0VUX0NMQVNTKHBjbXMpOwogICAgIEdBcnJheSAqdGFibGVfb2Zmc2V0czsKICAgICB1bnNpZ25l ZCBmYWNzLCBkc2R0LCByc2R0LCBmYWR0OwogICAgIEFjcGlQbUluZm8gcG07CkBAIC0yNjIxLDcg KzI2MTAsNyBAQCB2b2lkIGFjcGlfYnVpbGQoQWNwaUJ1aWxkVGFibGVzICp0YWJsZXMsIE1hY2hp bmVTdGF0ZSAqbWFjaGluZSkKICAgICAvKiBEU0RUIGlzIHBvaW50ZWQgdG8gYnkgRkFEVCAqLwog ICAgIGRzZHQgPSB0YWJsZXNfYmxvYi0+bGVuOwogICAgIGJ1aWxkX2RzZHQodGFibGVzX2Jsb2Is IHRhYmxlcy0+bGlua2VyLCAmcG0sICZtaXNjLAotICAgICAgICAgICAgICAgJnBjaV9ob2xlLCAm cGNpX2hvbGU2NCwgbWFjaGluZSk7CisgICAgICAgICAgICAgICAmcGNpX2hvbGUsICZwY2lfaG9s ZTY0LCBtYWNoaW5lLCBhY3BpX2NvbmYpOwogCiAgICAgLyogQ291bnQgdGhlIHNpemUgb2YgdGhl IERTRFQgYW5kIFNTRFQsIHdlIHdpbGwgbmVlZCBpdCBmb3IgbGVnYWN5CiAgICAgICogc2l6aW5n IG9mIEFDUEkgdGFibGVzLgpAQCAtMjYzOSw3ICsyNjI4LDcgQEAgdm9pZCBhY3BpX2J1aWxkKEFj cGlCdWlsZFRhYmxlcyAqdGFibGVzLCBNYWNoaW5lU3RhdGUgKm1hY2hpbmUpCiAgICAgYW1sX2xl biArPSB0YWJsZXNfYmxvYi0+bGVuIC0gZmFkdDsKIAogICAgIGFjcGlfYWRkX3RhYmxlKHRhYmxl X29mZnNldHMsIHRhYmxlc19ibG9iKTsKLSAgICBidWlsZF9tYWR0KHRhYmxlc19ibG9iLCB0YWJs ZXMtPmxpbmtlciwgcGNtcyk7CisgICAgYnVpbGRfbWFkdCh0YWJsZXNfYmxvYiwgdGFibGVzLT5s aW5rZXIsIG1hY2hpbmUsIGFjcGlfY29uZik7CiAKICAgICB2bWdlbmlkX2RldiA9IGZpbmRfdm1n ZW5pZF9kZXYoKTsKICAgICBpZiAodm1nZW5pZF9kZXYpIHsKQEAgLTI2NjEsOSArMjY1MCw5IEBA IHZvaWQgYWNwaV9idWlsZChBY3BpQnVpbGRUYWJsZXMgKnRhYmxlcywgTWFjaGluZVN0YXRlICpt YWNoaW5lKQogICAgICAgICAgICAgYnVpbGRfdHBtMih0YWJsZXNfYmxvYiwgdGFibGVzLT5saW5r ZXIsIHRhYmxlcy0+dGNwYWxvZyk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgaWYgKHBjbXMtPm51 bWFfbm9kZXMpIHsKKyAgICBpZiAoYWNwaV9jb25mLT5udW1hX25vZGVzKSB7CiAgICAgICAgIGFj cGlfYWRkX3RhYmxlKHRhYmxlX29mZnNldHMsIHRhYmxlc19ibG9iKTsKLSAgICAgICAgYnVpbGRf c3JhdCh0YWJsZXNfYmxvYiwgdGFibGVzLT5saW5rZXIsIG1hY2hpbmUpOworICAgICAgICBidWls ZF9zcmF0KHRhYmxlc19ibG9iLCB0YWJsZXMtPmxpbmtlciwgbWFjaGluZSwgYWNwaV9jb25mKTsK ICAgICAgICAgaWYgKGhhdmVfbnVtYV9kaXN0YW5jZSkgewogICAgICAgICAgICAgYWNwaV9hZGRf dGFibGUodGFibGVfb2Zmc2V0cywgdGFibGVzX2Jsb2IpOwogICAgICAgICAgICAgYnVpbGRfc2xp dCh0YWJsZXNfYmxvYiwgdGFibGVzLT5saW5rZXIpOwpAQCAtMjY4Myw5ICsyNjcyLDkgQEAgdm9p ZCBhY3BpX2J1aWxkKEFjcGlCdWlsZFRhYmxlcyAqdGFibGVzLCBNYWNoaW5lU3RhdGUgKm1hY2hp bmUpCiAgICAgICAgICAgICBidWlsZF9kbWFyX3EzNSh0YWJsZXNfYmxvYiwgdGFibGVzLT5saW5r ZXIpOwogICAgICAgICB9CiAgICAgfQotICAgIGlmIChwY21zLT5hY3BpX252ZGltbV9zdGF0ZS5p c19lbmFibGVkKSB7CisgICAgaWYgKGFjcGlfY29uZi0+YWNwaV9udmRpbW1fc3RhdGUuaXNfZW5h YmxlZCkgewogICAgICAgICBudmRpbW1fYnVpbGRfYWNwaSh0YWJsZV9vZmZzZXRzLCB0YWJsZXNf YmxvYiwgdGFibGVzLT5saW5rZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICZwY21zLT5h Y3BpX252ZGltbV9zdGF0ZSwgbWFjaGluZS0+cmFtX3Nsb3RzKTsKKyAgICAgICAgICAgICAgICAg ICAgICAgICAgJmFjcGlfY29uZi0+YWNwaV9udmRpbW1fc3RhdGUsIG1hY2hpbmUtPnJhbV9zbG90 cyk7CiAgICAgfQogCiAgICAgLyogQWRkIHRhYmxlcyBzdXBwbGllZCBieSB1c2VyIChpZiBhbnkp ICovCkBAIC0yNzIxLDEzICsyNzEwLDEzIEBAIHZvaWQgYWNwaV9idWlsZChBY3BpQnVpbGRUYWJs ZXMgKnRhYmxlcywgTWFjaGluZVN0YXRlICptYWNoaW5lKQogICAgICAqCiAgICAgICogQWxsIHRo aXMgaXMgZm9yIFBJSVg0LCBzaW5jZSBRRU1VIDIuMCBkaWRuJ3Qgc3VwcG9ydCBRMzUgbWlncmF0 aW9uLgogICAgICAqLwotICAgIGlmIChwY21jLT5sZWdhY3lfYWNwaV90YWJsZV9zaXplKSB7Cisg ICAgaWYgKGFjcGlfY29uZi0+bGVnYWN5X2FjcGlfdGFibGVfc2l6ZSkgewogICAgICAgICAvKiBT dWJ0cmFjdGluZyBhbWxfbGVuIGdpdmVzIHRoZSBzaXplIG9mIGZpeGVkIHRhYmxlcy4gIFRoZW4g YWRkIHRoZQogICAgICAgICAgKiBzaXplIG9mIHRoZSBQSUlYNCBEU0RUL1NTRFQgaW4gUUVNVSAy LjAuCiAgICAgICAgICAqLwogICAgICAgICBpbnQgbGVnYWN5X2FtbF9sZW4gPQotICAgICAgICAg ICAgcGNtYy0+bGVnYWN5X2FjcGlfdGFibGVfc2l6ZSArCi0gICAgICAgICAgICBBQ1BJX0JVSUxE X0xFR0FDWV9DUFVfQU1MX1NJWkUgKiBwY21zLT5hcGljX2lkX2xpbWl0OworICAgICAgICAgICAg YWNwaV9jb25mLT5sZWdhY3lfYWNwaV90YWJsZV9zaXplICsKKyAgICAgICAgICAgIEFDUElfQlVJ TERfTEVHQUNZX0NQVV9BTUxfU0laRSAqIGFjcGlfY29uZi0+YXBpY19pZF9saW1pdDsKICAgICAg ICAgaW50IGxlZ2FjeV90YWJsZV9zaXplID0KICAgICAgICAgICAgIFJPVU5EX1VQKHRhYmxlc19i bG9iLT5sZW4gLSBhbWxfbGVuICsgbGVnYWN5X2FtbF9sZW4sCiAgICAgICAgICAgICAgICAgICAg ICBBQ1BJX0JVSUxEX0FMSUdOX1NJWkUpOwpAQCAtMjc3Miw5ICsyNzYxLDE3IEBAIHN0YXRpYyB2 b2lkIGFjcGlfcmFtX3VwZGF0ZShNZW1vcnlSZWdpb24gKm1yLCBHQXJyYXkgKmRhdGEpCiAKIHN0 YXRpYyB2b2lkIGFjcGlfYnVpbGRfdXBkYXRlKHZvaWQgKmJ1aWxkX29wYXF1ZSkKIHsKLSAgICBB Y3BpQnVpbGRTdGF0ZSAqYnVpbGRfc3RhdGUgPSBidWlsZF9vcGFxdWU7CisgICAgQWNwaUNvbmZp Z3VyYXRpb24gKmFjcGlfY29uZiA9IGJ1aWxkX29wYXF1ZTsKKyAgICBBY3BpQnVpbGRTdGF0ZSAq YnVpbGRfc3RhdGU7CiAgICAgQWNwaUJ1aWxkVGFibGVzIHRhYmxlczsKIAorICAgIC8qIE5vIEFD UEkgY29uZmlndXJhdGlvbj8gTm90aGluZyB0byBkby4gKi8KKyAgICBpZiAoIWFjcGlfY29uZikg eworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYnVpbGRfc3RhdGUgPSBhY3BpX2NvbmYt PmJ1aWxkX3N0YXRlOworCiAgICAgLyogTm8gc3RhdGUgdG8gdXBkYXRlIG9yIGFscmVhZHkgcGF0 Y2hlZD8gTm90aGluZyB0byBkby4gKi8KICAgICBpZiAoIWJ1aWxkX3N0YXRlIHx8IGJ1aWxkX3N0 YXRlLT5wYXRjaGVkKSB7CiAgICAgICAgIHJldHVybjsKQEAgLTI3ODMsNyArMjc4MCw3IEBAIHN0 YXRpYyB2b2lkIGFjcGlfYnVpbGRfdXBkYXRlKHZvaWQgKmJ1aWxkX29wYXF1ZSkKIAogICAgIGFj cGlfYnVpbGRfdGFibGVzX2luaXQoJnRhYmxlcyk7CiAKLSAgICBhY3BpX2J1aWxkKCZ0YWJsZXMs IE1BQ0hJTkUocWRldl9nZXRfbWFjaGluZSgpKSk7CisgICAgYWNwaV9idWlsZCgmdGFibGVzLCBN QUNISU5FKHFkZXZfZ2V0X21hY2hpbmUoKSksIGFjcGlfY29uZik7CiAKICAgICBhY3BpX3JhbV91 cGRhdGUoYnVpbGRfc3RhdGUtPnRhYmxlX21yLCB0YWJsZXMudGFibGVfZGF0YSk7CiAKQEAgLTI4 MDMsMTIgKzI4MDAsMTIgQEAgc3RhdGljIHZvaWQgYWNwaV9idWlsZF9yZXNldCh2b2lkICpidWls ZF9vcGFxdWUpCiAgICAgYnVpbGRfc3RhdGUtPnBhdGNoZWQgPSAwOwogfQogCi1zdGF0aWMgTWVt b3J5UmVnaW9uICphY3BpX2FkZF9yb21fYmxvYihBY3BpQnVpbGRTdGF0ZSAqYnVpbGRfc3RhdGUs CitzdGF0aWMgTWVtb3J5UmVnaW9uICphY3BpX2FkZF9yb21fYmxvYihBY3BpQ29uZmlndXJhdGlv biAqYWNwaV9jb25mLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Fy cmF5ICpibG9iLCBjb25zdCBjaGFyICpuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgdWludDY0X3QgbWF4X3NpemUpCiB7CiAgICAgcmV0dXJuIHJvbV9hZGRfYmxv YihuYW1lLCBibG9iLT5kYXRhLCBhY3BpX2RhdGFfbGVuKGJsb2IpLCBtYXhfc2l6ZSwgLTEsCi0g ICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBhY3BpX2J1aWxkX3VwZGF0ZSwgYnVpbGRfc3Rh dGUsIE5VTEwsIHRydWUpOworICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgYWNwaV9idWls ZF91cGRhdGUsIGFjcGlfY29uZiwgTlVMTCwgdHJ1ZSk7CiB9CiAKIHN0YXRpYyBjb25zdCBWTVN0 YXRlRGVzY3JpcHRpb24gdm1zdGF0ZV9hY3BpX2J1aWxkID0gewpAQCAtMjgxNiw1OSArMjgxMyw0 OCBAQCBzdGF0aWMgY29uc3QgVk1TdGF0ZURlc2NyaXB0aW9uIHZtc3RhdGVfYWNwaV9idWlsZCA9 IHsKICAgICAudmVyc2lvbl9pZCA9IDEsCiAgICAgLm1pbmltdW1fdmVyc2lvbl9pZCA9IDEsCiAg ICAgLmZpZWxkcyA9IChWTVN0YXRlRmllbGRbXSkgewotICAgICAgICBWTVNUQVRFX1VJTlQ4KHBh dGNoZWQsIEFjcGlCdWlsZFN0YXRlKSwKKyAgICAgICAgVk1TVEFURV9CT09MKHBhdGNoZWQsIEFj cGlCdWlsZFN0YXRlKSwKICAgICAgICAgVk1TVEFURV9FTkRfT0ZfTElTVCgpCiAgICAgfSwKIH07 CiAKLXZvaWQgYWNwaV9zZXR1cCh2b2lkKQordm9pZCBhY3BpX3NldHVwKE1hY2hpbmVTdGF0ZSAq bWFjaGluZSwgQWNwaUNvbmZpZ3VyYXRpb24gKmFjcGlfY29uZikKIHsKLSAgICBQQ01hY2hpbmVT dGF0ZSAqcGNtcyA9IFBDX01BQ0hJTkUocWRldl9nZXRfbWFjaGluZSgpKTsKLSAgICBQQ01hY2hp bmVDbGFzcyAqcGNtYyA9IFBDX01BQ0hJTkVfR0VUX0NMQVNTKHBjbXMpOwogICAgIEFjcGlCdWls ZFRhYmxlcyB0YWJsZXM7CiAgICAgQWNwaUJ1aWxkU3RhdGUgKmJ1aWxkX3N0YXRlOwogICAgIE9i amVjdCAqdm1nZW5pZF9kZXY7CiAKLSAgICBpZiAoIXBjbXMtPmZ3X2NmZykgewotICAgICAgICBB Q1BJX0JVSUxEX0RQUklOVEYoIk5vIGZ3IGNmZy4gQmFpbGluZyBvdXQuXG4iKTsKLSAgICAgICAg cmV0dXJuOwotICAgIH0KLQotICAgIGlmICghcGNtcy0+YWNwaV9idWlsZF9lbmFibGVkKSB7Ci0g ICAgICAgIEFDUElfQlVJTERfRFBSSU5URigiQUNQSSBidWlsZCBkaXNhYmxlZC4gQmFpbGluZyBv dXQuXG4iKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmICghYWNwaV9lbmFibGVk KSB7Ci0gICAgICAgIEFDUElfQlVJTERfRFBSSU5URigiQUNQSSBkaXNhYmxlZC4gQmFpbGluZyBv dXQuXG4iKTsKKyAgICBpZiAoIWFjcGlfY29uZikgeworICAgICAgICBBQ1BJX0JVSUxEX0RQUklO VEYoIk5vIEFDUEkgY29uZmlnLiBCYWlsaW5nIG91dC5cbiIpOwogICAgICAgICByZXR1cm47CiAg ICAgfQogCiAgICAgYnVpbGRfc3RhdGUgPSBnX21hbGxvYzAoc2l6ZW9mICpidWlsZF9zdGF0ZSk7 CisgICAgYWNwaV9jb25mLT5idWlsZF9zdGF0ZSA9IGJ1aWxkX3N0YXRlOwogCiAgICAgYWNwaV9i dWlsZF90YWJsZXNfaW5pdCgmdGFibGVzKTsKLSAgICBhY3BpX2J1aWxkKCZ0YWJsZXMsIE1BQ0hJ TkUocGNtcykpOworICAgIGFjcGlfYnVpbGQoJnRhYmxlcywgbWFjaGluZSwgYWNwaV9jb25mKTsK IAogICAgIC8qIE5vdyBleHBvc2UgaXQgYWxsIHRvIEd1ZXN0ICovCi0gICAgYnVpbGRfc3RhdGUt PnRhYmxlX21yID0gYWNwaV9hZGRfcm9tX2Jsb2IoYnVpbGRfc3RhdGUsIHRhYmxlcy50YWJsZV9k YXRhLAorICAgIGJ1aWxkX3N0YXRlLT50YWJsZV9tciA9IGFjcGlfYWRkX3JvbV9ibG9iKGFjcGlf Y29uZiwgdGFibGVzLnRhYmxlX2RhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIEFDUElfQlVJTERfVEFCTEVfRklMRSwKICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUNQSV9CVUlMRF9UQUJMRV9NQVhfU0laRSk7 CiAgICAgYXNzZXJ0KGJ1aWxkX3N0YXRlLT50YWJsZV9tciAhPSBOVUxMKTsKIAogICAgIGJ1aWxk X3N0YXRlLT5saW5rZXJfbXIgPQotICAgICAgICBhY3BpX2FkZF9yb21fYmxvYihidWlsZF9zdGF0 ZSwgdGFibGVzLmxpbmtlci0+Y21kX2Jsb2IsCisgICAgICAgIGFjcGlfYWRkX3JvbV9ibG9iKGFj cGlfY29uZiwgdGFibGVzLmxpbmtlci0+Y21kX2Jsb2IsCiAgICAgICAgICAgICAgICAgICAgICAg ICAgICJldGMvdGFibGUtbG9hZGVyIiwgMCk7CiAKLSAgICBmd19jZmdfYWRkX2ZpbGUocGNtcy0+ ZndfY2ZnLCBBQ1BJX0JVSUxEX1RQTUxPR19GSUxFLAorICAgIGZ3X2NmZ19hZGRfZmlsZShhY3Bp X2NvbmYtPmZ3X2NmZywgQUNQSV9CVUlMRF9UUE1MT0dfRklMRSwKICAgICAgICAgICAgICAgICAg ICAgdGFibGVzLnRjcGFsb2ctPmRhdGEsIGFjcGlfZGF0YV9sZW4odGFibGVzLnRjcGFsb2cpKTsK IAogICAgIHZtZ2VuaWRfZGV2ID0gZmluZF92bWdlbmlkX2RldigpOwogICAgIGlmICh2bWdlbmlk X2RldikgewotICAgICAgICB2bWdlbmlkX2FkZF9md19jZmcoVk1HRU5JRCh2bWdlbmlkX2Rldiks IHBjbXMtPmZ3X2NmZywKKyAgICAgICAgdm1nZW5pZF9hZGRfZndfY2ZnKFZNR0VOSUQodm1nZW5p ZF9kZXYpLCBhY3BpX2NvbmYtPmZ3X2NmZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRh Ymxlcy52bWdlbmlkKTsKICAgICB9CiAKLSAgICBpZiAoIXBjbWMtPnJzZHBfaW5fcmFtKSB7Cisg ICAgaWYgKCFhY3BpX2NvbmYtPnJzZHBfaW5fcmFtKSB7CiAgICAgICAgIC8qCiAgICAgICAgICAq IEtlZXAgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBvbGQgbWFjaGluZSB0eXBlcy4KICAgICAgICAg ICogVGhvdWdoIFJTRFAgaXMgc21hbGwsIGl0cyBjb250ZW50cyBpc24ndCBpbW11dGFibGUsIHNv CkBAIC0yODc3LDEzICsyODYzLDEzIEBAIHZvaWQgYWNwaV9zZXR1cCh2b2lkKQogICAgICAgICB1 aW50MzJfdCByc2RwX3NpemUgPSBhY3BpX2RhdGFfbGVuKHRhYmxlcy5yc2RwKTsKIAogICAgICAg ICBidWlsZF9zdGF0ZS0+cnNkcCA9IGdfbWVtZHVwKHRhYmxlcy5yc2RwLT5kYXRhLCByc2RwX3Np emUpOwotICAgICAgICBmd19jZmdfYWRkX2ZpbGVfY2FsbGJhY2socGNtcy0+ZndfY2ZnLCBBQ1BJ X0JVSUxEX1JTRFBfRklMRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjcGlf YnVpbGRfdXBkYXRlLCBOVUxMLCBidWlsZF9zdGF0ZSwKKyAgICAgICAgZndfY2ZnX2FkZF9maWxl X2NhbGxiYWNrKGFjcGlfY29uZi0+ZndfY2ZnLCBBQ1BJX0JVSUxEX1JTRFBfRklMRSwKKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjcGlfYnVpbGRfdXBkYXRlLCBOVUxMLCBhY3Bp X2NvbmYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZF9zdGF0ZS0+cnNk cCwgcnNkcF9zaXplLCB0cnVlKTsKICAgICAgICAgYnVpbGRfc3RhdGUtPnJzZHBfbXIgPSBOVUxM OwogICAgIH0gZWxzZSB7CiAgICAgICAgIGJ1aWxkX3N0YXRlLT5yc2RwID0gTlVMTDsKLSAgICAg ICAgYnVpbGRfc3RhdGUtPnJzZHBfbXIgPSBhY3BpX2FkZF9yb21fYmxvYihidWlsZF9zdGF0ZSwg dGFibGVzLnJzZHAsCisgICAgICAgIGJ1aWxkX3N0YXRlLT5yc2RwX21yID0gYWNwaV9hZGRfcm9t X2Jsb2IoYWNwaV9jb25mLCB0YWJsZXMucnNkcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgQUNQSV9CVUlMRF9SU0RQX0ZJTEUsIDApOwogICAgIH0K IApkaWZmIC0tZ2l0IGEvaHcvaTM4Ni9wYy5jIGIvaHcvaTM4Ni9wYy5jCmluZGV4IGYwOTU3MjVk YmEuLjA5MGY5Njk5MzMgMTAwNjQ0Ci0tLSBhL2h3L2kzODYvcGMuYworKysgYi9ody9pMzg2L3Bj LmMKQEAgLTQ0NCwxNyArNDQ0LDE4IEBAIHZvaWQgcGNfY21vc19pbml0KFBDTWFjaGluZVN0YXRl ICpwY21zLAogewogICAgIGludCB2YWw7CiAgICAgc3RhdGljIHBjX2Ntb3NfaW5pdF9sYXRlX2Fy ZyBhcmc7CisgICAgQWNwaUNvbmZpZ3VyYXRpb24gKmFjcGlfY29uZiA9ICZwY21zLT5hY3BpX2Nv bmZpZ3VyYXRpb247CiAKICAgICAvKiB2YXJpb3VzIGltcG9ydGFudCBDTU9TIGxvY2F0aW9ucyBu ZWVkZWQgYnkgUEMvQm9jaHMgYmlvcyAqLwogCiAgICAgLyogbWVtb3J5IHNpemUgKi8KICAgICAv KiBiYXNlIG1lbW9yeSAoZmlyc3QgTWlCKSAqLwotICAgIHZhbCA9IE1JTihwY21zLT5iZWxvd180 Z19tZW1fc2l6ZSAvIEtpQiwgNjQwKTsKKyAgICB2YWwgPSBNSU4oYWNwaV9jb25mLT5iZWxvd180 Z19tZW1fc2l6ZSAvIEtpQiwgNjQwKTsKICAgICBydGNfc2V0X21lbW9yeShzLCAweDE1LCB2YWwp OwogICAgIHJ0Y19zZXRfbWVtb3J5KHMsIDB4MTYsIHZhbCA+PiA4KTsKICAgICAvKiBleHRlbmRl ZCBtZW1vcnkgKG5leHQgNjRNaUIpICovCi0gICAgaWYgKHBjbXMtPmJlbG93XzRnX21lbV9zaXpl ID4gMSAqIE1pQikgewotICAgICAgICB2YWwgPSAocGNtcy0+YmVsb3dfNGdfbWVtX3NpemUgLSAx ICogTWlCKSAvIEtpQjsKKyAgICBpZiAoYWNwaV9jb25mLT5iZWxvd180Z19tZW1fc2l6ZSA+IDEg KiBNaUIpIHsKKyAgICAgICAgdmFsID0gKGFjcGlfY29uZi0+YmVsb3dfNGdfbWVtX3NpemUgLSAx ICogTWlCKSAvIEtpQjsKICAgICB9IGVsc2UgewogICAgICAgICB2YWwgPSAwOwogICAgIH0KQEAg LTQ2NSw4ICs0NjYsOCBAQCB2b2lkIHBjX2Ntb3NfaW5pdChQQ01hY2hpbmVTdGF0ZSAqcGNtcywK ICAgICBydGNfc2V0X21lbW9yeShzLCAweDMwLCB2YWwpOwogICAgIHJ0Y19zZXRfbWVtb3J5KHMs IDB4MzEsIHZhbCA+PiA4KTsKICAgICAvKiBtZW1vcnkgYmV0d2VlbiAxNk1pQiBhbmQgNEdpQiAq LwotICAgIGlmIChwY21zLT5iZWxvd180Z19tZW1fc2l6ZSA+IDE2ICogTWlCKSB7Ci0gICAgICAg IHZhbCA9IChwY21zLT5iZWxvd180Z19tZW1fc2l6ZSAtIDE2ICogTWlCKSAvICg2NCAqIEtpQik7 CisgICAgaWYgKGFjcGlfY29uZi0+YmVsb3dfNGdfbWVtX3NpemUgPiAxNiAqIE1pQikgeworICAg ICAgICB2YWwgPSAoYWNwaV9jb25mLT5iZWxvd180Z19tZW1fc2l6ZSAtIDE2ICogTWlCKSAvICg2 NCAqIEtpQik7CiAgICAgfSBlbHNlIHsKICAgICAgICAgdmFsID0gMDsKICAgICB9CkBAIC00NzUs NyArNDc2LDcgQEAgdm9pZCBwY19jbW9zX2luaXQoUENNYWNoaW5lU3RhdGUgKnBjbXMsCiAgICAg cnRjX3NldF9tZW1vcnkocywgMHgzNCwgdmFsKTsKICAgICBydGNfc2V0X21lbW9yeShzLCAweDM1 LCB2YWwgPj4gOCk7CiAgICAgLyogbWVtb3J5IGFib3ZlIDRHaUIgKi8KLSAgICB2YWwgPSBwY21z LT5hYm92ZV80Z19tZW1fc2l6ZSAvIDY1NTM2OworICAgIHZhbCA9IGFjcGlfY29uZi0+YWJvdmVf NGdfbWVtX3NpemUgLyA2NTUzNjsKICAgICBydGNfc2V0X21lbW9yeShzLCAweDViLCB2YWwpOwog ICAgIHJ0Y19zZXRfbWVtb3J5KHMsIDB4NWMsIHZhbCA+PiA4KTsKICAgICBydGNfc2V0X21lbW9y eShzLCAweDVkLCB2YWwgPj4gMTYpOwpAQCAtNzE0LDEzICs3MTUsMTQgQEAgc3RhdGljIHZvaWQg cGNfYnVpbGRfc21iaW9zKFBDTWFjaGluZVN0YXRlICpwY21zKQogICAgIHVuc2lnbmVkIGksIGFy cmF5X2NvdW50OwogICAgIE1hY2hpbmVTdGF0ZSAqbXMgPSBNQUNISU5FKHBjbXMpOwogICAgIFg4 NkNQVSAqY3B1ID0gWDg2X0NQVShtcy0+cG9zc2libGVfY3B1cy0+Y3B1c1swXS5jcHUpOworICAg IEFjcGlDb25maWd1cmF0aW9uICphY3BpX2NvbmYgPSAmcGNtcy0+YWNwaV9jb25maWd1cmF0aW9u OwogCiAgICAgLyogdGVsbCBzbWJpb3MgYWJvdXQgY3B1aWQgdmVyc2lvbiBhbmQgZmVhdHVyZXMg Ki8KICAgICBzbWJpb3Nfc2V0X2NwdWlkKGNwdS0+ZW52LmNwdWlkX3ZlcnNpb24sIGNwdS0+ZW52 LmZlYXR1cmVzW0ZFQVRfMV9FRFhdKTsKIAogICAgIHNtYmlvc190YWJsZXMgPSBzbWJpb3NfZ2V0 X3RhYmxlX2xlZ2FjeSgmc21iaW9zX3RhYmxlc19sZW4pOwogICAgIGlmIChzbWJpb3NfdGFibGVz KSB7Ci0gICAgICAgIGZ3X2NmZ19hZGRfYnl0ZXMocGNtcy0+ZndfY2ZnLCBGV19DRkdfU01CSU9T X0VOVFJJRVMsCisgICAgICAgIGZ3X2NmZ19hZGRfYnl0ZXMoYWNwaV9jb25mLT5md19jZmcsIEZX X0NGR19TTUJJT1NfRU5UUklFUywKICAgICAgICAgICAgICAgICAgICAgICAgICBzbWJpb3NfdGFi bGVzLCBzbWJpb3NfdGFibGVzX2xlbik7CiAgICAgfQogCkBAIC03NDEsOSArNzQzLDkgQEAgc3Rh dGljIHZvaWQgcGNfYnVpbGRfc21iaW9zKFBDTWFjaGluZVN0YXRlICpwY21zKQogICAgIGdfZnJl ZShtZW1fYXJyYXkpOwogCiAgICAgaWYgKHNtYmlvc19hbmNob3IpIHsKLSAgICAgICAgZndfY2Zn X2FkZF9maWxlKHBjbXMtPmZ3X2NmZywgImV0Yy9zbWJpb3Mvc21iaW9zLXRhYmxlcyIsCisgICAg ICAgIGZ3X2NmZ19hZGRfZmlsZShhY3BpX2NvbmYtPmZ3X2NmZywgImV0Yy9zbWJpb3Mvc21iaW9z LXRhYmxlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICBzbWJpb3NfdGFibGVzLCBzbWJpb3Nf dGFibGVzX2xlbik7Ci0gICAgICAgIGZ3X2NmZ19hZGRfZmlsZShwY21zLT5md19jZmcsICJldGMv c21iaW9zL3NtYmlvcy1hbmNob3IiLAorICAgICAgICBmd19jZmdfYWRkX2ZpbGUoYWNwaV9jb25m LT5md19jZmcsICJldGMvc21iaW9zL3NtYmlvcy1hbmNob3IiLAogICAgICAgICAgICAgICAgICAg ICAgICAgc21iaW9zX2FuY2hvciwgc21iaW9zX2FuY2hvcl9sZW4pOwogICAgIH0KIH0KQEAgLTc1 NSw2ICs3NTcsNyBAQCBzdGF0aWMgRldDZmdTdGF0ZSAqYm9jaHNfYmlvc19pbml0KEFkZHJlc3NT cGFjZSAqYXMsIFBDTWFjaGluZVN0YXRlICpwY21zKQogICAgIGludCBpOwogICAgIGNvbnN0IENQ VUFyY2hJZExpc3QgKmNwdXM7CiAgICAgTWFjaGluZUNsYXNzICptYyA9IE1BQ0hJTkVfR0VUX0NM QVNTKHBjbXMpOworICAgIEFjcGlDb25maWd1cmF0aW9uICphY3BpX2NvbmYgPSAmcGNtcy0+YWNw aV9jb25maWd1cmF0aW9uOwogCiAgICAgZndfY2ZnID0gZndfY2ZnX2luaXRfaW9fZG1hKEZXX0NG R19JT19CQVNFLCBGV19DRkdfSU9fQkFTRSArIDQsIGFzKTsKICAgICBmd19jZmdfYWRkX2kxNihm d19jZmcsIEZXX0NGR19OQl9DUFVTLCBwY21zLT5ib290X2NwdXMpOwpAQCAtNzcxLDcgKzc3NCw3 IEBAIHN0YXRpYyBGV0NmZ1N0YXRlICpib2Noc19iaW9zX2luaXQoQWRkcmVzc1NwYWNlICphcywg UENNYWNoaW5lU3RhdGUgKnBjbXMpCiAgICAgICogU28gZm9yIGNvbXBhdGliaWxpdHkgcmVhc29u cyB3aXRoIG9sZCBCSU9TZXMgd2UgYXJlIHN0dWNrIHdpdGgKICAgICAgKiAiZXRjL21heC1jcHVz IiBhY3R1YWxseSBiZWluZyBhcGljX2lkX2xpbWl0CiAgICAgICovCi0gICAgZndfY2ZnX2FkZF9p MTYoZndfY2ZnLCBGV19DRkdfTUFYX0NQVVMsICh1aW50MTZfdClwY21zLT5hcGljX2lkX2xpbWl0 KTsKKyAgICBmd19jZmdfYWRkX2kxNihmd19jZmcsIEZXX0NGR19NQVhfQ1BVUywgKHVpbnQxNl90 KWFjcGlfY29uZi0+YXBpY19pZF9saW1pdCk7CiAgICAgZndfY2ZnX2FkZF9pNjQoZndfY2ZnLCBG V19DRkdfUkFNX1NJWkUsICh1aW50NjRfdClyYW1fc2l6ZSk7CiAgICAgZndfY2ZnX2FkZF9ieXRl cyhmd19jZmcsIEZXX0NGR19BQ1BJX1RBQkxFUywKICAgICAgICAgICAgICAgICAgICAgIGFjcGlf dGFibGVzLCBhY3BpX3RhYmxlc19sZW4pOwpAQCAtNzg3LDIwICs3OTAsMjEgQEAgc3RhdGljIEZX Q2ZnU3RhdGUgKmJvY2hzX2Jpb3NfaW5pdChBZGRyZXNzU3BhY2UgKmFzLCBQQ01hY2hpbmVTdGF0 ZSAqcGNtcykKICAgICAgKiBvZiBub2Rlcywgb25lIHdvcmQgZm9yIGVhY2ggVkNQVS0+bm9kZSBh bmQgb25lIHdvcmQgZm9yIGVhY2ggbm9kZSB0bwogICAgICAqIGhvbGQgdGhlIGFtb3VudCBvZiBt ZW1vcnkuCiAgICAgICovCi0gICAgbnVtYV9md19jZmcgPSBnX25ldzAodWludDY0X3QsIDEgKyBw Y21zLT5hcGljX2lkX2xpbWl0ICsgbmJfbnVtYV9ub2Rlcyk7CisgICAgbnVtYV9md19jZmcgPSBn X25ldzAodWludDY0X3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgMSArIGFjcGlfY29uZi0+ YXBpY19pZF9saW1pdCArIG5iX251bWFfbm9kZXMpOwogICAgIG51bWFfZndfY2ZnWzBdID0gY3B1 X3RvX2xlNjQobmJfbnVtYV9ub2Rlcyk7CiAgICAgY3B1cyA9IG1jLT5wb3NzaWJsZV9jcHVfYXJj aF9pZHMoTUFDSElORShwY21zKSk7CiAgICAgZm9yIChpID0gMDsgaSA8IGNwdXMtPmxlbjsgaSsr KSB7CiAgICAgICAgIHVuc2lnbmVkIGludCBhcGljX2lkID0gY3B1cy0+Y3B1c1tpXS5hcmNoX2lk OwotICAgICAgICBhc3NlcnQoYXBpY19pZCA8IHBjbXMtPmFwaWNfaWRfbGltaXQpOworICAgICAg ICBhc3NlcnQoYXBpY19pZCA8IGFjcGlfY29uZi0+YXBpY19pZF9saW1pdCk7CiAgICAgICAgIG51 bWFfZndfY2ZnW2FwaWNfaWQgKyAxXSA9IGNwdV90b19sZTY0KGNwdXMtPmNwdXNbaV0ucHJvcHMu bm9kZV9pZCk7CiAgICAgfQogICAgIGZvciAoaSA9IDA7IGkgPCBuYl9udW1hX25vZGVzOyBpKysp IHsKLSAgICAgICAgbnVtYV9md19jZmdbcGNtcy0+YXBpY19pZF9saW1pdCArIDEgKyBpXSA9Cisg ICAgICAgIG51bWFfZndfY2ZnW2FjcGlfY29uZi0+YXBpY19pZF9saW1pdCArIDEgKyBpXSA9CiAg ICAgICAgICAgICBjcHVfdG9fbGU2NChudW1hX2luZm9baV0ubm9kZV9tZW0pOwogICAgIH0KICAg ICBmd19jZmdfYWRkX2J5dGVzKGZ3X2NmZywgRldfQ0ZHX05VTUEsIG51bWFfZndfY2ZnLAotICAg ICAgICAgICAgICAgICAgICAgKDEgKyBwY21zLT5hcGljX2lkX2xpbWl0ICsgbmJfbnVtYV9ub2Rl cykgKgorICAgICAgICAgICAgICAgICAgICAgKDEgKyBhY3BpX2NvbmYtPmFwaWNfaWRfbGltaXQg KyBuYl9udW1hX25vZGVzKSAqCiAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoKm51bWFfZndf Y2ZnKSk7CiAKICAgICByZXR1cm4gZndfY2ZnOwpAQCAtODQ4LDYgKzg1Miw3IEBAIHN0YXRpYyB2 b2lkIGxvYWRfbGludXgoUENNYWNoaW5lU3RhdGUgKnBjbXMsCiAgICAgY2hhciAqdm1vZGU7CiAg ICAgTWFjaGluZVN0YXRlICptYWNoaW5lID0gTUFDSElORShwY21zKTsKICAgICBQQ01hY2hpbmVD bGFzcyAqcGNtYyA9IFBDX01BQ0hJTkVfR0VUX0NMQVNTKHBjbXMpOworICAgIEFjcGlDb25maWd1 cmF0aW9uICphY3BpX2NvbmYgPSAmcGNtcy0+YWNwaV9jb25maWd1cmF0aW9uOwogICAgIHN0cnVj dCBzZXR1cF9kYXRhICpzZXR1cF9kYXRhOwogICAgIGNvbnN0IGNoYXIgKmtlcm5lbF9maWxlbmFt ZSA9IG1hY2hpbmUtPmtlcm5lbF9maWxlbmFtZTsKICAgICBjb25zdCBjaGFyICppbml0cmRfZmls ZW5hbWUgPSBtYWNoaW5lLT5pbml0cmRfZmlsZW5hbWU7CkBAIC05MTcsOCArOTIyLDggQEAgc3Rh dGljIHZvaWQgbG9hZF9saW51eChQQ01hY2hpbmVTdGF0ZSAqcGNtcywKICAgICAgICAgaW5pdHJk X21heCA9IDB4MzdmZmZmZmY7CiAgICAgfQogCi0gICAgaWYgKGluaXRyZF9tYXggPj0gcGNtcy0+ YmVsb3dfNGdfbWVtX3NpemUgLSBwY21jLT5hY3BpX2RhdGFfc2l6ZSkgewotICAgICAgICBpbml0 cmRfbWF4ID0gcGNtcy0+YmVsb3dfNGdfbWVtX3NpemUgLSBwY21jLT5hY3BpX2RhdGFfc2l6ZSAt IDE7CisgICAgaWYgKGluaXRyZF9tYXggPj0gYWNwaV9jb25mLT5iZWxvd180Z19tZW1fc2l6ZSAt IHBjbWMtPmFjcGlfZGF0YV9zaXplKSB7CisgICAgICAgIGluaXRyZF9tYXggPSBhY3BpX2NvbmYt PmJlbG93XzRnX21lbV9zaXplIC0gcGNtYy0+YWNwaV9kYXRhX3NpemUgLSAxOwogICAgIH0KIAog ICAgIGZ3X2NmZ19hZGRfaTMyKGZ3X2NmZywgRldfQ0ZHX0NNRExJTkVfQUREUiwgY21kbGluZV9h ZGRyKTsKQEAgLTExNTQsNyArMTE1OSw4IEBAIHZvaWQgcGNfY3B1c19pbml0KFBDTWFjaGluZVN0 YXRlICpwY21zKQogICAgICAqCiAgICAgICogVGhpcyBpcyB1c2VkIGZvciBGV19DRkdfTUFYX0NQ VVMuIFNlZSBjb21tZW50cyBvbiBib2Noc19iaW9zX2luaXQoKS4KICAgICAgKi8KLSAgICBwY21z LT5hcGljX2lkX2xpbWl0ID0geDg2X2NwdV9hcGljX2lkX2Zyb21faW5kZXgobWF4X2NwdXMgLSAx KSArIDE7CisgICAgcGNtcy0+YWNwaV9jb25maWd1cmF0aW9uLmFwaWNfaWRfbGltaXQgPQorICAg ICAgICB4ODZfY3B1X2FwaWNfaWRfZnJvbV9pbmRleChtYXhfY3B1cyAtIDEpICsgMTsKICAgICBw b3NzaWJsZV9jcHVzID0gbWMtPnBvc3NpYmxlX2NwdV9hcmNoX2lkcyhtcyk7CiAgICAgZm9yIChp ID0gMDsgaSA8IHNtcF9jcHVzOyBpKyspIHsKICAgICAgICAgcGNfbmV3X2NwdShwb3NzaWJsZV9j cHVzLT5jcHVzW2ldLnR5cGUsIHBvc3NpYmxlX2NwdXMtPmNwdXNbaV0uYXJjaF9pZCwKQEAgLTEx ODgsNyArMTE5NCw4IEBAIHN0YXRpYyB2b2lkIHBjX2J1aWxkX2ZlYXR1cmVfY29udHJvbF9maWxl KFBDTWFjaGluZVN0YXRlICpwY21zKQogCiAgICAgdmFsID0gZ19tYWxsb2Moc2l6ZW9mKCp2YWwp KTsKICAgICAqdmFsID0gY3B1X3RvX2xlNjQoZmVhdHVyZV9jb250cm9sX2JpdHMgfCBGRUFUVVJF X0NPTlRST0xfTE9DS0VEKTsKLSAgICBmd19jZmdfYWRkX2ZpbGUocGNtcy0+ZndfY2ZnLCAiZXRj L21zcl9mZWF0dXJlX2NvbnRyb2wiLCB2YWwsIHNpemVvZigqdmFsKSk7CisgICAgZndfY2ZnX2Fk ZF9maWxlKHBjbXMtPmFjcGlfY29uZmlndXJhdGlvbi5md19jZmcsCisgICAgICAgICAgICAgICAg ICAgICJldGMvbXNyX2ZlYXR1cmVfY29udHJvbCIsIHZhbCwgc2l6ZW9mKCp2YWwpKTsKIH0KIAog c3RhdGljIHZvaWQgcnRjX3NldF9jcHVzX2NvdW50KElTQURldmljZSAqcnRjLCB1aW50MTZfdCBj cHVzX2NvdW50KQpAQCAtMTIwNCwxMSArMTIxMSwyNiBAQCBzdGF0aWMgdm9pZCBydGNfc2V0X2Nw dXNfY291bnQoSVNBRGV2aWNlICpydGMsIHVpbnQxNl90IGNwdXNfY291bnQpCiAgICAgfQogfQog CitzdGF0aWMgdm9pZCBhY3BpX2NvbmZfcGNfaW5pdChQQ01hY2hpbmVTdGF0ZSAqcGNtcykKK3sK KyAgICBQQ01hY2hpbmVDbGFzcyAqcGNtYyA9IFBDX01BQ0hJTkVfR0VUX0NMQVNTKHBjbXMpOwor ICAgIEFjcGlDb25maWd1cmF0aW9uICphY3BpX2NvbmYgPSAmcGNtcy0+YWNwaV9jb25maWd1cmF0 aW9uOworCisgICAgLyogTWFjaGluZSBjbGFzcyBzZXR0aW5ncyAqLworICAgIGFjcGlfY29uZi0+ bGVnYWN5X2FjcGlfdGFibGVfc2l6ZSA9IHBjbWMtPmxlZ2FjeV9hY3BpX3RhYmxlX3NpemU7Cisg ICAgYWNwaV9jb25mLT5sZWdhY3lfY3B1X2hvdHBsdWcgPSBwY21jLT5sZWdhY3lfY3B1X2hvdHBs dWc7CisgICAgYWNwaV9jb25mLT5yc2RwX2luX3JhbSA9IHBjbWMtPnJzZHBfaW5fcmFtOworCisg ICAgLyogQUNQSSBidWlsZCBzdGF0ZSAqLworICAgIGFjcGlfY29uZi0+YnVpbGRfc3RhdGUgPSBO VUxMOworfQorCiBzdGF0aWMKIHZvaWQgcGNfbWFjaGluZV9kb25lKE5vdGlmaWVyICpub3RpZmll ciwgdm9pZCAqZGF0YSkKIHsKICAgICBQQ01hY2hpbmVTdGF0ZSAqcGNtcyA9IGNvbnRhaW5lcl9v Zihub3RpZmllciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ01h Y2hpbmVTdGF0ZSwgbWFjaGluZV9kb25lKTsKKyAgICBBY3BpQ29uZmlndXJhdGlvbiAqYWNwaV9j b25mID0gJnBjbXMtPmFjcGlfY29uZmlndXJhdGlvbjsKICAgICBQQ0lCdXMgKmJ1cyA9IHBjbXMt PmJ1czsKIAogICAgIC8qIHNldCB0aGUgbnVtYmVyIG9mIENQVXMgKi8KQEAgLTEyMjMsMjMgKzEy NDUsMjcgQEAgdm9pZCBwY19tYWNoaW5lX2RvbmUoTm90aWZpZXIgKm5vdGlmaWVyLCB2b2lkICpk YXRhKQogICAgICAgICAgICAgICAgIGV4dHJhX2hvc3RzKys7CiAgICAgICAgICAgICB9CiAgICAg ICAgIH0KLSAgICAgICAgaWYgKGV4dHJhX2hvc3RzICYmIHBjbXMtPmZ3X2NmZykgeworICAgICAg ICBpZiAoZXh0cmFfaG9zdHMgJiYgYWNwaV9jb25mLT5md19jZmcpIHsKICAgICAgICAgICAgIHVp bnQ2NF90ICp2YWwgPSBnX21hbGxvYyhzaXplb2YoKnZhbCkpOwogICAgICAgICAgICAgKnZhbCA9 IGNwdV90b19sZTY0KGV4dHJhX2hvc3RzKTsKLSAgICAgICAgICAgIGZ3X2NmZ19hZGRfZmlsZShw Y21zLT5md19jZmcsCisgICAgICAgICAgICBmd19jZmdfYWRkX2ZpbGUoYWNwaV9jb25mLT5md19j ZmcsCiAgICAgICAgICAgICAgICAgICAgICJldGMvZXh0cmEtcGNpLXJvb3RzIiwgdmFsLCBzaXpl b2YoKnZhbCkpOwogICAgICAgICB9CiAgICAgfQogCi0gICAgYWNwaV9zZXR1cCgpOwotICAgIGlm IChwY21zLT5md19jZmcpIHsKKyAgICBpZiAocGNtcy0+YWNwaV9idWlsZF9lbmFibGVkKSB7Cisg ICAgICAgIGFjcGlfY29uZl9wY19pbml0KHBjbXMpOworICAgICAgICBhY3BpX3NldHVwKE1BQ0hJ TkUocGNtcyksIGFjcGlfY29uZik7CisgICAgfQorCisgICAgaWYgKGFjcGlfY29uZi0+ZndfY2Zn KSB7CiAgICAgICAgIHBjX2J1aWxkX3NtYmlvcyhwY21zKTsKICAgICAgICAgcGNfYnVpbGRfZmVh dHVyZV9jb250cm9sX2ZpbGUocGNtcyk7CiAgICAgICAgIC8qIHVwZGF0ZSBGV19DRkdfTkJfQ1BV UyB0byBhY2NvdW50IGZvciAtZGV2aWNlIGFkZGVkIENQVXMgKi8KLSAgICAgICAgZndfY2ZnX21v ZGlmeV9pMTYocGNtcy0+ZndfY2ZnLCBGV19DRkdfTkJfQ1BVUywgcGNtcy0+Ym9vdF9jcHVzKTsK KyAgICAgICAgZndfY2ZnX21vZGlmeV9pMTYoYWNwaV9jb25mLT5md19jZmcsIEZXX0NGR19OQl9D UFVTLCBwY21zLT5ib290X2NwdXMpOwogICAgIH0KIAotICAgIGlmIChwY21zLT5hcGljX2lkX2xp bWl0ID4gMjU1ICYmICF4ZW5fZW5hYmxlZCgpKSB7CisgICAgaWYgKGFjcGlfY29uZi0+YXBpY19p ZF9saW1pdCA+IDI1NSAmJiAheGVuX2VuYWJsZWQoKSkgewogICAgICAgICBJbnRlbElPTU1VU3Rh dGUgKmlvbW11ID0gSU5URUxfSU9NTVVfREVWSUNFKHg4Nl9pb21tdV9nZXRfZGVmYXVsdCgpKTsK IAogICAgICAgICBpZiAoIWlvbW11IHx8ICFpb21tdS0+eDg2X2lvbW11LmludHJfc3VwcG9ydGVk IHx8CkBAIC0xMjU2LDEzICsxMjgyLDE0IEBAIHZvaWQgcGNfbWFjaGluZV9kb25lKE5vdGlmaWVy ICpub3RpZmllciwgdm9pZCAqZGF0YSkKIHZvaWQgcGNfZ3Vlc3RfaW5mb19pbml0KFBDTWFjaGlu ZVN0YXRlICpwY21zKQogewogICAgIGludCBpOworICAgIEFjcGlDb25maWd1cmF0aW9uICphY3Bp X2NvbmYgPSAmcGNtcy0+YWNwaV9jb25maWd1cmF0aW9uOwogCi0gICAgcGNtcy0+YXBpY194cnVw dF9vdmVycmlkZSA9IGt2bV9hbGxvd3NfaXJxMF9vdmVycmlkZSgpOwotICAgIHBjbXMtPm51bWFf bm9kZXMgPSBuYl9udW1hX25vZGVzOwotICAgIHBjbXMtPm5vZGVfbWVtID0gZ19tYWxsb2MwKHBj bXMtPm51bWFfbm9kZXMgKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6 ZW9mICpwY21zLT5ub2RlX21lbSk7CisgICAgYWNwaV9jb25mLT5hcGljX3hydXB0X292ZXJyaWRl ID0ga3ZtX2FsbG93c19pcnEwX292ZXJyaWRlKCk7CisgICAgYWNwaV9jb25mLT5udW1hX25vZGVz ID0gbmJfbnVtYV9ub2RlczsKKyAgICBhY3BpX2NvbmYtPm5vZGVfbWVtID0gZ19tYWxsb2MwKGFj cGlfY29uZi0+bnVtYV9ub2RlcyAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBzaXplb2YgKmFjcGlfY29uZi0+bm9kZV9tZW0pOwogICAgIGZvciAoaSA9IDA7IGkgPCBuYl9u dW1hX25vZGVzOyBpKyspIHsKLSAgICAgICAgcGNtcy0+bm9kZV9tZW1baV0gPSBudW1hX2luZm9b aV0ubm9kZV9tZW07CisgICAgICAgIGFjcGlfY29uZi0+bm9kZV9tZW1baV0gPSBudW1hX2luZm9b aV0ubm9kZV9tZW07CiAgICAgfQogCiAgICAgcGNtcy0+bWFjaGluZV9kb25lLm5vdGlmeSA9IHBj X21hY2hpbmVfZG9uZTsKQEAgLTEzMjMsNyArMTM1MCw3IEBAIHZvaWQgeGVuX2xvYWRfbGludXgo UENNYWNoaW5lU3RhdGUgKnBjbXMpCiAgICAgICAgICAgICAgICAhc3RyY21wKG9wdGlvbl9yb21b aV0ubmFtZSwgIm11bHRpYm9vdC5iaW4iKSk7CiAgICAgICAgIHJvbV9hZGRfb3B0aW9uKG9wdGlv bl9yb21baV0ubmFtZSwgb3B0aW9uX3JvbVtpXS5ib290aW5kZXgpOwogICAgIH0KLSAgICBwY21z LT5md19jZmcgPSBmd19jZmc7CisgICAgcGNtcy0+YWNwaV9jb25maWd1cmF0aW9uLmZ3X2NmZyA9 IGZ3X2NmZzsKIH0KIAogdm9pZCBwY19tZW1vcnlfaW5pdChQQ01hY2hpbmVTdGF0ZSAqcGNtcywK QEAgLTEzMzcsOSArMTM2NCwxMCBAQCB2b2lkIHBjX21lbW9yeV9pbml0KFBDTWFjaGluZVN0YXRl ICpwY21zLAogICAgIEZXQ2ZnU3RhdGUgKmZ3X2NmZzsKICAgICBNYWNoaW5lU3RhdGUgKm1hY2hp bmUgPSBNQUNISU5FKHBjbXMpOwogICAgIFBDTWFjaGluZUNsYXNzICpwY21jID0gUENfTUFDSElO RV9HRVRfQ0xBU1MocGNtcyk7CisgICAgQWNwaUNvbmZpZ3VyYXRpb24gKmFjcGlfY29uZiA9ICZw Y21zLT5hY3BpX2NvbmZpZ3VyYXRpb247CiAKLSAgICBhc3NlcnQobWFjaGluZS0+cmFtX3NpemUg PT0gcGNtcy0+YmVsb3dfNGdfbWVtX3NpemUgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBwY21zLT5hYm92ZV80Z19tZW1fc2l6ZSk7CisgICAgYXNzZXJ0KG1hY2hpbmUtPnJhbV9z aXplID09IGFjcGlfY29uZi0+YmVsb3dfNGdfbWVtX3NpemUgKworICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBhY3BpX2NvbmYtPmFib3ZlXzRnX21lbV9zaXplKTsKIAogICAgIGxpbnV4 X2Jvb3QgPSAobWFjaGluZS0+a2VybmVsX2ZpbGVuYW1lICE9IE5VTEwpOwogCkBAIC0xMzUzLDE3 ICsxMzgxLDE3IEBAIHZvaWQgcGNfbWVtb3J5X2luaXQoUENNYWNoaW5lU3RhdGUgKnBjbXMsCiAg ICAgKnJhbV9tZW1vcnkgPSByYW07CiAgICAgcmFtX2JlbG93XzRnID0gZ19tYWxsb2Moc2l6ZW9m KCpyYW1fYmVsb3dfNGcpKTsKICAgICBtZW1vcnlfcmVnaW9uX2luaXRfYWxpYXMocmFtX2JlbG93 XzRnLCBOVUxMLCAicmFtLWJlbG93LTRnIiwgcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAwLCBwY21zLT5iZWxvd180Z19tZW1fc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIDAsIGFjcGlfY29uZi0+YmVsb3dfNGdfbWVtX3NpemUpOwogICAgIG1lbW9yeV9yZWdp b25fYWRkX3N1YnJlZ2lvbihzeXN0ZW1fbWVtb3J5LCAwLCByYW1fYmVsb3dfNGcpOwotICAgIGU4 MjBfYWRkX2VudHJ5KDAsIHBjbXMtPmJlbG93XzRnX21lbV9zaXplLCBFODIwX1JBTSk7Ci0gICAg aWYgKHBjbXMtPmFib3ZlXzRnX21lbV9zaXplID4gMCkgeworICAgIGU4MjBfYWRkX2VudHJ5KDAs IGFjcGlfY29uZi0+YmVsb3dfNGdfbWVtX3NpemUsIEU4MjBfUkFNKTsKKyAgICBpZiAoYWNwaV9j b25mLT5hYm92ZV80Z19tZW1fc2l6ZSA+IDApIHsKICAgICAgICAgcmFtX2Fib3ZlXzRnID0gZ19t YWxsb2Moc2l6ZW9mKCpyYW1fYWJvdmVfNGcpKTsKICAgICAgICAgbWVtb3J5X3JlZ2lvbl9pbml0 X2FsaWFzKHJhbV9hYm92ZV80ZywgTlVMTCwgInJhbS1hYm92ZS00ZyIsIHJhbSwKLSAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHBjbXMtPmJlbG93XzRnX21lbV9zaXplLAotICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgcGNtcy0+YWJvdmVfNGdfbWVtX3NpemUpOworICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNwaV9jb25mLT5iZWxvd180Z19tZW1fc2l6 ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjcGlfY29uZi0+YWJvdmVfNGdf bWVtX3NpemUpOwogICAgICAgICBtZW1vcnlfcmVnaW9uX2FkZF9zdWJyZWdpb24oc3lzdGVtX21l bW9yeSwgMHgxMDAwMDAwMDBVTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICByYW1fYWJvdmVfNGcpOwotICAgICAgICBlODIwX2FkZF9lbnRyeSgweDEwMDAwMDAwMFVMTCwg cGNtcy0+YWJvdmVfNGdfbWVtX3NpemUsIEU4MjBfUkFNKTsKKyAgICAgICAgZTgyMF9hZGRfZW50 cnkoMHgxMDAwMDAwMDBVTEwsIGFjcGlfY29uZi0+YWJvdmVfNGdfbWVtX3NpemUsIEU4MjBfUkFN KTsKICAgICB9CiAKICAgICBpZiAoIXBjbWMtPmhhc19yZXNlcnZlZF9tZW1vcnkgJiYKQEAgLTEz OTgsNyArMTQyNiw3IEBAIHZvaWQgcGNfbWVtb3J5X2luaXQoUENNYWNoaW5lU3RhdGUgKnBjbXMs CiAgICAgICAgIH0KIAogICAgICAgICBtYWNoaW5lLT5kZXZpY2VfbWVtb3J5LT5iYXNlID0KLSAg ICAgICAgICAgIFJPVU5EX1VQKDB4MTAwMDAwMDAwVUxMICsgcGNtcy0+YWJvdmVfNGdfbWVtX3Np emUsIDEgKiBHaUIpOworICAgICAgICAgICAgUk9VTkRfVVAoMHgxMDAwMDAwMDBVTEwgKyBhY3Bp X2NvbmYtPmFib3ZlXzRnX21lbV9zaXplLCAxICogR2lCKTsKIAogICAgICAgICBpZiAocGNtYy0+ ZW5mb3JjZV9hbGlnbmVkX2RpbW0pIHsKICAgICAgICAgICAgIC8qIHNpemUgZGV2aWNlIHJlZ2lv biBhc3N1bWluZyAxRyBwYWdlIG1heCBhbGlnbm1lbnQgcGVyIHNsb3QgKi8KQEAgLTE0NTUsNyAr MTQ4Myw3IEBAIHZvaWQgcGNfbWVtb3J5X2luaXQoUENNYWNoaW5lU3RhdGUgKnBjbXMsCiAgICAg Zm9yIChpID0gMDsgaSA8IG5iX29wdGlvbl9yb21zOyBpKyspIHsKICAgICAgICAgcm9tX2FkZF9v cHRpb24ob3B0aW9uX3JvbVtpXS5uYW1lLCBvcHRpb25fcm9tW2ldLmJvb3RpbmRleCk7CiAgICAg fQotICAgIHBjbXMtPmZ3X2NmZyA9IGZ3X2NmZzsKKyAgICBhY3BpX2NvbmYtPmZ3X2NmZyA9IGZ3 X2NmZzsKIAogICAgIC8qIEluaXQgZGVmYXVsdCBJT0FQSUMgYWRkcmVzcyBzcGFjZSAqLwogICAg IHBjbXMtPmlvYXBpY19hcyA9ICZhZGRyZXNzX3NwYWNlX21lbW9yeTsKQEAgLTE0NzgsNyArMTUw Niw4IEBAIHVpbnQ2NF90IHBjX3BjaV9ob2xlNjRfc3RhcnQodm9pZCkKICAgICAgICAgICAgIGhv bGU2NF9zdGFydCArPSBtZW1vcnlfcmVnaW9uX3NpemUoJm1zLT5kZXZpY2VfbWVtb3J5LT5tcik7 CiAgICAgICAgIH0KICAgICB9IGVsc2UgewotICAgICAgICBob2xlNjRfc3RhcnQgPSAweDEwMDAw MDAwMFVMTCArIHBjbXMtPmFib3ZlXzRnX21lbV9zaXplOworICAgICAgICBob2xlNjRfc3RhcnQg PQorICAgICAgICAgICAgMHgxMDAwMDAwMDBVTEwgKyBwY21zLT5hY3BpX2NvbmZpZ3VyYXRpb24u YWJvdmVfNGdfbWVtX3NpemU7CiAgICAgfQogCiAgICAgcmV0dXJuIFJPVU5EX1VQKGhvbGU2NF9z dGFydCwgMSAqIEdpQik7CkBAIC0xNjg1LDIxICsxNzE0LDIyIEBAIHN0YXRpYyB2b2lkIHBjX21l bW9yeV9wcmVfcGx1ZyhIb3RwbHVnSGFuZGxlciAqaG90cGx1Z19kZXYsIERldmljZVN0YXRlICpk ZXYsCiB7CiAgICAgY29uc3QgUENNYWNoaW5lU3RhdGUgKnBjbXMgPSBQQ19NQUNISU5FKGhvdHBs dWdfZGV2KTsKICAgICBjb25zdCBQQ01hY2hpbmVDbGFzcyAqcGNtYyA9IFBDX01BQ0hJTkVfR0VU X0NMQVNTKHBjbXMpOworICAgIGNvbnN0IEFjcGlDb25maWd1cmF0aW9uICphY3BpX2NvbmYgPSAm cGNtcy0+YWNwaV9jb25maWd1cmF0aW9uOwogICAgIGNvbnN0IGJvb2wgaXNfbnZkaW1tID0gb2Jq ZWN0X2R5bmFtaWNfY2FzdChPQkpFQ1QoZGV2KSwgVFlQRV9OVkRJTU0pOwogICAgIGNvbnN0IHVp bnQ2NF90IGxlZ2FjeV9hbGlnbiA9IFRBUkdFVF9QQUdFX1NJWkU7CiAKICAgICAvKgogICAgICAq IFdoZW4gLW5vLWFjcGkgaXMgdXNlZCB3aXRoIFEzNSBtYWNoaW5lIHR5cGUsIG5vIEFDUEkgaXMg YnVpbHQsCi0gICAgICogYnV0IHBjbXMtPmFjcGlfZGV2IGlzIHN0aWxsIGNyZWF0ZWQuIENoZWNr ICFhY3BpX2VuYWJsZWQgaW4KKyAgICAgKiBidXQgYWNwaV9kZXYgaXMgc3RpbGwgY3JlYXRlZC4g Q2hlY2sgIWFjcGlfZW5hYmxlZCBpbgogICAgICAqIGFkZGl0aW9uIHRvIGNvdmVyIHRoaXMgY2Fz ZS4KICAgICAgKi8KLSAgICBpZiAoIXBjbXMtPmFjcGlfZGV2IHx8ICFhY3BpX2VuYWJsZWQpIHsK KyAgICBpZiAoIWFjcGlfY29uZi0+YWNwaV9kZXYgfHwgIWFjcGlfZW5hYmxlZCkgewogICAgICAg ICBlcnJvcl9zZXRnKGVycnAsCiAgICAgICAgICAgICAgICAgICAgIm1lbW9yeSBob3RwbHVnIGlz IG5vdCBlbmFibGVkOiBtaXNzaW5nIGFjcGkgZGV2aWNlIG9yIGFjcGkgZGlzYWJsZWQiKTsKICAg ICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIGlmIChpc19udmRpbW0gJiYgIXBjbXMtPmFjcGlf bnZkaW1tX3N0YXRlLmlzX2VuYWJsZWQpIHsKKyAgICBpZiAoaXNfbnZkaW1tICYmICFhY3BpX2Nv bmYtPmFjcGlfbnZkaW1tX3N0YXRlLmlzX2VuYWJsZWQpIHsKICAgICAgICAgZXJyb3Jfc2V0Zyhl cnJwLCAibnZkaW1tIGlzIG5vdCBlbmFibGVkOiBtaXNzaW5nICdudmRpbW0nIGluICctTSciKTsK ICAgICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTE3MTUsNiArMTc0NSw3IEBAIHN0YXRpYyB2b2lk IHBjX21lbW9yeV9wbHVnKEhvdHBsdWdIYW5kbGVyICpob3RwbHVnX2RldiwKICAgICBFcnJvciAq bG9jYWxfZXJyID0gTlVMTDsKICAgICBQQ01hY2hpbmVTdGF0ZSAqcGNtcyA9IFBDX01BQ0hJTkUo aG90cGx1Z19kZXYpOwogICAgIGJvb2wgaXNfbnZkaW1tID0gb2JqZWN0X2R5bmFtaWNfY2FzdChP QkpFQ1QoZGV2KSwgVFlQRV9OVkRJTU0pOworICAgIEFjcGlDb25maWd1cmF0aW9uICphY3BpX2Nv bmYgPSAmcGNtcy0+YWNwaV9jb25maWd1cmF0aW9uOwogCiAgICAgcGNfZGltbV9wbHVnKFBDX0RJ TU0oZGV2KSwgTUFDSElORShwY21zKSwgJmxvY2FsX2Vycik7CiAgICAgaWYgKGxvY2FsX2Vycikg ewpAQCAtMTcyMiwxMSArMTc1MywxMSBAQCBzdGF0aWMgdm9pZCBwY19tZW1vcnlfcGx1ZyhIb3Rw bHVnSGFuZGxlciAqaG90cGx1Z19kZXYsCiAgICAgfQogCiAgICAgaWYgKGlzX252ZGltbSkgewot ICAgICAgICBudmRpbW1fcGx1ZygmcGNtcy0+YWNwaV9udmRpbW1fc3RhdGUpOworICAgICAgICBu dmRpbW1fcGx1ZygmYWNwaV9jb25mLT5hY3BpX252ZGltbV9zdGF0ZSk7CiAgICAgfQogCi0gICAg aGhjID0gSE9UUExVR19IQU5ETEVSX0dFVF9DTEFTUyhwY21zLT5hY3BpX2Rldik7Ci0gICAgaGhj LT5wbHVnKEhPVFBMVUdfSEFORExFUihwY21zLT5hY3BpX2RldiksIGRldiwgJmVycm9yX2Fib3J0 KTsKKyAgICBoaGMgPSBIT1RQTFVHX0hBTkRMRVJfR0VUX0NMQVNTKGFjcGlfY29uZi0+YWNwaV9k ZXYpOworICAgIGhoYy0+cGx1ZyhIT1RQTFVHX0hBTkRMRVIoYWNwaV9jb25mLT5hY3BpX2Rldiks IGRldiwgJmVycm9yX2Fib3J0KTsKIG91dDoKICAgICBlcnJvcl9wcm9wYWdhdGUoZXJycCwgbG9j YWxfZXJyKTsKIH0KQEAgLTE3MzcsMTMgKzE3NjgsMTQgQEAgc3RhdGljIHZvaWQgcGNfbWVtb3J5 X3VucGx1Z19yZXF1ZXN0KEhvdHBsdWdIYW5kbGVyICpob3RwbHVnX2RldiwKICAgICBIb3RwbHVn SGFuZGxlckNsYXNzICpoaGM7CiAgICAgRXJyb3IgKmxvY2FsX2VyciA9IE5VTEw7CiAgICAgUENN YWNoaW5lU3RhdGUgKnBjbXMgPSBQQ19NQUNISU5FKGhvdHBsdWdfZGV2KTsKKyAgICBBY3BpQ29u ZmlndXJhdGlvbiAqYWNwaV9jb25mID0gJnBjbXMtPmFjcGlfY29uZmlndXJhdGlvbjsKIAogICAg IC8qCiAgICAgICogV2hlbiAtbm8tYWNwaSBpcyB1c2VkIHdpdGggUTM1IG1hY2hpbmUgdHlwZSwg bm8gQUNQSSBpcyBidWlsdCwKLSAgICAgKiBidXQgcGNtcy0+YWNwaV9kZXYgaXMgc3RpbGwgY3Jl YXRlZC4gQ2hlY2sgIWFjcGlfZW5hYmxlZCBpbgorICAgICAqIGJ1dCBhY3BpX2RldiBpcyBzdGls bCBjcmVhdGVkLiBDaGVjayAhYWNwaV9lbmFibGVkIGluCiAgICAgICogYWRkaXRpb24gdG8gY292 ZXIgdGhpcyBjYXNlLgogICAgICAqLwotICAgIGlmICghcGNtcy0+YWNwaV9kZXYgfHwgIWFjcGlf ZW5hYmxlZCkgeworICAgIGlmICghYWNwaV9jb25mLT5hY3BpX2RldiB8fCAhYWNwaV9lbmFibGVk KSB7CiAgICAgICAgIGVycm9yX3NldGcoJmxvY2FsX2VyciwKICAgICAgICAgICAgICAgICAgICAi bWVtb3J5IGhvdHBsdWcgaXMgbm90IGVuYWJsZWQ6IG1pc3NpbmcgYWNwaSBkZXZpY2Ugb3IgYWNw aSBkaXNhYmxlZCIpOwogICAgICAgICBnb3RvIG91dDsKQEAgLTE3NTUsOCArMTc4Nyw4IEBAIHN0 YXRpYyB2b2lkIHBjX21lbW9yeV91bnBsdWdfcmVxdWVzdChIb3RwbHVnSGFuZGxlciAqaG90cGx1 Z19kZXYsCiAgICAgICAgIGdvdG8gb3V0OwogICAgIH0KIAotICAgIGhoYyA9IEhPVFBMVUdfSEFO RExFUl9HRVRfQ0xBU1MocGNtcy0+YWNwaV9kZXYpOwotICAgIGhoYy0+dW5wbHVnX3JlcXVlc3Qo SE9UUExVR19IQU5ETEVSKHBjbXMtPmFjcGlfZGV2KSwgZGV2LCAmbG9jYWxfZXJyKTsKKyAgICBo aGMgPSBIT1RQTFVHX0hBTkRMRVJfR0VUX0NMQVNTKGFjcGlfY29uZi0+YWNwaV9kZXYpOworICAg IGhoYy0+dW5wbHVnX3JlcXVlc3QoSE9UUExVR19IQU5ETEVSKGFjcGlfY29uZi0+YWNwaV9kZXYp LCBkZXYsICZsb2NhbF9lcnIpOwogCiBvdXQ6CiAgICAgZXJyb3JfcHJvcGFnYXRlKGVycnAsIGxv Y2FsX2Vycik7CkBAIC0xNzY2LDExICsxNzk4LDEyIEBAIHN0YXRpYyB2b2lkIHBjX21lbW9yeV91 bnBsdWcoSG90cGx1Z0hhbmRsZXIgKmhvdHBsdWdfZGV2LAogICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBEZXZpY2VTdGF0ZSAqZGV2LCBFcnJvciAqKmVycnApCiB7CiAgICAgUENNYWNoaW5l U3RhdGUgKnBjbXMgPSBQQ19NQUNISU5FKGhvdHBsdWdfZGV2KTsKKyAgICBBY3BpQ29uZmlndXJh dGlvbiAqYWNwaV9jb25mID0gJnBjbXMtPmFjcGlfY29uZmlndXJhdGlvbjsKICAgICBIb3RwbHVn SGFuZGxlckNsYXNzICpoaGM7CiAgICAgRXJyb3IgKmxvY2FsX2VyciA9IE5VTEw7CiAKLSAgICBo aGMgPSBIT1RQTFVHX0hBTkRMRVJfR0VUX0NMQVNTKHBjbXMtPmFjcGlfZGV2KTsKLSAgICBoaGMt PnVucGx1ZyhIT1RQTFVHX0hBTkRMRVIocGNtcy0+YWNwaV9kZXYpLCBkZXYsICZsb2NhbF9lcnIp OworICAgIGhoYyA9IEhPVFBMVUdfSEFORExFUl9HRVRfQ0xBU1MoYWNwaV9jb25mLT5hY3BpX2Rl dik7CisgICAgaGhjLT51bnBsdWcoSE9UUExVR19IQU5ETEVSKGFjcGlfY29uZi0+YWNwaV9kZXYp LCBkZXYsICZsb2NhbF9lcnIpOwogCiAgICAgaWYgKGxvY2FsX2VycikgewogICAgICAgICBnb3Rv IG91dDsKQEAgLTE4MTcsMTAgKzE4NTAsMTEgQEAgc3RhdGljIHZvaWQgcGNfY3B1X3BsdWcoSG90 cGx1Z0hhbmRsZXIgKmhvdHBsdWdfZGV2LAogICAgIEVycm9yICpsb2NhbF9lcnIgPSBOVUxMOwog ICAgIFg4NkNQVSAqY3B1ID0gWDg2X0NQVShkZXYpOwogICAgIFBDTWFjaGluZVN0YXRlICpwY21z ID0gUENfTUFDSElORShob3RwbHVnX2Rldik7CisgICAgQWNwaUNvbmZpZ3VyYXRpb24gKmFjcGlf Y29uZiA9ICZwY21zLT5hY3BpX2NvbmZpZ3VyYXRpb247CiAKLSAgICBpZiAocGNtcy0+YWNwaV9k ZXYpIHsKLSAgICAgICAgaGhjID0gSE9UUExVR19IQU5ETEVSX0dFVF9DTEFTUyhwY21zLT5hY3Bp X2Rldik7Ci0gICAgICAgIGhoYy0+cGx1ZyhIT1RQTFVHX0hBTkRMRVIocGNtcy0+YWNwaV9kZXYp LCBkZXYsICZsb2NhbF9lcnIpOworICAgIGlmIChhY3BpX2NvbmYtPmFjcGlfZGV2KSB7CisgICAg ICAgIGhoYyA9IEhPVFBMVUdfSEFORExFUl9HRVRfQ0xBU1MoYWNwaV9jb25mLT5hY3BpX2Rldik7 CisgICAgICAgIGhoYy0+cGx1ZyhIT1RQTFVHX0hBTkRMRVIoYWNwaV9jb25mLT5hY3BpX2Rldiks IGRldiwgJmxvY2FsX2Vycik7CiAgICAgICAgIGlmIChsb2NhbF9lcnIpIHsKICAgICAgICAgICAg IGdvdG8gb3V0OwogICAgICAgICB9CkBAIC0xODMxLDggKzE4NjUsOCBAQCBzdGF0aWMgdm9pZCBw Y19jcHVfcGx1ZyhIb3RwbHVnSGFuZGxlciAqaG90cGx1Z19kZXYsCiAgICAgaWYgKHBjbXMtPnJ0 YykgewogICAgICAgICBydGNfc2V0X2NwdXNfY291bnQocGNtcy0+cnRjLCBwY21zLT5ib290X2Nw dXMpOwogICAgIH0KLSAgICBpZiAocGNtcy0+ZndfY2ZnKSB7Ci0gICAgICAgIGZ3X2NmZ19tb2Rp ZnlfaTE2KHBjbXMtPmZ3X2NmZywgRldfQ0ZHX05CX0NQVVMsIHBjbXMtPmJvb3RfY3B1cyk7Cisg ICAgaWYgKGFjcGlfY29uZi0+ZndfY2ZnKSB7CisgICAgICAgIGZ3X2NmZ19tb2RpZnlfaTE2KGFj cGlfY29uZi0+ZndfY2ZnLCBGV19DRkdfTkJfQ1BVUywgcGNtcy0+Ym9vdF9jcHVzKTsKICAgICB9 CiAKICAgICBmb3VuZF9jcHUgPSBwY19maW5kX2NwdV9zbG90KE1BQ0hJTkUocGNtcyksIGNwdS0+ YXBpY19pZCwgTlVMTCk7CkBAIC0xODQ4LDggKzE4ODIsOSBAQCBzdGF0aWMgdm9pZCBwY19jcHVf dW5wbHVnX3JlcXVlc3RfY2IoSG90cGx1Z0hhbmRsZXIgKmhvdHBsdWdfZGV2LAogICAgIEVycm9y ICpsb2NhbF9lcnIgPSBOVUxMOwogICAgIFg4NkNQVSAqY3B1ID0gWDg2X0NQVShkZXYpOwogICAg IFBDTWFjaGluZVN0YXRlICpwY21zID0gUENfTUFDSElORShob3RwbHVnX2Rldik7CisgICAgQWNw aUNvbmZpZ3VyYXRpb24gKmFjcGlfY29uZiA9ICZwY21zLT5hY3BpX2NvbmZpZ3VyYXRpb247CiAK LSAgICBpZiAoIXBjbXMtPmFjcGlfZGV2KSB7CisgICAgaWYgKCFhY3BpX2NvbmYtPmFjcGlfZGV2 KSB7CiAgICAgICAgIGVycm9yX3NldGcoJmxvY2FsX2VyciwgIkNQVSBob3QgdW5wbHVnIG5vdCBz dXBwb3J0ZWQgd2l0aG91dCBBQ1BJIik7CiAgICAgICAgIGdvdG8gb3V0OwogICAgIH0KQEAgLTE4 NjEsOCArMTg5Niw4IEBAIHN0YXRpYyB2b2lkIHBjX2NwdV91bnBsdWdfcmVxdWVzdF9jYihIb3Rw bHVnSGFuZGxlciAqaG90cGx1Z19kZXYsCiAgICAgICAgIGdvdG8gb3V0OwogICAgIH0KIAotICAg IGhoYyA9IEhPVFBMVUdfSEFORExFUl9HRVRfQ0xBU1MocGNtcy0+YWNwaV9kZXYpOwotICAgIGho Yy0+dW5wbHVnX3JlcXVlc3QoSE9UUExVR19IQU5ETEVSKHBjbXMtPmFjcGlfZGV2KSwgZGV2LCAm bG9jYWxfZXJyKTsKKyAgICBoaGMgPSBIT1RQTFVHX0hBTkRMRVJfR0VUX0NMQVNTKGFjcGlfY29u Zi0+YWNwaV9kZXYpOworICAgIGhoYy0+dW5wbHVnX3JlcXVlc3QoSE9UUExVR19IQU5ETEVSKGFj cGlfY29uZi0+YWNwaV9kZXYpLCBkZXYsICZsb2NhbF9lcnIpOwogCiAgICAgaWYgKGxvY2FsX2Vy cikgewogICAgICAgICBnb3RvIG91dDsKQEAgLTE4ODEsOSArMTkxNiwxMCBAQCBzdGF0aWMgdm9p ZCBwY19jcHVfdW5wbHVnX2NiKEhvdHBsdWdIYW5kbGVyICpob3RwbHVnX2RldiwKICAgICBFcnJv ciAqbG9jYWxfZXJyID0gTlVMTDsKICAgICBYODZDUFUgKmNwdSA9IFg4Nl9DUFUoZGV2KTsKICAg ICBQQ01hY2hpbmVTdGF0ZSAqcGNtcyA9IFBDX01BQ0hJTkUoaG90cGx1Z19kZXYpOworICAgIEFj cGlDb25maWd1cmF0aW9uICphY3BpX2NvbmYgPSAmcGNtcy0+YWNwaV9jb25maWd1cmF0aW9uOwog Ci0gICAgaGhjID0gSE9UUExVR19IQU5ETEVSX0dFVF9DTEFTUyhwY21zLT5hY3BpX2Rldik7Ci0g ICAgaGhjLT51bnBsdWcoSE9UUExVR19IQU5ETEVSKHBjbXMtPmFjcGlfZGV2KSwgZGV2LCAmbG9j YWxfZXJyKTsKKyAgICBoaGMgPSBIT1RQTFVHX0hBTkRMRVJfR0VUX0NMQVNTKGFjcGlfY29uZi0+ YWNwaV9kZXYpOworICAgIGhoYy0+dW5wbHVnKEhPVFBMVUdfSEFORExFUihhY3BpX2NvbmYtPmFj cGlfZGV2KSwgZGV2LCAmbG9jYWxfZXJyKTsKIAogICAgIGlmIChsb2NhbF9lcnIpIHsKICAgICAg ICAgZ290byBvdXQ7CkBAIC0xODk3LDcgKzE5MzMsNyBAQCBzdGF0aWMgdm9pZCBwY19jcHVfdW5w bHVnX2NiKEhvdHBsdWdIYW5kbGVyICpob3RwbHVnX2RldiwKICAgICBwY21zLT5ib290X2NwdXMt LTsKICAgICAvKiBVcGRhdGUgdGhlIG51bWJlciBvZiBDUFVzIGluIENNT1MgKi8KICAgICBydGNf c2V0X2NwdXNfY291bnQocGNtcy0+cnRjLCBwY21zLT5ib290X2NwdXMpOwotICAgIGZ3X2NmZ19t b2RpZnlfaTE2KHBjbXMtPmZ3X2NmZywgRldfQ0ZHX05CX0NQVVMsIHBjbXMtPmJvb3RfY3B1cyk7 CisgICAgZndfY2ZnX21vZGlmeV9pMTYoYWNwaV9jb25mLT5md19jZmcsIEZXX0NGR19OQl9DUFVT LCBwY21zLT5ib290X2NwdXMpOwogIG91dDoKICAgICBlcnJvcl9wcm9wYWdhdGUoZXJycCwgbG9j YWxfZXJyKTsKIH0KQEAgLTIxODEsMjggKzIyMTcsMzAgQEAgc3RhdGljIGJvb2wgcGNfbWFjaGlu ZV9nZXRfbnZkaW1tKE9iamVjdCAqb2JqLCBFcnJvciAqKmVycnApCiB7CiAgICAgUENNYWNoaW5l U3RhdGUgKnBjbXMgPSBQQ19NQUNISU5FKG9iaik7CiAKLSAgICByZXR1cm4gcGNtcy0+YWNwaV9u dmRpbW1fc3RhdGUuaXNfZW5hYmxlZDsKKyAgICByZXR1cm4gcGNtcy0+YWNwaV9jb25maWd1cmF0 aW9uLmFjcGlfbnZkaW1tX3N0YXRlLmlzX2VuYWJsZWQ7CiB9CiAKIHN0YXRpYyB2b2lkIHBjX21h Y2hpbmVfc2V0X252ZGltbShPYmplY3QgKm9iaiwgYm9vbCB2YWx1ZSwgRXJyb3IgKiplcnJwKQog ewogICAgIFBDTWFjaGluZVN0YXRlICpwY21zID0gUENfTUFDSElORShvYmopOworICAgIEFjcGlD b25maWd1cmF0aW9uICphY3BpX2NvbmYgPSAmcGNtcy0+YWNwaV9jb25maWd1cmF0aW9uOwogCi0g ICAgcGNtcy0+YWNwaV9udmRpbW1fc3RhdGUuaXNfZW5hYmxlZCA9IHZhbHVlOworICAgIGFjcGlf Y29uZi0+YWNwaV9udmRpbW1fc3RhdGUuaXNfZW5hYmxlZCA9IHZhbHVlOwogfQogCiBzdGF0aWMg Y2hhciAqcGNfbWFjaGluZV9nZXRfbnZkaW1tX3BlcnNpc3RlbmNlKE9iamVjdCAqb2JqLCBFcnJv ciAqKmVycnApCiB7CiAgICAgUENNYWNoaW5lU3RhdGUgKnBjbXMgPSBQQ19NQUNISU5FKG9iaik7 CisgICAgQWNwaUNvbmZpZ3VyYXRpb24gKmFjcGlfY29uZiA9ICZwY21zLT5hY3BpX2NvbmZpZ3Vy YXRpb247CiAKLSAgICByZXR1cm4gZ19zdHJkdXAocGNtcy0+YWNwaV9udmRpbW1fc3RhdGUucGVy c2lzdGVuY2Vfc3RyaW5nKTsKKyAgICByZXR1cm4gZ19zdHJkdXAoYWNwaV9jb25mLT5hY3BpX252 ZGltbV9zdGF0ZS5wZXJzaXN0ZW5jZV9zdHJpbmcpOwogfQogCiBzdGF0aWMgdm9pZCBwY19tYWNo aW5lX3NldF9udmRpbW1fcGVyc2lzdGVuY2UoT2JqZWN0ICpvYmosIGNvbnN0IGNoYXIgKnZhbHVl LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFcnJvciAq KmVycnApCiB7CiAgICAgUENNYWNoaW5lU3RhdGUgKnBjbXMgPSBQQ19NQUNISU5FKG9iaik7Ci0g ICAgQWNwaU5WRElNTVN0YXRlICpudmRpbW1fc3RhdGUgPSAmcGNtcy0+YWNwaV9udmRpbW1fc3Rh dGU7CisgICAgQWNwaU5WRElNTVN0YXRlICpudmRpbW1fc3RhdGUgPSAmcGNtcy0+YWNwaV9jb25m aWd1cmF0aW9uLmFjcGlfbnZkaW1tX3N0YXRlOwogCiAgICAgaWYgKHN0cmNtcCh2YWx1ZSwgImNw dSIpID09IDApCiAgICAgICAgIG52ZGltbV9zdGF0ZS0+cGVyc2lzdGVuY2UgPSAzOwpAQCAtMjI2 OCw3ICsyMzA2LDcgQEAgc3RhdGljIHZvaWQgcGNfbWFjaGluZV9pbml0Zm4oT2JqZWN0ICpvYmop CiAgICAgcGNtcy0+c21tID0gT05fT0ZGX0FVVE9fQVVUTzsKICAgICBwY21zLT52bXBvcnQgPSBP Tl9PRkZfQVVUT19BVVRPOwogICAgIC8qIG52ZGltbSBpcyBkaXNhYmxlZCBvbiBkZWZhdWx0LiAq LwotICAgIHBjbXMtPmFjcGlfbnZkaW1tX3N0YXRlLmlzX2VuYWJsZWQgPSBmYWxzZTsKKyAgICBw Y21zLT5hY3BpX2NvbmZpZ3VyYXRpb24uYWNwaV9udmRpbW1fc3RhdGUuaXNfZW5hYmxlZCA9IGZh bHNlOwogICAgIC8qIGFjcGkgYnVpbGQgaXMgZW5hYmxlZCBieSBkZWZhdWx0IGlmIG1hY2hpbmUg c3VwcG9ydHMgaXQgKi8KICAgICBwY21zLT5hY3BpX2J1aWxkX2VuYWJsZWQgPSBQQ19NQUNISU5F X0dFVF9DTEFTUyhwY21zKS0+aGFzX2FjcGlfYnVpbGQ7CiAgICAgcGNtcy0+c21idXMgPSB0cnVl OwpkaWZmIC0tZ2l0IGEvaHcvaTM4Ni9wY19waWl4LmMgYi9ody9pMzg2L3BjX3BpaXguYwppbmRl eCBkYzA5NDY2YjNlLi4wNjIwZDEwNzE1IDEwMDY0NAotLS0gYS9ody9pMzg2L3BjX3BpaXguYwor KysgYi9ody9pMzg2L3BjX3BpaXguYwpAQCAtNzEsNiArNzEsNyBAQCBzdGF0aWMgdm9pZCBwY19p bml0MShNYWNoaW5lU3RhdGUgKm1hY2hpbmUsCiB7CiAgICAgUENNYWNoaW5lU3RhdGUgKnBjbXMg PSBQQ19NQUNISU5FKG1hY2hpbmUpOwogICAgIFBDTWFjaGluZUNsYXNzICpwY21jID0gUENfTUFD SElORV9HRVRfQ0xBU1MocGNtcyk7CisgICAgQWNwaUNvbmZpZ3VyYXRpb24gKmFjcGlfY29uZiA9 ICZwY21zLT5hY3BpX2NvbmZpZ3VyYXRpb247CiAgICAgTWVtb3J5UmVnaW9uICpzeXN0ZW1fbWVt b3J5ID0gZ2V0X3N5c3RlbV9tZW1vcnkoKTsKICAgICBNZW1vcnlSZWdpb24gKnN5c3RlbV9pbyA9 IGdldF9zeXN0ZW1faW8oKTsKICAgICBpbnQgaTsKQEAgLTE0MiwxMSArMTQzLDExIEBAIHN0YXRp YyB2b2lkIHBjX2luaXQxKE1hY2hpbmVTdGF0ZSAqbWFjaGluZSwKICAgICAgICAgfQogCiAgICAg ICAgIGlmIChtYWNoaW5lLT5yYW1fc2l6ZSA+PSBsb3dtZW0pIHsKLSAgICAgICAgICAgIHBjbXMt PmFib3ZlXzRnX21lbV9zaXplID0gbWFjaGluZS0+cmFtX3NpemUgLSBsb3dtZW07Ci0gICAgICAg ICAgICBwY21zLT5iZWxvd180Z19tZW1fc2l6ZSA9IGxvd21lbTsKKyAgICAgICAgICAgIGFjcGlf Y29uZi0+YWJvdmVfNGdfbWVtX3NpemUgPSBtYWNoaW5lLT5yYW1fc2l6ZSAtIGxvd21lbTsKKyAg ICAgICAgICAgIGFjcGlfY29uZi0+YmVsb3dfNGdfbWVtX3NpemUgPSBsb3dtZW07CiAgICAgICAg IH0gZWxzZSB7Ci0gICAgICAgICAgICBwY21zLT5hYm92ZV80Z19tZW1fc2l6ZSA9IDA7Ci0gICAg ICAgICAgICBwY21zLT5iZWxvd180Z19tZW1fc2l6ZSA9IG1hY2hpbmUtPnJhbV9zaXplOworICAg ICAgICAgICAgYWNwaV9jb25mLT5hYm92ZV80Z19tZW1fc2l6ZSA9IDA7CisgICAgICAgICAgICBh Y3BpX2NvbmYtPmJlbG93XzRnX21lbV9zaXplID0gbWFjaGluZS0+cmFtX3NpemU7CiAgICAgICAg IH0KICAgICB9CiAKQEAgLTE5OSw4ICsyMDAsOCBAQCBzdGF0aWMgdm9pZCBwY19pbml0MShNYWNo aW5lU3RhdGUgKm1hY2hpbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwY2lfdHlw ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpNDQwZnhfc3RhdGUsICZwaWl4M19k ZXZmbiwgJmlzYV9idXMsIHBjbXMtPmdzaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IHN5c3RlbV9tZW1vcnksIHN5c3RlbV9pbywgbWFjaGluZS0+cmFtX3NpemUsCi0gICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBwY21zLT5iZWxvd180Z19tZW1fc2l6ZSwKLSAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHBjbXMtPmFib3ZlXzRnX21lbV9zaXplLAorICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgYWNwaV9jb25mLT5iZWxvd180Z19tZW1fc2l6ZSwKKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIGFjcGlfY29uZi0+YWJvdmVfNGdfbWVtX3NpemUsCiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBwY2lfbWVtb3J5LCByYW1fbWVtb3J5KTsKICAgICAg ICAgcGNtcy0+YnVzID0gcGNpX2J1czsKICAgICB9IGVsc2UgewpAQCAtMjg5LDE2ICsyOTAsMTYg QEAgc3RhdGljIHZvaWQgcGNfaW5pdDEoTWFjaGluZVN0YXRlICptYWNoaW5lLAogCiAgICAgICAg IG9iamVjdF9wcm9wZXJ0eV9hZGRfbGluayhPQkpFQ1QobWFjaGluZSksIFBDX01BQ0hJTkVfQUNQ SV9ERVZJQ0VfUFJPUCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRZUEVfSE9U UExVR19IQU5ETEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9iamVjdCAq KikmcGNtcy0+YWNwaV9kZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT2Jq ZWN0ICoqKSZhY3BpX2NvbmYtPmFjcGlfZGV2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgb2JqZWN0X3Byb3BlcnR5X2FsbG93X3NldF9saW5rLAogICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgT0JKX1BST1BfTElOS19TVFJPTkcsICZlcnJvcl9hYm9ydCk7CiAgICAg ICAgIG9iamVjdF9wcm9wZXJ0eV9zZXRfbGluayhPQkpFQ1QobWFjaGluZSksIE9CSkVDVChwaWl4 NF9wbSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ19NQUNISU5FX0FDUElf REVWSUNFX1BST1AsICZlcnJvcl9hYm9ydCk7CiAgICAgfQogCi0gICAgaWYgKHBjbXMtPmFjcGlf bnZkaW1tX3N0YXRlLmlzX2VuYWJsZWQpIHsKLSAgICAgICAgbnZkaW1tX2luaXRfYWNwaV9zdGF0 ZSgmcGNtcy0+YWNwaV9udmRpbW1fc3RhdGUsIHN5c3RlbV9pbywKLSAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBwY21zLT5md19jZmcsIE9CSkVDVChwY21zKSk7CisgICAgaWYgKGFjcGlf Y29uZi0+YWNwaV9udmRpbW1fc3RhdGUuaXNfZW5hYmxlZCkgeworICAgICAgICBudmRpbW1faW5p dF9hY3BpX3N0YXRlKCZhY3BpX2NvbmYtPmFjcGlfbnZkaW1tX3N0YXRlLCBzeXN0ZW1faW8sCisg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNwaV9jb25mLT5md19jZmcsIE9CSkVDVChw Y21zKSk7CiAgICAgfQogfQogCmRpZmYgLS1naXQgYS9ody9pMzg2L3BjX3EzNS5jIGIvaHcvaTM4 Ni9wY19xMzUuYwppbmRleCA1MzIyNDFlM2Y4Li5jZGRlNGE0YmViIDEwMDY0NAotLS0gYS9ody9p Mzg2L3BjX3EzNS5jCisrKyBiL2h3L2kzODYvcGNfcTM1LmMKQEAgLTYzLDYgKzYzLDcgQEAgc3Rh dGljIHZvaWQgcGNfcTM1X2luaXQoTWFjaGluZVN0YXRlICptYWNoaW5lKQogewogICAgIFBDTWFj aGluZVN0YXRlICpwY21zID0gUENfTUFDSElORShtYWNoaW5lKTsKICAgICBQQ01hY2hpbmVDbGFz cyAqcGNtYyA9IFBDX01BQ0hJTkVfR0VUX0NMQVNTKHBjbXMpOworICAgIEFjcGlDb25maWd1cmF0 aW9uICphY3BpX2NvbmYgPSAmcGNtcy0+YWNwaV9jb25maWd1cmF0aW9uOwogICAgIFEzNVBDSUhv c3QgKnEzNV9ob3N0OwogICAgIFBDSUhvc3RTdGF0ZSAqcGhiOwogICAgIFBDSUJ1cyAqaG9zdF9i dXM7CkBAIC0xMTYsMTEgKzExNywxMSBAQCBzdGF0aWMgdm9pZCBwY19xMzVfaW5pdChNYWNoaW5l U3RhdGUgKm1hY2hpbmUpCiAgICAgfQogCiAgICAgaWYgKG1hY2hpbmUtPnJhbV9zaXplID49IGxv d21lbSkgewotICAgICAgICBwY21zLT5hYm92ZV80Z19tZW1fc2l6ZSA9IG1hY2hpbmUtPnJhbV9z aXplIC0gbG93bWVtOwotICAgICAgICBwY21zLT5iZWxvd180Z19tZW1fc2l6ZSA9IGxvd21lbTsK KyAgICAgICAgYWNwaV9jb25mLT5hYm92ZV80Z19tZW1fc2l6ZSA9IG1hY2hpbmUtPnJhbV9zaXpl IC0gbG93bWVtOworICAgICAgICBhY3BpX2NvbmYtPmJlbG93XzRnX21lbV9zaXplID0gbG93bWVt OwogICAgIH0gZWxzZSB7Ci0gICAgICAgIHBjbXMtPmFib3ZlXzRnX21lbV9zaXplID0gMDsKLSAg ICAgICAgcGNtcy0+YmVsb3dfNGdfbWVtX3NpemUgPSBtYWNoaW5lLT5yYW1fc2l6ZTsKKyAgICAg ICAgYWNwaV9jb25mLT5hYm92ZV80Z19tZW1fc2l6ZSA9IDA7CisgICAgICAgIGFjcGlfY29uZi0+ YmVsb3dfNGdfbWVtX3NpemUgPSBtYWNoaW5lLT5yYW1fc2l6ZTsKICAgICB9CiAKICAgICBpZiAo eGVuX2VuYWJsZWQoKSkgewpAQCAtMTc5LDkgKzE4MCw5IEBAIHN0YXRpYyB2b2lkIHBjX3EzNV9p bml0KE1hY2hpbmVTdGF0ZSAqbWFjaGluZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg TUNIX0hPU1RfUFJPUF9TWVNURU1fTUVNLCBOVUxMKTsKICAgICBvYmplY3RfcHJvcGVydHlfc2V0 X2xpbmsoT0JKRUNUKHEzNV9ob3N0KSwgT0JKRUNUKHN5c3RlbV9pbyksCiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIE1DSF9IT1NUX1BST1BfSU9fTUVNLCBOVUxMKTsKLSAgICBvYmplY3Rf cHJvcGVydHlfc2V0X2ludChPQkpFQ1QocTM1X2hvc3QpLCBwY21zLT5iZWxvd180Z19tZW1fc2l6 ZSwKKyAgICBvYmplY3RfcHJvcGVydHlfc2V0X2ludChPQkpFQ1QocTM1X2hvc3QpLCBhY3BpX2Nv bmYtPmJlbG93XzRnX21lbV9zaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDSV9I T1NUX0JFTE9XXzRHX01FTV9TSVpFLCBOVUxMKTsKLSAgICBvYmplY3RfcHJvcGVydHlfc2V0X2lu dChPQkpFQ1QocTM1X2hvc3QpLCBwY21zLT5hYm92ZV80Z19tZW1fc2l6ZSwKKyAgICBvYmplY3Rf cHJvcGVydHlfc2V0X2ludChPQkpFQ1QocTM1X2hvc3QpLCBhY3BpX2NvbmYtPmFib3ZlXzRnX21l bV9zaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDSV9IT1NUX0FCT1ZFXzRHX01F TV9TSVpFLCBOVUxMKTsKICAgICAvKiBwY2kgKi8KICAgICBxZGV2X2luaXRfbm9mYWlsKERFVklD RShxMzVfaG9zdCkpOwpAQCAtMTk0LDcgKzE5NSw3IEBAIHN0YXRpYyB2b2lkIHBjX3EzNV9pbml0 KE1hY2hpbmVTdGF0ZSAqbWFjaGluZSkKIAogICAgIG9iamVjdF9wcm9wZXJ0eV9hZGRfbGluayhP QkpFQ1QobWFjaGluZSksIFBDX01BQ0hJTkVfQUNQSV9ERVZJQ0VfUFJPUCwKICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgVFlQRV9IT1RQTFVHX0hBTkRMRVIsCi0gICAgICAgICAgICAgICAg ICAgICAgICAgICAgIChPYmplY3QgKiopJnBjbXMtPmFjcGlfZGV2LAorICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAoT2JqZWN0ICoqKSZhY3BpX2NvbmYtPmFjcGlfZGV2LAogICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBvYmplY3RfcHJvcGVydHlfYWxsb3dfc2V0X2xpbmssCiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIE9CSl9QUk9QX0xJTktfU1RST05HLCAmZXJyb3JfYWJv cnQpOwogICAgIG9iamVjdF9wcm9wZXJ0eV9zZXRfbGluayhPQkpFQ1QobWFjaGluZSksIE9CSkVD VChscGMpLApAQCAtMjc2LDkgKzI3Nyw5IEBAIHN0YXRpYyB2b2lkIHBjX3EzNV9pbml0KE1hY2hp bmVTdGF0ZSAqbWFjaGluZSkKICAgICBwY192Z2FfaW5pdChpc2FfYnVzLCBob3N0X2J1cyk7CiAg ICAgcGNfbmljX2luaXQocGNtYywgaXNhX2J1cywgaG9zdF9idXMpOwogCi0gICAgaWYgKHBjbXMt PmFjcGlfbnZkaW1tX3N0YXRlLmlzX2VuYWJsZWQpIHsKLSAgICAgICAgbnZkaW1tX2luaXRfYWNw aV9zdGF0ZSgmcGNtcy0+YWNwaV9udmRpbW1fc3RhdGUsIHN5c3RlbV9pbywKLSAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBwY21zLT5md19jZmcsIE9CSkVDVChwY21zKSk7CisgICAgaWYg KGFjcGlfY29uZi0+YWNwaV9udmRpbW1fc3RhdGUuaXNfZW5hYmxlZCkgeworICAgICAgICBudmRp bW1faW5pdF9hY3BpX3N0YXRlKCZhY3BpX2NvbmYtPmFjcGlfbnZkaW1tX3N0YXRlLCBzeXN0ZW1f aW8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNwaV9jb25mLT5md19jZmcsIE9C SkVDVChwY21zKSk7CiAgICAgfQogfQogCmRpZmYgLS1naXQgYS9ody9pMzg2L3hlbi94ZW4taHZt LmMgYi9ody9pMzg2L3hlbi94ZW4taHZtLmMKaW5kZXggOTM1YTM2NzZjOC4uMDQ1OWZiNzM0MCAx MDA2NDQKLS0tIGEvaHcvaTM4Ni94ZW4veGVuLWh2bS5jCisrKyBiL2h3L2kzODYveGVuL3hlbi1o dm0uYwpAQCAtMTkwLDYgKzE5MCw3IEBAIHFlbXVfaXJxICp4ZW5faW50ZXJydXB0X2NvbnRyb2xs ZXJfaW5pdCh2b2lkKQogc3RhdGljIHZvaWQgeGVuX3JhbV9pbml0KFBDTWFjaGluZVN0YXRlICpw Y21zLAogICAgICAgICAgICAgICAgICAgICAgICAgIHJhbV9hZGRyX3QgcmFtX3NpemUsIE1lbW9y eVJlZ2lvbiAqKnJhbV9tZW1vcnlfcCkKIHsKKyAgICBBY3BpQ29uZmlndXJhdGlvbiAqYWNwaV9j b25mID0gJnBjbXMtPmFjcGlfY29uZmlndXJhdGlvbjsKICAgICBNZW1vcnlSZWdpb24gKnN5c21l bSA9IGdldF9zeXN0ZW1fbWVtb3J5KCk7CiAgICAgcmFtX2FkZHJfdCBibG9ja19sZW47CiAgICAg dWludDY0X3QgdXNlcl9sb3dtZW0gPSBvYmplY3RfcHJvcGVydHlfZ2V0X3VpbnQocWRldl9nZXRf bWFjaGluZSgpLApAQCAtMjA3LDIwICsyMDgsMjAgQEAgc3RhdGljIHZvaWQgeGVuX3JhbV9pbml0 KFBDTWFjaGluZVN0YXRlICpwY21zLAogICAgIH0KIAogICAgIGlmIChyYW1fc2l6ZSA+PSB1c2Vy X2xvd21lbSkgewotICAgICAgICBwY21zLT5hYm92ZV80Z19tZW1fc2l6ZSA9IHJhbV9zaXplIC0g dXNlcl9sb3dtZW07Ci0gICAgICAgIHBjbXMtPmJlbG93XzRnX21lbV9zaXplID0gdXNlcl9sb3dt ZW07CisgICAgICAgIGFjcGlfY29uZi0+YWJvdmVfNGdfbWVtX3NpemUgPSByYW1fc2l6ZSAtIHVz ZXJfbG93bWVtOworICAgICAgICBhY3BpX2NvbmYtPmJlbG93XzRnX21lbV9zaXplID0gdXNlcl9s b3dtZW07CiAgICAgfSBlbHNlIHsKLSAgICAgICAgcGNtcy0+YWJvdmVfNGdfbWVtX3NpemUgPSAw OwotICAgICAgICBwY21zLT5iZWxvd180Z19tZW1fc2l6ZSA9IHJhbV9zaXplOworICAgICAgICBh Y3BpX2NvbmYtPmFib3ZlXzRnX21lbV9zaXplID0gMDsKKyAgICAgICAgYWNwaV9jb25mLT5iZWxv d180Z19tZW1fc2l6ZSA9IHJhbV9zaXplOwogICAgIH0KLSAgICBpZiAoIXBjbXMtPmFib3ZlXzRn X21lbV9zaXplKSB7CisgICAgaWYgKCFhY3BpX2NvbmYtPmFib3ZlXzRnX21lbV9zaXplKSB7CiAg ICAgICAgIGJsb2NrX2xlbiA9IHJhbV9zaXplOwogICAgIH0gZWxzZSB7CiAgICAgICAgIC8qCiAg ICAgICAgICAqIFhlbiBkb2VzIG5vdCBhbGxvY2F0ZSB0aGUgbWVtb3J5IGNvbnRpbnVvdXNseSwg aXQga2VlcHMgYQogICAgICAgICAgKiBob2xlIG9mIHRoZSBzaXplIGNvbXB1dGVkIGFib3ZlIG9y IHBhc3NlZCBpbi4KICAgICAgICAgICovCi0gICAgICAgIGJsb2NrX2xlbiA9ICgxVUxMIDw8IDMy KSArIHBjbXMtPmFib3ZlXzRnX21lbV9zaXplOworICAgICAgICBibG9ja19sZW4gPSAoMVVMTCA8 PCAzMikgKyBhY3BpX2NvbmYtPmFib3ZlXzRnX21lbV9zaXplOwogICAgIH0KICAgICBtZW1vcnlf cmVnaW9uX2luaXRfcmFtKCZyYW1fbWVtb3J5LCBOVUxMLCAieGVuLnJhbSIsIGJsb2NrX2xlbiwK ICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcl9mYXRhbCk7CkBAIC0yMzcsMTIgKzIz OCwxMiBAQCBzdGF0aWMgdm9pZCB4ZW5fcmFtX2luaXQoUENNYWNoaW5lU3RhdGUgKnBjbXMsCiAg ICAgICovCiAgICAgbWVtb3J5X3JlZ2lvbl9pbml0X2FsaWFzKCZyYW1fbG8sIE5VTEwsICJ4ZW4u cmFtLmxvIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJhbV9tZW1vcnksIDB4YzAw MDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBjbXMtPmJlbG93XzRnX21lbV9zaXpl IC0gMHhjMDAwMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjcGlfY29uZi0+YmVs b3dfNGdfbWVtX3NpemUgLSAweGMwMDAwKTsKICAgICBtZW1vcnlfcmVnaW9uX2FkZF9zdWJyZWdp b24oc3lzbWVtLCAweGMwMDAwLCAmcmFtX2xvKTsKLSAgICBpZiAocGNtcy0+YWJvdmVfNGdfbWVt X3NpemUgPiAwKSB7CisgICAgaWYgKGFjcGlfY29uZi0+YWJvdmVfNGdfbWVtX3NpemUgPiAwKSB7 CiAgICAgICAgIG1lbW9yeV9yZWdpb25faW5pdF9hbGlhcygmcmFtX2hpLCBOVUxMLCAieGVuLnJh bS5oaSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmFtX21lbW9yeSwgMHgx MDAwMDAwMDBVTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwY21zLT5hYm92 ZV80Z19tZW1fc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3BpX2Nv bmYtPmFib3ZlXzRnX21lbV9zaXplKTsKICAgICAgICAgbWVtb3J5X3JlZ2lvbl9hZGRfc3VicmVn aW9uKHN5c21lbSwgMHgxMDAwMDAwMDBVTEwsICZyYW1faGkpOwogICAgIH0KIH0KLS0gCjIuMTku MQoKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fClhlbi1k ZXZlbCBtYWlsaW5nIGxpc3QKWGVuLWRldmVsQGxpc3RzLnhlbnByb2plY3Qub3JnCmh0dHBzOi8v bGlzdHMueGVucHJvamVjdC5vcmcvbWFpbG1hbi9saXN0aW5mby94ZW4tZGV2ZWw= From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:46705) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gJTtl-00061O-0W for qemu-devel@nongnu.org; Sun, 04 Nov 2018 20:41:53 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gJTtf-0000vc-Vy for qemu-devel@nongnu.org; Sun, 04 Nov 2018 20:41:48 -0500 From: Samuel Ortiz Date: Mon, 5 Nov 2018 02:40:24 +0100 Message-Id: <20181105014047.26447-2-sameo@linux.intel.com> In-Reply-To: <20181105014047.26447-1-sameo@linux.intel.com> References: <20181105014047.26447-1-sameo@linux.intel.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Subject: [Qemu-devel] [PATCH v5 01/24] hw: i386: Decouple the ACPI build from the PC machine type List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Shannon Zhao , Stefano Stabellini , Anthony Perard , Richard Henderson , Marcel Apfelbaum , xen-devel@lists.xenproject.org, Paolo Bonzini , "Michael S. Tsirkin" , Igor Mammedov , qemu-arm@nongnu.org, Peter Maydell , Eduardo Habkost ACPI tables are platform and machine type and even architecture agnostic, and as such we want to provide an internal ACPI API that only depends on platform agnostic information. For the x86 architecture, in order to build ACPI tables independently from the PC or Q35 machine types, we are moving a few MachineState structure fields into a machine type agnostic structure called AcpiConfiguration. The structure fields we move are: HotplugHandler *acpi_dev AcpiNVDIMMState acpi_nvdimm_state; FWCfgState *fw_cfg ram_addr_t below_4g_mem_size, above_4g_mem_size bool apic_xrupt_override unsigned apic_id_limit uint64_t numa_nodes uint64_t numa_mem Signed-off-by: Samuel Ortiz --- hw/i386/acpi-build.h | 4 +- include/hw/acpi/acpi.h | 44 ++++++++++ include/hw/i386/pc.h | 19 ++--- hw/acpi/cpu_hotplug.c | 9 +- hw/arm/virt-acpi-build.c | 10 --- hw/i386/acpi-build.c | 136 ++++++++++++++---------------- hw/i386/pc.c | 176 ++++++++++++++++++++++++--------------- hw/i386/pc_piix.c | 21 ++--- hw/i386/pc_q35.c | 21 ++--- hw/i386/xen/xen-hvm.c | 19 +++-- 10 files changed, 257 insertions(+), 202 deletions(-) diff --git a/hw/i386/acpi-build.h b/hw/i386/acpi-build.h index 007332e51c..065a1d8250 100644 --- a/hw/i386/acpi-build.h +++ b/hw/i386/acpi-build.h @@ -2,6 +2,8 @@ #ifndef HW_I386_ACPI_BUILD_H #define HW_I386_ACPI_BUILD_H -void acpi_setup(void); +#include "hw/acpi/acpi.h" + +void acpi_setup(MachineState *machine, AcpiConfiguration *acpi_conf); #endif diff --git a/include/hw/acpi/acpi.h b/include/hw/acpi/acpi.h index c20ace0d0b..254c8d0cfc 100644 --- a/include/hw/acpi/acpi.h +++ b/include/hw/acpi/acpi.h @@ -24,6 +24,8 @@ #include "exec/memory.h" #include "hw/irq.h" #include "hw/acpi/acpi_dev_interface.h" +#include "hw/hotplug.h" +#include "hw/mem/nvdimm.h" /* * current device naming scheme supports up to 256 memory devices @@ -186,6 +188,48 @@ extern int acpi_enabled; extern char unsigned *acpi_tables; extern size_t acpi_tables_len; +typedef +struct AcpiBuildState { + /* Copy of table in RAM (for patching). */ + MemoryRegion *table_mr; + /* Is table patched? */ + bool patched; + void *rsdp; + MemoryRegion *rsdp_mr; + MemoryRegion *linker_mr; +} AcpiBuildState; + +typedef +struct AcpiConfiguration { + /* Machine class ACPI settings */ + int legacy_acpi_table_size; + bool rsdp_in_ram; + unsigned acpi_data_size; + + /* Machine state ACPI settings */ + HotplugHandler *acpi_dev; + AcpiNVDIMMState acpi_nvdimm_state; + + /* + * The fields below are machine settings that + * are not ACPI specific. However they are needed + * for building ACPI tables and as such should be + * carried through the ACPI configuration structure. + */ + bool legacy_cpu_hotplug; + bool linuxboot_dma_enabled; + FWCfgState *fw_cfg; + ram_addr_t below_4g_mem_size, above_4g_mem_size;; + uint64_t numa_nodes; + uint64_t *node_mem; + bool apic_xrupt_override; + unsigned apic_id_limit; + PCIHostState *pci_host; + + /* Build state */ + AcpiBuildState *build_state; +} AcpiConfiguration; + uint8_t *acpi_table_first(void); uint8_t *acpi_table_next(uint8_t *current); unsigned acpi_table_len(void *current); diff --git a/include/hw/i386/pc.h b/include/hw/i386/pc.h index 136fe497b6..fed136fcdd 100644 --- a/include/hw/i386/pc.h +++ b/include/hw/i386/pc.h @@ -12,6 +12,7 @@ #include "qemu/range.h" #include "qemu/bitmap.h" #include "sysemu/sysemu.h" +#include "hw/acpi/acpi.h" #include "hw/pci/pci.h" #include "hw/compat.h" #include "hw/mem/pc-dimm.h" @@ -35,10 +36,8 @@ struct PCMachineState { Notifier machine_done; /* Pointers to devices and objects: */ - HotplugHandler *acpi_dev; ISADevice *rtc; PCIBus *bus; - FWCfgState *fw_cfg; qemu_irq *gsi; /* Configuration options: */ @@ -46,28 +45,20 @@ struct PCMachineState { OnOffAuto vmport; OnOffAuto smm; - AcpiNVDIMMState acpi_nvdimm_state; - bool acpi_build_enabled; bool smbus; bool sata; bool pit; - /* RAM information (sizes, addresses, configuration): */ - ram_addr_t below_4g_mem_size, above_4g_mem_size; - - /* CPU and apic information: */ - bool apic_xrupt_override; - unsigned apic_id_limit; + /* CPU information */ uint16_t boot_cpus; - /* NUMA information: */ - uint64_t numa_nodes; - uint64_t *node_mem; - /* Address space used by IOAPIC device. All IOAPIC interrupts * will be translated to MSI messages in the address space. */ AddressSpace *ioapic_as; + + /* ACPI configuration */ + AcpiConfiguration acpi_configuration; }; #define PC_MACHINE_ACPI_DEVICE_PROP "acpi-device" diff --git a/hw/acpi/cpu_hotplug.c b/hw/acpi/cpu_hotplug.c index 5243918125..634dc3b846 100644 --- a/hw/acpi/cpu_hotplug.c +++ b/hw/acpi/cpu_hotplug.c @@ -237,9 +237,9 @@ void build_legacy_cpu_hotplug_aml(Aml *ctx, MachineState *machine, /* The current AML generator can cover the APIC ID range [0..255], * inclusive, for VCPU hotplug. */ QEMU_BUILD_BUG_ON(ACPI_CPU_HOTPLUG_ID_LIMIT > 256); - if (pcms->apic_id_limit > ACPI_CPU_HOTPLUG_ID_LIMIT) { + if (pcms->acpi_configuration.apic_id_limit > ACPI_CPU_HOTPLUG_ID_LIMIT) { error_report("max_cpus is too large. APIC ID of last CPU is %u", - pcms->apic_id_limit - 1); + pcms->acpi_configuration.apic_id_limit - 1); exit(1); } @@ -316,8 +316,9 @@ void build_legacy_cpu_hotplug_aml(Aml *ctx, MachineState *machine, * ith up to 255 elements. Windows guests up to win2k8 fail when * VarPackageOp is used. */ - pkg = pcms->apic_id_limit <= 255 ? aml_package(pcms->apic_id_limit) : - aml_varpackage(pcms->apic_id_limit); + pkg = pcms->acpi_configuration.apic_id_limit <= 255 ? + aml_package(pcms->acpi_configuration.apic_id_limit) : + aml_varpackage(pcms->acpi_configuration.apic_id_limit); for (i = 0, apic_idx = 0; i < apic_ids->len; i++) { int apic_id = apic_ids->cpus[i].arch_id; diff --git a/hw/arm/virt-acpi-build.c b/hw/arm/virt-acpi-build.c index 5785fb697c..f28a2faa53 100644 --- a/hw/arm/virt-acpi-build.c +++ b/hw/arm/virt-acpi-build.c @@ -790,16 +790,6 @@ build_dsdt(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms) free_aml_allocator(); } -typedef -struct AcpiBuildState { - /* Copy of table in RAM (for patching). */ - MemoryRegion *table_mr; - MemoryRegion *rsdp_mr; - MemoryRegion *linker_mr; - /* Is table patched? */ - bool patched; -} AcpiBuildState; - static void virt_acpi_build(VirtMachineState *vms, AcpiBuildTables *tables) { diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c index 1599caa7c5..d0362e1382 100644 --- a/hw/i386/acpi-build.c +++ b/hw/i386/acpi-build.c @@ -338,13 +338,14 @@ void pc_madt_cpu_entry(AcpiDeviceIf *adev, int uid, } static void -build_madt(GArray *table_data, BIOSLinker *linker, PCMachineState *pcms) +build_madt(GArray *table_data, BIOSLinker *linker, + MachineState *ms, AcpiConfiguration *acpi_conf) { - MachineClass *mc = MACHINE_GET_CLASS(pcms); - const CPUArchIdList *apic_ids = mc->possible_cpu_arch_ids(MACHINE(pcms)); + MachineClass *mc = MACHINE_GET_CLASS(ms); + const CPUArchIdList *apic_ids = mc->possible_cpu_arch_ids(ms); int madt_start = table_data->len; - AcpiDeviceIfClass *adevc = ACPI_DEVICE_IF_GET_CLASS(pcms->acpi_dev); - AcpiDeviceIf *adev = ACPI_DEVICE_IF(pcms->acpi_dev); + AcpiDeviceIfClass *adevc = ACPI_DEVICE_IF_GET_CLASS(acpi_conf->acpi_dev); + AcpiDeviceIf *adev = ACPI_DEVICE_IF(acpi_conf->acpi_dev); bool x2apic_mode = false; AcpiMultipleApicTable *madt; @@ -370,7 +371,7 @@ build_madt(GArray *table_data, BIOSLinker *linker, PCMachineState *pcms) io_apic->address = cpu_to_le32(IO_APIC_DEFAULT_ADDRESS); io_apic->interrupt = cpu_to_le32(0); - if (pcms->apic_xrupt_override) { + if (acpi_conf->apic_xrupt_override) { intsrcovr = acpi_data_push(table_data, sizeof *intsrcovr); intsrcovr->type = ACPI_APIC_XRUPT_OVERRIDE; intsrcovr->length = sizeof(*intsrcovr); @@ -1786,13 +1787,12 @@ static Aml *build_q35_osc_method(void) static void build_dsdt(GArray *table_data, BIOSLinker *linker, AcpiPmInfo *pm, AcpiMiscInfo *misc, - Range *pci_hole, Range *pci_hole64, MachineState *machine) + Range *pci_hole, Range *pci_hole64, + MachineState *machine, AcpiConfiguration *acpi_conf) { CrsRangeEntry *entry; Aml *dsdt, *sb_scope, *scope, *dev, *method, *field, *pkg, *crs; CrsRangeSet crs_range_set; - PCMachineState *pcms = PC_MACHINE(machine); - PCMachineClass *pcmc = PC_MACHINE_GET_CLASS(machine); uint32_t nr_mem = machine->ram_slots; int root_bus_limit = 0xFF; PCIBus *bus = NULL; @@ -1836,7 +1836,7 @@ build_dsdt(GArray *table_data, BIOSLinker *linker, build_q35_pci0_int(dsdt); } - if (pcmc->legacy_cpu_hotplug) { + if (acpi_conf->legacy_cpu_hotplug) { build_legacy_cpu_hotplug_aml(dsdt, machine, pm->cpu_hp_io_base); } else { CPUHotplugFeatures opts = { @@ -1860,7 +1860,7 @@ build_dsdt(GArray *table_data, BIOSLinker *linker, aml_append(scope, method); } - if (pcms->acpi_nvdimm_state.is_enabled) { + if (acpi_conf->acpi_nvdimm_state.is_enabled) { method = aml_method("_E04", 0, AML_NOTSERIALIZED); aml_append(method, aml_notify(aml_name("\\_SB.NVDR"), aml_int(0x80))); @@ -2041,7 +2041,7 @@ build_dsdt(GArray *table_data, BIOSLinker *linker, * with half of the 16-bit control register. Hence, the total size * of the i/o region used is FW_CFG_CTL_SIZE; when using DMA, the * DMA control register is located at FW_CFG_DMA_IO_BASE + 4 */ - uint8_t io_size = object_property_get_bool(OBJECT(pcms->fw_cfg), + uint8_t io_size = object_property_get_bool(OBJECT(acpi_conf->fw_cfg), "dma_enabled", NULL) ? ROUND_UP(FW_CFG_CTL_SIZE, 4) + sizeof(dma_addr_t) : FW_CFG_CTL_SIZE; @@ -2252,7 +2252,8 @@ build_tpm2(GArray *table_data, BIOSLinker *linker, GArray *tcpalog) #define HOLE_640K_END (1 * MiB) static void -build_srat(GArray *table_data, BIOSLinker *linker, MachineState *machine) +build_srat(GArray *table_data, BIOSLinker *linker, + MachineState *machine, AcpiConfiguration *acpi_conf) { AcpiSystemResourceAffinityTable *srat; AcpiSratMemoryAffinity *numamem; @@ -2262,9 +2263,8 @@ build_srat(GArray *table_data, BIOSLinker *linker, MachineState *machine) uint64_t mem_len, mem_base, next_base; MachineClass *mc = MACHINE_GET_CLASS(machine); const CPUArchIdList *apic_ids = mc->possible_cpu_arch_ids(machine); - PCMachineState *pcms = PC_MACHINE(machine); ram_addr_t hotplugabble_address_space_size = - object_property_get_int(OBJECT(pcms), PC_MACHINE_DEVMEM_REGION_SIZE, + object_property_get_int(OBJECT(machine), PC_MACHINE_DEVMEM_REGION_SIZE, NULL); srat_start = table_data->len; @@ -2306,9 +2306,9 @@ build_srat(GArray *table_data, BIOSLinker *linker, MachineState *machine) next_base = 0; numa_start = table_data->len; - for (i = 1; i < pcms->numa_nodes + 1; ++i) { + for (i = 1; i < acpi_conf->numa_nodes + 1; ++i) { mem_base = next_base; - mem_len = pcms->node_mem[i - 1]; + mem_len = acpi_conf->node_mem[i - 1]; next_base = mem_base + mem_len; /* Cut out the 640K hole */ @@ -2331,16 +2331,16 @@ build_srat(GArray *table_data, BIOSLinker *linker, MachineState *machine) } /* Cut out the ACPI_PCI hole */ - if (mem_base <= pcms->below_4g_mem_size && - next_base > pcms->below_4g_mem_size) { - mem_len -= next_base - pcms->below_4g_mem_size; + if (mem_base <= acpi_conf->below_4g_mem_size && + next_base > acpi_conf->below_4g_mem_size) { + mem_len -= next_base - acpi_conf->below_4g_mem_size; if (mem_len > 0) { numamem = acpi_data_push(table_data, sizeof *numamem); build_srat_memory(numamem, mem_base, mem_len, i - 1, MEM_AFFINITY_ENABLED); } mem_base = 1ULL << 32; - mem_len = next_base - pcms->below_4g_mem_size; + mem_len = next_base - acpi_conf->below_4g_mem_size; next_base = mem_base + mem_len; } @@ -2351,7 +2351,7 @@ build_srat(GArray *table_data, BIOSLinker *linker, MachineState *machine) } } slots = (table_data->len - numa_start) / sizeof *numamem; - for (; slots < pcms->numa_nodes + 2; slots++) { + for (; slots < acpi_conf->numa_nodes + 2; slots++) { numamem = acpi_data_push(table_data, sizeof *numamem); build_srat_memory(numamem, 0, 0, 0, MEM_AFFINITY_NOFLAGS); } @@ -2367,7 +2367,8 @@ build_srat(GArray *table_data, BIOSLinker *linker, MachineState *machine) if (hotplugabble_address_space_size) { numamem = acpi_data_push(table_data, sizeof *numamem); build_srat_memory(numamem, machine->device_memory->base, - hotplugabble_address_space_size, pcms->numa_nodes - 1, + hotplugabble_address_space_size, + acpi_conf->numa_nodes - 1, MEM_AFFINITY_HOTPLUGGABLE | MEM_AFFINITY_ENABLED); } @@ -2546,17 +2547,6 @@ build_rsdp(GArray *rsdp_table, BIOSLinker *linker, unsigned rsdt_tbl_offset) return rsdp_table; } -typedef -struct AcpiBuildState { - /* Copy of table in RAM (for patching). */ - MemoryRegion *table_mr; - /* Is table patched? */ - uint8_t patched; - void *rsdp; - MemoryRegion *rsdp_mr; - MemoryRegion *linker_mr; -} AcpiBuildState; - static bool acpi_get_mcfg(AcpiMcfgInfo *mcfg) { Object *pci_host; @@ -2580,10 +2570,9 @@ static bool acpi_get_mcfg(AcpiMcfgInfo *mcfg) } static -void acpi_build(AcpiBuildTables *tables, MachineState *machine) +void acpi_build(AcpiBuildTables *tables, + MachineState *machine, AcpiConfiguration *acpi_conf) { - PCMachineState *pcms = PC_MACHINE(machine); - PCMachineClass *pcmc = PC_MACHINE_GET_CLASS(pcms); GArray *table_offsets; unsigned facs, dsdt, rsdt, fadt; AcpiPmInfo pm; @@ -2621,7 +2610,7 @@ void acpi_build(AcpiBuildTables *tables, MachineState *machine) /* DSDT is pointed to by FADT */ dsdt = tables_blob->len; build_dsdt(tables_blob, tables->linker, &pm, &misc, - &pci_hole, &pci_hole64, machine); + &pci_hole, &pci_hole64, machine, acpi_conf); /* Count the size of the DSDT and SSDT, we will need it for legacy * sizing of ACPI tables. @@ -2639,7 +2628,7 @@ void acpi_build(AcpiBuildTables *tables, MachineState *machine) aml_len += tables_blob->len - fadt; acpi_add_table(table_offsets, tables_blob); - build_madt(tables_blob, tables->linker, pcms); + build_madt(tables_blob, tables->linker, machine, acpi_conf); vmgenid_dev = find_vmgenid_dev(); if (vmgenid_dev) { @@ -2661,9 +2650,9 @@ void acpi_build(AcpiBuildTables *tables, MachineState *machine) build_tpm2(tables_blob, tables->linker, tables->tcpalog); } } - if (pcms->numa_nodes) { + if (acpi_conf->numa_nodes) { acpi_add_table(table_offsets, tables_blob); - build_srat(tables_blob, tables->linker, machine); + build_srat(tables_blob, tables->linker, machine, acpi_conf); if (have_numa_distance) { acpi_add_table(table_offsets, tables_blob); build_slit(tables_blob, tables->linker); @@ -2683,9 +2672,9 @@ void acpi_build(AcpiBuildTables *tables, MachineState *machine) build_dmar_q35(tables_blob, tables->linker); } } - if (pcms->acpi_nvdimm_state.is_enabled) { + if (acpi_conf->acpi_nvdimm_state.is_enabled) { nvdimm_build_acpi(table_offsets, tables_blob, tables->linker, - &pcms->acpi_nvdimm_state, machine->ram_slots); + &acpi_conf->acpi_nvdimm_state, machine->ram_slots); } /* Add tables supplied by user (if any) */ @@ -2721,13 +2710,13 @@ void acpi_build(AcpiBuildTables *tables, MachineState *machine) * * All this is for PIIX4, since QEMU 2.0 didn't support Q35 migration. */ - if (pcmc->legacy_acpi_table_size) { + if (acpi_conf->legacy_acpi_table_size) { /* Subtracting aml_len gives the size of fixed tables. Then add the * size of the PIIX4 DSDT/SSDT in QEMU 2.0. */ int legacy_aml_len = - pcmc->legacy_acpi_table_size + - ACPI_BUILD_LEGACY_CPU_AML_SIZE * pcms->apic_id_limit; + acpi_conf->legacy_acpi_table_size + + ACPI_BUILD_LEGACY_CPU_AML_SIZE * acpi_conf->apic_id_limit; int legacy_table_size = ROUND_UP(tables_blob->len - aml_len + legacy_aml_len, ACPI_BUILD_ALIGN_SIZE); @@ -2772,9 +2761,17 @@ static void acpi_ram_update(MemoryRegion *mr, GArray *data) static void acpi_build_update(void *build_opaque) { - AcpiBuildState *build_state = build_opaque; + AcpiConfiguration *acpi_conf = build_opaque; + AcpiBuildState *build_state; AcpiBuildTables tables; + /* No ACPI configuration? Nothing to do. */ + if (!acpi_conf) { + return; + } + + build_state = acpi_conf->build_state; + /* No state to update or already patched? Nothing to do. */ if (!build_state || build_state->patched) { return; @@ -2783,7 +2780,7 @@ static void acpi_build_update(void *build_opaque) acpi_build_tables_init(&tables); - acpi_build(&tables, MACHINE(qdev_get_machine())); + acpi_build(&tables, MACHINE(qdev_get_machine()), acpi_conf); acpi_ram_update(build_state->table_mr, tables.table_data); @@ -2803,12 +2800,12 @@ static void acpi_build_reset(void *build_opaque) build_state->patched = 0; } -static MemoryRegion *acpi_add_rom_blob(AcpiBuildState *build_state, +static MemoryRegion *acpi_add_rom_blob(AcpiConfiguration *acpi_conf, GArray *blob, const char *name, uint64_t max_size) { return rom_add_blob(name, blob->data, acpi_data_len(blob), max_size, -1, - name, acpi_build_update, build_state, NULL, true); + name, acpi_build_update, acpi_conf, NULL, true); } static const VMStateDescription vmstate_acpi_build = { @@ -2816,59 +2813,48 @@ static const VMStateDescription vmstate_acpi_build = { .version_id = 1, .minimum_version_id = 1, .fields = (VMStateField[]) { - VMSTATE_UINT8(patched, AcpiBuildState), + VMSTATE_BOOL(patched, AcpiBuildState), VMSTATE_END_OF_LIST() }, }; -void acpi_setup(void) +void acpi_setup(MachineState *machine, AcpiConfiguration *acpi_conf) { - PCMachineState *pcms = PC_MACHINE(qdev_get_machine()); - PCMachineClass *pcmc = PC_MACHINE_GET_CLASS(pcms); AcpiBuildTables tables; AcpiBuildState *build_state; Object *vmgenid_dev; - if (!pcms->fw_cfg) { - ACPI_BUILD_DPRINTF("No fw cfg. Bailing out.\n"); - return; - } - - if (!pcms->acpi_build_enabled) { - ACPI_BUILD_DPRINTF("ACPI build disabled. Bailing out.\n"); - return; - } - - if (!acpi_enabled) { - ACPI_BUILD_DPRINTF("ACPI disabled. Bailing out.\n"); + if (!acpi_conf) { + ACPI_BUILD_DPRINTF("No ACPI config. Bailing out.\n"); return; } build_state = g_malloc0(sizeof *build_state); + acpi_conf->build_state = build_state; acpi_build_tables_init(&tables); - acpi_build(&tables, MACHINE(pcms)); + acpi_build(&tables, machine, acpi_conf); /* Now expose it all to Guest */ - build_state->table_mr = acpi_add_rom_blob(build_state, tables.table_data, + build_state->table_mr = acpi_add_rom_blob(acpi_conf, tables.table_data, ACPI_BUILD_TABLE_FILE, ACPI_BUILD_TABLE_MAX_SIZE); assert(build_state->table_mr != NULL); build_state->linker_mr = - acpi_add_rom_blob(build_state, tables.linker->cmd_blob, + acpi_add_rom_blob(acpi_conf, tables.linker->cmd_blob, "etc/table-loader", 0); - fw_cfg_add_file(pcms->fw_cfg, ACPI_BUILD_TPMLOG_FILE, + fw_cfg_add_file(acpi_conf->fw_cfg, ACPI_BUILD_TPMLOG_FILE, tables.tcpalog->data, acpi_data_len(tables.tcpalog)); vmgenid_dev = find_vmgenid_dev(); if (vmgenid_dev) { - vmgenid_add_fw_cfg(VMGENID(vmgenid_dev), pcms->fw_cfg, + vmgenid_add_fw_cfg(VMGENID(vmgenid_dev), acpi_conf->fw_cfg, tables.vmgenid); } - if (!pcmc->rsdp_in_ram) { + if (!acpi_conf->rsdp_in_ram) { /* * Keep for compatibility with old machine types. * Though RSDP is small, its contents isn't immutable, so @@ -2877,13 +2863,13 @@ void acpi_setup(void) uint32_t rsdp_size = acpi_data_len(tables.rsdp); build_state->rsdp = g_memdup(tables.rsdp->data, rsdp_size); - fw_cfg_add_file_callback(pcms->fw_cfg, ACPI_BUILD_RSDP_FILE, - acpi_build_update, NULL, build_state, + fw_cfg_add_file_callback(acpi_conf->fw_cfg, ACPI_BUILD_RSDP_FILE, + acpi_build_update, NULL, acpi_conf, build_state->rsdp, rsdp_size, true); build_state->rsdp_mr = NULL; } else { build_state->rsdp = NULL; - build_state->rsdp_mr = acpi_add_rom_blob(build_state, tables.rsdp, + build_state->rsdp_mr = acpi_add_rom_blob(acpi_conf, tables.rsdp, ACPI_BUILD_RSDP_FILE, 0); } diff --git a/hw/i386/pc.c b/hw/i386/pc.c index f095725dba..090f969933 100644 --- a/hw/i386/pc.c +++ b/hw/i386/pc.c @@ -444,17 +444,18 @@ void pc_cmos_init(PCMachineState *pcms, { int val; static pc_cmos_init_late_arg arg; + AcpiConfiguration *acpi_conf = &pcms->acpi_configuration; /* various important CMOS locations needed by PC/Bochs bios */ /* memory size */ /* base memory (first MiB) */ - val = MIN(pcms->below_4g_mem_size / KiB, 640); + val = MIN(acpi_conf->below_4g_mem_size / KiB, 640); rtc_set_memory(s, 0x15, val); rtc_set_memory(s, 0x16, val >> 8); /* extended memory (next 64MiB) */ - if (pcms->below_4g_mem_size > 1 * MiB) { - val = (pcms->below_4g_mem_size - 1 * MiB) / KiB; + if (acpi_conf->below_4g_mem_size > 1 * MiB) { + val = (acpi_conf->below_4g_mem_size - 1 * MiB) / KiB; } else { val = 0; } @@ -465,8 +466,8 @@ void pc_cmos_init(PCMachineState *pcms, rtc_set_memory(s, 0x30, val); rtc_set_memory(s, 0x31, val >> 8); /* memory between 16MiB and 4GiB */ - if (pcms->below_4g_mem_size > 16 * MiB) { - val = (pcms->below_4g_mem_size - 16 * MiB) / (64 * KiB); + if (acpi_conf->below_4g_mem_size > 16 * MiB) { + val = (acpi_conf->below_4g_mem_size - 16 * MiB) / (64 * KiB); } else { val = 0; } @@ -475,7 +476,7 @@ void pc_cmos_init(PCMachineState *pcms, rtc_set_memory(s, 0x34, val); rtc_set_memory(s, 0x35, val >> 8); /* memory above 4GiB */ - val = pcms->above_4g_mem_size / 65536; + val = acpi_conf->above_4g_mem_size / 65536; rtc_set_memory(s, 0x5b, val); rtc_set_memory(s, 0x5c, val >> 8); rtc_set_memory(s, 0x5d, val >> 16); @@ -714,13 +715,14 @@ static void pc_build_smbios(PCMachineState *pcms) unsigned i, array_count; MachineState *ms = MACHINE(pcms); X86CPU *cpu = X86_CPU(ms->possible_cpus->cpus[0].cpu); + AcpiConfiguration *acpi_conf = &pcms->acpi_configuration; /* tell smbios about cpuid version and features */ smbios_set_cpuid(cpu->env.cpuid_version, cpu->env.features[FEAT_1_EDX]); smbios_tables = smbios_get_table_legacy(&smbios_tables_len); if (smbios_tables) { - fw_cfg_add_bytes(pcms->fw_cfg, FW_CFG_SMBIOS_ENTRIES, + fw_cfg_add_bytes(acpi_conf->fw_cfg, FW_CFG_SMBIOS_ENTRIES, smbios_tables, smbios_tables_len); } @@ -741,9 +743,9 @@ static void pc_build_smbios(PCMachineState *pcms) g_free(mem_array); if (smbios_anchor) { - fw_cfg_add_file(pcms->fw_cfg, "etc/smbios/smbios-tables", + fw_cfg_add_file(acpi_conf->fw_cfg, "etc/smbios/smbios-tables", smbios_tables, smbios_tables_len); - fw_cfg_add_file(pcms->fw_cfg, "etc/smbios/smbios-anchor", + fw_cfg_add_file(acpi_conf->fw_cfg, "etc/smbios/smbios-anchor", smbios_anchor, smbios_anchor_len); } } @@ -755,6 +757,7 @@ static FWCfgState *bochs_bios_init(AddressSpace *as, PCMachineState *pcms) int i; const CPUArchIdList *cpus; MachineClass *mc = MACHINE_GET_CLASS(pcms); + AcpiConfiguration *acpi_conf = &pcms->acpi_configuration; fw_cfg = fw_cfg_init_io_dma(FW_CFG_IO_BASE, FW_CFG_IO_BASE + 4, as); fw_cfg_add_i16(fw_cfg, FW_CFG_NB_CPUS, pcms->boot_cpus); @@ -771,7 +774,7 @@ static FWCfgState *bochs_bios_init(AddressSpace *as, PCMachineState *pcms) * So for compatibility reasons with old BIOSes we are stuck with * "etc/max-cpus" actually being apic_id_limit */ - fw_cfg_add_i16(fw_cfg, FW_CFG_MAX_CPUS, (uint16_t)pcms->apic_id_limit); + fw_cfg_add_i16(fw_cfg, FW_CFG_MAX_CPUS, (uint16_t)acpi_conf->apic_id_limit); fw_cfg_add_i64(fw_cfg, FW_CFG_RAM_SIZE, (uint64_t)ram_size); fw_cfg_add_bytes(fw_cfg, FW_CFG_ACPI_TABLES, acpi_tables, acpi_tables_len); @@ -787,20 +790,21 @@ static FWCfgState *bochs_bios_init(AddressSpace *as, PCMachineState *pcms) * of nodes, one word for each VCPU->node and one word for each node to * hold the amount of memory. */ - numa_fw_cfg = g_new0(uint64_t, 1 + pcms->apic_id_limit + nb_numa_nodes); + numa_fw_cfg = g_new0(uint64_t, + 1 + acpi_conf->apic_id_limit + nb_numa_nodes); numa_fw_cfg[0] = cpu_to_le64(nb_numa_nodes); cpus = mc->possible_cpu_arch_ids(MACHINE(pcms)); for (i = 0; i < cpus->len; i++) { unsigned int apic_id = cpus->cpus[i].arch_id; - assert(apic_id < pcms->apic_id_limit); + assert(apic_id < acpi_conf->apic_id_limit); numa_fw_cfg[apic_id + 1] = cpu_to_le64(cpus->cpus[i].props.node_id); } for (i = 0; i < nb_numa_nodes; i++) { - numa_fw_cfg[pcms->apic_id_limit + 1 + i] = + numa_fw_cfg[acpi_conf->apic_id_limit + 1 + i] = cpu_to_le64(numa_info[i].node_mem); } fw_cfg_add_bytes(fw_cfg, FW_CFG_NUMA, numa_fw_cfg, - (1 + pcms->apic_id_limit + nb_numa_nodes) * + (1 + acpi_conf->apic_id_limit + nb_numa_nodes) * sizeof(*numa_fw_cfg)); return fw_cfg; @@ -848,6 +852,7 @@ static void load_linux(PCMachineState *pcms, char *vmode; MachineState *machine = MACHINE(pcms); PCMachineClass *pcmc = PC_MACHINE_GET_CLASS(pcms); + AcpiConfiguration *acpi_conf = &pcms->acpi_configuration; struct setup_data *setup_data; const char *kernel_filename = machine->kernel_filename; const char *initrd_filename = machine->initrd_filename; @@ -917,8 +922,8 @@ static void load_linux(PCMachineState *pcms, initrd_max = 0x37ffffff; } - if (initrd_max >= pcms->below_4g_mem_size - pcmc->acpi_data_size) { - initrd_max = pcms->below_4g_mem_size - pcmc->acpi_data_size - 1; + if (initrd_max >= acpi_conf->below_4g_mem_size - pcmc->acpi_data_size) { + initrd_max = acpi_conf->below_4g_mem_size - pcmc->acpi_data_size - 1; } fw_cfg_add_i32(fw_cfg, FW_CFG_CMDLINE_ADDR, cmdline_addr); @@ -1154,7 +1159,8 @@ void pc_cpus_init(PCMachineState *pcms) * * This is used for FW_CFG_MAX_CPUS. See comments on bochs_bios_init(). */ - pcms->apic_id_limit = x86_cpu_apic_id_from_index(max_cpus - 1) + 1; + pcms->acpi_configuration.apic_id_limit = + x86_cpu_apic_id_from_index(max_cpus - 1) + 1; possible_cpus = mc->possible_cpu_arch_ids(ms); for (i = 0; i < smp_cpus; i++) { pc_new_cpu(possible_cpus->cpus[i].type, possible_cpus->cpus[i].arch_id, @@ -1188,7 +1194,8 @@ static void pc_build_feature_control_file(PCMachineState *pcms) val = g_malloc(sizeof(*val)); *val = cpu_to_le64(feature_control_bits | FEATURE_CONTROL_LOCKED); - fw_cfg_add_file(pcms->fw_cfg, "etc/msr_feature_control", val, sizeof(*val)); + fw_cfg_add_file(pcms->acpi_configuration.fw_cfg, + "etc/msr_feature_control", val, sizeof(*val)); } static void rtc_set_cpus_count(ISADevice *rtc, uint16_t cpus_count) @@ -1204,11 +1211,26 @@ static void rtc_set_cpus_count(ISADevice *rtc, uint16_t cpus_count) } } +static void acpi_conf_pc_init(PCMachineState *pcms) +{ + PCMachineClass *pcmc = PC_MACHINE_GET_CLASS(pcms); + AcpiConfiguration *acpi_conf = &pcms->acpi_configuration; + + /* Machine class settings */ + acpi_conf->legacy_acpi_table_size = pcmc->legacy_acpi_table_size; + acpi_conf->legacy_cpu_hotplug = pcmc->legacy_cpu_hotplug; + acpi_conf->rsdp_in_ram = pcmc->rsdp_in_ram; + + /* ACPI build state */ + acpi_conf->build_state = NULL; +} + static void pc_machine_done(Notifier *notifier, void *data) { PCMachineState *pcms = container_of(notifier, PCMachineState, machine_done); + AcpiConfiguration *acpi_conf = &pcms->acpi_configuration; PCIBus *bus = pcms->bus; /* set the number of CPUs */ @@ -1223,23 +1245,27 @@ void pc_machine_done(Notifier *notifier, void *data) extra_hosts++; } } - if (extra_hosts && pcms->fw_cfg) { + if (extra_hosts && acpi_conf->fw_cfg) { uint64_t *val = g_malloc(sizeof(*val)); *val = cpu_to_le64(extra_hosts); - fw_cfg_add_file(pcms->fw_cfg, + fw_cfg_add_file(acpi_conf->fw_cfg, "etc/extra-pci-roots", val, sizeof(*val)); } } - acpi_setup(); - if (pcms->fw_cfg) { + if (pcms->acpi_build_enabled) { + acpi_conf_pc_init(pcms); + acpi_setup(MACHINE(pcms), acpi_conf); + } + + if (acpi_conf->fw_cfg) { pc_build_smbios(pcms); pc_build_feature_control_file(pcms); /* update FW_CFG_NB_CPUS to account for -device added CPUs */ - fw_cfg_modify_i16(pcms->fw_cfg, FW_CFG_NB_CPUS, pcms->boot_cpus); + fw_cfg_modify_i16(acpi_conf->fw_cfg, FW_CFG_NB_CPUS, pcms->boot_cpus); } - if (pcms->apic_id_limit > 255 && !xen_enabled()) { + if (acpi_conf->apic_id_limit > 255 && !xen_enabled()) { IntelIOMMUState *iommu = INTEL_IOMMU_DEVICE(x86_iommu_get_default()); if (!iommu || !iommu->x86_iommu.intr_supported || @@ -1256,13 +1282,14 @@ void pc_machine_done(Notifier *notifier, void *data) void pc_guest_info_init(PCMachineState *pcms) { int i; + AcpiConfiguration *acpi_conf = &pcms->acpi_configuration; - pcms->apic_xrupt_override = kvm_allows_irq0_override(); - pcms->numa_nodes = nb_numa_nodes; - pcms->node_mem = g_malloc0(pcms->numa_nodes * - sizeof *pcms->node_mem); + acpi_conf->apic_xrupt_override = kvm_allows_irq0_override(); + acpi_conf->numa_nodes = nb_numa_nodes; + acpi_conf->node_mem = g_malloc0(acpi_conf->numa_nodes * + sizeof *acpi_conf->node_mem); for (i = 0; i < nb_numa_nodes; i++) { - pcms->node_mem[i] = numa_info[i].node_mem; + acpi_conf->node_mem[i] = numa_info[i].node_mem; } pcms->machine_done.notify = pc_machine_done; @@ -1323,7 +1350,7 @@ void xen_load_linux(PCMachineState *pcms) !strcmp(option_rom[i].name, "multiboot.bin")); rom_add_option(option_rom[i].name, option_rom[i].bootindex); } - pcms->fw_cfg = fw_cfg; + pcms->acpi_configuration.fw_cfg = fw_cfg; } void pc_memory_init(PCMachineState *pcms, @@ -1337,9 +1364,10 @@ void pc_memory_init(PCMachineState *pcms, FWCfgState *fw_cfg; MachineState *machine = MACHINE(pcms); PCMachineClass *pcmc = PC_MACHINE_GET_CLASS(pcms); + AcpiConfiguration *acpi_conf = &pcms->acpi_configuration; - assert(machine->ram_size == pcms->below_4g_mem_size + - pcms->above_4g_mem_size); + assert(machine->ram_size == acpi_conf->below_4g_mem_size + + acpi_conf->above_4g_mem_size); linux_boot = (machine->kernel_filename != NULL); @@ -1353,17 +1381,17 @@ void pc_memory_init(PCMachineState *pcms, *ram_memory = ram; ram_below_4g = g_malloc(sizeof(*ram_below_4g)); memory_region_init_alias(ram_below_4g, NULL, "ram-below-4g", ram, - 0, pcms->below_4g_mem_size); + 0, acpi_conf->below_4g_mem_size); memory_region_add_subregion(system_memory, 0, ram_below_4g); - e820_add_entry(0, pcms->below_4g_mem_size, E820_RAM); - if (pcms->above_4g_mem_size > 0) { + e820_add_entry(0, acpi_conf->below_4g_mem_size, E820_RAM); + if (acpi_conf->above_4g_mem_size > 0) { ram_above_4g = g_malloc(sizeof(*ram_above_4g)); memory_region_init_alias(ram_above_4g, NULL, "ram-above-4g", ram, - pcms->below_4g_mem_size, - pcms->above_4g_mem_size); + acpi_conf->below_4g_mem_size, + acpi_conf->above_4g_mem_size); memory_region_add_subregion(system_memory, 0x100000000ULL, ram_above_4g); - e820_add_entry(0x100000000ULL, pcms->above_4g_mem_size, E820_RAM); + e820_add_entry(0x100000000ULL, acpi_conf->above_4g_mem_size, E820_RAM); } if (!pcmc->has_reserved_memory && @@ -1398,7 +1426,7 @@ void pc_memory_init(PCMachineState *pcms, } machine->device_memory->base = - ROUND_UP(0x100000000ULL + pcms->above_4g_mem_size, 1 * GiB); + ROUND_UP(0x100000000ULL + acpi_conf->above_4g_mem_size, 1 * GiB); if (pcmc->enforce_aligned_dimm) { /* size device region assuming 1G page max alignment per slot */ @@ -1455,7 +1483,7 @@ void pc_memory_init(PCMachineState *pcms, for (i = 0; i < nb_option_roms; i++) { rom_add_option(option_rom[i].name, option_rom[i].bootindex); } - pcms->fw_cfg = fw_cfg; + acpi_conf->fw_cfg = fw_cfg; /* Init default IOAPIC address space */ pcms->ioapic_as = &address_space_memory; @@ -1478,7 +1506,8 @@ uint64_t pc_pci_hole64_start(void) hole64_start += memory_region_size(&ms->device_memory->mr); } } else { - hole64_start = 0x100000000ULL + pcms->above_4g_mem_size; + hole64_start = + 0x100000000ULL + pcms->acpi_configuration.above_4g_mem_size; } return ROUND_UP(hole64_start, 1 * GiB); @@ -1685,21 +1714,22 @@ static void pc_memory_pre_plug(HotplugHandler *hotplug_dev, DeviceState *dev, { const PCMachineState *pcms = PC_MACHINE(hotplug_dev); const PCMachineClass *pcmc = PC_MACHINE_GET_CLASS(pcms); + const AcpiConfiguration *acpi_conf = &pcms->acpi_configuration; const bool is_nvdimm = object_dynamic_cast(OBJECT(dev), TYPE_NVDIMM); const uint64_t legacy_align = TARGET_PAGE_SIZE; /* * When -no-acpi is used with Q35 machine type, no ACPI is built, - * but pcms->acpi_dev is still created. Check !acpi_enabled in + * but acpi_dev is still created. Check !acpi_enabled in * addition to cover this case. */ - if (!pcms->acpi_dev || !acpi_enabled) { + if (!acpi_conf->acpi_dev || !acpi_enabled) { error_setg(errp, "memory hotplug is not enabled: missing acpi device or acpi disabled"); return; } - if (is_nvdimm && !pcms->acpi_nvdimm_state.is_enabled) { + if (is_nvdimm && !acpi_conf->acpi_nvdimm_state.is_enabled) { error_setg(errp, "nvdimm is not enabled: missing 'nvdimm' in '-M'"); return; } @@ -1715,6 +1745,7 @@ static void pc_memory_plug(HotplugHandler *hotplug_dev, Error *local_err = NULL; PCMachineState *pcms = PC_MACHINE(hotplug_dev); bool is_nvdimm = object_dynamic_cast(OBJECT(dev), TYPE_NVDIMM); + AcpiConfiguration *acpi_conf = &pcms->acpi_configuration; pc_dimm_plug(PC_DIMM(dev), MACHINE(pcms), &local_err); if (local_err) { @@ -1722,11 +1753,11 @@ static void pc_memory_plug(HotplugHandler *hotplug_dev, } if (is_nvdimm) { - nvdimm_plug(&pcms->acpi_nvdimm_state); + nvdimm_plug(&acpi_conf->acpi_nvdimm_state); } - hhc = HOTPLUG_HANDLER_GET_CLASS(pcms->acpi_dev); - hhc->plug(HOTPLUG_HANDLER(pcms->acpi_dev), dev, &error_abort); + hhc = HOTPLUG_HANDLER_GET_CLASS(acpi_conf->acpi_dev); + hhc->plug(HOTPLUG_HANDLER(acpi_conf->acpi_dev), dev, &error_abort); out: error_propagate(errp, local_err); } @@ -1737,13 +1768,14 @@ static void pc_memory_unplug_request(HotplugHandler *hotplug_dev, HotplugHandlerClass *hhc; Error *local_err = NULL; PCMachineState *pcms = PC_MACHINE(hotplug_dev); + AcpiConfiguration *acpi_conf = &pcms->acpi_configuration; /* * When -no-acpi is used with Q35 machine type, no ACPI is built, - * but pcms->acpi_dev is still created. Check !acpi_enabled in + * but acpi_dev is still created. Check !acpi_enabled in * addition to cover this case. */ - if (!pcms->acpi_dev || !acpi_enabled) { + if (!acpi_conf->acpi_dev || !acpi_enabled) { error_setg(&local_err, "memory hotplug is not enabled: missing acpi device or acpi disabled"); goto out; @@ -1755,8 +1787,8 @@ static void pc_memory_unplug_request(HotplugHandler *hotplug_dev, goto out; } - hhc = HOTPLUG_HANDLER_GET_CLASS(pcms->acpi_dev); - hhc->unplug_request(HOTPLUG_HANDLER(pcms->acpi_dev), dev, &local_err); + hhc = HOTPLUG_HANDLER_GET_CLASS(acpi_conf->acpi_dev); + hhc->unplug_request(HOTPLUG_HANDLER(acpi_conf->acpi_dev), dev, &local_err); out: error_propagate(errp, local_err); @@ -1766,11 +1798,12 @@ static void pc_memory_unplug(HotplugHandler *hotplug_dev, DeviceState *dev, Error **errp) { PCMachineState *pcms = PC_MACHINE(hotplug_dev); + AcpiConfiguration *acpi_conf = &pcms->acpi_configuration; HotplugHandlerClass *hhc; Error *local_err = NULL; - hhc = HOTPLUG_HANDLER_GET_CLASS(pcms->acpi_dev); - hhc->unplug(HOTPLUG_HANDLER(pcms->acpi_dev), dev, &local_err); + hhc = HOTPLUG_HANDLER_GET_CLASS(acpi_conf->acpi_dev); + hhc->unplug(HOTPLUG_HANDLER(acpi_conf->acpi_dev), dev, &local_err); if (local_err) { goto out; @@ -1817,10 +1850,11 @@ static void pc_cpu_plug(HotplugHandler *hotplug_dev, Error *local_err = NULL; X86CPU *cpu = X86_CPU(dev); PCMachineState *pcms = PC_MACHINE(hotplug_dev); + AcpiConfiguration *acpi_conf = &pcms->acpi_configuration; - if (pcms->acpi_dev) { - hhc = HOTPLUG_HANDLER_GET_CLASS(pcms->acpi_dev); - hhc->plug(HOTPLUG_HANDLER(pcms->acpi_dev), dev, &local_err); + if (acpi_conf->acpi_dev) { + hhc = HOTPLUG_HANDLER_GET_CLASS(acpi_conf->acpi_dev); + hhc->plug(HOTPLUG_HANDLER(acpi_conf->acpi_dev), dev, &local_err); if (local_err) { goto out; } @@ -1831,8 +1865,8 @@ static void pc_cpu_plug(HotplugHandler *hotplug_dev, if (pcms->rtc) { rtc_set_cpus_count(pcms->rtc, pcms->boot_cpus); } - if (pcms->fw_cfg) { - fw_cfg_modify_i16(pcms->fw_cfg, FW_CFG_NB_CPUS, pcms->boot_cpus); + if (acpi_conf->fw_cfg) { + fw_cfg_modify_i16(acpi_conf->fw_cfg, FW_CFG_NB_CPUS, pcms->boot_cpus); } found_cpu = pc_find_cpu_slot(MACHINE(pcms), cpu->apic_id, NULL); @@ -1848,8 +1882,9 @@ static void pc_cpu_unplug_request_cb(HotplugHandler *hotplug_dev, Error *local_err = NULL; X86CPU *cpu = X86_CPU(dev); PCMachineState *pcms = PC_MACHINE(hotplug_dev); + AcpiConfiguration *acpi_conf = &pcms->acpi_configuration; - if (!pcms->acpi_dev) { + if (!acpi_conf->acpi_dev) { error_setg(&local_err, "CPU hot unplug not supported without ACPI"); goto out; } @@ -1861,8 +1896,8 @@ static void pc_cpu_unplug_request_cb(HotplugHandler *hotplug_dev, goto out; } - hhc = HOTPLUG_HANDLER_GET_CLASS(pcms->acpi_dev); - hhc->unplug_request(HOTPLUG_HANDLER(pcms->acpi_dev), dev, &local_err); + hhc = HOTPLUG_HANDLER_GET_CLASS(acpi_conf->acpi_dev); + hhc->unplug_request(HOTPLUG_HANDLER(acpi_conf->acpi_dev), dev, &local_err); if (local_err) { goto out; @@ -1881,9 +1916,10 @@ static void pc_cpu_unplug_cb(HotplugHandler *hotplug_dev, Error *local_err = NULL; X86CPU *cpu = X86_CPU(dev); PCMachineState *pcms = PC_MACHINE(hotplug_dev); + AcpiConfiguration *acpi_conf = &pcms->acpi_configuration; - hhc = HOTPLUG_HANDLER_GET_CLASS(pcms->acpi_dev); - hhc->unplug(HOTPLUG_HANDLER(pcms->acpi_dev), dev, &local_err); + hhc = HOTPLUG_HANDLER_GET_CLASS(acpi_conf->acpi_dev); + hhc->unplug(HOTPLUG_HANDLER(acpi_conf->acpi_dev), dev, &local_err); if (local_err) { goto out; @@ -1897,7 +1933,7 @@ static void pc_cpu_unplug_cb(HotplugHandler *hotplug_dev, pcms->boot_cpus--; /* Update the number of CPUs in CMOS */ rtc_set_cpus_count(pcms->rtc, pcms->boot_cpus); - fw_cfg_modify_i16(pcms->fw_cfg, FW_CFG_NB_CPUS, pcms->boot_cpus); + fw_cfg_modify_i16(acpi_conf->fw_cfg, FW_CFG_NB_CPUS, pcms->boot_cpus); out: error_propagate(errp, local_err); } @@ -2181,28 +2217,30 @@ static bool pc_machine_get_nvdimm(Object *obj, Error **errp) { PCMachineState *pcms = PC_MACHINE(obj); - return pcms->acpi_nvdimm_state.is_enabled; + return pcms->acpi_configuration.acpi_nvdimm_state.is_enabled; } static void pc_machine_set_nvdimm(Object *obj, bool value, Error **errp) { PCMachineState *pcms = PC_MACHINE(obj); + AcpiConfiguration *acpi_conf = &pcms->acpi_configuration; - pcms->acpi_nvdimm_state.is_enabled = value; + acpi_conf->acpi_nvdimm_state.is_enabled = value; } static char *pc_machine_get_nvdimm_persistence(Object *obj, Error **errp) { PCMachineState *pcms = PC_MACHINE(obj); + AcpiConfiguration *acpi_conf = &pcms->acpi_configuration; - return g_strdup(pcms->acpi_nvdimm_state.persistence_string); + return g_strdup(acpi_conf->acpi_nvdimm_state.persistence_string); } static void pc_machine_set_nvdimm_persistence(Object *obj, const char *value, Error **errp) { PCMachineState *pcms = PC_MACHINE(obj); - AcpiNVDIMMState *nvdimm_state = &pcms->acpi_nvdimm_state; + AcpiNVDIMMState *nvdimm_state = &pcms->acpi_configuration.acpi_nvdimm_state; if (strcmp(value, "cpu") == 0) nvdimm_state->persistence = 3; @@ -2268,7 +2306,7 @@ static void pc_machine_initfn(Object *obj) pcms->smm = ON_OFF_AUTO_AUTO; pcms->vmport = ON_OFF_AUTO_AUTO; /* nvdimm is disabled on default. */ - pcms->acpi_nvdimm_state.is_enabled = false; + pcms->acpi_configuration.acpi_nvdimm_state.is_enabled = false; /* acpi build is enabled by default if machine supports it */ pcms->acpi_build_enabled = PC_MACHINE_GET_CLASS(pcms)->has_acpi_build; pcms->smbus = true; diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c index dc09466b3e..0620d10715 100644 --- a/hw/i386/pc_piix.c +++ b/hw/i386/pc_piix.c @@ -71,6 +71,7 @@ static void pc_init1(MachineState *machine, { PCMachineState *pcms = PC_MACHINE(machine); PCMachineClass *pcmc = PC_MACHINE_GET_CLASS(pcms); + AcpiConfiguration *acpi_conf = &pcms->acpi_configuration; MemoryRegion *system_memory = get_system_memory(); MemoryRegion *system_io = get_system_io(); int i; @@ -142,11 +143,11 @@ static void pc_init1(MachineState *machine, } if (machine->ram_size >= lowmem) { - pcms->above_4g_mem_size = machine->ram_size - lowmem; - pcms->below_4g_mem_size = lowmem; + acpi_conf->above_4g_mem_size = machine->ram_size - lowmem; + acpi_conf->below_4g_mem_size = lowmem; } else { - pcms->above_4g_mem_size = 0; - pcms->below_4g_mem_size = machine->ram_size; + acpi_conf->above_4g_mem_size = 0; + acpi_conf->below_4g_mem_size = machine->ram_size; } } @@ -199,8 +200,8 @@ static void pc_init1(MachineState *machine, pci_type, &i440fx_state, &piix3_devfn, &isa_bus, pcms->gsi, system_memory, system_io, machine->ram_size, - pcms->below_4g_mem_size, - pcms->above_4g_mem_size, + acpi_conf->below_4g_mem_size, + acpi_conf->above_4g_mem_size, pci_memory, ram_memory); pcms->bus = pci_bus; } else { @@ -289,16 +290,16 @@ static void pc_init1(MachineState *machine, object_property_add_link(OBJECT(machine), PC_MACHINE_ACPI_DEVICE_PROP, TYPE_HOTPLUG_HANDLER, - (Object **)&pcms->acpi_dev, + (Object **)&acpi_conf->acpi_dev, object_property_allow_set_link, OBJ_PROP_LINK_STRONG, &error_abort); object_property_set_link(OBJECT(machine), OBJECT(piix4_pm), PC_MACHINE_ACPI_DEVICE_PROP, &error_abort); } - if (pcms->acpi_nvdimm_state.is_enabled) { - nvdimm_init_acpi_state(&pcms->acpi_nvdimm_state, system_io, - pcms->fw_cfg, OBJECT(pcms)); + if (acpi_conf->acpi_nvdimm_state.is_enabled) { + nvdimm_init_acpi_state(&acpi_conf->acpi_nvdimm_state, system_io, + acpi_conf->fw_cfg, OBJECT(pcms)); } } diff --git a/hw/i386/pc_q35.c b/hw/i386/pc_q35.c index 532241e3f8..cdde4a4beb 100644 --- a/hw/i386/pc_q35.c +++ b/hw/i386/pc_q35.c @@ -63,6 +63,7 @@ static void pc_q35_init(MachineState *machine) { PCMachineState *pcms = PC_MACHINE(machine); PCMachineClass *pcmc = PC_MACHINE_GET_CLASS(pcms); + AcpiConfiguration *acpi_conf = &pcms->acpi_configuration; Q35PCIHost *q35_host; PCIHostState *phb; PCIBus *host_bus; @@ -116,11 +117,11 @@ static void pc_q35_init(MachineState *machine) } if (machine->ram_size >= lowmem) { - pcms->above_4g_mem_size = machine->ram_size - lowmem; - pcms->below_4g_mem_size = lowmem; + acpi_conf->above_4g_mem_size = machine->ram_size - lowmem; + acpi_conf->below_4g_mem_size = lowmem; } else { - pcms->above_4g_mem_size = 0; - pcms->below_4g_mem_size = machine->ram_size; + acpi_conf->above_4g_mem_size = 0; + acpi_conf->below_4g_mem_size = machine->ram_size; } if (xen_enabled()) { @@ -179,9 +180,9 @@ static void pc_q35_init(MachineState *machine) MCH_HOST_PROP_SYSTEM_MEM, NULL); object_property_set_link(OBJECT(q35_host), OBJECT(system_io), MCH_HOST_PROP_IO_MEM, NULL); - object_property_set_int(OBJECT(q35_host), pcms->below_4g_mem_size, + object_property_set_int(OBJECT(q35_host), acpi_conf->below_4g_mem_size, PCI_HOST_BELOW_4G_MEM_SIZE, NULL); - object_property_set_int(OBJECT(q35_host), pcms->above_4g_mem_size, + object_property_set_int(OBJECT(q35_host), acpi_conf->above_4g_mem_size, PCI_HOST_ABOVE_4G_MEM_SIZE, NULL); /* pci */ qdev_init_nofail(DEVICE(q35_host)); @@ -194,7 +195,7 @@ static void pc_q35_init(MachineState *machine) object_property_add_link(OBJECT(machine), PC_MACHINE_ACPI_DEVICE_PROP, TYPE_HOTPLUG_HANDLER, - (Object **)&pcms->acpi_dev, + (Object **)&acpi_conf->acpi_dev, object_property_allow_set_link, OBJ_PROP_LINK_STRONG, &error_abort); object_property_set_link(OBJECT(machine), OBJECT(lpc), @@ -276,9 +277,9 @@ static void pc_q35_init(MachineState *machine) pc_vga_init(isa_bus, host_bus); pc_nic_init(pcmc, isa_bus, host_bus); - if (pcms->acpi_nvdimm_state.is_enabled) { - nvdimm_init_acpi_state(&pcms->acpi_nvdimm_state, system_io, - pcms->fw_cfg, OBJECT(pcms)); + if (acpi_conf->acpi_nvdimm_state.is_enabled) { + nvdimm_init_acpi_state(&acpi_conf->acpi_nvdimm_state, system_io, + acpi_conf->fw_cfg, OBJECT(pcms)); } } diff --git a/hw/i386/xen/xen-hvm.c b/hw/i386/xen/xen-hvm.c index 935a3676c8..0459fb7340 100644 --- a/hw/i386/xen/xen-hvm.c +++ b/hw/i386/xen/xen-hvm.c @@ -190,6 +190,7 @@ qemu_irq *xen_interrupt_controller_init(void) static void xen_ram_init(PCMachineState *pcms, ram_addr_t ram_size, MemoryRegion **ram_memory_p) { + AcpiConfiguration *acpi_conf = &pcms->acpi_configuration; MemoryRegion *sysmem = get_system_memory(); ram_addr_t block_len; uint64_t user_lowmem = object_property_get_uint(qdev_get_machine(), @@ -207,20 +208,20 @@ static void xen_ram_init(PCMachineState *pcms, } if (ram_size >= user_lowmem) { - pcms->above_4g_mem_size = ram_size - user_lowmem; - pcms->below_4g_mem_size = user_lowmem; + acpi_conf->above_4g_mem_size = ram_size - user_lowmem; + acpi_conf->below_4g_mem_size = user_lowmem; } else { - pcms->above_4g_mem_size = 0; - pcms->below_4g_mem_size = ram_size; + acpi_conf->above_4g_mem_size = 0; + acpi_conf->below_4g_mem_size = ram_size; } - if (!pcms->above_4g_mem_size) { + if (!acpi_conf->above_4g_mem_size) { block_len = ram_size; } else { /* * Xen does not allocate the memory continuously, it keeps a * hole of the size computed above or passed in. */ - block_len = (1ULL << 32) + pcms->above_4g_mem_size; + block_len = (1ULL << 32) + acpi_conf->above_4g_mem_size; } memory_region_init_ram(&ram_memory, NULL, "xen.ram", block_len, &error_fatal); @@ -237,12 +238,12 @@ static void xen_ram_init(PCMachineState *pcms, */ memory_region_init_alias(&ram_lo, NULL, "xen.ram.lo", &ram_memory, 0xc0000, - pcms->below_4g_mem_size - 0xc0000); + acpi_conf->below_4g_mem_size - 0xc0000); memory_region_add_subregion(sysmem, 0xc0000, &ram_lo); - if (pcms->above_4g_mem_size > 0) { + if (acpi_conf->above_4g_mem_size > 0) { memory_region_init_alias(&ram_hi, NULL, "xen.ram.hi", &ram_memory, 0x100000000ULL, - pcms->above_4g_mem_size); + acpi_conf->above_4g_mem_size); memory_region_add_subregion(sysmem, 0x100000000ULL, &ram_hi); } } -- 2.19.1