aboutsummaryrefslogtreecommitdiff
path: root/pc-bios/bios-pq/0004_kvm-bios-resolve-memory-device-roll-over-reporting--issues-with-32g-guests.patch
diff options
context:
space:
mode:
Diffstat (limited to 'pc-bios/bios-pq/0004_kvm-bios-resolve-memory-device-roll-over-reporting--issues-with-32g-guests.patch')
-rw-r--r--pc-bios/bios-pq/0004_kvm-bios-resolve-memory-device-roll-over-reporting--issues-with-32g-guests.patch184
1 files changed, 0 insertions, 184 deletions
diff --git a/pc-bios/bios-pq/0004_kvm-bios-resolve-memory-device-roll-over-reporting--issues-with-32g-guests.patch b/pc-bios/bios-pq/0004_kvm-bios-resolve-memory-device-roll-over-reporting--issues-with-32g-guests.patch
deleted file mode 100644
index 070d610d36..0000000000
--- a/pc-bios/bios-pq/0004_kvm-bios-resolve-memory-device-roll-over-reporting--issues-with-32g-guests.patch
+++ /dev/null
@@ -1,184 +0,0 @@
-resolve memory device roll over reporting issues with >32G guests (Bill Rieske)
-
-The field within the Memory Device type 17 is only a word with the MSB being
-used to report MB/KB. Thereby, a guest with 32G and greater would report
-incorrect memory device information rolling over to 0.
-
-This presents more than one memory device and associated memory structures
-if the memory is larger than 16G
-
-Signed-off-by: Bill Rieske <brieske@novell.com>
-Signed-off-by: Avi Kivity <avi@redhat.com>
-Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
-
-Index: bochs/bios/rombios32.c
-===================================================================
---- bochs.orig/bios/rombios32.c
-+++ bochs/bios/rombios32.c
-@@ -381,6 +381,17 @@ int vsnprintf(char *buf, int buflen, con
- return buf - buf0;
- }
-
-+int snprintf(char * buf, size_t size, const char *fmt, ...)
-+{
-+ va_list args;
-+ int i;
-+
-+ va_start(args, fmt);
-+ i=vsnprintf(buf,size,fmt,args);
-+ va_end(args);
-+ return i;
-+}
-+
- void bios_printf(int flags, const char *fmt, ...)
- {
- va_list ap;
-@@ -2039,7 +2050,7 @@ smbios_type_4_init(void *start, unsigned
-
- /* Type 16 -- Physical Memory Array */
- static void *
--smbios_type_16_init(void *start, uint32_t memsize)
-+smbios_type_16_init(void *start, uint32_t memsize, int nr_mem_devs)
- {
- struct smbios_type_16 *p = (struct smbios_type_16*)start;
-
-@@ -2052,7 +2063,7 @@ smbios_type_16_init(void *start, uint32_
- p->error_correction = 0x01; /* other */
- p->maximum_capacity = memsize * 1024;
- p->memory_error_information_handle = 0xfffe; /* none provided */
-- p->number_of_memory_devices = 1;
-+ p->number_of_memory_devices = nr_mem_devs;
-
- start += sizeof(struct smbios_type_16);
- *((uint16_t *)start) = 0;
-@@ -2062,20 +2073,19 @@ smbios_type_16_init(void *start, uint32_
-
- /* Type 17 -- Memory Device */
- static void *
--smbios_type_17_init(void *start, uint32_t memory_size_mb)
-+smbios_type_17_init(void *start, uint32_t memory_size_mb, int instance)
- {
- struct smbios_type_17 *p = (struct smbios_type_17 *)start;
-
- p->header.type = 17;
- p->header.length = sizeof(struct smbios_type_17);
-- p->header.handle = 0x1100;
-+ p->header.handle = 0x1100 + instance;
-
- p->physical_memory_array_handle = 0x1000;
- p->total_width = 64;
- p->data_width = 64;
-- /* truncate memory_size_mb to 16 bits and clear most significant
-- bit [indicates size in MB] */
-- p->size = (uint16_t) memory_size_mb & 0x7fff;
-+/* TODO: should assert in case something is wrong ASSERT((memory_size_mb & ~0x7fff) == 0); */
-+ p->size = memory_size_mb;
- p->form_factor = 0x09; /* DIMM */
- p->device_set = 0;
- p->device_locator_str = 1;
-@@ -2084,8 +2094,8 @@ smbios_type_17_init(void *start, uint32_
- p->type_detail = 0;
-
- start += sizeof(struct smbios_type_17);
-- memcpy((char *)start, "DIMM 1", 7);
-- start += 7;
-+ snprintf(start, 8, "DIMM %d", instance);
-+ start += strlen(start) + 1;
- *((uint8_t *)start) = 0;
-
- return start+1;
-@@ -2093,16 +2103,16 @@ smbios_type_17_init(void *start, uint32_
-
- /* Type 19 -- Memory Array Mapped Address */
- static void *
--smbios_type_19_init(void *start, uint32_t memory_size_mb)
-+smbios_type_19_init(void *start, uint32_t memory_size_mb, int instance)
- {
- struct smbios_type_19 *p = (struct smbios_type_19 *)start;
-
- p->header.type = 19;
- p->header.length = sizeof(struct smbios_type_19);
-- p->header.handle = 0x1300;
-+ p->header.handle = 0x1300 + instance;
-
-- p->starting_address = 0;
-- p->ending_address = (memory_size_mb * 1024) - 1;
-+ p->starting_address = instance << 24;
-+ p->ending_address = p->starting_address + (memory_size_mb << 10) - 1;
- p->memory_array_handle = 0x1000;
- p->partition_width = 1;
-
-@@ -2114,18 +2124,18 @@ smbios_type_19_init(void *start, uint32_
-
- /* Type 20 -- Memory Device Mapped Address */
- static void *
--smbios_type_20_init(void *start, uint32_t memory_size_mb)
-+smbios_type_20_init(void *start, uint32_t memory_size_mb, int instance)
- {
- struct smbios_type_20 *p = (struct smbios_type_20 *)start;
-
- p->header.type = 20;
- p->header.length = sizeof(struct smbios_type_20);
-- p->header.handle = 0x1400;
-+ p->header.handle = 0x1400 + instance;
-
-- p->starting_address = 0;
-- p->ending_address = (memory_size_mb * 1024) - 1;
-- p->memory_device_handle = 0x1100;
-- p->memory_array_mapped_address_handle = 0x1300;
-+ p->starting_address = instance << 24;
-+ p->ending_address = p->starting_address + (memory_size_mb << 10) - 1;
-+ p->memory_device_handle = 0x1100 + instance;
-+ p->memory_array_mapped_address_handle = 0x1300 + instance;
- p->partition_row_position = 1;
- p->interleave_position = 0;
- p->interleaved_data_depth = 0;
-@@ -2176,6 +2186,7 @@ void smbios_init(void)
- char *start, *p, *q;
- int memsize = (ram_end == ram_size) ? ram_size / (1024 * 1024) :
- (ram_end - (1ull << 32) + ram_size) / (1024 * 1024);
-+ int i, nr_mem_devs;
-
- #ifdef BX_USE_EBDA_TABLES
- ebda_cur_addr = align(ebda_cur_addr, 16);
-@@ -2187,23 +2198,32 @@ void smbios_init(void)
-
- p = (char *)start + sizeof(struct smbios_entry_point);
-
--#define add_struct(fn) { \
-+#define add_struct(fn) do{ \
- q = (fn); \
- nr_structs++; \
- if ((q - p) > max_struct_size) \
- max_struct_size = q - p; \
- p = q; \
--}
-+}while (0)
-
- add_struct(smbios_type_0_init(p));
- add_struct(smbios_type_1_init(p));
- add_struct(smbios_type_3_init(p));
- for (cpu_num = 1; cpu_num <= smp_cpus; cpu_num++)
- add_struct(smbios_type_4_init(p, cpu_num));
-- add_struct(smbios_type_16_init(p, memsize));
-- add_struct(smbios_type_17_init(p, memsize));
-- add_struct(smbios_type_19_init(p, ram_end / (1024 * 1024)));
-- add_struct(smbios_type_20_init(p, ram_end / (1024 * 1024)));
-+
-+ /* Each 'memory device' covers up to 16GB of address space. */
-+ nr_mem_devs = (memsize + 0x3fff) >> 14;
-+ add_struct(smbios_type_16_init(p, memsize, nr_mem_devs));
-+ for ( i = 0; i < nr_mem_devs; i++ )
-+ {
-+ uint32_t dev_memsize = ((i == (nr_mem_devs - 1))
-+ ? (memsize & 0x3fff) : 0x4000);
-+ add_struct(smbios_type_17_init(p, dev_memsize, i));
-+ add_struct(smbios_type_19_init(p, dev_memsize, i));
-+ add_struct(smbios_type_20_init(p, dev_memsize, i));
-+ }
-+
- add_struct(smbios_type_32_init(p));
- add_struct(smbios_type_127_init(p));
-
-
-