Magma 測試策略

架構圖

四個主要介面

四大元件

  • libvulkan
  • 圖書館員
  • magma_system
  • 廠商 msd (Magma 服務驅動程式庫)

挑戰

  • Vulkan 驅動程式需要硬體才能完成測試
    • 每個支援的 GPU 都需要測試不同的硬體平台
  • GPU 是複雜的硬體元件,其有可能導致不常觸發不當行為的瑕疵
    • 某些測試可能極少發生
  • Vulkan CTS (一致性) 需要數小時才能執行
    • 應以每日版本執行,而非一般 CQ 的一部分
  • 對供應商進行上游 libvulkan 變更
    • 供應商必須提供建構和測試環境,以便在 Fuchsia 上驗證 Vulkan CTS
  • gfxbench 的來源存取權受到限制
    • 我們應該測試二進位套件嗎?

單元測試

其中有些技術需要硬體;預先提交 CQ 檢查中未涵蓋的硬體。

  • magma_util_tests
    • 覆蓋 100% 的 magma_util (不含平台)
  • magma_platform_tests:
    • 涵蓋率 100% 的 magma_util/platform
  • magma_system_tests
    • 覆蓋 100% 的磁性系統
    • 使用模擬 MSD
  • 供應商 MSD
    • 涵蓋率 80-100% (可能不值得模擬某些硬體互動程式碼)
    • 用於取代硬體的幾種模擬畫面
      • 平台 mmio
      • 平台匯流排對應器
      • 位址空間
      • 對應的批次
  • libvulkan
    • 由供應商提供
    • 使用模擬磁性系統 (如果不夠,就會成為硬體互動測試)

需要硬體的單元測試可能會內建於測試 MSD,並在繫結時執行測試。供應商專屬的測試工具可將正式版驅動程式庫解除繫結,將測試驅動程式庫與定位,然後查詢測試結果。接著,測試控管工具將測試驅動程式庫解除繫結,並重新繫結正式版驅動程式庫。

硬體互動測試

應用程式、libvulkan、msd 和 gpu 之間的互動相當複雜。一般來說,應用程式會產生 Vulkan 指令緩衝區和著色器程式,這些程式是由 libvulkan 以 Gpu 專屬二進位檔格式建立。這些指令緩衝區和其他資源會與 magma 系統驅動程式共用,藉此將資源對應至 Gpu 的位址空間,並在 gpu 執行單元上排程指令緩衝區。

  • magma_conformance_tests
    • 不執行指令緩衝區;依賴 Vulkan CTS 來處理指令緩衝區的涵蓋率
  • msd_conformance_tests
    • 驗證供應商的 msd 實作
    • 涵蓋率目標 100%,目前約為 50% (如需導入供應商詳細資訊,請前往 https://fxbug.dev/42080890)
  • 供應商專屬
    • 關閉
    • 懸掛/錯誤恢復
  • Vkreadback
    • 盡可能簡化 Vulkan 的端對端端對端驗證
  • vkloop
    • 驗證停止運作偵測和復原程序
  • Vkext
    • 驗證 Fuchsia Vulkan 擴充功能
  • Vulkan CTS
    • 執行時間需要數小時
    • 每天至少執行一次
    • 供應商必須提供建構和測試環境,以便在 Fuchsia 上驗證 Vulkan CTS

需要硬體

Fuchsia 支援採用下列 GPU 的裝置:

  • Intel Gen 9/12 - Intel HD/Xe 圖形
  • ARM Mali - Bifrost

GPU 是複雜的硬體元件,其有可能導致不常觸發不當行為的瑕疵。某些測試可能很少發生當機。如果偵測到這類錯誤,應視為驅動程式庫錯誤。

效能測試

  • 待辦事項

模糊

MSD 應透過 magma FIDL 介面模糊處理。每個 MSD 都應有自己的模糊化工具,因為每個驅動程式庫在處理指令緩衝區或立即指令資料的方式都不盡相同,因此需要不同的輸入預先處理才能確保足夠的涵蓋率。libfuzzer 應使用 mock-ddk 與 MSD 建立連結,以確保能從驅動程式庫接收涵蓋範圍資訊。由於實際的 GPU 硬體無法用於模糊的環境,因此模糊工具必須實作假的裝置實作。

應使用種子語料,確保 MSD 輸入具有完整涵蓋範圍。您可以透過檢測的 ICD 或可攔截所有 Vulkan 指令的 Proxy MSD 收集這項資訊。

開發 Fuchsia ICD 時,不必模糊 Vulkan ICD,原因如下:

  • Vulkan 規格充滿未定義的行為,因此很難確保模糊測試只會測試合法輸入內容。輸入錯誤會導致應用程式當機或停止運作,請參閱 Vulkan 規範
  • ICD 位於應用程式的位址空間中,因此這類模糊化作業無法確保安全性保證,可避免惡意應用程式趁機修改自身位址空間。作業系統和其他應用程式的完整性防護必須在 MSD 層執行。

我們建議 ICD 開發人員為 ICD 沒有未定義行為的部分建立模糊漏洞。這可能包括定義測試 ICD 版本,該版本會定義規格將未定義的行為。

大多數測試可確保 ICD 符合 Vulkan 規格,而且與 Vulkan CTS 有關。還有一些外部工作 (例如 graphicsfuzz) 便可使用模糊測試來新增 CTS 測試。

另請參閱