How M1 Macs can run old firmware when Intel Macs can’t

Let’s say you have an iMac 2019 running Monterey 12.0.1. With that upgrade, its firmware was updated to version 1715.40.15.0.0. When you then updated it to Monterey 12.1, its firmware updated again to 1715.60.4.0.0. When you start it up from an external disk with 12.0.1 installed, which firmware does it run?

Of course, the firmware is set not by the boot disk, but by what’s installed in that Intel Mac’s UEFI. T2 Macs are similar, only they’ve also got iBridge firmware, which behaves much the same. The difficulty with this arises if a firmware update causes a problem, such as kernel panics when waking from sleep, or incompatibility with a peripheral. You can now downgrade the iBridge firmware using Apple Configurator 2, but once the UEFI firmware has been updated there’s no going back.

Now try the same thing with an M1 Mac. Once you’ve updated its internal SSD to 12.1, its iBoot version goes from 7429.41.5 to 7429.61.2. You could of course put your M1 Mac into DFU mode and restore the whole internal SSD to 12.0.1 using the appropriate IPSW image. But what if you were to start that Mac up from an external SSD with 12.0.1 installed on it?

The correct answer is that, when booted from an external disk, that M1 Mac starts up with the iBoot version paired with that version of Monterey, which could be different from that installed on the internal SSD. Not only that, but the firmware loaded onto its many subsystems during startup also matches the iBoot version (for details see the Appendix). In effect, apart from the most basic of the M1’s firmware, the LLB, everything else is now paired with the macOS version being run, including iBoot and Recovery.

Let’s say your M1 Mac is running fine with Monterey 12.1, then you update to 12.2 and it starts to panic whenever you connect an external display. One quick workaround is to install 12.1 on an external SSD and boot it from that. Because that includes not just macOS 12.1, but also iBoot 7429.61.2 and the paired Recovery too, that’s likely to be as effective as trying to revert to 12.1 any other way.

M1 Macs effectively have three separate parts to their ‘firmware’. They initially start booting from their Boot ROM, which hands over to the Low-Level Bootloader (LLB) to work out which disk to boot from and check iBoot. When the LLB hands over to iBoot, it loads it from the paired Preboot volume. Among other tasks, iBoot is responsible for loading firmware into many subsystems in the M1 chip. If you’re holding the Power button to enter Recovery, then it will load that from the paired Recovery volume instead.

One penalty of booting an M1 Mac from an external disk is the additional time it takes. A typical time taken from the announcement of the macOS version to the end of iBoot is around 6.2 seconds when booting from the internal SSD, and 14.8 seconds from an external SATA/USB 3 SSD.

The process is also more complicated. Apart from having ownership set correctly, the disk has to be accessed, as the following log entries demonstrate. Note the interval of well over a second between the first and second entries.
0.855174 usb-drd1-port-ss@01200000: AppleUSBHostPort::enumerateDeviceComplete_block_invoke: enumerated 0x174c/235c/0100 (Ugreen Storage Device) at 10 Gbps
0.980633 IOUSBMassStorageDriver USB device 174C235C01200000 - Ugreen, Ugreen Storage Device - re-training
2.334779 AppleFileSystemDriver: publishing boot-uuid-media=disk5s2 (External5)
2.335464 Got boot device = IOService:/AppleARMPE/arm-io/AppleT600xIO/usb-drd1@2280000/AppleT6000USBXHCI@01000000/usb-drd1-port-ss@01200000/Ugreen Storage Device@01200000/IOUSBHostInterface@0/IOUSBMassStorageInterfaceNub/IOUSBMassStorageDriverNub/IOUSBMassStorageUASDriver/IOSCSITargetDevice/IOSCSIHierarchicalLogicalUnit@0000000000000000/IOSCSIPeripheralDeviceType00/IOBlockStorageServices/IOBlockStorageDriver/Samsung SSD 860 EVO 1TB Media/IOGUIDPartitionScheme/Untitled 3@3/AppleAPFSContainerScheme/AppleAPFSMedia/AppleAPFSContainer
2.335476 BSD root: disk5s2
2.335481 , major 1, minor 28
2.634863 apfs_vfsop_mount:2167: disk5s2 Rooting from snapshot with xid 705.
2.634878 apfs_log_mount_unmount:1825: disk5s2 mounting volume External5, requested by: kernel_task (pid 0); parent: kernel_task (pid 0)
2.635112 handle_snapshot_mount:885: disk5s2 mounting snapshot w/snap_xid 705 and sblock oid 0x11be77
2.641844 is_root_hash_authentication_required_osx:369: disk5s2 Release kext with internal build: 0, ARV disabled: 0, booting xid: 0
2.641850 is_root_hash_authentication_required:478: disk5s2 root volume, root hash authentication is required
2.641856 authenticate_root_hash:546: disk5s2 successfully validated on-disk root hash
2.657114 is_root_hash_authentication_required_osx:369: disk5s2 Release kext with internal build: 0, ARV disabled: 0, booting xid: 0
2.657121 is_root_hash_authentication_required:478: disk5s2 root volume, root hash authentication is required
2.676947 trying to find and mount BaseSystem dmg as root volume
2.676965 attempting kernel mount for recovery volume...
2.698796 er_state_obj_get_for_recovery:6381: disk5s4 No ER state object for volume Recovery - rolling is not happening, nothing to recover.
2.698890 handle_mount:654: disk5s4 vol-uuid: 90A327B6-2DFB-4F0B-B724-A222EF7A7A74 block size: 4096 block count: 146484375 (unencrypted; flags: 0x1; features: 1.0.2)
2.703090 handle_mount:667: disk5s4 setting dev block size to 4096 from 512
2.703100 nx_volume_group_update:7709: disk5s4 Volume Recovery role 4 Not a System or data volume
2.703484 mounted recovery volume

Appendix: Some version numbers disclosed in logs

1. macOS 12.0.1 booted on an external SSD
Darwin Kernel Version 21.1.0: Wed Oct 13 17:33:01 PDT 2021; root:xnu-8019.41.5~1/RELEASE_ARM64_T6000
iBoot version: iBoot-7429.41.5
Darwin Image4 Validator Version 4.1.0: Thu Oct 14 00:45:51 PDT 2021; root:AppleImage4-157.40.10~248/AppleImage4/RELEASE_ARM64E
AppleCredentialManager AssertMacros: defaults (value: 0x0), —, file: /System/Volumes/Data/SWE/macOS/BuildRoots/b8ff8433dc/Library/Caches/com.apple.xbs/Sources/AppleCredentialManager/AppleCredentialManager-496.41.2/AppleCredentialManager/Services/ACMKernelService.cpp:179
AppleDiskImages2 kext version: 126.40.1
AppleSEPKeyStore BUILT: Oct 14 2021 00:36:55
AudioDMAController_T600x admac-aop-audio: Built on Oct 13 2021 at 17:26:59.
IOPCIFamily pci (build 17:26:46 Oct 13 2021)
AudioDMAController_T600x admac-sio: Built on Oct 13 2021 at 17:26:59.
AppleSPMIPMU spmi-spmu _pmuNub: built 17:37:42 Oct 13 2021
AppleAVE2Driver compiled on Oct 13 2021 17:37:46 in AppleAVE2-501.6.9/
RTBuddy RTBuddy(SMC): Oct 13 2021@17:37:10
AppleAOPVoiceTriggerController v100.1 built: Oct 1 202117
RTKitAudioFramework v100.1 (built Oct 1 2021 17:51:57)
aop-audio v102.1 built Oct 1 2021 18:06:09
com.apple.filesystems.apfs, v1933.41.2, apfs-1933.41.2, 2021/10/14
kernelmanagerd KernelManagement_executables-262.41.2

2. macOS 12.1 booted from the internal SSD
Darwin Kernel Version 21.2.0: Sun Nov 28 20:28:41 PST 2021; root:xnu-8019.61.5~1/RELEASE_ARM64_T6000
iBoot version: iBoot-7429.61.2
Darwin Image4 Validator Version 4.2.0: Tue Nov 30 21:45:44 PST 2021; root:AppleImage4-157.60.2~361/AppleImage4/RELEASE_ARM64E
AppleCredentialManager AssertMacros: defaults (value: 0x0), —, file: /System/Volumes/Data/SWE/macOS/BuildRoots/5b2e67f8af/Library/Caches/com.apple.xbs/Sources/AppleCredentialManager/AppleCredentialManager-496.60.3/AppleCredentialManager/Services/ACMKernelService.cpp:179
AppleDiskImages2 kext version: 126.60.3
AppleSEPKeyStore BUILT: Nov 30 2021 21:31:02
AudioDMAController_T600x admac-aop-audio: Built on Nov 28 2021 at 20:23:18.
IOPCIFamily pci (build 20:21:52 Nov 28 2021)
AudioDMAController_T600x admac-sio: Built on Nov 28 2021 at 20:23:18.
AppleSPMIPMU spmi-mpmu _pmuNub: built 20:29:55 Nov 28 2021
AppleAVE2Driver compiled on Nov 28 2021 20:29:41 in AppleAVE2-520.21.1 prod
RTBuddy RTBuddy(SMC): Nov 28 2021@20:28:52
AppleAOPVoiceTriggerController v100.1 built: Nov 12 202123
RTKitAudioFramework v100.1 (built Nov 12 2021 23:11:34)
aop-audio v120.3 built Nov 12 2021 23:30:33
com.apple.filesystems.apfs, v1933.61.1, apfs-1933.61.1, 2021/11/30
kernelmanagerd KernelManagement_executables-262.60.4