summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--xen/arch/x86/dmi_scan.c53
1 files changed, 37 insertions, 16 deletions
diff --git a/xen/arch/x86/dmi_scan.c b/xen/arch/x86/dmi_scan.c
index e5930d27ea..d27cd3450a 100644
--- a/xen/arch/x86/dmi_scan.c
+++ b/xen/arch/x86/dmi_scan.c
@@ -12,8 +12,6 @@
#include <xen/pci.h>
#include <xen/pci_regs.h>
-#define bt_ioremap(b,l) ((void *)__acpi_map_table(b,l))
-#define bt_iounmap(b,l) ((void)0)
#define memcpy_fromio memcpy
#define alloc_bootmem(l) xmalloc_bytes(l)
@@ -111,9 +109,32 @@ enum dmi_entry_type {
#define dmi_printk(x)
#endif
-static char * __init dmi_string(struct dmi_header *dm, u8 s)
+static const void *__init bt_ioremap(paddr_t addr, unsigned int len)
{
- char *bp=(char *)dm;
+ mfn_t mfn = _mfn(PFN_DOWN(addr));
+ unsigned int offs = PAGE_OFFSET(addr);
+
+ if ( addr + len <= MB(1) )
+ return __va(addr);
+
+ if ( system_state < SYS_STATE_boot )
+ return __acpi_map_table(addr, len);
+
+ return __vmap(&mfn, PFN_UP(offs + len), 1, 1, PAGE_HYPERVISOR_RO,
+ VMAP_DEFAULT) + offs;
+}
+
+static void __init bt_iounmap(const void *ptr, unsigned int len)
+{
+ if ( (unsigned long)ptr < DIRECTMAP_VIRT_START &&
+ system_state >= SYS_STATE_boot )
+ vunmap(ptr);
+}
+
+static const char *__init dmi_string(const struct dmi_header *dm, uint8_t s)
+{
+ const char *bp = (const void *)dm;
+
bp+=dm->length;
if(!s)
return "";
@@ -133,11 +154,10 @@ static char * __init dmi_string(struct dmi_header *dm, u8 s)
*/
static int __init dmi_table(paddr_t base, u32 len, int num,
- void (*decode)(struct dmi_header *))
+ void (*decode)(const struct dmi_header *))
{
- u8 *buf;
- struct dmi_header *dm;
- u8 *data;
+ const uint8_t *buf, *data;
+ const struct dmi_header *dm;
int i=0;
buf = bt_ioremap(base, len);
@@ -301,7 +321,7 @@ typedef union {
static int __init _dmi_iterate(const struct dmi_eps *dmi,
const smbios_eps_u smbios,
- void (*decode)(struct dmi_header *))
+ void (*decode)(const struct dmi_header *))
{
int num;
u32 len;
@@ -335,7 +355,7 @@ static int __init _dmi_iterate(const struct dmi_eps *dmi,
return dmi_table(base, len, num, decode);
}
-static int __init dmi_iterate(void (*decode)(struct dmi_header *))
+static int __init dmi_iterate(void (*decode)(const struct dmi_header *))
{
struct dmi_eps dmi;
struct smbios3_eps smbios3;
@@ -370,7 +390,7 @@ static int __init dmi_iterate(void (*decode)(struct dmi_header *))
return -1;
}
-static int __init dmi_efi_iterate(void (*decode)(struct dmi_header *))
+static int __init dmi_efi_iterate(void (*decode)(const struct dmi_header *))
{
int ret = -1;
@@ -433,10 +453,11 @@ static char *__initdata dmi_ident[DMI_STRING_MAX];
* Save a DMI string
*/
-static void __init dmi_save_ident(struct dmi_header *dm, int slot, int string)
+static void __init dmi_save_ident(const struct dmi_header *dm, int slot, int string)
{
- char *d = (char*)dm;
- char *p = dmi_string(dm, d[string]);
+ const char *d = (const void *)dm;
+ const char *p = dmi_string(dm, d[string]);
+
if(p==NULL || *p == 0)
return;
if (dmi_ident[slot])
@@ -629,10 +650,10 @@ static const struct dmi_blacklist __initconstrel dmi_blacklist[] = {
* out of here.
*/
-static void __init dmi_decode(struct dmi_header *dm)
+static void __init dmi_decode(const struct dmi_header *dm)
{
#ifdef DMI_DEBUG
- u8 *data = (u8 *)dm;
+ const uint8_t *data = (const void *)dm;
#endif
switch(dm->type)