#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);
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++;
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. */
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;
+}
/*
#include <sys/ioctl.h>
#include "xenctrl.h"
+#include "xc_e820.h"
#include <xen/sys/privcmd.h>
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__ */