ohmu
·
2026-10-15
1#include "chassis.h"
2#include "common/debug.h"
3#include "common/smbios.h"
4
5// 7.4
6typedef struct [[gnu::packed]] FFSmbiosSystemEnclosure {
7 FFSmbiosHeader Header;
8
9 uint8_t Manufacturer; // string
10 uint8_t Type; // varies
11 uint8_t Version; // string
12 uint8_t SerialNumber; // string
13 uint8_t AssetTagNumber; // string
14
15 // 2.1+
16 uint8_t BootupState; // enum
17 uint8_t PowerSupplyState; // enum
18 uint8_t ThermalState; // enum
19 uint8_t SecurityStatus; // enum
20
21 // 2.3+
22 uint32_t OEMDefined; // varies
23 uint8_t Height; // varies
24 uint8_t NumberOfPowerCords; // varies
25 uint8_t ContainedElementCount; // varies
26 uint8_t ContainedRecordLength; // varies
27 uint8_t ContainedElements[]; // varies
28} FFSmbiosSystemEnclosure;
29
30static_assert(offsetof(FFSmbiosSystemEnclosure, ContainedElements) == 0x15,
31 "FFSmbiosSystemEnclosure: Wrong struct alignment");
32
33const char* ffDetectChassis(FFChassisResult* result) {
34 const FFSmbiosHeaderTable* smbiosTable = ffGetSmbiosHeaderTable();
35 if (!smbiosTable) {
36 FF_DEBUG("System enclosure: failed to get SMBIOS data");
37 return "Failed to get SMBIOS data";
38 }
39
40 const FFSmbiosSystemEnclosure* data = (const FFSmbiosSystemEnclosure*) (*smbiosTable)[FF_SMBIOS_TYPE_SYSTEM_ENCLOSURE];
41 if (!data) {
42 FF_DEBUG("System enclosure: section is not found in SMBIOS data");
43 return "System enclosure is not found in SMBIOS data";
44 }
45
46 const char* strings = (const char*) data + data->Header.Length;
47
48 ffStrbufSetStatic(&result->vendor, ffSmbiosLocateString(strings, data->Manufacturer));
49 ffCleanUpSmbiosValue(&result->vendor);
50 ffStrbufSetStatic(&result->serial, ffSmbiosLocateString(strings, data->SerialNumber));
51 ffCleanUpSmbiosValue(&result->serial);
52 ffStrbufSetStatic(&result->version, ffSmbiosLocateString(strings, data->Version));
53 ffCleanUpSmbiosValue(&result->version);
54 ffStrbufSetStatic(&result->type, ffChassisTypeToString(data->Type));
55
56 return nullptr;
57}