MM Address [Value] [-w 1|2|4|8] [-MEM | -MMIO | -IO | -PCI | -PCIE] [-n]
Address - Starting address
Value - The value to write
-MEM - Memory Address type
-MMIO - Memory Mapped IO Address type
-IO - IO Address type
-PCI - PCI Configuration Space Address type:
Address format: 0x000000ssbbddffrr
ss - Segment
bb - Bus
dd - Device
ff - Function
rr - Register
-PCIE - PCIE Configuration Space Address type:
Address format: 0x00000ssbbddffrrr
ss - Segment
bb - Bus
dd - Device
ff - Function
rrr - Register
-w - Unit size accessed in bytes:
1 - 1 byte
2 - 2 bytes
4 - 4 bytes
8 - 8 bytes
-n - Non-interactive mode
Note:
1. If the address type parameter is not specified, address type defaults
to the 'MEM' type.
2. If the 'Value' parameter is specified, the '-n' option will be used
automatically. In this case, this command will write the value to the
specified address in non-interactive mode. If the 'Value' parameter is
not specified, only the current contents in the address are displayed.
3. If the '-w' option is not specified, unit size defaults to 1 byte.
4. If the PCI address type is specified, the 'Address' parameter should
follow the PCI Configuration Space Address format above. The 'PCI'
command can be used to determine the address for a specified device.
It is listed in the PCI configuration space dump information, in the
following format: "[EFI 0x000000ssbbddffxx]".
5. If the PCIE address type is specified, the 'Address' parameter should
follow the PCIE Configuration Space Address format above.
6. In interactive mode, type a hex value to modify, 'q' or '.' to exit.
If the '-n' option is specified, it will run in non-interactive mode
which supports batch file operation without user intervention.
7. Not all PCI configuration register locations are writable.
8. MM will only write the specified value. Read-modify-write operations
are not supported.
9. The 'Address' parameter should be aligned on a boundary of the
specified width.
10. Not all addresses are safe to access. Access to any improper address
can bring unexpected results.
Examples:
* To display or modify memory:
Address 0x1b07288, default width=1 byte:
fs0:\> mm 1b07288
MEM 0x0000000001B07288 : 0x6D >
MEM 0x0000000001B07289 : 0x6D >
MEM 0x0000000001B0728A : 0x61 > 80
MEM 0x0000000001B0728B : 0x70 > q
fs0:\> mm 1b07288
MEM 0x0000000001B07288 : 0x6D >
MEM 0x0000000001B07289 : 0x6D >
MEM 0x0000000001B0728A : 0x80 > *Modified
MEM 0x0000000001B0728B : 0x70 > q
* To modify memory:
Address 0x1b07288, width = 2 bytes:
Shell> mm 1b07288 -w 2
MEM 0x0000000001B07288 : 0x6D6D >
MEM 0x0000000001B0728A : 0x7061 > 55aa
MEM 0x0000000001B0728C : 0x358C > q
Shell> mm 1b07288 -w 2
MEM 0x0000000001B07288 : 0x6D6D >
MEM 0x0000000001B0728A : 0x55AA > *Modified
MEM 0x0000000001B0728C : 0x358C > q
* To display IO space:
Address 80h, width = 4 bytes:
Shell> mm 80 -w 4 -IO
IO 0x0000000000000080 : 0x000000FE >
IO 0x0000000000000084 : 0x00FF5E6D > q
* To modify IO space using non-interactive mode:
Shell> mm 80 52 -w 1 -IO
Shell> mm 80 -w 1 -IO
IO 0x0000000000000080 : 0x52 > FE *Modified
IO 0x0000000000000081 : 0xFF >
IO 0x0000000000000082 : 0x00 >
IO 0x0000000000000083 : 0x00 >
IO 0x0000000000000084 : 0x6D >
IO 0x0000000000000085 : 0x5E >
IO 0x0000000000000086 : 0xFF >
IO 0x0000000000000087 : 0x00 > q
* To display PCI configuration space, ss=00, bb=00, dd=00, ff=00, rr=00:
Shell> mm 0000000000 -PCI
PCI 0x0000000000000000 : 0x86 >
PCI 0x0000000000000001 : 0x80 >
PCI 0x0000000000000002 : 0x30 >
PCI 0x0000000000000003 : 0x11 >
PCI 0x0000000000000004 : 0x06 >
PCI 0x0000000000000005 : 0x00 > q
* These contents can also be displayed by 'PCI 00 00 00'.
* To display PCIE configuration space, ss=00, bb=06, dd=00, ff=00, rrr=000:
Shell> mm 00060000000 -PCIE
PCIE 0x0000000060000000 : 0xAB >
PCIE 0x0000000060000001 : 0x11 >
PCIE 0x0000000060000002 : 0x61 >
PCIE 0x0000000060000003 : 0x43 >
PCIE 0x0000000060000004 : 0x00 > q
版主你好, 我想使用 mm 讀取一個 Bit 或是一個 Byte 作為條件, 以決定 Script File 是否可以執行下一行指令, 請問程式碼要怎麼寫 ?
回覆刪除\> edit test.nsh
刪除mm febffc00 -n
mm febffc01 -n
mm febffc02 -n
mm febffc03 -n
Press [F2] to save test.nsh file
\> test.nsh
你也可以使用:mem febffc00 10
刪除不好意思, 我不太了解你的範例, 也許是我說明得不好, 我的問題如下例 :
刪除fs0:\> mm 403 -IO -n
IO 0x0000000000000403 : 0x01
我想要自動讀回 0x01, 並檢查 bit 0 是否為 1,
若是, 就執行 mm 410 5 -IO,
若否, 就持續檢查 bit 0
目標是用 Script File 執行以上程序
我不是學軟體的工程師, 有幸在網路上看到版主的網路, 再麻煩你指導一下~
在Script file中,mm指令中某些參數不能在Script下使用,例如:-IO, -PCI...。目前只能用系統默認值-MMIO,而且只有印的功能(mm febffc00 4 -n =>用4 bytes的格式去印febffc00的位址值 )。
刪除目前UEFI的Shell指令還沒有這麼活(還要搭配一些額外的應用程式),你或許可以選擇使用Linux Shell。
我有找到可以用 -IO 的方法, 就是修改成 ;IO
回覆刪除這樣就可以用於 Script 下了 ~
供版主參考
For Shell Mode 1.1.1:
刪除MM Address [Width] [;[MEM | MMIO | IO | PCI]] [:Value]
1|2|4|8 supported byte widths - Default is 1 byte.
;MEM = Memory,
;MMIO = Memory Mapped IO,
;IO = in/out,
;PCI = PCI Config space (format: 000000ssbbddffrr)
Default access type is memory (MEM)
For Shell Mode 1.1.2:
MM Address [Width] [-[MEM | MMIO | IO | PCI | PCIE]] [:Value]
1|2|4|8 supported byte widths - Default is 1 byte.
-MEM = Memory,
-MMIO = Memory Mapped IO,
-IO = in/out,
-PCI = PCI Config space (format: 000000ssbbddffrr)
-PCIE = PCIE Config space (format: 000000ssbbddffrrr)
Default access type is memory (MEM)
所以在UEFI Shell Script:
[Write] mm 410 02 ;IO :05 -n ==> IO Port=410, byte widths=2 bytes, mode=IO, Value=05
[Read] mm 403 02 ;IO -n ==> IO Port=410, byte widths=2 bytes, mode=IO
我試了許多方法都無法取出判斷變數
mm 403 01 ;IO -n > 1.txt
\>type 1.txt
IO 0x0000000000000403 : 0x02
另外, 目前我的環境只能用 EFI Shell, 不能用 Linux Shell
回覆刪除感謝你的指導, 我再想看看 !
找到一個方法你可以試試看。
刪除set test "不能換行(包含這個雙引號),存到檔案str1.dat
並再開啟一個檔案t1.nsh,其內容如下:
echo -off
for %a run (0 100)
echo "count="%a%
pause
cp str1.dat 1.nsh -q
mm 403 ;IO -n >> 1.nsh
echo "^"" >> 1.nsh
1.nsh
set string1 "IO 0x0000000000000403 : 0x01"
if "%string1%" == "%test%" then
mm 410 ;IO :5 -n
mm 410 ;IO -n
goto end
endif
del 1.nsh -q
endfor
:end
set -d string1
set -d test
接下來將str1.dat與t1.nsh放在同一個目錄,在執行\>t1.nsh
刪除範例t1.nsh少加最後一行echo -on
刪除作者已經移除這則留言。
回覆刪除作者已經移除這則留言。
刪除作者已經移除這則留言。
刪除[EFI Shell User’s Guide ]
回覆刪除http://ftp.jaist.ac.jp/pub/sourceforge/e/ef/efi-shell/documents/Shell_UserGuideRHelp7thOutputFinal2.pdf
我會試看看 ~ 感謝 !
回覆刪除有一個問題一直困擾我, 就是在 Win7 的電腦上, 複製版主你的檔案至 USB Flash, 但是在 EFI Shell 下卻看不到檔案, 我猜是因為 NTFS 及 FAT32 格式的問題. 我之前是重新 Key-in 的方式在 EFI 下建立檔案. 找過網路上的應用程式, 但是好像都必須把硬碟整個轉換為 NTFS 或是 FAT32, 可是我只想改一, 兩個 NTFS 檔案(str1.dat, t1.nsh) 為 FAT32, 想請問有沒有方法可以解決這個問題呢 ?
回覆刪除這應該是ASC II與Unide code的問題。只要用開啟Notepad(記事本),將它存成純文字檔(ASC ii),就可以被看的到,在UEFI下。
刪除UEFI只支援FAT32,16檔案系統格式,在UEFI Shell下,NTFS的磁碟內容應該看不到。簡單的方式,重新格式化你的USB Disk,使用FAT32或FAT16的格式。
回覆刪除echo -off
回覆刪除for %a run (0 100)
echo "count="%a%
pause
cp str1.dat 1.nsh -q
mm 403 ;IO -n >> 1.nsh
echo "^"" >> 1.nsh
執行到這一行時, 這一個最後的雙引號會跑到下一行, 造成無法 set variable
[echo "^"" >> 1.nsh]這行可加可不加,因為[mm 403 ;IO -n >> 1.nsh]這行一定會有換行符號加進檔案裡,所以警告訊息一定會有(除非有什麼指令可以把這個換行符號移除),不過這個script file還是可以用。
刪除你可以在[set string1 "IO 0x0000000000000403 : 0x01"]下面再加一行set test去印目前IO 403目前的值。
如果你想要它自動化,只要把pause移除即可。
Thanks, I will try try ~
回覆刪除如果不加 echo "^"" >> 1.nsh 這一行, 是真的可以執行無誤, 若果我之後有發現方法可以將 " 加在那一行的後面, 再告知版主. 謝謝 !
回覆刪除請問一下我要做幾個動作寫成shell script , 應該怎麼寫?
回覆刪除1.write mmio E00000d8 as 00000002
2.write mmio E00000d0 as 100102F0
3.read mmio E00000D4
MM Address [Value] [-w 1|2|4|8] [-MEM | -MMIO | -IO | -PCI | -PCIE] [-n]
刪除Example:
\> edit test.nsh
mm e00000d8 00000002 ;MMIO -n
mm E00000d0 100102F0 ;MMIO -n
mm E00000D4 ;MMIO -n
請問一下我要做幾個動作寫成shell script , 應該怎麼寫?
回覆刪除1.write mmio E00000d8 as 00000002
2.write mmio E00000d0 as 100102F0
3.read mmio E00000D4
MM Address [Value] [-w 1|2|4|8] [-MEM | -MMIO | -IO | -PCI | -PCIE] [-n]
刪除Example:
\> edit test.nsh
mm e00000d8 00000002 ;MMIO -n
mm E00000d0 100102F0 ;MMIO -n
mm E00000D4 ;MMIO -n