[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [RFC XEN PATCH v2 08/15] tools/libacpi: add callback acpi_ctxt.p2v to get a pointer from physical address
The address of ACPI blobs passed from device model is provided via XenStore as the physical address. libacpi needs this callback to access them. Signed-off-by: Haozhong Zhang <haozhong.zhang@xxxxxxxxx> --- Cc: Jan Beulich <jbeulich@xxxxxxxx> Cc: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> Cc: Ian Jackson <ian.jackson@xxxxxxxxxxxxx> Cc: Wei Liu <wei.liu2@xxxxxxxxxx> --- tools/firmware/hvmloader/util.c | 6 ++++++ tools/firmware/hvmloader/util.h | 1 + tools/libacpi/libacpi.h | 1 + tools/libxl/libxl_x86_acpi.c | 10 ++++++++++ 4 files changed, 18 insertions(+) diff --git a/tools/firmware/hvmloader/util.c b/tools/firmware/hvmloader/util.c index d289361317..b2372a75be 100644 --- a/tools/firmware/hvmloader/util.c +++ b/tools/firmware/hvmloader/util.c @@ -871,6 +871,11 @@ static unsigned long acpi_v2p(struct acpi_ctxt *ctxt, void *v) return virt_to_phys(v); } +static void *acpi_p2v(struct acpi_ctxt *ctxt, unsigned long p) +{ + return phys_to_virt(p); +} + static void *acpi_mem_alloc(struct acpi_ctxt *ctxt, uint32_t size, uint32_t align) { @@ -970,6 +975,7 @@ void hvmloader_acpi_build_tables(struct acpi_config *config, ctxt.mem_ops.alloc = acpi_mem_alloc; ctxt.mem_ops.free = acpi_mem_free; ctxt.mem_ops.v2p = acpi_v2p; + ctxt.mem_ops.p2v = acpi_p2v; ctxt.min_alloc_byte_align = 16; diff --git a/tools/firmware/hvmloader/util.h b/tools/firmware/hvmloader/util.h index 6062f0b8cf..6a50dae1eb 100644 --- a/tools/firmware/hvmloader/util.h +++ b/tools/firmware/hvmloader/util.h @@ -200,6 +200,7 @@ xen_pfn_t mem_hole_alloc(uint32_t nr_mfns); /* Allocate memory in a reserved region below 4GB. */ void *mem_alloc(uint32_t size, uint32_t align); #define virt_to_phys(v) ((unsigned long)(v)) +#define phys_to_virt(p) ((void *)(p)) /* Allocate memory in a scratch region */ void *scratch_alloc(uint32_t size, uint32_t align); diff --git a/tools/libacpi/libacpi.h b/tools/libacpi/libacpi.h index 2049a1b032..48acf9583c 100644 --- a/tools/libacpi/libacpi.h +++ b/tools/libacpi/libacpi.h @@ -50,6 +50,7 @@ struct acpi_ctxt { 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); + void *(*p2v)(struct acpi_ctxt *ctxt, unsigned long p); } mem_ops; uint32_t min_alloc_byte_align; /* minimum alignment used by mem_ops.alloc */ diff --git a/tools/libxl/libxl_x86_acpi.c b/tools/libxl/libxl_x86_acpi.c index f242450166..2622e03ce6 100644 --- a/tools/libxl/libxl_x86_acpi.c +++ b/tools/libxl/libxl_x86_acpi.c @@ -52,6 +52,15 @@ static unsigned long virt_to_phys(struct acpi_ctxt *ctxt, void *v) libxl_ctxt->alloc_base_paddr); } +static void *phys_to_virt(struct acpi_ctxt *ctxt, unsigned long p) +{ + struct libxl_acpi_ctxt *libxl_ctxt = + CONTAINER_OF(ctxt, struct libxl_acpi_ctxt, c); + + return (void *)((p - libxl_ctxt->alloc_base_paddr) + + libxl_ctxt->alloc_base_vaddr); +} + static void *mem_alloc(struct acpi_ctxt *ctxt, uint32_t size, uint32_t align) { @@ -181,6 +190,7 @@ int libxl__dom_load_acpi(libxl__gc *gc, libxl_ctxt.c.mem_ops.alloc = mem_alloc; libxl_ctxt.c.mem_ops.v2p = virt_to_phys; + libxl_ctxt.c.mem_ops.p2v = phys_to_virt; libxl_ctxt.c.mem_ops.free = acpi_mem_free; libxl_ctxt.c.min_alloc_byte_align = 16; -- 2.12.0 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |