Following the guidance in this thread about using PL061 for graceful shutdown on Apple Silicon, I've configured a Linux guest with all the recommended settings, but the GPIO never actually changes when requestStopWithError() is called.
Kernel configuration:
CONFIG_GPIO_PL061=yCONFIG_KEYBOARD_GPIO=y (gpio-keys driver)CONFIG_INPUT=y, CONFIG_INPUT_EVDEV=y
What's working:
- PL061 driver loads:
pl061_gpio 20060000.pl061: PL061 GPIO chip registered - gpio-keys creates input device:
/dev/input/event0 - Interrupt registered:
17: 0 20060000.pl061 6 Edge GPIO Key Power - Init process monitors
/dev/input/event* for KEY_POWER events - API returns success:
canRequestStop() = true, requestStopWithError() returns Ok
What I observed:
Using devmem to read PL061 registers directly before and after calling requestStopWithError():
GPIODATA (0x200603FC): 0x00000000 ← GPIO stays LOW
GPIOIBE (0x20060408): 0x00000040 ← Pin 6: both edges enabled
GPIOIE (0x20060410): 0x00000040 ← Pin 6: interrupt enabled
GPIORIS (0x20060414): 0x00000000 ← No interrupt pending
The interrupt is configured for both edges (GPIOIBE bit 6 = 1), so even a brief pulse should trigger it. But:
- GPIO value never changes from 0
- Interrupt count in
/proc/interrupts stays at 0 - No KEY_POWER input event is generated
Environment:
- macOS 15.2 (Sequoia) on Apple Silicon (M3)
- Virtualization.framework via Swift/ObjC bindings
- Linux kernel 6.12 with minimal config
- Direct boot (no UEFI)
Additional observation:
I noticed that Apple's own containerization project doesn't appear to use requestStopWithError() for Linux VMs. In VZVirtualMachine+Helpers.swift, only the force stop() method is wrapped, and their vminitd agent uses signalProcess() to send signals to guest processes rather than relying on the GPIO power button mechanism.
Questions:
- Is there additional VZ configuration needed for
requestStopWithError() to signal the GPIO on ARM64 Linux guests? - Is this mechanism expected to work with Linux guests, or is an agent-based approach (like in the containerization project) the recommended pattern?
- Is there something about the device tree or gpio-keys configuration that needs to be different?
Any guidance would be appreciated. Happy to provide additional details or test specific configurations.