小華的部落格

bloggerads_Head

搜尋此網誌

星期一, 1月 15, 2018

紀錄一下WinDbg裡面比較常用到的指令集

AMLI裡面比較常用到的指令集

AMLI(? for help)-> ?
?

Help                     - ? [<Cmd>]
Clear Breakpoints        - bc <bp list> | *
Disable Breakpoints      - bd <bp list> | *
Enable Breakpoints       - be <bp list> | *
List Breakpoints         - bl
Set Breakpoints          - bp <MethodName> | <CodeAddr> ...
Clear Event Log          - cl
Dump Event Log           - dl
Dump Object Count Table  - dc
Dump Heap                - dh [<Addr>]
Dump Stack               - ds [/v] [<Addr>]
Dump Name Space Object   - dns [[/s] [<NameStr> | <Addr>]]
Dump Data Object         - do <Addr>
Find NameSpace Object    - find <NameSeg>
Continue Execution       - g
Read Byte from Port      - i <Port>
Read Word from Port      - iw <Port>
Read DWord from Port     - id <Port>
List All Contexts        - lc
Display Nearest Method   - ln [<MethodName> | <CodeAddr>]
Notify NameSpace Object  - notify <Obj> <Value>
Write Byte to Port       - o <Port> <Byte>
Write Word to Port       - ow <Port> <Word>
Write DWord to Port      - od <Port> <DWord>
Step Over AML Code       - p
Quit to Kernel Debugger  - q
Display Context Info.    - r <Context>
Run Method               - run <MethodName> | <CodeAddr> [<ArgList>]
Set Debugger Options     - set [traceon | traceoff] [nesttraceon | nesttraceoff] [spewon | spewoff]
                               [dbgbrkon | dbgbrkoff] [lbrkon | lbrkoff] [errbrkon | errbrkoff] 
                               [verboseon | verboseoff] [logon | logoff] [logmuton | logmutoff] 
Trace Into AML Code      - t
Interpreter Trace Mode   - trace [trigon] [trigoff] [level=<n>]
                                 [add=<TrigPtStr] [zap=<TrigPtList>]
Unassemble AML code      - u [<MethodName> | <CodeAddr>]


AMLI(? for help)-> 

ACPI 裡面比較常用到的指令集
!acpicache displays all of the ACPI tables cached by the hardware application layer (HAL)

!acpiinf displays information on the configuration of the ACPI

!acpiirqarb displays the contents of the ACPI IRQ arbiter structure

!facs displays a Firmware ACPI Control Structure

!fadt displays a Fixed ACPI Description Table

!mapic displays an ACPI Multiple APIC Table

!nsobj displays an ACPI namespace object

!nstree displays a section of the ACPI namespace tree


!rsdt displays the ACPI Root System Description Table

!acpikd.help  For a complete list of ACPI-related extensions.

Reference
https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/acpi-debugging

星期三, 1月 10, 2018

如何透過DevCon.exe 去開跟關你的Device Manager內的設備


如何透過DevCon.exe 去開跟關你的Device Manager內的設備


  當你安裝WDK, Visual Studio 或是Windows SDK時,這些安裝檔裡面就會包含DevCon.exe。
 
  我的DevCon.exe是在底下這個路徑內找到的:

     C:\Program Files (x86)\Windows Kits\10\Tools\x64\DevCon.exe

 當然,如果你想要自己Build source code的話,你也可以從底下的路徑找到這個source code:

    https://github.com/Microsoft/Windows-driver-samples/tree/master/setup/devcon

我自己也用VS2013 成功建構出來這個執行檔,只是有個小地方要注意,就是你build code之前,要用command prompt(Build environment)先執行底下的指令,先把msg.h 建立出來,不然你沒辦法用專案檔案去compiler , 因為會出現會找不到msg.h的ERROR.

   C:\DevCon >  mc msg.mc   會產生msg.h

底下就是一些基本的指令操作:

1)先找你要開關的Device的HWID(我是存到一個文字檔慢慢找):
devcon hwids * > D:\hwids.txt  

2) 使用底下指令去disable , 記得在HW ID前面加@
devcon /r disable "@ACPI\DELL0812\3&31FF937C&0"

3) 使用底下指令去enable, 記得在HW ID前面加@,然後HWID要用" "包起來.
devcon /r enable "@ACPI\DELL0812\3&31FF937C&0"

4) 使用底下指令去重新scan hardware
devcon rescan

5) 使用底下指令可以做重新開機動作

devcon reboot

至於其他跟寫driver時會用到的指令功能,大家就看底下微軟的詳細說明囉~

Reference
https://docs.microsoft.com/en-us/windows-hardware/drivers/devtest/devcon-examples


星期二, 11月 01, 2016

ACPICA Programmer Reference Guide


隨手記錄ㄧ下AE_NOT_FOUND 出現的ㄧ些原因.

AE_NOT_FOUND : The name was not found in the namespace
AE_NOT_FOUND : A valid RSDP could not be located.
AE_NOT_FOUND : There is no table with this Signature currently loaded, or the table of the specified Instance is not loaded.

AE_NOT_FOUND : The object referenced by the combination of the Object and Pathname was not found within the namespace.

AE_NOT_FOUND: The child object parameter is the last object of the given type within the parent — a next child object was not found. If Child is NULL, this exception means that the parent object has no children.

AE_NOT_FOUND: One or more of the segments of the pathname refers to a non-existent object.

AE_NOT_FOUND: A valid ACPI table was not found at the specified Address.

AE_NOT_FOUND: An ACPI table with Signature was not found.

範例:
ACPI Error: Method parse/execution failed [\_SB.PCI0.LPCB.ECDV.ECIN] (Node 008E3F28), AE_NOT_FOUND (20160930/psparse-632)
ACPI Error: Method parse/execution failed [\_SB.PCI0.LPCB.ECDV._REG] (Node 008E3F70), AE_NOT_FOUND (20160930/psparse-632)
ACPI Error: Method parse/execution failed [\_SB.PCI0._INI] (Node 008D5790), AE_NOT_FOUND (20160930/psparse-632)
ACPI Error: Method parse/execution failed [\ALSD._STA] (Node 008DD4C8), AE_NOT_FOUND (20160930/psparse-632)




星期五, 2月 19, 2016

不進步就是退步


     
     
     -- 以下並非以偏概全,純屬個人工作體驗  --

     幾年前加入了一家日商公司,原本抱持著可以跟世界上製作第一台NB的公司裡的業界前輩學習更深入的BIOS知識,但發現事實是殘酷的,經過了多年後的改變,那邊慢慢的研發精神已經沒有那麼積極了,我不會說這家公司很糟,因為還是有很多日本/台灣/大陸/其他Region同事還是努力的在做事情,但是一家公司的文化卻讓肯做事情的人事情越做越多,不肯做事情/事情做不好的人越做越少,乃至於冗員就越來越多,聊八卦破壞團隊精神的人就多(做不好不會被裁員)。

     而開發的方面,日商還是擁有許多比較封閉的開發方式,而「閉門造車」或許有其好處也有相對的壞處,而在一個世界潮流改變很快速的地方,如果不能一直學習成長,那就只能讓人超車。

     因此,幾經嘗試改變周遭同事態度失敗和思考之後,我決定離開那些負面思考/消極態度的同事以及封閉的開發方式的環境,以避免個人養老心態的產生和負面心態的養成。所以在去年所以我選擇加入了另一家外商公司,開始學習不一樣領域的知識,並繼續讓自己保持正向的思考與競爭力。

     然而,在這個新的工作領域中,我的工作內容暫時不需要自己去寫程式,雖然暫時放棄的寫程式的機會,但是我卻多了許多的機會去接觸不同的人事物,並讓自己反省過去到底浪費的多少生命在ㄧ些「不必要的人事物」 上面。

     然而「不進步就是退步」,在最近看到ㄧ些前日商台灣同事連被詢問留下機會都沒有,就被直接裁員,最近才在找工作,心中更是感概萬千。

    雖然很想幫忙,但面對到友情/現實時,我們也只能選擇性幫忙。畢竟社會是現實的,冗員與戰力你只能選擇有戰力的幫忙,否則接納到冗員的公司也只能自求多福了。
       
     所以,在世界競爭激烈的環境之下,唯有自己持續進步,在遇到這種公司關閉/退出市場或是裁員時,我們才能在裡面繼續生存下去。
                                                                                                                                      2016.02 Harrison


星期一, 2月 23, 2015

Compiler intrinsics(內建函數)

EDK2 中開/關VC++內建函數的方式

平常如果你使用Compiler /Oi 選項時,Compiler自己遇到內建函數時會自己去產生CODE到你的程式碼之中,如果你想要自己寫這些內建函數時,就必須要用/Oi- 去關閉他,以免被當成內建函數而出現Compiler error訊息。

例如,我想在我自己的xxx.c 中自己實作一個 ceil() 函數,那你可以透過EDK2 build option override方式在xxx.dsc 中來對你的xxx.inf 設定Compiler option,他只會影響你的xxx.inf。

$(MY_PATH)\xxx.inf {
  <BuildOptions>
    *_*_X64_CC_FLAGS = /Oi-
}


星期四, 12月 25, 2014

開啟CMD.EXE並一次執行多個DOS指令的方式(Command Prompt and Batch file)

這篇文章是分享如何開啟CMD.EXE時並一次執行多個DOS指令的方式。

為什麼要分享這個冷知識?
因為現在是冬天了,所以很冷。

好吧,我承認這是個很無聊的一篇文章,大家就將就點看吧 :)

首先呢,我們都知道Command Prompt 是執行CMD.EXE後就會產生出來的一個畫面,那我們能不能寫個批次檔去執行CMD.EXE又可以執行很多筆指令呢? 答案是可以的,做法就是寫個批次檔,然後透過"雙引號"去把所有指令包起來,指令跟指令中間加入 && 就可以了:


   CMD.EXE  "指令1 && 指令2 && 指令3....&&指令n"

底下就是兩個批次檔的範例,批次檔內會去執行簡單的DOS指令,執行完畢後會出現一個Command Prompt停在那邊。





那大家可能會好奇我用在哪裡? 因為我使用SlickEdit 去編寫BIOS CODE,因為懶惰,所以想說我只要開啟 BUILD TIP底下任何一個檔案,然後按個鈕,我就可以進入到工作目錄並且設定好Visual Studio 的環境讓我可以直接Compiler code....就醬~




※ 上圖可以看到我在SlickEdit 內開啟了一個檔案,叫做NT32Pkg.dsc ,然後我設定了兩個快捷鈕,這兩個快捷鈕可以讓我選擇設定VS2012/VS2010的環境,按下去之後他會幫我呼叫設定環境的批次檔,環境設定好之後會直接幫我進入到NT32Pkg.dsc 目錄(E:\UDK2014.SP1\NT32Pkg),然後我就可以很方便地在Command Prompt內做我要做的事情了。

底下是我在那兩個快捷鍵內的設定值,有分成CMD.EXE的設定方式跟BATCH的方式,差別就只是在於呼叫CMD.EXE去做事情還是自己寫個批次檔,然後呼叫那個批次檔而已。

CMD.EXE的方式:
cmd /E:ON /V:ON /k  ""C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\Tools\VsDevCmd.bat" && cd/d "%f\..""


BATCH FILE的方式(除了描述在快捷鈕之外,要多寫一個批次檔):
"C:\Apps\TEST.bat" %f

TEST.bat的內容:
@ECHO OFF
CALL "C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\Tools\VsDevCmd.bat"
cd/d "%1\.."
CMD.EXE 

上述中的%f 是SlickEdit內的參數,%f = 目前檔案的完整路徑。
以上面的範例來說:

    %f   = e:\UDK2014.SP1\Nt32Pkg\Nt32Pkg
 
最後,我承認科技使用來自於人的惰性,不然也不會有這個冷知識可以分享,哈~


星期二, 12月 23, 2014

Intel® UEFI Development Kit Debugger Tool (Intel UDK Debugger and OVMFPkg)

這篇文章是紀錄我自己架設 QEMU + OVMF + Intel UDK + WinDbg 環境的筆記。

QEMU : 他是一個Open Source的處理器仿真器與模擬器。
http://wiki.qemu.org/Main_Page
   
OVMF : 他是一個UEFI EDK2 codebase裡面的一個專案,用來讓UEFI BIOS可以跑在虛擬機器(Virtual Machine)上面,在這裡的範例就是跑在QEMU裡面。
http://tianocore.github.io/ovmf/

Intel UDK Debugger : 這是INTEL開發的一個Source Level Debugger,他需要配合WinDbg(微軟提供的)才能做除錯的動作。

Intel Uefi Development Kit Debugger Tool

下面這張圖是我實際的架設環境,我在Windows 8.1裡面安裝了Intel UDK跟WinDbg然後透過虛擬的COM Port來與 QEMU裡面的BIOS.BIN(OVMF.FD)溝通。


安裝與設定(Install and Setup)

STEP1 : Download UDK2014.SP1 ,OvmfPkg and OptionRomPkg

我是把它們一起放在E:\UDK2014.SP1; 然後先準備好Compiler環境,並產生OVMF.FD. (環境的部分請參考UDK2014與OVMF的說明)。

確定Compiler 環境沒問題後,跟隨下面步驟來產生UEFI BIOS ROM。

1).先產生 OVMF.FD
   a. E:\UDK2014.SP1>edksetup.bat
   b. E:\UDK2014.SP1>build -DDEBUG_ON_SERIAL_PORT=TRUE -DSOURCE_DEBUG_ENABLE

2). 在把OVMF.FD複製一份,並修改檔案名稱為bios.bin (rename)
   (我是放在 E:\UDK2014.SP1\Build\Ovmf3264\DEBUG_VS2012x86\FV\bios.bin)
    a.E:\UDK2014.SP1> cd E:\UDK2014.SP1\Build\Ovmf3264\DEBUG_VS2012x86\FV
    b.E:\UDK2014.SP1\Build\Ovmf3264\DEBUG_VS2012x86\FV> copy OVMF.FD bios.bin

STEP2: 安裝(Install) WinDbg 
STEP3: 安裝Virtual Serial Port,你可以選擇Com0Com或是VSPD(Virtual Serial Port Driver),因為Com0Com 是免費(Free),另一個要破解(VSPD v7.2),所以我這邊就只介紹Com0Com 就好,破解版的我就自己知道就好這邊就不介紹了。

1) 先執行一個Cmd.exe with Admin (管理者權限)
   bcdedit -set TESTSIGNING ON
2)重新開機 (Reboot)
3) 安裝Com0Com 2.2.2.0 (For Windows 8.1/Win7 x64 bit) 

4) 執行 "C:\Program Files (x86)\com0com\setupc.exe",並在畫面中輸入下面指令:

    Command > Install PortName=COM6 PortName=COM7

5) 確認設備管理員(Device Manager)內有成功安裝driver,並且No yellow bang.


STEP4: 安裝(Install) Intel UDK v1.4 
※如果你是Windows 8.1 ,請設定相容性=Windows 7 (Compatibility mode=Windows 7)
 

1) 安裝過程中會指定WinDbg安裝目錄跟COM port Number,你也可以安裝完畢後,再去修改他的設定檔案(Config File):

"C:\Program Files (x86)\Intel\Intel(R) UEFI Development Kit Debugger Tool\SoftDebugger.ini"
  
底下是我實作時候的設定:
COM6 = Intel UDK
COM7 = QEMU

2) 安裝後,修改SoftDebugger.ini 加入以及修改底下的描述(RED COLOR)
"C:\Program Files (x86)\Intel\Intel(R) UEFI Development Kit Debugger Tool\SoftDebugger.ini"
[Debug]
Debug=1

[Debug Port]
Channel = Serial
Port = COM6
FlowControl = 0   
BaudRate = 115200
Server = 

STEP5:  執行Intel UDK Debugger,他會叫出WinDbg
STEP6: 執行QEMU 並且載入UEFI BIOS (Load BIOS.bin)

E:\UDK2014.SP1\Build\Ovmf3264\DEBUG_VS2012x86\FV>"C:\Program Files\qemu\qemu-system-x86_64.exe" -L . -serial COM7



如果有不清楚的部分,可以參考INTEL相關資料。