===================================================================== ARM64プロセッサ依存部 Last Modified: '18/05/29 ===================================================================== (1) 対応しているターゲットシステムの種類・構成 ARM64依存部は,ARMv8-A アーキテクチャをターゲットとしている.ARMv8-A は 64ビットアーキテクチャであり命令セットレベルでもARMとは異なるため, ARM依存部と分けている. (2) 使用する開発環境と動作検証した条件(バージョン,オプション等) カーネルはGCCを用いてコンパイルする.動作確認したバージョンは各ターゲ ット依存部のドキュメントに記載する. (3) ターゲット定義事項の規定 (3-1) データ型に関する規定 データ型は arch/gcc/tool_stddef.h で定義されている内容で,float型と double型は,それぞれIEEE754準拠の単精度浮動小数点数と倍精度浮動小数点 数である. (3-2) 割込み処理に関する規定 ○割込みハンドラ番号と割込み番号の割当て,両者の対応 IRQ および FIQ をカーネル管理の割込みとする. 割込みハンドラ番号と割込み番号は,例外発生時にGICC_IAR にセットされる例外番 号を用いる.Generic Timer は27番で,割込みは0番からの番号が割り付けられ ている. ○割込み優先度の段階数(TMIN_INTPRIの値),その設定方法 割込み優先度の段階数は,ターゲット依存部毎に異なる. カーネル管理内の割込みの最高優先度(TMIN_INTPRI)はターゲット依存部で設定する. 各割込みの割込み優先度は,CFG_INT で TMIN_INTPRI 以上の値を指定する. ○dis_intとena_intのサポートの有無,その制限事項 dis_intとena_intをサポートする.制限事項は特にない. ○CFG_INTの制限事項と拡張(ターゲット定義で使用できる割込み属性) CFG_INTの制限事項はなく,ターゲット定義で使用可能な割込み属性は特にな い. ○カーネル管理外の割込み カーネル管理外の割込みはサポートしない. IRQ,FIQ共にカーネル管理の割込みとして扱う. (3-3) CPU例外処理に関する規定 ○CPU例外ハンドラ番号 ARMv8では,例外発生時の例外レベル(EL),使用スタック,実行状態(AArch32 or AArch64), 発生した例外の種類により,ジャンプ先となる例外ベクタ中のオフセットアドレスが異なる. CPU例外ハンドラはこのジャンプ先のオフセットアドレスで区別することにし, それぞれ異なるCPU例外ハンドラ番号を割り当てる. 例外発生時の状態 例外の種類 例外番号  例外ベクタ先頭からのオフセット AArch64, EL1t(EL1, SP_EL0) Synchronous 0 0x0000 AArch64, EL1t(EL1, SP_EL0) SError 1 0x0180 AArch64, EL1h(EL1, SP_EL1) Synchronous 2 0x0200 AArch64, EL1h(EL1, SP_EL1) SError 3 0x0380 AArch64, EL0 (EL0, SP_EL0) Synchronous 4 0x0400 AArch64, EL0 (EL0, SP_EL0) SError 5 0x0580 AArch32, EL0 (EL0, SP_EL0) Synchronous 6 0x0600 AArch32, EL0 (EL0, SP_EL0) SError 7 0x0780 (3-4) CPUロック・割込みロック CPUロックは,PSTATE.I および PSTATE.F を共に 1 にすることで実現する. カーネル管理外の割込みをサポートしないため,全割込みロックフラグも CPUロックと同様の実装である.ただし CPUロックフラグとは独立したフラグ として全割込みロックフラグをサポートする.具体的にはSIL_LOC_INT呼び出し 時にIおよびFフラグの状態を記憶しておき,SIL_UNL_INT で元の状態に 戻している. (3-5) 性能評価用システム時刻の参照に関する規定 get_utmをサポートしない. (3-6) スタートアップルーチンでの初期化内容 スタートアップルーチンが前提とするプロセッサの状態はプロセッサにより異なるため, スタートアップルーチンはターゲット依存部に配置している. 例としてQEMU VIRT ボードの場合は以下のようになっている. ・例外レベルは既定でEL1 ・使用スタックは(EL1の場合,) SP_EL1 ・起動直後はPSTATEのFおよびIは1(IRQ,FIQ禁止) スタートアップルーチンではスタックポインタの初期化,ベクタテーブルアドレスの設定, メモリの初期化などの必要な処理を行い,sta_ker を呼び出す. (4) タイマドライバ関連の情報 カーネルのタイムティックとして,Generic Timer を使用する, ティック周期は1msecとする. (5) ターゲット依存部での設定項目 ターゲット依存部では以下のマクロを定義する必要がある. ・TMAX_INTNO : 割込み番号の最大値(通常の割込み番号 + 15) ・TMIN_INTPRI : 割込み優先度の最小値(最高値) ・TIC_NUME : タイムティックの周期の分子 ・TIC_DENO : タイムティックの周期の分母 ・INTPRI_TIMER : タイマ割込み割込み優先度 ・INTATR_TIMER : タイマ割込みの割込み属性 ・DEFAULT_ISTKSZ : スタックサイズ(16byte単位で指定) (6) ディレクトリ構成・ファイル構成 ./arch/arm64/ ./MANIFEST ./Makefile.prc ./arm64.h ./gic_config.c ./gic_config.h ./gic_support.S ./prc_cfg1_out.h ./prc_check.trb ./prc_config.c ./prc_config.h ./prc_design.txt ./prc_kernel.h ./prc_kernel.trb ./prc_rename.def ./prc_rename.h ./prc_sil.h ./prc_stddef.h ./prc_support.S ./prc_sym.def ./prc_test.h ./prc_timer.c ./prc_timer.cfg ./prc_timer.h ./prc_unrename.h ./prc_user.txt (12) バージョン履歴 2018/05/30 ・最初のリリース