Annotation of qemu/pc-bios/bios-pq/0004_kvm-bios-resolve-memory-device-roll-over-reporting--issues-with-32g-guests.patch, revision 1.1.1.1

1.1       root        1: resolve memory device roll over reporting  issues with >32G guests (Bill Rieske)
                      2: 
                      3: The field within the Memory Device type 17 is only a word with the MSB being
                      4: used to report MB/KB.  Thereby, a guest with 32G and greater would report
                      5: incorrect memory device information rolling over to 0.
                      6: 
                      7: This presents more than one memory device and associated memory structures
                      8: if the memory is larger than 16G
                      9: 
                     10: Signed-off-by: Bill Rieske <[email protected]>
                     11: Signed-off-by: Avi Kivity <[email protected]>
                     12: Signed-off-by: Anthony Liguori <[email protected]>
                     13: 
                     14: Index: bochs/bios/rombios32.c
                     15: ===================================================================
                     16: --- bochs.orig/bios/rombios32.c
                     17: +++ bochs/bios/rombios32.c
                     18: @@ -381,6 +381,17 @@ int vsnprintf(char *buf, int buflen, con
                     19:      return buf - buf0;
                     20:  }
                     21: 
                     22: +int snprintf(char * buf, size_t size, const char *fmt, ...)
                     23: +{
                     24: +      va_list args;
                     25: +      int i;
                     26: +
                     27: +      va_start(args, fmt);
                     28: +      i=vsnprintf(buf,size,fmt,args);
                     29: +      va_end(args);
                     30: +      return i;
                     31: +}
                     32: +
                     33:  void bios_printf(int flags, const char *fmt, ...)
                     34:  {
                     35:      va_list ap;
                     36: @@ -2039,7 +2050,7 @@ smbios_type_4_init(void *start, unsigned
                     37: 
                     38:  /* Type 16 -- Physical Memory Array */
                     39:  static void *
                     40: -smbios_type_16_init(void *start, uint32_t memsize)
                     41: +smbios_type_16_init(void *start, uint32_t memsize, int nr_mem_devs)
                     42:  {
                     43:      struct smbios_type_16 *p = (struct smbios_type_16*)start;
                     44: 
                     45: @@ -2052,7 +2063,7 @@ smbios_type_16_init(void *start, uint32_
                     46:      p->error_correction = 0x01; /* other */
                     47:      p->maximum_capacity = memsize * 1024;
                     48:      p->memory_error_information_handle = 0xfffe; /* none provided */
                     49: -    p->number_of_memory_devices = 1;
                     50: +    p->number_of_memory_devices = nr_mem_devs;
                     51: 
                     52:      start += sizeof(struct smbios_type_16);
                     53:      *((uint16_t *)start) = 0;
                     54: @@ -2062,20 +2073,19 @@ smbios_type_16_init(void *start, uint32_
                     55: 
                     56:  /* Type 17 -- Memory Device */
                     57:  static void *
                     58: -smbios_type_17_init(void *start, uint32_t memory_size_mb)
                     59: +smbios_type_17_init(void *start, uint32_t memory_size_mb, int instance)
                     60:  {
                     61:      struct smbios_type_17 *p = (struct smbios_type_17 *)start;
                     62: 
                     63:      p->header.type = 17;
                     64:      p->header.length = sizeof(struct smbios_type_17);
                     65: -    p->header.handle = 0x1100;
                     66: +    p->header.handle = 0x1100 + instance;
                     67: 
                     68:      p->physical_memory_array_handle = 0x1000;
                     69:      p->total_width = 64;
                     70:      p->data_width = 64;
                     71: -    /* truncate memory_size_mb to 16 bits and clear most significant
                     72: -       bit [indicates size in MB] */
                     73: -    p->size = (uint16_t) memory_size_mb & 0x7fff;
                     74: +/* TODO: should assert in case something is wrong   ASSERT((memory_size_mb & ~0x7fff) == 0); */
                     75: +    p->size = memory_size_mb;
                     76:      p->form_factor = 0x09; /* DIMM */
                     77:      p->device_set = 0;
                     78:      p->device_locator_str = 1;
                     79: @@ -2084,8 +2094,8 @@ smbios_type_17_init(void *start, uint32_
                     80:      p->type_detail = 0;
                     81: 
                     82:      start += sizeof(struct smbios_type_17);
                     83: -    memcpy((char *)start, "DIMM 1", 7);
                     84: -    start += 7;
                     85: +    snprintf(start, 8, "DIMM %d", instance);
                     86: +    start += strlen(start) + 1;
                     87:      *((uint8_t *)start) = 0;
                     88: 
                     89:      return start+1;
                     90: @@ -2093,16 +2103,16 @@ smbios_type_17_init(void *start, uint32_
                     91: 
                     92:  /* Type 19 -- Memory Array Mapped Address */
                     93:  static void *
                     94: -smbios_type_19_init(void *start, uint32_t memory_size_mb)
                     95: +smbios_type_19_init(void *start, uint32_t memory_size_mb, int instance)
                     96:  {
                     97:      struct smbios_type_19 *p = (struct smbios_type_19 *)start;
                     98: 
                     99:      p->header.type = 19;
                    100:      p->header.length = sizeof(struct smbios_type_19);
                    101: -    p->header.handle = 0x1300;
                    102: +    p->header.handle = 0x1300 + instance;
                    103: 
                    104: -    p->starting_address = 0;
                    105: -    p->ending_address = (memory_size_mb * 1024) - 1;
                    106: +    p->starting_address = instance << 24;
                    107: +    p->ending_address = p->starting_address + (memory_size_mb << 10) - 1;
                    108:      p->memory_array_handle = 0x1000;
                    109:      p->partition_width = 1;
                    110: 
                    111: @@ -2114,18 +2124,18 @@ smbios_type_19_init(void *start, uint32_
                    112: 
                    113:  /* Type 20 -- Memory Device Mapped Address */
                    114:  static void *
                    115: -smbios_type_20_init(void *start, uint32_t memory_size_mb)
                    116: +smbios_type_20_init(void *start, uint32_t memory_size_mb, int instance)
                    117:  {
                    118:      struct smbios_type_20 *p = (struct smbios_type_20 *)start;
                    119: 
                    120:      p->header.type = 20;
                    121:      p->header.length = sizeof(struct smbios_type_20);
                    122: -    p->header.handle = 0x1400;
                    123: +    p->header.handle = 0x1400 + instance;
                    124: 
                    125: -    p->starting_address = 0;
                    126: -    p->ending_address = (memory_size_mb * 1024) - 1;
                    127: -    p->memory_device_handle = 0x1100;
                    128: -    p->memory_array_mapped_address_handle = 0x1300;
                    129: +    p->starting_address = instance << 24;
                    130: +    p->ending_address = p->starting_address + (memory_size_mb << 10) - 1;
                    131: +    p->memory_device_handle = 0x1100 + instance;
                    132: +    p->memory_array_mapped_address_handle = 0x1300 + instance;
                    133:      p->partition_row_position = 1;
                    134:      p->interleave_position = 0;
                    135:      p->interleaved_data_depth = 0;
                    136: @@ -2176,6 +2186,7 @@ void smbios_init(void)
                    137:      char *start, *p, *q;
                    138:      int memsize = (ram_end == ram_size) ? ram_size / (1024 * 1024) :
                    139:                    (ram_end - (1ull << 32) + ram_size) / (1024 * 1024);
                    140: +    int i, nr_mem_devs;
                    141: 
                    142:  #ifdef BX_USE_EBDA_TABLES
                    143:      ebda_cur_addr = align(ebda_cur_addr, 16);
                    144: @@ -2187,23 +2198,32 @@ void smbios_init(void)
                    145: 
                    146:        p = (char *)start + sizeof(struct smbios_entry_point);
                    147: 
                    148: -#define add_struct(fn) { \
                    149: +#define add_struct(fn) do{ \
                    150:      q = (fn); \
                    151:      nr_structs++; \
                    152:      if ((q - p) > max_struct_size) \
                    153:          max_struct_size = q - p; \
                    154:      p = q; \
                    155: -}
                    156: +}while (0)
                    157: 
                    158:      add_struct(smbios_type_0_init(p));
                    159:      add_struct(smbios_type_1_init(p));
                    160:      add_struct(smbios_type_3_init(p));
                    161:      for (cpu_num = 1; cpu_num <= smp_cpus; cpu_num++)
                    162:          add_struct(smbios_type_4_init(p, cpu_num));
                    163: -    add_struct(smbios_type_16_init(p, memsize));
                    164: -    add_struct(smbios_type_17_init(p, memsize));
                    165: -    add_struct(smbios_type_19_init(p, ram_end / (1024 * 1024)));
                    166: -    add_struct(smbios_type_20_init(p, ram_end / (1024 * 1024)));
                    167: +
                    168: +    /* Each 'memory device' covers up to 16GB of address space. */
                    169: +    nr_mem_devs = (memsize + 0x3fff) >> 14;
                    170: +    add_struct(smbios_type_16_init(p, memsize, nr_mem_devs));
                    171: +    for ( i = 0; i < nr_mem_devs; i++ )
                    172: +    {
                    173: +        uint32_t dev_memsize = ((i == (nr_mem_devs - 1))
                    174: +                                ? (memsize & 0x3fff) : 0x4000);
                    175: +        add_struct(smbios_type_17_init(p, dev_memsize, i));
                    176: +        add_struct(smbios_type_19_init(p, dev_memsize, i));
                    177: +        add_struct(smbios_type_20_init(p, dev_memsize, i));
                    178: +    }
                    179: +
                    180:      add_struct(smbios_type_32_init(p));
                    181:      add_struct(smbios_type_127_init(p));
                    182: 
                    183: 
                    184: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.