スタートアップのバグ

CPU依存部のstart.asmにある、start: コード(リセット時に最初に実行されるコード)にバグがありました。現在、当該コードはこうなっています。

task_level:                     // ここからタスクの実行順位
    [--sp] = reti;              // 戻り番地を捨てて割り込み可能にする
    jump _kernel_start;
user:
#ifdef INIT_C_PLUS_PLUS
    call.x ___ctorloop;
#endif
    jump	user;
start.end:

まず、このコードでは___ctorloopが決して呼ばれません。user:ラベルはダミーで、このコードの上方にあるrtiから飛んでくるのですが、遅延割込みがかかって直ちにtask_level:に制御が移ります。したがって、場所が適切ではありません。また、_kernel_startにジャンプする前にスタックに予約領域を取っていません。これはkernel_start()関数をデバッグ・オプションでコンパイルした場合、スタックの上の領域が破壊される可能性があります。
正しくはいかのようにあるべきです。

task_level:                     // ここからタスクの実行順位
    sp += -12;
#ifdef INIT_C_PLUS_PLUS
    r0 = 0;
    r1 = 0;
    call.x ___ctorloop;
#endif
    [--sp] = reti;             // 戻り番地を捨てて割り込み可能にする
    jump _kernel_start;
user:
	jump	user;
start.end:

___ctorloopが呼ばれていなかったにもかかわらず、C++のプログラムが動いていたのは不可解です。すこし調査をして見ます。