|
[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 |