ohmu
·
2026-10-15
1#include "board.h"
2#include "common/debug.h"
3#include "common/smbios.h"
4
5typedef struct [[gnu::packed]] FFSmbiosBaseboard {
6 FFSmbiosHeader Header;
7
8 uint8_t Manufacturer; // string
9 uint8_t Product; // string
10 uint8_t Version; // string
11 uint8_t SerialNumber; // string
12 uint8_t AssetTag; // string
13 uint8_t FeatureFlags; // bit field
14 uint8_t LocationInChassis; // string
15 uint16_t ChassisHandle; // varies
16 uint8_t BoardType; // enum
17 uint8_t NumberOfContainedObjectHandles; // varies
18 uint16_t ContainedObjectHandles[]; // varies
19} FFSmbiosBaseboard;
20
21static_assert(offsetof(FFSmbiosBaseboard, ContainedObjectHandles) == 0x0F,
22 "FFSmbiosBaseboard: Wrong struct alignment");
23
24const char* ffDetectBoard(FFBoardResult* board) {
25 const FFSmbiosHeaderTable* smbiosTable = ffGetSmbiosHeaderTable();
26 if (!smbiosTable) {
27 FF_DEBUG("Baseboard information: failed to get SMBIOS data");
28 return "Failed to get SMBIOS data";
29 }
30
31 const FFSmbiosBaseboard* data = (const FFSmbiosBaseboard*) (*smbiosTable)[FF_SMBIOS_TYPE_BASEBOARD_INFO];
32 if (!data) {
33 FF_DEBUG("Baseboard information: section is not found in SMBIOS data");
34 return "Baseboard information section is not found in SMBIOS data";
35 }
36
37 const char* strings = (const char*) data + data->Header.Length;
38
39 ffStrbufSetStatic(&board->name, ffSmbiosLocateString(strings, data->Product));
40 ffCleanUpSmbiosValue(&board->name);
41 ffStrbufSetStatic(&board->serial, ffSmbiosLocateString(strings, data->SerialNumber));
42 ffCleanUpSmbiosValue(&board->serial);
43 ffStrbufSetStatic(&board->vendor, ffSmbiosLocateString(strings, data->Manufacturer));
44 ffCleanUpSmbiosValue(&board->vendor);
45 ffStrbufSetStatic(&board->version, ffSmbiosLocateString(strings, data->Version));
46 ffCleanUpSmbiosValue(&board->version);
47
48 return nullptr;
49}