書籍の補足情報

書籍の内容について,出版後に気がついた点などをその都度追記していきます.

■ 誤記など

■ cross-gcc494-v1.0 でのAArch64の不備について (2018/02/08)

シミュレータ動作のためのサンプルプログラムで, AArch64のスタックポインタ設定に不備があることが判明しました.

対象となるのは,以下の3つのファイルです.

cross-gcc494/exec/lib-aarch64-elf.S
cross2-gcc494/exec/lib-aarch64-elf.S
cross2-gcc494/printf/lib-aarch64-elf.S

上記3つのファイル中にスタートアップがあり,スタックポインタを初期化している 部分があります(以下).ここで _estack の値は .long で定義されており, 32ビット値になっています.しかしAArch64は64ビット・アーキテクチャで スタックポインタも64ビットのため,ここから値をロードしようとしたときに, 後続の4バイトも含めた64ビット値としてロードしてしまい,スタックポインタの 上位32ビット値が不定になってしまうようです.(スタックポインタがとんでもなく 大きな値となり,スタック操作している箇所で動作がおかしくなったりします)

        .globl  _start
        .type   _start, %function
_start:
        ldr     x0, _stack_addr
...
        .align 4
_stack_addr:
        .long   _estack
配布している cross-gcc494-v1.0 のコンパイル済みモジュール(aarch64-elf.x)では, 上記対象となる3つとも,たまたま後続の4バイトがオールゼロになっているため 実害は起きませんが,モジュールを再生成したりすると構成が変化して問題が起きる かもしれません.

正しくは,以下のようにして .quad を使って8バイト値として定義するようにします. (アラインメントも8バイトにします)

        .align 8
_stack_addr:
        .quad   _estack

■ cross-gcc494-v1.0 でのMSP430の不備について (2018/11/29)

gcc-4.9.4のビルドで,MSP430に不備があることが判明しました.

環境によって,ビルド時に以下のエラーが発生します.

../../../../toolchain/gcc-4.9.4/gcc/config/msp430/msp430.c:1632:24: error: unable to find string literal operator 'operator""N' with 'const char [10]', 'unsigned int' arguments
 #define CSH(N,C,X,G) { "__mspabi_"N, C, X, gen_##G }

上記箇所の #define の定義で,文字列の連結のために文字列リテラルと変数Nが 密着している点がまずいようです.

以下の修正をすることで,ビルド時のエラーを回避できます.

--- gcc/config/msp430/msp430.c.orig	2014-05-21 01:49:40.000000000 +0900
+++ gcc/config/msp430/msp430.c	2018-11-29 00:07:02.843725000 +0900
@@ -1629,7 +1629,11 @@
 }
   const_shift_helpers[] =
 {
+#if 0
 #define CSH(N,C,X,G) { "__mspabi_"N, C, X, gen_##G }
+#else
+#define CSH(N,C,X,G) { "__mspabi_" N, C, X, gen_##G }
+#endif
 
   CSH ("slli", 1, 1, slli_1),
   CSH ("slll", 1, 1, slll_1),

■ cross-gcc494-v1.0 でのMSP430の不備について (2018/12/24)

シミュレータ動作のためのサンプルプログラムで, MSP430のスタックポインタ設定に不備があることが判明しました.

対象となるのは,以下の3つのファイルです.

cross-gcc494/exec/lib-msp430-elf.S
cross2-gcc494/exec/lib-msp430-elf.S
cross2-gcc494/printf/lib-msp430-elf.S

実行開始時にスタックポインタ設定が初期化されておらずゼロとなってしまうため, その後のスタックフレームの獲得によるスタックポインタの減算でゼロで折り返され 0xFFF.. のような値になり,その後にスタックフレームより後のアドレスに アクセスできません.(アドレスの折り返しが起きるため)

以下の修正をすることで,正常に設定されます.

@@ -16,7 +16,7 @@
        .globl  _start
        .type   _start, @function
 _start:
-       mov     _estack, r1
+       mova    #_estack, r1
        calla   #main

メールは kozos(アットマーク)kozos.jp まで