2012年5月21日 星期一

UEFI/PI (3) Security(SEC) Phase



  • SEC Phase 簡介
      SEC是reset 或 power-on 後 PI ( Platform Initialization)的第一個phase定義在Platform Initialization Specification, Ver. 1.2.1, Volume 1, Chapter 13。SEC必須確保firmware的 "完整"。 SEC他是相依於platform及CPU的,也就是說必須針對不同的CPU或平台來做移植。另外,SEC大部分的實作都是在assembly下的,而且是不可以壓縮的。
  • SEC Phase 的責任
      SEC有四個主要的任務分別如下:
      1. Restart SEC必須要處理所有的platform restart event,包含開機、重開機或是其他異常的重啟。
      2. Memory Sotre SEC必須要建立一塊臨時的memory在系統初始化前使用。使用例如CAR( Cache as Ram)或SRAM的技術。
      3. Root of Trustestart SEC從power on 開始要尋找和驗證PEI的最初步驟。目的是要保證Processor最開始的code是可以信賴的。
      4. Passing 傳送Handoff訊息和把control給PEI Fondation。傳送的訊息包含了a. 平台狀態、b. BFV(Boot Firmware Volume)位置及大小、c. temporary RAM的位置大小等等。

        SEC透過EFI_PEI_STARTUP_DESCRIPTOR將上述Passing的資料pass給PEI。EFI_PEI_STARTUP_DESCRIPTOR的資料結構是長這樣子的:
        typedef struct {
            UINTN                   BootFirmwareVolume;
            UINTN                   SizeOfCacheAsRam;
            EFI_PEI_PPI_DESCRIPTOR  *DispatchTable;
        } EFI_PEI_STARTUP_DESCRIPTOR;
    • SEC Platform Information PPI
        在上面我們有提到SEC利用(強制使用)EFI_PEI_STARTUP_DESCRIPTOR這個資料結構將Handoff德資訊pass給PEI。另外,我們也可以pass"額外"(optional)的PPI EFI_SEC_PLATFORM_INFORMATION_PPI給PEI。這個PPI 抽象化了PEI Fondation所需要用來discover dispatching PEIM的起始位置的platform-specific資訊。這個PPI也可以存在EFI_PEI_STARTUP_DESCRIPTOR這個資料結構的最後一個參數裡(*DispatchTable)。
    • Health Flag Bit Format
      • Health Flag Bit Format
        • SEC_PLATFORM_INFORMATION_PPI.PlatformInformation()定義了PFI_HEALTH_FLAGS存放由microcode、hardware或是Itanium才有的PAL 產生的CPU status。Health Flag的bit format如下圖:

           

          下圖則是每一個bit的說明。

      • Self-Test State Parameter
          Self-test state定義的參數for IA-32 Intel® processors 和 Intel® Itanium® processor family 是一樣的。某些 bit可能沒辦法直接對應到IA-32的CPU,這時候讀到的值就會是NULL。下圖說明了每一個bit 的意義。

          如果Status顯示functionally restricted,我們可以從vm,ia,fp得到failure的訊息。下面列出導致functionally restricted的情況:
          1. Processor 或 PAL偵測到且獨立出錯誤的component,所以不會被使用。
          2. Processor必須至少要有一個可以用的memory unit、ALU、shifter及branch unit。
          3. Floating-point may be disable。
          4. For Itanium,RSE(Register Stack Engine)is  not required to work,但register renaming logic必須要能正常work。
          5. Processor-controlled caches和register files之間的path在測試的過程中必須要能work。
          6. 讀取firmware address space必須要能正常work。

    • Processor-Specific Detail
        下面以IA-32為例,解釋SEC Phase在IA-32架構下的運作狀況。
        1. Locating PEI Foundation。
        2. 使用 architecture define的Handoff state把control交給PEI。
        3. 初始化processor-controlled memory resource例如processor data cache。
    • 參考資料:VOLUME 1: Platform Initialization Specification Pre-EFI Initialization Core Interface Version 1.2.1

      UEFI/PI (2) UEFI and Platform Initialization(PI)

      • Background

      • 前一篇說明了UEFI的大概,也提到了Tiano這個OpenSource Project. 這一篇將簡介UEFI的PI。
        過去Intel發展了 The Intel Platform Innovation framwork for UEFI或是"The Framework" 是一個符合UEFI規範的一個firmware實作。這一個幾乎以C來實作的framework支援了大部分的Intel CPU family。

        而目前,這個framework已經被更全面支援的UEFI Platform Initialization (PI)所取代了。UEFI和PI有兩個主要不同的點。
        1.  UEFI定義了OS, add-in driver和system firmware之間的Interface。(下圖藍色部分)
        2.  PI則定義了偏向Implementation的部分 e.g. 從 power on 到移交control給OS之間的所有操作。 (下圖綠色部分)
         
        PI負責從開機到UEFI可以work之間的流程,舉例來說,UEFI是負責跟OS做溝通,然而,UEFI本身並不處理memory initialization、recovery或platform initialization等等跟platform有關的事情。這些都是由PI做掉的。
          另外,UEFI跟PI的SPEC都是UEFI Fourm所制定的。 
        • PI 簡介
        • 如下圖,PI分成六個部分,
          從開機的過程來看,順序是由左到右。下面一一解釋各個流程在做什麼。
          1. SEC
          2. SEC是Security的簡稱,這一個phase是開機後第一個執行的phase。任務是確保在reset 或 power on之後的integraty是完整的。
          3. PEI
          4. PEI是pre-EFI initialization的簡稱。任務是先做CPU、Chipset及Memory等等的初始化。在這一個階段,PEI初始化基本的環境 for下一個 phase。另外,PEI執行完會有Hand-off block (HOB)傳給DXE
          5. DXE
          6. Driver Execution Environment這個階段負責enumerate及init device、初始化UEFI services、  及 protocol等等
          7. BDS
          8. Boot Dev Select這邊負責how and where to boot OS.
          9. TSL
          10. Transient System Load這個階段將control transit 給OS
          11. RT
          12. Runtime的階段已經脫離boot sequence了,這個階段是由OS執行中
          13. AL
          14. After Life指的是系統reboot或shutdown

        UEFI/PI (1) UEFI 簡介


        • 什麼是 UEFI ? 
        •  Unified Extensible Firmware Interface 定義了OSplatform firmware之間溝通的介面。例如跟一般都會有firmware的GPU 卡。

          UEFI的出現是INTEL為了要取代傳統的 BIOS(Legacy BIOS) 然後發展EFI最後移交出去改名成UEFI
           
        • 為什麼UEFI?

        • 1. Legacy BISO的執行環境都是在16 bit下,之後的CPU儘管支援64 bit還是必須"額外"實作支援16 bit 環境以支援BIOS執行。於是像INTEL的vendor就想改變這點取代傳統的BIOS
          2. 16 bit的CPUaddressing可以到2^20 Bytes ,也就是說極限到1024 KBytes,這當然大大的限制了BIOS可以做的事情。
          3. 對開發者來說,Legacy BIOS多以ASM來開發,懂的人相對地少且對於開發速度也會有程度的受限。
        • UEFI Resource

          1. Intel 移交EFI後實際管理的單位是Unified EFI Forum 因此在上面我們可以看到最新的SPEC.
          2. Intel Release了代號為Tiano 的EFI的實作後,我們可以直接從SourceForge去抓代號為Tianocore的Opensource project.
          更詳盡的UEFI簡介可以參考WIKI