

コンテキストは、日本語では「文脈」としばしば訳されますが、ここではある時点のシステムの内部状態、あるいはその内部状態を格納したデータ (構造体)を指します。通常、主にレジスタの値の集合となっていますが、その他の情報を含むこともあります。TWL-SDK ではコンテキストの保存、切り替え、復帰という操作を組み合わせてスレッドシステムが構築されています。ここでは TWL-SDK が保存するコンテキスト情報について説明します。
コンテキスト関連の関数は、コンテキストを初期化する OS_InitContext() 、 現在のコンテキストを保存する OS_SaveContext() 、 コンテキストを読み込む OS_LoadContext() 、デバッグ用の OS_DumpContext() がありますが、スレッドシステムがこれらを取り扱うため、ユーザが直接コンテキスト関数を呼ぶことはほとんどありません。
コンテキスト構造体 OSContext は以下のように定義されています。
typedef struct OSContext
{
u32 cpsr;
u32 r[13];
u32 sp;
u32 lr;
u32 pc_plus4;
#ifdef SDK_CONTEXT_HAS_SP_SVC
u32 sp_svc;
#endif
#ifdef SDK_ARM9
CPContext cp_context;
#endif
} OSContext;
cpsr は CPSR( Current Program Status Register ) で、フラグや割り込み状態などのステータスが格納されているレジスタを格納する領域です。
r[13] は、汎用レジスタ R0 〜 R12 までを格納する領域です。
sp は、スタックポインタ(R13)を格納する領域です。
lr は、リンクレジスタ(R14) を格納する領域です。
pc_plus4 は、プログラムカウンタ(PC) の値を格納する領域です。コンテキストを復帰させる際に次の命令から実行させるため、あらかじめPCの値をインクリメントして(値としては+4) 格納するため、このようなメンバ名になっています。
sp_svc は、コンパイル時の定義により含める場合と含めない場合を選択することが可能です。ここには SVC(スーパバイザコール) モードのスタックポインタの値が入ります。
cp_context は、演算コプロセッサの状態です。ディバイダ(除算器) と、平方根演算器の状態が含まれます。コンテキストがスイッチされても演算器を適切な状態に移行するために設けられています。ARM7 にはディバイダも平方根演算器もありませんので、ARM9 にのみ存在するメンバです。以下のように定義されています。
typedef struct CPContext { u64 div_numer; u64 div_denom; u64 sqrt; u16 div_mode; u16 sqrt_mode; } CPContext;
2004/12/13 用語や語尾など修正
2004/11/05 初版