搜尋此網誌

2011年10月22日 星期六

EFI Shell commands -- MM(顯示或修改MEM/MMIO/IO/PCI/PCIE位址空間)

Displays or modifies MEM/MMIO/IO/PCI/PCIE address space.

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

27 則留言:

  1. 版主你好, 我想使用 mm 讀取一個 Bit 或是一個 Byte 作為條件, 以決定 Script File 是否可以執行下一行指令, 請問程式碼要怎麼寫 ?

    回覆刪除
    回覆
    1. \> edit test.nsh
      mm febffc00 -n
      mm febffc01 -n
      mm febffc02 -n
      mm febffc03 -n

      Press [F2] to save test.nsh file
      \> test.nsh

      刪除
    2. 你也可以使用:mem febffc00 10

      刪除
    3. 不好意思, 我不太了解你的範例, 也許是我說明得不好, 我的問題如下例 :

      fs0:\> mm 403 -IO -n
      IO 0x0000000000000403 : 0x01

      我想要自動讀回 0x01, 並檢查 bit 0 是否為 1,
      若是, 就執行 mm 410 5 -IO,
      若否, 就持續檢查 bit 0
      目標是用 Script File 執行以上程序

      我不是學軟體的工程師, 有幸在網路上看到版主的網路, 再麻煩你指導一下~

      刪除
    4. 在Script file中,mm指令中某些參數不能在Script下使用,例如:-IO, -PCI...。目前只能用系統默認值-MMIO,而且只有印的功能(mm febffc00 4 -n =>用4 bytes的格式去印febffc00的位址值 )。
      目前UEFI的Shell指令還沒有這麼活(還要搭配一些額外的應用程式),你或許可以選擇使用Linux Shell。

      刪除
  2. 我有找到可以用 -IO 的方法, 就是修改成 ;IO
    這樣就可以用於 Script 下了 ~
    供版主參考

    回覆刪除
    回覆
    1. 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

      刪除
  3. 另外, 目前我的環境只能用 EFI Shell, 不能用 Linux Shell
    感謝你的指導, 我再想看看 !

    回覆刪除
    回覆
    1. 找到一個方法你可以試試看。
      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

      刪除
    2. 接下來將str1.dat與t1.nsh放在同一個目錄,在執行\>t1.nsh

      刪除
    3. 範例t1.nsh少加最後一行echo -on

      刪除
  4. 作者已經移除這則留言。

    回覆刪除
  5. [EFI Shell User’s Guide ]
    http://ftp.jaist.ac.jp/pub/sourceforge/e/ef/efi-shell/documents/Shell_UserGuideRHelp7thOutputFinal2.pdf

    回覆刪除
  6. 有一個問題一直困擾我, 就是在 Win7 的電腦上, 複製版主你的檔案至 USB Flash, 但是在 EFI Shell 下卻看不到檔案, 我猜是因為 NTFS 及 FAT32 格式的問題. 我之前是重新 Key-in 的方式在 EFI 下建立檔案. 找過網路上的應用程式, 但是好像都必須把硬碟整個轉換為 NTFS 或是 FAT32, 可是我只想改一, 兩個 NTFS 檔案(str1.dat, t1.nsh) 為 FAT32, 想請問有沒有方法可以解決這個問題呢 ?

    回覆刪除
    回覆
    1. 這應該是ASC II與Unide code的問題。只要用開啟Notepad(記事本),將它存成純文字檔(ASC ii),就可以被看的到,在UEFI下。

      刪除
  7. UEFI只支援FAT32,16檔案系統格式,在UEFI Shell下,NTFS的磁碟內容應該看不到。簡單的方式,重新格式化你的USB Disk,使用FAT32或FAT16的格式。

    回覆刪除
  8. 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

    回覆刪除
    回覆
    1. [echo "^"" >> 1.nsh]這行可加可不加,因為[mm 403 ;IO -n >> 1.nsh]這行一定會有換行符號加進檔案裡,所以警告訊息一定會有(除非有什麼指令可以把這個換行符號移除),不過這個script file還是可以用。
      你可以在[set string1 "IO 0x0000000000000403 : 0x01"]下面再加一行set test去印目前IO 403目前的值。
      如果你想要它自動化,只要把pause移除即可。

      刪除
  9. 如果不加 echo "^"" >> 1.nsh 這一行, 是真的可以執行無誤, 若果我之後有發現方法可以將 " 加在那一行的後面, 再告知版主. 謝謝 !

    回覆刪除
  10. 請問一下我要做幾個動作寫成shell script , 應該怎麼寫?
    1.write mmio E00000d8 as 00000002
    2.write mmio E00000d0 as 100102F0
    3.read mmio E00000D4

    回覆刪除
    回覆
    1. 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

      刪除
  11. 請問一下我要做幾個動作寫成shell script , 應該怎麼寫?
    1.write mmio E00000d8 as 00000002
    2.write mmio E00000d0 as 100102F0
    3.read mmio E00000D4

    回覆刪除
    回覆
    1. 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

      刪除