# HG changeset patch
# User kfraser@xxxxxxxxxxxxxxxxxxxxx
# Date 1177602306 -3600
# Node ID 5754173c3d81d1e40ce393e2e81d3ee46968e2d6
# Parent ac203df11e5001097a2b20de188395acf1b0acc8
hvmloader: Place SMBIOS tables at 0xE9000. Previous location was lower
than nay native system would place them.
Signed-off-by: Keir Fraser <keir@xxxxxxxxxxxxx>
---
tools/firmware/hvmloader/smbios.h | 38 --------------------
tools/firmware/hvmloader/acpi/acpi2_0.h | 2 -
tools/firmware/hvmloader/config.h | 9 ++++
tools/firmware/hvmloader/hvmloader.c | 58 +++++++++++++++++++++++---------
tools/firmware/hvmloader/hypercall.h | 11 +++---
tools/firmware/hvmloader/smbios.c | 14 +++----
tools/firmware/hvmloader/util.c | 1
tools/firmware/hvmloader/util.h | 1
tools/firmware/rombios/rombios.c | 12 +++---
tools/libxc/xc_hvm_build.c | 15 ++------
10 files changed, 77 insertions(+), 84 deletions(-)
diff -r ac203df11e50 -r 5754173c3d81 tools/firmware/hvmloader/acpi/acpi2_0.h
--- a/tools/firmware/hvmloader/acpi/acpi2_0.h Thu Apr 26 16:15:08 2007 +0100
+++ b/tools/firmware/hvmloader/acpi/acpi2_0.h Thu Apr 26 16:45:06 2007 +0100
@@ -394,8 +394,6 @@ struct acpi_20_madt_intsrcovr {
#pragma pack ()
-#define ACPI_PHYSICAL_ADDRESS 0xEA000
-
int acpi_build_tables(uint8_t *);
#endif /* _ACPI_2_0_H_ */
diff -r ac203df11e50 -r 5754173c3d81 tools/firmware/hvmloader/config.h
--- a/tools/firmware/hvmloader/config.h Thu Apr 26 16:15:08 2007 +0100
+++ b/tools/firmware/hvmloader/config.h Thu Apr 26 16:45:06 2007 +0100
@@ -17,5 +17,14 @@
#define ROMBIOS_MAXOFFSET 0x0000FFFF
#define ROMBIOS_END (ROMBIOS_BEGIN + ROMBIOS_SIZE)
+/* Memory map. */
+#define HYPERCALL_PHYSICAL_ADDRESS 0x00080000
+#define VGABIOS_PHYSICAL_ADDRESS 0x000C0000
+#define ETHERBOOT_PHYSICAL_ADDRESS 0x000C8000
+#define VMXASSIST_PHYSICAL_ADDRESS 0x000D0000
+#define SMBIOS_PHYSICAL_ADDRESS 0x000E9000
+#define SMBIOS_MAXIMUM_SIZE 0x00001000
+#define ACPI_PHYSICAL_ADDRESS 0x000EA000
+#define ROMBIOS_PHYSICAL_ADDRESS 0x000F0000
#endif /* __HVMLOADER_CONFIG_H__ */
diff -r ac203df11e50 -r 5754173c3d81 tools/firmware/hvmloader/hvmloader.c
--- a/tools/firmware/hvmloader/hvmloader.c Thu Apr 26 16:15:08 2007 +0100
+++ b/tools/firmware/hvmloader/hvmloader.c Thu Apr 26 16:45:06 2007 +0100
@@ -19,23 +19,16 @@
* this program; if not, write to the Free Software Foundation, Inc., 59 Temple
* Place - Suite 330, Boston, MA 02111-1307 USA.
*/
+
#include "roms.h"
-#include "acpi/acpi2_0.h" /* for ACPI_PHYSICAL_ADDRESS */
+#include "acpi/acpi2_0.h"
#include "hypercall.h"
#include "util.h"
-#include "smbios.h"
#include "config.h"
#include "apic_regs.h"
#include "pci_regs.h"
#include <xen/version.h>
#include <xen/hvm/params.h>
-
-/* memory map */
-#define HYPERCALL_PHYSICAL_ADDRESS 0x00080000
-#define VGABIOS_PHYSICAL_ADDRESS 0x000C0000
-#define ETHERBOOT_PHYSICAL_ADDRESS 0x000C8000
-#define VMXASSIST_PHYSICAL_ADDRESS 0x000D0000
-#define ROMBIOS_PHYSICAL_ADDRESS 0x000F0000
asm(
" .text \n"
@@ -103,7 +96,8 @@ asm(
"stack_top: \n"
);
-extern void create_mp_tables(void);
+void create_mp_tables(void);
+int hvm_write_smbios_tables(void);
static int
cirrus_check(void)
@@ -351,17 +345,20 @@ static void cmos_write_memory_size(void)
int main(void)
{
- int acpi_sz;
+ int acpi_sz = 0, vgabios_sz = 0, etherboot_sz = 0, rombios_sz, smbios_sz;
printf("HVM Loader\n");
init_hypercalls();
printf("Writing SMBIOS tables ...\n");
- hvm_write_smbios_tables();
+ smbios_sz = hvm_write_smbios_tables();
printf("Loading ROMBIOS ...\n");
- memcpy((void *)ROMBIOS_PHYSICAL_ADDRESS, rombios, sizeof(rombios));
+ rombios_sz = sizeof(rombios);
+ if ( rombios_sz > 0x10000 )
+ rombios_sz = 0x10000;
+ memcpy((void *)ROMBIOS_PHYSICAL_ADDRESS, rombios, rombios_sz);
highbios_setup();
apic_setup();
@@ -375,12 +372,14 @@ int main(void)
printf("Loading Cirrus VGABIOS ...\n");
memcpy((void *)VGABIOS_PHYSICAL_ADDRESS,
vgabios_cirrusvga, sizeof(vgabios_cirrusvga));
+ vgabios_sz = sizeof(vgabios_cirrusvga);
}
else
{
printf("Loading Standard VGABIOS ...\n");
memcpy((void *)VGABIOS_PHYSICAL_ADDRESS,
vgabios_stdvga, sizeof(vgabios_stdvga));
+ vgabios_sz = sizeof(vgabios_stdvga);
}
if ( must_load_nic() )
@@ -388,9 +387,10 @@ int main(void)
printf("Loading ETHERBOOT ...\n");
memcpy((void *)ETHERBOOT_PHYSICAL_ADDRESS,
etherboot, sizeof(etherboot));
- }
-
- if ( get_acpi_enabled() != 0 )
+ etherboot_sz = sizeof(etherboot);
+ }
+
+ if ( get_acpi_enabled() )
{
printf("Loading ACPI ...\n");
acpi_sz = acpi_build_tables((uint8_t *)ACPI_PHYSICAL_ADDRESS);
@@ -398,6 +398,32 @@ int main(void)
}
cmos_write_memory_size();
+
+ printf("BIOS map:\n");
+ if ( vgabios_sz )
+ printf(" %05x-%05x: VGA BIOS\n",
+ VGABIOS_PHYSICAL_ADDRESS,
+ VGABIOS_PHYSICAL_ADDRESS + vgabios_sz - 1);
+ if ( etherboot_sz )
+ printf(" %05x-%05x: Etherboot ROM\n",
+ ETHERBOOT_PHYSICAL_ADDRESS,
+ ETHERBOOT_PHYSICAL_ADDRESS + etherboot_sz - 1);
+ if ( !check_amd() )
+ printf(" %05x-%05x: VMXAssist\n",
+ VMXASSIST_PHYSICAL_ADDRESS,
+ VMXASSIST_PHYSICAL_ADDRESS + sizeof(vmxassist) - 1);
+ if ( smbios_sz )
+ printf(" %05x-%05x: SMBIOS tables\n",
+ SMBIOS_PHYSICAL_ADDRESS,
+ SMBIOS_PHYSICAL_ADDRESS + smbios_sz - 1);
+ if ( acpi_sz )
+ printf(" %05x-%05x: ACPI tables\n",
+ ACPI_PHYSICAL_ADDRESS,
+ ACPI_PHYSICAL_ADDRESS + acpi_sz - 1);
+ if ( rombios_sz )
+ printf(" %05x-%05x: Main BIOS\n",
+ ROMBIOS_PHYSICAL_ADDRESS,
+ ROMBIOS_PHYSICAL_ADDRESS + rombios_sz - 1);
if ( !check_amd() )
{
diff -r ac203df11e50 -r 5754173c3d81 tools/firmware/hvmloader/hypercall.h
--- a/tools/firmware/hvmloader/hypercall.h Thu Apr 26 16:15:08 2007 +0100
+++ b/tools/firmware/hvmloader/hypercall.h Thu Apr 26 16:45:06 2007 +0100
@@ -31,17 +31,18 @@
#ifndef __HVMLOADER_HYPERCALL_H__
#define __HVMLOADER_HYPERCALL_H__
+#include <stdint.h>
#include <xen/xen.h>
+#include "config.h"
+
+#define __STR(...) #__VA_ARGS__
+#define STR(...) __STR(__VA_ARGS__)
/*
* NB. Hypercall address needs to be relative to a linkage symbol for
* some version of ld to relocate the relative calls properly.
- * Keep this in sync with HYPERCALL_PHYSICAL_ADDRESS in hvmloader.c!
*/
-#define hypercall_pa "_start - 0x80000"
-
-#define __STR(x) #x
-#define STR(x) __STR(x)
+#define hypercall_pa "_start - " STR(HYPERCALL_PHYSICAL_ADDRESS)
#define _hypercall0(type, name)
\
({ \
diff -r ac203df11e50 -r 5754173c3d81 tools/firmware/hvmloader/smbios.c
--- a/tools/firmware/hvmloader/smbios.c Thu Apr 26 16:15:08 2007 +0100
+++ b/tools/firmware/hvmloader/smbios.c Thu Apr 26 16:45:06 2007 +0100
@@ -22,12 +22,11 @@
#include <stdint.h>
#include <xen/version.h>
-#include "smbios.h"
#include "smbios_types.h"
#include "util.h"
#include "hypercall.h"
-static size_t
+static int
write_smbios_tables(void *start,
uint32_t vcpus, uint64_t memsize,
uint8_t uuid[16], char *xen_version,
@@ -82,7 +81,7 @@ get_cpu_manufacturer(char *buf, int len)
strncpy(buf, "unknown", len);
}
-static size_t
+static int
write_smbios_tables(void *start,
uint32_t vcpus, uint64_t memsize,
uint8_t uuid[16], char *xen_version,
@@ -125,7 +124,7 @@ write_smbios_tables(void *start,
SMBIOS_PHYSICAL_ADDRESS + sizeof(struct smbios_entry_point),
nr_structs);
- return (size_t)((char *)p - (char *)start);
+ return ((char *)p - (char *)start);
}
/* Calculate how much pseudo-physical memory (in MB) is allocated to us. */
@@ -156,7 +155,7 @@ get_memsize(void)
return (memsize + (1 << 20) - 1) >> 20;
}
-void
+int
hvm_write_smbios_tables(void)
{
uint8_t uuid[16]; /* ** This will break if xen_domain_handle_t is
@@ -221,16 +220,17 @@ hvm_write_smbios_tables(void)
get_vcpu_nr(), get_memsize(),
uuid, xen_version_str,
xen_major_version, xen_minor_version);
- if ( len > SMBIOS_SIZE_LIMIT )
+ if ( len > SMBIOS_MAXIMUM_SIZE )
goto error_out;
/* Okay, not too large: copy out of scratch to final location. */
memcpy((void *)SMBIOS_PHYSICAL_ADDRESS, (void *)0xC0000, len);
- return;
+ return len;
error_out:
printf("Could not write SMBIOS tables, error in hvmloader.c:"
"hvm_write_smbios_tables()\n");
+ return 0;
}
diff -r ac203df11e50 -r 5754173c3d81 tools/firmware/hvmloader/smbios.h
--- a/tools/firmware/hvmloader/smbios.h Thu Apr 26 16:15:08 2007 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,38 +0,0 @@
-/*
- * smbios.h - interface for Xen HVM SMBIOS generation
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- *
- * Copyright (C) IBM Corporation, 2006
- *
- * Authors: Andrew D. Ball <aball@xxxxxxxxxx>
- */
-
-#ifndef SMBIOS_H
-#define SMBIOS_H
-
-#include <stdint.h>
-#include <stdlib.h>
-
-/* These constants must agree with the ACPI e820 memory map as defined
- in tools/libxc/xc_hvm_build.c and the address the ROMBIOS pulls the
- SMBIOS entry point from in the smbios_init subroutine.
- */
-#define SMBIOS_PHYSICAL_ADDRESS 0x9f000
-#define SMBIOS_SIZE_LIMIT 0x800
-
-void hvm_write_smbios_tables(void);
-
-#endif /* SMBIOS_H */
diff -r ac203df11e50 -r 5754173c3d81 tools/firmware/hvmloader/util.c
--- a/tools/firmware/hvmloader/util.c Thu Apr 26 16:15:08 2007 +0100
+++ b/tools/firmware/hvmloader/util.c Thu Apr 26 16:45:06 2007 +0100
@@ -18,7 +18,6 @@
* Place - Suite 330, Boston, MA 02111-1307 USA.
*/
-#include "acpi/acpi2_0.h" /* for ACPI_PHYSICAL_ADDRESS */
#include "util.h"
#include "config.h"
#include <stdint.h>
diff -r ac203df11e50 -r 5754173c3d81 tools/firmware/hvmloader/util.h
--- a/tools/firmware/hvmloader/util.h Thu Apr 26 16:15:08 2007 +0100
+++ b/tools/firmware/hvmloader/util.h Thu Apr 26 16:45:06 2007 +0100
@@ -2,6 +2,7 @@
#define __HVMLOADER_UTIL_H__
#include <stdarg.h>
+#include <stdint.h>
#undef offsetof
#define offsetof(t, m) ((unsigned long)&((t *)0)->m)
diff -r ac203df11e50 -r 5754173c3d81 tools/firmware/rombios/rombios.c
--- a/tools/firmware/rombios/rombios.c Thu Apr 26 16:15:08 2007 +0100
+++ b/tools/firmware/rombios/rombios.c Thu Apr 26 16:45:06 2007 +0100
@@ -25,6 +25,8 @@
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
// ROM BIOS for use with Bochs/Plex x86 emulation environment
+
+#include "../hvmloader/config.h"
#define HVMASSIST
#undef HVMTEST
@@ -9409,9 +9411,9 @@ rom_scan_increment:
#ifdef HVMASSIST
-; Copy the SMBIOS entry point over from 0x9f000, where hvmloader left it.
+; Copy the SMBIOS entry point from where hvmloader left it.
; The entry point must be somewhere in 0xf0000-0xfffff on a 16-byte boundary,
-; but the tables themeselves can be elsewhere.
+; but the tables themselves can be elsewhere.
smbios_init:
push ax
push cx
@@ -9424,9 +9426,9 @@ smbios_init:
mov ax, #0xf000
mov es, ax ; destination segment is 0xf0000
mov di, #smbios_entry_point ; destination offset
- mov ax, #0x9f00
- mov ds, ax ; source segment is 0x9f000
- mov si, #0x0000 ; source offset is 0
+ mov ax, #(SMBIOS_PHYSICAL_ADDRESS>>4)
+ mov ds, ax
+ mov si, #(SMBIOS_PHYSICAL_ADDRESS&15)
cld
rep
movsb
diff -r ac203df11e50 -r 5754173c3d81 tools/libxc/xc_hvm_build.c
--- a/tools/libxc/xc_hvm_build.c Thu Apr 26 16:15:08 2007 +0100
+++ b/tools/libxc/xc_hvm_build.c Thu Apr 26 16:45:06 2007 +0100
@@ -47,20 +47,15 @@ static void build_e820map(void *e820_pag
mem_size = HVM_BELOW_4G_RAM_END;
}
- /* 0x0-0x9F000: Ordinary RAM. */
+ /* 0x0-0x9FC00: Ordinary RAM. */
e820entry[nr_map].addr = 0x0;
- e820entry[nr_map].size = 0x9F000;
+ e820entry[nr_map].size = 0x9FC00;
e820entry[nr_map].type = E820_RAM;
nr_map++;
- /*
- * 0x9F000-0x9F800: SMBIOS tables.
- * 0x9FC00-0xA0000: Extended BIOS Data Area (EBDA).
- * TODO: SMBIOS tables should be moved higher (>=0xE0000).
- * They are unusually low in our memory map: could cause problems?
- */
- e820entry[nr_map].addr = 0x9F000;
- e820entry[nr_map].size = 0x1000;
+ /* 0x9FC00-0xA0000: Extended BIOS Data Area (EBDA). */
+ e820entry[nr_map].addr = 0x9FC00;
+ e820entry[nr_map].size = 0x400;
e820entry[nr_map].type = E820_RESERVED;
nr_map++;
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|