hvmloader: Fix SMBIOS memory device length boundary condition.
authorKeir Fraser <keir.fraser@citrix.com>
Mon, 12 Jan 2009 10:23:55 +0000 (10:23 +0000)
committerKeir Fraser <keir.fraser@citrix.com>
Mon, 12 Jan 2009 10:23:55 +0000 (10:23 +0000)
dev_memsize ends up 0 when it shouldn't be on 16G boundary conditions.

Signed-off-by: Bill Rieske <brieske@novell.com>
Signed-off-by: Keir Fraser <keir.fraser@citrix.com>
tools/firmware/hvmloader/smbios.c

index d8667f41ab16c36ccd12d442da1eaa6c120c7c31..64fa799c0b882d9d515142951e603a7ccef16932 100644 (file)
@@ -118,8 +118,9 @@ write_smbios_tables(void *start,
     do_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);
+        uint32_t dev_memsize = 0x4000; /* all but last covers 16GB */
+        if ( (i == (nr_mem_devs - 1)) && ((memsize & 0x3fff) != 0) )
+            dev_memsize = memsize & 0x3fff; /* last dev is <16GB */
         do_struct(smbios_type_17_init(p, dev_memsize, i));
         do_struct(smbios_type_19_init(p, dev_memsize, i));
         do_struct(smbios_type_20_init(p, dev_memsize, i));