pretty code

2021年12月14日 星期二

UEFI Network 相關 code 位置

最近在研究一個 Bug,實在很難找到實作的地方,今天中午正準備吃飯時,先找到了 error code 的定義,後來憑著 error code 也順利的找到了 TCP Recev 的位置,記錄一下,避免以後忘記。

我要找的值其實就是 104
#define EFI_CONNECTION_FIN      EFIERR (104)
#define EFI_CONNECTION_RESET    EFIERR (105)
#define EFI_CONNECTION_REFUSED  EFIERR (106)

StdLib\LibC\Uefi\select.c - select function
StdLib\LibC\Uefi\SysCalls.c - poll function -> StdLib\BsdSocketLib\poll.c - BslSocketPoll function

DEBUG Status
Status 都用 %r 印出較多,如果 index 有定義在 mStatusString 這個 Array,便會印出定義好的字串;如果沒有,其值就是一個 16 進位值。

Stdlib\EfiSocketLib\Socket.c
EslSocketRxStart 這支函數,在檢查 pPort->pSocket->RxError 如果發現有 error,其值可能是來自下面其中之一:

MdeModulePkg\Universal\Network\Tcp4Dxe\Tcp4Main.c - Tcp4Receive
MdeModulePkg\Universal\Network\Tcp4Dxe\SockInterface.c - SockRcv

順序是先 Tcp4Receive,裡面會再呼叫 SockRcv。

我先用 build -p MdeModulePkg\MdeModulePkg.dsc -a X64 -t VS2015x86,build 出我自己的 Tcp4Dxe.efi,過程中會出錯,那是因為我是整個 Module 全 build,故跑到最後可能因為設定問題會失敗,但不影響我要的檔案產出。

後來查了一下,也可以只 build Tcp4Dex.efi。
build -p MdeModulePkg\MdeModulePkg.dsc -m MdeModulePkg\Universal\Network\Tcp4Dxe\Tcp4Dxe.inf -a X64 -t VS2015x86

接著使用 drivers 找到系統內建的 Tcp4 Driver,查到第一個欄位 DRV 的值,接著使用 unload XX 去卸載它。

最後則是用 load Tcp4Dxe.efi 的方式載入我 build 出來的檔案。

這樣我就可以看到相關訊息,至少我找到了 EFI_CONNECTION_FIN  這個錯誤發生的地方了XD

沒有留言: