MacBook and MacBook Pro: Mac reduces processor speed when battery is removed while operating from an A/C adaptor - "If the battery is removed from a MacBook or MacBook Pro, the computer will automatically reduce the processor speed. This prevents the computer from shutting down if it demands more power than the A/C adaptor alone can provide."
Apple Notebooks Take Huge Performance Hit without Battery - "Apple's reason for forcing a drop in processor speed doesn't make a whole lot of sense."
MacBooks Run Slow Without Battery - "Gearlog's own results show a decrease of 36 percent in processor speeds without a battery attached on their unibody MacBook Pro. Our own tests show a decrease of 50 percent when rendering with one CPU, a decrease of 52 percent in multiprocessor rendering, while the GPU suffered a 40 percent decrease in performance."
"Fixing" kernel_task CPU Problems in MacOS 10.7/10.8 - Tweak IOPlatformPluginFamily.kext to disable throttling on faulty battery.
Disable OS X kernel_task throttling - Updated instructions for removing IOPlatformPluginFamily.kext.
Resolved the throttling issue on a Mid-2012 unibody MacBook Pro running Ubuntu Linux 24.04.3:
Caution: This bypasses a platform protection signal. Without a working battery, peak power demand may exceed the adapter’s capacity and cause shutdowns. Replacing the battery is the proper fix.
Confirm throttling by sampling CPU frequencies under load:
Before the workaround, all four samples showed:
MHz: [1197, 1197, 1197, 1197]
Clear bit 0 of MSR_POWER_CTL (0x1fc), leaving other bits intact:
sudo apt install msr-tools
sudo modprobe msr
original=$(sudo rdmsr -p 0 0x1fc)
printf 'Original: %s\n' "$original"
sudo wrmsr -p 0 0x1fc \
"$(printf '%x' "$((16#$original & ~1))")"
A set bit doesn't prove the signal is active, it just enables the CPU's response to it; see Intel's MSR documentation.
The CPU check now shows:
MHz: [3007, 2893, 2914, 2893] MHz: [3044, 2893, 1200, 1200] MHz: [3092, 1600, 1200, 1200] MHz: [3092, 1200, 3100, 2893]
To undo the temporary change from the same shell:
sudo wrmsr -p 0 0x1fc "$original"
To persist across boot and resume, run as root:
After replacing the battery, run as root and reboot to allow firmware to reinitialize the register:
#!/bin/bash
set -euo pipefail
systemctl disable --now disable-bd-prochot.service
rm -f /etc/systemd/system/disable-bd-prochot.service \
/usr/lib/systemd/system-sleep/disable-bd-prochot \
/usr/local/sbin/disable-bd-prochot
systemctl daemon-reload
echo "Workaround removed. Reboot now."
/mac | Nov 15, 2018