[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH RFC 07/20] acpi/hvmloader: Set TIS header address in hvmloader
Users other than hvmloader may provide TIS address as virtual. Signed-off-by: Boris Ostrovsky <boris.ostrovsky@xxxxxxxxxx> --- tools/firmware/hvmloader/acpi/acpi2_0.h | 4 ++ tools/firmware/hvmloader/acpi/build.c | 65 +++++++++++++++++---------------- tools/firmware/hvmloader/util.c | 4 ++ 3 files changed, 41 insertions(+), 32 deletions(-) diff --git a/tools/firmware/hvmloader/acpi/acpi2_0.h b/tools/firmware/hvmloader/acpi/acpi2_0.h index c52315a..2628a2f 100644 --- a/tools/firmware/hvmloader/acpi/acpi2_0.h +++ b/tools/firmware/hvmloader/acpi/acpi2_0.h @@ -304,6 +304,8 @@ struct acpi_20_waet { uint32_t flags; }; +#define ACPI_TIS_HDR_ADDRESS 0xFED40F00UL + /* * Multiple APIC Flags. */ @@ -456,6 +458,7 @@ struct acpi_20_slit { #define ACPI_BUILD_SSDT_PM (1<<0) #define ACPI_BUILD_SSDT_S3 (1<<1) #define ACPI_BUILD_SSDT_S4 (1<<2) +#define ACPI_BUILD_TCPA (1<<3) /* * Located at ACPI_INFO_PHYSICAL_ADDRESS. @@ -498,6 +501,7 @@ struct acpi_config { uint8_t *vcpu_online; int apic_mode; struct acpi_numa numa; + uint16_t *tis_hdr; }; void acpi_build_tables(struct acpi_config *config, unsigned int physical); diff --git a/tools/firmware/hvmloader/acpi/build.c b/tools/firmware/hvmloader/acpi/build.c index 1bccca3..c56a6a6 100644 --- a/tools/firmware/hvmloader/acpi/build.c +++ b/tools/firmware/hvmloader/acpi/build.c @@ -319,7 +319,6 @@ static int construct_secondary_tables(unsigned long *table_ptrs, struct acpi_20_tcpa *tcpa; unsigned char *ssdt; static const uint16_t tis_signature[] = {0x0001, 0x0001, 0x0001}; - uint16_t *tis_hdr; void *lasa; /* MADT. */ @@ -371,41 +370,43 @@ static int construct_secondary_tables(unsigned long *table_ptrs, printf("S4 disabled\n"); } - /* TPM TCPA and SSDT. */ - tis_hdr = (uint16_t *)0xFED40F00; - if ( (tis_hdr[0] == tis_signature[0]) && - (tis_hdr[1] == tis_signature[1]) && - (tis_hdr[2] == tis_signature[2]) ) + if ( config->table_flags & ACPI_BUILD_TCPA ) { - ssdt = mem_alloc(sizeof(ssdt_tpm), 16); - if (!ssdt) return -1; - memcpy(ssdt, ssdt_tpm, sizeof(ssdt_tpm)); - table_ptrs[nr_tables++] = (unsigned long)ssdt; - - tcpa = mem_alloc(sizeof(struct acpi_20_tcpa), 16); - if (!tcpa) return -1; - memset(tcpa, 0, sizeof(*tcpa)); - table_ptrs[nr_tables++] = (unsigned long)tcpa; - - tcpa->header.signature = ACPI_2_0_TCPA_SIGNATURE; - tcpa->header.length = sizeof(*tcpa); - tcpa->header.revision = ACPI_2_0_TCPA_REVISION; - fixed_strcpy(tcpa->header.oem_id, ACPI_OEM_ID); - fixed_strcpy(tcpa->header.oem_table_id, ACPI_OEM_TABLE_ID); - tcpa->header.oem_revision = ACPI_OEM_REVISION; - tcpa->header.creator_id = ACPI_CREATOR_ID; - tcpa->header.creator_revision = ACPI_CREATOR_REVISION; - if ( (lasa = mem_alloc(ACPI_2_0_TCPA_LAML_SIZE, 16)) != NULL ) + /* TPM TCPA and SSDT. */ + if ( (config->tis_hdr[0] == tis_signature[0]) && + (config->tis_hdr[1] == tis_signature[1]) && + (config->tis_hdr[2] == tis_signature[2]) ) { - tcpa->lasa = virt_to_phys(lasa); - tcpa->laml = ACPI_2_0_TCPA_LAML_SIZE; - memset(lasa, 0, tcpa->laml); - set_checksum(tcpa, - offsetof(struct acpi_header, checksum), - tcpa->header.length); + ssdt = mem_alloc(sizeof(ssdt_tpm), 16); + if (!ssdt) return -1; + memcpy(ssdt, ssdt_tpm, sizeof(ssdt_tpm)); + table_ptrs[nr_tables++] = (unsigned long)ssdt; + + tcpa = mem_alloc(sizeof(struct acpi_20_tcpa), 16); + if (!tcpa) return -1; + memset(tcpa, 0, sizeof(*tcpa)); + table_ptrs[nr_tables++] = (unsigned long)tcpa; + + tcpa->header.signature = ACPI_2_0_TCPA_SIGNATURE; + tcpa->header.length = sizeof(*tcpa); + tcpa->header.revision = ACPI_2_0_TCPA_REVISION; + fixed_strcpy(tcpa->header.oem_id, ACPI_OEM_ID); + fixed_strcpy(tcpa->header.oem_table_id, ACPI_OEM_TABLE_ID); + tcpa->header.oem_revision = ACPI_OEM_REVISION; + tcpa->header.creator_id = ACPI_CREATOR_ID; + tcpa->header.creator_revision = ACPI_CREATOR_REVISION; + if ( (lasa = mem_alloc(ACPI_2_0_TCPA_LAML_SIZE, 16)) != NULL ) + { + tcpa->lasa = virt_to_phys(lasa); + tcpa->laml = ACPI_2_0_TCPA_LAML_SIZE; + memset(lasa, 0, tcpa->laml); + set_checksum(tcpa, + offsetof(struct acpi_header, checksum), + tcpa->header.length); + } } } - + /* SRAT and SLIT */ if ( config->numa.nr_vnodes > 0 ) { diff --git a/tools/firmware/hvmloader/util.c b/tools/firmware/hvmloader/util.c index b56f4e6..ce74fe2 100644 --- a/tools/firmware/hvmloader/util.c +++ b/tools/firmware/hvmloader/util.c @@ -911,6 +911,8 @@ void hvmloader_acpi_build_tables(struct acpi_config *config, if ( !strncmp(xenstore_read("platform/acpi_s4", "1"), "1", 1) ) config->table_flags |= ACPI_BUILD_SSDT_S4; + config->table_flags |= ACPI_BUILD_TCPA; + config->nr_vcpus = hvm_info->nr_vcpus; config->vcpu_online = hvm_info->vcpu_online; config->apic_mode = 1; @@ -921,6 +923,8 @@ void hvmloader_acpi_build_tables(struct acpi_config *config, config->numa.vdistance = vdistance; config->numa.vmemrange = vmemrange; + config->tis_hdr = (uint16_t *)ACPI_TIS_HDR_ADDRESS; + acpi_build_tables(config, physical); hvm_param_set(HVM_PARAM_VM_GENERATION_ID_ADDR, config->acpi_info.vm_gid_addr); -- 2.4.3 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |