[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v2 10/23] acpi/hvmloader: Replace mem_alloc() and virt_to_phys() with memory ops
Components that wish to use ACPI builder will need to provide their own mem_alloc() and virt_to_phys() routines. Pointers to these routines will be passed to the builder as memory ops. Signed-off-by: Boris Ostrovsky <boris.ostrovsky@xxxxxxxxxx> --- v2: * Added acpi_ctxt.free() op tools/firmware/hvmloader/acpi/build.c | 91 ++++++++++++++++++--------------- tools/firmware/hvmloader/acpi/libacpi.h | 10 +++- tools/firmware/hvmloader/util.c | 16 +++++- 3 files changed, 74 insertions(+), 43 deletions(-) diff --git a/tools/firmware/hvmloader/acpi/build.c b/tools/firmware/hvmloader/acpi/build.c index e362ccd..7302c35 100644 --- a/tools/firmware/hvmloader/acpi/build.c +++ b/tools/firmware/hvmloader/acpi/build.c @@ -70,7 +70,8 @@ static void set_checksum( p[checksum_offset] = -sum; } -static struct acpi_20_madt *construct_madt(struct acpi_config *config, +static struct acpi_20_madt *construct_madt(struct acpi_ctxt *ctxt, + struct acpi_config *config, struct acpi_info *info) { struct acpi_20_madt *madt; @@ -84,7 +85,7 @@ static struct acpi_20_madt *construct_madt(struct acpi_config *config, sz += sizeof(struct acpi_20_madt_ioapic); sz += sizeof(struct acpi_20_madt_lapic) * config->hvminfo->nr_vcpus; - madt = mem_alloc(sz, 16); + madt = ctxt->mem_ops.alloc(ctxt, sz, 16); if (!madt) return NULL; memset(madt, 0, sizeof(*madt)); @@ -164,11 +165,12 @@ static struct acpi_20_madt *construct_madt(struct acpi_config *config, return madt; } -static struct acpi_20_hpet *construct_hpet(void) +static struct acpi_20_hpet *construct_hpet(struct acpi_ctxt *ctxt, + struct acpi_config *config) { struct acpi_20_hpet *hpet; - hpet = mem_alloc(sizeof(*hpet), 16); + hpet = ctxt->mem_ops.alloc(ctxt, sizeof(*hpet), 16); if (!hpet) return NULL; memset(hpet, 0, sizeof(*hpet)); @@ -187,11 +189,12 @@ static struct acpi_20_hpet *construct_hpet(void) return hpet; } -static struct acpi_20_waet *construct_waet(void) +static struct acpi_20_waet *construct_waet(struct acpi_ctxt *ctxt, + struct acpi_config *config) { struct acpi_20_waet *waet; - waet = mem_alloc(sizeof(*waet), 16); + waet = ctxt->mem_ops.alloc(ctxt, sizeof(*waet), 16); if (!waet) return NULL; memcpy(waet, &Waet, sizeof(*waet)); @@ -202,7 +205,8 @@ static struct acpi_20_waet *construct_waet(void) return waet; } -static struct acpi_20_srat *construct_srat(struct acpi_config *config) +static struct acpi_20_srat *construct_srat(struct acpi_ctxt *ctxt, + struct acpi_config *config) { struct acpi_20_srat *srat; struct acpi_20_srat_processor *processor; @@ -214,7 +218,7 @@ static struct acpi_20_srat *construct_srat(struct acpi_config *config) size = sizeof(*srat) + sizeof(*processor) * config->hvminfo->nr_vcpus + sizeof(*memory) * config->numa.nr_vmemranges; - p = mem_alloc(size, 16); + p = ctxt->mem_ops.alloc(ctxt, size, 16); if ( !p ) return NULL; @@ -260,7 +264,8 @@ static struct acpi_20_srat *construct_srat(struct acpi_config *config) return srat; } -static struct acpi_20_slit *construct_slit(struct acpi_config *config) +static struct acpi_20_slit *construct_slit(struct acpi_ctxt *ctxt, + struct acpi_config *config) { struct acpi_20_slit *slit; unsigned int i, num, size; @@ -268,7 +273,7 @@ static struct acpi_20_slit *construct_slit(struct acpi_config *config) num = config->numa.nr_vnodes * config->numa.nr_vnodes; size = sizeof(*slit) + num * sizeof(uint8_t); - slit = mem_alloc(size, 16); + slit = ctxt->mem_ops.alloc(ctxt, size, 16); if ( !slit ) return NULL; @@ -292,7 +297,8 @@ static struct acpi_20_slit *construct_slit(struct acpi_config *config) return slit; } -static int construct_passthrough_tables(unsigned long *table_ptrs, +static int construct_passthrough_tables(struct acpi_ctxt *ctxt, + unsigned long *table_ptrs, int nr_tables, struct acpi_config *config) { @@ -315,7 +321,7 @@ static int construct_passthrough_tables(unsigned long *table_ptrs, header = (struct acpi_header*)pt_addr; - buffer = mem_alloc(header->length, 16); + buffer = ctxt->mem_ops.alloc(ctxt, header->length, 16); if ( buffer == NULL ) break; memcpy(buffer, header, header->length); @@ -328,7 +334,8 @@ static int construct_passthrough_tables(unsigned long *table_ptrs, return nr_added; } -static int construct_secondary_tables(unsigned long *table_ptrs, +static int construct_secondary_tables(struct acpi_ctxt *ctxt, + unsigned long *table_ptrs, struct acpi_config *config, struct acpi_info *info) { @@ -344,7 +351,7 @@ static int construct_secondary_tables(unsigned long *table_ptrs, /* MADT. */ if ( (config->hvminfo->nr_vcpus > 1) || config->hvminfo->apic_mode ) { - madt = construct_madt(config, info); + madt = construct_madt(ctxt, config, info); if (!madt) return -1; table_ptrs[nr_tables++] = (unsigned long)madt; } @@ -352,7 +359,7 @@ static int construct_secondary_tables(unsigned long *table_ptrs, /* HPET. */ if ( info->hpet_present ) { - hpet = construct_hpet(); + hpet = construct_hpet(ctxt, config); if (!hpet) return -1; table_ptrs[nr_tables++] = (unsigned long)hpet; } @@ -360,14 +367,14 @@ static int construct_secondary_tables(unsigned long *table_ptrs, /* WAET. */ if ( config->table_flags & ACPI_HAS_WAET ) { - waet = construct_waet(); + waet = construct_waet(ctxt, config); if ( !waet ) return -1; table_ptrs[nr_tables++] = (unsigned long)waet; } if ( config->table_flags & ACPI_HAS_SSDT_PM ) { - ssdt = mem_alloc(sizeof(ssdt_pm), 16); + 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; @@ -375,7 +382,7 @@ static int construct_secondary_tables(unsigned long *table_ptrs, if ( config->table_flags & ACPI_HAS_SSDT_S3 ) { - ssdt = mem_alloc(sizeof(ssdt_s3), 16); + 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; @@ -385,7 +392,7 @@ static int construct_secondary_tables(unsigned long *table_ptrs, if ( config->table_flags & ACPI_HAS_SSDT_S4 ) { - ssdt = mem_alloc(sizeof(ssdt_s4), 16); + 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; @@ -399,12 +406,12 @@ static int construct_secondary_tables(unsigned long *table_ptrs, (config->tis_hdr[1] == tis_signature[1]) && (config->tis_hdr[2] == tis_signature[2]) ) { - ssdt = mem_alloc(sizeof(ssdt_tpm), 16); + 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; - tcpa = mem_alloc(sizeof(struct acpi_20_tcpa), 16); + 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; @@ -417,9 +424,9 @@ static int construct_secondary_tables(unsigned long *table_ptrs, 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 ) + if ( (lasa = ctxt->mem_ops.alloc(ctxt, ACPI_2_0_TCPA_LAML_SIZE, 16)) != NULL ) { - tcpa->lasa = virt_to_phys(lasa); + tcpa->lasa = ctxt->mem_ops.v2p(ctxt, lasa); tcpa->laml = ACPI_2_0_TCPA_LAML_SIZE; memset(lasa, 0, tcpa->laml); set_checksum(tcpa, @@ -431,8 +438,8 @@ static int construct_secondary_tables(unsigned long *table_ptrs, /* SRAT and SLIT */ if ( config->numa.nr_vnodes > 0 ) { - struct acpi_20_srat *srat = construct_srat(config); - struct acpi_20_slit *slit = construct_slit(config); + struct acpi_20_srat *srat = construct_srat(ctxt, config); + struct acpi_20_slit *slit = construct_slit(ctxt, config); if ( srat ) table_ptrs[nr_tables++] = (unsigned long)srat; @@ -445,7 +452,8 @@ static int construct_secondary_tables(unsigned long *table_ptrs, } /* Load any additional tables passed through. */ - nr_tables += construct_passthrough_tables(table_ptrs, nr_tables, config); + nr_tables += construct_passthrough_tables(ctxt, table_ptrs, + nr_tables, config); table_ptrs[nr_tables] = 0; return nr_tables; @@ -458,7 +466,8 @@ static int construct_secondary_tables(unsigned long *table_ptrs, * * Return 0 if memory failure, != 0 if success */ -static int new_vm_gid(struct acpi_config *config, +static int new_vm_gid(struct acpi_ctxt *ctxt, + struct acpi_config *config, struct acpi_info *info) { uint64_t *buf; @@ -470,19 +479,19 @@ static int new_vm_gid(struct acpi_config *config, return 1; /* copy to allocate BIOS memory */ - buf = mem_alloc(sizeof(config->vm_gid), 8); + buf = ctxt->mem_ops.alloc(ctxt, sizeof(config->vm_gid), 8); if ( !buf ) return 0; memcpy(buf, config->vm_gid, sizeof(config->vm_gid)); /* set the address into ACPI table and also pass it back to the caller */ - info->vm_gid_addr = virt_to_phys(buf); - config->vm_gid_addr = virt_to_phys(buf); + info->vm_gid_addr = ctxt->mem_ops.v2p(ctxt, buf); + config->vm_gid_addr = info->vm_gid_addr; return 1; } -void acpi_build_tables(struct acpi_config *config) +void acpi_build_tables(struct acpi_ctxt *ctxt, struct acpi_config *config) { struct acpi_info *acpi_info; struct acpi_20_rsdp *rsdp; @@ -513,7 +522,7 @@ void acpi_build_tables(struct acpi_config *config) * Fill in high-memory data structures, starting at @buf. */ - facs = mem_alloc(sizeof(struct acpi_20_facs), 16); + facs = ctxt->mem_ops.alloc(ctxt, sizeof(struct acpi_20_facs), 16); if (!facs) goto oom; memcpy(facs, &Facs, sizeof(struct acpi_20_facs)); @@ -527,13 +536,13 @@ void acpi_build_tables(struct acpi_config *config) */ if ( config->hvminfo->nr_vcpus <= 15 && config->dsdt_15cpu) { - dsdt = mem_alloc(config->dsdt_15cpu_len, 16); + dsdt = ctxt->mem_ops.alloc(ctxt, config->dsdt_15cpu_len, 16); if (!dsdt) goto oom; memcpy(dsdt, config->dsdt_15cpu, config->dsdt_15cpu_len); } else { - dsdt = mem_alloc(config->dsdt_anycpu_len, 16); + dsdt = ctxt->mem_ops.alloc(ctxt, config->dsdt_anycpu_len, 16); if (!dsdt) goto oom; memcpy(dsdt, config->dsdt_anycpu, config->dsdt_anycpu_len); } @@ -546,7 +555,7 @@ void acpi_build_tables(struct acpi_config *config) * compatible revision 1 FADT that is linked with the RSDT. Refer to: * http://www.acpi.info/presentations/S01USMOBS169_OS%20new.ppt */ - fadt_10 = mem_alloc(sizeof(struct acpi_10_fadt), 16); + fadt_10 = ctxt->mem_ops.alloc(ctxt, sizeof(struct acpi_10_fadt), 16); if (!fadt_10) goto oom; memcpy(fadt_10, &Fadt, sizeof(struct acpi_10_fadt)); fadt_10->header.length = sizeof(struct acpi_10_fadt); @@ -557,7 +566,7 @@ void acpi_build_tables(struct acpi_config *config) offsetof(struct acpi_header, checksum), sizeof(struct acpi_10_fadt)); - fadt = mem_alloc(sizeof(struct acpi_20_fadt), 16); + fadt = ctxt->mem_ops.alloc(ctxt, sizeof(struct acpi_20_fadt), 16); if (!fadt) goto oom; memcpy(fadt, &Fadt, sizeof(struct acpi_20_fadt)); fadt->dsdt = (unsigned long)dsdt; @@ -568,13 +577,13 @@ void acpi_build_tables(struct acpi_config *config) offsetof(struct acpi_header, checksum), sizeof(struct acpi_20_fadt)); - nr_secondaries = construct_secondary_tables(secondary_tables, + nr_secondaries = construct_secondary_tables(ctxt, secondary_tables, config, acpi_info); if ( nr_secondaries < 0 ) goto oom; - xsdt = mem_alloc(sizeof(struct acpi_20_xsdt)+ - sizeof(uint64_t)*nr_secondaries, + xsdt = ctxt->mem_ops.alloc(ctxt, (sizeof(struct acpi_20_xsdt) + + sizeof(uint64_t)*nr_secondaries), 16); if (!xsdt) goto oom; memcpy(xsdt, &Xsdt, sizeof(struct acpi_header)); @@ -586,7 +595,7 @@ void acpi_build_tables(struct acpi_config *config) offsetof(struct acpi_header, checksum), xsdt->header.length); - rsdt = mem_alloc(sizeof(struct acpi_20_rsdt)+ + rsdt = ctxt->mem_ops.alloc(ctxt, sizeof(struct acpi_20_rsdt) + sizeof(uint32_t)*nr_secondaries, 16); if (!rsdt) goto oom; @@ -614,7 +623,7 @@ void acpi_build_tables(struct acpi_config *config) offsetof(struct acpi_20_rsdp, extended_checksum), sizeof(struct acpi_20_rsdp)); - if ( !new_vm_gid(config, acpi_info) ) + if ( !new_vm_gid(ctxt, config, acpi_info) ) goto oom; return; diff --git a/tools/firmware/hvmloader/acpi/libacpi.h b/tools/firmware/hvmloader/acpi/libacpi.h index a251d7c..ce2d50b 100644 --- a/tools/firmware/hvmloader/acpi/libacpi.h +++ b/tools/firmware/hvmloader/acpi/libacpi.h @@ -42,6 +42,14 @@ struct acpi_numa { struct xen_vmemrange *vmemrange; }; +struct acpi_ctxt { + struct acpi_mem_ops { + void *(*alloc)(struct acpi_ctxt *ctxt, uint32_t size, uint32_t align); + void (*free)(struct acpi_ctxt *ctxt, void *v, uint32_t size); + unsigned long (*v2p)(struct acpi_ctxt *ctxt, void *v); + } mem_ops; +}; + struct acpi_config { const unsigned char *dsdt_anycpu; unsigned int dsdt_anycpu_len; @@ -78,7 +86,7 @@ struct acpi_config { unsigned int rsdp; }; -void acpi_build_tables(struct acpi_config *config); +void acpi_build_tables(struct acpi_ctxt *ctxt, struct acpi_config *config); #endif /* __LIBACPI_H__ */ diff --git a/tools/firmware/hvmloader/util.c b/tools/firmware/hvmloader/util.c index 61018ea..c9d2c0a 100644 --- a/tools/firmware/hvmloader/util.c +++ b/tools/firmware/hvmloader/util.c @@ -866,10 +866,21 @@ static uint8_t battery_port_exists(void) return (inb(0x88) == 0x1F); } +static unsigned long acpi_v2p(struct acpi_ctxt *ctxt, void *v) +{ + return virt_to_phys(v); +} + +static void *acpi_mem_alloc(struct acpi_ctxt *ctxt, uint32_t size, uint32_t align) +{ + return mem_alloc(size, align); +} + void hvmloader_acpi_build_tables(struct acpi_config *config, unsigned int physical) { const char *s; + struct acpi_ctxt ctxt; /* Allocate and initialise the acpi info area. */ mem_hole_populate_ram(ACPI_INFO_PHYSICAL_ADDRESS >> PAGE_SHIFT, 1); @@ -934,7 +945,10 @@ void hvmloader_acpi_build_tables(struct acpi_config *config, config->rsdp = physical; config->infop = ACPI_INFO_PHYSICAL_ADDRESS; - acpi_build_tables(config); + ctxt.mem_ops.alloc = acpi_mem_alloc; + ctxt.mem_ops.v2p = acpi_v2p; + + acpi_build_tables(&ctxt, config); hvm_param_set(HVM_PARAM_VM_GENERATION_ID_ADDR, config->vm_gid_addr); } -- 1.8.3.1 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |