ARMv7-A 版の問題点
v3.00.06A を使用して ARMv7-A の機種へ移植した際に見つけた問題点です。 ご確認いただければと思います。 取り込めるものを指定していただければ、develop からのブランチに構成し直します。
(1) 一時スタックサイズ変更 config/config.h: CNF_TMP_STACK_SIZE (256) → (2048) 一時スタックは、割込ハンドラ(TA_ASM 属性のハンドラ、アラームハンドラ、周期ハ ンドラ)で使用されるので、256 は少なすぎる。 割込ハンドラで使用されることを考慮し、CNF_EXC_STACK_SIZE と同じ 2048 とした。
(2) TCB_isstack の修正 kernel/knlinc/kernel.h: TCB.isstack kernel/sysdepend/cpu/core/armv7a/offset.h: TCB_isstack システム構成が変わることで TCB_isstack の値が不正となり、FPU のコンテキスト スイッチにより、メモリー破壊などが起きていた。 TCB 内の isstack の位置が、システム構成によって変化することの対応がなされて いなかった。 TCB 内で isstack より前にある WINFO はシステム構成によってサイズが変化する。 この影響を避けるため、isstack の位置を WINFO より前に移動した。
(3) EOI(End Of Interrupt)発行の修正 kernel/sysdepend/cpu/core/armv7a/exc_entry.S: irq_entry ・GICのレジスタアドレスは機種ごとに異なるため、固定値で定義されていたベース アドレス(GIC_ICC_BASE)を、機種ごとのヘッダに定義されているシンボル (GICC_BASE)を使うように変更した。 ・EOIRレジスタのCPUIDフィールド(bit 10-12)に対応した。 CPUIDに常に0を書き込んでいたが、IARレジスタから読み出した値をそのままEOIR レジスタに書き込むように変更した。 ・同様に、割込ハンドラでもEOI発行時にIARレジスタの値が必要になる場合があるた め、割込ハンドラにもIARレジスタの値を引き渡す(r1)ようにした。 kernel/sysdepend/cpu/core/armv7a/int_asm.S: knl_hll_inthdr knl_return_inthdr ・高級言語対応ルーチンでも、IARレジスタの値をユーザーの割込ハンドラに引き渡 すようにした。
(4) 未定義命令例外の復帰アドレス修正 kernel/sysdepend/cpu/core/armv7a/exc_entry.S: undef_entry 未定義命令例外による FPU のコンテキストスイッチが、Thumb 命令に対応していな かったので、対応するように修正。
(5) データアボートの復帰アドレス修正 kernel/sysdepend/cpu/core/armv7a/exc_entry.S: dabort_entry データアボート例外ハンドラで、復帰アドレスの補正値の誤りを訂正。
(6) インラインアセンブラの修正 kernel/sysdepend/cpu/core/armv7a/cpu_cntl.c: save_fpuctx() インラインアセンブラの記述方法が間違っており、コンパイラの最適化によって 意図しない誤ったコードになってしまうことがあった。 インラインアセンブラの記述方法を正した。処理内容的には変わりない。
(7) knl_tmp_stack 削除 kernel/sysdepend/cpu/core/armv7a/cpu_cntl.c: knl_tmp_stack[TMP_STACK_SIZE] どこからも使われていないので削除。