aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJes Sorensen <Jes.Sorensen@redhat.com>2010-02-16 09:46:08 +0100
committerKevin O'Connor <kevin@koconnor.net>2010-02-21 14:15:44 -0500
commit0360e8e69bb3a773ceb9d2b091b62c027bca862b (patch)
tree74ceeadd9385b7e4c584193a358a0c0f6f407e0f
parent7149fc813139cf564a4456815461c18a8b208e89 (diff)
downloadseabios-next.tar.gz
Seabios e820 reservation portion v3next
On 02/16/10 01:43, Kevin O'Connor wrote: > On Mon, Feb 15, 2010 at 06:33:59PM +0100, Jes Sorensen wrote: >> Hi, >> >> This is the Seabios part to match my e820 reservation via fw_cfg patch. > > This still has 'struct e820_entry' which is too similar to 'struct > e820entry' in memmap.h. Otherwise, it looks good to me. Hmmm didn't catch that one earlier, thanks for pointing it out. I have renamed it to struct e820_reservation to make it different. Hope this version does the trick then. Cheers, Jes Read optional table of e820 entries from qemu_cfg Read optional table of e820 entries through qemu_cfg, allowing QEMU to provide the location of KVM's switch area etc. rather than rely on hard coded values. For now, fall back to the old hard coded values for the TSS and EPT switch page for compatibility reasons. Compatibility code could possibly be removed in the future. Signed-off-by: Jes Sorensen <Jes.Sorensen@redhat.com>
-rw-r--r--src/paravirt.c17
-rw-r--r--src/paravirt.h9
-rw-r--r--src/post.c13
3 files changed, 38 insertions, 1 deletions
diff --git a/src/paravirt.c b/src/paravirt.c
index fc0cbfe..5c77b5c 100644
--- a/src/paravirt.c
+++ b/src/paravirt.c
@@ -132,6 +132,23 @@ u16 qemu_cfg_smbios_entries(void)
return cnt;
}
+u32 qemu_cfg_e820_entries(void)
+{
+ u32 cnt;
+
+ if (!qemu_cfg_present)
+ return 0;
+
+ qemu_cfg_read_entry(&cnt, QEMU_CFG_E820_TABLE, sizeof(cnt));
+ return cnt;
+}
+
+void* qemu_cfg_e820_load_next(void *addr)
+{
+ qemu_cfg_read(addr, sizeof(struct e820_reservation));
+ return addr;
+}
+
struct smbios_header {
u16 length;
u8 type;
diff --git a/src/paravirt.h b/src/paravirt.h
index 4cef48e..c46418f 100644
--- a/src/paravirt.h
+++ b/src/paravirt.h
@@ -36,6 +36,7 @@ static inline int kvm_para_available(void)
#define QEMU_CFG_ACPI_TABLES (QEMU_CFG_ARCH_LOCAL + 0)
#define QEMU_CFG_SMBIOS_ENTRIES (QEMU_CFG_ARCH_LOCAL + 1)
#define QEMU_CFG_IRQ0_OVERRIDE (QEMU_CFG_ARCH_LOCAL + 2)
+#define QEMU_CFG_E820_TABLE (QEMU_CFG_ARCH_LOCAL + 3)
extern int qemu_cfg_present;
@@ -61,8 +62,16 @@ typedef struct QemuCfgFile {
char name[56];
} QemuCfgFile;
+struct e820_reservation {
+ u64 address;
+ u64 length;
+ u32 type;
+};
+
u16 qemu_cfg_first_file(QemuCfgFile *entry);
u16 qemu_cfg_next_file(QemuCfgFile *entry);
u32 qemu_cfg_read_file(QemuCfgFile *entry, void *dst, u32 maxlen);
+u32 qemu_cfg_e820_entries(void);
+void* qemu_cfg_e820_load_next(void *addr);
#endif
diff --git a/src/post.c b/src/post.c
index fb3b37f..c781aa4 100644
--- a/src/post.c
+++ b/src/post.c
@@ -135,10 +135,21 @@ ram_probe(void)
, E820_RESERVED);
add_e820(BUILD_BIOS_ADDR, BUILD_BIOS_SIZE, E820_RESERVED);
- if (kvm_para_available())
+ u32 count = qemu_cfg_e820_entries();
+ if (count) {
+ struct e820_reservation entry;
+ int i;
+
+ for (i = 0; i < count; i++) {
+ qemu_cfg_e820_load_next(&entry);
+ add_e820(entry.address, entry.length, entry.type);
+ }
+ } else if (kvm_para_available()) {
+ // Backwards compatibility - provide hard coded range.
// 4 pages before the bios, 3 pages for vmx tss pages, the
// other page for EPT real mode pagetable
add_e820(0xfffbc000, 4*4096, E820_RESERVED);
+ }
dprintf(1, "Ram Size=0x%08x (0x%08x%08x high)\n"
, RamSize, (u32)(RamSizeOver4G >> 32), (u32)RamSizeOver4G);