From 31436268cbb7d842836284ed76168062b6d9d6c2 Mon Sep 17 00:00:00 2001 From: Aaron Pop Date: Thu, 2 Apr 2026 10:49:27 -0700 Subject: [PATCH] SetupDataPkg: ConfigEditor Linux support ConfigEditor was locating smbios information, but it was only coded to support windows access. Modify the implementation to support accessing linux DMI tables. --- SetupDataPkg/Tools/BoardMiscInfo.py | 37 ++++++++++++++++------------- SetupDataPkg/Tools/ConfigEditor.py | 12 ++++++---- 2 files changed, 28 insertions(+), 21 deletions(-) diff --git a/SetupDataPkg/Tools/BoardMiscInfo.py b/SetupDataPkg/Tools/BoardMiscInfo.py index 663c6abb..196e21f4 100644 --- a/SetupDataPkg/Tools/BoardMiscInfo.py +++ b/SetupDataPkg/Tools/BoardMiscInfo.py @@ -7,6 +7,7 @@ # SPDX-License-Identifier: BSD-2-Clause-Patent import ctypes +import os import struct from edk2toollib.os.uefivariablesupport import UefiVariable @@ -52,20 +53,24 @@ def get_schema_xml_hash_from_bios(): def locate_smbios_data(): - # Define constants - FIRMWARE_TABLE_ID = 0x52534D42 # 'RSMB' ascii signature for smbios table - SMBIOS_TABLE = 0x53 - - # Load the kernel32.dll library - kernel32 = ctypes.windll.kernel32 - - buffer_size = kernel32.GetSystemFirmwareTable(FIRMWARE_TABLE_ID, SMBIOS_TABLE, None, 0) - buffer = ctypes.create_string_buffer(buffer_size) - kernel32.GetSystemFirmwareTable(FIRMWARE_TABLE_ID, SMBIOS_TABLE, buffer, buffer_size) - - # Convert the buffer to bytes for easier manipulation - smbios_data = buffer.raw - return smbios_data + if os.name == 'nt': + # Define constants + FIRMWARE_TABLE_ID = 0x52534D42 # 'RSMB' ascii signature for smbios table + SMBIOS_TABLE = 0x53 + + kernel32 = ctypes.windll.kernel32 + buffer_size = kernel32.GetSystemFirmwareTable(FIRMWARE_TABLE_ID, SMBIOS_TABLE, None, 0) + buffer = ctypes.create_string_buffer(buffer_size) + kernel32.GetSystemFirmwareTable(FIRMWARE_TABLE_ID, SMBIOS_TABLE, buffer, buffer_size) + # Skip the 8-byte RawSMBIOSData header (Used20CallingMethod, Major/MinorVersion, + # DmiRevision, Length) to return only the raw SMBIOS table data. + return buffer.raw[8:] + else: + dmi_path = '/sys/firmware/dmi/tables/DMI' + if os.path.exists(dmi_path): + with open(dmi_path, 'rb') as f: + return f.read() + return b'' # Helper function to calculate the total string data of an SMBIOS entry @@ -84,8 +89,8 @@ def locate_smbios_entry(smbios_type): found_smbios_entry = [] smbios_data = locate_smbios_data() - # Offset the first 8 bytes of SMBIOS entry data - offset = 8 + # locate_smbios_data() returns raw table data with any platform header already stripped + offset = 0 # Iterate over all SMBIOS structures until we find given smbios_type while offset < len(smbios_data): diff --git a/SetupDataPkg/Tools/ConfigEditor.py b/SetupDataPkg/Tools/ConfigEditor.py index 0a4945bf..e28c20e5 100644 --- a/SetupDataPkg/Tools/ConfigEditor.py +++ b/SetupDataPkg/Tools/ConfigEditor.py @@ -586,13 +586,15 @@ def __init__(self, master=None): root.config(menu=menubar) # Checking if we are in Manufacturing mode + Manufacturing_enabled = 0 bios_info_smbios_data = BoardMiscInfo.locate_smbios_entry(0) # Check if we have the SMBIOS data in the first entry - bios_info_smbios_data = bios_info_smbios_data[0] - if (bios_info_smbios_data != []): - char_ext2_data = bios_info_smbios_data[0x13] - Manufacturing_enabled = (char_ext2_data & (0x1 << 6)) >> 6 - print(f"Manufacturing : {Manufacturing_enabled:02X}") + if bios_info_smbios_data is not None: + bios_info_smbios_data = bios_info_smbios_data[0] + if (bios_info_smbios_data != []): + char_ext2_data = bios_info_smbios_data[0x13] + Manufacturing_enabled = (char_ext2_data & (0x1 << 6)) >> 6 + print(f"Manufacturing : {Manufacturing_enabled:02X}") self.bios_schema_xml_hash = BoardMiscInfo.get_schema_xml_hash_from_bios()