顯示廣告
隱藏 ✕
看板 million
作者 emulators (模擬器)
標題 [note] CPU intro & pow management 作業做法紀錄
時間 2014年11月05日 Wed. AM 10:09:31


!!! 未解問題 !!!
為什麼編譯時, 同在一個 header 裡面的不同 function 有些可編譯有些卻會說 unresolved external symbol?
CPULib_CpuID() 可
CPULib_GetMicrocodeVer() 不可

可能解答:
因為 AMI 已經弄好一系列的 include 順序, 會這樣只是因為沒有 include 到正確的 header 而已

1. 顯示以下項目到 BIOS setup 畫面上
CPU brand string
microcode version
MTRR setting
並且分析 system memory map 的 cacheability

2. 用 RW everything 看結果, 寫 function, 改 _PSS 的最後一列, 改成跟倒數第二列一樣

1.解
microcode version:
呼叫 BIOS src code 中的 Core/CPU/CpuCspLib.c 中的 CPULib_GetMicrocodeVer()
返回值類型是 UINT32.
#include <../Core/CPU/CPUCspLib.h>

CPU brand string:
參考 CpuCspLib.c 中 isTurboModeSupported() 寫法
先宣告 EAX ~ EDX, 用 CPULib_CpuID() 送值給 EAX 0x0
再抓 EBX, EDX, ECX 的 char8 內容, 注意每個 register 內容是顛倒過來的

Micorcode Version:
參照 CPULib_GetMicrocodeVer() 的程式, 直接拿過來用即可.

找 InitString() 函式, 其中第三個參數要用 L"%a", 才能把 CHAR8 的字串用 UCS-2 的格式印出來.
或用 StringConvert8to16() 函式去轉換

MTRR setting:
要讀 MTRR msr, 要用 ReadMsr() 函式, 需 include <AMICspLib.h>
以下 MTRR setting 皆是 ReadMsr() , 輸入變數參照 CPURegs.h 中之有相似名稱的定義就好
動態 MTRR range 算法:
首先用 eax = 8000 0008h 再送 cpuid, 回傳回 eax register 值之前 8 bit (前二個16進位字) 為最大長度 MAX.
給定 base = b, mask = m, b 與 m 取 bit 12 到 bit MAX-1, 把前 0~11 bit 填0 ,為位址計算區域 B & M
M 取 1 的補數, 再把最高位多出來的 bit (若有超過最高位的話) 忽略, 則為 M'.
則 range = B ~ (B+M')

Fixed MTRR registers: IA32_MTRR_FIXnK_YYYY 巨集, n 是整數, Y 是16進位數


2.解
ReferenceCode/Cpu/PowerManagement/Dxe/PerformanceStates.c
if ((*CurrPtr == AML_NAME_OP) && (*Signature == SIGNATURE_32 ('_', 'P', 'S', 'S'))) {
此行開始應為 _PSS 區段之建構程式.

其中有三個變數要更動指標. 為 NewTable , CurrPtr, 與 MSize (此行待修)
--
※ 作者: emulators 時間: 2014-11-05 10:09:31
※ 編輯: emulators 時間: 2014-11-13 16:16:07
※ 看板: million 文章推薦值: 0 目前人氣: 0 累積人氣: 791 
r)回覆 e)編輯 d)刪除 M)收藏 ^x)轉錄 同主題: =)首篇 [)上篇 ])下篇