===================================================================
@@ -132,6 +132,15 @@ u16 qemu_cfg_smbios_entries(void)
return cnt;
}
+int qemu_cfg_read_e820_reserve(struct qemu_cfg_e820_reserve *reserve)
+{
+ if (!qemu_cfg_present)
+ return 0;
+
+ qemu_cfg_read((void *)reserve, sizeof(*reserve));
+ return reserve->length;
+}
+
struct smbios_header {
u16 length;
u8 type;
===================================================================
@@ -36,6 +36,7 @@ static inline int kvm_para_available(voi
#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_RESERVE (QEMU_CFG_ARCH_LOCAL + 3)
extern int qemu_cfg_present;
@@ -61,8 +62,14 @@ typedef struct QemuCfgFile {
char name[56];
} QemuCfgFile;
+struct qemu_cfg_e820_reserve {
+ u32 addr;
+ u32 length;
+};
+
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);
+int qemu_cfg_read_e820_reserve(struct qemu_cfg_e820_reserve *reserve);
#endif
===================================================================
@@ -135,10 +135,16 @@ ram_probe(void)
, E820_RESERVED);
add_e820(BUILD_BIOS_ADDR, BUILD_BIOS_SIZE, E820_RESERVED);
- if (kvm_para_available())
- // 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);
+ if (kvm_para_available()) {
+ struct qemu_cfg_e820_reserve e820_reserve;
+ if (qemu_cfg_read_e820_reserve(&e820_reserve))
+ add_e820(e820_reserve.addr, e820_reserve.length, E820_RESERVED);
+ else {
+ // 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);