目次: OpenOCD
忘れてしまうので。RISC-Vの独自(もしくは標準に準拠しているものの新しすぎるなど)のCSR(Control and Status Register)を読み出す方法をメモしておきます。GDBでOpenOCDに接続しinfo reg (レジスタ名) とすると内容が読み出せます。
(gdb) info reg mscratch mepc mcause mtval mip mscratch 0x0 0 mepc 0x6000c580 1610663296 mcause 0xb 11 mtval 0x0 0 mip 0x880 2176
もう一つの方法としてCSRの番号指定でも読み出せます。csr(番号) という名前になります。番号は10進数で指定するようで、例えばmscratch (0x340) なら832になります。
(gdb) info reg csr832 csr833 csr834 csr835 csr836 csr832 0x0 0 csr833 0x6000c580 1610663296 csr834 0xb 11 csr835 0x0 0 csr836 0x880 2176
これだけだと名前がわかりにくいだけで特に嬉しくありませんが、これから紹介するOpenOCDの設定と組み合わせると任意のCSRが読み出せるようになって非常に便利です。
例としてNSITEXE NS31のRNMI CSR(mnscratch, mnepc, mncause, mnstatus(※))を読み出してみましょう。
書き起こしておくと0x740 mnscratch, 0x741 mnepc, 0x742 mncause, 0x744 mnstatus です。10進数ですと1856, 1857, 1858, 1860ですね。これらのCSRを読みだそうとしても、OpenOCD側が存在を認識していないためエラーになります。
(gdb) info reg csr1856 Invalid register `csr1856'
CSRを読むためにOpenOCDを書き換えて再ビルドして……では大変すぎます。そんなお困りごとをOpenOCDもわかっていて救済策が用意されています。
riscv expose_csrs 1856-1860
この一行を追加してもう一度試すと、
(gdb) info reg csr1856 csr1857 csr1858 csr1860 csr1856 0x0 0 csr1857 0x180188e 25172110 csr1858 0x80000000 -2147483648 csr1860 0x8 8
無事読み出すことができました。
(※)このレジスタは独自CSRではなくResumable NMIという規格で提案中のレジスタです。が、OpenOCDが未対応という意味では独自レジスタと同じなので、この例で取り上げました。
< | 2023 | > | ||||
<< | < | 06 | > | >> | ||
日 | 月 | 火 | 水 | 木 | 金 | 土 |
- | - | - | - | 1 | 2 | 3 |
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | - |
合計:
本日:
管理者: Katsuhiro Suzuki(katsuhiro( a t )katsuster.net)
This is Simple Diary 1.0
Copyright(C) Katsuhiro Suzuki 2006-2023.
Powered by PHP 8.2.15.
using GD bundled (2.1.0 compatible)(png support.)