From 5e1e94473e85e654a036ecb1eb0fe0930e6b79f1 Mon Sep 17 00:00:00 2001 From: Carter Li Date: Wed, 3 Jun 2026 09:45:52 +0800 Subject: [PATCH] Bootmgr (macOS): don't hard-code the firmware name --- src/detection/bios/bios_apple.c | 7 ++++--- src/detection/bootmgr/bootmgr_apple.c | 18 ++++++++++++++++-- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/src/detection/bios/bios_apple.c b/src/detection/bios/bios_apple.c index 96845d888..6b046d2ea 100644 --- a/src/detection/bios/bios_apple.c +++ b/src/detection/bios/bios_apple.c @@ -38,9 +38,10 @@ const char* ffDetectBios(FFBiosResult* bios) { FF_IOOBJECT_AUTO_RELEASE io_registry_entry_t deviceChosen = IORegistryEntryFromPath(MACH_PORT_NULL, "IODeviceTree:/chosen"); if (deviceChosen) { - FF_CFTYPE_AUTO_RELEASE CFStringRef systemFirmwareVersion = IORegistryEntryCreateCFProperty(deviceChosen, CFSTR("system-firmware-version"), kCFAllocatorDefault, kNilOptions); - if (systemFirmwareVersion) { - ffCfStrGetString(systemFirmwareVersion, &bios->version); + FF_CFTYPE_AUTO_RELEASE CFStringRef tag = IORegistryEntryCreateCFProperty(deviceChosen, CFSTR("iboot-stage-one-tag"), kCFAllocatorDefault, kNilOptions) + ?: IORegistryEntryCreateCFProperty(deviceChosen, CFSTR("system-firmware-version"), kCFAllocatorDefault, kNilOptions); + if (tag) { + ffCfStrGetString(tag, &bios->version); uint32_t index = ffStrbufFirstIndexC(&bios->version, '-'); if (index != bios->version.length) { ffStrbufAppendNS(&bios->type, index, bios->version.chars); diff --git a/src/detection/bootmgr/bootmgr_apple.c b/src/detection/bootmgr/bootmgr_apple.c index 25f4a826b..d2b24e00e 100644 --- a/src/detection/bootmgr/bootmgr_apple.c +++ b/src/detection/bootmgr/bootmgr_apple.c @@ -11,7 +11,7 @@ static const char* detectSecureBoot(bool* result) { return "IORegistryEntryFromPath() failed"; } - FF_CFTYPE_AUTO_RELEASE CFTypeRef prop = IORegistryEntryCreateCFProperty(entryDevice, CFSTR("secure-boot"), kCFAllocatorDefault, 0); + FF_CFTYPE_AUTO_RELEASE CFTypeRef prop = IORegistryEntryCreateCFProperty(entryDevice, CFSTR("secure-boot"), kCFAllocatorDefault, kNilOptions); if (!prop) { return "IORegistryEntryCreateCFProperty() failed"; } @@ -47,7 +47,21 @@ const char* ffDetectBootmgr(FFBootmgrResult* result) { ffStrbufSetStatic(&result->firmware, "/System/Library/CoreServices/boot.efi"); } - ffStrbufSetStatic(&result->name, "iBoot"); + #ifdef __aarch64__ + FF_IOOBJECT_AUTO_RELEASE io_registry_entry_t deviceChosen = IORegistryEntryFromPath(MACH_PORT_NULL, "IODeviceTree:/chosen"); + if (deviceChosen) { + FF_CFTYPE_AUTO_RELEASE CFStringRef tag = IORegistryEntryCreateCFProperty(deviceChosen, CFSTR("iboot-stage-two-tag"), kCFAllocatorDefault, kNilOptions) + ?: IORegistryEntryCreateCFProperty(deviceChosen, CFSTR("system-firmware-version"), kCFAllocatorDefault, kNilOptions); + if (tag) { + ffCfStrGetString(tag, &result->name); + ffStrbufSubstrBeforeFirstC(&result->name, '-'); + } + } + #endif + + if (!result->name.length) { + ffStrbufSetStatic(&result->name, "iBoot"); + } detectSecureBoot(&result->secureBoot);