On 07/01/2015 18:36, Eduardo Habkost wrote: > The Memory Device size calculation logic is broken when the RAM size is > a multiple of 16GB, making the size of the last entry be 0 instead of > 16GB. Fix the logic to handle that case correctly. > > Signed-off-by: Eduardo Habkost <ehabk...@redhat.com> > --- > hw/i386/smbios.c | 3 ++- > 1 file changed, 2 insertions(+), 1 deletion(-) > > diff --git a/hw/i386/smbios.c b/hw/i386/smbios.c > index 024e594..ae7032a 100644 > --- a/hw/i386/smbios.c > +++ b/hw/i386/smbios.c > @@ -850,7 +850,8 @@ void smbios_get_tables(uint8_t **tables, size_t > *tables_len, > } > > #define MAX_DIMM_SZ (16ll * ONE_GB) > -#define GET_DIMM_SZ ((i < dimm_cnt - 1) ? MAX_DIMM_SZ : ram_size % > MAX_DIMM_SZ) > +#define GET_DIMM_SZ ((i < dimm_cnt - 1) ? MAX_DIMM_SZ \ > + : ((ram_size - 1) % MAX_DIMM_SZ) + 1) > > dimm_cnt = QEMU_ALIGN_UP(ram_size, MAX_DIMM_SZ) / MAX_DIMM_SZ;
Using "dimm_size = MAX(ram_size, MAX_DIMM_SZ); ram_size -= dimm_size" would have been less weird, but the whole code here is interesting so your patch is just keeping with the style. We all do that. :) Reviewed-by: Paolo Bonzini <pbonz...@redhat.com>