顯示廣告
隱藏 ✕
看板 million
作者 emulators (模擬器)
標題 [note] SMM SMI 作業做法紀錄
時間 2014年12月04日 Thu. PM 02:25:09


請寫一隻 SMM Driver 然後註冊一個 SW HANDEL(value 0x70) ,
然後寫一個 DOS 程式將AX輸入任意值,
最後在觸發 SW SMI (value 0x70) 進入 SMM mode 到自己所註冊的 Handle 時,
請將存在 SMRAM State Save MAP 內 AX 的值讀取出來,然後顯示在 Debug 80 port

解:

首先要把 .mak 檔中的 DEPEX1_TYPE=EFI_SECTION_DXE_DEPEX
換成 EPEX1_TYPE=EFI_SECTION_SMM_DEPEX
這會是影響能否進入 InitSmmHandler() 的關鍵

接著在 Entry funciton, 設定進入InitSmmHandler, 其要啟動的 func ptr 指向
InSmmFunction(). 這個 func 需要我們自己 implement.
模仿 SMIFlash.c 的 InSmmFunction(), 先在裡面 用 pBS->LocateProtocol()
去 Locate EFI_SMM_SW_DISPATCH_PROTOCOL 宣告出來的變數, 以下稱 swp

用 EFI_SMM_SW_DISPATCH_CONTEXT 宣告一個 swContext, 並在宣告時初始化其值為 {0x70}.
接下來呼叫 swp->Register(swp, swpFunction, swContext, Handle)
此函式會在開機時, 將 0x70 的 context 註冊到系統上, 使得當 SMI=0x70 觸發時,
會跳到我們自己寫的 swpFunction 中.

接著實作 swpFunction.
在這函式中其實只要用 EFI_SMM_CPU_SAVE_STATE 宣告一個變數, 以下稱 pstate.
因為進 SMM 之前, 系統會把所有的 CPU state 包括 ax ~ dx
等等的暫存器內容另外存, 必須用特殊的 API 才能讀到.
所以用 pstate = pSmst->CpuSaveState 去接值.
接到之後, 透過 ecx = pstate[CpuIndex].Ia32SaveState.ECX 即可讀到暫存器值.
其中 CpuIndex 理論上填 0 即可.
--
※ 作者: emulators 時間: 2014-12-04 14:25:09
※ 編輯: emulators 時間: 2014-12-04 15:08:09
※ 看板: million 文章推薦值: 0 目前人氣: 0 累積人氣: 1362 
r)回覆 e)編輯 d)刪除 M)收藏 ^x)轉錄 同主題: =)首篇 [)上篇 ])下篇