Renamed from Legion-5-15IAX10-OpenCore on 2026-10-31; the EFI layout is unchanged. Old links redirect here.
The OpenCore EFI, ACPI tables and config for running macOS on a Lenovo Legion 5 15IAX10 (machine type 83F0, BIOS S2CN26WW): Intel Core Ultra 9 275HX (Arrow Lake-HX), NVIDIA RTX 5070 Laptop (10DE:2D18), Intel iGPU (8086:7D67), MediaTek MT7925 Wi-Fi and Bluetooth, Realtek RTL8111 Ethernet, WD SN7100S NVMe, 2560x1600 165 Hz panel. It runs macOS Tahoe 26.7.3 (developer beta 25G416 since 2026-11-10; 26.7.2 25G332 before, which is where the NVIDIA driver was last checked) as my daily system, with macOS Sequoia 15.8.1 also booting from the same EFI. This is the config as it runs here, with the machine identity replaced by placeholders.
Most of the hardware needed its own driver, which is why this org exists. The config ties them together.
| Part | How | State |
|---|---|---|
| Boot | OpenCore 1.0.8 on its own EFI partition; Comet Lake CPUID spoof, ProvideCurrentCpuInfo, a classic MADT in place of the firmware's x2APIC-only one, 11 ACPI patches |
boots Tahoe and Sequoia; WTLLegionCbmrFix unloads a firmware driver that otherwise panics macOS |
| Graphics | WTLNvidiaGfx (fork of NullMoth's NVIDIA driver) on the RTX 5070 | Metal 3, 2560x1600 at 165 Hz, 115 W (NvGfx 2.6.2-nvgfx.1 fixed the blocks in the Dock blur) |
| Wi-Fi | WTLWireless 0.15.0: one kext, the core and its Wi-Fi menu plugin (before 2026-11-10: MtkWlan + MtkWlanNative) | the Wi-Fi menu works: scans, joins, saves networks and auto-joins at boot (boot-args mtkfe=native mtknativeif=1) |
| Bluetooth | the Bluetooth plugin of WTLWireless (MtkBt before 0.14.0) + BlueToolFixup + WTLLegionBtFix | pairing, LE, AirPods (audio only with the workaround in LegionBtFix) |
| Audio | Tahoe: WTLAudio in /Library/Extensions (Tahoe has no AppleHDA); Sequoia: AppleALC 1.9.8 with alcid=18 (ALC257; injected on both, used on Sequoia) |
speakers and volume; microphone detected, jack and HDMI untested |
| Touchpad | VoodooI2C + VoodooI2CHID + WTLI2CArrowLake | works, polled (-vi2c-force-polling) |
| Keyboard | the ITE 8258 USB controller with WTLLegionITEKbdFix; VoodooPS2 for the PS/2 device the DSDT declares | types; no backlight control; the arrow keys and F-key dome on my unit are hardware faults |
| Ethernet | RealtekRTL8111 | works |
| Battery, EC | VirtualSMC + SMCBatteryManager + ECEnabler, SSDT-EC-USBX | battery shown |
| Shut down | SSDT-FIXSHUTDOWN + _PTS rename |
powers off (before: restarted) |
| CPU | 24 cores, name via RestrictEvents, ProcessorType 0x0F01 |
works; WTLLegionCpuPower lifts the hidden power limit and gives every core its own HWP range, with a thermal guard and fan control |
| Sleep | disabled (pmset sleep 0 hibernatemode 0 standby 0) |
not supported |
| Webcam, SD, Thunderbolt | USB port enabled for the webcam | untested |
Windows stays on its own ESP and is started with F12 and Windows Boot Manager, never from the OpenCore picker (the Mac SMBIOS would leak into it).
EFI/OC/config.plist is the live config with the four identity fields set to OpenCore's sample placeholders. Everything else is as it boots here, including the DEBUG logging target (it writes opencore-*.txt to the EFI partition; harmless with a RELEASE build). Why each table, patch, quirk and kext is there: docs/HOW-IT-WORKS.md.
| Table | What |
|---|---|
SSDT-PLUG-ALT.aml |
OpenCorePkg sample: CPU power management plugin on Alder Lake and newer |
SSDT-EC-USBX-LAPTOP.aml |
fake EC for macOS and USBX power properties; the real EC stays untouched |
SSDT-RTCAWAC.aml |
STAS = 1 under Darwin: the DSDT's legacy RTC instead of AWAC |
APIC-legacy.aml |
the firmware's MADT rewritten with type-0 Local APIC entries (scripts/x2apic_to_lapic.py); XNU counts CPUs only from those, and this firmware emits x2APIC entries only, so the kernel saw 0 CPUs and died before the console. The firmware table is deleted |
SSDT-DGPU-ON.aml |
listed but disabled, and not included here: a test table from the hybrid graphics work |
SSDT-FIXSHUTDOWN.aml |
clears the xHCI controllers' PME enable at S5, so Shut Down powers off instead of restarting; needs the _PTS to ZPTS rename below |
The .dsl sources are in ACPI/. The 11 ACPI > Patch entries come from scripts/dsdt_patches.py, each with its reason: two module-level If (PCHA != Zero) blocks turned into scopes (macOS's ACPICA rejected the whole DSDT otherwise), a scope retarget, three Name + Store pairs turned into methods (sideband and USB port visibility), four _UPC fixes in Lenovo's USB table so the keyboard (HS05), Bluetooth (HS14), webcam (HS11) and a USB-A port (HS02) are connectable under macOS, and the _PTS rename.
Binaries are not in this repository. Get each from its release page; the versions are the ones running here.
| Kext | Version | From |
|---|---|---|
| Lilu | 1.7.2 | acidanthera |
| CpuTscSync | 1.1.2 | acidanthera (the first boots panicked with "Non-monotonic time") |
| VirtualSMC, SMCBatteryManager | 1.3.8 | acidanthera |
| WhateverGreen | 1.7.1 | acidanthera (the iGPU stays visible; the firmware sometimes hands the panel to it) |
| RestrictEvents | 1.1.6 | acidanthera (revpatch=sbvmm,cpuname) |
| ECEnabler | 1.0.6 | 1Revenger1 |
| NVMeFix | 1.1.3 | acidanthera |
| RealtekRTL8111 | 3.0.4 | Mieze |
| MCEReporterDisabler | 0.5 | plist only |
| LegionITEKbdFix | 1.0.0 | this org |
| VoodooPS2Controller (+ Keyboard, VoodooInput) | 2.3.7 | acidanthera |
| VoodooI2C (+ VoodooGPIO, VoodooI2CServices), VoodooI2CHID | 2.9.1 | VoodooI2C |
| LegionI2CArrowLake | 1.1.0 | this org |
| WTLWireless | 0.15.0 | this org; replaced MtkWlan, MtkWlanNative and MtkBt on 2026-11-10 |
| AMFIPass | 1.4.1 | dortania (lets WindowServer load the ad hoc signed Metal plugin) |
| AppleALC | 1.9.8 | acidanthera (audio on Sequoia, alcid=18) |
| LegionCpuProbe | 1.1.0 | this org, read-only MSR probe for the turbo question; optional |
| LegionCpuPower | 0.4.1 | this org, Tahoe only (MinKernel 25.0.0, MaxKernel 25.99.99) |
| BlueToolFixup | 2.7.2 | acidanthera (BrcmPatchRAM release) |
| LegionBtFix | 0.3.0 | this org, any Tahoe build with the same bluetoothd code, MinKernel 25.0.0, MaxKernel 25.99.99 |
| WTLWireless.kext/Contents/PlugIns/WTLWirelessBt | 0.15.0 | this org, the Bluetooth firmware loader, its own Kernel > Add entry |
| WTLWireless.kext/Contents/PlugIns/WTLWirelessNative | 0.15.0 | this org, the Wi-Fi menu part, Tahoe only (MinKernel 25.0.0, MaxKernel 25.99.99); 0.15.0 was booted on the 26.7.3 developer beta (25G416) |
| IGPUConsoleRange | 0.4 | this org (WTLHybridGfx): gives macOS a console memory range on the Intel GPU when the firmware hands the panel to it |
| XeGfxBlock | 1.1 | listed but disabled; a switch from the Intel graphics tests (WTLIntelGfx), leave it out |
Graphics is NvGfx's installer package, not injected by OpenCore. The published config.plist is the live one of 2026-11-11 (30 entries). Its two Misc > Tools entries LegionBootNext.efi and LegionProbeBoot.efi are local helpers that are not published (the first restarts into Windows Boot Manager through the firmware's BootNext, the second into a Linux test stick): remove both entries, or OpenCore will list tools it cannot start.
OpenRuntime.efi, OpenHfsPlus.efi, ResetNvramEntry.efi, ToggleSipEntry.efi and OpenCanopy.efi (the graphical picker, with EFI/OC/Resources from OcBinaryData) from OpenCore 1.0.8; LegionCbmrFix.efi 1.0.0 from this org. Tools: OpenShell.efi, and the two local helpers named above.
Kernel > Emulate:Cpuid1Dataspoofs a Comet Lake CPU (family 6 model 0xA5); XNU rejects the real family 6 model 0xC6.Kernel > Quirks:ProvideCurrentCpuInfo(hybrid CPUs need it; without it the boot hangs atEXITBS:START),DisableIoMapperandDisableIoMapperMapping(with AppleVTD on, the NVIDIA driver reads IOMMU addresses from the BARs and refuses the card),AppleXcpmCfgLock,DisableLinkeditJettison,PanicNoKextDump,PowerTimeoutKernelPanic,SetApfsTrimTimeout 0(skips the TRIM of all free space that APFS runs at every mount; after a resize it took about 20 s of each boot).Booter > Quirks:ForceExitBootServices(a real hang at ExitBootServices without it),ResizeAppleGpuBars 0(the RTX 5070 boots with an 8 GB BAR1; NvGfx resizes it back up itself),SetupVirtualMapoff,DevirtualiseMmiooff, the usual rest on.UEFI > Quirks:ReleaseUsbOwnership,RequestBootVarRouting,ResizeGpuBars -1.Misc > Boot: the graphical picker (ShowPicker true,PickerMode Externalwith OpenCanopy and the GoldenGate icons,Timeout 2,UEFI > Output > UIScale 2for the 2560x1600 panel),LauncherOption Fullso OpenCore stays first in the firmware boot order. Until 2026-10-23 there was no picker (ShowPicker false,Timeout 0).Misc > Security:SecureBootModel Disabled,Vault Optional,ScanPolicy 0x301(only APFS and HFS+ volumes are scanned, so the Windows ESP is never a picker entry).NVRAM:csr-active-config 0x0A43(unsigned and unapproved kexts, for NvGfx and VoodooHDA),WriteFlash false, the two BlueToolFixup keys,revcpunamefor the CPU name.PlatformInfo:MacBookPro16,1,ProcessorType 0x0F01(the Comet Lake spoof makes OpenCore pick a type macOS cannot name with 24 cores).boot-args:-v keepsyms=1 debug=0x100(a panic stays on screen),-vi2c-force-polling,revpatch=sbvmm,cpuname revcpu=1, the NvGfx set (nvfb=1 nvaccel=1 nvfbheads=4 -nvkmsnosmooth -nvaccelnoheadless nvrmacpibl=1 nvrmphysctl=1 nvrmnvpcf=1 nvrmtgp=1 nvfbhidpi=1 nvrmdiag=1), the AMFI relaxations NvGfx's plugin needs (amfi_get_out_of_my_way=0x1 amfi=0x80 ipc_control_port_options=0), andalcid=18for AppleALC.boot-argsadded since the first publication:gfxrst=4(stops WhateverGreen from copying the boot console into a new framebuffer when the panel is on the Intel GPU),-nmintelfboff(keeps the NVIDIA package's Intel framebuffer kext from starting at boot) andmtkfe=native mtknativeif=1(WTLWireless: the macOS Wi-Fi menu front end).
Secure Boot off (OpenCore and the drivers are unsigned). The panel can be driven by either GPU and the firmware changes its mind between boots; NvGfx handles the NVIDIA case, WhateverGreen keeps the iGPU usable for the other. Legion Space on Windows was set to GPU Working Mode dGPU, Performance profile. Resizable BAR stays on.
- Read the OpenCore install guide first; this repository replaces the "build your EFI" part for this laptop, nothing else.
- Build
EFI/OC/Kexts/from the table above,EFI/OC/Drivers/andEFI/BOOT/BOOTx64.efifrom OpenCore 1.0.8 (DEBUG if you want the logs) and LegionCbmrFix.MANIFEST.txtlists the sha256 of every file on my EFI partition, so you can check yours against it. - Generate your own identity with GenSMBIOS for
MacBookPro16,1and put it inPlatformInfo > Generic(the four placeholder fields). Do not boot with the placeholders. - Boot from USB (F12), install, then copy the EFI to its own partition. The Windows ESP on this laptop is 200 MiB and holds a custom boot shim, so I made a second EFI partition for OpenCore and let
LauncherOption Fullregister it first in the firmware boot order. - After the first desktop:
sudo pmset -a sleep 0 hibernatemode 0 disksleep 0 standby 0, then the NvGfx package, VoodooHDA, andmtkwififrom the driver repos.
Rollback: F12 and pick the USB stick with a known-good copy of this EFI. Nothing here writes to firmware NVRAM.
scripts/dsdt_patches.py: the patch list with reasons, and a tester that applies them to a dumped DSDT so you can load the result inacpiexecbefore booting.scripts/x2apic_to_lapic.py: buildsAPIC-legacy.amlfrom the firmware MADT.scripts/sanitize_config.py: what producedEFI/OC/config.plistfrom the live one.
acidanthera (OpenCore, Lilu and the kexts above), Dortania (the guides and the shutdown fix pattern, RehabMan's FixShutdown), VoodooI2C, Mieze, 1Revenger1, NullMoth Systems (the NVIDIA driver NvGfx forks), the Clover team (VoodooHDA), thanhnndev (itlmt7925, the first MT7925 driver for macOS), saspol (UltraWake, the Arrow Lake GPE 0x6B/0x6E self-wake analysis we will follow when sleep is turned on), johnfanv2 and the LenovoLegionLinux contributors (the S2CN EC and WMI fan map).
The .dsl sources, scripts and config in this repository are ISC (LICENSE). SSDT-PLUG-ALT.aml is compiled from OpenCorePkg's sample (BSD-3-Clause).