[Qemu-devel] [PATCH 01/80] pc: add etc/e820 fw_cfg file

2013-11-06 Thread Charlie Shepherd
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




Re: [Qemu-devel] [PATCH 01/80] pc: add etc/e820 fw_cfg file

2013-11-06 Thread Charlie Shepherd

Sorry all, some confusion using git-publish, apologies for the spam.


Charlie