BIOS DEBUG & CMOS SPACES

這幾天在弄某個 PEIM, 但是手上的版子剛好 Port80 沒辦法用, 又懶的架USB Debugging, 於是乎把腦筋動到 CMOS Spaces上, 由於目前的Platform code上, 在 Extend CMOS 還空了不少未用到的空間. 底下的 code 展示了一個 寫到 OFFSET 0x65 位置的方法

int            _inp (unsigned short port);
int            _outp (unsigned short port, int databyte );
#pragma intrinsic(_inp)
#pragma intrinsic(_outp)

static void DebugPort(UINT8 value)
{
_outp(0x72, 0x65);
_outp(0x73, value);
}

當然透過CMOS當做 Trace 有一個很明顯的缺點是, 這個BIOS一定要跑完, 可以Booting OS, 不然就不能容易觀察到 CMOS內的資料.

當一般OEM開發新的PEIM or DXE DRIVER, 實際上是有機會避掉這個缺點的, 因為基本上手上的Codebase 原本是都能Booting的, 因此在code內再增加一個函式, 如下

static BOOLEAN CheckFaild(UINT8 value)
{
_outp(0x72, 0x65);
return (value == _inp(0x73)) ? TRUE : FALSE;
}

然後在PEIM And DXE Driver EntryPoint Function 內可以做下列判斷

if (TRUE == CheckFaild(WantSkipCode))
return EFI_DEVICE_ERROR; // or return EFI_UNSUPPORTED;

如此可以決定是否要繼續Run 該 PEIM or DXE Driver

而在增加/修改的Code前, 透過DebugPort把Trace code寫入, 如此當開發過程中遇到, 因新增的Code 而System hang,透過 CheckFailed可以在重新Reset時, 將整個有問題的code skip, 而還是可以正常開機

透過上述簡易的手法, 可以讓開發比較簡單功能的Module時, 不須要準備 DebugCard與ROM Emulator/Burner, 提供一個克難的Debug/Trace 方法

當然在Leagcy BIOS code中, 這種手法也還是可以用的, 如果CMOS有剩更多空間的話, 實際上會比單用Port80 還方便的多!

廣告

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 / 變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 / 變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 / 變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 / 變更 )

連結到 %s

%d 位部落客按了讚: