Non-hvmloader users may be building tables in virtual address space
and therefore we need to make sure that values that end up in tables
are physical addresses.
Signed-off-by: Boris Ostrovsky
---
tools/firmware/hvmloader/acpi/build.c | 47 +
1 files changed, 24 insertions(+), 23 deletions(-)
diff --git a/tools/firmware/hvmloader/acpi/build.c
b/tools/firmware/hvmloader/acpi/build.c
index 0adb3d6..4b0302c 100644
--- a/tools/firmware/hvmloader/acpi/build.c
+++ b/tools/firmware/hvmloader/acpi/build.c
@@ -126,7 +126,7 @@ static struct acpi_20_madt *construct_madt(struct acpi_ctxt
*ctxt,
lapic = (struct acpi_20_madt_lapic *)(madt + 1);
config->ainfo.nr_cpus =config-> hvminfo->nr_vcpus;
-config->ainfo.madt_lapic0_addr = (uint32_t)lapic;
+config->ainfo.madt_lapic0_addr = ctxt->mem_ops.v2p(ctxt, lapic);
for ( i = 0; i < config->hvminfo->nr_vcpus; i++ )
{
memset(lapic, 0, sizeof(*lapic));
@@ -143,7 +143,8 @@ static struct acpi_20_madt *construct_madt(struct acpi_ctxt
*ctxt,
madt->header.length = (unsigned char *)lapic - (unsigned char *)madt;
set_checksum(madt, offsetof(struct acpi_header, checksum),
madt->header.length);
-config->ainfo.madt_csum_addr = (uint32_t)&madt->header.checksum;
+config->ainfo.madt_csum_addr =
+ctxt->mem_ops.v2p(ctxt, &madt->header.checksum);
return madt;
}
@@ -311,7 +312,7 @@ static int construct_passthrough_tables(struct acpi_ctxt
*ctxt,
break;
memcpy(buffer, header, header->length);
-table_ptrs[nr_tables++] = (unsigned long)buffer;
+table_ptrs[nr_tables++] = ctxt->mem_ops.v2p(ctxt, buffer);
total += header->length;
acpi_pt_addr += header->length;
}
@@ -337,7 +338,7 @@ static int construct_secondary_tables(struct acpi_ctxt
*ctxt,
{
madt = construct_madt(ctxt, config);
if (!madt) return -1;
-table_ptrs[nr_tables++] = (unsigned long)madt;
+table_ptrs[nr_tables++] = ctxt->mem_ops.v2p(ctxt, madt);
}
/* HPET. */
@@ -345,7 +346,7 @@ static int construct_secondary_tables(struct acpi_ctxt
*ctxt,
{
hpet = construct_hpet(ctxt, config);
if (!hpet) return -1;
-table_ptrs[nr_tables++] = (unsigned long)hpet;
+table_ptrs[nr_tables++] = ctxt->mem_ops.v2p(ctxt, hpet);
}
/* WAET. */
@@ -353,7 +354,7 @@ static int construct_secondary_tables(struct acpi_ctxt
*ctxt,
{
waet = construct_waet(ctxt, config);
if ( !waet ) return -1;
-table_ptrs[nr_tables++] = (unsigned long)waet;
+table_ptrs[nr_tables++] = ctxt->mem_ops.v2p(ctxt, waet);
}
if ( config->table_flags & ACPI_BUILD_SSDT_PM )
@@ -361,7 +362,7 @@ static int construct_secondary_tables(struct acpi_ctxt
*ctxt,
ssdt = ctxt->mem_ops.alloc(ctxt, sizeof(ssdt_pm), 16);
if (!ssdt) return -1;
memcpy(ssdt, ssdt_pm, sizeof(ssdt_pm));
-table_ptrs[nr_tables++] = (unsigned long)ssdt;
+table_ptrs[nr_tables++] = ctxt->mem_ops.v2p(ctxt, ssdt);
}
if ( config->table_flags & ACPI_BUILD_SSDT_S3 )
@@ -369,7 +370,7 @@ static int construct_secondary_tables(struct acpi_ctxt
*ctxt,
ssdt = ctxt->mem_ops.alloc(ctxt, sizeof(ssdt_s3), 16);
if (!ssdt) return -1;
memcpy(ssdt, ssdt_s3, sizeof(ssdt_s3));
-table_ptrs[nr_tables++] = (unsigned long)ssdt;
+table_ptrs[nr_tables++] = ctxt->mem_ops.v2p(ctxt, ssdt);
} else {
printf("S3 disabled\n");
}
@@ -379,7 +380,7 @@ static int construct_secondary_tables(struct acpi_ctxt
*ctxt,
ssdt = ctxt->mem_ops.alloc(ctxt, sizeof(ssdt_s4), 16);
if (!ssdt) return -1;
memcpy(ssdt, ssdt_s4, sizeof(ssdt_s4));
-table_ptrs[nr_tables++] = (unsigned long)ssdt;
+table_ptrs[nr_tables++] = ctxt->mem_ops.v2p(ctxt, ssdt);
} else {
printf("S4 disabled\n");
}
@@ -393,12 +394,12 @@ static int construct_secondary_tables(struct acpi_ctxt
*ctxt,
ssdt = ctxt->mem_ops.alloc(ctxt, sizeof(ssdt_tpm), 16);
if (!ssdt) return -1;
memcpy(ssdt, ssdt_tpm, sizeof(ssdt_tpm));
-table_ptrs[nr_tables++] = (unsigned long)ssdt;
+table_ptrs[nr_tables++] = ctxt->mem_ops.v2p(ctxt, ssdt);
tcpa = ctxt->mem_ops.alloc(ctxt, sizeof(struct acpi_20_tcpa), 16);
if (!tcpa) return -1;
memset(tcpa, 0, sizeof(*tcpa));
-table_ptrs[nr_tables++] = (unsigned long)tcpa;
+table_ptrs[nr_tables++] = ctxt->mem_ops.v2p(ctxt, tcpa);
tcpa->header.signature = ACPI_2_0_TCPA_SIGNATURE;
tcpa->header.length= sizeof(*tcpa);
@@ -426,11 +427,11 @@ static int construct_secondary_tables(struct acpi_ctxt
*ctxt,
struct acpi_20_slit *slit = construct_slit(ctxt, config);
if ( srat )
-table_ptrs[nr_tables++] = (unsigned long)srat;
+table_ptrs[nr_tables