EDIT (20dec21): It appears that only 12.1b1 requires MonteRand - subsequent betas and the 12.1 released version do not seem to have the RDRAND problem addressed by MonteRand. Also, it appears that the 12.1 released (non-beta) version does not require SurPlus, either.
Yesterday, Monterey 12.1b1 was seeded to developers. @khronokernel observed that 12.1b1 contains a dependency on the RDRAND instruction, which effectively breaks pre-Ivy Bridge systems (that includes Mac Pro 5,1 and earlier). I am not in a position to install 12.1b1 at the moment, but I was able to create a patch blindly; see below. Thanks to @khronokernel, @educovas, and others for the quick testing.
The patches below need to be used in addition to the existing SurPlus patches. The OCLP crew already have these in hand, so I'd expect them to appear in a nightly build fairly soon (EDIT: they have). Based on what I'm hearing, it doesn't appear that the installer requires these patches, but they're necessary to actually boot the system (clarification of that point from someone who's actually installed 12.1b1 is welcome).
IMPORTANT POINTS:
Here are the patches (you'll want both), which go in the
Questions, comments, and discussion of this issue are welcome here.
Yesterday, Monterey 12.1b1 was seeded to developers. @khronokernel observed that 12.1b1 contains a dependency on the RDRAND instruction, which effectively breaks pre-Ivy Bridge systems (that includes Mac Pro 5,1 and earlier). I am not in a position to install 12.1b1 at the moment, but I was able to create a patch blindly; see below. Thanks to @khronokernel, @educovas, and others for the quick testing.
The patches below need to be used in addition to the existing SurPlus patches. The OCLP crew already have these in hand, so I'd expect them to appear in a nightly build fairly soon (EDIT: they have). Based on what I'm hearing, it doesn't appear that the installer requires these patches, but they're necessary to actually boot the system (clarification of that point from someone who's actually installed 12.1b1 is welcome).
IMPORTANT POINTS:
- The new
rdrand
instructions appear in the kernel zone memory management code, apparently performing similar functions to the code that SurPlus patched. The patches below effectively disable that randomization and allow pre-Ivy Bridge systems to operate correctly. This should be functionally identical from a user's perspective, and it probably does not degrade security in a practical sense, but it's possible that system security is impaired or compromised by these patches. Until further analysis can be done, we should assume that these patches create a potential security issue, and avoid using them on sensitive or production systems. (Of course, it's unlikely that you're installing a beta on a production system anyway, but...) - Until there are more reports of successful tests, these patches should be considered "beta" at best.
- It seems fair to assume that going forward, Apple will continue to leverage instructions from the lowest supported systems, and we'll continue to see issues like this arise as MacOS evolves. Some such foreseeable issues are easily defused, but some others I can think of could cause serious problems. Our classic Macs aren't at the end of the road quite yet, but it's probably looming in the distance. Be prepared.
- I will post a more detailed writeup of the problem and this solution when I have some time. It's possible that this will be the only change needed for 12.1, but if they release a flurry of betas like they did for 12.0, there may be a cat-and-mouse game for a while, so the writeup might have to wait until things settle down. From a high level, it's just another plot twist in the SurPlus saga, the introduction of
rdrand
instructions to handle the randomization of internal kernel memory; the patches below just remove therdrand
instructions and use a constant value instead.
Here are the patches (you'll want both), which go in the
Kernel - Patch
array, just like SurPlus. It doesn't matter if these appear before or after SurPlus, so long as they're all present. NOTE: if you're doing this manually, remember to also change the MaxKernel value in both of the existing SurPlus patches to 21.2.0!
Code:
<dict>
<key>Arch</key>
<string>x86_64</string>
<key>Base</key>
<string>_work_interval_port_type_render_server</string>
<key>Comment</key>
<string>MonteRand (12.1b1) #1</string>
<key>Count</key>
<integer>1</integer>
<key>Enabled</key>
<true/>
<key>Find</key>
<data>
D8fxc/sh8TnRc/WJyUiLlM3Q/f//
</data>
<key>Identifier</key>
<string>kernel</string>
<key>Limit</key>
<integer>3900</integer>
<key>Mask</key>
<data>
</data>
<key>MaxKernel</key>
<string>21.2.0</string>
<key>MinKernel</key>
<string>21.2.0</string>
<key>Replace</key>
<data>
McmQkJAh8TnRc/WJyUiLlM3Q/f//
</data>
<key>ReplaceMask</key>
<data>
</data>
<key>Skip</key>
<integer>0</integer>
</dict>
<dict>
<key>Arch</key>
<string>x86_64</string>
<key>Base</key>
<string>_panic_with_thread_context</string>
<key>Comment</key>
<string>MonteRand (12.1b1) #2</string>
<key>Count</key>
<integer>1</integer>
<key>Enabled</key>
<true/>
<key>Find</key>
<data>
D8fyc/uD4g+D+gd38w+3NEE=
</data>
<key>Identifier</key>
<string>kernel</string>
<key>Limit</key>
<integer>10100</integer>
<key>Mask</key>
<data>
</data>
<key>MaxKernel</key>
<string>21.2.0</string>
<key>MinKernel</key>
<string>21.2.0</string>
<key>Replace</key>
<data>
MdKQkJCD4g+D+gd38w+3NEE=
</data>
<key>ReplaceMask</key>
<data>
</data>
<key>Skip</key>
<integer>0</integer>
</dict>
Questions, comments, and discussion of this issue are welcome here.
Last edited: