TOPPERS/ASP for CQ-STARMのバグ
TOPPERS/ASP 1.3.2 CQ-STARMの実装のバグを見つけました。結構致命的だと思いますが、これまで動いていたのは偶然でしょうか。あるいは、私の勘違いの可能性もあります。
TOPPERS/ASP 1.3.2 の簡易パッケージ版をダウンロードしてビルドしました。生成されたファイルの中から_kernel_istackの情報をプリントすると以下のようになります。
takemasa@volta:~/workspace/foo$ arm-none-eabi-readelf -s asp | grep ist 23: 20001a58 512 OBJECT LOCAL DEFAULT 3 _kernel_istack 217: 08005c48 4 OBJECT GLOBAL DEFAULT 2 _kernel_istk 290: 08004999 130 FUNC GLOBAL DEFAULT 1 istp_alm 368: 08005c44 4 OBJECT GLOBAL DEFAULT 2 _kernel_istksz 376: 08004af1 170 FUNC GLOBAL DEFAULT 1 ista_alm 401: 08005c4c 4 OBJECT GLOBAL DEFAULT 2 _kernel_istkpt takemasa@volta:~/workspace/foo$
_kernel_istackは非タスクコンテキスト用のスタックで、サイズは512バイトです。次に生成されたファイルをqemu-arm-staticにロードし、GDBで覗いてみました。CQ-STARM版では非タスクコンテキスト用スタックのトップが_kernel_vector_table[0]に格納されています。そこでその変数を覗いてみました。
(gdb) load Loading section .text, size 0x5838 lma 0x8000000 Loading section .rodata, size 0x10b0 lma 0x8005838 Start address 0x8000000, load size 26856 Transfer rate: 3746 KB/sec, 1790 bytes/write. (gdb) p _kernel_vector_table[0] $2 = (FP) 0x20002a58 (gdb)
最初の結果と2つめの結果を比べてみると、スタックトップはスタック領域の先頭から8kB離れています。スタックサイズは512バイトですから、明らかにこれは間違っています。
どうやらこれはターゲット非依存部にあるTOPPERS_ISTKPTマクロの問題のようです。
と、ここまで書いて気がつきましたが、これって最新版のターゲット非依存部では修正されていませんか?!
追記:TOPPERS/ASP 1.3.2で「非タスクコンテキスト用スタックの確保時のサイズの誤り」が修正されているそうです。
さらに追記:これ、CPU依存部のバグです。