打算升级10.13,发现别人的x99都成功了,但是一直还是卡在内核一加载就卡死或者重启这一步。折腾了几天,分析了kernel和以前的补丁,终于找到了解决办法。
是有我的cpu比较特殊,或者说比较稀少,需要多打一个msr相关的补丁,而这个旧的补丁的代码变了。使用otool分别分编译了一下10.12的kernel和10.13的kernel. 把这个补丁正确打上,启动起来了,一切完美。
otool -tVj 10.12/kernel > 10.12/kernel.txt
10.12 reboot fix 补丁:
Find: 554889e5415741564155415453504189d64189f74889fb4585ff0f84
Replace: c34889e5415741564155415453504189d64189f74889fb4585ff0f84
ffffff800041d014 41 57 pushq %r15
ffffff800041d016 41 56 pushq %r14
ffffff800041d018 41 55 pushq %r13
ffffff800041d01a 41 54 pushq %r12
ffffff800041d01c 53 pushq %rbx
ffffff800041d01d 50 pushq %rax
ffffff800041d01e 41 89 d6 movl %edx, %r14d
ffffff800041d021 41 89 f7 movl %esi, %r15d
ffffff800041d024 48 89 fb movq %rdi, %rbx
ffffff800041d027 45 85 ff testl %r15d, %r15d
ffffff800041d02a 0f 84 94 00 00 00 je 0xffffff800041d0c4
ffffff800041d030 48 83 c3 28 addq $0x28, %rbx
ffffff800041d034 4c 8d 25 1a 9a 56 00 leaq 0x569a1a(%rip), %r12 ## literal pool for: "%s: programming MSR 0x%x\n"
ffffff800041d03b 4c 8d 2d 2d 9a 56 00 leaq 0x569a2d(%rip), %r13 ## literal pool for: "xcpm_program_msrs"
ffffff800041d042 66 66 66 66 66 2e 0f 1f 84 00 00 00 00 00 nopw %cs:(%rax,%rax)
ffffff800041d050 8b 05 42 3c 68 00 movl _xcpm_cpu_model(%rip), %eax
ffffff800041d056 85 43 dc testl -0x24(%rbx), %eax
ffffff800041d059 74 60 je 0xffffff800041d0bb
ffffff800041d05b 45 85 f6 testl %r14d, %r14d
ffffff800041d05e 74 06 je 0xffffff800041d066
ffffff800041d060 44 39 73 d8 cmpl %r14d, -0x28(%rbx)
10.13
otool -tVj 10.13/kernel > 10.13/kernel.txt
ffffff80003a6da0 55 pushq %rbp
ffffff80003a6da1 48 89 e5 movq %rsp, %rbp
ffffff80003a6da4 41 57 pushq %r15
ffffff80003a6da6 41 56 pushq %r14
ffffff80003a6da8 41 55 pushq %r13
ffffff80003a6daa 41 54 pushq %r12
ffffff80003a6dac 53 pushq %rbx
ffffff80003a6dad 50 pushq %rax
ffffff80003a6dae 41 89 d6 movl %edx, %r14d
ffffff80003a6db1 48 89 fb movq %rdi, %rbx
ffffff80003a6db4 85 f6 testl %esi, %esi
ffffff80003a6db6 0f 84 84 00 00 00 je 0xffffff80003a6e40
ffffff80003a6dbc 41 89 f5 movl %esi, %r13d
ffffff80003a6dbf 4c 8d 3d 2d 2f 5d 00 leaq 0x5d2f2d(%rip), %r15 ## literal pool for: "%s: programming MSR 0x%x\n"
ffffff80003a6dc6 4c 8d 25 40 2f 5d 00 leaq 0x5d2f40(%rip), %r12 ## literal pool for: "xcpm_program_msrs"
10.13 reboot fix 补丁:
Find: 554889e5415741564155415453504189d64889fb85f6
Replace: c34889e5415741564155415453504189d64889fb85f6