From mboxrd@z Thu Jan 1 00:00:00 1970 Received: by 2002:adf:a111:0:0:0:0:0 with SMTP id o17-v6csp622802wro; Thu, 1 Nov 2018 03:26:53 -0700 (PDT) X-Google-Smtp-Source: AJdET5fk3mbcTHDxXrvXjI5Btn9SNFah5dWJ1Bam1W1ws1KZap2lJTewZCrXi5IcZGx70p5iybU2 X-Received: by 2002:ac8:2f0d:: with SMTP id j13-v6mr5907376qta.87.1541068013199; Thu, 01 Nov 2018 03:26:53 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1541068013; cv=none; d=google.com; s=arc-20160816; b=x9XAmBFCqbAbd4+qVBoK5P8EBEfN6rcy50mO8iblkANFBs/UpoFnAleX8Jv1KjzXgj t98m+zpJGpvOCpidlupcyEPfG8Vnca1PfTZuaKxELSl03zqDbs9FOzcD71DyVMw0QxXh wH1oWZTGEVrmIrOSme+95c20b2yXJp5x3tlGIkiVtQVOUYVcc7cP6Orm5kp0yXdsQIX7 wTg3++LdRfUgzC1q314UxTc2bZQJA06rzIOC+TyfM+5hNbKNlEj4wupLJcrhq0Pjf/7m O6eQ+0jteuD1DR4vMW/HF/SmX8RE2T+uI5JrSAwgHyIOyGGscZ9FwcofAia88d7NQzyC 5GkQ== 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=jdijBEhZmAvfvq6mki0qwgLqey30RvoKllcfM0jg9dA=; b=DrmmKIlnox5mgwZGltyE4AVoCz4rk18Y1K0iRVtsFCeqJTYkWVN0J+c9Y8ZPVA8Gau FfclTOI+US3YGhSDzmOPy79M7SI+qVipyBeJWAnTDQ92CXwvzwvbR112/aZdke+xMuip PVMFjPmr7uDpo6ypmON0WsaAm7xjleopFm6TwTBOiZ9nhvyhHMh1ow8sOCXTM9nHP6xT 7YT0ulInXB9wAxLu3MxocOQ/LGK+yfHhRtQIdwxi7buqqA18reinW5BqQcAe1M+rXOF1 yKPEIAAzNl2hdt2tbrIGdO0/lxBLbC56DzUw7LR05+1VnVtxl8tHxwNNOOoDqKBqfmgp QueQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of qemu-devel-bounces+alex.bennee=linaro.org@nongnu.org designates 2001:4830:134:3::11 as permitted sender) smtp.mailfrom="qemu-devel-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 r93-v6si581638qtd.194.2018.11.01.03.26.52 for (version=TLS1 cipher=AES128-SHA bits=128/128); Thu, 01 Nov 2018 03:26:53 -0700 (PDT) Received-SPF: pass (google.com: domain of qemu-devel-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-devel-bounces+alex.bennee=linaro.org@nongnu.org designates 2001:4830:134:3::11 as permitted sender) smtp.mailfrom="qemu-devel-bounces+alex.bennee=linaro.org@nongnu.org"; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: from localhost ([::1]:41069 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gIABg-00065O-J0 for alex.bennee@linaro.org; Thu, 01 Nov 2018 06:26:52 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:59058) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gIA8w-00044X-NA for qemu-devel@nongnu.org; Thu, 01 Nov 2018 06:24:06 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gIA8r-0002rD-LG for qemu-devel@nongnu.org; Thu, 01 Nov 2018 06:24:02 -0400 Received: from mga17.intel.com ([192.55.52.151]:61500) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1gIA8r-0002qQ-7x; Thu, 01 Nov 2018 06:23:57 -0400 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga006.jf.intel.com ([10.7.209.51]) by fmsmga107.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 01 Nov 2018 03:23:54 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.54,451,1534834800"; d="scan'208";a="87785900" Received: from jmath3-mobl1.ger.corp.intel.com (HELO localhost.localdomain) ([10.252.9.87]) by orsmga006.jf.intel.com with ESMTP; 01 Nov 2018 03:23:48 -0700 From: Samuel Ortiz To: qemu-devel@nongnu.org Date: Thu, 1 Nov 2018 11:22:41 +0100 Message-Id: <20181101102303.16439-2-sameo@linux.intel.com> X-Mailer: git-send-email 2.19.1 In-Reply-To: <20181101102303.16439-1-sameo@linux.intel.com> References: <20181101102303.16439-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: 192.55.52.151 Subject: [Qemu-devel] [PATCH v4 01/23] hw: i386: Decouple the ACPI build from the PC machine type X-BeenThere: qemu-devel@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" , "open list:X86" , Paolo Bonzini , Shannon Zhao , Anthony Perard , Igor Mammedov , "open list:ARM ACPI Subsystem" , Richard Henderson Errors-To: qemu-devel-bounces+alex.bennee=linaro.org@nongnu.org Sender: "Qemu-devel" X-TUID: VFQ/URbpxbN5 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/acpi/cpu_hotplug.c | 9 +- hw/arm/virt-acpi-build.c | 10 --- hw/i386/acpi-build.c | 136 ++++++++++++++---------------- hw/i386/acpi-build.h | 4 +- hw/i386/pc.c | 176 ++++++++++++++++++++++++--------------- hw/i386/pc_piix.c | 21 ++--- hw/i386/pc_q35.c | 21 ++--- hw/i386/xen/xen-hvm.c | 19 +++-- include/hw/acpi/acpi.h | 44 ++++++++++ include/hw/i386/pc.h | 19 ++--- 10 files changed, 257 insertions(+), 202 deletions(-) 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/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/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); } } 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 dfe6746692..da0bd39741 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" -- 2.19.1 From mboxrd@z Thu Jan 1 00:00:00 1970 From: Samuel Ortiz Subject: [PATCH v4 01/23] hw: i386: Decouple the ACPI build from the PC machine type Date: Thu, 1 Nov 2018 11:22:41 +0100 Message-ID: <20181101102303.16439-2-sameo@linux.intel.com> References: <20181101102303.16439-1-sameo@linux.intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from us1-rack-dfw2.inumbo.com ([104.130.134.6]) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1gIA8t-0004Lk-Ov for xen-devel@lists.xenproject.org; Thu, 01 Nov 2018 10:23:59 +0000 In-Reply-To: <20181101102303.16439-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" , "open list:X86" , Paolo Bonzini , Marcel Apfelbaum , Shannon Zhao , Anthony Perard , Igor Mammedov , "open list:ARM ACPI Subsystem" , Richard Henderson List-Id: xen-devel@lists.xenproject.org QUNQSSB0YWJsZXMgYXJlIHBsYXRmb3JtIGFuZCBtYWNoaW5lIHR5cGUgYW5kIGV2ZW4gYXJjaGl0 ZWN0dXJlCmFnbm9zdGljLCBhbmQgYXMgc3VjaCB3ZSB3YW50IHRvIHByb3ZpZGUgYW4gaW50ZXJu YWwgQUNQSSBBUEkgdGhhdApvbmx5IGRlcGVuZHMgb24gcGxhdGZvcm0gYWdub3N0aWMgaW5mb3Jt YXRpb24uCgpGb3IgdGhlIHg4NiBhcmNoaXRlY3R1cmUsIGluIG9yZGVyIHRvIGJ1aWxkIEFDUEkg dGFibGVzIGluZGVwZW5kZW50bHkKZnJvbSB0aGUgUEMgb3IgUTM1IG1hY2hpbmUgdHlwZXMsIHdl IGFyZSBtb3ZpbmcgYSBmZXcgTWFjaGluZVN0YXRlCnN0cnVjdHVyZSBmaWVsZHMgaW50byBhIG1h Y2hpbmUgdHlwZSBhZ25vc3RpYyBzdHJ1Y3R1cmUgY2FsbGVkCkFjcGlDb25maWd1cmF0aW9uLiBU aGUgc3RydWN0dXJlIGZpZWxkcyB3ZSBtb3ZlIGFyZToKCiAgIEhvdHBsdWdIYW5kbGVyICphY3Bp X2RldgogICBBY3BpTlZESU1NU3RhdGUgYWNwaV9udmRpbW1fc3RhdGU7CiAgIEZXQ2ZnU3RhdGUg KmZ3X2NmZwogICByYW1fYWRkcl90IGJlbG93XzRnX21lbV9zaXplLCBhYm92ZV80Z19tZW1fc2l6 ZQogICBib29sIGFwaWNfeHJ1cHRfb3ZlcnJpZGUKICAgdW5zaWduZWQgYXBpY19pZF9saW1pdAog ICB1aW50NjRfdCBudW1hX25vZGVzCiAgIHVpbnQ2NF90IG51bWFfbWVtCgpTaWduZWQtb2ZmLWJ5 OiBTYW11ZWwgT3J0aXogPHNhbWVvQGxpbnV4LmludGVsLmNvbT4KLS0tCiBody9hY3BpL2NwdV9o b3RwbHVnLmMgICAgfCAgIDkgKy0KIGh3L2FybS92aXJ0LWFjcGktYnVpbGQuYyB8ICAxMCAtLS0K IGh3L2kzODYvYWNwaS1idWlsZC5jICAgICB8IDEzNiArKysrKysrKysrKysrKy0tLS0tLS0tLS0t LS0tLS0KIGh3L2kzODYvYWNwaS1idWlsZC5oICAgICB8ICAgNCArLQogaHcvaTM4Ni9wYy5jICAg ICAgICAgICAgIHwgMTc2ICsrKysrKysrKysrKysrKysrKysrKysrKy0tLS0tLS0tLS0tLS0tLQog aHcvaTM4Ni9wY19waWl4LmMgICAgICAgIHwgIDIxICsrLS0tCiBody9pMzg2L3BjX3EzNS5jICAg ICAgICAgfCAgMjEgKystLS0KIGh3L2kzODYveGVuL3hlbi1odm0uYyAgICB8ICAxOSArKystLQog aW5jbHVkZS9ody9hY3BpL2FjcGkuaCAgIHwgIDQ0ICsrKysrKysrKysKIGluY2x1ZGUvaHcvaTM4 Ni9wYy5oICAgICB8ICAxOSArKy0tLQogMTAgZmlsZXMgY2hhbmdlZCwgMjU3IGluc2VydGlvbnMo KyksIDIwMiBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9ody9hY3BpL2NwdV9ob3RwbHVnLmMg 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 IApkaWZmIC0tZ2l0IGEvaHcvaTM4Ni9hY3BpLWJ1aWxkLmggYi9ody9pMzg2L2FjcGktYnVpbGQu aAppbmRleCAwMDczMzJlNTFjLi4wNjVhMWQ4MjUwIDEwMDY0NAotLS0gYS9ody9pMzg2L2FjcGkt YnVpbGQuaAorKysgYi9ody9pMzg2L2FjcGktYnVpbGQuaApAQCAtMiw2ICsyLDggQEAKICNpZm5k ZWYgSFdfSTM4Nl9BQ1BJX0JVSUxEX0gKICNkZWZpbmUgSFdfSTM4Nl9BQ1BJX0JVSUxEX0gKIAot dm9pZCBhY3BpX3NldHVwKHZvaWQpOworI2luY2x1ZGUgImh3L2FjcGkvYWNwaS5oIgorCit2b2lk IGFjcGlfc2V0dXAoTWFjaGluZVN0YXRlICptYWNoaW5lLCBBY3BpQ29uZmlndXJhdGlvbiAqYWNw aV9jb25mKTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9ody9pMzg2L3BjLmMgYi9ody9pMzg2L3Bj LmMKaW5kZXggZjA5NTcyNWRiYS4uMDkwZjk2OTkzMyAxMDA2NDQKLS0tIGEvaHcvaTM4Ni9wYy5j CisrKyBiL2h3L2kzODYvcGMuYwpAQCAtNDQ0LDE3ICs0NDQsMTggQEAgdm9pZCBwY19jbW9zX2lu aXQoUENNYWNoaW5lU3RhdGUgKnBjbXMsCiB7CiAgICAgaW50IHZhbDsKICAgICBzdGF0aWMgcGNf Y21vc19pbml0X2xhdGVfYXJnIGFyZzsKKyAgICBBY3BpQ29uZmlndXJhdGlvbiAqYWNwaV9jb25m ID0gJnBjbXMtPmFjcGlfY29uZmlndXJhdGlvbjsKIAogICAgIC8qIHZhcmlvdXMgaW1wb3J0YW50 IENNT1MgbG9jYXRpb25zIG5lZWRlZCBieSBQQy9Cb2NocyBiaW9zICovCiAKICAgICAvKiBtZW1v cnkgc2l6ZSAqLwogICAgIC8qIGJhc2UgbWVtb3J5IChmaXJzdCBNaUIpICovCi0gICAgdmFsID0g TUlOKHBjbXMtPmJlbG93XzRnX21lbV9zaXplIC8gS2lCLCA2NDApOworICAgIHZhbCA9IE1JTihh Y3BpX2NvbmYtPmJlbG93XzRnX21lbV9zaXplIC8gS2lCLCA2NDApOwogICAgIHJ0Y19zZXRfbWVt b3J5KHMsIDB4MTUsIHZhbCk7CiAgICAgcnRjX3NldF9tZW1vcnkocywgMHgxNiwgdmFsID4+IDgp OwogICAgIC8qIGV4dGVuZGVkIG1lbW9yeSAobmV4dCA2NE1pQikgKi8KLSAgICBpZiAocGNtcy0+ YmVsb3dfNGdfbWVtX3NpemUgPiAxICogTWlCKSB7Ci0gICAgICAgIHZhbCA9IChwY21zLT5iZWxv d180Z19tZW1fc2l6ZSAtIDEgKiBNaUIpIC8gS2lCOworICAgIGlmIChhY3BpX2NvbmYtPmJlbG93 XzRnX21lbV9zaXplID4gMSAqIE1pQikgeworICAgICAgICB2YWwgPSAoYWNwaV9jb25mLT5iZWxv d180Z19tZW1fc2l6ZSAtIDEgKiBNaUIpIC8gS2lCOwogICAgIH0gZWxzZSB7CiAgICAgICAgIHZh bCA9IDA7CiAgICAgfQpAQCAtNDY1LDggKzQ2Niw4IEBAIHZvaWQgcGNfY21vc19pbml0KFBDTWFj aGluZVN0YXRlICpwY21zLAogICAgIHJ0Y19zZXRfbWVtb3J5KHMsIDB4MzAsIHZhbCk7CiAgICAg cnRjX3NldF9tZW1vcnkocywgMHgzMSwgdmFsID4+IDgpOwogICAgIC8qIG1lbW9yeSBiZXR3ZWVu IDE2TWlCIGFuZCA0R2lCICovCi0gICAgaWYgKHBjbXMtPmJlbG93XzRnX21lbV9zaXplID4gMTYg KiBNaUIpIHsKLSAgICAgICAgdmFsID0gKHBjbXMtPmJlbG93XzRnX21lbV9zaXplIC0gMTYgKiBN aUIpIC8gKDY0ICogS2lCKTsKKyAgICBpZiAoYWNwaV9jb25mLT5iZWxvd180Z19tZW1fc2l6ZSA+ IDE2ICogTWlCKSB7CisgICAgICAgIHZhbCA9IChhY3BpX2NvbmYtPmJlbG93XzRnX21lbV9zaXpl IC0gMTYgKiBNaUIpIC8gKDY0ICogS2lCKTsKICAgICB9IGVsc2UgewogICAgICAgICB2YWwgPSAw OwogICAgIH0KQEAgLTQ3NSw3ICs0NzYsNyBAQCB2b2lkIHBjX2Ntb3NfaW5pdChQQ01hY2hpbmVT dGF0ZSAqcGNtcywKICAgICBydGNfc2V0X21lbW9yeShzLCAweDM0LCB2YWwpOwogICAgIHJ0Y19z ZXRfbWVtb3J5KHMsIDB4MzUsIHZhbCA+PiA4KTsKICAgICAvKiBtZW1vcnkgYWJvdmUgNEdpQiAq LwotICAgIHZhbCA9IHBjbXMtPmFib3ZlXzRnX21lbV9zaXplIC8gNjU1MzY7CisgICAgdmFsID0g YWNwaV9jb25mLT5hYm92ZV80Z19tZW1fc2l6ZSAvIDY1NTM2OwogICAgIHJ0Y19zZXRfbWVtb3J5 KHMsIDB4NWIsIHZhbCk7CiAgICAgcnRjX3NldF9tZW1vcnkocywgMHg1YywgdmFsID4+IDgpOwog ICAgIHJ0Y19zZXRfbWVtb3J5KHMsIDB4NWQsIHZhbCA+PiAxNik7CkBAIC03MTQsMTMgKzcxNSwx NCBAQCBzdGF0aWMgdm9pZCBwY19idWlsZF9zbWJpb3MoUENNYWNoaW5lU3RhdGUgKnBjbXMpCiAg ICAgdW5zaWduZWQgaSwgYXJyYXlfY291bnQ7CiAgICAgTWFjaGluZVN0YXRlICptcyA9IE1BQ0hJ TkUocGNtcyk7CiAgICAgWDg2Q1BVICpjcHUgPSBYODZfQ1BVKG1zLT5wb3NzaWJsZV9jcHVzLT5j cHVzWzBdLmNwdSk7CisgICAgQWNwaUNvbmZpZ3VyYXRpb24gKmFjcGlfY29uZiA9ICZwY21zLT5h Y3BpX2NvbmZpZ3VyYXRpb247CiAKICAgICAvKiB0ZWxsIHNtYmlvcyBhYm91dCBjcHVpZCB2ZXJz aW9uIGFuZCBmZWF0dXJlcyAqLwogICAgIHNtYmlvc19zZXRfY3B1aWQoY3B1LT5lbnYuY3B1aWRf dmVyc2lvbiwgY3B1LT5lbnYuZmVhdHVyZXNbRkVBVF8xX0VEWF0pOwogCiAgICAgc21iaW9zX3Rh YmxlcyA9IHNtYmlvc19nZXRfdGFibGVfbGVnYWN5KCZzbWJpb3NfdGFibGVzX2xlbik7CiAgICAg aWYgKHNtYmlvc190YWJsZXMpIHsKLSAgICAgICAgZndfY2ZnX2FkZF9ieXRlcyhwY21zLT5md19j ZmcsIEZXX0NGR19TTUJJT1NfRU5UUklFUywKKyAgICAgICAgZndfY2ZnX2FkZF9ieXRlcyhhY3Bp X2NvbmYtPmZ3X2NmZywgRldfQ0ZHX1NNQklPU19FTlRSSUVTLAogICAgICAgICAgICAgICAgICAg ICAgICAgIHNtYmlvc190YWJsZXMsIHNtYmlvc190YWJsZXNfbGVuKTsKICAgICB9CiAKQEAgLTc0 MSw5ICs3NDMsOSBAQCBzdGF0aWMgdm9pZCBwY19idWlsZF9zbWJpb3MoUENNYWNoaW5lU3RhdGUg KnBjbXMpCiAgICAgZ19mcmVlKG1lbV9hcnJheSk7CiAKICAgICBpZiAoc21iaW9zX2FuY2hvcikg ewotICAgICAgICBmd19jZmdfYWRkX2ZpbGUocGNtcy0+ZndfY2ZnLCAiZXRjL3NtYmlvcy9zbWJp b3MtdGFibGVzIiwKKyAgICAgICAgZndfY2ZnX2FkZF9maWxlKGFjcGlfY29uZi0+ZndfY2ZnLCAi ZXRjL3NtYmlvcy9zbWJpb3MtdGFibGVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgIHNtYmlv c190YWJsZXMsIHNtYmlvc190YWJsZXNfbGVuKTsKLSAgICAgICAgZndfY2ZnX2FkZF9maWxlKHBj bXMtPmZ3X2NmZywgImV0Yy9zbWJpb3Mvc21iaW9zLWFuY2hvciIsCisgICAgICAgIGZ3X2NmZ19h ZGRfZmlsZShhY3BpX2NvbmYtPmZ3X2NmZywgImV0Yy9zbWJpb3Mvc21iaW9zLWFuY2hvciIsCiAg ICAgICAgICAgICAgICAgICAgICAgICBzbWJpb3NfYW5jaG9yLCBzbWJpb3NfYW5jaG9yX2xlbik7 CiAgICAgfQogfQpAQCAtNzU1LDYgKzc1Nyw3IEBAIHN0YXRpYyBGV0NmZ1N0YXRlICpib2Noc19i aW9zX2luaXQoQWRkcmVzc1NwYWNlICphcywgUENNYWNoaW5lU3RhdGUgKnBjbXMpCiAgICAgaW50 IGk7CiAgICAgY29uc3QgQ1BVQXJjaElkTGlzdCAqY3B1czsKICAgICBNYWNoaW5lQ2xhc3MgKm1j ID0gTUFDSElORV9HRVRfQ0xBU1MocGNtcyk7CisgICAgQWNwaUNvbmZpZ3VyYXRpb24gKmFjcGlf Y29uZiA9ICZwY21zLT5hY3BpX2NvbmZpZ3VyYXRpb247CiAKICAgICBmd19jZmcgPSBmd19jZmdf aW5pdF9pb19kbWEoRldfQ0ZHX0lPX0JBU0UsIEZXX0NGR19JT19CQVNFICsgNCwgYXMpOwogICAg IGZ3X2NmZ19hZGRfaTE2KGZ3X2NmZywgRldfQ0ZHX05CX0NQVVMsIHBjbXMtPmJvb3RfY3B1cyk7 CkBAIC03NzEsNyArNzc0LDcgQEAgc3RhdGljIEZXQ2ZnU3RhdGUgKmJvY2hzX2Jpb3NfaW5pdChB ZGRyZXNzU3BhY2UgKmFzLCBQQ01hY2hpbmVTdGF0ZSAqcGNtcykKICAgICAgKiBTbyBmb3IgY29t cGF0aWJpbGl0eSByZWFzb25zIHdpdGggb2xkIEJJT1NlcyB3ZSBhcmUgc3R1Y2sgd2l0aAogICAg ICAqICJldGMvbWF4LWNwdXMiIGFjdHVhbGx5IGJlaW5nIGFwaWNfaWRfbGltaXQKICAgICAgKi8K LSAgICBmd19jZmdfYWRkX2kxNihmd19jZmcsIEZXX0NGR19NQVhfQ1BVUywgKHVpbnQxNl90KXBj bXMtPmFwaWNfaWRfbGltaXQpOworICAgIGZ3X2NmZ19hZGRfaTE2KGZ3X2NmZywgRldfQ0ZHX01B WF9DUFVTLCAodWludDE2X3QpYWNwaV9jb25mLT5hcGljX2lkX2xpbWl0KTsKICAgICBmd19jZmdf YWRkX2k2NChmd19jZmcsIEZXX0NGR19SQU1fU0laRSwgKHVpbnQ2NF90KXJhbV9zaXplKTsKICAg ICBmd19jZmdfYWRkX2J5dGVzKGZ3X2NmZywgRldfQ0ZHX0FDUElfVEFCTEVTLAogICAgICAgICAg ICAgICAgICAgICAgYWNwaV90YWJsZXMsIGFjcGlfdGFibGVzX2xlbik7CkBAIC03ODcsMjAgKzc5 MCwyMSBAQCBzdGF0aWMgRldDZmdTdGF0ZSAqYm9jaHNfYmlvc19pbml0KEFkZHJlc3NTcGFjZSAq YXMsIFBDTWFjaGluZVN0YXRlICpwY21zKQogICAgICAqIG9mIG5vZGVzLCBvbmUgd29yZCBmb3Ig ZWFjaCBWQ1BVLT5ub2RlIGFuZCBvbmUgd29yZCBmb3IgZWFjaCBub2RlIHRvCiAgICAgICogaG9s ZCB0aGUgYW1vdW50IG9mIG1lbW9yeS4KICAgICAgKi8KLSAgICBudW1hX2Z3X2NmZyA9IGdfbmV3 MCh1aW50NjRfdCwgMSArIHBjbXMtPmFwaWNfaWRfbGltaXQgKyBuYl9udW1hX25vZGVzKTsKKyAg ICBudW1hX2Z3X2NmZyA9IGdfbmV3MCh1aW50NjRfdCwKKyAgICAgICAgICAgICAgICAgICAgICAg ICAxICsgYWNwaV9jb25mLT5hcGljX2lkX2xpbWl0ICsgbmJfbnVtYV9ub2Rlcyk7CiAgICAgbnVt YV9md19jZmdbMF0gPSBjcHVfdG9fbGU2NChuYl9udW1hX25vZGVzKTsKICAgICBjcHVzID0gbWMt PnBvc3NpYmxlX2NwdV9hcmNoX2lkcyhNQUNISU5FKHBjbXMpKTsKICAgICBmb3IgKGkgPSAwOyBp IDwgY3B1cy0+bGVuOyBpKyspIHsKICAgICAgICAgdW5zaWduZWQgaW50IGFwaWNfaWQgPSBjcHVz LT5jcHVzW2ldLmFyY2hfaWQ7Ci0gICAgICAgIGFzc2VydChhcGljX2lkIDwgcGNtcy0+YXBpY19p ZF9saW1pdCk7CisgICAgICAgIGFzc2VydChhcGljX2lkIDwgYWNwaV9jb25mLT5hcGljX2lkX2xp bWl0KTsKICAgICAgICAgbnVtYV9md19jZmdbYXBpY19pZCArIDFdID0gY3B1X3RvX2xlNjQoY3B1 cy0+Y3B1c1tpXS5wcm9wcy5ub2RlX2lkKTsKICAgICB9CiAgICAgZm9yIChpID0gMDsgaSA8IG5i X251bWFfbm9kZXM7IGkrKykgewotICAgICAgICBudW1hX2Z3X2NmZ1twY21zLT5hcGljX2lkX2xp bWl0ICsgMSArIGldID0KKyAgICAgICAgbnVtYV9md19jZmdbYWNwaV9jb25mLT5hcGljX2lkX2xp bWl0ICsgMSArIGldID0KICAgICAgICAgICAgIGNwdV90b19sZTY0KG51bWFfaW5mb1tpXS5ub2Rl X21lbSk7CiAgICAgfQogICAgIGZ3X2NmZ19hZGRfYnl0ZXMoZndfY2ZnLCBGV19DRkdfTlVNQSwg bnVtYV9md19jZmcsCi0gICAgICAgICAgICAgICAgICAgICAoMSArIHBjbXMtPmFwaWNfaWRfbGlt aXQgKyBuYl9udW1hX25vZGVzKSAqCisgICAgICAgICAgICAgICAgICAgICAoMSArIGFjcGlfY29u Zi0+YXBpY19pZF9saW1pdCArIG5iX251bWFfbm9kZXMpICoKICAgICAgICAgICAgICAgICAgICAg IHNpemVvZigqbnVtYV9md19jZmcpKTsKIAogICAgIHJldHVybiBmd19jZmc7CkBAIC04NDgsNiAr ODUyLDcgQEAgc3RhdGljIHZvaWQgbG9hZF9saW51eChQQ01hY2hpbmVTdGF0ZSAqcGNtcywKICAg ICBjaGFyICp2bW9kZTsKICAgICBNYWNoaW5lU3RhdGUgKm1hY2hpbmUgPSBNQUNISU5FKHBjbXMp OwogICAgIFBDTWFjaGluZUNsYXNzICpwY21jID0gUENfTUFDSElORV9HRVRfQ0xBU1MocGNtcyk7 CisgICAgQWNwaUNvbmZpZ3VyYXRpb24gKmFjcGlfY29uZiA9ICZwY21zLT5hY3BpX2NvbmZpZ3Vy YXRpb247CiAgICAgc3RydWN0IHNldHVwX2RhdGEgKnNldHVwX2RhdGE7CiAgICAgY29uc3QgY2hh ciAqa2VybmVsX2ZpbGVuYW1lID0gbWFjaGluZS0+a2VybmVsX2ZpbGVuYW1lOwogICAgIGNvbnN0 IGNoYXIgKmluaXRyZF9maWxlbmFtZSA9IG1hY2hpbmUtPmluaXRyZF9maWxlbmFtZTsKQEAgLTkx Nyw4ICs5MjIsOCBAQCBzdGF0aWMgdm9pZCBsb2FkX2xpbnV4KFBDTWFjaGluZVN0YXRlICpwY21z LAogICAgICAgICBpbml0cmRfbWF4ID0gMHgzN2ZmZmZmZjsKICAgICB9CiAKLSAgICBpZiAoaW5p dHJkX21heCA+PSBwY21zLT5iZWxvd180Z19tZW1fc2l6ZSAtIHBjbWMtPmFjcGlfZGF0YV9zaXpl KSB7Ci0gICAgICAgIGluaXRyZF9tYXggPSBwY21zLT5iZWxvd180Z19tZW1fc2l6ZSAtIHBjbWMt PmFjcGlfZGF0YV9zaXplIC0gMTsKKyAgICBpZiAoaW5pdHJkX21heCA+PSBhY3BpX2NvbmYtPmJl bG93XzRnX21lbV9zaXplIC0gcGNtYy0+YWNwaV9kYXRhX3NpemUpIHsKKyAgICAgICAgaW5pdHJk X21heCA9IGFjcGlfY29uZi0+YmVsb3dfNGdfbWVtX3NpemUgLSBwY21jLT5hY3BpX2RhdGFfc2l6 ZSAtIDE7CiAgICAgfQogCiAgICAgZndfY2ZnX2FkZF9pMzIoZndfY2ZnLCBGV19DRkdfQ01ETElO RV9BRERSLCBjbWRsaW5lX2FkZHIpOwpAQCAtMTE1NCw3ICsxMTU5LDggQEAgdm9pZCBwY19jcHVz X2luaXQoUENNYWNoaW5lU3RhdGUgKnBjbXMpCiAgICAgICoKICAgICAgKiBUaGlzIGlzIHVzZWQg Zm9yIEZXX0NGR19NQVhfQ1BVUy4gU2VlIGNvbW1lbnRzIG9uIGJvY2hzX2Jpb3NfaW5pdCgpLgog ICAgICAqLwotICAgIHBjbXMtPmFwaWNfaWRfbGltaXQgPSB4ODZfY3B1X2FwaWNfaWRfZnJvbV9p bmRleChtYXhfY3B1cyAtIDEpICsgMTsKKyAgICBwY21zLT5hY3BpX2NvbmZpZ3VyYXRpb24uYXBp Y19pZF9saW1pdCA9CisgICAgICAgIHg4Nl9jcHVfYXBpY19pZF9mcm9tX2luZGV4KG1heF9jcHVz IC0gMSkgKyAxOwogICAgIHBvc3NpYmxlX2NwdXMgPSBtYy0+cG9zc2libGVfY3B1X2FyY2hfaWRz KG1zKTsKICAgICBmb3IgKGkgPSAwOyBpIDwgc21wX2NwdXM7IGkrKykgewogICAgICAgICBwY19u ZXdfY3B1KHBvc3NpYmxlX2NwdXMtPmNwdXNbaV0udHlwZSwgcG9zc2libGVfY3B1cy0+Y3B1c1tp XS5hcmNoX2lkLApAQCAtMTE4OCw3ICsxMTk0LDggQEAgc3RhdGljIHZvaWQgcGNfYnVpbGRfZmVh dHVyZV9jb250cm9sX2ZpbGUoUENNYWNoaW5lU3RhdGUgKnBjbXMpCiAKICAgICB2YWwgPSBnX21h bGxvYyhzaXplb2YoKnZhbCkpOwogICAgICp2YWwgPSBjcHVfdG9fbGU2NChmZWF0dXJlX2NvbnRy b2xfYml0cyB8IEZFQVRVUkVfQ09OVFJPTF9MT0NLRUQpOwotICAgIGZ3X2NmZ19hZGRfZmlsZShw Y21zLT5md19jZmcsICJldGMvbXNyX2ZlYXR1cmVfY29udHJvbCIsIHZhbCwgc2l6ZW9mKCp2YWwp KTsKKyAgICBmd19jZmdfYWRkX2ZpbGUocGNtcy0+YWNwaV9jb25maWd1cmF0aW9uLmZ3X2NmZywK KyAgICAgICAgICAgICAgICAgICAgImV0Yy9tc3JfZmVhdHVyZV9jb250cm9sIiwgdmFsLCBzaXpl b2YoKnZhbCkpOwogfQogCiBzdGF0aWMgdm9pZCBydGNfc2V0X2NwdXNfY291bnQoSVNBRGV2aWNl ICpydGMsIHVpbnQxNl90IGNwdXNfY291bnQpCkBAIC0xMjA0LDExICsxMjExLDI2IEBAIHN0YXRp YyB2b2lkIHJ0Y19zZXRfY3B1c19jb3VudChJU0FEZXZpY2UgKnJ0YywgdWludDE2X3QgY3B1c19j b3VudCkKICAgICB9CiB9CiAKK3N0YXRpYyB2b2lkIGFjcGlfY29uZl9wY19pbml0KFBDTWFjaGlu ZVN0YXRlICpwY21zKQoreworICAgIFBDTWFjaGluZUNsYXNzICpwY21jID0gUENfTUFDSElORV9H RVRfQ0xBU1MocGNtcyk7CisgICAgQWNwaUNvbmZpZ3VyYXRpb24gKmFjcGlfY29uZiA9ICZwY21z LT5hY3BpX2NvbmZpZ3VyYXRpb247CisKKyAgICAvKiBNYWNoaW5lIGNsYXNzIHNldHRpbmdzICov CisgICAgYWNwaV9jb25mLT5sZWdhY3lfYWNwaV90YWJsZV9zaXplID0gcGNtYy0+bGVnYWN5X2Fj cGlfdGFibGVfc2l6ZTsKKyAgICBhY3BpX2NvbmYtPmxlZ2FjeV9jcHVfaG90cGx1ZyA9IHBjbWMt PmxlZ2FjeV9jcHVfaG90cGx1ZzsKKyAgICBhY3BpX2NvbmYtPnJzZHBfaW5fcmFtID0gcGNtYy0+ cnNkcF9pbl9yYW07CisKKyAgICAvKiBBQ1BJIGJ1aWxkIHN0YXRlICovCisgICAgYWNwaV9jb25m LT5idWlsZF9zdGF0ZSA9IE5VTEw7Cit9CisKIHN0YXRpYwogdm9pZCBwY19tYWNoaW5lX2RvbmUo Tm90aWZpZXIgKm5vdGlmaWVyLCB2b2lkICpkYXRhKQogewogICAgIFBDTWFjaGluZVN0YXRlICpw Y21zID0gY29udGFpbmVyX29mKG5vdGlmaWVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIFBDTWFjaGluZVN0YXRlLCBtYWNoaW5lX2RvbmUpOworICAgIEFjcGlDb25m aWd1cmF0aW9uICphY3BpX2NvbmYgPSAmcGNtcy0+YWNwaV9jb25maWd1cmF0aW9uOwogICAgIFBD SUJ1cyAqYnVzID0gcGNtcy0+YnVzOwogCiAgICAgLyogc2V0IHRoZSBudW1iZXIgb2YgQ1BVcyAq LwpAQCAtMTIyMywyMyArMTI0NSwyNyBAQCB2b2lkIHBjX21hY2hpbmVfZG9uZShOb3RpZmllciAq bm90aWZpZXIsIHZvaWQgKmRhdGEpCiAgICAgICAgICAgICAgICAgZXh0cmFfaG9zdHMrKzsKICAg ICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBpZiAoZXh0cmFfaG9zdHMgJiYgcGNtcy0+ ZndfY2ZnKSB7CisgICAgICAgIGlmIChleHRyYV9ob3N0cyAmJiBhY3BpX2NvbmYtPmZ3X2NmZykg ewogICAgICAgICAgICAgdWludDY0X3QgKnZhbCA9IGdfbWFsbG9jKHNpemVvZigqdmFsKSk7CiAg ICAgICAgICAgICAqdmFsID0gY3B1X3RvX2xlNjQoZXh0cmFfaG9zdHMpOwotICAgICAgICAgICAg ZndfY2ZnX2FkZF9maWxlKHBjbXMtPmZ3X2NmZywKKyAgICAgICAgICAgIGZ3X2NmZ19hZGRfZmls ZShhY3BpX2NvbmYtPmZ3X2NmZywKICAgICAgICAgICAgICAgICAgICAgImV0Yy9leHRyYS1wY2kt cm9vdHMiLCB2YWwsIHNpemVvZigqdmFsKSk7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBhY3Bp X3NldHVwKCk7Ci0gICAgaWYgKHBjbXMtPmZ3X2NmZykgeworICAgIGlmIChwY21zLT5hY3BpX2J1 aWxkX2VuYWJsZWQpIHsKKyAgICAgICAgYWNwaV9jb25mX3BjX2luaXQocGNtcyk7CisgICAgICAg IGFjcGlfc2V0dXAoTUFDSElORShwY21zKSwgYWNwaV9jb25mKTsKKyAgICB9CisKKyAgICBpZiAo YWNwaV9jb25mLT5md19jZmcpIHsKICAgICAgICAgcGNfYnVpbGRfc21iaW9zKHBjbXMpOwogICAg ICAgICBwY19idWlsZF9mZWF0dXJlX2NvbnRyb2xfZmlsZShwY21zKTsKICAgICAgICAgLyogdXBk YXRlIEZXX0NGR19OQl9DUFVTIHRvIGFjY291bnQgZm9yIC1kZXZpY2UgYWRkZWQgQ1BVcyAqLwot ICAgICAgICBmd19jZmdfbW9kaWZ5X2kxNihwY21zLT5md19jZmcsIEZXX0NGR19OQl9DUFVTLCBw Y21zLT5ib290X2NwdXMpOworICAgICAgICBmd19jZmdfbW9kaWZ5X2kxNihhY3BpX2NvbmYtPmZ3 X2NmZywgRldfQ0ZHX05CX0NQVVMsIHBjbXMtPmJvb3RfY3B1cyk7CiAgICAgfQogCi0gICAgaWYg KHBjbXMtPmFwaWNfaWRfbGltaXQgPiAyNTUgJiYgIXhlbl9lbmFibGVkKCkpIHsKKyAgICBpZiAo YWNwaV9jb25mLT5hcGljX2lkX2xpbWl0ID4gMjU1ICYmICF4ZW5fZW5hYmxlZCgpKSB7CiAgICAg ICAgIEludGVsSU9NTVVTdGF0ZSAqaW9tbXUgPSBJTlRFTF9JT01NVV9ERVZJQ0UoeDg2X2lvbW11 X2dldF9kZWZhdWx0KCkpOwogCiAgICAgICAgIGlmICghaW9tbXUgfHwgIWlvbW11LT54ODZfaW9t bXUuaW50cl9zdXBwb3J0ZWQgfHwKQEAgLTEyNTYsMTMgKzEyODIsMTQgQEAgdm9pZCBwY19tYWNo aW5lX2RvbmUoTm90aWZpZXIgKm5vdGlmaWVyLCB2b2lkICpkYXRhKQogdm9pZCBwY19ndWVzdF9p bmZvX2luaXQoUENNYWNoaW5lU3RhdGUgKnBjbXMpCiB7CiAgICAgaW50IGk7CisgICAgQWNwaUNv bmZpZ3VyYXRpb24gKmFjcGlfY29uZiA9ICZwY21zLT5hY3BpX2NvbmZpZ3VyYXRpb247CiAKLSAg ICBwY21zLT5hcGljX3hydXB0X292ZXJyaWRlID0ga3ZtX2FsbG93c19pcnEwX292ZXJyaWRlKCk7 Ci0gICAgcGNtcy0+bnVtYV9ub2RlcyA9IG5iX251bWFfbm9kZXM7Ci0gICAgcGNtcy0+bm9kZV9t ZW0gPSBnX21hbGxvYzAocGNtcy0+bnVtYV9ub2RlcyAqCi0gICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBzaXplb2YgKnBjbXMtPm5vZGVfbWVtKTsKKyAgICBhY3BpX2NvbmYtPmFw aWNfeHJ1cHRfb3ZlcnJpZGUgPSBrdm1fYWxsb3dzX2lycTBfb3ZlcnJpZGUoKTsKKyAgICBhY3Bp X2NvbmYtPm51bWFfbm9kZXMgPSBuYl9udW1hX25vZGVzOworICAgIGFjcGlfY29uZi0+bm9kZV9t ZW0gPSBnX21hbGxvYzAoYWNwaV9jb25mLT5udW1hX25vZGVzICoKKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHNpemVvZiAqYWNwaV9jb25mLT5ub2RlX21lbSk7CiAgICAgZm9y IChpID0gMDsgaSA8IG5iX251bWFfbm9kZXM7IGkrKykgewotICAgICAgICBwY21zLT5ub2RlX21l bVtpXSA9IG51bWFfaW5mb1tpXS5ub2RlX21lbTsKKyAgICAgICAgYWNwaV9jb25mLT5ub2RlX21l bVtpXSA9IG51bWFfaW5mb1tpXS5ub2RlX21lbTsKICAgICB9CiAKICAgICBwY21zLT5tYWNoaW5l X2RvbmUubm90aWZ5ID0gcGNfbWFjaGluZV9kb25lOwpAQCAtMTMyMyw3ICsxMzUwLDcgQEAgdm9p ZCB4ZW5fbG9hZF9saW51eChQQ01hY2hpbmVTdGF0ZSAqcGNtcykKICAgICAgICAgICAgICAgICFz dHJjbXAob3B0aW9uX3JvbVtpXS5uYW1lLCAibXVsdGlib290LmJpbiIpKTsKICAgICAgICAgcm9t X2FkZF9vcHRpb24ob3B0aW9uX3JvbVtpXS5uYW1lLCBvcHRpb25fcm9tW2ldLmJvb3RpbmRleCk7 CiAgICAgfQotICAgIHBjbXMtPmZ3X2NmZyA9IGZ3X2NmZzsKKyAgICBwY21zLT5hY3BpX2NvbmZp Z3VyYXRpb24uZndfY2ZnID0gZndfY2ZnOwogfQogCiB2b2lkIHBjX21lbW9yeV9pbml0KFBDTWFj aGluZVN0YXRlICpwY21zLApAQCAtMTMzNyw5ICsxMzY0LDEwIEBAIHZvaWQgcGNfbWVtb3J5X2lu aXQoUENNYWNoaW5lU3RhdGUgKnBjbXMsCiAgICAgRldDZmdTdGF0ZSAqZndfY2ZnOwogICAgIE1h Y2hpbmVTdGF0ZSAqbWFjaGluZSA9IE1BQ0hJTkUocGNtcyk7CiAgICAgUENNYWNoaW5lQ2xhc3Mg KnBjbWMgPSBQQ19NQUNISU5FX0dFVF9DTEFTUyhwY21zKTsKKyAgICBBY3BpQ29uZmlndXJhdGlv biAqYWNwaV9jb25mID0gJnBjbXMtPmFjcGlfY29uZmlndXJhdGlvbjsKIAotICAgIGFzc2VydCht YWNoaW5lLT5yYW1fc2l6ZSA9PSBwY21zLT5iZWxvd180Z19tZW1fc2l6ZSArCi0gICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHBjbXMtPmFib3ZlXzRnX21lbV9zaXplKTsKKyAgICBhc3Nl cnQobWFjaGluZS0+cmFtX3NpemUgPT0gYWNwaV9jb25mLT5iZWxvd180Z19tZW1fc2l6ZSArCisg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjcGlfY29uZi0+YWJvdmVfNGdfbWVtX3Np emUpOwogCiAgICAgbGludXhfYm9vdCA9IChtYWNoaW5lLT5rZXJuZWxfZmlsZW5hbWUgIT0gTlVM TCk7CiAKQEAgLTEzNTMsMTcgKzEzODEsMTcgQEAgdm9pZCBwY19tZW1vcnlfaW5pdChQQ01hY2hp bmVTdGF0ZSAqcGNtcywKICAgICAqcmFtX21lbW9yeSA9IHJhbTsKICAgICByYW1fYmVsb3dfNGcg PSBnX21hbGxvYyhzaXplb2YoKnJhbV9iZWxvd180ZykpOwogICAgIG1lbW9yeV9yZWdpb25faW5p dF9hbGlhcyhyYW1fYmVsb3dfNGcsIE5VTEwsICJyYW0tYmVsb3ctNGciLCByYW0sCi0gICAgICAg ICAgICAgICAgICAgICAgICAgICAgIDAsIHBjbXMtPmJlbG93XzRnX21lbV9zaXplKTsKKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgMCwgYWNwaV9jb25mLT5iZWxvd180Z19tZW1fc2l6ZSk7 CiAgICAgbWVtb3J5X3JlZ2lvbl9hZGRfc3VicmVnaW9uKHN5c3RlbV9tZW1vcnksIDAsIHJhbV9i ZWxvd180Zyk7Ci0gICAgZTgyMF9hZGRfZW50cnkoMCwgcGNtcy0+YmVsb3dfNGdfbWVtX3NpemUs IEU4MjBfUkFNKTsKLSAgICBpZiAocGNtcy0+YWJvdmVfNGdfbWVtX3NpemUgPiAwKSB7CisgICAg ZTgyMF9hZGRfZW50cnkoMCwgYWNwaV9jb25mLT5iZWxvd180Z19tZW1fc2l6ZSwgRTgyMF9SQU0p OworICAgIGlmIChhY3BpX2NvbmYtPmFib3ZlXzRnX21lbV9zaXplID4gMCkgewogICAgICAgICBy YW1fYWJvdmVfNGcgPSBnX21hbGxvYyhzaXplb2YoKnJhbV9hYm92ZV80ZykpOwogICAgICAgICBt ZW1vcnlfcmVnaW9uX2luaXRfYWxpYXMocmFtX2Fib3ZlXzRnLCBOVUxMLCAicmFtLWFib3ZlLTRn IiwgcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGNtcy0+YmVsb3dfNGdf bWVtX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwY21zLT5hYm92ZV80 Z19tZW1fc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3BpX2NvbmYt PmJlbG93XzRnX21lbV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNw aV9jb25mLT5hYm92ZV80Z19tZW1fc2l6ZSk7CiAgICAgICAgIG1lbW9yeV9yZWdpb25fYWRkX3N1 YnJlZ2lvbihzeXN0ZW1fbWVtb3J5LCAweDEwMDAwMDAwMFVMTCwKICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHJhbV9hYm92ZV80Zyk7Ci0gICAgICAgIGU4MjBfYWRkX2VudHJ5 KDB4MTAwMDAwMDAwVUxMLCBwY21zLT5hYm92ZV80Z19tZW1fc2l6ZSwgRTgyMF9SQU0pOworICAg ICAgICBlODIwX2FkZF9lbnRyeSgweDEwMDAwMDAwMFVMTCwgYWNwaV9jb25mLT5hYm92ZV80Z19t ZW1fc2l6ZSwgRTgyMF9SQU0pOwogICAgIH0KIAogICAgIGlmICghcGNtYy0+aGFzX3Jlc2VydmVk X21lbW9yeSAmJgpAQCAtMTM5OCw3ICsxNDI2LDcgQEAgdm9pZCBwY19tZW1vcnlfaW5pdChQQ01h Y2hpbmVTdGF0ZSAqcGNtcywKICAgICAgICAgfQogCiAgICAgICAgIG1hY2hpbmUtPmRldmljZV9t ZW1vcnktPmJhc2UgPQotICAgICAgICAgICAgUk9VTkRfVVAoMHgxMDAwMDAwMDBVTEwgKyBwY21z LT5hYm92ZV80Z19tZW1fc2l6ZSwgMSAqIEdpQik7CisgICAgICAgICAgICBST1VORF9VUCgweDEw MDAwMDAwMFVMTCArIGFjcGlfY29uZi0+YWJvdmVfNGdfbWVtX3NpemUsIDEgKiBHaUIpOwogCiAg ICAgICAgIGlmIChwY21jLT5lbmZvcmNlX2FsaWduZWRfZGltbSkgewogICAgICAgICAgICAgLyog c2l6ZSBkZXZpY2UgcmVnaW9uIGFzc3VtaW5nIDFHIHBhZ2UgbWF4IGFsaWdubWVudCBwZXIgc2xv dCAqLwpAQCAtMTQ1NSw3ICsxNDgzLDcgQEAgdm9pZCBwY19tZW1vcnlfaW5pdChQQ01hY2hpbmVT dGF0ZSAqcGNtcywKICAgICBmb3IgKGkgPSAwOyBpIDwgbmJfb3B0aW9uX3JvbXM7IGkrKykgewog ICAgICAgICByb21fYWRkX29wdGlvbihvcHRpb25fcm9tW2ldLm5hbWUsIG9wdGlvbl9yb21baV0u Ym9vdGluZGV4KTsKICAgICB9Ci0gICAgcGNtcy0+ZndfY2ZnID0gZndfY2ZnOworICAgIGFjcGlf Y29uZi0+ZndfY2ZnID0gZndfY2ZnOwogCiAgICAgLyogSW5pdCBkZWZhdWx0IElPQVBJQyBhZGRy ZXNzIHNwYWNlICovCiAgICAgcGNtcy0+aW9hcGljX2FzID0gJmFkZHJlc3Nfc3BhY2VfbWVtb3J5 OwpAQCAtMTQ3OCw3ICsxNTA2LDggQEAgdWludDY0X3QgcGNfcGNpX2hvbGU2NF9zdGFydCh2b2lk KQogICAgICAgICAgICAgaG9sZTY0X3N0YXJ0ICs9IG1lbW9yeV9yZWdpb25fc2l6ZSgmbXMtPmRl dmljZV9tZW1vcnktPm1yKTsKICAgICAgICAgfQogICAgIH0gZWxzZSB7Ci0gICAgICAgIGhvbGU2 NF9zdGFydCA9IDB4MTAwMDAwMDAwVUxMICsgcGNtcy0+YWJvdmVfNGdfbWVtX3NpemU7CisgICAg ICAgIGhvbGU2NF9zdGFydCA9CisgICAgICAgICAgICAweDEwMDAwMDAwMFVMTCArIHBjbXMtPmFj cGlfY29uZmlndXJhdGlvbi5hYm92ZV80Z19tZW1fc2l6ZTsKICAgICB9CiAKICAgICByZXR1cm4g Uk9VTkRfVVAoaG9sZTY0X3N0YXJ0LCAxICogR2lCKTsKQEAgLTE2ODUsMjEgKzE3MTQsMjIgQEAg c3RhdGljIHZvaWQgcGNfbWVtb3J5X3ByZV9wbHVnKEhvdHBsdWdIYW5kbGVyICpob3RwbHVnX2Rl diwgRGV2aWNlU3RhdGUgKmRldiwKIHsKICAgICBjb25zdCBQQ01hY2hpbmVTdGF0ZSAqcGNtcyA9 IFBDX01BQ0hJTkUoaG90cGx1Z19kZXYpOwogICAgIGNvbnN0IFBDTWFjaGluZUNsYXNzICpwY21j ID0gUENfTUFDSElORV9HRVRfQ0xBU1MocGNtcyk7CisgICAgY29uc3QgQWNwaUNvbmZpZ3VyYXRp b24gKmFjcGlfY29uZiA9ICZwY21zLT5hY3BpX2NvbmZpZ3VyYXRpb247CiAgICAgY29uc3QgYm9v bCBpc19udmRpbW0gPSBvYmplY3RfZHluYW1pY19jYXN0KE9CSkVDVChkZXYpLCBUWVBFX05WRElN TSk7CiAgICAgY29uc3QgdWludDY0X3QgbGVnYWN5X2FsaWduID0gVEFSR0VUX1BBR0VfU0laRTsK IAogICAgIC8qCiAgICAgICogV2hlbiAtbm8tYWNwaSBpcyB1c2VkIHdpdGggUTM1IG1hY2hpbmUg dHlwZSwgbm8gQUNQSSBpcyBidWlsdCwKLSAgICAgKiBidXQgcGNtcy0+YWNwaV9kZXYgaXMgc3Rp bGwgY3JlYXRlZC4gQ2hlY2sgIWFjcGlfZW5hYmxlZCBpbgorICAgICAqIGJ1dCBhY3BpX2RldiBp cyBzdGlsbCBjcmVhdGVkLiBDaGVjayAhYWNwaV9lbmFibGVkIGluCiAgICAgICogYWRkaXRpb24g dG8gY292ZXIgdGhpcyBjYXNlLgogICAgICAqLwotICAgIGlmICghcGNtcy0+YWNwaV9kZXYgfHwg IWFjcGlfZW5hYmxlZCkgeworICAgIGlmICghYWNwaV9jb25mLT5hY3BpX2RldiB8fCAhYWNwaV9l bmFibGVkKSB7CiAgICAgICAgIGVycm9yX3NldGcoZXJycCwKICAgICAgICAgICAgICAgICAgICAi bWVtb3J5IGhvdHBsdWcgaXMgbm90IGVuYWJsZWQ6IG1pc3NpbmcgYWNwaSBkZXZpY2Ugb3IgYWNw aSBkaXNhYmxlZCIpOwogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgaWYgKGlzX252ZGlt bSAmJiAhcGNtcy0+YWNwaV9udmRpbW1fc3RhdGUuaXNfZW5hYmxlZCkgeworICAgIGlmIChpc19u dmRpbW0gJiYgIWFjcGlfY29uZi0+YWNwaV9udmRpbW1fc3RhdGUuaXNfZW5hYmxlZCkgewogICAg ICAgICBlcnJvcl9zZXRnKGVycnAsICJudmRpbW0gaXMgbm90IGVuYWJsZWQ6IG1pc3NpbmcgJ252 ZGltbScgaW4gJy1NJyIpOwogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtMTcxNSw2ICsxNzQ1 LDcgQEAgc3RhdGljIHZvaWQgcGNfbWVtb3J5X3BsdWcoSG90cGx1Z0hhbmRsZXIgKmhvdHBsdWdf ZGV2LAogICAgIEVycm9yICpsb2NhbF9lcnIgPSBOVUxMOwogICAgIFBDTWFjaGluZVN0YXRlICpw Y21zID0gUENfTUFDSElORShob3RwbHVnX2Rldik7CiAgICAgYm9vbCBpc19udmRpbW0gPSBvYmpl Y3RfZHluYW1pY19jYXN0KE9CSkVDVChkZXYpLCBUWVBFX05WRElNTSk7CisgICAgQWNwaUNvbmZp Z3VyYXRpb24gKmFjcGlfY29uZiA9ICZwY21zLT5hY3BpX2NvbmZpZ3VyYXRpb247CiAKICAgICBw Y19kaW1tX3BsdWcoUENfRElNTShkZXYpLCBNQUNISU5FKHBjbXMpLCAmbG9jYWxfZXJyKTsKICAg ICBpZiAobG9jYWxfZXJyKSB7CkBAIC0xNzIyLDExICsxNzUzLDExIEBAIHN0YXRpYyB2b2lkIHBj X21lbW9yeV9wbHVnKEhvdHBsdWdIYW5kbGVyICpob3RwbHVnX2RldiwKICAgICB9CiAKICAgICBp ZiAoaXNfbnZkaW1tKSB7Ci0gICAgICAgIG52ZGltbV9wbHVnKCZwY21zLT5hY3BpX252ZGltbV9z dGF0ZSk7CisgICAgICAgIG52ZGltbV9wbHVnKCZhY3BpX2NvbmYtPmFjcGlfbnZkaW1tX3N0YXRl KTsKICAgICB9CiAKLSAgICBoaGMgPSBIT1RQTFVHX0hBTkRMRVJfR0VUX0NMQVNTKHBjbXMtPmFj cGlfZGV2KTsKLSAgICBoaGMtPnBsdWcoSE9UUExVR19IQU5ETEVSKHBjbXMtPmFjcGlfZGV2KSwg ZGV2LCAmZXJyb3JfYWJvcnQpOworICAgIGhoYyA9IEhPVFBMVUdfSEFORExFUl9HRVRfQ0xBU1Mo YWNwaV9jb25mLT5hY3BpX2Rldik7CisgICAgaGhjLT5wbHVnKEhPVFBMVUdfSEFORExFUihhY3Bp X2NvbmYtPmFjcGlfZGV2KSwgZGV2LCAmZXJyb3JfYWJvcnQpOwogb3V0OgogICAgIGVycm9yX3By b3BhZ2F0ZShlcnJwLCBsb2NhbF9lcnIpOwogfQpAQCAtMTczNywxMyArMTc2OCwxNCBAQCBzdGF0 aWMgdm9pZCBwY19tZW1vcnlfdW5wbHVnX3JlcXVlc3QoSG90cGx1Z0hhbmRsZXIgKmhvdHBsdWdf ZGV2LAogICAgIEhvdHBsdWdIYW5kbGVyQ2xhc3MgKmhoYzsKICAgICBFcnJvciAqbG9jYWxfZXJy ID0gTlVMTDsKICAgICBQQ01hY2hpbmVTdGF0ZSAqcGNtcyA9IFBDX01BQ0hJTkUoaG90cGx1Z19k ZXYpOworICAgIEFjcGlDb25maWd1cmF0aW9uICphY3BpX2NvbmYgPSAmcGNtcy0+YWNwaV9jb25m aWd1cmF0aW9uOwogCiAgICAgLyoKICAgICAgKiBXaGVuIC1uby1hY3BpIGlzIHVzZWQgd2l0aCBR MzUgbWFjaGluZSB0eXBlLCBubyBBQ1BJIGlzIGJ1aWx0LAotICAgICAqIGJ1dCBwY21zLT5hY3Bp X2RldiBpcyBzdGlsbCBjcmVhdGVkLiBDaGVjayAhYWNwaV9lbmFibGVkIGluCisgICAgICogYnV0 IGFjcGlfZGV2IGlzIHN0aWxsIGNyZWF0ZWQuIENoZWNrICFhY3BpX2VuYWJsZWQgaW4KICAgICAg KiBhZGRpdGlvbiB0byBjb3ZlciB0aGlzIGNhc2UuCiAgICAgICovCi0gICAgaWYgKCFwY21zLT5h Y3BpX2RldiB8fCAhYWNwaV9lbmFibGVkKSB7CisgICAgaWYgKCFhY3BpX2NvbmYtPmFjcGlfZGV2 IHx8ICFhY3BpX2VuYWJsZWQpIHsKICAgICAgICAgZXJyb3Jfc2V0ZygmbG9jYWxfZXJyLAogICAg ICAgICAgICAgICAgICAgICJtZW1vcnkgaG90cGx1ZyBpcyBub3QgZW5hYmxlZDogbWlzc2luZyBh Y3BpIGRldmljZSBvciBhY3BpIGRpc2FibGVkIik7CiAgICAgICAgIGdvdG8gb3V0OwpAQCAtMTc1 NSw4ICsxNzg3LDggQEAgc3RhdGljIHZvaWQgcGNfbWVtb3J5X3VucGx1Z19yZXF1ZXN0KEhvdHBs dWdIYW5kbGVyICpob3RwbHVnX2RldiwKICAgICAgICAgZ290byBvdXQ7CiAgICAgfQogCi0gICAg aGhjID0gSE9UUExVR19IQU5ETEVSX0dFVF9DTEFTUyhwY21zLT5hY3BpX2Rldik7Ci0gICAgaGhj LT51bnBsdWdfcmVxdWVzdChIT1RQTFVHX0hBTkRMRVIocGNtcy0+YWNwaV9kZXYpLCBkZXYsICZs b2NhbF9lcnIpOworICAgIGhoYyA9IEhPVFBMVUdfSEFORExFUl9HRVRfQ0xBU1MoYWNwaV9jb25m LT5hY3BpX2Rldik7CisgICAgaGhjLT51bnBsdWdfcmVxdWVzdChIT1RQTFVHX0hBTkRMRVIoYWNw aV9jb25mLT5hY3BpX2RldiksIGRldiwgJmxvY2FsX2Vycik7CiAKIG91dDoKICAgICBlcnJvcl9w cm9wYWdhdGUoZXJycCwgbG9jYWxfZXJyKTsKQEAgLTE3NjYsMTEgKzE3OTgsMTIgQEAgc3RhdGlj IHZvaWQgcGNfbWVtb3J5X3VucGx1ZyhIb3RwbHVnSGFuZGxlciAqaG90cGx1Z19kZXYsCiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIERldmljZVN0YXRlICpkZXYsIEVycm9yICoqZXJycCkK IHsKICAgICBQQ01hY2hpbmVTdGF0ZSAqcGNtcyA9IFBDX01BQ0hJTkUoaG90cGx1Z19kZXYpOwor ICAgIEFjcGlDb25maWd1cmF0aW9uICphY3BpX2NvbmYgPSAmcGNtcy0+YWNwaV9jb25maWd1cmF0 aW9uOwogICAgIEhvdHBsdWdIYW5kbGVyQ2xhc3MgKmhoYzsKICAgICBFcnJvciAqbG9jYWxfZXJy ID0gTlVMTDsKIAotICAgIGhoYyA9IEhPVFBMVUdfSEFORExFUl9HRVRfQ0xBU1MocGNtcy0+YWNw aV9kZXYpOwotICAgIGhoYy0+dW5wbHVnKEhPVFBMVUdfSEFORExFUihwY21zLT5hY3BpX2Rldiks IGRldiwgJmxvY2FsX2Vycik7CisgICAgaGhjID0gSE9UUExVR19IQU5ETEVSX0dFVF9DTEFTUyhh Y3BpX2NvbmYtPmFjcGlfZGV2KTsKKyAgICBoaGMtPnVucGx1ZyhIT1RQTFVHX0hBTkRMRVIoYWNw aV9jb25mLT5hY3BpX2RldiksIGRldiwgJmxvY2FsX2Vycik7CiAKICAgICBpZiAobG9jYWxfZXJy KSB7CiAgICAgICAgIGdvdG8gb3V0OwpAQCAtMTgxNywxMCArMTg1MCwxMSBAQCBzdGF0aWMgdm9p ZCBwY19jcHVfcGx1ZyhIb3RwbHVnSGFuZGxlciAqaG90cGx1Z19kZXYsCiAgICAgRXJyb3IgKmxv Y2FsX2VyciA9IE5VTEw7CiAgICAgWDg2Q1BVICpjcHUgPSBYODZfQ1BVKGRldik7CiAgICAgUENN YWNoaW5lU3RhdGUgKnBjbXMgPSBQQ19NQUNISU5FKGhvdHBsdWdfZGV2KTsKKyAgICBBY3BpQ29u ZmlndXJhdGlvbiAqYWNwaV9jb25mID0gJnBjbXMtPmFjcGlfY29uZmlndXJhdGlvbjsKIAotICAg IGlmIChwY21zLT5hY3BpX2RldikgewotICAgICAgICBoaGMgPSBIT1RQTFVHX0hBTkRMRVJfR0VU X0NMQVNTKHBjbXMtPmFjcGlfZGV2KTsKLSAgICAgICAgaGhjLT5wbHVnKEhPVFBMVUdfSEFORExF UihwY21zLT5hY3BpX2RldiksIGRldiwgJmxvY2FsX2Vycik7CisgICAgaWYgKGFjcGlfY29uZi0+ YWNwaV9kZXYpIHsKKyAgICAgICAgaGhjID0gSE9UUExVR19IQU5ETEVSX0dFVF9DTEFTUyhhY3Bp X2NvbmYtPmFjcGlfZGV2KTsKKyAgICAgICAgaGhjLT5wbHVnKEhPVFBMVUdfSEFORExFUihhY3Bp X2NvbmYtPmFjcGlfZGV2KSwgZGV2LCAmbG9jYWxfZXJyKTsKICAgICAgICAgaWYgKGxvY2FsX2Vy cikgewogICAgICAgICAgICAgZ290byBvdXQ7CiAgICAgICAgIH0KQEAgLTE4MzEsOCArMTg2NSw4 IEBAIHN0YXRpYyB2b2lkIHBjX2NwdV9wbHVnKEhvdHBsdWdIYW5kbGVyICpob3RwbHVnX2RldiwK ICAgICBpZiAocGNtcy0+cnRjKSB7CiAgICAgICAgIHJ0Y19zZXRfY3B1c19jb3VudChwY21zLT5y dGMsIHBjbXMtPmJvb3RfY3B1cyk7CiAgICAgfQotICAgIGlmIChwY21zLT5md19jZmcpIHsKLSAg ICAgICAgZndfY2ZnX21vZGlmeV9pMTYocGNtcy0+ZndfY2ZnLCBGV19DRkdfTkJfQ1BVUywgcGNt cy0+Ym9vdF9jcHVzKTsKKyAgICBpZiAoYWNwaV9jb25mLT5md19jZmcpIHsKKyAgICAgICAgZndf Y2ZnX21vZGlmeV9pMTYoYWNwaV9jb25mLT5md19jZmcsIEZXX0NGR19OQl9DUFVTLCBwY21zLT5i b290X2NwdXMpOwogICAgIH0KIAogICAgIGZvdW5kX2NwdSA9IHBjX2ZpbmRfY3B1X3Nsb3QoTUFD SElORShwY21zKSwgY3B1LT5hcGljX2lkLCBOVUxMKTsKQEAgLTE4NDgsOCArMTg4Miw5IEBAIHN0 YXRpYyB2b2lkIHBjX2NwdV91bnBsdWdfcmVxdWVzdF9jYihIb3RwbHVnSGFuZGxlciAqaG90cGx1 Z19kZXYsCiAgICAgRXJyb3IgKmxvY2FsX2VyciA9IE5VTEw7CiAgICAgWDg2Q1BVICpjcHUgPSBY ODZfQ1BVKGRldik7CiAgICAgUENNYWNoaW5lU3RhdGUgKnBjbXMgPSBQQ19NQUNISU5FKGhvdHBs dWdfZGV2KTsKKyAgICBBY3BpQ29uZmlndXJhdGlvbiAqYWNwaV9jb25mID0gJnBjbXMtPmFjcGlf Y29uZmlndXJhdGlvbjsKIAotICAgIGlmICghcGNtcy0+YWNwaV9kZXYpIHsKKyAgICBpZiAoIWFj cGlfY29uZi0+YWNwaV9kZXYpIHsKICAgICAgICAgZXJyb3Jfc2V0ZygmbG9jYWxfZXJyLCAiQ1BV IGhvdCB1bnBsdWcgbm90IHN1cHBvcnRlZCB3aXRob3V0IEFDUEkiKTsKICAgICAgICAgZ290byBv dXQ7CiAgICAgfQpAQCAtMTg2MSw4ICsxODk2LDggQEAgc3RhdGljIHZvaWQgcGNfY3B1X3VucGx1 Z19yZXF1ZXN0X2NiKEhvdHBsdWdIYW5kbGVyICpob3RwbHVnX2RldiwKICAgICAgICAgZ290byBv dXQ7CiAgICAgfQogCi0gICAgaGhjID0gSE9UUExVR19IQU5ETEVSX0dFVF9DTEFTUyhwY21zLT5h Y3BpX2Rldik7Ci0gICAgaGhjLT51bnBsdWdfcmVxdWVzdChIT1RQTFVHX0hBTkRMRVIocGNtcy0+ YWNwaV9kZXYpLCBkZXYsICZsb2NhbF9lcnIpOworICAgIGhoYyA9IEhPVFBMVUdfSEFORExFUl9H RVRfQ0xBU1MoYWNwaV9jb25mLT5hY3BpX2Rldik7CisgICAgaGhjLT51bnBsdWdfcmVxdWVzdChI T1RQTFVHX0hBTkRMRVIoYWNwaV9jb25mLT5hY3BpX2RldiksIGRldiwgJmxvY2FsX2Vycik7CiAK ICAgICBpZiAobG9jYWxfZXJyKSB7CiAgICAgICAgIGdvdG8gb3V0OwpAQCAtMTg4MSw5ICsxOTE2 LDEwIEBAIHN0YXRpYyB2b2lkIHBjX2NwdV91bnBsdWdfY2IoSG90cGx1Z0hhbmRsZXIgKmhvdHBs dWdfZGV2LAogICAgIEVycm9yICpsb2NhbF9lcnIgPSBOVUxMOwogICAgIFg4NkNQVSAqY3B1ID0g WDg2X0NQVShkZXYpOwogICAgIFBDTWFjaGluZVN0YXRlICpwY21zID0gUENfTUFDSElORShob3Rw bHVnX2Rldik7CisgICAgQWNwaUNvbmZpZ3VyYXRpb24gKmFjcGlfY29uZiA9ICZwY21zLT5hY3Bp X2NvbmZpZ3VyYXRpb247CiAKLSAgICBoaGMgPSBIT1RQTFVHX0hBTkRMRVJfR0VUX0NMQVNTKHBj bXMtPmFjcGlfZGV2KTsKLSAgICBoaGMtPnVucGx1ZyhIT1RQTFVHX0hBTkRMRVIocGNtcy0+YWNw aV9kZXYpLCBkZXYsICZsb2NhbF9lcnIpOworICAgIGhoYyA9IEhPVFBMVUdfSEFORExFUl9HRVRf Q0xBU1MoYWNwaV9jb25mLT5hY3BpX2Rldik7CisgICAgaGhjLT51bnBsdWcoSE9UUExVR19IQU5E TEVSKGFjcGlfY29uZi0+YWNwaV9kZXYpLCBkZXYsICZsb2NhbF9lcnIpOwogCiAgICAgaWYgKGxv Y2FsX2VycikgewogICAgICAgICBnb3RvIG91dDsKQEAgLTE4OTcsNyArMTkzMyw3IEBAIHN0YXRp YyB2b2lkIHBjX2NwdV91bnBsdWdfY2IoSG90cGx1Z0hhbmRsZXIgKmhvdHBsdWdfZGV2LAogICAg IHBjbXMtPmJvb3RfY3B1cy0tOwogICAgIC8qIFVwZGF0ZSB0aGUgbnVtYmVyIG9mIENQVXMgaW4g Q01PUyAqLwogICAgIHJ0Y19zZXRfY3B1c19jb3VudChwY21zLT5ydGMsIHBjbXMtPmJvb3RfY3B1 cyk7Ci0gICAgZndfY2ZnX21vZGlmeV9pMTYocGNtcy0+ZndfY2ZnLCBGV19DRkdfTkJfQ1BVUywg cGNtcy0+Ym9vdF9jcHVzKTsKKyAgICBmd19jZmdfbW9kaWZ5X2kxNihhY3BpX2NvbmYtPmZ3X2Nm ZywgRldfQ0ZHX05CX0NQVVMsIHBjbXMtPmJvb3RfY3B1cyk7CiAgb3V0OgogICAgIGVycm9yX3By b3BhZ2F0ZShlcnJwLCBsb2NhbF9lcnIpOwogfQpAQCAtMjE4MSwyOCArMjIxNywzMCBAQCBzdGF0 aWMgYm9vbCBwY19tYWNoaW5lX2dldF9udmRpbW0oT2JqZWN0ICpvYmosIEVycm9yICoqZXJycCkK IHsKICAgICBQQ01hY2hpbmVTdGF0ZSAqcGNtcyA9IFBDX01BQ0hJTkUob2JqKTsKIAotICAgIHJl dHVybiBwY21zLT5hY3BpX252ZGltbV9zdGF0ZS5pc19lbmFibGVkOworICAgIHJldHVybiBwY21z LT5hY3BpX2NvbmZpZ3VyYXRpb24uYWNwaV9udmRpbW1fc3RhdGUuaXNfZW5hYmxlZDsKIH0KIAog c3RhdGljIHZvaWQgcGNfbWFjaGluZV9zZXRfbnZkaW1tKE9iamVjdCAqb2JqLCBib29sIHZhbHVl LCBFcnJvciAqKmVycnApCiB7CiAgICAgUENNYWNoaW5lU3RhdGUgKnBjbXMgPSBQQ19NQUNISU5F KG9iaik7CisgICAgQWNwaUNvbmZpZ3VyYXRpb24gKmFjcGlfY29uZiA9ICZwY21zLT5hY3BpX2Nv bmZpZ3VyYXRpb247CiAKLSAgICBwY21zLT5hY3BpX252ZGltbV9zdGF0ZS5pc19lbmFibGVkID0g dmFsdWU7CisgICAgYWNwaV9jb25mLT5hY3BpX252ZGltbV9zdGF0ZS5pc19lbmFibGVkID0gdmFs dWU7CiB9CiAKIHN0YXRpYyBjaGFyICpwY19tYWNoaW5lX2dldF9udmRpbW1fcGVyc2lzdGVuY2Uo T2JqZWN0ICpvYmosIEVycm9yICoqZXJycCkKIHsKICAgICBQQ01hY2hpbmVTdGF0ZSAqcGNtcyA9 IFBDX01BQ0hJTkUob2JqKTsKKyAgICBBY3BpQ29uZmlndXJhdGlvbiAqYWNwaV9jb25mID0gJnBj bXMtPmFjcGlfY29uZmlndXJhdGlvbjsKIAotICAgIHJldHVybiBnX3N0cmR1cChwY21zLT5hY3Bp X252ZGltbV9zdGF0ZS5wZXJzaXN0ZW5jZV9zdHJpbmcpOworICAgIHJldHVybiBnX3N0cmR1cChh Y3BpX2NvbmYtPmFjcGlfbnZkaW1tX3N0YXRlLnBlcnNpc3RlbmNlX3N0cmluZyk7CiB9CiAKIHN0 YXRpYyB2b2lkIHBjX21hY2hpbmVfc2V0X252ZGltbV9wZXJzaXN0ZW5jZShPYmplY3QgKm9iaiwg Y29uc3QgY2hhciAqdmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIEVycm9yICoqZXJycCkKIHsKICAgICBQQ01hY2hpbmVTdGF0ZSAqcGNtcyA9IFBD X01BQ0hJTkUob2JqKTsKLSAgICBBY3BpTlZESU1NU3RhdGUgKm52ZGltbV9zdGF0ZSA9ICZwY21z LT5hY3BpX252ZGltbV9zdGF0ZTsKKyAgICBBY3BpTlZESU1NU3RhdGUgKm52ZGltbV9zdGF0ZSA9 ICZwY21zLT5hY3BpX2NvbmZpZ3VyYXRpb24uYWNwaV9udmRpbW1fc3RhdGU7CiAKICAgICBpZiAo c3RyY21wKHZhbHVlLCAiY3B1IikgPT0gMCkKICAgICAgICAgbnZkaW1tX3N0YXRlLT5wZXJzaXN0 ZW5jZSA9IDM7CkBAIC0yMjY4LDcgKzIzMDYsNyBAQCBzdGF0aWMgdm9pZCBwY19tYWNoaW5lX2lu aXRmbihPYmplY3QgKm9iaikKICAgICBwY21zLT5zbW0gPSBPTl9PRkZfQVVUT19BVVRPOwogICAg IHBjbXMtPnZtcG9ydCA9IE9OX09GRl9BVVRPX0FVVE87CiAgICAgLyogbnZkaW1tIGlzIGRpc2Fi bGVkIG9uIGRlZmF1bHQuICovCi0gICAgcGNtcy0+YWNwaV9udmRpbW1fc3RhdGUuaXNfZW5hYmxl ZCA9IGZhbHNlOworICAgIHBjbXMtPmFjcGlfY29uZmlndXJhdGlvbi5hY3BpX252ZGltbV9zdGF0 ZS5pc19lbmFibGVkID0gZmFsc2U7CiAgICAgLyogYWNwaSBidWlsZCBpcyBlbmFibGVkIGJ5IGRl ZmF1bHQgaWYgbWFjaGluZSBzdXBwb3J0cyBpdCAqLwogICAgIHBjbXMtPmFjcGlfYnVpbGRfZW5h YmxlZCA9IFBDX01BQ0hJTkVfR0VUX0NMQVNTKHBjbXMpLT5oYXNfYWNwaV9idWlsZDsKICAgICBw Y21zLT5zbWJ1cyA9IHRydWU7CmRpZmYgLS1naXQgYS9ody9pMzg2L3BjX3BpaXguYyBiL2h3L2kz ODYvcGNfcGlpeC5jCmluZGV4IGRjMDk0NjZiM2UuLjA2MjBkMTA3MTUgMTAwNjQ0Ci0tLSBhL2h3 L2kzODYvcGNfcGlpeC5jCisrKyBiL2h3L2kzODYvcGNfcGlpeC5jCkBAIC03MSw2ICs3MSw3IEBA IHN0YXRpYyB2b2lkIHBjX2luaXQxKE1hY2hpbmVTdGF0ZSAqbWFjaGluZSwKIHsKICAgICBQQ01h Y2hpbmVTdGF0ZSAqcGNtcyA9IFBDX01BQ0hJTkUobWFjaGluZSk7CiAgICAgUENNYWNoaW5lQ2xh c3MgKnBjbWMgPSBQQ19NQUNISU5FX0dFVF9DTEFTUyhwY21zKTsKKyAgICBBY3BpQ29uZmlndXJh dGlvbiAqYWNwaV9jb25mID0gJnBjbXMtPmFjcGlfY29uZmlndXJhdGlvbjsKICAgICBNZW1vcnlS ZWdpb24gKnN5c3RlbV9tZW1vcnkgPSBnZXRfc3lzdGVtX21lbW9yeSgpOwogICAgIE1lbW9yeVJl Z2lvbiAqc3lzdGVtX2lvID0gZ2V0X3N5c3RlbV9pbygpOwogICAgIGludCBpOwpAQCAtMTQyLDEx ICsxNDMsMTEgQEAgc3RhdGljIHZvaWQgcGNfaW5pdDEoTWFjaGluZVN0YXRlICptYWNoaW5lLAog ICAgICAgICB9CiAKICAgICAgICAgaWYgKG1hY2hpbmUtPnJhbV9zaXplID49IGxvd21lbSkgewot ICAgICAgICAgICAgcGNtcy0+YWJvdmVfNGdfbWVtX3NpemUgPSBtYWNoaW5lLT5yYW1fc2l6ZSAt IGxvd21lbTsKLSAgICAgICAgICAgIHBjbXMtPmJlbG93XzRnX21lbV9zaXplID0gbG93bWVtOwor ICAgICAgICAgICAgYWNwaV9jb25mLT5hYm92ZV80Z19tZW1fc2l6ZSA9IG1hY2hpbmUtPnJhbV9z aXplIC0gbG93bWVtOworICAgICAgICAgICAgYWNwaV9jb25mLT5iZWxvd180Z19tZW1fc2l6ZSA9 IGxvd21lbTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHBjbXMtPmFib3ZlXzRnX21l bV9zaXplID0gMDsKLSAgICAgICAgICAgIHBjbXMtPmJlbG93XzRnX21lbV9zaXplID0gbWFjaGlu ZS0+cmFtX3NpemU7CisgICAgICAgICAgICBhY3BpX2NvbmYtPmFib3ZlXzRnX21lbV9zaXplID0g MDsKKyAgICAgICAgICAgIGFjcGlfY29uZi0+YmVsb3dfNGdfbWVtX3NpemUgPSBtYWNoaW5lLT5y YW1fc2l6ZTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTk5LDggKzIwMCw4IEBAIHN0YXRpYyB2 b2lkIHBjX2luaXQxKE1hY2hpbmVTdGF0ZSAqbWFjaGluZSwKICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHBjaV90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmk0NDBm eF9zdGF0ZSwgJnBpaXgzX2RldmZuLCAmaXNhX2J1cywgcGNtcy0+Z3NpLAogICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgc3lzdGVtX21lbW9yeSwgc3lzdGVtX2lvLCBtYWNoaW5lLT5yYW1f c2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBjbXMtPmJlbG93XzRnX21lbV9z aXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGNtcy0+YWJvdmVfNGdfbWVtX3Np emUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3BpX2NvbmYtPmJlbG93XzRnX21l bV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNwaV9jb25mLT5hYm92ZV80 Z19tZW1fc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBjaV9tZW1vcnksIHJh bV9tZW1vcnkpOwogICAgICAgICBwY21zLT5idXMgPSBwY2lfYnVzOwogICAgIH0gZWxzZSB7CkBA IC0yODksMTYgKzI5MCwxNiBAQCBzdGF0aWMgdm9pZCBwY19pbml0MShNYWNoaW5lU3RhdGUgKm1h Y2hpbmUsCiAKICAgICAgICAgb2JqZWN0X3Byb3BlcnR5X2FkZF9saW5rKE9CSkVDVChtYWNoaW5l KSwgUENfTUFDSElORV9BQ1BJX0RFVklDRV9QUk9QLAogICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgVFlQRV9IT1RQTFVHX0hBTkRMRVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAoT2JqZWN0ICoqKSZwY21zLT5hY3BpX2RldiwKKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIChPYmplY3QgKiopJmFjcGlfY29uZi0+YWNwaV9kZXYsCiAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RfcHJvcGVydHlfYWxsb3dfc2V0X2xpbmssCiAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQkpfUFJPUF9MSU5LX1NUUk9ORywgJmVy cm9yX2Fib3J0KTsKICAgICAgICAgb2JqZWN0X3Byb3BlcnR5X3NldF9saW5rKE9CSkVDVChtYWNo aW5lKSwgT0JKRUNUKHBpaXg0X3BtKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IFBDX01BQ0hJTkVfQUNQSV9ERVZJQ0VfUFJPUCwgJmVycm9yX2Fib3J0KTsKICAgICB9CiAKLSAg ICBpZiAocGNtcy0+YWNwaV9udmRpbW1fc3RhdGUuaXNfZW5hYmxlZCkgewotICAgICAgICBudmRp bW1faW5pdF9hY3BpX3N0YXRlKCZwY21zLT5hY3BpX252ZGltbV9zdGF0ZSwgc3lzdGVtX2lvLAot ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBjbXMtPmZ3X2NmZywgT0JKRUNUKHBjbXMp KTsKKyAgICBpZiAoYWNwaV9jb25mLT5hY3BpX252ZGltbV9zdGF0ZS5pc19lbmFibGVkKSB7Cisg ICAgICAgIG52ZGltbV9pbml0X2FjcGlfc3RhdGUoJmFjcGlfY29uZi0+YWNwaV9udmRpbW1fc3Rh dGUsIHN5c3RlbV9pbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3BpX2NvbmYt PmZ3X2NmZywgT0JKRUNUKHBjbXMpKTsKICAgICB9CiB9CiAKZGlmZiAtLWdpdCBhL2h3L2kzODYv cGNfcTM1LmMgYi9ody9pMzg2L3BjX3EzNS5jCmluZGV4IDUzMjI0MWUzZjguLmNkZGU0YTRiZWIg MTAwNjQ0Ci0tLSBhL2h3L2kzODYvcGNfcTM1LmMKKysrIGIvaHcvaTM4Ni9wY19xMzUuYwpAQCAt NjMsNiArNjMsNyBAQCBzdGF0aWMgdm9pZCBwY19xMzVfaW5pdChNYWNoaW5lU3RhdGUgKm1hY2hp bmUpCiB7CiAgICAgUENNYWNoaW5lU3RhdGUgKnBjbXMgPSBQQ19NQUNISU5FKG1hY2hpbmUpOwog ICAgIFBDTWFjaGluZUNsYXNzICpwY21jID0gUENfTUFDSElORV9HRVRfQ0xBU1MocGNtcyk7Cisg ICAgQWNwaUNvbmZpZ3VyYXRpb24gKmFjcGlfY29uZiA9ICZwY21zLT5hY3BpX2NvbmZpZ3VyYXRp b247CiAgICAgUTM1UENJSG9zdCAqcTM1X2hvc3Q7CiAgICAgUENJSG9zdFN0YXRlICpwaGI7CiAg ICAgUENJQnVzICpob3N0X2J1czsKQEAgLTExNiwxMSArMTE3LDExIEBAIHN0YXRpYyB2b2lkIHBj X3EzNV9pbml0KE1hY2hpbmVTdGF0ZSAqbWFjaGluZSkKICAgICB9CiAKICAgICBpZiAobWFjaGlu ZS0+cmFtX3NpemUgPj0gbG93bWVtKSB7Ci0gICAgICAgIHBjbXMtPmFib3ZlXzRnX21lbV9zaXpl ID0gbWFjaGluZS0+cmFtX3NpemUgLSBsb3dtZW07Ci0gICAgICAgIHBjbXMtPmJlbG93XzRnX21l bV9zaXplID0gbG93bWVtOworICAgICAgICBhY3BpX2NvbmYtPmFib3ZlXzRnX21lbV9zaXplID0g bWFjaGluZS0+cmFtX3NpemUgLSBsb3dtZW07CisgICAgICAgIGFjcGlfY29uZi0+YmVsb3dfNGdf bWVtX3NpemUgPSBsb3dtZW07CiAgICAgfSBlbHNlIHsKLSAgICAgICAgcGNtcy0+YWJvdmVfNGdf bWVtX3NpemUgPSAwOwotICAgICAgICBwY21zLT5iZWxvd180Z19tZW1fc2l6ZSA9IG1hY2hpbmUt PnJhbV9zaXplOworICAgICAgICBhY3BpX2NvbmYtPmFib3ZlXzRnX21lbV9zaXplID0gMDsKKyAg ICAgICAgYWNwaV9jb25mLT5iZWxvd180Z19tZW1fc2l6ZSA9IG1hY2hpbmUtPnJhbV9zaXplOwog ICAgIH0KIAogICAgIGlmICh4ZW5fZW5hYmxlZCgpKSB7CkBAIC0xNzksOSArMTgwLDkgQEAgc3Rh dGljIHZvaWQgcGNfcTM1X2luaXQoTWFjaGluZVN0YXRlICptYWNoaW5lKQogICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBNQ0hfSE9TVF9QUk9QX1NZU1RFTV9NRU0sIE5VTEwpOwogICAgIG9i amVjdF9wcm9wZXJ0eV9zZXRfbGluayhPQkpFQ1QocTM1X2hvc3QpLCBPQkpFQ1Qoc3lzdGVtX2lv KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNIX0hPU1RfUFJPUF9JT19NRU0sIE5V TEwpOwotICAgIG9iamVjdF9wcm9wZXJ0eV9zZXRfaW50KE9CSkVDVChxMzVfaG9zdCksIHBjbXMt PmJlbG93XzRnX21lbV9zaXplLAorICAgIG9iamVjdF9wcm9wZXJ0eV9zZXRfaW50KE9CSkVDVChx MzVfaG9zdCksIGFjcGlfY29uZi0+YmVsb3dfNGdfbWVtX3NpemUsCiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgUENJX0hPU1RfQkVMT1dfNEdfTUVNX1NJWkUsIE5VTEwpOwotICAgIG9iamVj dF9wcm9wZXJ0eV9zZXRfaW50KE9CSkVDVChxMzVfaG9zdCksIHBjbXMtPmFib3ZlXzRnX21lbV9z aXplLAorICAgIG9iamVjdF9wcm9wZXJ0eV9zZXRfaW50KE9CSkVDVChxMzVfaG9zdCksIGFjcGlf Y29uZi0+YWJvdmVfNGdfbWVtX3NpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENJ X0hPU1RfQUJPVkVfNEdfTUVNX1NJWkUsIE5VTEwpOwogICAgIC8qIHBjaSAqLwogICAgIHFkZXZf aW5pdF9ub2ZhaWwoREVWSUNFKHEzNV9ob3N0KSk7CkBAIC0xOTQsNyArMTk1LDcgQEAgc3RhdGlj IHZvaWQgcGNfcTM1X2luaXQoTWFjaGluZVN0YXRlICptYWNoaW5lKQogCiAgICAgb2JqZWN0X3By b3BlcnR5X2FkZF9saW5rKE9CSkVDVChtYWNoaW5lKSwgUENfTUFDSElORV9BQ1BJX0RFVklDRV9Q Uk9QLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUWVBFX0hPVFBMVUdfSEFORExFUiwK LSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9iamVjdCAqKikmcGNtcy0+YWNwaV9kZXYs CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChPYmplY3QgKiopJmFjcGlfY29uZi0+YWNw aV9kZXYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdF9wcm9wZXJ0eV9hbGxv d19zZXRfbGluaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0JKX1BST1BfTElOS19T VFJPTkcsICZlcnJvcl9hYm9ydCk7CiAgICAgb2JqZWN0X3Byb3BlcnR5X3NldF9saW5rKE9CSkVD VChtYWNoaW5lKSwgT0JKRUNUKGxwYyksCkBAIC0yNzYsOSArMjc3LDkgQEAgc3RhdGljIHZvaWQg cGNfcTM1X2luaXQoTWFjaGluZVN0YXRlICptYWNoaW5lKQogICAgIHBjX3ZnYV9pbml0KGlzYV9i dXMsIGhvc3RfYnVzKTsKICAgICBwY19uaWNfaW5pdChwY21jLCBpc2FfYnVzLCBob3N0X2J1cyk7 CiAKLSAgICBpZiAocGNtcy0+YWNwaV9udmRpbW1fc3RhdGUuaXNfZW5hYmxlZCkgewotICAgICAg ICBudmRpbW1faW5pdF9hY3BpX3N0YXRlKCZwY21zLT5hY3BpX252ZGltbV9zdGF0ZSwgc3lzdGVt X2lvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBjbXMtPmZ3X2NmZywgT0JKRUNU KHBjbXMpKTsKKyAgICBpZiAoYWNwaV9jb25mLT5hY3BpX252ZGltbV9zdGF0ZS5pc19lbmFibGVk KSB7CisgICAgICAgIG52ZGltbV9pbml0X2FjcGlfc3RhdGUoJmFjcGlfY29uZi0+YWNwaV9udmRp bW1fc3RhdGUsIHN5c3RlbV9pbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Bp X2NvbmYtPmZ3X2NmZywgT0JKRUNUKHBjbXMpKTsKICAgICB9CiB9CiAKZGlmZiAtLWdpdCBhL2h3 L2kzODYveGVuL3hlbi1odm0uYyBiL2h3L2kzODYveGVuL3hlbi1odm0uYwppbmRleCA5MzVhMzY3 NmM4Li4wNDU5ZmI3MzQwIDEwMDY0NAotLS0gYS9ody9pMzg2L3hlbi94ZW4taHZtLmMKKysrIGIv aHcvaTM4Ni94ZW4veGVuLWh2bS5jCkBAIC0xOTAsNiArMTkwLDcgQEAgcWVtdV9pcnEgKnhlbl9p bnRlcnJ1cHRfY29udHJvbGxlcl9pbml0KHZvaWQpCiBzdGF0aWMgdm9pZCB4ZW5fcmFtX2luaXQo UENNYWNoaW5lU3RhdGUgKnBjbXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgcmFtX2FkZHJf dCByYW1fc2l6ZSwgTWVtb3J5UmVnaW9uICoqcmFtX21lbW9yeV9wKQogeworICAgIEFjcGlDb25m aWd1cmF0aW9uICphY3BpX2NvbmYgPSAmcGNtcy0+YWNwaV9jb25maWd1cmF0aW9uOwogICAgIE1l bW9yeVJlZ2lvbiAqc3lzbWVtID0gZ2V0X3N5c3RlbV9tZW1vcnkoKTsKICAgICByYW1fYWRkcl90 IGJsb2NrX2xlbjsKICAgICB1aW50NjRfdCB1c2VyX2xvd21lbSA9IG9iamVjdF9wcm9wZXJ0eV9n ZXRfdWludChxZGV2X2dldF9tYWNoaW5lKCksCkBAIC0yMDcsMjAgKzIwOCwyMCBAQCBzdGF0aWMg dm9pZCB4ZW5fcmFtX2luaXQoUENNYWNoaW5lU3RhdGUgKnBjbXMsCiAgICAgfQogCiAgICAgaWYg KHJhbV9zaXplID49IHVzZXJfbG93bWVtKSB7Ci0gICAgICAgIHBjbXMtPmFib3ZlXzRnX21lbV9z aXplID0gcmFtX3NpemUgLSB1c2VyX2xvd21lbTsKLSAgICAgICAgcGNtcy0+YmVsb3dfNGdfbWVt X3NpemUgPSB1c2VyX2xvd21lbTsKKyAgICAgICAgYWNwaV9jb25mLT5hYm92ZV80Z19tZW1fc2l6 ZSA9IHJhbV9zaXplIC0gdXNlcl9sb3dtZW07CisgICAgICAgIGFjcGlfY29uZi0+YmVsb3dfNGdf bWVtX3NpemUgPSB1c2VyX2xvd21lbTsKICAgICB9IGVsc2UgewotICAgICAgICBwY21zLT5hYm92 ZV80Z19tZW1fc2l6ZSA9IDA7Ci0gICAgICAgIHBjbXMtPmJlbG93XzRnX21lbV9zaXplID0gcmFt X3NpemU7CisgICAgICAgIGFjcGlfY29uZi0+YWJvdmVfNGdfbWVtX3NpemUgPSAwOworICAgICAg ICBhY3BpX2NvbmYtPmJlbG93XzRnX21lbV9zaXplID0gcmFtX3NpemU7CiAgICAgfQotICAgIGlm ICghcGNtcy0+YWJvdmVfNGdfbWVtX3NpemUpIHsKKyAgICBpZiAoIWFjcGlfY29uZi0+YWJvdmVf NGdfbWVtX3NpemUpIHsKICAgICAgICAgYmxvY2tfbGVuID0gcmFtX3NpemU7CiAgICAgfSBlbHNl IHsKICAgICAgICAgLyoKICAgICAgICAgICogWGVuIGRvZXMgbm90IGFsbG9jYXRlIHRoZSBtZW1v cnkgY29udGludW91c2x5LCBpdCBrZWVwcyBhCiAgICAgICAgICAqIGhvbGUgb2YgdGhlIHNpemUg Y29tcHV0ZWQgYWJvdmUgb3IgcGFzc2VkIGluLgogICAgICAgICAgKi8KLSAgICAgICAgYmxvY2tf bGVuID0gKDFVTEwgPDwgMzIpICsgcGNtcy0+YWJvdmVfNGdfbWVtX3NpemU7CisgICAgICAgIGJs b2NrX2xlbiA9ICgxVUxMIDw8IDMyKSArIGFjcGlfY29uZi0+YWJvdmVfNGdfbWVtX3NpemU7CiAg ICAgfQogICAgIG1lbW9yeV9yZWdpb25faW5pdF9yYW0oJnJhbV9tZW1vcnksIE5VTEwsICJ4ZW4u cmFtIiwgYmxvY2tfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yX2ZhdGFs KTsKQEAgLTIzNywxMiArMjM4LDEyIEBAIHN0YXRpYyB2b2lkIHhlbl9yYW1faW5pdChQQ01hY2hp bmVTdGF0ZSAqcGNtcywKICAgICAgKi8KICAgICBtZW1vcnlfcmVnaW9uX2luaXRfYWxpYXMoJnJh bV9sbywgTlVMTCwgInhlbi5yYW0ubG8iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAm cmFtX21lbW9yeSwgMHhjMDAwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGNtcy0+ YmVsb3dfNGdfbWVtX3NpemUgLSAweGMwMDAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgYWNwaV9jb25mLT5iZWxvd180Z19tZW1fc2l6ZSAtIDB4YzAwMDApOwogICAgIG1lbW9yeV9y ZWdpb25fYWRkX3N1YnJlZ2lvbihzeXNtZW0sIDB4YzAwMDAsICZyYW1fbG8pOwotICAgIGlmIChw Y21zLT5hYm92ZV80Z19tZW1fc2l6ZSA+IDApIHsKKyAgICBpZiAoYWNwaV9jb25mLT5hYm92ZV80 Z19tZW1fc2l6ZSA+IDApIHsKICAgICAgICAgbWVtb3J5X3JlZ2lvbl9pbml0X2FsaWFzKCZyYW1f aGksIE5VTEwsICJ4ZW4ucmFtLmhpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICZyYW1fbWVtb3J5LCAweDEwMDAwMDAwMFVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHBjbXMtPmFib3ZlXzRnX21lbV9zaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIGFjcGlfY29uZi0+YWJvdmVfNGdfbWVtX3NpemUpOwogICAgICAgICBtZW1vcnlf cmVnaW9uX2FkZF9zdWJyZWdpb24oc3lzbWVtLCAweDEwMDAwMDAwMFVMTCwgJnJhbV9oaSk7CiAg ICAgfQogfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9ody9hY3BpL2FjcGkuaCBiL2luY2x1ZGUvaHcv YWNwaS9hY3BpLmgKaW5kZXggYzIwYWNlMGQwYi4uMjU0YzhkMGNmYyAxMDA2NDQKLS0tIGEvaW5j bHVkZS9ody9hY3BpL2FjcGkuaAorKysgYi9pbmNsdWRlL2h3L2FjcGkvYWNwaS5oCkBAIC0yNCw2 ICsyNCw4IEBACiAjaW5jbHVkZSAiZXhlYy9tZW1vcnkuaCIKICNpbmNsdWRlICJody9pcnEuaCIK ICNpbmNsdWRlICJody9hY3BpL2FjcGlfZGV2X2ludGVyZmFjZS5oIgorI2luY2x1ZGUgImh3L2hv dHBsdWcuaCIKKyNpbmNsdWRlICJody9tZW0vbnZkaW1tLmgiCiAKIC8qCiAgKiBjdXJyZW50IGRl dmljZSBuYW1pbmcgc2NoZW1lIHN1cHBvcnRzIHVwIHRvIDI1NiBtZW1vcnkgZGV2aWNlcwpAQCAt MTg2LDYgKzE4OCw0OCBAQCBleHRlcm4gaW50IGFjcGlfZW5hYmxlZDsKIGV4dGVybiBjaGFyIHVu c2lnbmVkICphY3BpX3RhYmxlczsKIGV4dGVybiBzaXplX3QgYWNwaV90YWJsZXNfbGVuOwogCit0 eXBlZGVmCitzdHJ1Y3QgQWNwaUJ1aWxkU3RhdGUgeworICAgIC8qIENvcHkgb2YgdGFibGUgaW4g UkFNIChmb3IgcGF0Y2hpbmcpLiAqLworICAgIE1lbW9yeVJlZ2lvbiAqdGFibGVfbXI7CisgICAg LyogSXMgdGFibGUgcGF0Y2hlZD8gKi8KKyAgICBib29sIHBhdGNoZWQ7CisgICAgdm9pZCAqcnNk cDsKKyAgICBNZW1vcnlSZWdpb24gKnJzZHBfbXI7CisgICAgTWVtb3J5UmVnaW9uICpsaW5rZXJf bXI7Cit9IEFjcGlCdWlsZFN0YXRlOworCit0eXBlZGVmCitzdHJ1Y3QgQWNwaUNvbmZpZ3VyYXRp b24geworICAgIC8qIE1hY2hpbmUgY2xhc3MgQUNQSSBzZXR0aW5ncyAqLworICAgIGludCBsZWdh Y3lfYWNwaV90YWJsZV9zaXplOworICAgIGJvb2wgcnNkcF9pbl9yYW07CisgICAgdW5zaWduZWQg YWNwaV9kYXRhX3NpemU7CisKKyAgICAvKiBNYWNoaW5lIHN0YXRlIEFDUEkgc2V0dGluZ3MgKi8K KyAgICBIb3RwbHVnSGFuZGxlciAqYWNwaV9kZXY7CisgICAgQWNwaU5WRElNTVN0YXRlIGFjcGlf bnZkaW1tX3N0YXRlOworCisgICAgLyoKKyAgICAgKiBUaGUgZmllbGRzIGJlbG93IGFyZSBtYWNo aW5lIHNldHRpbmdzIHRoYXQKKyAgICAgKiBhcmUgbm90IEFDUEkgc3BlY2lmaWMuIEhvd2V2ZXIg dGhleSBhcmUgbmVlZGVkCisgICAgICogZm9yIGJ1aWxkaW5nIEFDUEkgdGFibGVzIGFuZCBhcyBz dWNoIHNob3VsZCBiZQorICAgICAqIGNhcnJpZWQgdGhyb3VnaCB0aGUgQUNQSSBjb25maWd1cmF0 aW9uIHN0cnVjdHVyZS4KKyAgICAgKi8KKyAgICBib29sIGxlZ2FjeV9jcHVfaG90cGx1ZzsKKyAg ICBib29sIGxpbnV4Ym9vdF9kbWFfZW5hYmxlZDsKKyAgICBGV0NmZ1N0YXRlICpmd19jZmc7Cisg ICAgcmFtX2FkZHJfdCBiZWxvd180Z19tZW1fc2l6ZSwgYWJvdmVfNGdfbWVtX3NpemU7OworICAg IHVpbnQ2NF90IG51bWFfbm9kZXM7CisgICAgdWludDY0X3QgKm5vZGVfbWVtOworICAgIGJvb2wg YXBpY194cnVwdF9vdmVycmlkZTsKKyAgICB1bnNpZ25lZCBhcGljX2lkX2xpbWl0OworICAgIFBD SUhvc3RTdGF0ZSAqcGNpX2hvc3Q7CisKKyAgICAvKiBCdWlsZCBzdGF0ZSAqLworICAgIEFjcGlC dWlsZFN0YXRlICpidWlsZF9zdGF0ZTsKK30gQWNwaUNvbmZpZ3VyYXRpb247CisKIHVpbnQ4X3Qg KmFjcGlfdGFibGVfZmlyc3Qodm9pZCk7CiB1aW50OF90ICphY3BpX3RhYmxlX25leHQodWludDhf dCAqY3VycmVudCk7CiB1bnNpZ25lZCBhY3BpX3RhYmxlX2xlbih2b2lkICpjdXJyZW50KTsKZGlm ZiAtLWdpdCBhL2luY2x1ZGUvaHcvaTM4Ni9wYy5oIGIvaW5jbHVkZS9ody9pMzg2L3BjLmgKaW5k ZXggZGZlNjc0NjY5Mi4uZGEwYmQzOTc0MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9ody9pMzg2L3Bj LmgKKysrIGIvaW5jbHVkZS9ody9pMzg2L3BjLmgKQEAgLTEyLDYgKzEyLDcgQEAKICNpbmNsdWRl ICJxZW11L3JhbmdlLmgiCiAjaW5jbHVkZSAicWVtdS9iaXRtYXAuaCIKICNpbmNsdWRlICJzeXNl bXUvc3lzZW11LmgiCisjaW5jbHVkZSAiaHcvYWNwaS9hY3BpLmgiCiAjaW5jbHVkZSAiaHcvcGNp L3BjaS5oIgogI2luY2x1ZGUgImh3L2NvbXBhdC5oIgogI2luY2x1ZGUgImh3L21lbS9wYy1kaW1t LmgiCkBAIC0zNSwxMCArMzYsOCBAQCBzdHJ1Y3QgUENNYWNoaW5lU3RhdGUgewogICAgIE5vdGlm aWVyIG1hY2hpbmVfZG9uZTsKIAogICAgIC8qIFBvaW50ZXJzIHRvIGRldmljZXMgYW5kIG9iamVj dHM6ICovCi0gICAgSG90cGx1Z0hhbmRsZXIgKmFjcGlfZGV2OwogICAgIElTQURldmljZSAqcnRj OwogICAgIFBDSUJ1cyAqYnVzOwotICAgIEZXQ2ZnU3RhdGUgKmZ3X2NmZzsKICAgICBxZW11X2ly cSAqZ3NpOwogCiAgICAgLyogQ29uZmlndXJhdGlvbiBvcHRpb25zOiAqLwpAQCAtNDYsMjggKzQ1 LDIwIEBAIHN0cnVjdCBQQ01hY2hpbmVTdGF0ZSB7CiAgICAgT25PZmZBdXRvIHZtcG9ydDsKICAg ICBPbk9mZkF1dG8gc21tOwogCi0gICAgQWNwaU5WRElNTVN0YXRlIGFjcGlfbnZkaW1tX3N0YXRl OwotCiAgICAgYm9vbCBhY3BpX2J1aWxkX2VuYWJsZWQ7CiAgICAgYm9vbCBzbWJ1czsKICAgICBi b29sIHNhdGE7CiAgICAgYm9vbCBwaXQ7CiAKLSAgICAvKiBSQU0gaW5mb3JtYXRpb24gKHNpemVz LCBhZGRyZXNzZXMsIGNvbmZpZ3VyYXRpb24pOiAqLwotICAgIHJhbV9hZGRyX3QgYmVsb3dfNGdf bWVtX3NpemUsIGFib3ZlXzRnX21lbV9zaXplOwotCi0gICAgLyogQ1BVIGFuZCBhcGljIGluZm9y bWF0aW9uOiAqLwotICAgIGJvb2wgYXBpY194cnVwdF9vdmVycmlkZTsKLSAgICB1bnNpZ25lZCBh cGljX2lkX2xpbWl0OworICAgIC8qIENQVSBpbmZvcm1hdGlvbiAqLwogICAgIHVpbnQxNl90IGJv b3RfY3B1czsKIAotICAgIC8qIE5VTUEgaW5mb3JtYXRpb246ICovCi0gICAgdWludDY0X3QgbnVt YV9ub2RlczsKLSAgICB1aW50NjRfdCAqbm9kZV9tZW07Ci0KICAgICAvKiBBZGRyZXNzIHNwYWNl IHVzZWQgYnkgSU9BUElDIGRldmljZS4gQWxsIElPQVBJQyBpbnRlcnJ1cHRzCiAgICAgICogd2ls bCBiZSB0cmFuc2xhdGVkIHRvIE1TSSBtZXNzYWdlcyBpbiB0aGUgYWRkcmVzcyBzcGFjZS4gKi8K ICAgICBBZGRyZXNzU3BhY2UgKmlvYXBpY19hczsKKworICAgIC8qIEFDUEkgY29uZmlndXJhdGlv biAqLworICAgIEFjcGlDb25maWd1cmF0aW9uIGFjcGlfY29uZmlndXJhdGlvbjsKIH07CiAKICNk ZWZpbmUgUENfTUFDSElORV9BQ1BJX0RFVklDRV9QUk9QICJhY3BpLWRldmljZSIKLS0gCjIuMTku MQoKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fClhlbi1k ZXZlbCBtYWlsaW5nIGxpc3QKWGVuLWRldmVsQGxpc3RzLnhlbnByb2plY3Qub3JnCmh0dHBzOi8v bGlzdHMueGVucHJvamVjdC5vcmcvbWFpbG1hbi9saXN0aW5mby94ZW4tZGV2ZWw= From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:59058) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gIA8w-00044X-NA for qemu-devel@nongnu.org; Thu, 01 Nov 2018 06:24:06 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gIA8r-0002rD-LG for qemu-devel@nongnu.org; Thu, 01 Nov 2018 06:24:02 -0400 From: Samuel Ortiz Date: Thu, 1 Nov 2018 11:22:41 +0100 Message-Id: <20181101102303.16439-2-sameo@linux.intel.com> In-Reply-To: <20181101102303.16439-1-sameo@linux.intel.com> References: <20181101102303.16439-1-sameo@linux.intel.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Subject: [Qemu-devel] [PATCH v4 01/23] 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: "Michael S. Tsirkin" , Igor Mammedov , Shannon Zhao , Peter Maydell , Paolo Bonzini , Richard Henderson , Eduardo Habkost , Marcel Apfelbaum , Stefano Stabellini , Anthony Perard , "open list:ARM ACPI Subsystem" , "open list:X86" 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/acpi/cpu_hotplug.c | 9 +- hw/arm/virt-acpi-build.c | 10 --- hw/i386/acpi-build.c | 136 ++++++++++++++---------------- hw/i386/acpi-build.h | 4 +- hw/i386/pc.c | 176 ++++++++++++++++++++++++--------------- hw/i386/pc_piix.c | 21 ++--- hw/i386/pc_q35.c | 21 ++--- hw/i386/xen/xen-hvm.c | 19 +++-- include/hw/acpi/acpi.h | 44 ++++++++++ include/hw/i386/pc.h | 19 ++--- 10 files changed, 257 insertions(+), 202 deletions(-) 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/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/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); } } 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 dfe6746692..da0bd39741 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" -- 2.19.1