From 8461f54ec5cfa40e84ac1e9d82544c99a6088778 Mon Sep 17 00:00:00 2001 From: Jean Guyader Date: Tue, 17 Feb 2009 15:44:26 +0000 Subject: [PATCH] Do a 1:1 map of the host's ACPI_NVS region when we build a hvm guest. --- tools/libxc/xc_hvm_build.c | 9 ++++----- tools/libxc/xc_linux.c | 37 ++++++++++++++++++++++++++++++++++++- tools/libxc/xc_private.h | 5 +++++ 3 files changed, 45 insertions(+), 6 deletions(-) diff --git a/tools/libxc/xc_hvm_build.c b/tools/libxc/xc_hvm_build.c index 3454619..1253de0 100644 --- a/tools/libxc/xc_hvm_build.c +++ b/tools/libxc/xc_hvm_build.c @@ -30,7 +30,8 @@ #define SPECIALPAGE_IDENT_PT 4 #define NR_SPECIAL_PAGES 5 -static void build_e820map(void *e820_page, unsigned long long mem_size) +static void build_e820map(void *e820_page, unsigned long long mem_size, + uint32_t domid, int xc_handle) { struct e820entry *e820entry = (struct e820entry *)(((unsigned char *)e820_page) + HVM_E820_OFFSET); @@ -86,9 +87,7 @@ static void build_e820map(void *e820_page, unsigned long long mem_size) e820entry[nr_map].type = E820_RESERVED; nr_map++; - e820entry[nr_map].addr = 0x7D5AE000; - e820entry[nr_map].size = 0x2000; - e820entry[nr_map].type = E820_NVS; + xc_add_acpi_nvs(xc_handle, domid, &e820entry[nr_map]); nr_map++; @@ -324,7 +323,7 @@ static int setup_guest(int xc_handle, HVM_E820_PAGE >> PAGE_SHIFT)) == NULL ) goto error_out; memset(e820_page, 0, PAGE_SIZE); - build_e820map(e820_page, v_end); + build_e820map(e820_page, v_end, dom, xc_handle); munmap(e820_page, PAGE_SIZE); /* Map and initialise shared_info page. */ diff --git a/tools/libxc/xc_linux.c b/tools/libxc/xc_linux.c index 0c70e99..21959d0 100644 --- a/tools/libxc/xc_linux.c +++ b/tools/libxc/xc_linux.c @@ -611,7 +611,42 @@ int xc_get_vgabios(unsigned char *buf, out: close(mem); return size; -} +} + +int xc_add_acpi_nvs(int xc_handle, + uint32_t domid, + struct e820entry *entry) +{ + FILE *fd; + char line[256]; + char *s; + uint64_t begin_addr, end_addr, size; + + + if ((fd = fopen("/proc/iomem", "r"))) + return 0; + + while ((fgets(line, 256, fd))) + if (strstr(line, "ACPI Non-volatile Storage")) + { + begin_addr = strtol(line, &s, 16); + end_addr = strtol(s + 1, NULL, 16); + size = end_addr - begin_addr + 1; + entry->addr = begin_addr; + entry->size = size; + entry->type = E820_NVS; + + xc_domain_memory_mapping(xc_handle, domid, + begin_addr >> XC_PAGE_SHIFT, + begin_addr >> XC_PAGE_SHIFT, + size >> XC_PAGE_SHIFT, + 1); + fclose(fd); + return 1; + } + fclose(fd); + return 0; +} /* diff --git a/tools/libxc/xc_private.h b/tools/libxc/xc_private.h index 6e49b74..1e140a7 100644 --- a/tools/libxc/xc_private.h +++ b/tools/libxc/xc_private.h @@ -14,6 +14,7 @@ #include #include "xenctrl.h" +#include "xc_e820.h" #include @@ -215,4 +216,8 @@ int xc_flush_mmu_updates(int xc_handle, struct xc_mmu *mmu); int read_exact(int fd, void *data, size_t size); int write_exact(int fd, const void *data, size_t size); +int xc_add_acpi_nvs(int xc_handle, + uint32_t domid, + struct e820entry *entry); + #endif /* __XC_PRIVATE_H__ */ -- 2.39.5