													TOPPERS Confidential
		TOPPERSプロジェクト 設計メモ
		ARMのアーキテクチャに関するメモ

		作成者: 高田広章（名古屋大学）
		最終更新: 2012年9月19日

○メモの位置づけ

このメモは，ARMのアーキテクチャに関して，TOPPERS/HRP2カーネルを設計・実
装にあたって必要となる事項をまとめ，設計方針や実装について説明するもの
である．なお，ARMのMMUに関しては，「ARMのMMUに関するメモ」を参照するこ
と．

○参考文献

ARM Architecture Reference Manual - ARMv7-A and ARv7-R edition Errata
markup, Dec. 2011 (ARM DDI 0406B_errata_2011_Q3)
DDI0406B_arm_architecture_reference_manual_errata_markup_10_0.pdf

○レジスタセットとプロセッサモード

●アプリケーションレベルの汎用レジスタ

ARMの汎用レジスタは，r0〜r15の16本ある．ただし，以下のレジスタは特殊目
的に使われており，汎用レジスタとしては使用しない．

	r13		スタックポインタ	sp
	r14		リンクレジスタ		lr
	r15		プログラムカウンタ	pc

また，以下のレジスタも特殊目的に使われる場合があるが，通常は汎用レジス
タとして使用する．

	r12		InterProcedure		ip

特殊目的のレジスタ以外で，スクラッチレジスタは以下の通り．

	r0, r1, r2, r3, r12

この他のレジスタ（r4〜r11）は，callee saved registerである．

●アプリケーションレベルのステータスレジスタ

アプリケーションレベルのステータスレジスタとして，APSR（Application
Program Status Register）がある．APSRの構成は以下の通り．

	ビット31（MSB）	Nフラグ（Negative）
		  30		Zフラグ（Zero）
		  29		Cフラグ（Carry）
		  28		Vフラグ（Overflow）
		  27		Qフラグ（OverflowまたはSaturation，DSP命令用）
		  26〜24	常に0（RAZ/SBZP）
		  23〜20	予約
		  19〜16	GE[3:0] Greater or Equalフラグ（SIMD命令用）
		  15〜0		予約

●プロセッサモード

	User			usr
	FIQ				fiq
	IRQ				irq
	Supervisor		svc
	Monitor			mon		SecureモードとNon-secureモードの切り換え用
	Abort			abt
	Undefined		und
	System			sys

Userモードは非特権モード，その他は特権モードである．UserモードとSystem
モード以外を，例外モードと総称する．

HRP2カーネルにおいては，ユーザドメインの処理単位（ユーザタスク）はUser
モードで実行し，カーネルドメインの処理単位はSupervisorモードで実行する.
その他のモードは，一時的に使用するのみである．

割込み処理の実行にIRQモードを使わないのは，次の理由である．IRQモードで
実行中に割込みが発生すると，lrレジスタに戻り番地が格納される．そのため，
割込み処理をIRQモードを実行すると，多重割込みによりlrレジスタの内容が失
われるため，多重割込みを許可することができない．

●システムレベルの汎用レジスタ

各例外モードは，専用のsp（r13）とlr（r14）を持つ．FIQモードは，それに加
えて，R8〜R12も専用に持つ．その他のレジスタは，Userモードと共用している．
Systemモードは，すべてのレジスタをUserモードと共用している．

特定のモードのspとlrを，sp_usr，lr_usr，sp_svc，lr_svcのように表記する．

●システムレベルのステータスレジスタ

システムレベルのステータスレジスタとして，CPSR（Current Program Status
Register）がある．CPSRは，APSRの拡張である（言い換えると，APSRは，CPSR
の一部が見えている）．CPSRの構成は以下の通り．

	ビット31〜27	N,Z,C,V,Qフラグ … APSRと同じ
		  26〜25	IT[1:0] 下のITビットの下位2ビット
		  24		Jビット（Jazelleビット）
		  23〜20	予約
		  19〜16	GE[3:0] Greater or Equalフラグ（SIMD命令用）… APSRと同じ
		  15〜10	IT[7:2] If-Then実行状態ビット（Thumb IT命令用）
		  9			E（エンディアン状態）
		  8			Aビット（非同期アボート禁止）
		  7			Iビット（IRQ禁止）
		  6			Fビット（FIQ禁止）
		  5			Tビット（Thumbビット，Jビットと合わせて命令セットを指定）
		  4〜0		M[4:0] プロセッサモード

CPSRは，すべてのモードで共用している（つまり，CPSRは1つしかない）．

モード切換え前のCPSRを保存するためのレジスタとして，SPSR（Saved
Program Status Register）がある．SPSRは，各例外モード毎に専用に持つ．

●タスク例外処理ルーチンからリターン時のCPSR
｜この節は，ARM依存部設計メモに移動する．

ユーザタスクがタスク例外処理ルーチンを実行中は，タスク例外処理ルーチン
実行開始前のCPSRはユーザスタック上に保存されているため，ユーザタスクか
ら書き換えることができる．そのため，そこがどのように書き換えられたとし
ても，カーネルや他の保護ドメインに悪影響が及ばないようにする必要がある．
一方，そのユーザタスク自身やそれが属する保護ドメインに悪影響が及ぶのは
やむをえない．

そこで，ユーザスタック上に保存されているCPSRの内，一部のフィールドは強
制的に書き換えてから，ユーザタスクに戻る必要がある．CPSR内の他のフィー
ルドは，そのままCPSRに書き戻す．具体的には，強制的に書き換えるフィール
ドは以下の通り．

	Aビット（非同期アボート禁止）	→ 0にする
	Iビット（IRQ禁止）				→ 0にする
	Fビット（FIQ禁止）				→ 0にする
	M[4:0] プロセッサモード			→ Userモード（10000）にする



以上
