From: Gerd Hoffmann kra...@redhat.com
Unlike the existing FW_CFG_E820_TABLE entry which carries reservations
only the new etc/e820 file also has entries for RAM.
Format is simliar to the FW_CFG_E820_TABLE, it is a simple list of
e820_entry structs. Unlike FW_CFG_E820_TABLE it has no count though
as the number of entries can be figured from the file size.
Cc: Andrea Arcangeli aarca...@redhat.com
Signed-off-by: Gerd Hoffmann kra...@redhat.com
Signed-off-by: Charlie Shepherd char...@ctshepherd.com
---
hw/i386/pc.c | 39 ---
1 file changed, 28 insertions(+), 11 deletions(-)
diff --git a/hw/i386/pc.c b/hw/i386/pc.c
index dee409d..a653ae4 100644
--- a/hw/i386/pc.c
+++ b/hw/i386/pc.c
@@ -90,7 +90,9 @@ struct e820_table {
struct e820_entry entry[E820_NR_ENTRIES];
} QEMU_PACKED __attribute((__aligned__(4)));
-static struct e820_table e820_table;
+static struct e820_table e820_reserve;
+static struct e820_entry *e820_table;
+static unsigned e820_entries;
struct hpet_fw_config hpet_cfg = {.count = UINT8_MAX};
void gsi_handler(void *opaque, int n, int level)
@@ -577,19 +579,32 @@ static void handle_a20_line_change(void *opaque, int irq,
int level)
int e820_add_entry(uint64_t address, uint64_t length, uint32_t type)
{
-int index = le32_to_cpu(e820_table.count);
+int index = le32_to_cpu(e820_reserve.count);
struct e820_entry *entry;
-if (index = E820_NR_ENTRIES)
-return -EBUSY;
-entry = e820_table.entry[index++];
+if (type != E820_RAM) {
+/* old FW_CFG_E820_TABLE entry -- reservations only */
+if (index = E820_NR_ENTRIES) {
+return -EBUSY;
+}
+entry = e820_reserve.entry[index++];
+
+entry-address = cpu_to_le64(address);
+entry-length = cpu_to_le64(length);
+entry-type = cpu_to_le32(type);
+
+e820_reserve.count = cpu_to_le32(index);
+}
-entry-address = cpu_to_le64(address);
-entry-length = cpu_to_le64(length);
-entry-type = cpu_to_le32(type);
+/* new etc/e820 file -- include ram too */
+e820_table = g_realloc(e820_table,
+ sizeof(struct e820_entry) * (e820_entries+1));
+e820_table[e820_entries].address = cpu_to_le64(address);
+e820_table[e820_entries].length = cpu_to_le64(length);
+e820_table[e820_entries].type = cpu_to_le32(type);
+e820_entries++;
-e820_table.count = cpu_to_le32(index);
-return index;
+return e820_entries;
}
/* Calculates the limit to CPU APIC ID values
@@ -640,7 +655,9 @@ static FWCfgState *bochs_bios_init(void)
fw_cfg_add_bytes(fw_cfg, FW_CFG_SMBIOS_ENTRIES,
smbios_table, smbios_len);
fw_cfg_add_bytes(fw_cfg, FW_CFG_E820_TABLE,
- e820_table, sizeof(e820_table));
+ e820_reserve, sizeof(e820_reserve));
+fw_cfg_add_file(fw_cfg, etc/e820, e820_table,
+sizeof(struct e820_entry) * e820_entries);
fw_cfg_add_bytes(fw_cfg, FW_CFG_HPET, hpet_cfg, sizeof(hpet_cfg));
/* allocate memory for the NUMA channel: one (64bit) word for the number
--
1.8.4.rc3