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)