8

I've seen some answers for this but it references older systems and older OSes.

Can anyone update this for relevance in the Catalina era. I have a MacBook 10.1 with a shot battery. The screen is broken so I am using it strictly as a media/AirPlay server to my TV and have no plans to fix the battery whatsoever. I would really like to recover the performance on this.

I have tried the remedies in other posts and the problem is there is no plist file with my MacBook model. One user mentioned letting the computer go into "default power saving mode naturally". But what does this mean? Can it be made into a script?

Finally – I heard that w/o the battery GPU is also curtailed. Is that true and can there be a holistic fix for all of this?

Glorfindel
  • 4,057
terahertz7
  • 81
  • 1
  • 1
  • 2
  • Have you used Intel Power Gadget to confirm it's throttling? – JMY1000 Jan 24 '20 at 05:22
  • If you unplug the battery and run the computer only from PSU, the system (not only GPU, CPU as well) will experience heavy throttling. Might be the issue here. The holistic fix for this is probably to replace the battery. – X_841 Jan 24 '20 at 07:05

6 Answers6

9

The CPU throttling due to battery is triggered by the firmware and it doesn't make any difference what version of macOS (or other OS) you are running.

However it is easy to override the throttling on a MacBook if you use Windows as a OS but not if you run macOS. If you don't want to replace the battery and the programs you want to run are available on Windows that would be the easiest/cheapest option.


I have a late 2012 MacBook Pro with a i5-3210 CPU which has a base clock of 2.5 GHz and max Turbo of 3.2 GHz. It has no battery as it swelled too much to fit in the case so I removed it. Like you I've no intention of getting a replacement and so in macOS the CPU is now throttled to 1.2 GHz.

With Intel Power Gadget you can easily see it.

Intel Power Gadget

The reason for this is that the EFI firmware sets on BD PROCHOT which is a CPU register (msr 0x1FC) usually used to tell the CPU that some other component (GPU or whatever) is overheating. This will cause the CPU to throttle even though it is not itself overheating. This is described in Intel® 64 and IA-32 Architectures Software Developer's Manual Volume 4: Model-Specific Registers

Although there are various macOS utilities to change other MSR (such as Turbo Boost Switcher) I can find no way to turn this one off in macOS. This is quite surprising as people facing throttling due to removed batteries is a fairly common issue. I tried to write an EFI program to do this myself but could not get it to work - see Stack Overflow question How to make changes to msr 0x199 from EFI stick?.


On Windows however there is a program called ThrottleStop which easily lets you turn off BD PROCHOT. As you can see with it set on (as it is by the MacBook firmware) the clock is limited to 1.2 GHz.

BD PROCHOT on

If you turn off BD PROCHOT and set the multiplier to 25 you can get the 2.5 GHz.

BD PROCHOT off

In theory it is possible that at peak load you could take more power than the power adapter alone can supply resulting in a shutdown. This is perhaps the reason Apple set this register on. However this has never happened to me and I've been running it like this almost 24*7 for the last couple of years.

If you did find it was shutting down you can set the multiplier to a lower number to reduce peak power draw. You can even set a higher multiplier for increased performance if you wish but I never felt the need.

lx07
  • 3,094
  • 2
    Thanks for this detailed overview. This is the best info I've seen on the subject that answers the 'why' factor. It is enlightening but also disheartening. Like you, and suggested by @JMY1000, I did DL the Intel tool and I DO see that it is stuck at 1.2 GHZ. It is usable --- I've seen some people stuck at 800mhz, but its quite unfortunate that I am only able to use a fraction of my hardware. I quite like MacOS, so we'll see what to do... If you ever find a way to fix that register plz let me know! – terahertz7 Jan 26 '20 at 02:08
  • 2
    Great answer! Most MacBooks can draw more (peak) power than their power brick are able to supply. In an older MacBook Pro (2012 I believe) I even had the issue that battery was very slowly draining in intensive gaming sessions. So the battery serves as a buffer and under ~5% capacity MBPs throttle to avoid shutdowns. – n1000 Nov 08 '20 at 12:03
  • Thanks for the detailed writeup. It's been very helpful in letting me restore several older laptops back to being useful as a daily driver with Windows 10. I haven't had any sudden shutdowns yet and they work perfectly fine for day to day tasks. – Rastilin Oct 30 '23 at 12:37
3

This solved it for me on a MacBook Pro mid-2014, macOS Catalina 10.15.3:

Before using it, I removed IOPlatformPluginFamily.kext from /System/Library/Extensions (moved it to my user folder). So I don't know if only the NoBatteryNoProblem should solve it. Also, I don't know if it needs to be run at every boot (haven't rebooted yet).

https://github.com/bernardowilson/NoBatteryNoProblem.kext

I did a fork in case the repo is removed: https://github.com/luismramirezr/NoBatteryNoProblem.kext

It appears that this also disables TurboBoost, so your CPU will consume more power (doesn't matter as there is no battery) and produce more heat (watch out for actual ThermalThrottling from inside CPU to be activated).

1

I have done a blogpot here on how to solve this https://portugnole.blogspot.com/2020/05/running-macbook-without-battery-lets-go.html

I added the code to remove the PROCHOT signal into CPUTune. You can find the project on github here: https://github.com/syscl/CPUTune

All this works on Catalina.

  • Thanks. The precompiled kext does not seem to work on Mojave though. ( I dont have xCode to re-compile. ) However ThrottleStop somehow works under parallels ... – zantafio Jul 06 '20 at 19:09
  • Cristophe I tried your solution but when I try to load the kext, the MacBook shuts down. Same thing when I copy the kext into the Extensions folder in System. I read on GitHub that for 10.15 onwards you need -cputbeta to make it work, but not sure where I shall add it. Any idea? – Marco Basile Nov 08 '20 at 10:45
1

Changing BD PROCHOT did not seem to work for me on an early 2015 MacBook Air with a missing battery. What did work though was requesting a different Target Performance State Value using the IA32_PERF_CTL (0x199) MSR as suggested in this GitHub comment.

The exact value you need to write does not seem to be officially documented. The Intel® 64 and IA-32 Architectures Software Developer Manual states that:

The 16-bit encoding that defines valid operating points is model-specific. Applications and performance tools are not expected to use either IA32_PERF_CTL or IA32_PERF_STATUS and should treat both as reserved.

However, from what I found online, it seems that the first byte is usually the requested CPU multiplier, and the second byte is always 0. You may want to verify that this matches what your machine does before proceeding.

If you want to change this value yourself, follow these steps. Confirmed to work on Big Sur.

Disclaimer: Changing settings like these, especially using interfaces as low-level as directly writing MSR registers has a potential to damage your computer. Proceed at your own risk.

  1. Download VoltageShift from https://github.com/sicreative/VoltageShift. Follow the installation instructions carefully:
    • Get the latest prebuilt package
    • Make sure the kext files are owned by root: sudo chown -R root:wheel VoltageShift.kext
    • Disable signed kext verification by booting in recovery mode and running csrutil enable --without kext in the terminal
    • If you get the failed Apple notarization warning when running voltageshift, start the binary once using Open in the Finder context menu and it should work fine in the terminal after that
    • The first time you run voltageshift, you will have to approve loading the kext and reboot
  2. Read the current target operating point from the MSR: ./voltageshift read 0x199
    • The returned value is in binary, you will probably want to convert it to hex
    • In my case, the default value for the limited CPU clock is 0x0d00
  3. Increase the value: ./voltageshift write 0x199 0xNEW_DESIRED_VALUE_IN_HEX
    • Note that this does not set the multiplier directly, but sets the max value, so you should probably set it to the max turbo clock for your CPU
    • Use Intel Power Gadget to see if the changes are taking place
    • You may want to increase the value slowly the first time you do this just in case. I don't think it will let you exceed the range of valid values, but I never tested it.

The changes are reverted after a reboot, so you shouldn't need to be too worried about changing anything permanently. Figuring out how to apply them on boot is left as an exercise to the reader (mostly because I didn't bother to do it myself yet)

Note that I did not yet figure out if and how is the GPU throttled.

krzys_h
  • 11
  • This is the only solution that brought my MacBook back to life. Bad battery and no way to quickly acquire one where I am, now I can work again. Also note that the 0x199 multiplier is in 100mhz units. For instance, a 0x1700 value means 0x17 = 23 -> 2.3 ghz. It's amazing how crippled a MacBook becomes with a bad battery. This fixes it. – magma Mar 31 '21 at 20:21
  • 1
    @magma This seems to be what happens for me as well, but I'm not sure this will always be the case. I'm not an overclocking expert, but I'm pretty sure what we are setting is the multiplier of the base clock (BCLK), which just happens to typically be 100MHz. – krzys_h Apr 01 '21 at 09:56
  • I didn't actually try this since I used ./voltageshift read 0x199and it returned x2600 which sounds like it's the actually correct number for my CPU, but I don't know much about that so I didn't feel confident enough to keep tinkering. From https://github.com/calasanmarko/TurboMac it states that it also tinkers with MSR 0x774 but when trying ./voltageshift read 0x199 it reboots instantly my computer. – loco.loop Aug 26 '22 at 17:54
0

I made a KEXT which writes to the IA32_HWP_REQUEST MSR to fix this exact issue.

Link to the TurboMac repository on GitHub.

As of writing this it's still in a pre-release state so if there are any issues please report them.

  • As it’s currently written, your answer is unclear. Please [edit] to add additional details that will help others understand how this addresses the question asked. You can find more information on how to write good answers in the help center. – Community Feb 10 '22 at 04:02
  • This didn't fix my issue. I have a Macbook Pro Retina 15" (Late 2013 / MacBookPro11,3). I changed the battery some time ago and then it said there was no battery installed, I guess the problem is that it doesn't detect it since some times (like during boot) I can remove the cable and the screen doesn't turn off. I think my computer has some problem with the SMC or something like that... I guess my problem is similar to what's fixed on this video (https://www.youtube.com/watch?v=6gme0ISQrcs). – loco.loop Aug 26 '22 at 17:48
0

I rewrote NoBatteryNoProblem.kext and made it auto load at boot time. I don't have to do something more dangerous as instructed in this article. It seems CPU/GPU will still be throttled again after wake-up from system sleep/hibernation or when it becomes really hot, but I think a hard limit like this is good. To prevent system sleep you can run launchctl submit -l caffeinate -- caffeinate -s to keep caffeinate running in the background, and stop it by launchctl remove caffeinate. Of course this only works on some Intel Core CPUs.

J.W
  • 9