Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
252186c717 | ||
|
|
e1888a949b | ||
|
|
0294682ed3 | ||
|
|
aa97b72f31 | ||
|
|
28ededa7b8 | ||
|
|
e0433f28d4 | ||
|
|
d06f2af3fa | ||
|
|
b3d2b2b9f4 | ||
|
|
d0eb22b5ff | ||
|
|
978dbee98d | ||
|
|
b0b88d8986 | ||
|
|
52433409c3 | ||
|
|
f4e5385402 | ||
|
|
b107e428c5 | ||
|
|
be1eb827c6 | ||
|
|
e873faad91 | ||
|
|
d114481901 | ||
|
|
fc914b5dad | ||
|
|
7a3fec1bfa | ||
|
|
7977a8cf32 | ||
|
|
7d27f3800a | ||
|
|
dbab08a265 | ||
|
|
c30182fc5b | ||
|
|
584ddfdac7 | ||
|
|
bf73d13ffe | ||
|
|
a60e53cb92 | ||
|
|
064e032b82 | ||
|
|
bc7f38bd40 | ||
|
|
65d027b7f4 | ||
|
|
46187c808c | ||
|
|
8eb47bd0db | ||
|
|
578e77f0d0 | ||
|
|
e469b61358 | ||
|
|
b7fc352b88 | ||
|
|
f0baf4a6ac | ||
|
|
8e922298ed | ||
|
|
8c72476379 | ||
|
|
f5bcd709ac | ||
|
|
8316522559 | ||
|
|
c4b8ec7386 | ||
|
|
061ef187a3 | ||
|
|
4f226ff773 | ||
|
|
30ab67f9e4 | ||
|
|
ae406da578 | ||
|
|
51cd033552 | ||
|
|
c6c10f6327 | ||
|
|
284dc22bb0 | ||
|
|
2d01dce143 | ||
|
|
6940e54787 | ||
|
|
60ce07a001 | ||
|
|
bf88dbda05 | ||
|
|
fe65a19342 | ||
|
|
b4a65cb259 | ||
|
|
0a1c8f9a38 | ||
|
|
fcb950952e | ||
|
|
cd31cdcbbc | ||
|
|
66ff65d905 | ||
|
|
b33e03c33c | ||
|
|
1421d8dd71 | ||
|
|
4045c854d0 | ||
|
|
694d49ae37 | ||
|
|
8ecb4e635c | ||
|
|
3dc5cc19ac | ||
|
|
16b8a5a839 | ||
|
|
878fe5e4ff | ||
|
|
448b965f36 | ||
|
|
ea8f2ba910 | ||
|
|
729c8d003a | ||
|
|
b78d94ee77 | ||
|
|
7ca3dc8144 | ||
|
|
1f05883fa8 | ||
|
|
8df9ccd5dd | ||
|
|
ee4bb6378c | ||
|
|
fe60e968e4 | ||
|
|
085c660602 | ||
|
|
1c0a175e8e | ||
|
|
af9dd31185 | ||
|
|
59b7e70d7d | ||
|
|
cd7df20dc8 | ||
|
|
02f0f825ee | ||
|
|
70edc40aae | ||
|
|
6e25c84c53 | ||
|
|
e1cac8349c | ||
|
|
d14a6ca5c6 | ||
|
|
2438ded161 | ||
|
|
de80ba75ce | ||
|
|
8444e7fd5a | ||
|
|
26b580c94b | ||
|
|
ebbf3685a5 | ||
|
|
2f9cc3676f | ||
|
|
56850ec1d2 | ||
|
|
771432298d | ||
|
|
59ab10792a | ||
|
|
be1e6d3e3d | ||
|
|
160c5b60cc | ||
|
|
f31600002e | ||
|
|
33215d5227 | ||
|
|
14f248a926 | ||
|
|
209b97d076 | ||
|
|
8f350cba27 | ||
|
|
e5cc7ff0f4 | ||
|
|
5f7e565c16 | ||
|
|
0c842e231b | ||
|
|
1a3e66debb | ||
|
|
c573442b6f | ||
|
|
9d2f5096fd | ||
|
|
506082b55e | ||
|
|
eff19e612c | ||
|
|
5348342086 | ||
|
|
8506cdc41e | ||
|
|
684a025ecb | ||
|
|
6f87c042a5 | ||
|
|
0b55f355d1 | ||
|
|
6fa3302ef2 | ||
|
|
2384b38e5d | ||
|
|
73470867d8 | ||
|
|
7664d5bf0b | ||
|
|
6930861bb5 | ||
|
|
0a9f96c9d2 | ||
|
|
88ef37d8cd | ||
|
|
e7d5d1b6b6 | ||
|
|
c67c38f212 | ||
|
|
c13fe8ea02 | ||
|
|
afe4a039b6 | ||
|
|
3093ae561c | ||
|
|
63ea33e9f9 | ||
|
|
d514b97ef8 | ||
|
|
42eb0b4c5f | ||
|
|
a42d7909c0 | ||
|
|
876c89436c | ||
|
|
3293601ff8 | ||
|
|
9aa6ea1c60 | ||
|
|
279dea76c6 | ||
|
|
fd5682757e | ||
|
|
aece0565ad | ||
|
|
e1720aa91b | ||
|
|
53aa335d4f | ||
|
|
d300e5fd76 | ||
|
|
4ed5f032d8 | ||
|
|
3707e70cbd | ||
|
|
71466c87ce | ||
|
|
ae3a9e334b | ||
|
|
f8365b98c7 | ||
|
|
fdaa72ff17 | ||
|
|
1eb4ffe173 | ||
|
|
e107b83d38 | ||
|
|
61afc88b46 | ||
|
|
1b49f901fa | ||
|
|
fa9e6481b4 | ||
|
|
dd48b05eb4 | ||
|
|
1312830af6 | ||
|
|
24b92e0e48 | ||
|
|
b64c35dcb6 | ||
|
|
e91085ae74 | ||
|
|
3747ea44f4 | ||
|
|
45e2f7e5b0 | ||
|
|
9783561392 | ||
|
|
7da41a1081 | ||
|
|
8aef7484af | ||
|
|
97c2c466b9 | ||
|
|
a920edb050 | ||
|
|
a8d56e9543 | ||
|
|
39d8ffbf64 | ||
|
|
4fbf61db73 | ||
|
|
02ef9d42aa | ||
|
|
b6cff517f4 | ||
|
|
9d4169c6d3 | ||
|
|
909337ada5 | ||
|
|
e70f89cd0c | ||
|
|
0214037f67 | ||
|
|
f414106f4a | ||
|
|
7ef6f9df28 | ||
|
|
025886f92b | ||
|
|
31fcfb053f | ||
|
|
f866da5de3 | ||
|
|
51a11337ad | ||
|
|
91219e68c7 | ||
|
|
61045eee73 | ||
|
|
35f073149c | ||
|
|
7ae07eb6e2 | ||
|
|
07e5dc5662 | ||
|
|
f9594e3207 | ||
|
|
9c77c9999f | ||
|
|
e7bb086f2b | ||
|
|
49e099034c | ||
|
|
169c468e4a | ||
|
|
e648dd8da8 | ||
|
|
0d503fe8c7 | ||
|
|
7d4443f40f |
@@ -4,3 +4,4 @@
|
|||||||
.Trashes
|
.Trashes
|
||||||
ehthumbs.db
|
ehthumbs.db
|
||||||
Thumbs.db
|
Thumbs.db
|
||||||
|
logs
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
[submodule "tools/GenSMBIOS"]
|
||||||
|
path = tools/GenSMBIOS
|
||||||
|
url = https://github.com/corpnewt/GenSMBIOS.git
|
||||||
|
After Width: | Height: | Size: 2.7 MiB |
|
After Width: | Height: | Size: 2.0 MiB |
|
After Width: | Height: | Size: 2.4 MiB |
|
After Width: | Height: | Size: 1.6 MiB |
|
After Width: | Height: | Size: 1.4 MiB |
|
After Width: | Height: | Size: 1.4 MiB |
|
After Width: | Height: | Size: 448 KiB |
|
After Width: | Height: | Size: 400 KiB |
@@ -0,0 +1,58 @@
|
|||||||
|
CPU BrandString: Intel Core 2 Duo P9xxx (Penryn Class Core 2)
|
||||||
|
MicrocodeRevision: 0x00000001
|
||||||
|
Virtualization 1
|
||||||
|
CPUID 00010673 00040800 9EB83201 178BFBFF
|
||||||
|
ExtSigEcx 00000001
|
||||||
|
ExtSigEdx 20100800
|
||||||
|
Type 0x00
|
||||||
|
Family 0x06
|
||||||
|
Model 0x17
|
||||||
|
ExtModel 0x01
|
||||||
|
ExtFamily 0x00
|
||||||
|
Stepping 0x03
|
||||||
|
Features 0x9EB83201178BFBFF
|
||||||
|
ExtFeatures 0x0000000120100800
|
||||||
|
Signature 0x00010673
|
||||||
|
Brand 0x00
|
||||||
|
AppleProcessorType 0x0301
|
||||||
|
CstConfigLock 0
|
||||||
|
CpuGeneration 4
|
||||||
|
MaxId 0x0000000D
|
||||||
|
MaxExtId 0x80000008
|
||||||
|
PackageCount 1
|
||||||
|
CoreCount 4
|
||||||
|
ThreadCount 4
|
||||||
|
ExternalClock 1000
|
||||||
|
ARTFrequency 0
|
||||||
|
CPUFrequency 3400212000
|
||||||
|
CPUFrequencyFromTSC 0
|
||||||
|
CPUFrequencyFromART 0
|
||||||
|
TscAdjust 0
|
||||||
|
CPUFrequencyFromApple 0
|
||||||
|
CPUFrequencyFromVMT 3400212000
|
||||||
|
FSBFrequency 1000000000
|
||||||
|
|
||||||
|
CPU00:
|
||||||
|
MSR_IA32_MISC_ENABLE: 0x1
|
||||||
|
MSR_IA32_EXT_CONFIG: 0x0
|
||||||
|
MSR_FSB_FREQ: 0x3
|
||||||
|
MSR_IA32_PERF_STATUS: 0x400000003E8
|
||||||
|
|
||||||
|
CPU01:
|
||||||
|
MSR_IA32_MISC_ENABLE: 0x1
|
||||||
|
MSR_IA32_EXT_CONFIG: 0x0
|
||||||
|
MSR_FSB_FREQ: 0x3
|
||||||
|
MSR_IA32_PERF_STATUS: 0x400000003E8
|
||||||
|
|
||||||
|
CPU02:
|
||||||
|
MSR_IA32_MISC_ENABLE: 0x1
|
||||||
|
MSR_IA32_EXT_CONFIG: 0x0
|
||||||
|
MSR_FSB_FREQ: 0x3
|
||||||
|
MSR_IA32_PERF_STATUS: 0x400000003E8
|
||||||
|
|
||||||
|
CPU03:
|
||||||
|
MSR_IA32_MISC_ENABLE: 0x1
|
||||||
|
MSR_IA32_EXT_CONFIG: 0x0
|
||||||
|
MSR_FSB_FREQ: 0x3
|
||||||
|
MSR_IA32_PERF_STATUS: 0x400000003E8
|
||||||
|
|
||||||
@@ -0,0 +1,68 @@
|
|||||||
|
1. Vendor ID: 0x8086, Device ID: 0x29C0, RevisionID: 0x00, ClassCode: 0x060000, SubsystemVendorID: 0x1AF4, SubsystemID: 0x1100,
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x0,0x0)
|
||||||
|
2. Vendor ID: 0x1B36, Device ID: 0x000C, RevisionID: 0x00, ClassCode: 0x060400,
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x10,0x0)
|
||||||
|
3. Vendor ID: 0x1022, Device ID: 0x1487, RevisionID: 0x00, ClassCode: 0x040300, SubsystemVendorID: 0x1458, SubsystemID: 0xA0CD,
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x10,0x0)/Pci(0x0,0x0)
|
||||||
|
4. Vendor ID: 0x1B36, Device ID: 0x000C, RevisionID: 0x00, ClassCode: 0x060400,
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x10,0x1)
|
||||||
|
5. Vendor ID: 0x14E4, Device ID: 0x43A0, RevisionID: 0x03, ClassCode: 0x028000, SubsystemVendorID: 0x106B, SubsystemID: 0x0117,
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x10,0x1)/Pci(0x0,0x0)
|
||||||
|
6. Vendor ID: 0x8086, Device ID: 0x2937, RevisionID: 0x03, ClassCode: 0x0C0300, SubsystemVendorID: 0x1AF4, SubsystemID: 0x1100,
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x1A,0x0)
|
||||||
|
7. Vendor ID: 0x8086, Device ID: 0x2938, RevisionID: 0x03, ClassCode: 0x0C0300, SubsystemVendorID: 0x1AF4, SubsystemID: 0x1100,
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x1A,0x1)
|
||||||
|
8. Vendor ID: 0x8086, Device ID: 0x2939, RevisionID: 0x03, ClassCode: 0x0C0300, SubsystemVendorID: 0x1AF4, SubsystemID: 0x1100,
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x1A,0x2)
|
||||||
|
9. Vendor ID: 0x8086, Device ID: 0x293C, RevisionID: 0x03, ClassCode: 0x0C0320, SubsystemVendorID: 0x1AF4, SubsystemID: 0x1100,
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x1A,0x7)
|
||||||
|
10. Vendor ID: 0x8086, Device ID: 0x293E, RevisionID: 0x03, ClassCode: 0x040300, SubsystemVendorID: 0x1AF4, SubsystemID: 0x1100,
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x1B,0x0)
|
||||||
|
11. Vendor ID: 0x1B36, Device ID: 0x000C, RevisionID: 0x00, ClassCode: 0x060400,
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x1C,0x0)
|
||||||
|
12. Vendor ID: 0x1002, Device ID: 0x73FF, RevisionID: 0xC3, ClassCode: 0x030000, SubsystemVendorID: 0x1002, SubsystemID: 0x0E36,
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x1C,0x0)/Pci(0x0,0x0)
|
||||||
|
13. Vendor ID: 0x1002, Device ID: 0xAB28, RevisionID: 0x00, ClassCode: 0x040300, SubsystemVendorID: 0x1002, SubsystemID: 0xAB28,
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x1C,0x0)/Pci(0x0,0x1)
|
||||||
|
14. Vendor ID: 0x1B36, Device ID: 0x000C, RevisionID: 0x00, ClassCode: 0x060400,
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x1C,0x1)
|
||||||
|
15. Vendor ID: 0x1022, Device ID: 0x149C, RevisionID: 0x00, ClassCode: 0x0C0330, SubsystemVendorID: 0x1022, SubsystemID: 0x1486,
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x1C,0x1)/Pci(0x0,0x0)
|
||||||
|
16. Vendor ID: 0x1B36, Device ID: 0x000C, RevisionID: 0x00, ClassCode: 0x060400,
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x1C,0x2)
|
||||||
|
17. Vendor ID: 0x1022, Device ID: 0x149C, RevisionID: 0x00, ClassCode: 0x0C0330, SubsystemVendorID: 0x1022, SubsystemID: 0x148C,
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x1C,0x2)/Pci(0x0,0x0)
|
||||||
|
18. Vendor ID: 0x1B36, Device ID: 0x000C, RevisionID: 0x00, ClassCode: 0x060400,
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x1C,0x3)
|
||||||
|
19. Vendor ID: 0x1022, Device ID: 0x149C, RevisionID: 0x00, ClassCode: 0x0C0330, SubsystemVendorID: 0x1458, SubsystemID: 0x5007,
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x1C,0x3)/Pci(0x0,0x0)
|
||||||
|
20. Vendor ID: 0x8086, Device ID: 0x2934, RevisionID: 0x03, ClassCode: 0x0C0300, SubsystemVendorID: 0x1AF4, SubsystemID: 0x1100,
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x1D,0x0)
|
||||||
|
21. Vendor ID: 0x8086, Device ID: 0x2935, RevisionID: 0x03, ClassCode: 0x0C0300, SubsystemVendorID: 0x1AF4, SubsystemID: 0x1100,
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x1D,0x1)
|
||||||
|
22. Vendor ID: 0x8086, Device ID: 0x2936, RevisionID: 0x03, ClassCode: 0x0C0300, SubsystemVendorID: 0x1AF4, SubsystemID: 0x1100,
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x1D,0x2)
|
||||||
|
23. Vendor ID: 0x8086, Device ID: 0x293A, RevisionID: 0x03, ClassCode: 0x0C0320, SubsystemVendorID: 0x1AF4, SubsystemID: 0x1100,
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x1D,0x7)
|
||||||
|
24. Vendor ID: 0x8086, Device ID: 0x244E, RevisionID: 0x92, ClassCode: 0x060401,
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x1E,0x0)
|
||||||
|
25. Vendor ID: 0x1B36, Device ID: 0x0001, RevisionID: 0x00, ClassCode: 0x060400,
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x1E,0x0)/Pci(0x1,0x0)
|
||||||
|
26. Vendor ID: 0x1AF4, Device ID: 0x1003, RevisionID: 0x00, ClassCode: 0x078000, SubsystemVendorID: 0x1AF4, SubsystemID: 0x0003,
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x1E,0x0)/Pci(0x1,0x0)/Pci(0x8,0x0)
|
||||||
|
27. Vendor ID: 0x1AF4, Device ID: 0x1001, RevisionID: 0x00, ClassCode: 0x010000, SubsystemVendorID: 0x1AF4, SubsystemID: 0x0002,
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x1E,0x0)/Pci(0x1,0x0)/Pci(0xA,0x0)
|
||||||
|
28. Vendor ID: 0x15AD, Device ID: 0x07B0, RevisionID: 0x01, ClassCode: 0x020000, SubsystemVendorID: 0x15AD, SubsystemID: 0x07B0,
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x1E,0x0)/Pci(0x1,0x0)/Pci(0x12,0x0)
|
||||||
|
29. Vendor ID: 0x1B36, Device ID: 0x0001, RevisionID: 0x00, ClassCode: 0x060400,
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x1E,0x0)/Pci(0x2,0x0)
|
||||||
|
30. Vendor ID: 0x1B36, Device ID: 0x0001, RevisionID: 0x00, ClassCode: 0x060400,
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x1E,0x0)/Pci(0x3,0x0)
|
||||||
|
31. Vendor ID: 0x1B36, Device ID: 0x0001, RevisionID: 0x00, ClassCode: 0x060400,
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x1E,0x0)/Pci(0x4,0x0)
|
||||||
|
32. Vendor ID: 0x8086, Device ID: 0x2918, RevisionID: 0x02, ClassCode: 0x060100, SubsystemVendorID: 0x1AF4, SubsystemID: 0x1100,
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x1F,0x0)
|
||||||
|
33. Vendor ID: 0x8086, Device ID: 0x2922, RevisionID: 0x02, ClassCode: 0x010601, SubsystemVendorID: 0x1AF4, SubsystemID: 0x1100,
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x1F,0x2)
|
||||||
|
34. Vendor ID: 0x8086, Device ID: 0x2930, RevisionID: 0x02, ClassCode: 0x0C0500, SubsystemVendorID: 0x1AF4, SubsystemID: 0x1100,
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x1F,0x3)
|
||||||
@@ -0,0 +1,130 @@
|
|||||||
|
CPU BrandString: Intel Core 2 Duo P9xxx (Penryn Class Core 2)
|
||||||
|
MicrocodeRevision: 0x00000001
|
||||||
|
Virtualization 1
|
||||||
|
CPUID 00010673 00100800 9EB83201 178BFBFF
|
||||||
|
ExtSigEcx 00000001
|
||||||
|
ExtSigEdx 20100800
|
||||||
|
Type 0x00
|
||||||
|
Family 0x06
|
||||||
|
Model 0x17
|
||||||
|
ExtModel 0x01
|
||||||
|
ExtFamily 0x00
|
||||||
|
Stepping 0x03
|
||||||
|
Features 0x9EB83201178BFBFF
|
||||||
|
ExtFeatures 0x0000000120100800
|
||||||
|
Signature 0x00010673
|
||||||
|
Brand 0x00
|
||||||
|
AppleProcessorType 0x0301
|
||||||
|
CstConfigLock 0
|
||||||
|
CpuGeneration 3
|
||||||
|
MaxId 0x0000000D
|
||||||
|
MaxExtId 0x80000008
|
||||||
|
PackageCount 1
|
||||||
|
CoreCount 16
|
||||||
|
ThreadCount 16
|
||||||
|
ExternalClock 1000
|
||||||
|
ARTFrequency 0
|
||||||
|
CPUFrequency 3400205000
|
||||||
|
CPUFrequencyFromTSC 0
|
||||||
|
CPUFrequencyFromART 0
|
||||||
|
TscAdjust 0
|
||||||
|
CPUFrequencyFromApple 0
|
||||||
|
CPUFrequencyFromVMT 3400205000
|
||||||
|
FSBFrequency 1000000000
|
||||||
|
|
||||||
|
CPU00:
|
||||||
|
MSR_IA32_MISC_ENABLE: 0x1
|
||||||
|
MSR_IA32_EXT_CONFIG: 0x0
|
||||||
|
MSR_FSB_FREQ: 0x3
|
||||||
|
MSR_IA32_PERF_STATUS: 0x400000003E8
|
||||||
|
|
||||||
|
CPU01:
|
||||||
|
MSR_IA32_MISC_ENABLE: 0x1
|
||||||
|
MSR_IA32_EXT_CONFIG: 0x0
|
||||||
|
MSR_FSB_FREQ: 0x3
|
||||||
|
MSR_IA32_PERF_STATUS: 0x400000003E8
|
||||||
|
|
||||||
|
CPU02:
|
||||||
|
MSR_IA32_MISC_ENABLE: 0x1
|
||||||
|
MSR_IA32_EXT_CONFIG: 0x0
|
||||||
|
MSR_FSB_FREQ: 0x3
|
||||||
|
MSR_IA32_PERF_STATUS: 0x400000003E8
|
||||||
|
|
||||||
|
CPU03:
|
||||||
|
MSR_IA32_MISC_ENABLE: 0x1
|
||||||
|
MSR_IA32_EXT_CONFIG: 0x0
|
||||||
|
MSR_FSB_FREQ: 0x3
|
||||||
|
MSR_IA32_PERF_STATUS: 0x400000003E8
|
||||||
|
|
||||||
|
CPU04:
|
||||||
|
MSR_IA32_MISC_ENABLE: 0x1
|
||||||
|
MSR_IA32_EXT_CONFIG: 0x0
|
||||||
|
MSR_FSB_FREQ: 0x3
|
||||||
|
MSR_IA32_PERF_STATUS: 0x400000003E8
|
||||||
|
|
||||||
|
CPU05:
|
||||||
|
MSR_IA32_MISC_ENABLE: 0x1
|
||||||
|
MSR_IA32_EXT_CONFIG: 0x0
|
||||||
|
MSR_FSB_FREQ: 0x3
|
||||||
|
MSR_IA32_PERF_STATUS: 0x400000003E8
|
||||||
|
|
||||||
|
CPU06:
|
||||||
|
MSR_IA32_MISC_ENABLE: 0x1
|
||||||
|
MSR_IA32_EXT_CONFIG: 0x0
|
||||||
|
MSR_FSB_FREQ: 0x3
|
||||||
|
MSR_IA32_PERF_STATUS: 0x400000003E8
|
||||||
|
|
||||||
|
CPU07:
|
||||||
|
MSR_IA32_MISC_ENABLE: 0x1
|
||||||
|
MSR_IA32_EXT_CONFIG: 0x0
|
||||||
|
MSR_FSB_FREQ: 0x3
|
||||||
|
MSR_IA32_PERF_STATUS: 0x400000003E8
|
||||||
|
|
||||||
|
CPU08:
|
||||||
|
MSR_IA32_MISC_ENABLE: 0x1
|
||||||
|
MSR_IA32_EXT_CONFIG: 0x0
|
||||||
|
MSR_FSB_FREQ: 0x3
|
||||||
|
MSR_IA32_PERF_STATUS: 0x400000003E8
|
||||||
|
|
||||||
|
CPU09:
|
||||||
|
MSR_IA32_MISC_ENABLE: 0x1
|
||||||
|
MSR_IA32_EXT_CONFIG: 0x0
|
||||||
|
MSR_FSB_FREQ: 0x3
|
||||||
|
MSR_IA32_PERF_STATUS: 0x400000003E8
|
||||||
|
|
||||||
|
CPU10:
|
||||||
|
MSR_IA32_MISC_ENABLE: 0x1
|
||||||
|
MSR_IA32_EXT_CONFIG: 0x0
|
||||||
|
MSR_FSB_FREQ: 0x3
|
||||||
|
MSR_IA32_PERF_STATUS: 0x400000003E8
|
||||||
|
|
||||||
|
CPU11:
|
||||||
|
MSR_IA32_MISC_ENABLE: 0x1
|
||||||
|
MSR_IA32_EXT_CONFIG: 0x0
|
||||||
|
MSR_FSB_FREQ: 0x3
|
||||||
|
MSR_IA32_PERF_STATUS: 0x400000003E8
|
||||||
|
|
||||||
|
CPU12:
|
||||||
|
MSR_IA32_MISC_ENABLE: 0x1
|
||||||
|
MSR_IA32_EXT_CONFIG: 0x0
|
||||||
|
MSR_FSB_FREQ: 0x3
|
||||||
|
MSR_IA32_PERF_STATUS: 0x400000003E8
|
||||||
|
|
||||||
|
CPU13:
|
||||||
|
MSR_IA32_MISC_ENABLE: 0x1
|
||||||
|
MSR_IA32_EXT_CONFIG: 0x0
|
||||||
|
MSR_FSB_FREQ: 0x3
|
||||||
|
MSR_IA32_PERF_STATUS: 0x400000003E8
|
||||||
|
|
||||||
|
CPU14:
|
||||||
|
MSR_IA32_MISC_ENABLE: 0x1
|
||||||
|
MSR_IA32_EXT_CONFIG: 0x0
|
||||||
|
MSR_FSB_FREQ: 0x3
|
||||||
|
MSR_IA32_PERF_STATUS: 0x400000003E8
|
||||||
|
|
||||||
|
CPU15:
|
||||||
|
MSR_IA32_MISC_ENABLE: 0x1
|
||||||
|
MSR_IA32_EXT_CONFIG: 0x0
|
||||||
|
MSR_FSB_FREQ: 0x3
|
||||||
|
MSR_IA32_PERF_STATUS: 0x400000003E8
|
||||||
|
|
||||||
@@ -0,0 +1,52 @@
|
|||||||
|
1. Vendor ID: 0x8086, Device ID: 0x29C0, RevisionID: 0x00, ClassCode: 0x060000, SubsystemVendorID: 0x1AF4, SubsystemID: 0x1100,
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x0,0x0)
|
||||||
|
2. Vendor ID: 0x1B36, Device ID: 0x000C, RevisionID: 0x00, ClassCode: 0x060400,
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x10,0x0)
|
||||||
|
3. Vendor ID: 0x14E4, Device ID: 0x43A0, RevisionID: 0x03, ClassCode: 0x028000, SubsystemVendorID: 0x106B, SubsystemID: 0x0117,
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x10,0x0)/Pci(0x0,0x0)
|
||||||
|
4. Vendor ID: 0x1B36, Device ID: 0x000C, RevisionID: 0x00, ClassCode: 0x060400,
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x10,0x1)
|
||||||
|
5. Vendor ID: 0x1022, Device ID: 0x1487, RevisionID: 0x00, ClassCode: 0x040300, SubsystemVendorID: 0x1458, SubsystemID: 0xA0CD,
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x10,0x1)/Pci(0x0,0x0)
|
||||||
|
6. Vendor ID: 0x8086, Device ID: 0x293E, RevisionID: 0x03, ClassCode: 0x040300, SubsystemVendorID: 0x1AF4, SubsystemID: 0x1100,
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x1B,0x0)
|
||||||
|
7. Vendor ID: 0x1B36, Device ID: 0x000C, RevisionID: 0x00, ClassCode: 0x060400,
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x1C,0x0)
|
||||||
|
8. Vendor ID: 0x1002, Device ID: 0x73BF, RevisionID: 0xC0, ClassCode: 0x030000, SubsystemVendorID: 0x1DA2, SubsystemID: 0x440E,
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x1C,0x0)/Pci(0x0,0x0)
|
||||||
|
9. Vendor ID: 0x1002, Device ID: 0xAB28, RevisionID: 0x00, ClassCode: 0x040300, SubsystemVendorID: 0x1002, SubsystemID: 0xAB28,
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x1C,0x0)/Pci(0x0,0x1)
|
||||||
|
10. Vendor ID: 0x1B36, Device ID: 0x000C, RevisionID: 0x00, ClassCode: 0x060400,
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x1C,0x1)
|
||||||
|
11. Vendor ID: 0x1022, Device ID: 0x149C, RevisionID: 0x00, ClassCode: 0x0C0330, SubsystemVendorID: 0x1022, SubsystemID: 0x1486,
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x1C,0x1)/Pci(0x0,0x0)
|
||||||
|
12. Vendor ID: 0x1B36, Device ID: 0x000C, RevisionID: 0x00, ClassCode: 0x060400,
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x1C,0x2)
|
||||||
|
13. Vendor ID: 0x1022, Device ID: 0x149C, RevisionID: 0x00, ClassCode: 0x0C0330, SubsystemVendorID: 0x1022, SubsystemID: 0x148C,
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x1C,0x2)/Pci(0x0,0x0)
|
||||||
|
14. Vendor ID: 0x1B36, Device ID: 0x000C, RevisionID: 0x00, ClassCode: 0x060400,
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x1C,0x3)
|
||||||
|
15. Vendor ID: 0x1022, Device ID: 0x149C, RevisionID: 0x00, ClassCode: 0x0C0330, SubsystemVendorID: 0x1458, SubsystemID: 0x5007,
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x1C,0x3)/Pci(0x0,0x0)
|
||||||
|
16. Vendor ID: 0x8086, Device ID: 0x244E, RevisionID: 0x92, ClassCode: 0x060401,
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x1E,0x0)
|
||||||
|
17. Vendor ID: 0x1B36, Device ID: 0x0001, RevisionID: 0x00, ClassCode: 0x060400,
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x1E,0x0)/Pci(0x1,0x0)
|
||||||
|
18. Vendor ID: 0x1AF4, Device ID: 0x1003, RevisionID: 0x00, ClassCode: 0x078000, SubsystemVendorID: 0x1AF4, SubsystemID: 0x0003,
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x1E,0x0)/Pci(0x1,0x0)/Pci(0x8,0x0)
|
||||||
|
19. Vendor ID: 0x1AF4, Device ID: 0x1001, RevisionID: 0x00, ClassCode: 0x010000, SubsystemVendorID: 0x1AF4, SubsystemID: 0x0002,
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x1E,0x0)/Pci(0x1,0x0)/Pci(0xA,0x0)
|
||||||
|
20. Vendor ID: 0x15AD, Device ID: 0x07B0, RevisionID: 0x01, ClassCode: 0x020000, SubsystemVendorID: 0x15AD, SubsystemID: 0x07B0,
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x1E,0x0)/Pci(0x1,0x0)/Pci(0x12,0x0)
|
||||||
|
21. Vendor ID: 0x1B36, Device ID: 0x0001, RevisionID: 0x00, ClassCode: 0x060400,
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x1E,0x0)/Pci(0x2,0x0)
|
||||||
|
22. Vendor ID: 0x1B36, Device ID: 0x0001, RevisionID: 0x00, ClassCode: 0x060400,
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x1E,0x0)/Pci(0x3,0x0)
|
||||||
|
23. Vendor ID: 0x1B36, Device ID: 0x0001, RevisionID: 0x00, ClassCode: 0x060400,
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x1E,0x0)/Pci(0x4,0x0)
|
||||||
|
24. Vendor ID: 0x8086, Device ID: 0x2918, RevisionID: 0x02, ClassCode: 0x060100, SubsystemVendorID: 0x1AF4, SubsystemID: 0x1100,
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x1F,0x0)
|
||||||
|
25. Vendor ID: 0x8086, Device ID: 0x2922, RevisionID: 0x02, ClassCode: 0x010601, SubsystemVendorID: 0x1AF4, SubsystemID: 0x1100,
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x1F,0x2)
|
||||||
|
26. Vendor ID: 0x8086, Device ID: 0x2930, RevisionID: 0x02, ClassCode: 0x0C0500, SubsystemVendorID: 0x1AF4, SubsystemID: 0x1100,
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x1F,0x3)
|
||||||
@@ -0,0 +1,58 @@
|
|||||||
|
CPU BrandString: Intel Core 2 Duo P9xxx (Penryn Class Core 2)
|
||||||
|
MicrocodeRevision: 0x00000001
|
||||||
|
Virtualization 1
|
||||||
|
CPUID 00010673 00040800 9EB83201 178BFBFF
|
||||||
|
ExtSigEcx 00000001
|
||||||
|
ExtSigEdx 20100800
|
||||||
|
Type 0x00
|
||||||
|
Family 0x06
|
||||||
|
Model 0x17
|
||||||
|
ExtModel 0x01
|
||||||
|
ExtFamily 0x00
|
||||||
|
Stepping 0x03
|
||||||
|
Features 0x9EB83201178BFBFF
|
||||||
|
ExtFeatures 0x0000000120100800
|
||||||
|
Signature 0x00010673
|
||||||
|
Brand 0x00
|
||||||
|
AppleProcessorType 0x0301
|
||||||
|
CstConfigLock 0
|
||||||
|
CpuGeneration 4
|
||||||
|
MaxId 0x0000000D
|
||||||
|
MaxExtId 0x80000008
|
||||||
|
PackageCount 1
|
||||||
|
CoreCount 4
|
||||||
|
ThreadCount 4
|
||||||
|
ExternalClock 1000
|
||||||
|
ARTFrequency 0
|
||||||
|
CPUFrequency 3400193000
|
||||||
|
CPUFrequencyFromTSC 0
|
||||||
|
CPUFrequencyFromART 0
|
||||||
|
TscAdjust 0
|
||||||
|
CPUFrequencyFromApple 0
|
||||||
|
CPUFrequencyFromVMT 3400193000
|
||||||
|
FSBFrequency 1000000000
|
||||||
|
|
||||||
|
CPU00:
|
||||||
|
MSR_IA32_MISC_ENABLE: 0x1
|
||||||
|
MSR_IA32_EXT_CONFIG: 0x0
|
||||||
|
MSR_FSB_FREQ: 0x3
|
||||||
|
MSR_IA32_PERF_STATUS: 0x400000003E8
|
||||||
|
|
||||||
|
CPU01:
|
||||||
|
MSR_IA32_MISC_ENABLE: 0x1
|
||||||
|
MSR_IA32_EXT_CONFIG: 0x0
|
||||||
|
MSR_FSB_FREQ: 0x3
|
||||||
|
MSR_IA32_PERF_STATUS: 0x400000003E8
|
||||||
|
|
||||||
|
CPU02:
|
||||||
|
MSR_IA32_MISC_ENABLE: 0x1
|
||||||
|
MSR_IA32_EXT_CONFIG: 0x0
|
||||||
|
MSR_FSB_FREQ: 0x3
|
||||||
|
MSR_IA32_PERF_STATUS: 0x400000003E8
|
||||||
|
|
||||||
|
CPU03:
|
||||||
|
MSR_IA32_MISC_ENABLE: 0x1
|
||||||
|
MSR_IA32_EXT_CONFIG: 0x0
|
||||||
|
MSR_FSB_FREQ: 0x3
|
||||||
|
MSR_IA32_PERF_STATUS: 0x400000003E8
|
||||||
|
|
||||||
@@ -0,0 +1,68 @@
|
|||||||
|
1. Vendor ID: 0x8086, Device ID: 0x29C0, RevisionID: 0x00, ClassCode: 0x060000, SubsystemVendorID: 0x1AF4, SubsystemID: 0x1100,
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x0,0x0)
|
||||||
|
2. Vendor ID: 0x1B36, Device ID: 0x000C, RevisionID: 0x00, ClassCode: 0x060400,
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x10,0x0)
|
||||||
|
3. Vendor ID: 0x1022, Device ID: 0x1487, RevisionID: 0x00, ClassCode: 0x040300, SubsystemVendorID: 0x1458, SubsystemID: 0xA0CD,
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x10,0x0)/Pci(0x0,0x0)
|
||||||
|
4. Vendor ID: 0x1B36, Device ID: 0x000C, RevisionID: 0x00, ClassCode: 0x060400,
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x10,0x1)
|
||||||
|
5. Vendor ID: 0x14E4, Device ID: 0x43A0, RevisionID: 0x03, ClassCode: 0x028000, SubsystemVendorID: 0x106B, SubsystemID: 0x0117,
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x10,0x1)/Pci(0x0,0x0)
|
||||||
|
6. Vendor ID: 0x8086, Device ID: 0x2937, RevisionID: 0x03, ClassCode: 0x0C0300, SubsystemVendorID: 0x1AF4, SubsystemID: 0x1100,
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x1A,0x0)
|
||||||
|
7. Vendor ID: 0x8086, Device ID: 0x2938, RevisionID: 0x03, ClassCode: 0x0C0300, SubsystemVendorID: 0x1AF4, SubsystemID: 0x1100,
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x1A,0x1)
|
||||||
|
8. Vendor ID: 0x8086, Device ID: 0x2939, RevisionID: 0x03, ClassCode: 0x0C0300, SubsystemVendorID: 0x1AF4, SubsystemID: 0x1100,
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x1A,0x2)
|
||||||
|
9. Vendor ID: 0x8086, Device ID: 0x293C, RevisionID: 0x03, ClassCode: 0x0C0320, SubsystemVendorID: 0x1AF4, SubsystemID: 0x1100,
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x1A,0x7)
|
||||||
|
10. Vendor ID: 0x8086, Device ID: 0x293E, RevisionID: 0x03, ClassCode: 0x040300, SubsystemVendorID: 0x1AF4, SubsystemID: 0x1100,
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x1B,0x0)
|
||||||
|
11. Vendor ID: 0x1B36, Device ID: 0x000C, RevisionID: 0x00, ClassCode: 0x060400,
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x1C,0x0)
|
||||||
|
12. Vendor ID: 0x1002, Device ID: 0x73FF, RevisionID: 0xC3, ClassCode: 0x030000, SubsystemVendorID: 0x1002, SubsystemID: 0x0E36,
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x1C,0x0)/Pci(0x0,0x0)
|
||||||
|
13. Vendor ID: 0x1002, Device ID: 0xAB28, RevisionID: 0x00, ClassCode: 0x040300, SubsystemVendorID: 0x1002, SubsystemID: 0xAB28,
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x1C,0x0)/Pci(0x0,0x1)
|
||||||
|
14. Vendor ID: 0x1B36, Device ID: 0x000C, RevisionID: 0x00, ClassCode: 0x060400,
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x1C,0x1)
|
||||||
|
15. Vendor ID: 0x1022, Device ID: 0x149C, RevisionID: 0x00, ClassCode: 0x0C0330, SubsystemVendorID: 0x1022, SubsystemID: 0x1486,
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x1C,0x1)/Pci(0x0,0x0)
|
||||||
|
16. Vendor ID: 0x1B36, Device ID: 0x000C, RevisionID: 0x00, ClassCode: 0x060400,
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x1C,0x2)
|
||||||
|
17. Vendor ID: 0x1022, Device ID: 0x149C, RevisionID: 0x00, ClassCode: 0x0C0330, SubsystemVendorID: 0x1022, SubsystemID: 0x148C,
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x1C,0x2)/Pci(0x0,0x0)
|
||||||
|
18. Vendor ID: 0x1B36, Device ID: 0x000C, RevisionID: 0x00, ClassCode: 0x060400,
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x1C,0x3)
|
||||||
|
19. Vendor ID: 0x1022, Device ID: 0x149C, RevisionID: 0x00, ClassCode: 0x0C0330, SubsystemVendorID: 0x1458, SubsystemID: 0x5007,
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x1C,0x3)/Pci(0x0,0x0)
|
||||||
|
20. Vendor ID: 0x8086, Device ID: 0x2934, RevisionID: 0x03, ClassCode: 0x0C0300, SubsystemVendorID: 0x1AF4, SubsystemID: 0x1100,
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x1D,0x0)
|
||||||
|
21. Vendor ID: 0x8086, Device ID: 0x2935, RevisionID: 0x03, ClassCode: 0x0C0300, SubsystemVendorID: 0x1AF4, SubsystemID: 0x1100,
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x1D,0x1)
|
||||||
|
22. Vendor ID: 0x8086, Device ID: 0x2936, RevisionID: 0x03, ClassCode: 0x0C0300, SubsystemVendorID: 0x1AF4, SubsystemID: 0x1100,
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x1D,0x2)
|
||||||
|
23. Vendor ID: 0x8086, Device ID: 0x293A, RevisionID: 0x03, ClassCode: 0x0C0320, SubsystemVendorID: 0x1AF4, SubsystemID: 0x1100,
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x1D,0x7)
|
||||||
|
24. Vendor ID: 0x8086, Device ID: 0x244E, RevisionID: 0x92, ClassCode: 0x060401,
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x1E,0x0)
|
||||||
|
25. Vendor ID: 0x1B36, Device ID: 0x0001, RevisionID: 0x00, ClassCode: 0x060400,
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x1E,0x0)/Pci(0x1,0x0)
|
||||||
|
26. Vendor ID: 0x1AF4, Device ID: 0x1003, RevisionID: 0x00, ClassCode: 0x078000, SubsystemVendorID: 0x1AF4, SubsystemID: 0x0003,
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x1E,0x0)/Pci(0x1,0x0)/Pci(0x8,0x0)
|
||||||
|
27. Vendor ID: 0x1AF4, Device ID: 0x1001, RevisionID: 0x00, ClassCode: 0x010000, SubsystemVendorID: 0x1AF4, SubsystemID: 0x0002,
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x1E,0x0)/Pci(0x1,0x0)/Pci(0xA,0x0)
|
||||||
|
28. Vendor ID: 0x15AD, Device ID: 0x07B0, RevisionID: 0x01, ClassCode: 0x020000, SubsystemVendorID: 0x15AD, SubsystemID: 0x07B0,
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x1E,0x0)/Pci(0x1,0x0)/Pci(0x12,0x0)
|
||||||
|
29. Vendor ID: 0x1B36, Device ID: 0x0001, RevisionID: 0x00, ClassCode: 0x060400,
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x1E,0x0)/Pci(0x2,0x0)
|
||||||
|
30. Vendor ID: 0x1B36, Device ID: 0x0001, RevisionID: 0x00, ClassCode: 0x060400,
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x1E,0x0)/Pci(0x3,0x0)
|
||||||
|
31. Vendor ID: 0x1B36, Device ID: 0x0001, RevisionID: 0x00, ClassCode: 0x060400,
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x1E,0x0)/Pci(0x4,0x0)
|
||||||
|
32. Vendor ID: 0x8086, Device ID: 0x2918, RevisionID: 0x02, ClassCode: 0x060100, SubsystemVendorID: 0x1AF4, SubsystemID: 0x1100,
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x1F,0x0)
|
||||||
|
33. Vendor ID: 0x8086, Device ID: 0x2922, RevisionID: 0x02, ClassCode: 0x010601, SubsystemVendorID: 0x1AF4, SubsystemID: 0x1100,
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x1F,0x2)
|
||||||
|
34. Vendor ID: 0x8086, Device ID: 0x2930, RevisionID: 0x02, ClassCode: 0x0C0500, SubsystemVendorID: 0x1AF4, SubsystemID: 0x1100,
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x1F,0x3)
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
CPU BrandString: Intel Xeon Processor (Cascadelake)
|
||||||
|
MicrocodeRevision: 0x00000001
|
||||||
|
Virtualization 1
|
||||||
|
CPUID 00050656 00040800 FFF83203 178BFBFF
|
||||||
|
ExtSigEcx 00000121
|
||||||
|
ExtSigEdx 2C100800
|
||||||
|
Type 0x00
|
||||||
|
Family 0x06
|
||||||
|
Model 0x55
|
||||||
|
ExtModel 0x05
|
||||||
|
ExtFamily 0x00
|
||||||
|
Stepping 0x06
|
||||||
|
Features 0xFFF83203178BFBFF
|
||||||
|
ExtFeatures 0x000001212C100800
|
||||||
|
Signature 0x00050656
|
||||||
|
Brand 0x00
|
||||||
|
AppleProcessorType 0x0501
|
||||||
|
CstConfigLock 0
|
||||||
|
CpuGeneration 14
|
||||||
|
MaxId 0x0000000D
|
||||||
|
MaxExtId 0x80000008
|
||||||
|
PackageCount 1
|
||||||
|
CoreCount 4
|
||||||
|
ThreadCount 4
|
||||||
|
ExternalClock 1000
|
||||||
|
ARTFrequency 0
|
||||||
|
CPUFrequency 3400203000
|
||||||
|
CPUFrequencyFromTSC 0
|
||||||
|
CPUFrequencyFromART 0
|
||||||
|
TscAdjust 0
|
||||||
|
CPUFrequencyFromApple 0
|
||||||
|
CPUFrequencyFromVMT 3400203000
|
||||||
|
FSBFrequency 1000000000
|
||||||
|
|
||||||
|
CPU00:
|
||||||
|
|
||||||
|
CPU01:
|
||||||
|
|
||||||
|
CPU02:
|
||||||
|
|
||||||
|
CPU03:
|
||||||
|
|
||||||
@@ -0,0 +1,57 @@
|
|||||||
|
PCI Bus Driver
|
||||||
|
Virtio PCI Driver
|
||||||
|
Virtio 1.0 PCI Driver
|
||||||
|
Virtio Block Driver
|
||||||
|
Virtio SCSI Host Driver
|
||||||
|
Virtio Random Number Generator Driver
|
||||||
|
PVSCSI Host Driver
|
||||||
|
Platform Console Management Driver
|
||||||
|
Console Splitter Driver
|
||||||
|
Graphics Console Driver
|
||||||
|
Serial Terminal Driver
|
||||||
|
Generic Disk I/O Driver
|
||||||
|
Partition Driver(MBR/GPT/El Torito)
|
||||||
|
SCSI Bus Driver
|
||||||
|
Scsi Disk Driver
|
||||||
|
Sata Controller Init Driver
|
||||||
|
AtaAtapiPassThru Driver
|
||||||
|
ATA Bus Driver
|
||||||
|
NVM Express Driver
|
||||||
|
OVMF Sio Bus Driver
|
||||||
|
PCI SIO Serial Driver
|
||||||
|
PS/2 Keyboard Driver
|
||||||
|
FAT File System Driver
|
||||||
|
UDF File System Driver
|
||||||
|
Virtio Filesystem Driver
|
||||||
|
Simple Network Protocol Driver
|
||||||
|
VLAN Configuration Driver
|
||||||
|
MNP Network Service Driver
|
||||||
|
ARP Network Service Driver
|
||||||
|
DHCP Protocol Driver
|
||||||
|
IP4 Network Service Driver
|
||||||
|
UDP Network Service Driver
|
||||||
|
MTFTP4 Network Service
|
||||||
|
DHCP6 Protocol Driver
|
||||||
|
IP6 Network Service Driver
|
||||||
|
UDP6 Network Service Driver
|
||||||
|
MTFTP6 Network Service Driver
|
||||||
|
TCP Network Service Driver
|
||||||
|
UEFI PXE Base Code Driver
|
||||||
|
DNS Network Service Driver
|
||||||
|
HttpDxe
|
||||||
|
UEFI HTTP Boot Driver
|
||||||
|
iSCSI Driver
|
||||||
|
Virtio Network Driver
|
||||||
|
Usb Uhci Driver
|
||||||
|
Usb Ehci Driver
|
||||||
|
Usb Xhci Driver
|
||||||
|
Usb Bus Driver
|
||||||
|
Usb Keyboard Driver
|
||||||
|
Usb Mass Storage Driver
|
||||||
|
QEMU Video Driver
|
||||||
|
Virtio GPU Driver
|
||||||
|
AMD GOP X64 Release Driver Rev.1.65.0.15.50.Sep 28 2017.15:11:11
|
||||||
|
15ad07b0.efidrv
|
||||||
|
HFS File System Driver
|
||||||
|
Usb Mouse Driver
|
||||||
|
APFS
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
GOP INFO 2560(2560)x1440 fmt 1
|
||||||
|
GOP FB 0x800000000[0xE10000]
|
||||||
|
GOP BPP 4 - Success
|
||||||
|
GOP FBS 0xE10000 - Success
|
||||||
|
MTRR supported PAT supported
|
||||||
|
PAT 0x0007040600070406 (default)
|
||||||
|
0x800000000~0x800000000 MTRR 0=UC PTE1 bits 0x0000000800000083 PAT@0->6=WB
|
||||||
@@ -0,0 +1,100 @@
|
|||||||
|
01. Bridge device - Host bridge
|
||||||
|
Vendor ID: 0x0001, Device ID: 0x8086, RevisionID: 0x29C0, ClassCode: 0x000600, SubsystemVendorID: 0x1AF4, SubsystemID: 0x1100
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x0,0x0)
|
||||||
|
|
||||||
|
02. Bridge device - PCI-to-PCI bridge
|
||||||
|
Vendor ID: 0x0002, Device ID: 0x1B36, RevisionID: 0x0C, ClassCode: 0x000604
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x10,0x0)
|
||||||
|
|
||||||
|
03. Multimedia controller - High definition audio device
|
||||||
|
Vendor ID: 0x0003, Device ID: 0x1022, RevisionID: 0x1487, ClassCode: 0x000403, SubsystemVendorID: 0x1458, SubsystemID: 0xA0CD
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x10,0x0)/Pci(0x0,0x0)
|
||||||
|
|
||||||
|
04. Bridge device - PCI-to-PCI bridge
|
||||||
|
Vendor ID: 0x0004, Device ID: 0x1B36, RevisionID: 0x0C, ClassCode: 0x000604
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x10,0x1)
|
||||||
|
|
||||||
|
05. Network controller - Other network controller
|
||||||
|
Vendor ID: 0x0005, Device ID: 0x14E4, RevisionID: 0x43A0, ClassCode: 0x030280, SubsystemVendorID: 0x106B, SubsystemID: 0x0111
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x10,0x1)/Pci(0x0,0x0)
|
||||||
|
|
||||||
|
06. Bridge device - PCI-to-PCI bridge
|
||||||
|
Vendor ID: 0x0006, Device ID: 0x1B36, RevisionID: 0x0C, ClassCode: 0x000604
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x1C,0x0)
|
||||||
|
|
||||||
|
07. Display controller - VGA-compatible controller
|
||||||
|
Vendor ID: 0x0007, Device ID: 0x1002, RevisionID: 0x67DF, ClassCode: 0xE70300, SubsystemVendorID: 0x1849, SubsystemID: 0x5001
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x1C,0x0)/Pci(0x0,0x0)
|
||||||
|
|
||||||
|
08. Multimedia controller - High definition audio device
|
||||||
|
Vendor ID: 0x0008, Device ID: 0x1002, RevisionID: 0xAAF0, ClassCode: 0x000403, SubsystemVendorID: 0x1849, SubsystemID: 0xAAF0
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x1C,0x0)/Pci(0x0,0x1)
|
||||||
|
|
||||||
|
09. Bridge device - PCI-to-PCI bridge
|
||||||
|
Vendor ID: 0x0009, Device ID: 0x1B36, RevisionID: 0x0C, ClassCode: 0x000604
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x1C,0x1)
|
||||||
|
|
||||||
|
10. Serial bus controller - Universal Serial Bus xHCI controller
|
||||||
|
Vendor ID: 0x000A, Device ID: 0x1022, RevisionID: 0x149C, ClassCode: 0x000C03, SubsystemVendorID: 0x1022, SubsystemID: 0x1486
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x1C,0x1)/Pci(0x0,0x0)
|
||||||
|
|
||||||
|
11. Bridge device - PCI-to-PCI bridge
|
||||||
|
Vendor ID: 0x000B, Device ID: 0x1B36, RevisionID: 0x0C, ClassCode: 0x000604
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x1C,0x2)
|
||||||
|
|
||||||
|
12. Serial bus controller - Universal Serial Bus xHCI controller
|
||||||
|
Vendor ID: 0x000C, Device ID: 0x1022, RevisionID: 0x149C, ClassCode: 0x000C03, SubsystemVendorID: 0x1022, SubsystemID: 0x148C
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x1C,0x2)/Pci(0x0,0x0)
|
||||||
|
|
||||||
|
13. Bridge device - PCI-to-PCI bridge
|
||||||
|
Vendor ID: 0x000D, Device ID: 0x1B36, RevisionID: 0x0C, ClassCode: 0x000604
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x1C,0x3)
|
||||||
|
|
||||||
|
14. Serial bus controller - Universal Serial Bus xHCI controller
|
||||||
|
Vendor ID: 0x000E, Device ID: 0x1022, RevisionID: 0x149C, ClassCode: 0x000C03, SubsystemVendorID: 0x1458, SubsystemID: 0x5007
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x1C,0x3)/Pci(0x0,0x0)
|
||||||
|
|
||||||
|
15. Bridge device - PCI-to-PCI bridge
|
||||||
|
Vendor ID: 0x000F, Device ID: 0x8086, RevisionID: 0x244E, ClassCode: 0x920604
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x1E,0x0)
|
||||||
|
|
||||||
|
16. Bridge device - PCI-to-PCI bridge
|
||||||
|
Vendor ID: 0x0010, Device ID: 0x1B36, RevisionID: 0x01, ClassCode: 0x000604
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x1E,0x0)/Pci(0x1,0x0)
|
||||||
|
|
||||||
|
17. Simple communications controller - Other communications device
|
||||||
|
Vendor ID: 0x0011, Device ID: 0x1AF4, RevisionID: 0x1003, ClassCode: 0x000780, SubsystemVendorID: 0x1AF4, SubsystemID: 0x0003
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x1E,0x0)/Pci(0x1,0x0)/Pci(0x8,0x0)
|
||||||
|
|
||||||
|
18. Mass storage controller - SCSI controller
|
||||||
|
Vendor ID: 0x0012, Device ID: 0x1AF4, RevisionID: 0x1001, ClassCode: 0x000100, SubsystemVendorID: 0x1AF4, SubsystemID: 0x0002
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x1E,0x0)/Pci(0x1,0x0)/Pci(0xA,0x0)
|
||||||
|
|
||||||
|
19. Network controller - Ethernet controller
|
||||||
|
Vendor ID: 0x0013, Device ID: 0x15AD, RevisionID: 0x7B0, ClassCode: 0x010200, SubsystemVendorID: 0x15AD, SubsystemID: 0x07B0
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x1E,0x0)/Pci(0x1,0x0)/Pci(0x12,0x0)
|
||||||
|
|
||||||
|
20. Bridge device - PCI-to-PCI bridge
|
||||||
|
Vendor ID: 0x0014, Device ID: 0x1B36, RevisionID: 0x01, ClassCode: 0x000604
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x1E,0x0)/Pci(0x2,0x0)
|
||||||
|
|
||||||
|
21. Bridge device - PCI-to-PCI bridge
|
||||||
|
Vendor ID: 0x0015, Device ID: 0x1B36, RevisionID: 0x01, ClassCode: 0x000604
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x1E,0x0)/Pci(0x3,0x0)
|
||||||
|
|
||||||
|
22. Bridge device - PCI-to-PCI bridge
|
||||||
|
Vendor ID: 0x0016, Device ID: 0x1B36, RevisionID: 0x01, ClassCode: 0x000604
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x1E,0x0)/Pci(0x4,0x0)
|
||||||
|
|
||||||
|
23. Bridge device - ISA bridge
|
||||||
|
Vendor ID: 0x0017, Device ID: 0x8086, RevisionID: 0x2918, ClassCode: 0x020601, SubsystemVendorID: 0x1AF4, SubsystemID: 0x1100
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x1F,0x0)
|
||||||
|
|
||||||
|
24. Mass storage controller - Serial ATA controller using AHCI
|
||||||
|
Vendor ID: 0x0018, Device ID: 0x8086, RevisionID: 0x2922, ClassCode: 0x020106, SubsystemVendorID: 0x1AF4, SubsystemID: 0x1100
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x1F,0x2)
|
||||||
|
|
||||||
|
25. Serial bus controller - SMBus controller
|
||||||
|
Vendor ID: 0x0019, Device ID: 0x8086, RevisionID: 0x2930, ClassCode: 0x020C05, SubsystemVendorID: 0x1AF4, SubsystemID: 0x1100
|
||||||
|
DevicePath: PciRoot(0x0)/Pci(0x1F,0x3)
|
||||||
|
|
||||||
@@ -1,6 +1,64 @@
|
|||||||
OpenCore Changelog
|
OpenCore Changelog
|
||||||
==================
|
==================
|
||||||
|
|
||||||
|
#### Latest versions
|
||||||
|
- Check history of commits
|
||||||
|
|
||||||
|
#### v3.2.0
|
||||||
|
|
||||||
|
- Open SOURCE CODE of BINARY \o/
|
||||||
|
- Alter function '201 - Update Opencore ISO file' to download .ISO directly from repository;
|
||||||
|
- Add script in tools - CHECK-IOMMU.sh - Check if your IOMMU are ENABLED;
|
||||||
|
- Update macrecovery tool for Opencore 0.7.7;
|
||||||
|
- Update README;
|
||||||
|
- Adjustments to copyright terms.
|
||||||
|
|
||||||
|
#### v3.1.0
|
||||||
|
|
||||||
|
- Add support to run macOS in Cloud using this solution with VultR Provider;
|
||||||
|
- Add option to 'Remove Proxmox Subscription Notice';
|
||||||
|
|
||||||
|
#### v3.0.0
|
||||||
|
|
||||||
|
- Upgrade Opencore to 0.7.7;
|
||||||
|
- Upgrade Lilu and WhateverGreen Kexts;
|
||||||
|
- Add function '201 - Update Opencore ISO file';
|
||||||
|
- Add function '202 - Clear all Recovery Images';
|
||||||
|
- Add option to choose Storage in create VM;
|
||||||
|
- Fix minor bugs.
|
||||||
|
|
||||||
|
#### v2.0.1
|
||||||
|
|
||||||
|
- Fixed Opencore ISO disk size which was making booting impossible to install new virtual machines;
|
||||||
|
|
||||||
|
#### v2.0.0
|
||||||
|
|
||||||
|
- Upgrade to Opencore 0.7.6 (December/2021);
|
||||||
|
- Update Lilu (kext);
|
||||||
|
- Update VirtualSMC (kext);
|
||||||
|
- Fully compatible with Intel 12th and activate of all cores (P+E) and HT (Hyper-Threading);
|
||||||
|
|
||||||
|
#### v1.5.1
|
||||||
|
|
||||||
|
- Fix Menu Option - # 200;
|
||||||
|
- Cleaning some codes unnecessary in setup;
|
||||||
|
|
||||||
|
#### v1.5.0
|
||||||
|
|
||||||
|
- Fix QEMU 6.1 Passthrough in PVE 7.1+;
|
||||||
|
- Add option to "only ENTER" for exit osx-setup;
|
||||||
|
|
||||||
|
#### v1.4.0
|
||||||
|
|
||||||
|
- Add option to skip download and create recovery image of macOS;
|
||||||
|
|
||||||
|
#### v1.3.0
|
||||||
|
|
||||||
|
- Add script ```IOMMU-Groups.sh``` in tools;
|
||||||
|
- Add option 'Fix issues to start macOS (stuck at Apple logo) for Proxmox VE v7.1.XX';
|
||||||
|
- Add option 'Add Proxmox VE NO Subscription repository - for beta/non production upgrades';
|
||||||
|
- Remove option 'Activate support for Windows 11 natively'.
|
||||||
|
|
||||||
#### v1.2.0
|
#### v1.2.0
|
||||||
|
|
||||||
- Remove PVE/Kernel version from ```osx-setup``` menu;
|
- Remove PVE/Kernel version from ```osx-setup``` menu;
|
||||||
|
|||||||
@@ -0,0 +1,78 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
|
<plist version="1.0">
|
||||||
|
<dict>
|
||||||
|
<key># Patch for BCM/Bluetooth in Proxmox/Virtualization Environment</key>
|
||||||
|
<string></string>
|
||||||
|
<key># DISCORD: http://hackintosh.one/s/discord</key>
|
||||||
|
<string></string>
|
||||||
|
<key># BY: https://luchina.com.br</key>
|
||||||
|
<string></string>
|
||||||
|
<key>Kernel</key>
|
||||||
|
<dict>
|
||||||
|
<key>Patch</key>
|
||||||
|
<array>
|
||||||
|
<dict>
|
||||||
|
<key>Arch</key>
|
||||||
|
<string>x86_64</string>
|
||||||
|
<key>Base</key>
|
||||||
|
<string></string>
|
||||||
|
<key>Comment</key>
|
||||||
|
<string>BCM/BT Patch for macOS in Virtual Environment - Sonoma and Sequoia - Part 1 - Universo Hackintosh</string>
|
||||||
|
<key>Count</key>
|
||||||
|
<integer>1</integer>
|
||||||
|
<key>Enabled</key>
|
||||||
|
<true/>
|
||||||
|
<key>Find</key>
|
||||||
|
<data>aGliZXJuYXRlaGlkcmVhZHkAaGliZXJuYXRlY291bnQA</data>
|
||||||
|
<key>Identifier</key>
|
||||||
|
<string>kernel</string>
|
||||||
|
<key>Limit</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>Mask</key>
|
||||||
|
<data></data>
|
||||||
|
<key>MaxKernel</key>
|
||||||
|
<string></string>
|
||||||
|
<key>MinKernel</key>
|
||||||
|
<string>23.0.0</string>
|
||||||
|
<key>Replace</key>
|
||||||
|
<data>aGliZXJuYXRlaGlkcmVhZHkAaHZfdm1tX3ByZXNlbnQA</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></string>
|
||||||
|
<key>Comment</key>
|
||||||
|
<string>BCM/BT Patch for macOS in Virtual Environment - Sonoma and Sequoia - Part 2 - Universo Hackintosh</string>
|
||||||
|
<key>Count</key>
|
||||||
|
<integer>1</integer>
|
||||||
|
<key>Enabled</key>
|
||||||
|
<true/>
|
||||||
|
<key>Find</key>
|
||||||
|
<data>Ym9vdCBzZXNzaW9uIFVVSUQAaHZfdm1tX3ByZXNlbnQA</data>
|
||||||
|
<key>Identifier</key>
|
||||||
|
<string>kernel</string>
|
||||||
|
<key>Limit</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>Mask</key>
|
||||||
|
<data></data>
|
||||||
|
<key>MaxKernel</key>
|
||||||
|
<string></string>
|
||||||
|
<key>MinKernel</key>
|
||||||
|
<string>23.0.0</string>
|
||||||
|
<key>Replace</key>
|
||||||
|
<data>Ym9vdCBzZXNzaW9uIFVVSUQAaGliZXJuYXRlY291bnQA</data>
|
||||||
|
<key>ReplaceMask</key>
|
||||||
|
<data></data>
|
||||||
|
<key>Skip</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
</dict>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
macOS/VM Crash when try connect in WiFi [for BCM94360, in macOS Sonoma, Sequoia or Tahoe]
|
||||||
|
|
||||||
|
FOR PVE v7 ONLY
|
||||||
|
|
||||||
|
1. Run osx-setup and choose option '200 - Add Promox VE NO Subscription repository'
|
||||||
|
|
||||||
|
2. Install Kernel/PVE pve-kernel-5.15.53-1-pve
|
||||||
|
|
||||||
|
apt update
|
||||||
|
apt install pve-kernel-5.15.53-1-pve
|
||||||
|
|
||||||
|
3. Add in the proxmox-boot-tool and pin kernel version '5.15.53-1-pve'
|
||||||
|
|
||||||
|
proxmox-boot-tool kernel list
|
||||||
|
proxmox-boot-tool kernel add 5.15.53-1-pve
|
||||||
|
proxmox-boot-tool refresh
|
||||||
|
proxmox-boot-tool kernel pin 5.15.53-1-pve
|
||||||
|
proxmox-boot-tool kernel list
|
||||||
|
|
||||||
|
4. Reboot and try connect WiFi in macOS
|
||||||
@@ -0,0 +1,312 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
#
|
||||||
|
# apply-wifi-reset-bus.sh
|
||||||
|
#
|
||||||
|
# Forca secondary bus reset (hot reset no link) em placas WiFi PCIe usadas em
|
||||||
|
# passthrough VFIO, e persiste a configuracao via regra udev.
|
||||||
|
#
|
||||||
|
# Contexto: em varios chips Intel (AX210 8086:2725 e afins) o FLR completa sem
|
||||||
|
# erro mas nao devolve o card a um estado carregavel de firmware. Sintoma: a
|
||||||
|
# placa funciona no primeiro "qm start" depois do boot do host e falha em todos
|
||||||
|
# os starts seguintes -- o driver do guest nao atacha. O secondary bus reset
|
||||||
|
# resolve porque faz hot reset no link PCIe.
|
||||||
|
#
|
||||||
|
# Uso: sudo ./apply-wifi-reset-bus.sh [--all-vendors]
|
||||||
|
#
|
||||||
|
# --all-vendors lista placas de rede sem fio de qualquer fabricante
|
||||||
|
# (por padrao filtra apenas Intel, vendor 0x8086)
|
||||||
|
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
PCI_DEVICES=/sys/bus/pci/devices
|
||||||
|
RULES_DIR=/etc/udev/rules.d
|
||||||
|
FILTER_VENDOR=0x8086
|
||||||
|
VENDOR_LABEL="Intel"
|
||||||
|
|
||||||
|
[[ "${1:-}" == "--all-vendors" ]] && { FILTER_VENDOR=""; VENDOR_LABEL="qualquer fabricante"; }
|
||||||
|
|
||||||
|
# ---------------------------------------------------------------- aparencia --
|
||||||
|
if [[ -t 1 ]]; then
|
||||||
|
B=$'\e[1m'; R=$'\e[31m'; G=$'\e[32m'; Y=$'\e[33m'; C=$'\e[36m'; Z=$'\e[0m'
|
||||||
|
else
|
||||||
|
B=""; R=""; G=""; Y=""; C=""; Z=""
|
||||||
|
fi
|
||||||
|
|
||||||
|
info() { printf '%s\n' "$*"; }
|
||||||
|
ok() { printf '%s\n' "${G}✓${Z} $*"; }
|
||||||
|
warn() { printf '%s\n' "${Y}!${Z} $*"; }
|
||||||
|
err() { printf '%s\n' "${R}✗${Z} $*" >&2; }
|
||||||
|
head1() { printf '\n%s\n' "${B}$*${Z}"; }
|
||||||
|
die() { err "$*"; exit 1; }
|
||||||
|
|
||||||
|
# --------------------------------------------------------- estado / cleanup --
|
||||||
|
SYSPATH=""
|
||||||
|
ORIG_METHOD=""
|
||||||
|
RESTORE_NEEDED=0
|
||||||
|
|
||||||
|
cleanup() {
|
||||||
|
if (( RESTORE_NEEDED )) && [[ -n "$SYSPATH" && -n "$ORIG_METHOD" ]]; then
|
||||||
|
warn "Restaurando reset_method original (${ORIG_METHOD}) apos falha."
|
||||||
|
printf '%s\n' "$ORIG_METHOD" > "$SYSPATH/reset_method" 2>/dev/null || true
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
trap cleanup EXIT
|
||||||
|
|
||||||
|
# ------------------------------------------------------------ pre-requisitos --
|
||||||
|
(( EUID == 0 )) || die "Rode como root (sudo $0)."
|
||||||
|
|
||||||
|
for bin in lspci udevadm; do
|
||||||
|
command -v "$bin" >/dev/null 2>&1 \
|
||||||
|
|| die "Comando '$bin' nao encontrado. Instale pciutils / systemd-udev."
|
||||||
|
done
|
||||||
|
|
||||||
|
[[ -d "$PCI_DEVICES" ]] || die "$PCI_DEVICES nao existe. Este script e para Linux."
|
||||||
|
|
||||||
|
# ------------------------------------------------------------- enumeracao ----
|
||||||
|
# Classe PCI 0x0280 = Network controller (wireless). Ethernet e 0x0200.
|
||||||
|
declare -a SLOTS=() NAMES=() DRIVERS=() METHODS=()
|
||||||
|
|
||||||
|
for dev in "$PCI_DEVICES"/*/; do
|
||||||
|
slot=$(basename "$dev")
|
||||||
|
[[ -r "$dev/vendor" && -r "$dev/class" ]] || continue
|
||||||
|
|
||||||
|
vendor=$(<"$dev/vendor")
|
||||||
|
[[ -z "$FILTER_VENDOR" || "$vendor" == "$FILTER_VENDOR" ]] || continue
|
||||||
|
|
||||||
|
class=$(<"$dev/class")
|
||||||
|
[[ "${class:0:6}" == "0x0280" ]] || continue
|
||||||
|
|
||||||
|
name=$(lspci -Dnn -s "$slot" 2>/dev/null | cut -d' ' -f2- || true)
|
||||||
|
[[ -n "$name" ]] || name="(descricao indisponivel)"
|
||||||
|
|
||||||
|
if [[ -L "$dev/driver" ]]; then
|
||||||
|
driver=$(basename "$(readlink -f "$dev/driver")")
|
||||||
|
else
|
||||||
|
driver="(nenhum)"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ -r "$dev/reset_method" ]]; then
|
||||||
|
method=$(<"$dev/reset_method")
|
||||||
|
else
|
||||||
|
method="(indisponivel)"
|
||||||
|
fi
|
||||||
|
|
||||||
|
SLOTS+=("$slot"); NAMES+=("$name"); DRIVERS+=("$driver"); METHODS+=("$method")
|
||||||
|
done
|
||||||
|
|
||||||
|
(( ${#SLOTS[@]} )) || die "Nenhuma placa WiFi PCIe de ${VENDOR_LABEL} encontrada.
|
||||||
|
Se a placa e de outro fabricante, rode com --all-vendors."
|
||||||
|
|
||||||
|
# ------------------------------------------------------------------- menu ----
|
||||||
|
head1 "Placas WiFi PCIe detectadas (${VENDOR_LABEL})"
|
||||||
|
printf '\n'
|
||||||
|
printf ' %-3s %-15s %-11s %-14s %s\n' "#" "SLOT" "DRIVER" "RESET_METHOD" "DISPOSITIVO"
|
||||||
|
printf ' %-3s %-15s %-11s %-14s %s\n' "---" "---------------" "-----------" "--------------" "-----------"
|
||||||
|
for i in "${!SLOTS[@]}"; do
|
||||||
|
marker=""
|
||||||
|
[[ "${METHODS[$i]}" == "bus" ]] && marker=" ${G}(ja em bus)${Z}"
|
||||||
|
printf ' %-3s %-15s %-11s %-14s %s%s\n' \
|
||||||
|
"$((i+1))" "${SLOTS[$i]}" "${DRIVERS[$i]}" "${METHODS[$i]}" "${NAMES[$i]:0:60}" "$marker"
|
||||||
|
done
|
||||||
|
printf '\n'
|
||||||
|
|
||||||
|
if (( ${#SLOTS[@]} == 1 )); then
|
||||||
|
prompt="Selecione a placa [1] (Enter aceita, q sai): "
|
||||||
|
default_choice=1
|
||||||
|
else
|
||||||
|
prompt="Selecione a placa [1-${#SLOTS[@]}] (q sai): "
|
||||||
|
default_choice=""
|
||||||
|
fi
|
||||||
|
|
||||||
|
choice=""
|
||||||
|
while true; do
|
||||||
|
read -r -p "$prompt" choice || die "Entrada interrompida."
|
||||||
|
[[ "$choice" == "q" || "$choice" == "Q" ]] && { info "Cancelado."; exit 0; }
|
||||||
|
[[ -z "$choice" && -n "$default_choice" ]] && choice="$default_choice"
|
||||||
|
if [[ "$choice" =~ ^[0-9]+$ ]] && (( choice >= 1 && choice <= ${#SLOTS[@]} )); then
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
err "Opcao invalida."
|
||||||
|
done
|
||||||
|
|
||||||
|
IDX=$((choice-1))
|
||||||
|
SLOT="${SLOTS[$IDX]}"
|
||||||
|
SYSPATH="$PCI_DEVICES/$SLOT"
|
||||||
|
NAME="${NAMES[$IDX]}"
|
||||||
|
CURRENT="${METHODS[$IDX]}"
|
||||||
|
RULE_FILE="$RULES_DIR/99-pci-reset-bus-${SLOT//[:.]/-}.rules"
|
||||||
|
|
||||||
|
head1 "Placa selecionada"
|
||||||
|
info " Slot : $SLOT"
|
||||||
|
info " Dispositivo : $NAME"
|
||||||
|
info " Driver atual : ${DRIVERS[$IDX]}"
|
||||||
|
info " reset_method : $CURRENT"
|
||||||
|
info " Regra udev : $RULE_FILE"
|
||||||
|
|
||||||
|
# -------------------------------------------------------- validacoes previas --
|
||||||
|
[[ -w "$SYSPATH/reset_method" ]] \
|
||||||
|
|| die "$SYSPATH/reset_method nao existe ou nao e gravavel.
|
||||||
|
Este kernel nao expoe controle de reset para esse dispositivo."
|
||||||
|
|
||||||
|
head1 "Verificacoes"
|
||||||
|
|
||||||
|
# Estado atual x persistencia: 'bus' setado na mao nao sobrevive ao reboot.
|
||||||
|
RULE_EXISTS=0
|
||||||
|
[[ -f "$RULE_FILE" ]] && RULE_EXISTS=1
|
||||||
|
|
||||||
|
if [[ "$CURRENT" == "bus" ]]; then
|
||||||
|
if (( RULE_EXISTS )); then
|
||||||
|
ok "Ja esta em 'bus' E a regra udev ja existe."
|
||||||
|
info " Conteudo atual de $RULE_FILE:"
|
||||||
|
sed 's/^/ /' "$RULE_FILE"
|
||||||
|
printf '\n'
|
||||||
|
read -r -p "Reescrever a regra e revalidar mesmo assim? [s/N] " again
|
||||||
|
[[ "$again" =~ ^[sSyY]$ ]] || { info "Nada a fazer. Saindo."; exit 0; }
|
||||||
|
else
|
||||||
|
warn "Ja esta em 'bus', mas NAO ha regra udev para este dispositivo."
|
||||||
|
warn "Isso indica que o valor foi setado a mao e sera perdido no proximo"
|
||||||
|
warn "reboot do host. O script vai criar a regra para tornar permanente."
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
info " reset_method atual: '$CURRENT' -> sera forcado para 'bus'."
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Aviso sobre VMs em execucao: mexer no reset de um device em uso por uma VM
|
||||||
|
# ligada pode derrubar o dispositivo dentro dela.
|
||||||
|
if command -v qm >/dev/null 2>&1; then
|
||||||
|
running=$(qm list 2>/dev/null | awk 'NR>1 && $3=="running" {print $1}' | tr '\n' ' ' || true)
|
||||||
|
if [[ -n "${running// }" ]]; then
|
||||||
|
warn "VMs em execucao: ${running}"
|
||||||
|
warn "Se alguma usa $SLOT em passthrough, desligue-a antes de continuar."
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
printf '\n'
|
||||||
|
read -r -p "Aplicar o patch em ${SLOT}? [s/N] " confirm
|
||||||
|
[[ "$confirm" =~ ^[sSyY]$ ]] || { info "Cancelado."; exit 0; }
|
||||||
|
|
||||||
|
# A partir daqui mexemos no sistema.
|
||||||
|
ORIG_METHOD="$CURRENT"
|
||||||
|
RESTORE_NEEDED=1
|
||||||
|
|
||||||
|
# --------------------------------- passo 1: descobrir metodos disponiveis ----
|
||||||
|
head1 "1/5 Consultando metodos de reset suportados"
|
||||||
|
|
||||||
|
AVAILABLE=""
|
||||||
|
if printf 'default\n' > "$SYSPATH/reset_method" 2>/dev/null; then
|
||||||
|
AVAILABLE=$(<"$SYSPATH/reset_method")
|
||||||
|
info " Metodos disponiveis: $AVAILABLE"
|
||||||
|
else
|
||||||
|
warn "Kernel nao aceitou 'default'; pulando a checagem previa."
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ -n "$AVAILABLE" ]] && ! grep -qw "bus" <<<"$AVAILABLE"; then
|
||||||
|
die "O dispositivo $SLOT nao suporta secondary bus reset.
|
||||||
|
Metodos disponiveis: $AVAILABLE
|
||||||
|
Isso normalmente significa que ele nao esta sozinho no root port PCIe.
|
||||||
|
Um bus reset ali afetaria dispositivos vizinhos, entao o kernel nao oferece."
|
||||||
|
fi
|
||||||
|
ok "Secondary bus reset ('bus') e suportado."
|
||||||
|
|
||||||
|
# ---------------------------------------- passo 2: escrever a regra udev -----
|
||||||
|
head1 "2/5 Gravando a regra udev"
|
||||||
|
|
||||||
|
if (( RULE_EXISTS )); then
|
||||||
|
BACKUP="${RULE_FILE}.bak.$(date +%Y%m%d%H%M%S)"
|
||||||
|
cp -a "$RULE_FILE" "$BACKUP"
|
||||||
|
info " Backup do arquivo anterior: $BACKUP"
|
||||||
|
fi
|
||||||
|
|
||||||
|
cat > "$RULE_FILE" <<RULE_EOF
|
||||||
|
# Gerado por apply-wifi-reset-bus.sh em $(date -Is)
|
||||||
|
#
|
||||||
|
# $NAME
|
||||||
|
#
|
||||||
|
# O FLR neste dispositivo completa sem erro mas nao o devolve a um estado
|
||||||
|
# carregavel de firmware entre execucoes da VM. Forca secondary bus reset,
|
||||||
|
# que faz hot reset no link PCIe.
|
||||||
|
SUBSYSTEM=="pci", KERNEL=="$SLOT", ATTR{reset_method}="bus"
|
||||||
|
RULE_EOF
|
||||||
|
|
||||||
|
ok "Regra gravada em $RULE_FILE"
|
||||||
|
sed 's/^/ /' "$RULE_FILE"
|
||||||
|
|
||||||
|
# ----------------------------------------------- passo 3: recarregar udev ----
|
||||||
|
head1 "3/5 Recarregando o udev"
|
||||||
|
|
||||||
|
udevadm control --reload
|
||||||
|
ok "Regras recarregadas."
|
||||||
|
|
||||||
|
# ------------------------------ passo 4: validar que a REGRA e quem aplica ---
|
||||||
|
head1 "4/5 Validando"
|
||||||
|
|
||||||
|
# Zera para o default antes do trigger. Se depois do trigger o valor virar
|
||||||
|
# 'bus', a prova e de que foi a regra que aplicou -- e nao um valor residual.
|
||||||
|
if printf 'default\n' > "$SYSPATH/reset_method" 2>/dev/null; then
|
||||||
|
pre=$(<"$SYSPATH/reset_method")
|
||||||
|
info " Antes do trigger : $pre"
|
||||||
|
if [[ "$pre" == "bus" ]]; then
|
||||||
|
warn "Valor default ja e 'bus'; a validacao nao consegue isolar o efeito"
|
||||||
|
warn "da regra, mas a regra esta gravada corretamente."
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
warn "Nao foi possivel zerar para default; validacao sera menos conclusiva."
|
||||||
|
fi
|
||||||
|
|
||||||
|
udevadm trigger --action=add "$SYSPATH"
|
||||||
|
udevadm settle --timeout=10 || true
|
||||||
|
|
||||||
|
FINAL=$(<"$SYSPATH/reset_method")
|
||||||
|
info " Depois do trigger: $FINAL"
|
||||||
|
|
||||||
|
if [[ "$FINAL" != "bus" ]]; then
|
||||||
|
err "A regra nao surtiu efeito. reset_method continua '$FINAL'."
|
||||||
|
printf '\n'
|
||||||
|
info "Fallback: use um servico systemd, que roda mais tarde no boot e nao"
|
||||||
|
info "depende da janela do evento 'add' do udev:"
|
||||||
|
cat <<'FALLBACK_EOF'
|
||||||
|
|
||||||
|
cat > /etc/systemd/system/pci-reset-bus.service <<'EOF'
|
||||||
|
[Unit]
|
||||||
|
Description=Forca secondary bus reset no dispositivo PCI
|
||||||
|
After=sysinit.target
|
||||||
|
Before=pve-guests.service
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=oneshot
|
||||||
|
RemainAfterExit=yes
|
||||||
|
ExecStart=/bin/sh -c 'echo bus > /sys/bus/pci/devices/SLOT_AQUI/reset_method'
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
EOF
|
||||||
|
systemctl enable pci-reset-bus.service
|
||||||
|
|
||||||
|
FALLBACK_EOF
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
ok "reset_method = bus, aplicado pela regra udev."
|
||||||
|
|
||||||
|
# --------------------------------------------------------- passo 5: final ----
|
||||||
|
RESTORE_NEEDED=0
|
||||||
|
|
||||||
|
head1 "5/5 Concluido"
|
||||||
|
printf '\n'
|
||||||
|
ok "Patch aplicado em ${B}${SLOT}${Z} (${NAME})"
|
||||||
|
printf '\n'
|
||||||
|
info "${Y}Falta o teste definitivo: reinicie o host.${Z}"
|
||||||
|
info "O valor de reset_method nao persiste sozinho -- ele volta ao default a"
|
||||||
|
info "cada boot. O que persiste e a regra udev, e so um reboot prova que ela"
|
||||||
|
info "esta sendo aplicada cedo o bastante."
|
||||||
|
printf '\n'
|
||||||
|
info "Depois do reboot, confirme com:"
|
||||||
|
printf '\n'
|
||||||
|
info " ${C}cat /sys/bus/pci/devices/${SLOT}/reset_method${Z} # esperado: bus"
|
||||||
|
printf '\n'
|
||||||
|
info "Se voltar '${AVAILABLE:-flr bus}', o evento 'add' do udev disparou cedo"
|
||||||
|
info "demais no boot; nesse caso troque pelo servico systemd (o script mostra"
|
||||||
|
info "o modelo quando a validacao falha)."
|
||||||
|
printf '\n'
|
||||||
|
info "Para reverter: ${C}rm ${RULE_FILE} && udevadm control --reload${Z}"
|
||||||
|
printf '\n'
|
||||||
@@ -0,0 +1,91 @@
|
|||||||
|
# Disable screensaver
|
||||||
|
defaults -currentHost write com.apple.screensaver idleTime 0
|
||||||
|
|
||||||
|
# Disable transparency and motion effects
|
||||||
|
defaults write com.apple.universalaccess reduceTransparency -bool true
|
||||||
|
defaults write com.apple.universalaccess reduceMotion -bool true
|
||||||
|
|
||||||
|
# Disable Dock animations
|
||||||
|
defaults write com.apple.dock launchanim -bool false
|
||||||
|
defaults write com.apple.dock autohide-delay -float 0
|
||||||
|
defaults write com.apple.dock autohide-time-modifier -float 0
|
||||||
|
defaults write com.apple.dock expose-animation-duration -float 0.1
|
||||||
|
defaults write com.apple.dock no-glass -bool true
|
||||||
|
defaults write com.apple.dock no-bouncing -bool true
|
||||||
|
defaults write com.apple.dock magnification -bool false
|
||||||
|
defaults write com.apple.dock show-recents -bool false
|
||||||
|
defaults write com.apple.dock mineffect -string "scale"
|
||||||
|
defaults write com.apple.dock springboard-show-duration -float 0
|
||||||
|
defaults write com.apple.dock springboard-hide-duration -float 0
|
||||||
|
defaults write com.apple.dock springboard-page-duration -float 0
|
||||||
|
defaults write com.apple.dock workspaces-swoosh-animation-off -bool true
|
||||||
|
defaults write com.apple.dock minimize-to-application -bool true
|
||||||
|
defaults write com.apple.dock slow-motion-allowed -bool false
|
||||||
|
defaults write com.apple.dock missioncontrol-animation-duration -float 0.1
|
||||||
|
defaults write com.apple.dock workspaces-edge-delay -float 0
|
||||||
|
defaults write com.apple.dock springboard-blur-radius -int 0
|
||||||
|
|
||||||
|
# Disable general window and system animations
|
||||||
|
defaults write NSGlobalDomain NSAutomaticWindowAnimationsEnabled -bool false
|
||||||
|
defaults write NSGlobalDomain NSWindowResizeTime -float 0.001
|
||||||
|
defaults write -g NSMenuAnimationDuration -float 0
|
||||||
|
defaults write -g NSPopUpMenuAnimationDuration -float 0
|
||||||
|
defaults write -g NSComboBoxAnimationDuration -float 0
|
||||||
|
defaults write -g NSToolbarAnimationDuration -float 0
|
||||||
|
defaults write -g NSToolbarFullScreenAnimationDuration -float 0
|
||||||
|
defaults write -g NSSheetAnimationEnabled -bool false
|
||||||
|
defaults write -g NSWindowAnimationsEnabled -bool false
|
||||||
|
defaults write -g NSViewAnimationsEnabled -bool false
|
||||||
|
defaults write -g NSScrollAnimationEnabled -bool false
|
||||||
|
defaults write -g NSUseAnimatedFocusRing -bool false
|
||||||
|
defaults write -g NSScrollViewRubberbanding -bool false
|
||||||
|
defaults write -g NSOverlayScrollerHideDelay -float 0
|
||||||
|
defaults write -g QLPanelAnimationDuration -float 0
|
||||||
|
defaults write -g NSWindowSupportsAutomaticFullScreen -bool false
|
||||||
|
defaults write -g NSFullScreenAnimationDuration -float 0
|
||||||
|
defaults write NSGlobalDomain com.apple.springing.enabled -bool false
|
||||||
|
|
||||||
|
# Disable Finder animations
|
||||||
|
defaults write com.apple.finder DisableAllAnimations -bool true
|
||||||
|
defaults write com.apple.finder AnimateInfoPanes -bool false
|
||||||
|
defaults write com.apple.finder AnimateSnapToGrid -bool false
|
||||||
|
|
||||||
|
# GPU / Rendering — Switch to software renderer
|
||||||
|
sudo defaults write /Library/Preferences/com.apple.windowserver UseMetal -bool false
|
||||||
|
sudo defaults write /Library/Preferences/com.apple.windowserver UseOpenGL -bool false
|
||||||
|
sudo defaults write /Library/Preferences/com.apple.windowserver HardwareAccelerated -bool false
|
||||||
|
sudo defaults write /Library/Preferences/com.apple.windowserver EnableShadows -bool false
|
||||||
|
sudo defaults write /Library/Preferences/com.apple.CoreDisplay useMetal -bool false
|
||||||
|
sudo defaults write /Library/Preferences/com.apple.CoreDisplay useIOP -bool false
|
||||||
|
defaults write com.apple.CoreAnimation useSoftwareRenderer -bool true
|
||||||
|
defaults write com.apple.opengl ForceSoftwareRenderer -bool true
|
||||||
|
defaults write com.apple.CoreImage CISoftwareRenderer -bool true
|
||||||
|
defaults write com.apple.screencapture disable-shadow -bool true
|
||||||
|
defaults write com.apple.GPU gpuSwitchingPolicy -int 0
|
||||||
|
|
||||||
|
# Disable Spotlight indexing
|
||||||
|
sudo mdutil -a -i off
|
||||||
|
|
||||||
|
# Disable crash reporter, auto update, Time Machine
|
||||||
|
defaults write com.apple.CrashReporter DialogType -string "none"
|
||||||
|
defaults write com.apple.SoftwareUpdate AutomaticCheckEnabled -bool false
|
||||||
|
defaults write com.apple.TimeMachine DoNotOfferNewDisksForBackup -bool true
|
||||||
|
|
||||||
|
# Disable Siri
|
||||||
|
defaults write com.apple.assistant.support "Assistant Enabled" -bool false
|
||||||
|
|
||||||
|
# Other optimizations
|
||||||
|
defaults write com.apple.spotlight AnimationDuration -float 0
|
||||||
|
defaults write -g CGFontRenderingFontSmoothingDisabled -bool true
|
||||||
|
defaults write com.apple.frameworks.diskimages skip-verify -bool true
|
||||||
|
defaults write com.apple.frameworks.diskimages skip-verify-locked -bool true
|
||||||
|
defaults write com.apple.frameworks.diskimages skip-verify-remote -bool true
|
||||||
|
defaults write com.apple.mail DisableReplyAnimations -bool true
|
||||||
|
defaults write com.apple.mail DisableSendAnimations -bool true
|
||||||
|
defaults write -g NSDocumentSaveNewDocumentsToCloud -bool false
|
||||||
|
defaults write com.apple.finder WarnOnEmptyTrash -bool false
|
||||||
|
defaults write com.apple.desktopservices DSDontWriteNetworkStores -bool true
|
||||||
|
defaults write -g userMenuExtraStyle -int 1
|
||||||
|
|
||||||
|
# Apply changes
|
||||||
|
killall Dock && killall Finder && killall SystemUIServer
|
||||||
@@ -1,46 +1,174 @@
|
|||||||
# OSX-PROXMOX - Run macOS on ANY Computer - AMD & Intel
|
<div align="center">
|
||||||
|
|
||||||
Install Proxmox VE v7.XX - Next, Next & Finish (NNF).
|
# 🚀 OSX-PROXMOX - Run macOS on ANY Computer (AMD & Intel)
|
||||||
|
|
||||||
Open Proxmox Web Console -> Datacenter > NAME OF YOUR HOST > Shell.
|

|
||||||
|

|
||||||
|

|
||||||
|

|
||||||
|
|
||||||
Copy, paste and execute.
|
</div>
|
||||||
|
|
||||||
Voilà, install macOS! This is really and magic **easiest way**!
|

|
||||||
|
Easily install macOS on Proxmox VE with just a few steps! This guide provides the simplest and most effective way to set up macOS on Proxmox, whether you're using AMD or Intel hardware.
|
||||||
|
|
||||||
## COPY & PASTE - in shell of Proxmox
|
---
|
||||||
|
|
||||||
```
|
## 🛠 Installation Guide
|
||||||
|
|
||||||
|
1. Install a **FRESH/CLEAN** version of Proxmox VE (v7.X.XX ~ 9.X.XX) - just follow the Next, Next & Finish (NNF) approach.
|
||||||
|
2. Open the **Proxmox Web Console** → Navigate to `Datacenter > YOUR_HOST_NAME > Shell`.
|
||||||
|
3. Copy, paste, and execute the command below:
|
||||||
|
|
||||||
|
```bash
|
||||||
/bin/bash -c "$(curl -fsSL https://install.osx-proxmox.com)"
|
/bin/bash -c "$(curl -fsSL https://install.osx-proxmox.com)"
|
||||||
```
|
```
|
||||||
|
|
||||||
## Versions of macOS Supported
|
## 🎉 Voilà! You can now install macOS!
|
||||||
* macOS High Sierra - 10.13
|
|
||||||
* macOS Mojave - 10.14
|
|
||||||
* macOS Catalina - 10.15
|
|
||||||
* macOS Big Sur - 11
|
|
||||||
* macOS Monterey - 12
|
|
||||||
|
|
||||||
## Versions of Proxmox VE Supported
|
<img width="1358" height="761" alt="osx-terminal" src="https://github.com/user-attachments/assets/5220cf15-6b2a-454e-a2c9-f5499c50ed0d" />
|
||||||
* 7.XX
|
|
||||||
|
|
||||||
## Opencore version
|
## ⚠️ This screen is NORMAL after install of osx-proxmox
|
||||||
* November/2021 - 0.7.5 with SIP Enabled, DMG only signed by Apple and all features of securities.
|
|
||||||
|
|
||||||
## Disclaimer
|
<img width="715" height="195" alt="Screenshot 2026-09-02 at 00 16 45" src="https://github.com/user-attachments/assets/5237274f-c6fc-4d24-b1cb-ec61e1d06938" />
|
||||||
|
|
||||||
- FOR DEV/STUDENT/TEST ONLY PURPOSES.
|
## 🔧 Additional Configuration
|
||||||
- I'm not responsible for any problem and/or equipment damage or loss of files. Always back up everything before any changes to your computer.
|
|
||||||
|
|
||||||
## Demonstration (in Portuguese/Brazil)
|
### Install EFI Package in macOS (Disable Gatekeeper First)
|
||||||
|
|
||||||
https://youtu.be/G51z390XYMA
|
```bash
|
||||||
|
sudo spctl --master-disable
|
||||||
|
```
|
||||||
|
|
||||||
\* Please use CC with Auto Translate to English for your convenience.
|
---
|
||||||
|
|
||||||
## Credits
|
## 🍏 macOS Versions Supported
|
||||||
|
✅ macOS High Sierra - 10.13
|
||||||
|
✅ macOS Mojave - 10.14
|
||||||
|
✅ macOS Catalina - 10.15
|
||||||
|
✅ macOS Big Sur - 11
|
||||||
|
✅ macOS Monterey - 12
|
||||||
|
✅ macOS Ventura - 13
|
||||||
|
✅ macOS Sonoma - 14
|
||||||
|
✅ macOS Sequoia - 15
|
||||||
|
✅ macOS Tahoe - 26
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🖥 Proxmox VE Versions Supported
|
||||||
|
✅ v7.XX.XX ~ 9.XX.XX
|
||||||
|
|
||||||
|
### 🔄 OpenCore Version
|
||||||
|
- **March/2026 - 1.0.7** → with SIP Enabled, DMG only signed by Apple and all features of securities
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ☁️ Cloud Support (Run Hackintosh in the Cloud!)
|
||||||
|
- [🌍 VultR](https://www.vultr.com/?ref=9035565-8H)
|
||||||
|
- [📺 Video Tutorial](https://youtu.be/8QsMyL-PNrM) (Enable captions for better understanding)
|
||||||
|
- Now has configurable bridges, and can add as many bridges and specify the subnet for them.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ⚠️ Disclaimer
|
||||||
|
|
||||||
|
🚨 **FOR DEVELOPMENT, STUDENT, AND TESTING PURPOSES ONLY.**
|
||||||
|
|
||||||
|
I am **not responsible** for any issues, damage, or data loss. Always back up your system before making any changes.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📌 Requirements
|
||||||
|
|
||||||
|
Since macOS Monterey, your host must have a **working TSC (timestamp counter)**. Otherwise, if you assign multiple cores to the VM, macOS may **crash due to time inconsistencies**. To check if your host is compatible, run the following command in Proxmox:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
dmesg | grep -i -e tsc -e clocksource
|
||||||
|
```
|
||||||
|
|
||||||
|
### ✅ Expected Output (for working hosts):
|
||||||
|
```
|
||||||
|
clocksource: Switched to clocksource tsc
|
||||||
|
```
|
||||||
|
|
||||||
|
### ❌ Problematic Output (for broken hosts):
|
||||||
|
```
|
||||||
|
tsc: Marking TSC unstable due to check_tsc_sync_source failed
|
||||||
|
clocksource: Switched to clocksource hpet
|
||||||
|
```
|
||||||
|
|
||||||
|
### 🛠 Possible Fixes
|
||||||
|
1. Disable "ErP mode" and **all C-state power-saving modes** in your BIOS. Then power off your machine completely and restart.
|
||||||
|
2. Try forcing TSC in GRUB:
|
||||||
|
- Edit `/etc/default/grub` and add:
|
||||||
|
```bash
|
||||||
|
clocksource=tsc tsc=reliable
|
||||||
|
```
|
||||||
|
- Run `update-grub` and reboot (This may cause instability).
|
||||||
|
3. Verify the TSC clock source:
|
||||||
|
```bash
|
||||||
|
cat /sys/devices/system/clocksource/clocksource0/current_clocksource
|
||||||
|
```
|
||||||
|
The output **must be `tsc`**.
|
||||||
|
|
||||||
|
[Read More](https://www.nicksherlock.com/2022/10/installing-macos-13-ventura-on-proxmox/comment-page-1/#comment-55532)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔍 Troubleshooting
|
||||||
|
|
||||||
|
### ❌ High Sierra & Below - *Recovery Server Could Not Be Contacted*
|
||||||
|
|
||||||
|
If you encounter this error, you need to switch from **HTTPS** to **HTTP** in the installation URL:
|
||||||
|
|
||||||
|
1. When the error appears, leave the window open.
|
||||||
|
2. Open **Installer Log** (`Window > Installer Log`).
|
||||||
|
3. Search for "Failed to load catalog" → Copy the log entry.
|
||||||
|
4. Close the error message and return to `macOS Utilities`.
|
||||||
|
5. Open **Terminal**, paste the copied data, and **remove everything except the URL** (e.g., `https://example.sucatalog`).
|
||||||
|
6. Change `https://` to `http://`.
|
||||||
|
7. Run the command:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
nvram IASUCatalogURL="http://your-http-url.sucatalog"
|
||||||
|
```
|
||||||
|
|
||||||
|
8. Quit Terminal and restart the installation.
|
||||||
|
|
||||||
|
[Reference & More Details](https://mrmacintosh.com/how-to-fix-the-recovery-server-could-not-be-contacted-error-high-sierra-recovery-is-still-online-but-broken/)
|
||||||
|
|
||||||
|
### ❌ Problem for GPU Passthrough
|
||||||
|
|
||||||
|
If you see an Apple logo and the bar doesn’t move on your external display, you need to disable “above 4g decoding” in the motherboard’s BIOS.
|
||||||
|
|
||||||
|
In some environments it is necessary to segment the IOMMU Groups to be able to pass the GPU to the VM.
|
||||||
|
|
||||||
|
1. Add the content `pcie_acs_override=downstream,multifunction pci=nommconf` in the file `/etc/default/grub` at the end of the line `GRUB_CMDLINE_LINUX_DEFAULT`;
|
||||||
|
2. Some environments, add de content `pcie_port_pm=off` in the file `/etc/default/grub` at the end of the line `GRUB_CMDLINE_LINUX_DEFAULT`;
|
||||||
|
3. After changing the grub file, run the command `update-grub` and reboot your PVE.
|
||||||
|
|
||||||
|
Some environments, you need create a `/etc/modprobe.d/vfio-pci.conf` with content:
|
||||||
|
`options vfio-pci ids=XXXX:XXXX,XXXX:XXXX disable_vga=on`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🎥 Demonstration (in Portuguese)
|
||||||
|
|
||||||
|
📽️ [Watch on YouTube](https://youtu.be/dil6iRWiun0)
|
||||||
|
*(Enable auto-translate captions for English subtitles!)*
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🎖 Credits
|
||||||
|
|
||||||
|
- **OpenCore/Acidanthera Team** - Open-source bootloader
|
||||||
|
- **Corpnewt** - Tools (ProperTree, GenSMBIOS, etc.)
|
||||||
|
- **Apple** - macOS
|
||||||
|
- **Proxmox** - Fantastic virtualization platform & documentation
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🌎 Join Our Community - Universo Hackintosh Discord
|
||||||
|
|
||||||
|
💬 [**Join Here!**](https://discord.universohackintosh.com.br)
|
||||||
|
|
||||||
- Opencore/Acidanthera Team
|
|
||||||
- Corpnewt for Applications (ProperTree, genSMBIOS, etc)
|
|
||||||
- Apple for macOS
|
|
||||||
- Proxmox - Excelent and better documentation for Virtualization
|
|
||||||
|
|||||||
@@ -3,42 +3,106 @@
|
|||||||
#########################################################################################################################
|
#########################################################################################################################
|
||||||
#
|
#
|
||||||
# Script: install
|
# Script: install
|
||||||
#
|
# Purpose: Install OSX-PROXMOX
|
||||||
# https://luchina.com.br
|
# Source: https://luchina.com.br
|
||||||
#
|
#
|
||||||
#########################################################################################################################
|
#########################################################################################################################
|
||||||
|
|
||||||
clear
|
# Exit on any error
|
||||||
|
set -e
|
||||||
|
|
||||||
if [ -e /root/OSX-PROXMOX ]; then rm -rf /root/OSX-PROXMOX; fi;
|
# Check if running as root
|
||||||
if [ -e /etc/apt/sources.list.d/pve-enterprise.list ]; then rm -rf /etc/apt/sources.list.d/pve-enterprise.list; fi;
|
if [ "$EUID" -ne 0 ]; then
|
||||||
|
echo "This script must be run as root."
|
||||||
echo "Waiting install OSX-PROXMOX..."
|
exit 1
|
||||||
echo " "
|
|
||||||
|
|
||||||
apt update > /tmp/install-osx-proxmox.log 2>> /tmp/install-osx-proxmox.log
|
|
||||||
|
|
||||||
if [ $? -ne 0 ]
|
|
||||||
then
|
|
||||||
echo " "
|
|
||||||
echo "Error with 'apt-get update' ..."
|
|
||||||
echo "Trying to change /etc/apt/sources.list"
|
|
||||||
echo " "
|
|
||||||
|
|
||||||
sed -i 's/ftp.br.debian.org/ftp.debian.org/g' /etc/apt/sources.list
|
|
||||||
|
|
||||||
echo "Retrying 'apt-get update' ..."
|
|
||||||
echo " "
|
|
||||||
|
|
||||||
apt-get update >> /tmp/install-osx-proxmox.log 2>> /tmp/install-osx-proxmox.log
|
|
||||||
|
|
||||||
if [ $? -ne 0 ]; then echo "Error with 'apt-get update' ..."; exit; fi
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
apt install git -y >> /tmp/install-osx-proxmox.log 2>> /tmp/install-osx-proxmox.log
|
# Define log file
|
||||||
|
LOG_FILE="/root/install-osx-proxmox.log"
|
||||||
|
|
||||||
git clone https://github.com/luchina-gabriel/OSX-PROXMOX.git >> /tmp/install-osx-proxmox.log 2>> /tmp/install-osx-proxmox.log
|
# Function to log messages
|
||||||
|
log_message() {
|
||||||
|
echo "$1" | tee -a "$LOG_FILE"
|
||||||
|
}
|
||||||
|
|
||||||
if [ ! -e /root/OSX-PROXMOX ]; then mkdir -p /root/OSX-PROXMOX; fi;
|
# Function to check command success
|
||||||
|
check_status() {
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
log_message "Error: $1"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
/root/OSX-PROXMOX/setup
|
# Clear screen
|
||||||
|
clear
|
||||||
|
|
||||||
|
# Clean up existing files
|
||||||
|
log_message "Cleaning up existing files..."
|
||||||
|
[ -d "/root/OSX-PROXMOX" ] && rm -rf "/root/OSX-PROXMOX"
|
||||||
|
[ -f "/etc/apt/sources.list.d/pve-enterprise.list" ] && rm -f "/etc/apt/sources.list.d/pve-enterprise.list"
|
||||||
|
[ -f "/etc/apt/sources.list.d/ceph.list" ] && rm -f "/etc/apt/sources.list.d/ceph.list"
|
||||||
|
[ -f "/etc/apt/sources.list.d/pve-enterprise.sources" ] && rm -f "/etc/apt/sources.list.d/pve-enterprise.sources"
|
||||||
|
[ -f "/etc/apt/sources.list.d/ceph.sources" ] && rm -f "/etc/apt/sources.list.d/ceph.sources"
|
||||||
|
|
||||||
|
log_message "Preparing to install OSX-PROXMOX..."
|
||||||
|
|
||||||
|
# Update package lists
|
||||||
|
log_message "Updating package lists..."
|
||||||
|
apt-get update >> "$LOG_FILE" 2>&1
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
log_message "Initial apt-get update failed. Attempting to fix sources..."
|
||||||
|
|
||||||
|
# Use main Debian mirror instead of country-specific
|
||||||
|
sed -i 's/ftp\.[a-z]\{2\}\.debian\.org/ftp.debian.org/g' /etc/apt/sources.list
|
||||||
|
|
||||||
|
log_message "Retrying apt-get update..."
|
||||||
|
apt-get update >> "$LOG_FILE" 2>&1
|
||||||
|
check_status "Failed to update package lists after source modification"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Install git
|
||||||
|
log_message "Installing git..."
|
||||||
|
apt-get install -y git >> "$LOG_FILE" 2>&1
|
||||||
|
check_status "Failed to install git"
|
||||||
|
|
||||||
|
# Download repository (latest version only, without full history)
|
||||||
|
REPO_URL="https://github.com/luchina-gabriel/OSX-PROXMOX.git"
|
||||||
|
REPO_DIR="/root/OSX-PROXMOX"
|
||||||
|
|
||||||
|
# Shallow + partial + sparse checkout: fetches only the files the setup needs.
|
||||||
|
# The OpenCore ISO is left out on purpose - the setup downloads it into the ISO
|
||||||
|
# storage on its own, so checking it out here would just duplicate ~96 MB.
|
||||||
|
clone_latest_only() {
|
||||||
|
git clone --depth 1 --filter=blob:none --sparse "$REPO_URL" "$REPO_DIR" &&
|
||||||
|
git -C "$REPO_DIR" sparse-checkout set tools Patches
|
||||||
|
}
|
||||||
|
|
||||||
|
log_message "Downloading OSX-PROXMOX repository (latest version only)..."
|
||||||
|
if ! clone_latest_only >> "$LOG_FILE" 2>&1; then
|
||||||
|
log_message "Partial clone unavailable. Falling back to shallow clone..."
|
||||||
|
rm -rf "$REPO_DIR"
|
||||||
|
git clone --depth 1 "$REPO_URL" "$REPO_DIR" >> "$LOG_FILE" 2>&1
|
||||||
|
check_status "Failed to clone repository"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Download submodules (GenSMBIOS) at their pinned revision only
|
||||||
|
log_message "Downloading submodules..."
|
||||||
|
if ! git -C "$REPO_DIR" submodule update --init --depth 1 >> "$LOG_FILE" 2>&1; then
|
||||||
|
log_message "Shallow submodule fetch failed. Retrying with full history..."
|
||||||
|
git -C "$REPO_DIR" submodule deinit -f --all >> "$LOG_FILE" 2>&1 || true
|
||||||
|
git -C "$REPO_DIR" submodule update --init --force >> "$LOG_FILE" 2>&1
|
||||||
|
check_status "Failed to download submodules"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Ensure directory exists and setup is executable
|
||||||
|
if [ -f "/root/OSX-PROXMOX/setup" ]; then
|
||||||
|
chmod +x "/root/OSX-PROXMOX/setup"
|
||||||
|
log_message "Running setup script..."
|
||||||
|
/root/OSX-PROXMOX/setup 2>&1 | tee -a "$LOG_FILE"
|
||||||
|
check_status "Failed to run setup script"
|
||||||
|
else
|
||||||
|
log_message "Error: Setup script not found in /root/OSX-PROXMOX"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
log_message "Installation completed successfully"
|
||||||
|
|||||||
@@ -0,0 +1,20 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
#
|
||||||
|
# Script: check-iommu-enabled.sh
|
||||||
|
# Goal: Check if IOMMU is enabled on your system
|
||||||
|
#
|
||||||
|
# Author: Gabriel Luchina
|
||||||
|
# https://luchina.com.br
|
||||||
|
# 20260827T1431
|
||||||
|
|
||||||
|
# Check for IOMMU or DMAR messages in dmesg
|
||||||
|
iommu_check=$(dmesg | grep -E 'DMAR|IOMMU')
|
||||||
|
|
||||||
|
if [ -n "$iommu_check" ]; then
|
||||||
|
echo "IOMMU Enabled"
|
||||||
|
else
|
||||||
|
echo "IOMMU NOT Enabled"
|
||||||
|
echo "Ensure 'intel_iommu=on' or 'amd_iommu=on' is present in the 'GRUB_CMDLINE_LINUX_DEFAULT' line of /etc/default/grub"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
@@ -5,7 +5,7 @@
|
|||||||
#
|
#
|
||||||
# Author: Gabriel Luchina
|
# Author: Gabriel Luchina
|
||||||
# https://luchina.com.br
|
# https://luchina.com.br
|
||||||
# 20211116T2245
|
# 20260827T1431
|
||||||
|
|
||||||
clear
|
clear
|
||||||
|
|
||||||
@@ -24,7 +24,7 @@ echo " "
|
|||||||
## Core
|
## Core
|
||||||
cd ${TEMPDIR} > /dev/null 2> /dev/null
|
cd ${TEMPDIR} > /dev/null 2> /dev/null
|
||||||
rm -rf macOS-install* > /dev/null 2> /dev/null
|
rm -rf macOS-install* > /dev/null 2> /dev/null
|
||||||
hdiutil create -o macOS-install -size 14g -layout GPTSPUD -fs HFS+J > /dev/null 2> /dev/null
|
hdiutil create -o macOS-install -size 26g -layout GPTSPUD -fs HFS+J > /dev/null 2> /dev/null
|
||||||
hdiutil attach -noverify -mountpoint /Volumes/install_build macOS-install.dmg > /dev/null 2> /dev/null
|
hdiutil attach -noverify -mountpoint /Volumes/install_build macOS-install.dmg > /dev/null 2> /dev/null
|
||||||
sudo "${APPOSX}/Contents/Resources/createinstallmedia" --volume /Volumes/install_build --nointeraction
|
sudo "${APPOSX}/Contents/Resources/createinstallmedia" --volume /Volumes/install_build --nointeraction
|
||||||
hdiutil detach -force "/Volumes/Install macOS"* > /dev/null 2> /dev/null && sleep 3s > /dev/null 2> /dev/null
|
hdiutil detach -force "/Volumes/Install macOS"* > /dev/null 2> /dev/null && sleep 3s > /dev/null 2> /dev/null
|
||||||
|
|||||||
@@ -0,0 +1,19 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
#
|
||||||
|
# Script: IOMMU-Groups.sh
|
||||||
|
# Goal: List PCI devices in IOMMU Groups
|
||||||
|
#
|
||||||
|
# Author: Gabriel Luchina
|
||||||
|
# https://luchina.com.br
|
||||||
|
# 20260827T1431
|
||||||
|
|
||||||
|
#!/bin/bash
|
||||||
|
shopt -s nullglob
|
||||||
|
|
||||||
|
for iommu_group in $(ls /sys/kernel/iommu_groups/ | sort -V); do
|
||||||
|
echo "IOMMU Group ${iommu_group}:"
|
||||||
|
for pci_device in /sys/kernel/iommu_groups/$iommu_group/devices/*; do
|
||||||
|
echo -e "\t$(lspci -nns ${pci_device##*/})"
|
||||||
|
done
|
||||||
|
done
|
||||||
|
|
||||||
@@ -2,4 +2,7 @@
|
|||||||
|
|
||||||
macrecovery is a tool that helps to automate recovery interaction. It can be used to download diagnostics and recovery as well as analyse MLB.
|
macrecovery is a tool that helps to automate recovery interaction. It can be used to download diagnostics and recovery as well as analyse MLB.
|
||||||
|
|
||||||
Requires python to run. Run with `-h` argument to see all available arguments.
|
Requires python3 to run. Run with `-h` argument to see all available arguments.
|
||||||
|
|
||||||
|
To create a disk image for a virtual machine installation use `build-image.sh`.
|
||||||
|
|
||||||
|
|||||||
@@ -1,79 +1,79 @@
|
|||||||
{
|
{
|
||||||
"Mac-226CB3C6A851A671": "latest",
|
"Mac-EE2EBD4B90B839A8": "13.7.8",
|
||||||
"Mac-031B6874CF7F642A": "10.15.7",
|
"Mac-BE0E8AC46FE800CC": "11.7.11",
|
||||||
"Mac-27AD2F918AE68F61": "latest",
|
"Mac-9AE82516C7C6B903": "12.7.6",
|
||||||
"Mac-AA95B1DDAB278B95": "latest",
|
|
||||||
"Mac-66E35819EE2D0D05": "latest",
|
|
||||||
"Mac-7BA5B2D9E42DDD94": "latest",
|
|
||||||
"Mac-7BA5B2794B2CDB12": "10.13.6",
|
|
||||||
"Mac-06F11F11946D27C5": "latest",
|
|
||||||
"Mac-AFD8A9D944EA4843": "10.15.7",
|
|
||||||
"Mac-942B59F58194171B": "10.13.6",
|
|
||||||
"Mac-B809C3757DA9BB8D": "latest",
|
|
||||||
"Mac-7DF2A3B5E5D671ED": "10.15.7",
|
|
||||||
"Mac-35C1E88140C3E6CF": "11.6.1",
|
|
||||||
"Mac-942459F5819B171B": "10.13.6",
|
|
||||||
"Mac-77EB7D7DAF985301": "10.15.7",
|
|
||||||
"Mac-827FB448E656EC26": "latest",
|
|
||||||
"Mac-7BA5B2DFE22DDD8C": "latest",
|
|
||||||
"Mac-2E6FAB96566FE58C": "10.15.7",
|
|
||||||
"Mac-F2208EC8": "10.13.6",
|
|
||||||
"Mac-BE0E8AC46FE800CC": "11.6.1",
|
|
||||||
"Mac-00BE6ED71E35EB86": "10.15.7",
|
|
||||||
"Mac-4B7AC7E43945597E": "10.15.7",
|
|
||||||
"Mac-CAD6701F7CEA0921": "latest",
|
|
||||||
"Mac-63001698E7A34814": "latest",
|
|
||||||
"Mac-937CB26E2E02BB01": "latest",
|
|
||||||
"Mac-FFE5EF870D7BA81A": "latest",
|
|
||||||
"Mac-53FDB3D8DB8CA971": "latest",
|
|
||||||
"Mac-A61BADE1FDAD7B05": "latest",
|
|
||||||
"Mac-42FD25EABCABB274": "11.6.1",
|
|
||||||
"Mac-827FAC58A8FDFA22": "latest",
|
|
||||||
"Mac-1E7E29AD0135F9BC": "latest",
|
|
||||||
"Mac-3CBD00234E554E41": "11.6.1",
|
|
||||||
"Mac-66F35F19FE2A0D05": "10.15.7",
|
|
||||||
"Mac-189A3D4F975D5FFC": "11.6.1",
|
|
||||||
"Mac-B4831CEBD52A0C4C": "latest",
|
|
||||||
"Mac-C08A6BB70A942AC2": "10.13.6",
|
|
||||||
"Mac-8ED6AF5B48C039E1": "10.13.6",
|
|
||||||
"Mac-FC02E91DDD3FA6A4": "10.15.7",
|
|
||||||
"Mac-06F11FD93F0323C5": "latest",
|
|
||||||
"Mac-9AE82516C7C6B903": "latest",
|
|
||||||
"Mac-6F01561E16C75D06": "10.15.7",
|
|
||||||
"Mac-F60DEB81FF30ACF6": "latest",
|
|
||||||
"Mac-473D31EABEB93F9B": "latest",
|
|
||||||
"Mac-F22589C8": "10.13.6",
|
|
||||||
"Mac-0CFF9C7C2B63DF8D": "latest",
|
|
||||||
"Mac-CFF7D910A743CAAF": "latest",
|
|
||||||
"Mac-942C5DF58193131B": "10.13.6",
|
|
||||||
"Mac-77F17D7DA9285301": "latest",
|
|
||||||
"Mac-9F18E312C5C2BF0B": "latest",
|
|
||||||
"Mac-E1008331FDC96864": "latest",
|
|
||||||
"Mac-E7203C0F68AA0004": "latest",
|
|
||||||
"Mac-742912EFDBEE19B3": "10.13.6",
|
|
||||||
"Mac-27ADBB7B4CEE8E61": "10.15.7",
|
|
||||||
"Mac-F65AE981FFA204ED": "10.15.7",
|
|
||||||
"Mac-031AEE4D24BFF0B1": "10.15.7",
|
|
||||||
"Mac-4B682C642B45593E": "latest",
|
|
||||||
"Mac-DB15BD556843C820": "latest",
|
|
||||||
"Mac-937A206F2EE63C01": "latest",
|
|
||||||
"Mac-81E3E92DD6088272": "11.6.1",
|
|
||||||
"Mac-E43C1C25D4880AD6": "latest",
|
|
||||||
"Mac-942452F5819B1C1B": "10.13.6",
|
"Mac-942452F5819B1C1B": "10.13.6",
|
||||||
"Mac-65CE76090165799A": "latest",
|
"Mac-942C5DF58193131B": "10.13.6",
|
||||||
"Mac-551B86E5744E2388": "latest",
|
"Mac-C08A6BB70A942AC2": "10.13.6",
|
||||||
"Mac-BE088AF8C5EB4FA2": "latest",
|
"Mac-742912EFDBEE19B3": "10.13.6",
|
||||||
"Mac-A5C67F76ED83108C": "latest",
|
"Mac-66F35F19FE2A0D05": "10.15.8",
|
||||||
|
"Mac-2E6FAB96566FE58C": "10.15.8",
|
||||||
|
"Mac-35C1E88140C3E6CF": "11.7.11",
|
||||||
|
"Mac-7DF21CB3ED6977E5": "11.7.11",
|
||||||
|
"Mac-9F18E312C5C2BF0B": "12.7.6",
|
||||||
|
"Mac-937CB26E2E02BB01": "12.7.6",
|
||||||
|
"Mac-827FAC58A8FDFA22": "14.8.4",
|
||||||
|
"Mac-226CB3C6A851A671": "14.8.4",
|
||||||
|
"Mac-0CFF9C7C2B63DF8D": "15.7.4",
|
||||||
|
"Mac-C3EC7CD22292981F": "10.15.8",
|
||||||
|
"Mac-AFD8A9D944EA4843": "10.15.8",
|
||||||
|
"Mac-189A3D4F975D5FFC": "11.7.11",
|
||||||
|
"Mac-3CBD00234E554E41": "11.7.11",
|
||||||
|
"Mac-2BD1B31983FE1663": "11.7.11",
|
||||||
|
"Mac-06F11FD93F0323C5": "12.7.6",
|
||||||
|
"Mac-06F11F11946D27C5": "12.7.6",
|
||||||
|
"Mac-E43C1C25D4880AD6": "12.7.6",
|
||||||
|
"Mac-473D31EABEB93F9B": "12.7.6",
|
||||||
|
"Mac-66E35819EE2D0D05": "12.7.6",
|
||||||
|
"Mac-A5C67F76ED83108C": "12.7.6",
|
||||||
|
"Mac-B4831CEBD52A0C4C": "13.7.8",
|
||||||
|
"Mac-CAD6701F7CEA0921": "13.7.8",
|
||||||
|
"Mac-551B86E5744E2388": "13.7.8",
|
||||||
|
"Mac-937A206F2EE63C01": "15.7.4",
|
||||||
|
"Mac-827FB448E656EC26": "15.7.4",
|
||||||
|
"Mac-1E7E29AD0135F9BC": "15.7.4",
|
||||||
|
"Mac-53FDB3D8DB8CA971": "15.7.4",
|
||||||
|
"Mac-E1008331FDC96864": "latest",
|
||||||
"Mac-5F9802EFE386AA28": "latest",
|
"Mac-5F9802EFE386AA28": "latest",
|
||||||
"Mac-AF89B6D9451A490B": "latest",
|
"Mac-E7203C0F68AA0004": "15.7.4",
|
||||||
|
"Mac-A61BADE1FDAD7B05": "latest",
|
||||||
|
"Mac-F22589C8": "10.13.6",
|
||||||
"Mac-94245B3640C91C81": "10.13.6",
|
"Mac-94245B3640C91C81": "10.13.6",
|
||||||
"Mac-EE2EBD4B90B839A8": "latest",
|
|
||||||
"Mac-4BC72D62AD45599E": "10.13.6",
|
|
||||||
"Mac-2BD1B31983FE1663": "11.6.1",
|
|
||||||
"Mac-7DF21CB3ED6977E5": "11.6.1",
|
|
||||||
"Mac-A369DDC4E67F1C45": "latest",
|
|
||||||
"Mac-94245A3940C91C80": "10.13.6",
|
"Mac-94245A3940C91C80": "10.13.6",
|
||||||
"Mac-C3EC7CD22292981F": "10.15.7",
|
"Mac-942459F5819B171B": "10.13.6",
|
||||||
"Mac-35C5E08120C7EEAF": "latest",
|
"Mac-4B7AC7E43945597E": "10.15.8",
|
||||||
"Mac-942B5BF58194151B": "10.13.6"
|
"Mac-6F01561E16C75D06": "10.15.8",
|
||||||
|
"Mac-F60DEB81FF30ACF6": "12.7.6",
|
||||||
|
"Mac-27AD2F918AE68F61": "latest",
|
||||||
|
"Mac-F2208EC8": "10.13.6",
|
||||||
|
"Mac-8ED6AF5B48C039E1": "10.13.6",
|
||||||
|
"Mac-4BC72D62AD45599E": "10.13.6",
|
||||||
|
"Mac-7BA5B2794B2CDB12": "10.13.6",
|
||||||
|
"Mac-031AEE4D24BFF0B1": "10.15.8",
|
||||||
|
"Mac-F65AE981FFA204ED": "10.15.8",
|
||||||
|
"Mac-35C5E08120C7EEAF": "12.7.6",
|
||||||
|
"Mac-7BA5B2DFE22DDD8C": "15.7.4",
|
||||||
|
"Mac-942B5BF58194151B": "10.13.6",
|
||||||
|
"Mac-942B59F58194171B": "10.13.6",
|
||||||
|
"Mac-00BE6ED71E35EB86": "10.15.8",
|
||||||
|
"Mac-FC02E91DDD3FA6A4": "10.15.8",
|
||||||
|
"Mac-7DF2A3B5E5D671ED": "10.15.8",
|
||||||
|
"Mac-031B6874CF7F642A": "10.15.8",
|
||||||
|
"Mac-27ADBB7B4CEE8E61": "10.15.8",
|
||||||
|
"Mac-77EB7D7DAF985301": "10.15.8",
|
||||||
|
"Mac-81E3E92DD6088272": "11.7.11",
|
||||||
|
"Mac-42FD25EABCABB274": "11.7.11",
|
||||||
|
"Mac-A369DDC4E67F1C45": "12.7.6",
|
||||||
|
"Mac-FFE5EF870D7BA81A": "12.7.6",
|
||||||
|
"Mac-DB15BD556843C820": "12.7.6",
|
||||||
|
"Mac-65CE76090165799A": "12.7.6",
|
||||||
|
"Mac-B809C3757DA9BB8D": "12.7.6",
|
||||||
|
"Mac-4B682C642B45593E": "13.7.8",
|
||||||
|
"Mac-77F17D7DA9285301": "13.7.8",
|
||||||
|
"Mac-BE088AF8C5EB4FA2": "13.7.8",
|
||||||
|
"Mac-AA95B1DDAB278B95": "15.7.4",
|
||||||
|
"Mac-63001698E7A34814": "15.7.4",
|
||||||
|
"Mac-CFF7D910A743CAAF": "latest",
|
||||||
|
"Mac-AF89B6D9451A490B": "latest",
|
||||||
|
"Mac-7BA5B2D9E42DDD94": "15.7.4"
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
#!/bin/bash -e
|
||||||
|
|
||||||
|
if [ -z "$1" ]; then
|
||||||
|
FORMAT="raw"
|
||||||
|
else
|
||||||
|
FORMAT="${1}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
rm -rf Recovery.RO.dmg Recovery.raw "Recovery.${FORMAT}" Recovery.dmg.sparseimage
|
||||||
|
hdiutil create -size 900m -layout "UNIVERSAL HD" -type SPARSE -o Recovery.dmg
|
||||||
|
newDevice=$(hdiutil attach -nomount Recovery.dmg.sparseimage | head -n 1 | awk '{print $1}')
|
||||||
|
echo newdevice "$newDevice"
|
||||||
|
diskutil partitionDisk "${newDevice}" 1 MBR fat32 RECOVERY R
|
||||||
|
N=$(echo "$newDevice" | tr -dc '0-9')
|
||||||
|
diskutil mount disk"${N}"s1
|
||||||
|
MOUNT="$(diskutil info disk"${N}"s1 | sed -n 's/.*Mount Point: *//p')"
|
||||||
|
mkdir -p "$MOUNT/com.apple.recovery.boot"
|
||||||
|
cp ./*.dmg ./*.chunklist "$MOUNT/com.apple.recovery.boot/"
|
||||||
|
diskutil umount disk"${N}"s1
|
||||||
|
hdiutil detach "$newDevice"
|
||||||
|
hdiutil convert -format UDZO Recovery.dmg.sparseimage -o Recovery.RO.dmg
|
||||||
|
rm Recovery.dmg.sparseimage
|
||||||
|
qemu-img convert -f dmg -O "${FORMAT}" Recovery.RO.dmg "Recovery.${FORMAT}"
|
||||||
|
rm Recovery.RO.dmg
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
#!/usr/bin/env python
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
"""
|
"""
|
||||||
Gather recovery information for Macs.
|
Gather recovery information for Macs.
|
||||||
@@ -6,35 +6,30 @@ Gather recovery information for Macs.
|
|||||||
Copyright (c) 2019, vit9696
|
Copyright (c) 2019, vit9696
|
||||||
"""
|
"""
|
||||||
|
|
||||||
from __future__ import print_function
|
|
||||||
|
|
||||||
import argparse
|
import argparse
|
||||||
import binascii
|
|
||||||
import datetime
|
|
||||||
import hashlib
|
import hashlib
|
||||||
import json
|
import json
|
||||||
import linecache
|
import linecache
|
||||||
import os
|
import os
|
||||||
import random
|
import random
|
||||||
import struct
|
import struct
|
||||||
|
import string
|
||||||
import sys
|
import sys
|
||||||
import textwrap
|
|
||||||
import time
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
from urllib.request import Request,HTTPError,urlopen
|
from urllib.request import Request, HTTPError, urlopen
|
||||||
from urllib.parse import urlencode,urlparse
|
from urllib.parse import urlparse
|
||||||
except ImportError:
|
except ImportError:
|
||||||
from urllib2 import Request,HTTPError,urlopen
|
print('ERROR: Python 2 is not supported, please use Python 3')
|
||||||
from urllib import urlencode
|
sys.exit(1)
|
||||||
from urlparse import urlparse
|
|
||||||
|
|
||||||
SELF_DIR = os.path.dirname(os.path.realpath(__file__))
|
SELF_DIR = os.path.dirname(os.path.realpath(__file__))
|
||||||
|
|
||||||
RECENT_MAC = 'Mac-7BA5B2D9E42DDD94'
|
# MacPro7,1
|
||||||
|
RECENT_MAC = 'Mac-27AD2F918AE68F61'
|
||||||
MLB_ZERO = '00000000000000000'
|
MLB_ZERO = '00000000000000000'
|
||||||
MLB_VALID = 'C02749200YGJ803AX'
|
MLB_VALID = 'F5K105303J9K3F71M'
|
||||||
MLB_PRODUCT = '00000000000J80300'
|
MLB_PRODUCT = 'F5K00000000K3F700'
|
||||||
|
|
||||||
TYPE_SID = 16
|
TYPE_SID = 16
|
||||||
TYPE_K = 64
|
TYPE_K = 64
|
||||||
@@ -47,46 +42,42 @@ INFO_IMAGE_SESS = 'AT'
|
|||||||
INFO_SIGN_LINK = 'CU'
|
INFO_SIGN_LINK = 'CU'
|
||||||
INFO_SIGN_HASH = 'CH'
|
INFO_SIGN_HASH = 'CH'
|
||||||
INFO_SIGN_SESS = 'CT'
|
INFO_SIGN_SESS = 'CT'
|
||||||
INFO_REQURED = [ INFO_PRODUCT, INFO_IMAGE_LINK, INFO_IMAGE_HASH, INFO_IMAGE_SESS,
|
INFO_REQURED = [INFO_PRODUCT, INFO_IMAGE_LINK, INFO_IMAGE_HASH, INFO_IMAGE_SESS, INFO_SIGN_LINK, INFO_SIGN_HASH, INFO_SIGN_SESS]
|
||||||
INFO_SIGN_LINK, INFO_SIGN_HASH, INFO_SIGN_SESS ]
|
|
||||||
|
# Use -2 for better resize stability on Windows
|
||||||
|
TERMINAL_MARGIN = 2
|
||||||
|
|
||||||
def run_query(url, headers, post=None, raw=False):
|
def run_query(url, headers, post=None, raw=False):
|
||||||
if post is not None:
|
if post is not None:
|
||||||
data = '\n'.join([entry + '=' + post[entry] for entry in post])
|
data = '\n'.join(entry + '=' + post[entry] for entry in post).encode()
|
||||||
if sys.version_info[0] >= 3:
|
|
||||||
data = data.encode('utf-8')
|
|
||||||
else:
|
else:
|
||||||
data = None
|
data = None
|
||||||
|
|
||||||
req = Request(url=url, headers=headers, data=data)
|
req = Request(url=url, headers=headers, data=data)
|
||||||
try:
|
try:
|
||||||
response = urlopen(req)
|
response = urlopen(req)
|
||||||
if raw: return response
|
if raw:
|
||||||
|
return response
|
||||||
return dict(response.info()), response.read()
|
return dict(response.info()), response.read()
|
||||||
except HTTPError as e:
|
except HTTPError as e:
|
||||||
print('ERROR: "{}" when connecting to {}'.format(e, url))
|
print(f'ERROR: "{e}" when connecting to {url}')
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
def generate_id(type, id=None):
|
|
||||||
valid_chars = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F']
|
def generate_id(id_type, id_value=None):
|
||||||
if id is None:
|
return id_value or ''.join(random.choices(string.hexdigits[:16].upper(), k=id_type))
|
||||||
return ''.join(random.choice(valid_chars) for i in range(type))
|
|
||||||
return id
|
|
||||||
|
|
||||||
def product_mlb(mlb):
|
def product_mlb(mlb):
|
||||||
return '00000000000' + mlb[11] + mlb[12] + mlb[13] + mlb[14] + '00'
|
return '00000000000' + mlb[11:15] + '00'
|
||||||
|
|
||||||
|
|
||||||
def mlb_from_eeee(eeee):
|
def mlb_from_eeee(eeee):
|
||||||
if len(eeee) != 4:
|
if len(eeee) != 4:
|
||||||
print('ERROR: Invalid EEEE code length!')
|
print('ERROR: Invalid EEEE code length!')
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
return '00000000000' + eeee + '00'
|
return f'00000000000{eeee}00'
|
||||||
|
|
||||||
def int_from_unsigned_bytes(bytes, byteorder):
|
|
||||||
if byteorder == 'little': bytes = bytes[::-1]
|
|
||||||
encoded = binascii.hexlify(bytes)
|
|
||||||
return int(encoded, 16)
|
|
||||||
|
|
||||||
# zhangyoufu https://gist.github.com/MCJack123/943eaca762730ca4b7ae460b731b68e7#gistcomment-3061078 2021-10-08
|
# zhangyoufu https://gist.github.com/MCJack123/943eaca762730ca4b7ae460b731b68e7#gistcomment-3061078 2021-10-08
|
||||||
Apple_EFI_ROM_public_key_1 = 0xC3E748CAD9CD384329E10E25A91E43E1A762FF529ADE578C935BDDF9B13F2179D4855E6FC89E9E29CA12517D17DFA1EDCE0BEBF0EA7B461FFE61D94E2BDF72C196F89ACD3536B644064014DAE25A15DB6BB0852ECBD120916318D1CCDEA3C84C92ED743FC176D0BACA920D3FCF3158AFF731F88CE0623182A8ED67E650515F75745909F07D415F55FC15A35654D118C55A462D37A3ACDA08612F3F3F6571761EFCCBCC299AEE99B3A4FD6212CCFFF5EF37A2C334E871191F7E1C31960E010A54E86FA3F62E6D6905E1CD57732410A3EB0C6B4DEFDABE9F59BF1618758C751CD56CEF851D1C0EAA1C558E37AC108DA9089863D20E2E7E4BF475EC66FE6B3EFDCF
|
Apple_EFI_ROM_public_key_1 = 0xC3E748CAD9CD384329E10E25A91E43E1A762FF529ADE578C935BDDF9B13F2179D4855E6FC89E9E29CA12517D17DFA1EDCE0BEBF0EA7B461FFE61D94E2BDF72C196F89ACD3536B644064014DAE25A15DB6BB0852ECBD120916318D1CCDEA3C84C92ED743FC176D0BACA920D3FCF3158AFF731F88CE0623182A8ED67E650515F75745909F07D415F55FC15A35654D118C55A462D37A3ACDA08612F3F3F6571761EFCCBCC299AEE99B3A4FD6212CCFFF5EF37A2C334E871191F7E1C31960E010A54E86FA3F62E6D6905E1CD57732410A3EB0C6B4DEFDABE9F59BF1618758C751CD56CEF851D1C0EAA1C558E37AC108DA9089863D20E2E7E4BF475EC66FE6B3EFDCF
|
||||||
@@ -97,6 +88,7 @@ assert ChunkListHeader.size == 0x24
|
|||||||
Chunk = struct.Struct('<I32s')
|
Chunk = struct.Struct('<I32s')
|
||||||
assert Chunk.size == 0x24
|
assert Chunk.size == 0x24
|
||||||
|
|
||||||
|
|
||||||
def verify_chunklist(cnkpath):
|
def verify_chunklist(cnkpath):
|
||||||
with open(cnkpath, 'rb') as f:
|
with open(cnkpath, 'rb') as f:
|
||||||
hash_ctx = hashlib.sha256()
|
hash_ctx = hashlib.sha256()
|
||||||
@@ -111,7 +103,7 @@ def verify_chunklist(cnkpath):
|
|||||||
assert chunk_count > 0
|
assert chunk_count > 0
|
||||||
assert chunk_offset == 0x24
|
assert chunk_offset == 0x24
|
||||||
assert signature_offset == chunk_offset + Chunk.size * chunk_count
|
assert signature_offset == chunk_offset + Chunk.size * chunk_count
|
||||||
for i in range(chunk_count):
|
for _ in range(chunk_count):
|
||||||
data = f.read(Chunk.size)
|
data = f.read(Chunk.size)
|
||||||
hash_ctx.update(data)
|
hash_ctx.update(data)
|
||||||
chunk_size, chunk_sha256 = Chunk.unpack(data)
|
chunk_size, chunk_sha256 = Chunk.unpack(data)
|
||||||
@@ -120,8 +112,8 @@ def verify_chunklist(cnkpath):
|
|||||||
if signature_method == 1:
|
if signature_method == 1:
|
||||||
data = f.read(256)
|
data = f.read(256)
|
||||||
assert len(data) == 256
|
assert len(data) == 256
|
||||||
signature = int_from_unsigned_bytes(data, 'little')
|
signature = int.from_bytes(data, 'little')
|
||||||
plaintext = 0x1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff003031300d0609608648016503040201050004200000000000000000000000000000000000000000000000000000000000000000 | int_from_unsigned_bytes(digest, 'big')
|
plaintext = int(f'0x1{"f"*404}003031300d060960864801650304020105000420{"0"*64}', 16) | int.from_bytes(digest, 'big')
|
||||||
assert pow(signature, 0x10001, Apple_EFI_ROM_public_key_1) == plaintext
|
assert pow(signature, 0x10001, Apple_EFI_ROM_public_key_1) == plaintext
|
||||||
elif signature_method == 2:
|
elif signature_method == 2:
|
||||||
data = f.read(32)
|
data = f.read(32)
|
||||||
@@ -131,44 +123,45 @@ def verify_chunklist(cnkpath):
|
|||||||
raise NotImplementedError
|
raise NotImplementedError
|
||||||
assert f.read(1) == b''
|
assert f.read(1) == b''
|
||||||
|
|
||||||
|
|
||||||
def get_session(args):
|
def get_session(args):
|
||||||
headers = {
|
headers = {
|
||||||
'Host' : 'osrecovery.apple.com',
|
'Host': 'osrecovery.apple.com',
|
||||||
'Connection': 'close',
|
'Connection': 'close',
|
||||||
'User-Agent': 'InternetRecovery/1.0',
|
'User-Agent': 'InternetRecovery/1.0',
|
||||||
}
|
}
|
||||||
|
|
||||||
headers, output = run_query('http://osrecovery.apple.com/', headers)
|
headers, _ = run_query('http://osrecovery.apple.com/', headers)
|
||||||
|
|
||||||
if args.verbose:
|
if args.verbose:
|
||||||
print('Session headers:')
|
print('Session headers:')
|
||||||
for header in headers:
|
for header in headers:
|
||||||
print('{}: {}'.format(header, headers[header]))
|
print(f'{header}: {headers[header]}')
|
||||||
|
|
||||||
for header in headers:
|
for header in headers:
|
||||||
if header.lower() == 'set-cookie':
|
if header.lower() == 'set-cookie':
|
||||||
cookies = headers[header].split('; ')
|
cookies = headers[header].split('; ')
|
||||||
for cookie in cookies:
|
for cookie in cookies:
|
||||||
if cookie.startswith('session='):
|
return cookie if cookie.startswith('session=') else ...
|
||||||
return cookie
|
|
||||||
|
|
||||||
raise RuntimeError('No session in headers ' + str(headers))
|
raise RuntimeError('No session in headers ' + str(headers))
|
||||||
|
|
||||||
def get_image_info(session, bid, mlb=MLB_ZERO, diag = False, os_type = 'default', cid=None):
|
|
||||||
|
def get_image_info(session, bid, mlb=MLB_ZERO, diag=False, os_type='default', cid=None):
|
||||||
headers = {
|
headers = {
|
||||||
'Host' : 'osrecovery.apple.com',
|
'Host': 'osrecovery.apple.com',
|
||||||
'Connection' : 'close',
|
'Connection': 'close',
|
||||||
'User-Agent' : 'InternetRecovery/1.0',
|
'User-Agent': 'InternetRecovery/1.0',
|
||||||
'Cookie' : session,
|
'Cookie': session,
|
||||||
'Content-Type': 'text/plain',
|
'Content-Type': 'text/plain',
|
||||||
}
|
}
|
||||||
|
|
||||||
post = {
|
post = {
|
||||||
'cid': generate_id(TYPE_SID, cid),
|
'cid': generate_id(TYPE_SID, cid),
|
||||||
'sn' : mlb,
|
'sn': mlb,
|
||||||
'bid': bid,
|
'bid': bid,
|
||||||
'k' : generate_id(TYPE_K),
|
'k': generate_id(TYPE_K),
|
||||||
'fg' : generate_id(TYPE_FG)
|
'fg': generate_id(TYPE_FG)
|
||||||
}
|
}
|
||||||
|
|
||||||
if diag:
|
if diag:
|
||||||
@@ -179,71 +172,96 @@ def get_image_info(session, bid, mlb=MLB_ZERO, diag = False, os_type = 'default'
|
|||||||
|
|
||||||
headers, output = run_query(url, headers, post)
|
headers, output = run_query(url, headers, post)
|
||||||
|
|
||||||
if sys.version_info[0] >= 3:
|
|
||||||
output = output.decode('utf-8')
|
output = output.decode('utf-8')
|
||||||
|
|
||||||
info = {}
|
info = {}
|
||||||
for line in output.split('\n'):
|
for line in output.split('\n'):
|
||||||
try:
|
try:
|
||||||
key, value = line.split(': ')
|
key, value = line.split(': ')
|
||||||
info[key] = value
|
info[key] = value
|
||||||
except:
|
except KeyError:
|
||||||
|
continue
|
||||||
|
except ValueError:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
for k in INFO_REQURED:
|
for k in INFO_REQURED:
|
||||||
if k not in info:
|
if k not in info:
|
||||||
raise RuntimeError('Missing key ' + k)
|
raise RuntimeError(f'Missing key {k}')
|
||||||
|
|
||||||
return info
|
return info
|
||||||
|
|
||||||
def save_image(url, sess, filename='', dir=''):
|
|
||||||
|
def save_image(url, sess, filename='', directory=''):
|
||||||
purl = urlparse(url)
|
purl = urlparse(url)
|
||||||
headers = {
|
headers = {
|
||||||
'Host' : purl.hostname,
|
'Host': purl.hostname,
|
||||||
'Connection': 'close',
|
'Connection': 'close',
|
||||||
'User-Agent': 'InternetRecovery/1.0',
|
'User-Agent': 'InternetRecovery/1.0',
|
||||||
'Cookie' : '='.join(['AssetToken', sess])
|
'Cookie': '='.join(['AssetToken', sess])
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if not os.path.exists(directory):
|
||||||
|
os.makedirs(directory)
|
||||||
|
|
||||||
if filename == '':
|
if filename == '':
|
||||||
filename = os.path.basename(purl.path)
|
filename = os.path.basename(purl.path)
|
||||||
if filename.find('/') >= 0 or filename == '':
|
if filename.find(os.sep) >= 0 or filename == '':
|
||||||
raise RuntimeError('Invalid save path ' + filename)
|
raise RuntimeError('Invalid save path ' + filename)
|
||||||
|
|
||||||
print('Saving ' + url + ' to ' + filename + '...')
|
print(f'Saving {url} to {directory}{os.sep}{filename}...')
|
||||||
|
|
||||||
with open (os.path.join(dir, filename), 'wb') as fh:
|
with open(os.path.join(directory, filename), 'wb') as fh:
|
||||||
response = run_query(url, headers, raw=True)
|
response = run_query(url, headers, raw=True)
|
||||||
|
headers = dict(response.headers)
|
||||||
|
totalsize = -1
|
||||||
|
for header in headers:
|
||||||
|
if header.lower() == 'content-length':
|
||||||
|
totalsize = int(headers[header])
|
||||||
|
break
|
||||||
size = 0
|
size = 0
|
||||||
|
oldterminalsize = 0
|
||||||
while True:
|
while True:
|
||||||
chunk = response.read(2**20)
|
chunk = response.read(2**20)
|
||||||
if not chunk:
|
if not chunk:
|
||||||
break
|
break
|
||||||
fh.write(chunk)
|
fh.write(chunk)
|
||||||
size += len(chunk)
|
size += len(chunk)
|
||||||
print('\r{} MBs downloaded...'.format(size / (2**20)), end='')
|
terminalsize = 80
|
||||||
|
if oldterminalsize != terminalsize:
|
||||||
|
print(f'\r{"":<{terminalsize}}', end='')
|
||||||
|
oldterminalsize = terminalsize
|
||||||
|
if totalsize > 0:
|
||||||
|
progress = size / totalsize
|
||||||
|
barwidth = terminalsize // 3
|
||||||
|
print(f'\r{size / (2**20):.1f}/{totalsize / (2**20):.1f} MB ', end='')
|
||||||
|
if terminalsize > 55:
|
||||||
|
print(f'|{"=" * int(barwidth * progress):<{barwidth}}|', end='')
|
||||||
|
print(f' {progress*100:.1f}% downloaded', end='')
|
||||||
|
else:
|
||||||
|
# Fallback if Content-Length isn't available
|
||||||
|
print(f'\r{size / (2**20)} MB downloaded...', end='')
|
||||||
sys.stdout.flush()
|
sys.stdout.flush()
|
||||||
print('\rDownload complete!')
|
print('\nDownload complete!')
|
||||||
|
|
||||||
|
return os.path.join(directory, os.path.basename(filename))
|
||||||
|
|
||||||
return os.path.join(dir, os.path.basename(filename))
|
|
||||||
|
|
||||||
def verify_image(dmgpath, cnkpath):
|
def verify_image(dmgpath, cnkpath):
|
||||||
print('Verifying image with chunklist...')
|
print('Verifying image with chunklist...')
|
||||||
|
|
||||||
with open (dmgpath, 'rb') as dmgf:
|
with open(dmgpath, 'rb') as dmgf:
|
||||||
cnkcount = 0
|
for cnkcount, (cnksize, cnkhash) in enumerate(verify_chunklist(cnkpath), 1):
|
||||||
for cnksize, cnkhash in verify_chunklist(cnkpath):
|
terminalsize = 80
|
||||||
cnkcount += 1
|
print(f'\r{f"Chunk {cnkcount} ({cnksize} bytes)":<{terminalsize}}', end='')
|
||||||
print('\rChunk {} ({} bytes)'.format(cnkcount, cnksize), end='')
|
|
||||||
sys.stdout.flush()
|
sys.stdout.flush()
|
||||||
cnk = dmgf.read(cnksize)
|
cnk = dmgf.read(cnksize)
|
||||||
if len(cnk) != cnksize:
|
if len(cnk) != cnksize:
|
||||||
raise RuntimeError('Invalid chunk {} size: expected {}, read {}'.format(cnkcount, cnksize, len(cnk)))
|
raise RuntimeError(f'Invalid chunk {cnkcount} size: expected {cnksize}, read {len(cnk)}')
|
||||||
if hashlib.sha256(cnk).digest() != cnkhash:
|
if hashlib.sha256(cnk).digest() != cnkhash:
|
||||||
raise RuntimeError('Invalid chunk {}: hash mismatch'.format(cnkcount))
|
raise RuntimeError(f'Invalid chunk {cnkcount}: hash mismatch')
|
||||||
if dmgf.read(1) != b'':
|
if dmgf.read(1) != b'':
|
||||||
raise RuntimeError('Invalid image: larger than chunklist')
|
raise RuntimeError('Invalid image: larger than chunklist')
|
||||||
print('\rImage verification complete!')
|
print('\nImage verification complete!')
|
||||||
|
|
||||||
|
|
||||||
def action_download(args):
|
def action_download(args):
|
||||||
"""
|
"""
|
||||||
@@ -274,30 +292,30 @@ def action_download(args):
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
session = get_session(args)
|
session = get_session(args)
|
||||||
info = get_image_info(session, bid=args.board_id, mlb=args.mlb,
|
info = get_image_info(session, bid=args.board_id, mlb=args.mlb, diag=args.diagnostics, os_type=args.os_type)
|
||||||
diag=args.diagnostics, os_type=args.os_type)
|
|
||||||
if args.verbose:
|
if args.verbose:
|
||||||
print(info)
|
print(info)
|
||||||
print('Downloading ' + info[INFO_PRODUCT] + '...')
|
print(f'Downloading {info[INFO_PRODUCT]}...')
|
||||||
dmgname = '' if args.basename == '' else args.basename + '.dmg'
|
|
||||||
dmgpath = save_image(info[INFO_IMAGE_LINK], info[INFO_IMAGE_SESS], dmgname, args.outdir)
|
|
||||||
cnkname = '' if args.basename == '' else args.basename + '.chunklist'
|
cnkname = '' if args.basename == '' else args.basename + '.chunklist'
|
||||||
cnkpath = save_image(info[INFO_SIGN_LINK], info[INFO_SIGN_SESS], cnkname, args.outdir)
|
cnkpath = save_image(info[INFO_SIGN_LINK], info[INFO_SIGN_SESS], cnkname, args.outdir)
|
||||||
|
dmgname = '' if args.basename == '' else args.basename + '.dmg'
|
||||||
|
dmgpath = save_image(info[INFO_IMAGE_LINK], info[INFO_IMAGE_SESS], dmgname, args.outdir)
|
||||||
try:
|
try:
|
||||||
verify_image(dmgpath, cnkpath)
|
verify_image(dmgpath, cnkpath)
|
||||||
return 0
|
return 0
|
||||||
except Exception as err:
|
except Exception as err:
|
||||||
if isinstance(err, AssertionError) and str(err)=='':
|
if isinstance(err, AssertionError) and str(err) == '':
|
||||||
try:
|
try:
|
||||||
tb = sys.exc_info()[2]
|
tb = sys.exc_info()[2]
|
||||||
while tb.tb_next:
|
while tb.tb_next:
|
||||||
tb = tb.tb_next
|
tb = tb.tb_next
|
||||||
err = linecache.getline(tb.tb_frame.f_code.co_filename, tb.tb_lineno, tb.tb_frame.f_globals).strip()
|
err = linecache.getline(tb.tb_frame.f_code.co_filename, tb.tb_lineno, tb.tb_frame.f_globals).strip()
|
||||||
except:
|
except Exception:
|
||||||
err = "Invalid chunklist"
|
err = "Invalid chunklist"
|
||||||
print('\rImage verification failed. ({})'.format(err))
|
print(f'\rImage verification failed. ({err})')
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
|
|
||||||
def action_selfcheck(args):
|
def action_selfcheck(args):
|
||||||
"""
|
"""
|
||||||
Sanity check server logic for recovery:
|
Sanity check server logic for recovery:
|
||||||
@@ -316,18 +334,12 @@ def action_selfcheck(args):
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
session = get_session(args)
|
session = get_session(args)
|
||||||
valid_default = get_image_info(session, bid=RECENT_MAC, mlb=MLB_VALID,
|
valid_default = get_image_info(session, bid=RECENT_MAC, mlb=MLB_VALID, diag=False, os_type='default')
|
||||||
diag=False, os_type='default')
|
valid_latest = get_image_info(session, bid=RECENT_MAC, mlb=MLB_VALID, diag=False, os_type='latest')
|
||||||
valid_latest = get_image_info(session, bid=RECENT_MAC, mlb=MLB_VALID,
|
product_default = get_image_info(session, bid=RECENT_MAC, mlb=MLB_PRODUCT, diag=False, os_type='default')
|
||||||
diag=False, os_type='latest')
|
product_latest = get_image_info(session, bid=RECENT_MAC, mlb=MLB_PRODUCT, diag=False, os_type='latest')
|
||||||
product_default = get_image_info(session, bid=RECENT_MAC, mlb=MLB_PRODUCT,
|
generic_default = get_image_info(session, bid=RECENT_MAC, mlb=MLB_ZERO, diag=False, os_type='default')
|
||||||
diag=False, os_type='default')
|
generic_latest = get_image_info(session, bid=RECENT_MAC, mlb=MLB_ZERO, diag=False, os_type='latest')
|
||||||
product_latest = get_image_info(session, bid=RECENT_MAC, mlb=MLB_PRODUCT,
|
|
||||||
diag=False, os_type='latest')
|
|
||||||
generic_default = get_image_info(session, bid=RECENT_MAC, mlb=MLB_ZERO,
|
|
||||||
diag=False, os_type='default')
|
|
||||||
generic_latest = get_image_info(session, bid=RECENT_MAC, mlb=MLB_ZERO,
|
|
||||||
diag=False, os_type='latest')
|
|
||||||
|
|
||||||
if args.verbose:
|
if args.verbose:
|
||||||
print(valid_default)
|
print(valid_default)
|
||||||
@@ -339,50 +351,43 @@ def action_selfcheck(args):
|
|||||||
|
|
||||||
if valid_default[INFO_PRODUCT] == valid_latest[INFO_PRODUCT]:
|
if valid_default[INFO_PRODUCT] == valid_latest[INFO_PRODUCT]:
|
||||||
# Valid MLB must give different default and latest if this is not a too new product.
|
# Valid MLB must give different default and latest if this is not a too new product.
|
||||||
print('ERROR: Cannot determine any previous product, got {}'.format(valid_default[INFO_PRODUCT]))
|
print(f'ERROR: Cannot determine any previous product, got {valid_default[INFO_PRODUCT]}')
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
if product_default[INFO_PRODUCT] != product_latest[INFO_PRODUCT]:
|
if product_default[INFO_PRODUCT] != product_latest[INFO_PRODUCT]:
|
||||||
# Product-only MLB must give the same value for default and latest.
|
# Product-only MLB must give the same value for default and latest.
|
||||||
print('ERROR: Latest and default do not match for product MLB, got {} and {}'.format(
|
print(f'ERROR: Latest and default do not match for product MLB, got {product_default[INFO_PRODUCT]} and {product_latest[INFO_PRODUCT]}')
|
||||||
product_default[INFO_PRODUCT], product_latest[INFO_PRODUCT]))
|
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
if generic_default[INFO_PRODUCT] != generic_latest[INFO_PRODUCT]:
|
if generic_default[INFO_PRODUCT] != generic_latest[INFO_PRODUCT]:
|
||||||
# Zero MLB always give the same value for default and latest.
|
# Zero MLB always give the same value for default and latest.
|
||||||
print('ERROR: Generic MLB gives different product, got {} and {}'.format(
|
print(f'ERROR: Generic MLB gives different product, got {generic_default[INFO_PRODUCT]} and {generic_latest[INFO_PRODUCT]}')
|
||||||
generic_default[INFO_PRODUCT], generic_latest[INFO_PRODUCT]))
|
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
if valid_latest[INFO_PRODUCT] != generic_latest[INFO_PRODUCT]:
|
if valid_latest[INFO_PRODUCT] != generic_latest[INFO_PRODUCT]:
|
||||||
# Valid MLB must always equal generic MLB.
|
# Valid MLB must always equal generic MLB.
|
||||||
print('ERROR: Cannot determine unified latest product, got {} and {}'.format(
|
print(f'ERROR: Cannot determine unified latest product, got {valid_latest[INFO_PRODUCT]} and {generic_latest[INFO_PRODUCT]}')
|
||||||
valid_latest[INFO_PRODUCT], generic_latest[INFO_PRODUCT]))
|
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
if product_default[INFO_PRODUCT] != valid_default[INFO_PRODUCT]:
|
if product_default[INFO_PRODUCT] != valid_default[INFO_PRODUCT]:
|
||||||
# Product-only MLB can give the same value with valid default MLB.
|
# Product-only MLB can give the same value with valid default MLB.
|
||||||
# This is not an error for all models, but for our chosen code it is.
|
# This is not an error for all models, but for our chosen code it is.
|
||||||
print('ERROR: Valid and product MLB give mismatch, got {} and {}'.format(
|
print(f'ERROR: Valid and product MLB give mismatch, got {product_default[INFO_PRODUCT]} and {valid_default[INFO_PRODUCT]}')
|
||||||
product_default[INFO_PRODUCT], valid_default[INFO_PRODUCT]))
|
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
print('SUCCESS: Found no discrepancies with MLB validation algorithm!')
|
print('SUCCESS: Found no discrepancies with MLB validation algorithm!')
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
|
|
||||||
def action_verify(args):
|
def action_verify(args):
|
||||||
"""
|
"""
|
||||||
Try to verify MLB serial number.
|
Try to verify MLB serial number.
|
||||||
"""
|
"""
|
||||||
session = get_session(args)
|
session = get_session(args)
|
||||||
generic_latest = get_image_info(session, bid=RECENT_MAC, mlb=MLB_ZERO,
|
generic_latest = get_image_info(session, bid=RECENT_MAC, mlb=MLB_ZERO, diag=False, os_type='latest')
|
||||||
diag=False, os_type='latest')
|
uvalid_default = get_image_info(session, bid=args.board_id, mlb=args.mlb, diag=False, os_type='default')
|
||||||
uvalid_default = get_image_info(session, bid=args.board_id, mlb=args.mlb,
|
uvalid_latest = get_image_info(session, bid=args.board_id, mlb=args.mlb, diag=False, os_type='latest')
|
||||||
diag=False, os_type='default')
|
uproduct_default = get_image_info(session, bid=args.board_id, mlb=product_mlb(args.mlb), diag=False, os_type='default')
|
||||||
uvalid_latest = get_image_info(session, bid=args.board_id, mlb=args.mlb,
|
|
||||||
diag=False, os_type='latest')
|
|
||||||
uproduct_default = get_image_info(session, bid=args.board_id, mlb=product_mlb(args.mlb),
|
|
||||||
diag=False, os_type='default')
|
|
||||||
|
|
||||||
if args.verbose:
|
if args.verbose:
|
||||||
print(generic_latest)
|
print(generic_latest)
|
||||||
@@ -392,10 +397,7 @@ def action_verify(args):
|
|||||||
|
|
||||||
# Verify our MLB number.
|
# Verify our MLB number.
|
||||||
if uvalid_default[INFO_PRODUCT] != uvalid_latest[INFO_PRODUCT]:
|
if uvalid_default[INFO_PRODUCT] != uvalid_latest[INFO_PRODUCT]:
|
||||||
if uvalid_latest[INFO_PRODUCT] == generic_latest[INFO_PRODUCT]:
|
print(f'SUCCESS: {args.mlb} MLB looks valid and supported!' if uvalid_latest[INFO_PRODUCT] == generic_latest[INFO_PRODUCT] else f'SUCCESS: {args.mlb} MLB looks valid, but probably unsupported!')
|
||||||
print('SUCCESS: {} MLB looks valid and supported!'.format(args.mlb))
|
|
||||||
else:
|
|
||||||
print('SUCCESS: {} MLB looks valid, but probably unsupported!'.format(args.mlb))
|
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
print('UNKNOWN: Run selfcheck, check your board-id, or try again later!')
|
print('UNKNOWN: Run selfcheck, check your board-id, or try again later!')
|
||||||
@@ -403,15 +405,15 @@ def action_verify(args):
|
|||||||
# Here we have matching default and latest products. This can only be true for very
|
# Here we have matching default and latest products. This can only be true for very
|
||||||
# new models. These models get either latest or special builds.
|
# new models. These models get either latest or special builds.
|
||||||
if uvalid_default[INFO_PRODUCT] == generic_latest[INFO_PRODUCT]:
|
if uvalid_default[INFO_PRODUCT] == generic_latest[INFO_PRODUCT]:
|
||||||
print('UNKNOWN: {} MLB can be valid if very new!'.format(args.mlb))
|
print(f'UNKNOWN: {args.mlb} MLB can be valid if very new!')
|
||||||
return 0
|
return 0
|
||||||
if uproduct_default[INFO_PRODUCT] != uvalid_default[INFO_PRODUCT]:
|
if uproduct_default[INFO_PRODUCT] != uvalid_default[INFO_PRODUCT]:
|
||||||
print('UNKNOWN: {} MLB looks invalid, other models use product {} instead of {}!'.format(
|
print(f'UNKNOWN: {args.mlb} MLB looks invalid, other models use product {uproduct_default[INFO_PRODUCT]} instead of {uvalid_default[INFO_PRODUCT]}!')
|
||||||
args.mlb, uproduct_default[INFO_PRODUCT], uvalid_default[INFO_PRODUCT]))
|
|
||||||
return 0
|
return 0
|
||||||
print('UNKNOWN: {} MLB can be valid if very new and using special builds!'.format(args.mlb))
|
print(f'UNKNOWN: {args.mlb} MLB can be valid if very new and using special builds!')
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
|
|
||||||
def action_guess(args):
|
def action_guess(args):
|
||||||
"""
|
"""
|
||||||
Attempt to guess which model does this MLB belong.
|
Attempt to guess which model does this MLB belong.
|
||||||
@@ -420,75 +422,70 @@ def action_guess(args):
|
|||||||
mlb = args.mlb
|
mlb = args.mlb
|
||||||
anon = mlb.startswith('000')
|
anon = mlb.startswith('000')
|
||||||
|
|
||||||
with open(args.board_db, 'r') as fh:
|
with open(args.board_db, 'r', encoding='utf-8') as fh:
|
||||||
db = json.load(fh)
|
db = json.load(fh)
|
||||||
|
|
||||||
supported = {}
|
supported = {}
|
||||||
|
|
||||||
session = get_session(args)
|
session = get_session(args)
|
||||||
|
|
||||||
generic_latest = get_image_info(session, bid=RECENT_MAC, mlb=MLB_ZERO,
|
generic_latest = get_image_info(session, bid=RECENT_MAC, mlb=MLB_ZERO, diag=False, os_type='latest')
|
||||||
diag=False, os_type='latest')
|
|
||||||
|
|
||||||
for model in db:
|
for model in db:
|
||||||
try:
|
try:
|
||||||
if anon:
|
if anon:
|
||||||
# For anonymous lookup check when given model does not match latest.
|
# For anonymous lookup check when given model does not match latest.
|
||||||
model_latest = get_image_info(session, bid=model, mlb=MLB_ZERO,
|
model_latest = get_image_info(session, bid=model, mlb=MLB_ZERO, diag=False, os_type='latest')
|
||||||
diag=False, os_type='latest')
|
|
||||||
|
|
||||||
if model_latest[INFO_PRODUCT] != generic_latest[INFO_PRODUCT]:
|
if model_latest[INFO_PRODUCT] != generic_latest[INFO_PRODUCT]:
|
||||||
if db[model] == 'current':
|
if db[model] == 'current':
|
||||||
print('WARN: Skipped {} due to using latest product {} instead of {}'.format(
|
print(f'WARN: Skipped {model} due to using latest product {model_latest[INFO_PRODUCT]} instead of {generic_latest[INFO_PRODUCT]}')
|
||||||
model, model_latest[INFO_PRODUCT], generic_latest[INFO_PRODUCT]))
|
|
||||||
continue
|
continue
|
||||||
|
|
||||||
user_default = get_image_info(session, bid=model, mlb=mlb,
|
user_default = get_image_info(session, bid=model, mlb=mlb, diag=False, os_type='default')
|
||||||
diag=False, os_type='default')
|
|
||||||
|
|
||||||
if user_default[INFO_PRODUCT] != generic_latest[INFO_PRODUCT]:
|
if user_default[INFO_PRODUCT] != generic_latest[INFO_PRODUCT]:
|
||||||
supported[model] = [db[model], user_default[INFO_PRODUCT], generic_latest[INFO_PRODUCT]]
|
supported[model] = [db[model], user_default[INFO_PRODUCT], generic_latest[INFO_PRODUCT]]
|
||||||
else:
|
else:
|
||||||
# For normal lookup check when given model has mismatching normal and latest.
|
# For normal lookup check when given model has mismatching normal and latest.
|
||||||
user_latest = get_image_info(session, bid=model, mlb=mlb,
|
user_latest = get_image_info(session, bid=model, mlb=mlb, diag=False, os_type='latest')
|
||||||
diag=False, os_type='latest')
|
|
||||||
|
|
||||||
user_default = get_image_info(session, bid=model, mlb=mlb,
|
user_default = get_image_info(session, bid=model, mlb=mlb, diag=False, os_type='default')
|
||||||
diag=False, os_type='default')
|
|
||||||
|
|
||||||
if user_latest[INFO_PRODUCT] != user_default[INFO_PRODUCT]:
|
if user_latest[INFO_PRODUCT] != user_default[INFO_PRODUCT]:
|
||||||
supported[model] = [db[model], user_default[INFO_PRODUCT], user_latest[INFO_PRODUCT]]
|
supported[model] = [db[model], user_default[INFO_PRODUCT], user_latest[INFO_PRODUCT]]
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print('WARN: Failed to check {}, exception: {}'.format(model, str(e)))
|
print(f'WARN: Failed to check {model}, exception: {e}')
|
||||||
|
|
||||||
if len(supported) > 0:
|
if len(supported) > 0:
|
||||||
print('SUCCESS: MLB {} looks supported for:'.format(mlb))
|
print(f'SUCCESS: MLB {mlb} looks supported for:')
|
||||||
for model in supported:
|
for model in supported.items():
|
||||||
print('- {}, up to {}, default: {}, latest: {}'.format(model, supported[model][0],
|
print(f'- {model}, up to {supported[model][0]}, default: {supported[model][1]}, latest: {supported[model][2]}')
|
||||||
supported[model][1], supported[model][2]))
|
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
print('UNKNOWN: Failed to determine supported models for MLB {}!'.format(mlb))
|
print(f'UNKNOWN: Failed to determine supported models for MLB {mlb}!')
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
parser = argparse.ArgumentParser(description='Gather recovery information for Macs')
|
parser = argparse.ArgumentParser(description='Gather recovery information for Macs')
|
||||||
parser.add_argument('action', choices = ['download', 'selfcheck', 'verify', 'guess'],
|
parser.add_argument('action', choices=['download', 'selfcheck', 'verify', 'guess'],
|
||||||
help='Action to perform: "download" - performs recovery downloading,'
|
help='Action to perform: "download" - performs recovery downloading,'
|
||||||
' "selfcheck" checks whether MLB serial validation is possible, "verify" performs'
|
' "selfcheck" checks whether MLB serial validation is possible, "verify" performs'
|
||||||
' MLB serial verification, "guess" tries to find suitable mac model for MLB.')
|
' MLB serial verification, "guess" tries to find suitable mac model for MLB.')
|
||||||
parser.add_argument('-o', '--outdir', type=str, default=os.getcwd(),
|
parser.add_argument('-o', '--outdir', type=str, default='com.apple.recovery.boot',
|
||||||
help='customise output directory for downloading, defaults to current directory')
|
help='customise output directory for downloading, defaults to com.apple.recovery.boot')
|
||||||
parser.add_argument('-n', '--basename', type=str, default='',
|
parser.add_argument('-n', '--basename', type=str, default='',
|
||||||
help='customise base name for downloading, defaults to remote name')
|
help='customise base name for downloading, defaults to remote name')
|
||||||
parser.add_argument('-b', '--board-id', type=str, default=RECENT_MAC,
|
parser.add_argument('-b', '--board-id', type=str, default=RECENT_MAC,
|
||||||
help='use specified board identifier for downloading, defaults to ' + RECENT_MAC)
|
help=f'use specified board identifier for downloading, defaults to {RECENT_MAC}')
|
||||||
parser.add_argument('-m', '--mlb', type=str, default=MLB_ZERO,
|
parser.add_argument('-m', '--mlb', type=str, default=MLB_ZERO,
|
||||||
help='use specified logic board serial for downloading, defaults to ' + MLB_ZERO)
|
help=f'use specified logic board serial for downloading, defaults to {MLB_ZERO}')
|
||||||
parser.add_argument('-e', '--code', type=str, default='',
|
parser.add_argument('-e', '--code', type=str, default='',
|
||||||
help='generate product logic board serial with specified product EEEE code')
|
help='generate product logic board serial with specified product EEEE code')
|
||||||
parser.add_argument('-os', '--os-type', type=str, default='default', choices = ['default', 'latest'],
|
parser.add_argument('-os', '--os-type', type=str, default='default', choices=['default', 'latest'],
|
||||||
help='use specified os type, defaults to default ' + MLB_ZERO)
|
help=f'use specified os type, defaults to default {MLB_ZERO}')
|
||||||
parser.add_argument('-diag', '--diagnostics', action='store_true', help='download diagnostics image')
|
parser.add_argument('-diag', '--diagnostics', action='store_true', help='download diagnostics image')
|
||||||
parser.add_argument('-v', '--verbose', action='store_true', help='print debug information')
|
parser.add_argument('-v', '--verbose', action='store_true', help='print debug information')
|
||||||
parser.add_argument('-db', '--board-db', type=str, default=os.path.join(SELF_DIR, 'boards.json'),
|
parser.add_argument('-db', '--board-db', type=str, default=os.path.join(SELF_DIR, 'boards.json'),
|
||||||
@@ -505,14 +502,15 @@ def main():
|
|||||||
|
|
||||||
if args.action == 'download':
|
if args.action == 'download':
|
||||||
return action_download(args)
|
return action_download(args)
|
||||||
elif args.action == 'selfcheck':
|
if args.action == 'selfcheck':
|
||||||
return action_selfcheck(args)
|
return action_selfcheck(args)
|
||||||
elif args.action == 'verify':
|
if args.action == 'verify':
|
||||||
return action_verify(args)
|
return action_verify(args)
|
||||||
elif args.action == 'guess':
|
if args.action == 'guess':
|
||||||
return action_guess(args)
|
return action_guess(args)
|
||||||
else:
|
|
||||||
assert(False)
|
assert False
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
sys.exit(main())
|
sys.exit(main())
|
||||||
|
|||||||
@@ -1,45 +1,47 @@
|
|||||||
Lion
|
# Lion (10.7):
|
||||||
./macrecovery.py -b Mac-2E6FAB96566FE58C -m 00000000000F25Y00
|
python macrecovery.py -b Mac-2E6FAB96566FE58C -m 00000000000F25Y00 download
|
||||||
./macrecovery.py -b Mac-C3EC7CD22292981F -m 00000000000F0HM00
|
python macrecovery.py -b Mac-C3EC7CD22292981F -m 00000000000F0HM00 download
|
||||||
|
|
||||||
Mountain Lion:
|
# Mountain Lion (10.8):
|
||||||
./macrecovery.py -b Mac-7DF2A3B5E5D671ED -m 00000000000F65100
|
python macrecovery.py -b Mac-7DF2A3B5E5D671ED -m 00000000000F65100 download
|
||||||
|
|
||||||
Mavericks
|
# Mavericks (10.9):
|
||||||
./macrecovery.py -b Mac-F60DEB81FF30ACF6 -m 00000000000FNN100
|
python macrecovery.py -b Mac-F60DEB81FF30ACF6 -m 00000000000FNN100 download
|
||||||
|
|
||||||
Yosemite:
|
# Yosemite (10.10):
|
||||||
./macrecovery.py -b Mac-E43C1C25D4880AD6 -m 00000000000GDVW00
|
python macrecovery.py -b Mac-E43C1C25D4880AD6 -m 00000000000GDVW00 download
|
||||||
|
|
||||||
El Capitan
|
# El Capitan (10.11):
|
||||||
./macrecovery.py -b Mac-FFE5EF870D7BA81A -m 00000000000GQRX00
|
python macrecovery.py -b Mac-FFE5EF870D7BA81A -m 00000000000GQRX00 download
|
||||||
|
|
||||||
Sierra
|
# Sierra (10.12):
|
||||||
./macrecovery.py -b Mac-77F17D7DA9285301 -m 00000000000J0DX00
|
python macrecovery.py -b Mac-77F17D7DA9285301 -m 00000000000J0DX00 download
|
||||||
|
|
||||||
High Sierra
|
# High Sierra (10.13)
|
||||||
./macrecovery.py -b Mac-7BA5B2D9E42DDD94 -m 00000000000J80300
|
python macrecovery.py -b Mac-7BA5B2D9E42DDD94 -m 00000000000J80300 download
|
||||||
./macrecovery.py -b Mac-BE088AF8C5EB4FA2 -m 00000000000J80300
|
python macrecovery.py -b Mac-BE088AF8C5EB4FA2 -m 00000000000J80300 download
|
||||||
|
|
||||||
Mojave
|
# Mojave (10.14)
|
||||||
./macrecovery.py -b Mac-7BA5B2DFE22DDD8C -m 00000000000KXPG00
|
python macrecovery.py -b Mac-7BA5B2DFE22DDD8C -m 00000000000KXPG00 download
|
||||||
|
|
||||||
Catalina
|
# Catalina (10.15)
|
||||||
./macrecovery.py -b Mac-CFF7D910A743CAAF -m 00000000000PHCD00
|
python macrecovery.py -b Mac-00BE6ED71E35EB86 -m 00000000000000000 download
|
||||||
./macrecovery.py -b Mac-00BE6ED71E35EB86 -m 00000000000000000
|
|
||||||
|
|
||||||
Big Sur
|
# Big Sur (11)
|
||||||
./macrecovery.py -b Mac-2BD1B31983FE1663 -m 00000000000000000
|
python macrecovery.py -b Mac-42FD25EABCABB274 -m 00000000000000000 download
|
||||||
|
|
||||||
Diagnostics
|
# Monterey (12)
|
||||||
./macrecovery.py -b Mac-E43C1C25D4880AD6 -m 00000000000000000 -diag
|
python macrecovery.py -b Mac-E43C1C25D4880AD6 -m 00000000000000000 download
|
||||||
./macrecovery.py -b Mac-E43C1C25D4880AD6 -m 00000000000GDVQ00 -diag
|
|
||||||
./macrecovery.py -b Mac-E43C1C25D4880AD6 <real MLB> -diag
|
|
||||||
|
|
||||||
Default version
|
# Ventura (13)
|
||||||
./macrecovery.py -b Mac-E43C1C25D4880AD6 -m 00000000000GDVQ00 (oldest)
|
python macrecovery.py -b Mac-EE2EBD4B90B839A8 -m 00000000000000000 download
|
||||||
./macrecovery.py -b Mac-E43C1C25D4880AD6 -m <real MLB> -os default (newer)
|
|
||||||
|
|
||||||
Latest version
|
# Sonoma (14)
|
||||||
./macrecovery.py -b Mac-E43C1C25D4880AD6 -m 00000000000000000 -os latest
|
python macrecovery.py -b Mac-827FAC58A8FDFA22 -m 00000000000000000 download
|
||||||
./macrecovery.py -b Mac-E43C1C25D4880AD6 -m <real MLB> -os latest
|
|
||||||
|
# Sequoia (15)
|
||||||
|
python macrecovery.py -b Mac-7BA5B2D9E42DDD94 -m 00000000000000000 download
|
||||||
|
|
||||||
|
# Latest version
|
||||||
|
# ie. Tahoe (26)
|
||||||
|
python macrecovery.py -b Mac-27AD2F918AE68F61 -m 00000000000000000 -os latest download
|
||||||
|
|||||||