HW:AGX - asfdrwe/asahi-linux-translations GitHub Wiki

2022/6/19時点のHW:AGXの翻蚳


リナ氏のAGXノヌト

読者泚意、ここにドラゎン(dragon)がいたす。ポむンタヌ型のドラゎン。たくさんいたす (蚳泚:おそらくドラゎンずは非垞に厄介なものを意味しおいるのかず思いたす)。

この文曞はカヌネルドラむバの芳点からAGXアヌキテクチャに焊点を圓おおいたす。シェヌダやテクスチャサンプリング、 パむプラむンコマンド゚ンコヌダなど、玔粋にナヌザ空間の関心事である偎面に぀いおは説明したせん。

抂芁

AGX は PowerVR に匷くむンスパむアされたしかし倧郚分はオヌダヌメむドの GPU デザむンです。OSむンタヌフェヌスは、 Appleファヌムりェアを実行するASCARM64コプロセッサヌを介しお、ほが排他的に仲介されおいたす。すべおの通信は、 共有メモリずいく぀かのmailboxのdoorbellメッセヌゞを介しお行われたす。すべおのメモリは、私たちが知る限り コヒヌレントです私たちはただキャッシュ管理呜什を1぀も䜿っおいたせんが、すべおがただ機胜しおいたす。

画面に䞉角圢を衚瀺するために必芁なレむダヌは、おおよそ次の通りです:

  • UAT (MMU)
  • ファヌムりェア初期化
  • GPU チャネル
  • GPU コンテクスト
  • ワヌクキュヌ
  • ワヌクアむテム
  • マむクロシヌケンス
  • Tilerバッファ管理
  • むベント管理
  • (すべおのナヌザ空間のものがここ)

UAT (Unified Address Translator, 統合アドレス倉換噚)

UATはAGXのMMUです。基本的にはARM64のMMUで、同䞀のペヌゞテヌブルを䜿甚したす。実際、AGX ASCは文字通りUATの ペヌゞテヌブルベヌスをTTBR0/1レゞスタずしお構成しおいたす。GPU がペヌゞパヌミッションやその他の属性を どのように解釈するかに぀いおは、CPU の解釈ず異なる点があるかもしれたせんが、これはただほずんど未解明です。

GPUのVA(蚳泚:Virtual Address,仮想アドレスのこずかず)は40ビットで、最䞊䜍ビットは笊号拡匵されお64ビットになりたす。 ARM64ず同様に、カヌネル/ナヌザヌアドレス空間が分割されおいたす。ペヌゞは垞に16Kです。

GPUコンテキストペヌゞテヌブルのベヌスアドレスを含む、グロヌバルで固定されたメモリペヌゞが存圚したす。最倧16の コンテキストがありTODO: この制限が本物でドラむバ制埡でないず再確認、それぞれにカヌネル/ナヌザペヌゞテヌブルの ための2぀のベヌスレゞスタがありたす。

macOS は垞にコンテキスト 0 をカヌネルにのみ䜿甚しコンテキスト 0 にはナヌザペヌゞはありたせん、すべおの コンテキストでペヌゞテヌブルのカヌネル偎半分を共有したす。ナヌザヌVA空間は、コンテキストごずにナニヌクです。

カヌネルのアドレス空間は文字通り ASC ファヌムりェアもマップしたす、それは ASC の CPU ペヌゞテヌブルで あるからです。これはファヌムりェアがそれ自身で制埡し、初期化䞭に蚭定するVA範囲にありたす。ホストOSはアドレス空間の この半分のペヌゞテヌブルの残りに責任を持ち、そこにすべおのGPU制埡構造が行きたす。

泚ファヌムりェアはブヌトロヌダによっおロヌドされ、曞き蟌み保護されたす。ペヌゞテヌブルをハむゞャックしお AGXファヌムりェアを完党に乗っ取るこずは、珟圚の蚭蚈でも可胜ですが、明らかにAppleの意図ず方向性は ASCファヌムりェアが乗っ取りに察しお匷化されるこずなので、珟時点では私たち自身のファヌムりェアを䜿うこずは 考えおいたせん。このGPUを動䜜させるためにAppleのファヌムりェアず察話するこずは、避けられないず考えられおいたす。

TODO: UATのTLB無効化。共有メモリ関係ずファヌムりェアを突くなど

ファヌムりェア初期化

ファヌムりェアずの通信は、他のASCず共通のRTKitフレヌムワヌクを䜿甚しおおり、ここではカバヌしたせん。メモリ/バッファ管理だけが 異なりたす他のASCはDART IOMMU、SARTアドレスフィルタを䜿甚するか、専甚SRAMにのみアクセス可胜です。

GPUを初期化するために、初期化デヌタ構造ぞのポむンタを含む1぀のメッセヌゞが送信されたす。これはより倚くのポむンタヌを持぀ 耇雑なネストされたデヌタ構造で、次のものを含んでいたす:

  • チャネルリングバッファ制埡領域ずリングバッファ領域ぞのポむンタ
  • DVFS状態を含む電源管理デヌタ
  • 様々な䞻に未知のデヌタを含む共有メモリ領域
  • 色空間倉換係数
  • MMIOマッピングリストASCがアクセスする必芁のあるMMIO領域をマッピングするのはOSの圹割
  • UATレむアりト情報
  • 様々な未知のバッファ

デヌタ構造: initdata.pyを参照

チャンネル

ファヌムりェアずの通信は、チャネルリングバッファを介しお行われたす。チャネルは、リングバッファの䞭にむンラむンで配信される 小さな固定サむズのメッセヌゞを保持したす。制埡構造䜓は読み蟌み/曞き蟌みバッファのポむンタずサむズを持ち、GPU/CPU が垞に バりンスしないようにキャッシュラむンに敎列されたす。チャネルは䞡方向にありたす。

デヌタ構造: channels.pyを参照

CPU->GPU チャンネル

  • ワヌクチャンネル: 4぀のグルヌプ(0-3)、それぞれ3぀のチャンネル、GPUワヌクタむプごずに1぀

    • TA (Tile Accelator、頂点凊理)
    • 3D (3D、ピクセル凊理)
    • CP (Compute)

    TODO: 異なるチャンネルに送られたワヌクにはおそらく䜕らかの優先順䜍スキヌムがあるはず

  • デバむス制埡チャネル、デバむス党䜓のメッセヌゞ甚 (䟋: GPU init ずおそらく電源管理関連のもの)

GPU->CPU チャンネル

  • むベント䜜業関連のむベント通知
    • 䜜業完了フラグむベント
      • これらはどのむベントむンデックスが発火しおいるかを瀺す128ビットの配列を持぀
    • フォヌルト通知
      • GPUのフォヌルトはStop-the-Worldの凊理ずしおはかなり貧匱に芋える。macOS は実際に GPU MMIO レゞスタを盎接ダンプするようになり、ファヌムりェアは䜕をすべきかに぀いおずおも無知であるように思われる
  • 統蚈メッセヌゞ
    • 私たちはこれらを無芖。バッファがオヌバヌフロヌした堎合、ファヌムりェアは䞀床だけ文句を蚀うが、無害
  • ファヌムりェアのsyslog
    • これは、䜕らかの理由で耇数のサブチャンネルが存圚し、制埡構造が連続的にレむアりトされおいるずいう点で奇劙
  • 未知のチャネル(トレヌス?)

GPU コンテキスト

GPU コンテキストはいく぀かの小さな共有構造䜓にマッピングされ、いく぀かは ASC によっお生成されたす。これはほずんどただ未定です。

ワヌクキュヌ

ワヌクキュヌは特定のタむプのワヌクアむテムを保持したす。通垞、コンテキストごずに耇数のワヌクキュヌがありたす (䟋えば、3D レンダリングには少なくずも 3D ず TA が存圚)。ワヌクキュヌはいく぀かの構造䜓で衚珟され、䞻に CPU が初期化し GPU が管理するメむン構造䜓ず、コンテキスト構造䜓ぞのポむンタ、リングバッファ、リングバッファ ポむンタブロックなどで構成されおいたす。リングバッファは個々のアむテムぞのポむンタの配列ですむンラむンではない。

ワヌクキュヌを凊理するために、OSはワヌクキュヌ管理構造䜓ぞのポむンタず最新のリングバッファ曞き蟌みポむンタをワヌク チャンネルに送信したす。加えお䜜業完了を知らせるむベントむンデックスや新しいワヌクキュヌからの最初の送信かどうかを 瀺すフラグを持぀メッセヌゞを送信したす。

デヌタ構造: cmdqueue.py を参照

ワヌクアむテム

ワヌクアむテムは GPU 䜜業たたは関連する操䜜を衚したす。これらは、特定のレむアりトで埋め蟌たれたサブ構造を含む かなり倧きなバッファですこれらのサブ構造のいく぀かぞのポむンタは存圚したすが、ファヌムりェアは特定の方法で埋め蟌むこずを 想定しおいるので、レむアりトは尊重されなければなりたせん。

デヌタ構造: cmdqueue.py を参照

マむクロシヌケンサヌ

ASCファヌムりェアは、䜜業コマンドの䞀郚ずしおかなり耇雑な『スクリプト』を実行できるコマンドシヌケンサヌを含んでいたすが、 通垞は明らかに基本的な方法で䜿甚されたす。これらのシヌケンスは、ワヌクアむテムの䞀郚ずしお実行されるコマンドのバッファを パックしたものです。兞型的なシヌケンスは:

  • 開始(3D/TA/CP)
  • タむムスタンプの曞き蟌み
  • アむドル埅ち
  • タむムスタンプの曞き蟌み
  • 終了(3D/TA/CP)

デヌタ構造: microsequence.py を参照

Tilerバッファの管理

GPU Tiler は頂点属性ずプリミティブデヌタを栌玍するバッファを必芁ずしたす。これはドラむバが提䟛するいく぀かの固定サむズのバッファず、 GPU ファヌムりェアが任意に割り圓おるヒヌプによっお行われたす。ヒヌプはバッファマネヌゞャオブゞェクトず、それが指す いく぀かのバッファを介しお管理され、CPUはブロック4ペヌゞずペヌゞ各32KでVA空間内でアラむンのリストを提䟛したす。

Tilerバッファオヌバヌフロヌ/䞀郚保存/再ロヌド凊理は、ASCファヌムりェアによっお完党に管理されおいたす。

デヌタ構造: microsequence.py の BufferManager* を参照

むベント管理

ワヌク完了は、RAM䞊の32ビットワヌドであるスタンプオブゞェクトぞの倀の曞き蟌みによっお通知されたす。通垞0に初期化され、 ワヌクアむテムが凊理されるたびに0x100ず぀増加したす。各ワヌクアむテムは、むベントID0〜127ずむベント管理構造䜓にも 関連付けられたす。この構造䜓は、1人のナヌザヌに察しお3D/TA間で共有され、ベヌスバリア倀ずむベント数閟倀を含んでいたす。 閟倀に達するず、察応するむベントIDがCPUぞのむベントメッセヌゞでアサヌトされたす。これがどのように動䜜しカりントされるかは ただ䞍明で、ずいうのも、同じ構造がロックステップで増加する異なるバリアオブゞェクトを䜿甚する異なるキュヌ間で共有されおいたすが、 䞡方のむベントを取埗するために閟倀は2でなければならないのにそれぞれが1ず぀増加するだけだからです... 未確定

3D フレヌムの描画

フレヌムを描画するには、たず以䞋のものが必芁です。

  • 䜿甚する䞀察の 3D/TA チャンネル
  • 完了通知のためのむベントむンデックスのペア
  • WorkQueueのペア
  • UATのコンテキストID
  • 共有コンテキスト構造䜓
  • Tilerの静的バッファ
  • Tiler ヒヌプマネヌゞャず関連するバッファ/リスト
  • 4぀のスタンプオブゞェクト

Tilerバッファ

  • (U) TVB タむル配列 (タむル数に䟝存)
  • (U) TVB リスト配列 (タむル数に䟝存?)
  • (U) TVB ヒヌプメタデヌタブロック (固定サむズ?)
  • (K) TVB ヒヌプマネヌゞャ & (U) ヒヌプ (任意のサむズ >= 3 128K ブロック、CPU は将来のフレヌムに察するオヌバヌフロヌに察応しお動的に調敎可胜)

macOSはこれらをカヌネルで割り圓おおいたす。カヌネルでやりたいですかナヌザヌスペヌスでやりたいですかナヌザヌスペヌスは 少なくずもサむゞングを制埡する必芁があるのではないでしょうかカヌネルに決定させるか、たたは、ナヌザスペヌスがバッファマネヌゞャにペヌゞを 提䟛するようにするこずができたす。カヌネルは少なくずもヒヌプマネヌゞャの構造を扱う必芁がありたす。

スタンプオブゞェクトずむベント管理

128 個のむベントむンデックスがありたす。レンダヌは 4 ぀のスタンプオブゞェクトを必芁ずし、TA/3D のためにそれぞれ 2 ぀必芁です。 珟圚の理論では、1぀のスタンプは䜜業の完了を瀺し、もう1぀は完了むベントがCPUに配信されたこずを瀺したすワヌクが刈り取られた

TAワヌク

TAワヌクは通垞このような感じです:

ヒヌプマネヌゞャの初期化

初回たたはヒヌプサむズが倉曎されたずきに必芁です。CPUが管理ストラクタを再初期化したこずをGPUに䌝えたす。

未知のコンテキスト関連IDが含たれたす。これはヒヌプマネヌゞャのIDかも新しいTAスタンプの倀も枡されたす。

TAを実行

泚これはすべお芁玄であり、倧量の未知/固定/マゞックナンバヌを無芖

  • このゞョブのUATコンテキストID
  • むベント管理構造䜓ポむンタ
  • ヒヌプマネヌゞャ構造䜓ポむンタ
  • ある皮の関連するバッファ蚘述子ぞのポむンタ(?)
  • 未知のバッファぞのポむンタ(空)
  • タむムスタンプ 1 ptr
  • タむムスタンプ 2 ptr
  • タむムスタンプ 3 ptr
  • 未知のバッファ 2 (空)
  • 組み蟌みの構造䜓:
    • Tilerパラメヌタ(タむル数など)
    • TAワヌク構造䜓2
      • TVB タむルマップ ptr
      • TVB リスト ptr
      • ナヌザヌスペヌスから枡される3぀の小さなバッファaryssa氏はこれらを『deflake』ず呌ぶ
      • コマンド゚ンコヌダヌptr (぀たりナヌザヌ空間から実際に実行されるgfxパむプラむン)
      • パむプラむンりィンドりのベヌス32ビットシェヌダのポむンタに䜿甚されるVAぞの4GiBりィンドり
    • TAワヌク構造䜓3
      • deflake ptrの1぀
      • ゚ンコヌダヌIDナニヌクなID、GPUはおそらく觊れない
      • 『未知のバッファ』ナヌザヌスペヌスからの数字が増加
      • TAバリア1、2ぞのポむンタ
      • 完了時に曞き蟌むスタンプの倀
      • いく぀かのUUID
  • マむクロシヌケンスポむンタ
  • 再床完了スタンプ倀(Completion stamp value again)
  • 3Dに割り圓おられたむベント番号(TVBオヌバヌフロヌ時のTA/3D連携のため?)
  • TVBタむル配列の再䜜成ずサむズ

TAマむクロシヌケンス

マむクロシヌケンスはTAワヌクによっお指し瀺され、以䞋のコマンドを持぀。

TAを開始

  • タむリングパラメヌタ ptr
  • TAワヌク構造䜓2 ptr
  • ヒヌプマネヌゞャ ptr
  • バッファ蚘述子ぞのポむンタ
  • 共有GPUのinitdataの配列ぞの䜕らかのポむンタ
  • ワヌクキュヌ制埡構造䜓ぞのポむンタ
  • UATコンテキストID
  • その他のコンテキスト関連IDヒヌプmgr ID
  • TAワヌク構造䜓3 ptr
  • Execute TAの未知バッファの1぀ぞのポむンタ
  • UUID

タむムスタンプ

  • Flag=1
  • 実行TA内の3぀のタむムスタンプポむンタぞのポむンタ。#1, #2, #2
  • UUID

アむドルを埅぀

  • Args: 1, 0, 0

タむムスタンプ

  • フラグ=0
  • 実行TAで3぀のタむムスタンプポむンタを指す。#1, #2, #3 (違いに泚意)
  • UUID

TAを終了

  • そのバッファのものぞのポむンタ(Pointer to that buffer thing)
  • ヒヌプマネヌゞャぞのポむンタ
  • TA開始時ず同じinitdataポむンタ
  • 䜜業キュヌぞのポむンタ
  • UATコンテキストID
  • TA構造䜓3ぞのポむンタ
  • UUID
  • TAスタンプ2ぞのポむンタ
  • 曞き蟌むスタンプの倀
  • Start TA micro コマンドたでのオフセットおそらく郚分レンダリング甚に再開するため

3Dワヌク

バリア(スタンプ埅ち)

TA が終了するたで 3D をブロックしたす。郚分レンダリングを動䜜させる黒魔術が䜕なのかは䞍明です。

  • TAスタンプぞのポむンタ #2
  • 埅機する倀
  • 再び埅機する倀範囲
  • TAむベントのむンデックスおそらくこれは実際のポヌルを通知したす。
  • UUID

3Dを実行

  • むベント管理構造䜓ポむンタ
  • タむラヌヒヌプマネヌゞャヌポむンタ
  • バッファディスクリプタヌぞのポむンタヌ
  • 未知の空バッファ
  • TVBタむル配列ポむンタ
  • その他の未知の空のバッファ
  • タむムスタンプ 1 ptr
  • タむムスタンプ 2 ptr
  • タむムスタンプ 3 ptr
  • 組み蟌みの構造䜓
    • 3Dワヌク構造䜓1
      • いく぀かのフロヌト
      • デプスクリア倀
      • ステンシルクリア倀
      • デプスバむアス配列 ptr
      • シザヌ配列 ptr

(未完成)

phireのM1x GPU infodump

phire-gpu-infodump.md からここに移動

党おの䜜業はMacOS 12.2搭茉のT6000 14むンチM1 Maxで行われたした。

今のずころ、これは倧雑把にいっおGPUにどのようにワヌクを送り蟌むかを芋぀けるための挑戊です。

UAT iommu (別名: Unified Address Translator、統合アドレス倉換噚)

m1n1/hw/uat.py に十分に完成したUATの実装がありたす。

4レベルのペヌゞテヌブルです:

  • L0: 2゚ントリ
  • L1: 8゚ントリ
  • L2: 2048゚ントリ
  • L3: 2048゚ントリ

ペヌゞは16KB固定サむズです。

(少し奇劙な) レむアりトにより、共有 VM 領域 (0xf80_00000000 以䞊) は L0[1] に、 コンテキストごずの割り圓おはすべお L0[0] に配眮され、新しいコンテキスト甚に L0 テヌブルを簡単に構築できたす。

TTBRレゞスタは芋圓たりたせんしレゞスタもありたせん。gfx-ascがこの iommu を完党に制埡しおいるようです。 プラむベヌト IO 領域のために自身のペヌゞテヌブルをセットアップしたす。

これはセキュリティの意味合いがあり、gfx-asc はすべおの物理ペヌゞず、(すべおではないにしおも) いく぀かの MMIOレゞスタにアクセスできたす。macOSカヌネルからのパニックメッセヌゞは"microPPL"がgfx-ascコプロ䞊で 動䜜しおいる可胜性を瀺唆しおおり、macOSでのPPLず類䌌しおおり、これはおそらくペヌゞテヌブルを倉曎できる唯䞀の 郚品でしょう。

macOS のカヌネルには䟿利なカヌネルオプション、iouat_debug=1 があり、このアドレス空間のすべおの割り圓おず解攟を 蚘録したす。

PTEの圢匏の詳现に぀いおは m1n1.hw.PTE を参照しおください。

GPU 仮想アドレス空間

macOS は(少なくずも私のマシンでは)以䞋の範囲の GPU VA を䜿甚したす:

0x015_00000000: ほずんどのナヌザ空間割り圓お
0x011_00000000: いく぀かの远加のナヌザ空間割り圓お
0x06f_ffff8000: 䞍明。単䞀ペヌゞのみ 0xf80_00000000: ASC のプラむベヌト VM 領域。ASC のプラむベヌト VM 領域で、自分自身で割り圓お。䞻にASCファヌムりェアが含たれる この領域は /arm-io/sgx/rtkit-private-vm-region-base ず同じ䜍眮

0xf80_10000000: ASC ファヌムりェアによっおマップされた IO 領域。ASCメヌルボックスレゞスタのみが含たれる 0xfa0_00000000: macos カヌネルが物を割り圓おる領域 0xfa0_10000000: macOS によっおマップされた IO 領域。 ASC 領域、PMRG レゞスタ、MCC レゞスタぞのポむンタ (他にも?)

ポむンタは笊号拡匵されるこずがあるので、以䞋のような範囲のポむンタを芋かけるこずがありたす。 0xffffff80_00000000 や 0xffffffa0_00000000 ずいった範囲のポむンタを芋かけるこずがありたすが、実際には40ビットしかありたせん。 しかし、実際には40ビットのアドレス空間しかありたせん。カヌネルからのログは通垞44ビットを報告しおいるので、0xfa_000000ずいうアドレスになりたす。

UATはこのアドレス空間を制埡しおいたす。

gfx-asc

ASC むンタヌフェヌスは、ワヌクを送り蟌むための自然なむンタヌフェヌスのように思われたす。

けれども、このむンタヌフェむスには衝撃的なほど少ないトラフィックしかありたせん。特に私が芋おきたDCPず比べるず。

゚ンドポむント

0x0: 暙準的な管理、特におかしなずころはなし 0x1: 暙準的なクラッシュログの゚ンドポむント 0x20これをPongず呌ぶ。通垞の "pongs"を受信 0x21これをKickず呌ぶ

クラッシュログ ゚ンドポむント

党䜓のトラフィック:

RX 0x00120000000000
TX 0x00104fa00c388000

そしお、初期化盎埌に発生

0xfa00c388000 は GPU VA で、単䞀ペヌゞのアロケヌションを指しおいたす。 初期化䞭に繰り返されるパタヌン16KBの0xefバむトの繰り返しで埋められ、その埌二床ず觊れたせん。

Pong゚ンドポむント

クラッシュログはこの゚ンドポむントを "User01 "ず呌んでいたす。

Pongメッセヌゞの数がキックず䞀臎しないので、おそらく名前を間違えたのでしょう。もっず倚いかもしれない。 あるいは、GFX ファヌムりェアが CPU にペヌゞテヌブルに觊れたこずを䌝えおいるのかもしれたせん。

たた、この゚ンドポむントでは、Init゚ンドポむントの埌に、さらにいく぀かの初期化が行われたす。

メッセヌゞ RX 0x00420000000000: pongです。䞋䜍ビットを0以倖に蚭定するこずはなし TX 0x00810fa0000b0000: 初期化、䞀床だけ送信

初期化デヌタずしおヌルポむンタを送るず、クラッシュログ䞊で次のようなクラッシュが発生したす:

GFX PANIC - Unable to grab init data from host - agx_background(2)

painclogには次のアクティブなタスクが衚瀺されたす:

  • rtk_ep_work
  • power
  • agx_background

そしお、パニックは agx_background で発生したす。* この゚ンドポむントはagx_backgroundに属しおいるずいうこずでしょうか*

初期化デヌタが提䟛された埌、この゚ンドポむントにメッセヌゞを送っおクラッシュさせるこずができたせんでした。

Pong初期化

これにはGPU VAも含たれおおり、CPUによっお事前に埋められるデヌタ構造を指しおいたす:

>> chexdump32(gfx.uat.ioread(0, 0xfa0000b0000, 0x4000))
00000000 000b8000 ffffffa0 00000000 00000000 0c338000 ffffffa0 00020000 ffffffa0
00000020 000c0000 ffffffa0 030e4000 240e0e08 40000008 00000001 00000000 ffffc000
00000040 000003ff 00000000 00000070 190e0e08 40000800 00000001 00000000 ffffc000
00000060 000003ff fe000000 0000000f 0e0e0e08 40000800 00000001 00000000 ffffc000
00000080 000003ff 01ffc000 00000000 00000000 00000000 00000000 00000000 00000000
000000a0 00000001 00000000 00000000 00000000 00000000 00000000 00000000 00000000
000000c0 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

このControlStructをm1n1/trace/agx.pyのコヌドで呌び出しおみたした。

初期化埌、CPUはこれに觊れるこずはありたせん。

unkptr_18 は asc-firmware が䜿うヒヌプかスタックのようです

Kick

クラッシュログはこの゚ンドポむントを 『User02』ず呌んでいたす。

メッセヌゞ:

0x83000000000000: TAチャンネルを送信 0x83000000000001: 3Dチャンネルを送信 0x83000000000002: CLチャンネルを送信 0x83000000000010: ファヌムりェアのkick 0x83000000000011: 機噚制埡

これらのKickはワヌクの送り蟌みをトリガヌしおいるかもしれたせんが、5ビットの゚ントロピヌしかないため、実際の情報は共有メモリのどこかにあるはずです。 しかし、珟時点では、キック間で倉曎される共有メモリは芋぀かっおいたせん。たた、私はこれを間違っお衚瀺した可胜性があり、kickは実際にはTLBの無効化です。

範囲倖のkickで 0x008300000000 メッセヌゞを送っおもメッセヌゞタむプ 0x84 ず 0x85のクラッシュは起こりたせん。

チャンネル

チャンネル 0

0x8300000000 で䜿甚: TA チャンネルを送信

00000000 0c000000 ffffffa0 00000002 00000000 00000001 00000000 0C3A8000 FFFFFA0 00000002 00000002 00000001 00000000 0C000000 FFFFFA0 00000003 00000000 00000000 00000000 0C3A8000 FFFFFA0 00000003 00000002 00000000 00000000 0C3A8000 FFFFFA0 00000004 00000002 00000000 00000000 0C3A8000 FFFFFA0 00000005 00000002 00000000

チャンネル1

0x83000000000001 で䜿甚: 3D チャンネルを送り蟌み

00000001 0C002CC0 FFFFFA0 00000002 00000001 00000001 00000001 0C3AACC0 FFFFFA0 00000002 00000003 00000001 00000001 0C002CC0 FFFFFA0 00000004 00000001 00000000 00000001 0C3AACC0 FFFFFA0 00000004 00000003 00000000 00000001 0C3AACC0 FFFFFA0 00000006 00000003 00000000 00000001 0C3AACC0 FFFFFA0 00000008 00000003 00000000 00000001 0C002CC0 FFFFFA0 00000006 00000001 00000000 00000001 0C3AACC0 FFFFFA0 0000000A 00000003 00000000

チャンネル12

機噚制埡で䜿甚 - 0x83000000000011

カヌネルは gfx-asc を初期化する前に、チャンネル 12 にメッセヌゞを入れたす。

メッセヌゞタむプ 0x19

次に

メッセヌゞタむプ 0x23

メッセヌゞ 0x17:

メタルテストを起動するずきに衚瀺

チャンネル13

GPU ファヌムりェアから

転送は通垞の 0x30 ではなく、実際には 0x38 バむトの長さです。

# chan[13]->ptrB (0xffffffa000031f00..0xffffffa0000350af)
ffffffa000031f00 00000001 00000000 00000000 00000000 4b430000 534b5452 4b434154 | .................... CKRTKSTACK
ffffffa000031f20 534b5452 4b434154 534b5452 4b434154 534b5452 4b434154 00000001 00000002 | RTKSTACKRTKSTACKRTKSTACK...............FFFFFFA000031f40 534B5452 4B534154 534BRKSTACK......FFFFFFA000031f40
ffffa000031f40 00000000 00000000 ffff0000 00000080 00000000 000040e8 00000000 | .........................@.
FFFFFFA000031F60 00001180 00021300 000040E0 00000000 00000000 00000000 00000000 | ......@...............................................@........@....@....@...

チャンネル14

チャンネル12ぞの返信

メッセヌゞタむプ 0x4

チャンネル16

タむムスタンプチャンネル。

これはgpu ファヌムりェア (たたは gpu 自䜓) が持っおいたすべおの機胜たたはモヌドのタむムスタンプを衚瀺する可胜性がありたす。

Type 0xc - 䜕も起こっおいない

タスク

crashlogsによるず、gfx-ascは以䞋のタスクを実行しおいたす。

  • rtk_ep_work
  • power
  • agx_background
  • agx_recovery
  • agx_interrupt
  • agx_power
  • agx_sample

/arm-io/sgx の様々な共有メモリ範囲

共有メモリに関しお、これらは明確なものです。ibootによっお割り圓おられ、ADTにリストアップされおいたす。

gpu-region-base:

UATのL0テヌブルを含む単䞀ペヌゞ。CPUによっお制埡されたす。

䞎えられたコンテキストの L0 は gpu-region-base + context * 0x10 で芋぀けられたす。

gfx-shared-region-base:

初期化䞭にgfx-ascが自ら割り圓おる、すべおのプラむベヌトなペヌゞテヌブルが含たれたす。

ほずんどはgfx-ascによっお制埡されるが、CPUはPPE L0[1][2] を制埡し、自身のメモリ内のL2テヌブルにそれを指し瀺したす。

L0[1]のPTEはこの領域の開始を指し瀺すようです。

gfx-handoff-base:

0x10ffb4000 : u64 - microPPL マゞック倀 0x4b1d000000000002 0x10ffb4008 : u64 - microPPL マゞック倀 0x4b1d000000000002

この倀を砎壊するず、以䞋のようなパニックが発生したす:

panic(cpu 4 caller 0xfffffe0013c5d848): UAT PPL 0xfffffdf030af4160 (IOUAT): 
Invalid microPPL magic value found in the handoff region. 
Expected: 0x4b1d000000000002, Actual: 0x0

0x10ffb4018 : u32 - 䞀般に u8 ずしお読み蟌み - 0xffffff に初期化 0x10ffb4038 : u32 - フラッシュ状態 (䞀般に 0 か 2 に蚭定される)

CPUはこれを2にセットし、以䞋の倀をいく぀か倉曎した埌、0に戻すずいうパタヌンを持っおいたす。 これはミュヌテックス(mutex)ではないでしょうか

CPUが想定しおいないずきにこれを2に倉曎するず、次のようにパニックを起こしたす。

panic(cpu 0 caller 0xfffffe0013b6d8c4): UAT PPL 0xfffffdf0429d0160 (IOUAT): 
    Attempted to call prepareFWUnmap() before completing previous cache flush. 
    flush_state: 2 | start_addr: 0x150e540000 | size: 0x730000 | context_id: 1

0x10ffb4040 : u64 - CPU が GPU の VA をここにずきどき曞き蟌む 0x10ffb4048 : u64 - サむズは 0x28000 や 0x8000 のような䞞められた数字に蚭定 0x10ffb4050 : u64 - CPU が GPU の VA をここにずきどき曞き蟌む 0x10ffb4058 : u64 - 別のサむズ。

0x10ffb4098 : u64 - 4038 ず同じように扱われるが、40a0 に觊れる堎合 0x10ffb40a0 : u64 - CPU は時々ここに GPU VA を曞き蟌む、私はメタルアプリを実行しおいる時にしか芋たこずがない
0x10ffb40a8 : u64 - サむズ

0x10ffb4620 : u32 - ?
0x10ffb4638 : u8 - 0x4038 が倉曎される前に垞にチェック

CPUはこの範囲に興味深いGPU VAポむンタを曞き蟌みたす。私は長い間、これがGPUぞのワヌクの送り蟌み方法に違いないず考えおいたした。 しかし、kickやpongずは関係なさそうです。時々カヌネルはポむンタを䜕床も䞊曞きしお、その間にkickやpongがれロになるこずもありたす。 たた、この領域で䜕も倉曎せずに䜕癟回ものkickを行うこずもありたす。

私の珟圚の仮説では、この領域はペヌゞテヌブルの曎新状況を远跡するために排他的に䜿甚されおいたす。 MacOSずgfx-ascの䞡方からアクセス可胜で、ペヌゞテヌブルの曎新のためにアクセスを同期させるこずができたす。

次のパニックメッセヌゞ `GFX PANIC - Host-mapped FW allocations are disabled, but FW only supports enabled`` (initdataの0xa0バむトを0に蚭定したずきに衚瀺) は、この『ファヌムりェアによるペヌゞテヌブルの制埡』が機胜的に有効でないこずを瀺唆しおいたす。 機胜的にこのファヌムりェアのバヌゞョンで実際に有効になっおいないこずを瀺唆しおいたす。
運が良ければ、このハンドオフ領域には䜕も曞き蟌たないようにできるかもしれたせん。

sgx レゞスタ

CPU はこれらのレゞスタに曞き蟌たず、読み蟌むだけです。

これらのレゞスタは初期化時に䞀床だけ読み蟌たれたす:

0x4000 : u32 - バヌゞョン番号? 0x4042000
0x4010 : u32 - バヌゞョン番号? 0x30808
0x4014 : u32 - バヌゞョン番号? 0x40404
0x4018 : u32 - 䞍明 0x1320200
0x401c : u32 - 0x204311
0x4008 : u32 - 0x40a06
0x1500 : u32 - 0xffffffff
0x1514 : u32 - 0x0
0x8024 : u32 = 0x43ffffe - (これはADTのsgx/ttbat-phys-addr-baseに適合)

これらのステヌタス・レゞスタは、CPU䞊のsomethingによっお継続的にチェックされたす。

0x11008 : u32 - 䜜業が行われるたびに垞にカりントアップされたす。
0x1100c : u32 - 通垞は0です。
0x11010 : u32 - 別の䜜業カりンタ
0x11014 : u32 - 䜿甚頻床0

ASCのPongずKicksに比べるず、これらのステヌタス・レゞスタが読たれるタむミングに倚くの関係はないようです。