[vbox-dev] [PATCH] Fix broken SMBios checksum calculation

Martin Fleisz martin.fleisz at thincast.com
Tue Feb 5 15:09:30 UTC 2019


Hi Michal,

I compile the OSE version (with some very small modifications in
VBoxBiosAlternative386.asm
<https://github.com/thincast/VirtualBox-RDP-Server/commit/98e7959e484a0145e39619dc6dbc40d3b9282520#diff-9c7472aa47554e70acbb1a4298b673e4>
but that shouldn't do any harm to my understanding) and when running
dmidecode on Ubuntu 18.04 it reports "# No SMBIOS nor DMI entry point
found, sorry.". After applying the patch everything worked just fine.
I checked with VirtualBox 6.0.4 and it works just fine out of the box
... so I guess either the checksum is somehow valid by accident or there
is some code missing/different in the OSE repository.

Best regards, Martin

On 05.02.2019 15:48, Michal Necasek wrote:
>
>   Hi Martin,
>
>  The patch looks good, but I'm struggling to reproduce the problem.
> The dmidecode utility in Ubuntu 18.04.1 and 18.10 (dmidecode version
> 3.1 in both) does not generate any complaints. So what exactly does?
>
>      Regards,
>        Michal
>
> On 2/4/2019 12:16 PM, Martin Fleisz wrote:
>> When using legacy BIOS the Intermediate Checksum of the SMBIOS Entry
>> Point Structure is calculated incorrectly.
>>
>> The calculation starts at the wrong offset (at the beginning of
>> pu8PcBios rather than pu8PcBios[i]) and creates the sum over the
>> whole pu8PcBios data instead of just the next 15 bytes.
>>
>> The patch below fixes checksum calculation and makes applications
>> like dmidecode work again in the guest.
>>
>> The patch is contributed under the terms of the MIT license.
>>
>> Cheers, Martin
>>
>> diff --git src/VBox/Devices/PC/DevPcBios.cpp
>> src/VBox/Devices/PC/DevPcBios.cpp
>> index e967adff2f..7e56cc18fe 100644
>> --- src/VBox/Devices/PC/DevPcBios.cpp
>> +++ src/VBox/Devices/PC/DevPcBios.cpp
>> @@ -1594,9 +1594,9 @@ static DECLCALLBACK(int) 
>> pcbiosConstruct(PPDMDEVINS pDevIns, int iInstance, PCF
>>               *(uint16_t*)&pThis->pu8PcBios[i + 0x06] =
>> RT_H2LE_U16(cbDmiTables);
>>               *(uint16_t*)&pThis->pu8PcBios[i + 0x0C] =
>> RT_H2LE_U16(cNumDmiTables);
>>               uint8_t u8Sum = 0;
>> -            for (unsigned j = 0; j < pThis->cbPcBios; j++)
>> -                if (j != i + 0x05)
>> -                    u8Sum += pThis->pu8PcBios[j];
>> +            for (unsigned j = 0; j < 0x0F; j++)
>> +                if (j != 0x05)
>> +                    u8Sum += pThis->pu8PcBios[i + j];
>>               pThis->pu8PcBios[i + 0x05] = -u8Sum;
>>               break;
>>           }
>>
>> _______________________________________________
>> vbox-dev mailing list
>> vbox-dev at virtualbox.org
>> https://www.virtualbox.org/mailman/listinfo/vbox-dev
>>
>
> _______________________________________________
> vbox-dev mailing list
> vbox-dev at virtualbox.org
> https://www.virtualbox.org/mailman/listinfo/vbox-dev




More information about the vbox-dev mailing list