diff --git a/CHANGELOG.md b/CHANGELOG.md index be8ab84..df883a9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## 0.4.1 + +Use the latest [WhateverXe](https://github.com/b00t0x/WhateverXe/releases) release with this update. + +### Fixed + +- Update the common graphics compatibility component to recognize compatible macOS kernel updates without requiring an exact build string. + ## 0.4.0 Use the latest [WhateverXe](https://github.com/b00t0x/WhateverXe/releases) release with this update. diff --git a/README.md b/README.md index 14960e3..bf9650d 100644 --- a/README.md +++ b/README.md @@ -62,10 +62,11 @@ Requires macOS, Xcode command-line tools and Python 3.10+. Verification also nee ```sh python3 tools/build.py -python3 tools/test.py dist/WhateverXe-Graphics-0.4.0.pkg +python3 tools/test.py dist/WhateverXe-Graphics-0.4.1.pkg ``` For AutoPkg, add `--autopkg` to the build command and test `dist/autopkg/AutoPkg-Assets.pkg`. +Add `--native-history` to the test command to replay released PCI dispatch and GL URB regressions on the extracted payloads; this requires x86_64 execution, either native or through Rosetta. The builder uses the checked-in signed payloads; it does not fetch Apple originals or require signing keys. [Source and signing information](docs/SOURCES.md) · [Third-party notices](THIRD_PARTY.md) diff --git a/README_ja.md b/README_ja.md index b0796f9..0b5eb9a 100644 --- a/README_ja.md +++ b/README_ja.md @@ -62,10 +62,11 @@ macOS、Xcode Command Line Tools、Python 3.10以上が必要です。検査に ```sh python3 tools/build.py -python3 tools/test.py dist/WhateverXe-Graphics-0.4.0.pkg +python3 tools/test.py dist/WhateverXe-Graphics-0.4.1.pkg ``` AutoPkgはビルド時に`--autopkg`を追加し、`dist/autopkg/AutoPkg-Assets.pkg`を検査します。 +検査コマンドに`--native-history`を追加すると、展開したpayloadで過去版のPCI dispatchとGL URB補正を再生します。ネイティブまたはRosetta経由のx86_64実行環境が必要です。 Git内の署名済み資材を使用するため、Apple原本の取得や署名鍵は不要です。 [ソース・署名情報](docs/SOURCES.md) · [第三者の権利表記](THIRD_PARTY.md) diff --git a/docs/SOURCES.md b/docs/SOURCES.md index d0e7bb0..b5a5e14 100644 --- a/docs/SOURCES.md +++ b/docs/SOURCES.md @@ -9,8 +9,8 @@ for this repository. Source and its shared headers remain in [WhateverXe](https://github.com/b00t0x/WhateverXe). All supported macOS versions -use one RELEASE build of AppleIntelTGLCompat 0.7.0 from WEX commit -[`2aa06ad`](https://github.com/b00t0x/WhateverXe/tree/2aa06ad013e08f7b79779d446cdd12084b4e3dfd/AppleIntelTGLCompat). +use one RELEASE build of AppleIntelTGLCompat 0.8.0 from WEX commit +[`20b8ae5`](https://github.com/b00t0x/WhateverXe/tree/20b8ae5c705e12a54d418df03d3665efc874dac6/AppleIntelTGLCompat). Build that checkout with `python3 tools/build.py --release`, then sign the resulting kext with the Mod chain before importing the complete bundle into `payloads/Common/Library/Extensions/`. The package contains no per-OS provider diff --git a/docs/payload-provenance.json b/docs/payload-provenance.json index 9f1abbd..016fa2c 100644 --- a/docs/payload-provenance.json +++ b/docs/payload-provenance.json @@ -2,18 +2,20 @@ "provider_source_repository": "https://github.com/b00t0x/WhateverXe", "providers": { "Common": { - "source_commit": "2aa06ad013e08f7b79779d446cdd12084b4e3dfd", + "source_commit": "20b8ae5c705e12a54d418df03d3665efc874dac6", "source_file": "AppleIntelTGLCompat/AppleIntelTGLCompat.cpp", "source_file_sha256": "2a5f7622cbd35e222d1d0b1e3f78f421bd0a9f691fec51a7b18d3725ab61c445", - "version": "0.7.0", + "version": "0.8.0", "configuration": "RELEASE", "build_command": "python3 tools/build.py --release", - "sha256": "ea7d24b13c9554b361f82c714c4acc124cfa1f7155669e1b8663a1827630f1d0", + "sha256": "5f83bc96c73aed10c60b03a6593f6eb3abc04efc672e9564be907d876ef4fba7", "policy_source_file": "AppleIntelTGLCompat/GraphicsPolicy.plist", "policy_source_sha256": "dd9555491052208445abbd9daa96dd0a9dd4e5e71b1e6a14355224199cfb17eb", "compatible_version": "0.5.0", "device_table_source_file": "WhateverXe/kern_xelp_devices.hpp", - "device_table_source_sha256": "7df149488e4a51066ca9953817c7e3529bc4a630e81442da83c116297d5dfad9" + "device_table_source_sha256": "7df149488e4a51066ca9953817c7e3529bc4a630e81442da83c116297d5dfad9", + "os_selector_source_file": "WhateverXe/kern_xelp_os.hpp", + "os_selector_source_sha256": "0a1e96c40f8f4dc3627f64c4699e73a79b041f59c845d2c17649375cbd65371b" } }, "amfipass_sha256": "71f41de42e355d2a83e6f093ef34a5b24d0a9c9a9085830b2317f1b874f56250", diff --git a/payloads/Common/Library/Extensions/AppleIntelTGLCompat.kext/Contents/Info.plist b/payloads/Common/Library/Extensions/AppleIntelTGLCompat.kext/Contents/Info.plist index 882ae65..e6dc144 100644 --- a/payloads/Common/Library/Extensions/AppleIntelTGLCompat.kext/Contents/Info.plist +++ b/payloads/Common/Library/Extensions/AppleIntelTGLCompat.kext/Contents/Info.plist @@ -11,9 +11,9 @@ CFBundlePackageType KEXT CFBundleShortVersionString - 0.7.0 + 0.8.0 CFBundleVersion - 0.7.0 + 0.8.0 IOKitPersonalities WEX Display13 graphics policy diff --git a/payloads/Common/Library/Extensions/AppleIntelTGLCompat.kext/Contents/MacOS/AppleIntelTGLCompat b/payloads/Common/Library/Extensions/AppleIntelTGLCompat.kext/Contents/MacOS/AppleIntelTGLCompat index 485c2b2..1233e13 100755 Binary files a/payloads/Common/Library/Extensions/AppleIntelTGLCompat.kext/Contents/MacOS/AppleIntelTGLCompat and b/payloads/Common/Library/Extensions/AppleIntelTGLCompat.kext/Contents/MacOS/AppleIntelTGLCompat differ diff --git a/tools/fixtures/released_clients.json b/tools/fixtures/released_clients.json new file mode 100644 index 0000000..2e78947 --- /dev/null +++ b/tools/fixtures/released_clients.json @@ -0,0 +1,645 @@ +{ + "schema": 1, + "releases": [ + { + "tag": "v0.1.0", + "commit": "444b348e7ee757ded480ff46d781d5efb0f5fb38", + "contracts": [ + { + "identifier": "com.apple.driver.AppleIntelTGLGraphics", + "requires_provider": null, + "matches": [ + "0x46d08086", + "0x46d18086", + "0x46d28086", + "0x46d38086", + "0x46d48086", + "0x9a408086", + "0x9a498086", + "0x9a788086" + ], + "components": [ + "Big Sur", + "Monterey", + "Sequoia", + "Sonoma", + "Tahoe", + "Ventura" + ] + }, + { + "identifier": "com.apple.driver.AppleIntelTGLGraphicsFramebuffer", + "requires_provider": "0.5.0", + "matches": [ + "0x46d08086", + "0x46d18086", + "0x46d28086", + "0x46d38086", + "0x46d48086", + "0x9a408086", + "0x9a498086", + "0x9a788086" + ], + "components": [ + "Big Sur", + "Monterey", + "Sequoia", + "Sonoma", + "Tahoe", + "Ventura" + ] + } + ] + }, + { + "tag": "v0.2.0", + "commit": "e83018e76c0f39f0f870ff38dcc304fb357c3485", + "contracts": [ + { + "identifier": "com.apple.driver.AppleIntelTGLGraphics", + "requires_provider": null, + "matches": [ + "0x46808086", + "0x46828086", + "0x46888086", + "0x468a8086", + "0x468b8086", + "0x46908086", + "0x46928086", + "0x46938086", + "0x46d08086", + "0x46d18086", + "0x46d28086", + "0x46d38086", + "0x46d48086", + "0x9a408086", + "0x9a498086", + "0x9a608086", + "0x9a688086", + "0x9a708086", + "0x9a788086", + "0xa7808086", + "0xa7818086", + "0xa7828086", + "0xa7838086", + "0xa7888086", + "0xa7898086", + "0xa78a8086", + "0xa78b8086" + ], + "components": [ + "Big Sur", + "Monterey", + "Sequoia", + "Sonoma", + "Tahoe", + "Ventura" + ] + }, + { + "identifier": "com.apple.driver.AppleIntelTGLGraphicsFramebuffer", + "requires_provider": "0.5.0", + "matches": [ + "0x46808086", + "0x46828086", + "0x46888086", + "0x468a8086", + "0x468b8086", + "0x46908086", + "0x46928086", + "0x46938086", + "0x46d08086", + "0x46d18086", + "0x46d28086", + "0x46d38086", + "0x46d48086", + "0x9a408086", + "0x9a498086", + "0x9a608086", + "0x9a688086", + "0x9a708086", + "0x9a788086", + "0xa7808086", + "0xa7818086", + "0xa7828086", + "0xa7838086", + "0xa7888086", + "0xa7898086", + "0xa78a8086", + "0xa78b8086" + ], + "components": [ + "Big Sur", + "Monterey", + "Sequoia", + "Sonoma", + "Tahoe", + "Ventura" + ] + } + ] + }, + { + "tag": "v0.3.0", + "commit": "7aa1a8340c862f764d42a5d7f5d08e9a66b6eab4", + "contracts": [ + { + "identifier": "com.apple.driver.AppleIntelTGLGraphics", + "requires_provider": null, + "matches": [ + "0x46808086", + "0x46828086", + "0x46888086", + "0x468a8086", + "0x468b8086", + "0x46908086", + "0x46928086", + "0x46938086", + "0x46a38086", + "0x46a68086", + "0x46a88086", + "0x46aa8086", + "0x46b38086", + "0x46c38086", + "0x46d08086", + "0x46d18086", + "0x46d28086", + "0x46d38086", + "0x46d48086", + "0x9a408086", + "0x9a498086", + "0x9a608086", + "0x9a688086", + "0x9a708086", + "0x9a788086", + "0xa7808086", + "0xa7818086", + "0xa7828086", + "0xa7838086", + "0xa7888086", + "0xa7898086", + "0xa78a8086", + "0xa78b8086", + "0xa7a08086", + "0xa7a18086", + "0xa7a88086", + "0xa7a98086", + "0xa7aa8086", + "0xa7ab8086", + "0xa7ac8086", + "0xa7ad8086" + ], + "components": [ + "Big Sur", + "Monterey", + "Sequoia", + "Sonoma", + "Tahoe", + "Ventura" + ] + }, + { + "identifier": "com.apple.driver.AppleIntelTGLGraphicsFramebuffer", + "requires_provider": "0.5.0", + "matches": [ + "0x46808086", + "0x46828086", + "0x46888086", + "0x468a8086", + "0x468b8086", + "0x46908086", + "0x46928086", + "0x46938086", + "0x46a38086", + "0x46a68086", + "0x46a88086", + "0x46aa8086", + "0x46b38086", + "0x46c38086", + "0x46d08086", + "0x46d18086", + "0x46d28086", + "0x46d38086", + "0x46d48086", + "0x9a408086", + "0x9a498086", + "0x9a608086", + "0x9a688086", + "0x9a708086", + "0x9a788086", + "0xa7808086", + "0xa7818086", + "0xa7828086", + "0xa7838086", + "0xa7888086", + "0xa7898086", + "0xa78a8086", + "0xa78b8086", + "0xa7a08086", + "0xa7a18086", + "0xa7a88086", + "0xa7a98086", + "0xa7aa8086", + "0xa7ab8086", + "0xa7ac8086", + "0xa7ad8086" + ], + "components": [ + "Big Sur", + "Monterey", + "Sequoia", + "Sonoma", + "Tahoe", + "Ventura" + ] + } + ] + }, + { + "tag": "v0.3.1", + "commit": "59e4ca9e474781dba80a5b5f60fba1767d0a9c2a", + "contracts": [ + { + "identifier": "com.apple.driver.AppleIntelTGLGraphics", + "requires_provider": null, + "matches": [ + "0x46808086", + "0x46828086", + "0x46888086", + "0x468a8086", + "0x468b8086", + "0x46908086", + "0x46928086", + "0x46938086", + "0x46a38086", + "0x46a68086", + "0x46a88086", + "0x46aa8086", + "0x46b38086", + "0x46c38086", + "0x46d08086", + "0x46d18086", + "0x46d28086", + "0x46d38086", + "0x46d48086", + "0x9a408086", + "0x9a498086", + "0x9a608086", + "0x9a688086", + "0x9a708086", + "0x9a788086", + "0xa7808086", + "0xa7818086", + "0xa7828086", + "0xa7838086", + "0xa7888086", + "0xa7898086", + "0xa78a8086", + "0xa78b8086", + "0xa7a08086", + "0xa7a18086", + "0xa7a88086", + "0xa7a98086", + "0xa7aa8086", + "0xa7ab8086", + "0xa7ac8086", + "0xa7ad8086" + ], + "components": [ + "Big Sur", + "Monterey", + "Sequoia", + "Sonoma", + "Tahoe", + "Ventura" + ] + }, + { + "identifier": "com.apple.driver.AppleIntelTGLGraphicsFramebuffer", + "requires_provider": "0.5.0", + "matches": [ + "0x46808086", + "0x46828086", + "0x46888086", + "0x468a8086", + "0x468b8086", + "0x46908086", + "0x46928086", + "0x46938086", + "0x46a38086", + "0x46a68086", + "0x46a88086", + "0x46aa8086", + "0x46b38086", + "0x46c38086", + "0x46d08086", + "0x46d18086", + "0x46d28086", + "0x46d38086", + "0x46d48086", + "0x9a408086", + "0x9a498086", + "0x9a608086", + "0x9a688086", + "0x9a708086", + "0x9a788086", + "0xa7808086", + "0xa7818086", + "0xa7828086", + "0xa7838086", + "0xa7888086", + "0xa7898086", + "0xa78a8086", + "0xa78b8086", + "0xa7a08086", + "0xa7a18086", + "0xa7a88086", + "0xa7a98086", + "0xa7aa8086", + "0xa7ab8086", + "0xa7ac8086", + "0xa7ad8086" + ], + "components": [ + "Big Sur", + "Monterey", + "Sequoia", + "Sonoma", + "Tahoe", + "Ventura" + ] + } + ] + }, + { + "tag": "v0.3.2", + "commit": "b4d3889206a609e29e991a833d8d91c2d110a661", + "contracts": [ + { + "identifier": "com.apple.driver.AppleIntelTGLGraphics", + "requires_provider": null, + "matches": [ + "0x46808086", + "0x46828086", + "0x46888086", + "0x468a8086", + "0x468b8086", + "0x46908086", + "0x46928086", + "0x46938086", + "0x46a38086", + "0x46a68086", + "0x46a88086", + "0x46aa8086", + "0x46b38086", + "0x46c38086", + "0x46d08086", + "0x46d18086", + "0x46d28086", + "0x46d38086", + "0x46d48086", + "0x9a408086", + "0x9a498086", + "0x9a608086", + "0x9a688086", + "0x9a708086", + "0x9a788086", + "0xa7808086", + "0xa7818086", + "0xa7828086", + "0xa7838086", + "0xa7888086", + "0xa7898086", + "0xa78a8086", + "0xa78b8086", + "0xa7a08086", + "0xa7a18086", + "0xa7a88086", + "0xa7a98086", + "0xa7aa8086", + "0xa7ab8086", + "0xa7ac8086", + "0xa7ad8086" + ], + "components": [ + "Big Sur", + "Monterey", + "Sequoia", + "Sonoma", + "Tahoe", + "Ventura" + ] + }, + { + "identifier": "com.apple.driver.AppleIntelTGLGraphicsFramebuffer", + "requires_provider": "0.5.0", + "matches": [ + "0x46808086", + "0x46828086", + "0x46888086", + "0x468a8086", + "0x468b8086", + "0x46908086", + "0x46928086", + "0x46938086", + "0x46a38086", + "0x46a68086", + "0x46a88086", + "0x46aa8086", + "0x46b38086", + "0x46c38086", + "0x46d08086", + "0x46d18086", + "0x46d28086", + "0x46d38086", + "0x46d48086", + "0x9a408086", + "0x9a498086", + "0x9a608086", + "0x9a688086", + "0x9a708086", + "0x9a788086", + "0xa7808086", + "0xa7818086", + "0xa7828086", + "0xa7838086", + "0xa7888086", + "0xa7898086", + "0xa78a8086", + "0xa78b8086", + "0xa7a08086", + "0xa7a18086", + "0xa7a88086", + "0xa7a98086", + "0xa7aa8086", + "0xa7ab8086", + "0xa7ac8086", + "0xa7ad8086" + ], + "components": [ + "Big Sur", + "Monterey", + "Sequoia", + "Sonoma", + "Tahoe", + "Ventura" + ] + } + ] + }, + { + "tag": "v0.4.0", + "commit": "656eff430df8ff8e55131656324678cd5480347a", + "contracts": [ + { + "identifier": "com.apple.driver.AppleIntelTGLGraphics", + "requires_provider": null, + "matches": [ + "0x46268086", + "0x46288086", + "0x462a8086", + "0x46808086", + "0x46828086", + "0x46888086", + "0x468a8086", + "0x468b8086", + "0x46908086", + "0x46928086", + "0x46938086", + "0x46a08086", + "0x46a18086", + "0x46a28086", + "0x46a38086", + "0x46a68086", + "0x46a88086", + "0x46aa8086", + "0x46b08086", + "0x46b18086", + "0x46b28086", + "0x46b38086", + "0x46c08086", + "0x46c18086", + "0x46c28086", + "0x46c38086", + "0x46d08086", + "0x46d18086", + "0x46d28086", + "0x46d38086", + "0x46d48086", + "0x9a408086", + "0x9a498086", + "0x9a598086", + "0x9a608086", + "0x9a688086", + "0x9a708086", + "0x9a788086", + "0x9ac08086", + "0x9ac98086", + "0x9ad98086", + "0x9af88086", + "0xa7208086", + "0xa7218086", + "0xa7808086", + "0xa7818086", + "0xa7828086", + "0xa7838086", + "0xa7888086", + "0xa7898086", + "0xa78a8086", + "0xa78b8086", + "0xa7a08086", + "0xa7a18086", + "0xa7a88086", + "0xa7a98086", + "0xa7aa8086", + "0xa7ab8086", + "0xa7ac8086", + "0xa7ad8086" + ], + "components": [ + "Big Sur", + "Monterey", + "Sequoia", + "Sonoma", + "Tahoe", + "Ventura" + ] + }, + { + "identifier": "com.apple.driver.AppleIntelTGLGraphicsFramebuffer", + "requires_provider": "0.5.0", + "matches": [ + "0x46268086", + "0x46288086", + "0x462a8086", + "0x46808086", + "0x46828086", + "0x46888086", + "0x468a8086", + "0x468b8086", + "0x46908086", + "0x46928086", + "0x46938086", + "0x46a08086", + "0x46a18086", + "0x46a28086", + "0x46a38086", + "0x46a68086", + "0x46a88086", + "0x46aa8086", + "0x46b08086", + "0x46b18086", + "0x46b28086", + "0x46b38086", + "0x46c08086", + "0x46c18086", + "0x46c28086", + "0x46c38086", + "0x46d08086", + "0x46d18086", + "0x46d28086", + "0x46d38086", + "0x46d48086", + "0x9a408086", + "0x9a498086", + "0x9a598086", + "0x9a608086", + "0x9a688086", + "0x9a708086", + "0x9a788086", + "0x9ac08086", + "0x9ac98086", + "0x9ad98086", + "0x9af88086", + "0xa7208086", + "0xa7218086", + "0xa7808086", + "0xa7818086", + "0xa7828086", + "0xa7838086", + "0xa7888086", + "0xa7898086", + "0xa78a8086", + "0xa78b8086", + "0xa7a08086", + "0xa7a18086", + "0xa7a88086", + "0xa7a98086", + "0xa7aa8086", + "0xa7ab8086", + "0xa7ac8086", + "0xa7ad8086" + ], + "components": [ + "Big Sur", + "Monterey", + "Sequoia", + "Sonoma", + "Tahoe", + "Ventura" + ] + } + ] + } + ] +} diff --git a/tools/fixtures/released_dispatch.json b/tools/fixtures/released_dispatch.json new file mode 100644 index 0000000..8e3c74a --- /dev/null +++ b/tools/fixtures/released_dispatch.json @@ -0,0 +1,1403 @@ +{ + "schema": 1, + "releases": { + "v0.1.0": "444b348e7ee757ded480ff46d781d5efb0f5fb38", + "v0.2.0": "e83018e76c0f39f0f870ff38dcc304fb357c3485", + "v0.3.0": "7aa1a8340c862f764d42a5d7f5d08e9a66b6eab4", + "v0.3.1": "59e4ca9e474781dba80a5b5f60fba1767d0a9c2a", + "v0.3.2": "b4d3889206a609e29e991a833d8d91c2d110a661", + "v0.4.0": "656eff430df8ff8e55131656324678cd5480347a" + }, + "admission_sets": [ + [ + "46d0", + "46d1", + "46d2", + "46d3", + "46d4", + "9a40", + "9a49", + "9a78" + ], + [ + "46d0", + "46d1", + "46d2", + "46d3", + "46d4", + "9a49", + "9a78" + ], + [ + "4680", + "4682", + "4688", + "468a", + "468b", + "4690", + "4692", + "4693", + "46d0", + "46d1", + "46d2", + "46d3", + "46d4", + "9a40", + "9a49", + "9a60", + "9a68", + "9a70", + "9a78", + "a780", + "a781", + "a782", + "a783", + "a788", + "a789", + "a78a", + "a78b" + ], + [ + "4680", + "4682", + "4688", + "468a", + "468b", + "4690", + "4692", + "4693", + "46d0", + "46d1", + "46d2", + "46d3", + "46d4", + "9a49", + "9a60", + "9a68", + "9a70", + "9a78", + "a780", + "a781", + "a782", + "a783", + "a788", + "a789", + "a78a", + "a78b" + ], + [ + "4680", + "4682", + "4688", + "468a", + "468b", + "4690", + "4692", + "4693", + "46a3", + "46a6", + "46a8", + "46aa", + "46b3", + "46c3", + "46d0", + "46d1", + "46d2", + "46d3", + "46d4", + "9a40", + "9a49", + "9a60", + "9a68", + "9a70", + "9a78", + "a780", + "a781", + "a782", + "a783", + "a788", + "a789", + "a78a", + "a78b", + "a7a0", + "a7a1", + "a7a8", + "a7a9", + "a7aa", + "a7ab", + "a7ac", + "a7ad" + ], + [ + "4680", + "4682", + "4688", + "468a", + "468b", + "4690", + "4692", + "4693", + "46a3", + "46a6", + "46a8", + "46aa", + "46b3", + "46c3", + "46d0", + "46d1", + "46d2", + "46d3", + "46d4", + "9a49", + "9a60", + "9a68", + "9a70", + "9a78", + "a780", + "a781", + "a782", + "a783", + "a788", + "a789", + "a78a", + "a78b", + "a7a0", + "a7a1", + "a7a8", + "a7a9", + "a7aa", + "a7ab", + "a7ac", + "a7ad" + ], + [ + "4626", + "4628", + "462a", + "4680", + "4682", + "4688", + "468a", + "468b", + "4690", + "4692", + "4693", + "46a0", + "46a1", + "46a2", + "46a3", + "46a6", + "46a8", + "46aa", + "46b0", + "46b1", + "46b2", + "46b3", + "46c0", + "46c1", + "46c2", + "46c3", + "46d0", + "46d1", + "46d2", + "46d3", + "46d4", + "9a40", + "9a49", + "9a59", + "9a60", + "9a68", + "9a70", + "9a78", + "9ac0", + "9ac9", + "9ad9", + "9af8", + "a720", + "a721", + "a780", + "a781", + "a782", + "a783", + "a788", + "a789", + "a78a", + "a78b", + "a7a0", + "a7a1", + "a7a8", + "a7a9", + "a7aa", + "a7ab", + "a7ac", + "a7ad" + ], + [ + "4626", + "4628", + "462a", + "4680", + "4682", + "4688", + "468a", + "468b", + "4690", + "4692", + "4693", + "46a0", + "46a1", + "46a2", + "46a3", + "46a6", + "46a8", + "46aa", + "46b0", + "46b1", + "46b2", + "46b3", + "46c0", + "46c1", + "46c2", + "46c3", + "46d0", + "46d1", + "46d2", + "46d3", + "46d4", + "9a49", + "9a59", + "9a60", + "9a68", + "9a70", + "9a78", + "9ac0", + "9ac9", + "9ad9", + "9af8", + "a720", + "a721", + "a780", + "a781", + "a782", + "a783", + "a788", + "a789", + "a78a", + "a78b", + "a7a0", + "a7a1", + "a7a8", + "a7a9", + "a7aa", + "a7ab", + "a7ac", + "a7ad" + ] + ], + "urb_inputs": [ + [ + "0803078078300000", + "8000000078310000", + "8000000078320000", + "8000000078330000" + ], + [ + "0803038078300000", + "4000000078310000", + "4000000078320000", + "4000000078330000" + ], + [ + "0803058078300000", + "6000000078310000", + "6000000078320000", + "6000000078330000" + ], + [ + "0800088078300000", + "2a00000078310000", + "2a00000078320000", + "2a03036078330000" + ] + ], + "contracts": [ + { + "kind": "GL", + "system": "Common", + "offsets": [ + 1650591, + 1651727, + 1650597 + ], + "urb": { + "0": [ + "0803052078300000", + "8000000078310000", + "8000000078320000", + "8000000078330000" + ], + "1": [ + "0803020078300000", + "4000000078310000", + "4000000078320000", + "4000000078330000" + ], + "2": [ + "0803058078300000", + "6000000078310000", + "6000000078320000", + "6000000078330000" + ], + "3": [ + "0800088078300000", + "2a00000078310000", + "2a00000078320000", + "2a03036078330000" + ] + }, + "sources": [ + { + "tag": "v0.1.0", + "sha256": "a27707cdfe5c5cadb623d2ea14b51e3a0bc714cde9e3b03ce9f792ff0e8d17da" + } + ], + "admission_set": 0 + }, + { + "kind": "VA", + "system": "Big Sur", + "offsets": [ + 77974, + 78017, + 77980 + ], + "sources": [ + { + "tag": "v0.1.0", + "sha256": "1fda0b4049178b5c91c2db1fd2acd4c9b06bb49c37e72583c263252c43ce3ab5" + } + ], + "admission_set": 1 + }, + { + "kind": "VA", + "system": "Monterey", + "offsets": [ + 77974, + 78017, + 77980 + ], + "sources": [ + { + "tag": "v0.1.0", + "sha256": "643517de95079559837068f0692ffad89bdc9d3ba242906061f8e9c36ea4d4fe" + } + ], + "admission_set": 1 + }, + { + "kind": "VA", + "system": "Ventura", + "offsets": [ + 77974, + 78017, + 77980 + ], + "sources": [ + { + "tag": "v0.1.0", + "sha256": "42849edc360ce8785fcb7c88bbfae6d5bfac3e7941777c1a56fbc736201fe6dc" + } + ], + "admission_set": 1 + }, + { + "kind": "VA", + "system": "Sonoma", + "offsets": [ + 77974, + 78017, + 77980 + ], + "sources": [ + { + "tag": "v0.1.0", + "sha256": "c4b49bb994bf77d695696515e5df0fef1b71b9a423978b90c4b9e96972c13337" + } + ], + "admission_set": 1 + }, + { + "kind": "VA", + "system": "Sequoia", + "offsets": [ + 77974, + 78017, + 77980 + ], + "sources": [ + { + "tag": "v0.1.0", + "sha256": "6a3825a41dc29f041ef92b6abcf0838768832f8c3a88c6e9c9adbe9857403d4a" + } + ], + "admission_set": 1 + }, + { + "kind": "VA", + "system": "Tahoe", + "offsets": [ + 77974, + 78017, + 77980 + ], + "sources": [ + { + "tag": "v0.1.0", + "sha256": "9ced9e7ccb262c7dc2fe445029919a955c414c20f585ff326fa2d7a029d4f0ff" + } + ], + "admission_set": 1 + }, + { + "kind": "CL", + "system": "Big Sur", + "offsets": [ + 34975, + 34662, + 34982 + ], + "sources": [ + { + "tag": "v0.1.0", + "sha256": "a86e6daed21d42f6a5f3c80f2f198634b9c9f95132003b9d51a8750998b8f2fc" + } + ], + "admission_set": 0 + }, + { + "kind": "CL", + "system": "Monterey", + "offsets": [ + 38248, + 36872, + 38255 + ], + "sources": [ + { + "tag": "v0.1.0", + "sha256": "fb949904f6fb0b59731fddc76bdfb56e50c9905e74886d9bcc914644d09d504e" + } + ], + "admission_set": 0 + }, + { + "kind": "CL", + "system": "Ventura", + "offsets": [ + 38669, + 37759, + 38676 + ], + "sources": [ + { + "tag": "v0.1.0", + "sha256": "328334cd4c7e4becbef7cb5b1d4767bdee00716304f1c6173ee26d2453461fc0" + } + ], + "admission_set": 0 + }, + { + "kind": "CL", + "system": "Sonoma", + "offsets": [ + 26795, + 25878, + 26802 + ], + "sources": [ + { + "tag": "v0.1.0", + "sha256": "67e7c533c44d84a7ddfc4ca08102c196739895e8c9ffafddc17c5c427ae10df5" + } + ], + "admission_set": 0 + }, + { + "kind": "CL", + "system": "Sequoia", + "offsets": [ + 25876, + 25029, + 25883 + ], + "sources": [ + { + "tag": "v0.1.0", + "sha256": "25499f21ab681a54064c699de16eaa5f6dd78b26c6cbf866a67484d0ac8a0600" + } + ], + "admission_set": 0 + }, + { + "kind": "CL", + "system": "Tahoe", + "offsets": [ + 25455, + 24593, + 25462 + ], + "sources": [ + { + "tag": "v0.1.0", + "sha256": "33cdf73786922bb6e19ff98d96b9b58f160f72c5f46ab09f50b0474206628d7e" + } + ], + "admission_set": 0 + }, + { + "kind": "GL", + "system": "Common", + "offsets": [ + 1650591, + 1651727, + 1650597 + ], + "urb": { + "0": [ + "0803052078300000", + "8000000078310000", + "8000000078320000", + "8000000078330000" + ], + "1": [ + "0803020078300000", + "4000000078310000", + "4000000078320000", + "4000000078330000" + ], + "2": [ + "0803058078300000", + "6000000078310000", + "6000000078320000", + "6000000078330000" + ], + "3": [ + "0800088078300000", + "2a00000078310000", + "2a00000078320000", + "2a03036078330000" + ] + }, + "sources": [ + { + "tag": "v0.2.0", + "sha256": "f57b9bc678b7e23f9ed6ffeb5bf1547a5d6eee888d581aa7260a27f2fff4ca3b" + } + ], + "admission_set": 2 + }, + { + "kind": "VA", + "system": "Big Sur", + "offsets": [ + 77974, + 78017, + 77980 + ], + "sources": [ + { + "tag": "v0.2.0", + "sha256": "8111b29a894db07ac9de4b4b013b0f73e122c69cc18b394a6b8bc72667251ade" + } + ], + "admission_set": 3 + }, + { + "kind": "VA", + "system": "Monterey", + "offsets": [ + 77974, + 78017, + 77980 + ], + "sources": [ + { + "tag": "v0.2.0", + "sha256": "f7b223cba8857411dc5787d97739a49b348956624f54ef9ad119e9bba9f63965" + } + ], + "admission_set": 3 + }, + { + "kind": "VA", + "system": "Ventura", + "offsets": [ + 77974, + 78017, + 77980 + ], + "sources": [ + { + "tag": "v0.2.0", + "sha256": "301ae82cda5c491422d96721332526deec576efe9fd608aaedf15be6be0f6179" + } + ], + "admission_set": 3 + }, + { + "kind": "VA", + "system": "Sonoma", + "offsets": [ + 77974, + 78017, + 77980 + ], + "sources": [ + { + "tag": "v0.2.0", + "sha256": "e89ca7f9886cb335cdfd2937da2a5b645f928f84752ba65ef280734280456ff9" + } + ], + "admission_set": 3 + }, + { + "kind": "VA", + "system": "Sequoia", + "offsets": [ + 77974, + 78017, + 77980 + ], + "sources": [ + { + "tag": "v0.2.0", + "sha256": "7485af024822fdc3ad47cec7b71a055c1cffe92a7d0c0391f143f51b57ee904f" + } + ], + "admission_set": 3 + }, + { + "kind": "VA", + "system": "Tahoe", + "offsets": [ + 77974, + 78017, + 77980 + ], + "sources": [ + { + "tag": "v0.2.0", + "sha256": "2e27de2f72b0098e08b5e608da3a10810ef8cfd2b8a9d50944286d704d082f19" + } + ], + "admission_set": 3 + }, + { + "kind": "CL", + "system": "Big Sur", + "offsets": [ + 34975, + 34662, + 34982 + ], + "sources": [ + { + "tag": "v0.2.0", + "sha256": "d9fdea8dce50a471f803046f78a0d73b4692aa32ffc2171f6cea549f09efbcaa" + } + ], + "admission_set": 2 + }, + { + "kind": "CL", + "system": "Monterey", + "offsets": [ + 38248, + 36872, + 38255 + ], + "sources": [ + { + "tag": "v0.2.0", + "sha256": "04c39b1662f171ccba815966fb11184af6e2dff0fd38ff71f2eff60276619edd" + } + ], + "admission_set": 2 + }, + { + "kind": "CL", + "system": "Ventura", + "offsets": [ + 38669, + 37759, + 38676 + ], + "sources": [ + { + "tag": "v0.2.0", + "sha256": "4912d9a2347a0ce8f45c0fd25e072c4c5cec6a38df5910b98e832479a2659c58" + } + ], + "admission_set": 2 + }, + { + "kind": "CL", + "system": "Sonoma", + "offsets": [ + 26795, + 25878, + 26802 + ], + "sources": [ + { + "tag": "v0.2.0", + "sha256": "5ce9ecee0ab92997a001aec8db06daecf682838c785425bbdc1cb384ff268fd4" + } + ], + "admission_set": 2 + }, + { + "kind": "CL", + "system": "Sequoia", + "offsets": [ + 25876, + 25029, + 25883 + ], + "sources": [ + { + "tag": "v0.2.0", + "sha256": "abbe3d2d0a601708a98c9dda4431a67403def5436ce831608bdbb151226178de" + } + ], + "admission_set": 2 + }, + { + "kind": "CL", + "system": "Tahoe", + "offsets": [ + 25455, + 24593, + 25462 + ], + "sources": [ + { + "tag": "v0.2.0", + "sha256": "70dbf7fca174d2b68417e0a4c18396408e2348705da8b4f61f4025c2c1e88f87" + } + ], + "admission_set": 2 + }, + { + "kind": "GL", + "system": "Common", + "offsets": [ + 1650591, + 1651727, + 1650597 + ], + "urb": { + "0": [ + "0803052078300000", + "8000000078310000", + "8000000078320000", + "8000000078330000" + ], + "1": [ + "0803020078300000", + "4000000078310000", + "4000000078320000", + "4000000078330000" + ], + "2": [ + "0803058078300000", + "6000000078310000", + "6000000078320000", + "6000000078330000" + ], + "3": [ + "0800088078300000", + "2a00000078310000", + "2a00000078320000", + "2a03036078330000" + ] + }, + "sources": [ + { + "tag": "v0.3.0", + "sha256": "a1d8cc1863a2813ab54f5db84c197a9a1c3bc80796d2402563b6aa3e159da5f6" + }, + { + "tag": "v0.3.1", + "sha256": "a1d8cc1863a2813ab54f5db84c197a9a1c3bc80796d2402563b6aa3e159da5f6" + } + ], + "admission_set": 4 + }, + { + "kind": "VA", + "system": "Big Sur", + "offsets": [ + 77974, + 78017, + 77980 + ], + "sources": [ + { + "tag": "v0.3.0", + "sha256": "9120758fd22a6c009647e919221e2bd1635215ba8eb2c7104dd7af3e79931803" + }, + { + "tag": "v0.3.1", + "sha256": "9120758fd22a6c009647e919221e2bd1635215ba8eb2c7104dd7af3e79931803" + }, + { + "tag": "v0.3.2", + "sha256": "9120758fd22a6c009647e919221e2bd1635215ba8eb2c7104dd7af3e79931803" + } + ], + "admission_set": 5 + }, + { + "kind": "VA", + "system": "Monterey", + "offsets": [ + 77974, + 78017, + 77980 + ], + "sources": [ + { + "tag": "v0.3.0", + "sha256": "5460ca60a59567c1f4e31b7c48f26e9438b9110e82aaec98e5a4d1d90270f4b1" + }, + { + "tag": "v0.3.1", + "sha256": "5460ca60a59567c1f4e31b7c48f26e9438b9110e82aaec98e5a4d1d90270f4b1" + }, + { + "tag": "v0.3.2", + "sha256": "5460ca60a59567c1f4e31b7c48f26e9438b9110e82aaec98e5a4d1d90270f4b1" + } + ], + "admission_set": 5 + }, + { + "kind": "VA", + "system": "Ventura", + "offsets": [ + 77974, + 78017, + 77980 + ], + "sources": [ + { + "tag": "v0.3.0", + "sha256": "08fe84f361c5f5070d5142e1193c940801d7943d1987b56729351f1b69fe83c4" + }, + { + "tag": "v0.3.1", + "sha256": "08fe84f361c5f5070d5142e1193c940801d7943d1987b56729351f1b69fe83c4" + }, + { + "tag": "v0.3.2", + "sha256": "08fe84f361c5f5070d5142e1193c940801d7943d1987b56729351f1b69fe83c4" + } + ], + "admission_set": 5 + }, + { + "kind": "VA", + "system": "Sonoma", + "offsets": [ + 77974, + 78017, + 77980 + ], + "sources": [ + { + "tag": "v0.3.0", + "sha256": "01403035e1c7737b63d059d4367a2d74f37d240a461f28883c6113108cd4338d" + }, + { + "tag": "v0.3.1", + "sha256": "01403035e1c7737b63d059d4367a2d74f37d240a461f28883c6113108cd4338d" + }, + { + "tag": "v0.3.2", + "sha256": "01403035e1c7737b63d059d4367a2d74f37d240a461f28883c6113108cd4338d" + } + ], + "admission_set": 5 + }, + { + "kind": "VA", + "system": "Sequoia", + "offsets": [ + 77974, + 78017, + 77980 + ], + "sources": [ + { + "tag": "v0.3.0", + "sha256": "58edb45d28a133cecc42b5e1ea2e3e25f3501bc89481c256b2edfb7ee463738b" + }, + { + "tag": "v0.3.1", + "sha256": "58edb45d28a133cecc42b5e1ea2e3e25f3501bc89481c256b2edfb7ee463738b" + }, + { + "tag": "v0.3.2", + "sha256": "58edb45d28a133cecc42b5e1ea2e3e25f3501bc89481c256b2edfb7ee463738b" + } + ], + "admission_set": 5 + }, + { + "kind": "VA", + "system": "Tahoe", + "offsets": [ + 77974, + 78017, + 77980 + ], + "sources": [ + { + "tag": "v0.3.0", + "sha256": "b41dfb6f3efeb4279d8b29f66cc5dec240942f10397cd2d06c51f34a37ee48a3" + }, + { + "tag": "v0.3.1", + "sha256": "b41dfb6f3efeb4279d8b29f66cc5dec240942f10397cd2d06c51f34a37ee48a3" + }, + { + "tag": "v0.3.2", + "sha256": "b41dfb6f3efeb4279d8b29f66cc5dec240942f10397cd2d06c51f34a37ee48a3" + } + ], + "admission_set": 5 + }, + { + "kind": "CL", + "system": "Big Sur", + "offsets": [ + 34975, + 34662, + 34982 + ], + "sources": [ + { + "tag": "v0.3.0", + "sha256": "74b07b1b6ceacf75c37857518e7362ec93f266dc1190b7dba424e96d8a6382ef" + }, + { + "tag": "v0.3.1", + "sha256": "74b07b1b6ceacf75c37857518e7362ec93f266dc1190b7dba424e96d8a6382ef" + }, + { + "tag": "v0.3.2", + "sha256": "74b07b1b6ceacf75c37857518e7362ec93f266dc1190b7dba424e96d8a6382ef" + } + ], + "admission_set": 4 + }, + { + "kind": "CL", + "system": "Monterey", + "offsets": [ + 38248, + 36872, + 38255 + ], + "sources": [ + { + "tag": "v0.3.0", + "sha256": "0ce8ae385844304e5dbfbb3edc91eb95b5a026c45290052521099802a71d51fc" + }, + { + "tag": "v0.3.1", + "sha256": "0ce8ae385844304e5dbfbb3edc91eb95b5a026c45290052521099802a71d51fc" + }, + { + "tag": "v0.3.2", + "sha256": "0ce8ae385844304e5dbfbb3edc91eb95b5a026c45290052521099802a71d51fc" + } + ], + "admission_set": 4 + }, + { + "kind": "CL", + "system": "Ventura", + "offsets": [ + 38669, + 37759, + 38676 + ], + "sources": [ + { + "tag": "v0.3.0", + "sha256": "042bef027e5a18ed27b686ad8caa2799b3e269dfda8f24e2106c3749b510067d" + }, + { + "tag": "v0.3.1", + "sha256": "042bef027e5a18ed27b686ad8caa2799b3e269dfda8f24e2106c3749b510067d" + }, + { + "tag": "v0.3.2", + "sha256": "042bef027e5a18ed27b686ad8caa2799b3e269dfda8f24e2106c3749b510067d" + } + ], + "admission_set": 4 + }, + { + "kind": "CL", + "system": "Sonoma", + "offsets": [ + 26795, + 25878, + 26802 + ], + "sources": [ + { + "tag": "v0.3.0", + "sha256": "e3254097ec5341459828a86eaa4b26166fb67b9bd82a9ad4eca45fc1c0397be7" + }, + { + "tag": "v0.3.1", + "sha256": "e3254097ec5341459828a86eaa4b26166fb67b9bd82a9ad4eca45fc1c0397be7" + }, + { + "tag": "v0.3.2", + "sha256": "e3254097ec5341459828a86eaa4b26166fb67b9bd82a9ad4eca45fc1c0397be7" + } + ], + "admission_set": 4 + }, + { + "kind": "CL", + "system": "Sequoia", + "offsets": [ + 25876, + 25029, + 25883 + ], + "sources": [ + { + "tag": "v0.3.0", + "sha256": "5cc9cde75992ce3bc38741f50a64a1483308078713b273d040a74753d680fea8" + }, + { + "tag": "v0.3.1", + "sha256": "5cc9cde75992ce3bc38741f50a64a1483308078713b273d040a74753d680fea8" + }, + { + "tag": "v0.3.2", + "sha256": "5cc9cde75992ce3bc38741f50a64a1483308078713b273d040a74753d680fea8" + } + ], + "admission_set": 4 + }, + { + "kind": "CL", + "system": "Tahoe", + "offsets": [ + 25455, + 24593, + 25462 + ], + "sources": [ + { + "tag": "v0.3.0", + "sha256": "e9ca7997a8c0b505ffe73244347a55d941c4f4c6ac3e00696c157d8794f005ca" + }, + { + "tag": "v0.3.1", + "sha256": "e9ca7997a8c0b505ffe73244347a55d941c4f4c6ac3e00696c157d8794f005ca" + }, + { + "tag": "v0.3.2", + "sha256": "e9ca7997a8c0b505ffe73244347a55d941c4f4c6ac3e00696c157d8794f005ca" + } + ], + "admission_set": 4 + }, + { + "kind": "GL", + "system": "Common", + "offsets": [ + 1650591, + 1651727, + 1650597 + ], + "urb": { + "0": [ + "0803052078300000", + "8000000078310000", + "8000000078320000", + "8000000078330000" + ], + "1": [ + "0803020078300000", + "4000000078310000", + "4000000078320000", + "4000000078330000" + ], + "2": [ + "0803052078300000", + "6000000078310000", + "6000000078320000", + "6000000078330000" + ], + "3": [ + "0800088078300000", + "2a00000078310000", + "2a00000078320000", + "2a03030078330000" + ] + }, + "sources": [ + { + "tag": "v0.3.2", + "sha256": "404b85e5b547fd9486bf8f10e8f55244708bff06d21d0a3091a0e159c74e63bb" + } + ], + "admission_set": 4 + }, + { + "kind": "GL", + "system": "Common", + "offsets": [ + 1650591, + 1651727, + 1650597 + ], + "urb": { + "0": [ + "0803052078300000", + "8000000078310000", + "8000000078320000", + "8000000078330000" + ], + "1": [ + "0803020078300000", + "4000000078310000", + "4000000078320000", + "4000000078330000" + ], + "2": [ + "0803052078300000", + "6000000078310000", + "6000000078320000", + "6000000078330000" + ], + "3": [ + "0800088078300000", + "2a00000078310000", + "2a00000078320000", + "2a03030078330000" + ] + }, + "sources": [ + { + "tag": "v0.4.0", + "sha256": "b0791039b77df44784b63ba36d37c266055092acbcc3b0c29ad1f9a5e8fb6008" + } + ], + "admission_set": 6 + }, + { + "kind": "VA", + "system": "Big Sur", + "offsets": [ + 77974, + 78017, + 77980 + ], + "sources": [ + { + "tag": "v0.4.0", + "sha256": "5cbddcb193e9780fc3d482023ca0c3cbf5d80fc4c03e8146e13f15560cbdbc0e" + } + ], + "admission_set": 7 + }, + { + "kind": "VA", + "system": "Monterey", + "offsets": [ + 77974, + 78017, + 77980 + ], + "sources": [ + { + "tag": "v0.4.0", + "sha256": "447574f51c0e2c2ffc1022b556effac81bb2325b5c5d6b2b53c483d5c790a049" + } + ], + "admission_set": 7 + }, + { + "kind": "VA", + "system": "Ventura", + "offsets": [ + 77974, + 78017, + 77980 + ], + "sources": [ + { + "tag": "v0.4.0", + "sha256": "e69a79553a3f91e51359ff0e0f7850c91959c90461c158ea4c73e8207909717a" + } + ], + "admission_set": 7 + }, + { + "kind": "VA", + "system": "Sonoma", + "offsets": [ + 77974, + 78017, + 77980 + ], + "sources": [ + { + "tag": "v0.4.0", + "sha256": "cff913f6bc113217ebeccba602ba4a54d8434919a6490aa24986c23afc9592c2" + } + ], + "admission_set": 7 + }, + { + "kind": "VA", + "system": "Sequoia", + "offsets": [ + 77974, + 78017, + 77980 + ], + "sources": [ + { + "tag": "v0.4.0", + "sha256": "1c860fc8aee1ad690f7bf7551132bae631f5bd563ccd8204acbdb2a949ac5dc9" + } + ], + "admission_set": 7 + }, + { + "kind": "VA", + "system": "Tahoe", + "offsets": [ + 77974, + 78017, + 77980 + ], + "sources": [ + { + "tag": "v0.4.0", + "sha256": "a972cdb7ddd56bcf38c3ab71e874b73efc34bc683d30e49f0a1a1919625a726d" + } + ], + "admission_set": 7 + }, + { + "kind": "CL", + "system": "Big Sur", + "offsets": [ + 34975, + 34662, + 34982 + ], + "sources": [ + { + "tag": "v0.4.0", + "sha256": "6a4b9aaa34742ac8033b4ecce305825de01647e928464a3501c0b54455371347" + } + ], + "admission_set": 6 + }, + { + "kind": "CL", + "system": "Monterey", + "offsets": [ + 38248, + 36872, + 38255 + ], + "sources": [ + { + "tag": "v0.4.0", + "sha256": "2f39439620f8ef81fd5dda7277e669f72b8597bc3ad41004fbea6a569ae92d7d" + } + ], + "admission_set": 6 + }, + { + "kind": "CL", + "system": "Ventura", + "offsets": [ + 38669, + 37759, + 38676 + ], + "sources": [ + { + "tag": "v0.4.0", + "sha256": "912322c44c269db8a93db7a194e97215550b210f3a389f43a83765db66d72a48" + } + ], + "admission_set": 6 + }, + { + "kind": "CL", + "system": "Sonoma", + "offsets": [ + 26795, + 25878, + 26802 + ], + "sources": [ + { + "tag": "v0.4.0", + "sha256": "8d06b528b454b6cb90295541650a7b3cd6be28a3ee54b2526588773b3df6fdcc" + } + ], + "admission_set": 6 + }, + { + "kind": "CL", + "system": "Sequoia", + "offsets": [ + 25876, + 25029, + 25883 + ], + "sources": [ + { + "tag": "v0.4.0", + "sha256": "02da3606ae5419abe474eee1a348c1f19e6baa568d3851342554ca18367e4ae0" + } + ], + "admission_set": 6 + }, + { + "kind": "CL", + "system": "Tahoe", + "offsets": [ + 25455, + 24593, + 25462 + ], + "sources": [ + { + "tag": "v0.4.0", + "sha256": "88cdf5bbc18137dc2f03e414aa3ca3a6d3e91e0cacdc162582d04de91808f9eb" + } + ], + "admission_set": 6 + } + ] +} diff --git a/tools/kext_dependencies.py b/tools/kext_dependencies.py index 7aaf7bd..6694c3f 100644 --- a/tools/kext_dependencies.py +++ b/tools/kext_dependencies.py @@ -52,8 +52,10 @@ def check_dependencies(plists, label, device_ids=None): def check_payload_sets(payloads, systems, device_ids=None): + from released_contracts import check_released_clients common = list((payloads / 'Common/Library/Extensions').rglob('*.kext/Contents/Info.plist')) for system in systems: clients = list((payloads / system['payload'] / 'Library/Extensions').rglob('*.kext/Contents/Info.plist')) if not check_dependencies(common + clients, system['name'], device_ids): raise ValueError(f"{system['name']}: no bundled kext dependencies checked") + check_released_clients(common + clients, system['payload']) diff --git a/tools/native_dispatch.cpp b/tools/native_dispatch.cpp new file mode 100644 index 0000000..f8eb622 --- /dev/null +++ b/tools/native_dispatch.cpp @@ -0,0 +1,92 @@ +// Execute private copies of released dispatch/URB code, never load the driver. +// Only native continuation blocks become markers. Enter through the real site. +#include +#include +#include +#include +#include +#include +#include +#include +#include + +extern "C" unsigned runGL(void *, unsigned), runVA(void *, void *), runCL(void *, unsigned); +extern "C" uint64_t runURB(void *, void *, unsigned); +asm(".text\n" + ".globl _runGL\n_runGL:\nmov %rdi,%rax\nmov %esi,%edx\ncall *%rax\nret\n" + ".globl _runVA\n_runVA:\npush %rbx\nmov %rsi,%rbx\ncall *%rdi\npop %rbx\nret\n" + ".globl _runCL\n_runCL:\npush %rbp\nmov %rsp,%rbp\n" + "push %rbx\npush %r12\npush %r13\npush %r14\nsub $0x200,%rsp\n" + "mov %rdi,%r11\nmov %esi,%eax\nmov %esi,-0x1e8(%rbp)\n" + "lea -0x1f0(%rbp),%r13\nmov %r13,%r14\ncall *%r11\n" + "add $0x200,%rsp\npop %r14\npop %r13\npop %r12\npop %rbx\npop %rbp\nret\n" + ".globl _runURB\n_runURB:\npush %rbx\npush %r15\nmov %edx,%ebx\n" + "lea -0x3978(%rsi),%r15\nmovabs $0x123456789abcdef0,%rdx\ncall *%rdi\n" + "mov %rdx,%rax\npop %r15\npop %rbx\nret\n"); + +static uint8_t *load(const char *path, size_t &size) { + std::ifstream f(path, std::ios::binary); + std::vector data((std::istreambuf_iterator(f)), {}); + assert(data.size() >= 32); + uint32_t magic, cpu; + memcpy(&magic, data.data(), 4); memcpy(&cpu, data.data()+4, 4); + assert(magic == 0xfeedfacf && cpu == 0x1000007); + size = data.size(); + auto p = static_cast(mmap(nullptr, size, 7, MAP_PRIVATE|MAP_ANON, -1, 0)); + assert(p != MAP_FAILED); memcpy(p, data.data(), size); return p; +} + +static void marker(uint8_t *p, size_t size, unsigned offset, unsigned value) { + assert(offset + 6 <= size); + const uint8_t code[] = {0xb8, uint8_t(value), 0, 0, 0, 0xc3}; + memcpy(p+offset, code, sizeof(code)); +} + +static unsigned number(const char *s) { + char *end; auto n = strtoul(s, &end, 0); assert(*s && !*end && n <= UINT32_MAX); + return unsigned(n); +} + +int main(int argc, char **argv) { + assert(argc == 7); + size_t size; auto p = load(argv[2], size); + if (!strcmp(argv[1], "urb")) { + assert(size > 0xa0c2); + p[0xa0c2] = 0xc3; + uint64_t words[4]; + for (unsigned i=0; i<4; ++i) { + char *end; words[i]=strtoull(argv[3+i], &end, 16); assert(*argv[3+i] && !*end); + } + for (unsigned bank=0; bank<3; ++bank) { + std::vector state(4*0xa70+64, 0xa5); + for (unsigned j=0; j<4; ++j) memcpy(state.data()+j*0xa70+bank*8, words+j, 8); + auto untouched = state; + assert(runURB(p+0xa0b8, state.data(), bank) == 0x123456789abcdef0ULL); + printf("%u", bank); + for (unsigned j=0; j<4; ++j) { + uint64_t word; memcpy(&word, state.data()+j*0xa70+bank*8, 8); + printf(" %016llx", (unsigned long long)word); + memcpy(untouched.data()+j*0xa70+bank*8, &word, 8); + } + puts(""); assert(state == untouched); // Every other byte must survive. + } + } else { + assert(argc == 7); + unsigned entry=number(argv[3]), yes=number(argv[4]), no=number(argv[5]); + unsigned vendor=number(argv[6]); assert(entry object(0xa880); bool first=true; + for (unsigned device=0; device<65536; ++device) { + const unsigned identity=(device<<16)|vendor; + memcpy(object.data()+0xa878, &identity, 4); + unsigned result; + if (!strcmp(argv[1], "GL")) result=runGL(p+entry, device); + else if (!strcmp(argv[1], "VA")) result=runVA(p+entry, object.data()); + else { assert(!strcmp(argv[1], "CL")); result=runCL(p+entry, identity); } + assert(result<=1); + if (result) { printf("%s%04x", first?"":" ", device); first=false; } + } + puts(""); + } + assert(munmap(p,size)==0); +} diff --git a/tools/policy.json b/tools/policy.json index dd68fd8..7660cbf 100644 --- a/tools/policy.json +++ b/tools/policy.json @@ -1,5 +1,5 @@ { - "package_version": "0.4.0", + "package_version": "0.4.1", "systems": [ { "name": "Big Sur", diff --git a/tools/released_contracts.py b/tools/released_contracts.py new file mode 100644 index 0000000..6f08882 --- /dev/null +++ b/tools/released_contracts.py @@ -0,0 +1,71 @@ +"""Retain released client dependency and physical-match contracts. + +The fixture is exported from each release's immutable Git tree. It is not +derived from the current package policy. This checks loading/matching metadata, +not native graphics execution or every mixed-version runtime combination. +""" +import argparse, json, plistlib, subprocess +from functools import lru_cache +from pathlib import Path +from kext_dependencies import version + +ROOT=Path(__file__).resolve().parents[1] +FIXTURE=ROOT/'tools/fixtures/released_clients.json' +PROVIDER='org.b00t0x.AppleIntelTGLCompat' + +def matches(info): + return {value.lower() for p in info.get('IOKitPersonalities',{}).values() + for value in p.get('IOPCIPrimaryMatch','').split()} + +@lru_cache(maxsize=1) +def released(): + data=json.loads(FIXTURE.read_text()) + if data.get('schema')!=1 or not data.get('releases'): + raise ValueError('missing released client contract corpus') + return data['releases'] + +def check_released_clients(plists, component): + current={p['CFBundleIdentifier']:p for path in plists for p in [plistlib.loads(path.read_bytes())]} + provider=current.get(PROVIDER) + if provider is None:raise ValueError(component+': missing released client provider') + for release in released(): + for contract in release['contracts']: + if component not in contract['components']:continue + client=current.get(contract['identifier']) + label=component+' / '+release['tag']+' / '+contract['identifier'] + if client is None:raise ValueError(label+': released client missing') + lost=set(contract['matches'])-matches(client) + if lost:raise ValueError(label+': lost released physical matches '+','.join(sorted(lost))) + requested=contract['requires_provider'] + if requested and not version(provider['OSBundleCompatibleVersion'])<=version(requested)<=version(provider['CFBundleVersion']): + raise ValueError(label+': released provider requirement outside current compatibility interval') + +def export(): + def git(*args):return subprocess.check_output(['git','-C',str(ROOT),*args]) + releases=[] + for tag in git('tag','--sort=version:refname').decode().splitlines(): + commit=git('rev-parse',tag+'^{commit}').decode().strip();groups={} + for name in git('ls-tree','-r','--name-only',commit,'payloads').decode().splitlines(): + if not name.endswith('.kext/Contents/Info.plist'):continue + info=plistlib.loads(git('show',commit+':'+name)) + physical=tuple(sorted(matches(info))) + if not physical:continue + key=(info['CFBundleIdentifier'],info.get('OSBundleLibraries',{}).get(PROVIDER),physical) + groups.setdefault(key,[]).append(name.split('/')[1]) + releases.append({'tag':tag,'commit':commit,'contracts':[ + {'identifier':identifier,'requires_provider':requirement,'matches':list(physical),'components':components} + for (identifier,requirement,physical),components in groups.items()]}) + if not releases:raise ValueError('local release history is required to export the corpus') + FIXTURE.parent.mkdir(exist_ok=True) + FIXTURE.write_text(json.dumps({'schema':1,'releases':releases},indent=2)+'\n') + +if __name__=='__main__': + p=argparse.ArgumentParser(description=__doc__);p.add_argument('--export',action='store_true');args=p.parse_args() + if args.export:export() + else: + policy=json.loads((ROOT/'tools/policy.json').read_text()) + common=list((ROOT/'payloads/Common').rglob('*.kext/Contents/Info.plist')) + for system in policy['systems']: + name=system['payload'] + check_released_clients(common+list((ROOT/'payloads'/name).rglob('*.kext/Contents/Info.plist')),name) + print('PASS released client requirements and physical matches') diff --git a/tools/test.py b/tools/test.py index 8ce8f51..928cb04 100644 --- a/tools/test.py +++ b/tools/test.py @@ -9,11 +9,14 @@ import xml.etree.ElementTree as ET from pathlib import Path from kext_dependencies import check_dependencies +from released_contracts import check_released_clients from servicing_policy import check_files, test_rejection parser = argparse.ArgumentParser(description=__doc__) parser.add_argument('package', type=Path) parser.add_argument('--rcodesign', default='rcodesign') +parser.add_argument('--native-history', action='store_true', + help='execute historical x86_64 dispatch/URB regressions; requires clang and native x86_64 or Rosetta') args = parser.parse_args() test_rejection() subprocess.run([sys.executable, str(Path(__file__).with_name('test_uninstall.py'))], check=True) @@ -46,6 +49,9 @@ assert args.package.name == 'AutoPkg-Assets.pkg' from test_autopkg import check_autopkg check_autopkg(root, manifest, cases) + if args.native_history: + from test_released_dispatch import check_payloads + check_payloads(root / 'AutoGraphics.pkg/Scripts/Assets') action = subprocess.check_output(['installer', '-query', 'RestartAction', '-pkg', str(args.package.resolve()), '-target', '/'], text=True) assert 'RequireRestart' in action, action print('PASS: universal AutoPkg resources, OS selection, script execution and native restart') @@ -113,11 +119,15 @@ assert actual.keys() == expected.keys() plists = [p for rel, p in actual.items() if rel.startswith('Library/Extensions/') and rel.endswith('.kext/Contents/Info.plist')] assert check_dependencies(plists, build, manifest['policy']['device_ids']) > 0 + check_released_clients(plists, build) for rel, p in actual.items(): data = p.read_bytes() assert hashlib.sha256(data).hexdigest() == expected[rel]['sha256'], rel assert len(data) == expected[rel]['size'] assert p.stat().st_mode & 0o777 == expected[rel]['mode'], rel total += len(actual) + if args.native_history: + from test_released_dispatch import check_payloads + check_payloads(root, package_layout=True) subprocess.run(['bash', '-n', str(Path(__file__).resolve().parents[1] / 'uninstall.sh')], check=True) print(f'PASS: {len(cases)} version boundaries, {len(payload_choices)} standard payloads/BOMs, {total} reconstructed files, script syntax; autopkg={autopkg}') diff --git a/tools/test_autopkg.py b/tools/test_autopkg.py index 8a1926b..2cd7b47 100644 --- a/tools/test_autopkg.py +++ b/tools/test_autopkg.py @@ -10,6 +10,7 @@ import tempfile import xml.etree.ElementTree as ET from kext_dependencies import check_dependencies +from released_contracts import check_released_clients from servicing_policy import check_files as check_servicing_files @@ -57,6 +58,7 @@ def check_autopkg(expanded, manifest, boundaries): check_files(actual, manifest['systems'][name]) plists = [p for r, p in actual.items() if r.startswith('Library/Extensions/') and r.endswith('.kext/Contents/Info.plist')] assert check_dependencies(plists, name, policy['device_ids']) > 0 + check_released_clients(plists, name) cases = [(v, name, 'success' if name else 'unsupported') for v, name in boundaries.items()] cases += [('15.8.1', 'Sequoia', failure) for failure in ( diff --git a/tools/test_dependencies.py b/tools/test_dependencies.py index a124218..30175ea 100644 --- a/tools/test_dependencies.py +++ b/tools/test_dependencies.py @@ -9,6 +9,7 @@ from pathlib import Path import build from kext_dependencies import check_dependencies, check_payload_sets +from released_contracts import check_released_clients class DependencyTests(unittest.TestCase): @@ -77,6 +78,43 @@ def test_unknown_or_masked_identity(self): self.check('0x46008086&0xff00ffff') +class ReleasedContractTests(unittest.TestCase): + def check_mutation(self, remove_device=False, raise_floor=False): + # Change current policy and clients together. A self-consistency test + # accepts that pair; frozen released contracts must detect the loss. + devices = json.loads((build.HERE / 'policy.json').read_text())['device_ids'] + if remove_device: + devices = [d for d in devices if d.lower() != '9a49'] + floor = '0.6.0' if raise_floor else '0.5.0' + with tempfile.TemporaryDirectory() as tmp: + root = Path(tmp) + infos = [{'CFBundleIdentifier': 'org.b00t0x.AppleIntelTGLCompat', + 'CFBundleVersion': '0.8.0', 'OSBundleCompatibleVersion': floor}] + for name in ['AppleIntelTGLGraphics', 'AppleIntelTGLGraphicsFramebuffer']: + infos.append({'CFBundleIdentifier': 'com.apple.driver.' + name, + 'IOKitPersonalities': {'GPU': {'IOPCIPrimaryMatch': ' '.join('0x' + d + '8086' for d in devices)}}, + 'OSBundleLibraries': {'org.b00t0x.AppleIntelTGLCompat': floor}}) + paths = [] + for i, info in enumerate(infos): + path = root / f'{i}.plist' + path.write_bytes(plistlib.dumps(info)); paths.append(path) + self.assertGreater(check_dependencies(paths, 'Big Sur', devices), 0) + if remove_device or raise_floor: + with self.assertRaisesRegex(ValueError, 'lost released physical matches|released provider requirement'): + check_released_clients(paths, 'Big Sur') + else: + check_released_clients(paths, 'Big Sur') + + def test_preserved_contracts(self): + self.check_mutation() + + def test_coordinated_device_removal_is_detected(self): + self.check_mutation(remove_device=True) + + def test_coordinated_abi_floor_raise_is_detected(self): + self.check_mutation(raise_floor=True) + + class BuildPreflightTests(unittest.TestCase): def setUp(self): temporary = tempfile.TemporaryDirectory() diff --git a/tools/test_released_dispatch.py b/tools/test_released_dispatch.py new file mode 100644 index 0000000..7627bcc --- /dev/null +++ b/tools/test_released_dispatch.py @@ -0,0 +1,145 @@ +#!/usr/bin/env python3 +"""Preserve released native PCI routes and GL URB corrections, without a GPU. + +The frozen corpus comes from each immutable release binary, independently of +current device tables and patch emitters. Native continuation blocks are markers; +this does not exercise shader compilation, codecs, a GPU or physical output. +Requires macOS, clang and x86_64 execution (native or Rosetta). +""" +import argparse +import hashlib +import json +import subprocess +import tempfile +from pathlib import Path + +ROOT = Path(__file__).resolve().parents[1] +FIXTURE = ROOT / 'tools/fixtures/released_dispatch.json' +SYSTEMS = ('Big Sur', 'Monterey', 'Ventura', 'Sonoma', 'Sequoia', 'Tahoe') +# Entry and continuation offsets describe the fixed bundled donors, not host OS. +CL = {'Big Sur': (0x889f,0x8766,0x88a6), 'Monterey': (0x9568,0x9008,0x956f), + 'Ventura': (0x970d,0x937f,0x9714), 'Sonoma': (0x68ab,0x6516,0x68b2), + 'Sequoia': (0x6514,0x61c5,0x651b), 'Tahoe': (0x636f,0x6011,0x6376)} +ROUTES = [('GL', 'Common', (0x192f9f,0x19340f,0x192fa5))] + [ + (kind, system, (0x13096,0x130c1,0x1309c) if kind=='VA' else CL[system]) + for kind in ('VA','CL') for system in SYSTEMS] + + +def relative(kind): + if kind == 'CL': return 'Library/GPUBundles/XeOpenCL/libCLVMIGCPlugin.dylib' + return f'Library/GPUBundles/AppleIntelTGLGraphics{kind}Driver.bundle/Contents/MacOS/AppleIntelTGLGraphics{kind}Driver' + + +def build(directory): + executable = directory / 'native-dispatch' + subprocess.run(['clang++', '-std=c++17', '-arch', 'x86_64', '-O1', + str(ROOT/'tools/native_dispatch.cpp'), '-o', str(executable)], check=True) + return executable + + +def routes(executable, path, kind, offsets, vendor=0x8086): + output = subprocess.check_output([str(executable), kind, str(path), + *(hex(n) for n in offsets), hex(vendor)], text=True) + return output.split() + + +def urb(executable, path, inputs): + result = {} + for shape, quartet in enumerate(inputs): + output=subprocess.check_output([str(executable),'urb',str(path),*quartet],text=True) + for line in output.splitlines(): + bank, *words=line.split();assert len(words)==4 + result[f'{shape}:{bank}']=words + assert len(result)==len(inputs)*3 + return result + + +def export(executable, directory, destination): + # Use the same immutable release identities as the client-history corpus. + releases=json.loads((ROOT/'tools/fixtures/released_clients.json').read_text())['releases'] + groups={} + for release in releases: + tag, commit = release['tag'], release['commit'] + for kind, system, offsets in ROUTES: + data=subprocess.check_output(['git','-C',str(ROOT),'show',commit+':payloads/'+system+'/'+relative(kind)]) + path=directory/'input';path.write_bytes(data) + admitted=routes(executable,path,kind,offsets) + assert admitted, (tag,kind,system,'empty historical route') + if kind!='GL': + for vendor in (0,0x1234,0xffff): + assert not routes(executable,path,kind,offsets,vendor), (tag,kind,system,vendor) + corrections=None + if kind=='GL': + observed=urb(executable,path,SHAPES) + corrections={str(shape):observed[f'{shape}:0'] for shape in range(4)} + assert all(observed[f'{shape}:{bank}']==corrections[str(shape)] + for shape in range(4) for bank in range(3)) + key=(kind,system,tuple(admitted),json.dumps(corrections,sort_keys=True)) + record=groups.setdefault(key,dict(kind=kind,system=system,offsets=list(offsets), + admitted=admitted,**({'urb':corrections} if corrections else {}),sources=[])) + record['sources'].append(dict(tag=tag,sha256=hashlib.sha256(data).hexdigest())) + print('CAPTURE',tag,flush=True) + inventories=[] + for contract in groups.values(): + admitted=contract.pop('admitted') + if admitted not in inventories:inventories.append(admitted) + contract['admission_set']=inventories.index(admitted) + destination.write_text(json.dumps({'schema':1, + 'releases':{r['tag']:r['commit'] for r in releases}, + 'admission_sets':inventories,'urb_inputs':SHAPES, + 'contracts':list(groups.values())},indent=2)+'\n') + + +def check(executable, fixture, payloads, package_layout=False): + corpus=json.loads(fixture.read_text());assert corpus['schema']==1 and corpus['contracts'] + cache={};count=0 + for contract in corpus['contracts']: + kind, system=contract['kind'],contract['system'] + path=payloads/(system.replace(' ','')+'.pkg')/'Payload'/relative(kind) if package_layout else payloads/system/relative(kind) + key=(kind,system) + if key not in cache: + admitted=routes(executable,path,kind,contract['offsets']) + if kind!='GL': + for vendor in (0,0x1234,0xffff): + assert not routes(executable,path,kind,contract['offsets'],vendor), (kind,system,'foreign vendor route',vendor) + cache[key]=(set(admitted),urb(executable,path,corpus['urb_inputs']) if kind=='GL' else None) + admitted, corrections=cache[key] + label='/'.join(source['tag'] for source in contract['sources'])+' / '+kind+' / '+system + lost=set(corpus['admission_sets'][contract['admission_set']])-admitted + assert not lost, (label,'lost released native routes',sorted(lost)) + if corrections: + # Old passthrough layouts may gain a new correction. Preserve every + # correction actually made by an old release, including peer words. + for shape, expected in contract['urb'].items(): + original=corpus['urb_inputs'][int(shape)] + if expected!=original: + for bank in range(3): + case=f'{shape}:{bank}' + assert corrections[case]==expected,(label,'lost URB correction',case,expected,corrections[case]) + count+=len(contract['sources']) + print(f'PASS: {count} released binary contracts; {len(cache)} actual-entry dispatches, all 16-bit IDs, vendor rejection and historical URB corrections') + + +SHAPES = [ + ['0803078078300000','8000000078310000','8000000078320000','8000000078330000'], + ['0803038078300000','4000000078310000','4000000078320000','4000000078330000'], + ['0803058078300000','6000000078310000','6000000078320000','6000000078330000'], + ['0800088078300000','2a00000078310000','2a00000078320000','2a03036078330000'], +] + + +def check_payloads(payloads, package_layout=False): + with tempfile.TemporaryDirectory(prefix='xe-native-history-') as tmp: + check(build(Path(tmp)),FIXTURE,payloads,package_layout) + +if __name__=='__main__': + p=argparse.ArgumentParser(description=__doc__) + p.add_argument('--payloads',type=Path,default=ROOT/'payloads') + p.add_argument('--fixture',type=Path,default=FIXTURE) + p.add_argument('--package-layout',action='store_true') + p.add_argument('--export',action='store_true',help='explicitly regenerate the corpus from immutable release commits') + args=p.parse_args() + with tempfile.TemporaryDirectory(prefix='xe-native-history-') as tmp: + directory=Path(tmp);executable=build(directory) + if args.export:export(executable,directory,args.fixture) + else:check(executable,args.fixture,args.payloads,args.package_layout)