linux-2.6.33/vector_stub()(arm)
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
*参照元 [#k629ed1a]
#backlinks
*説明 [#w3d46434]
-パス: [[linux-2.6.33/arch/arm/kernel/entry-armv.S]]
-例外ベクタからジャンプする先となるスタブ関数を作成するた...
--FIXME: スーパバイザコール例外のときの動作を説明。
-このマクロで生成されるスタブ関数
--[[linux-2.6.33/vector_irq()]]
--[[linux-2.6.33/vector_dabt()]]
--[[linux-2.6.33/vector_pabt()]]
--[[linux-2.6.33/vector_und()]]
-基本的には、例外発生 -> 例外ベクタ -> スタブ関数 -> 例外...
-例外発生時の動作は下記の通り。
ただしスーパバイザコール例外(swi/svc)だけは動作が違うの...
例: IRQ(割り込み例外)、動作モード 0b0000(ユーザモード...
----------
(例外発生)
-> ベース(0xffff0000) + オフセット(0x18) = 0xffff001...
※ベースは CONFIG_VECTORS_BASE を参照
※オフセットは ARM アーキテクチャマニュアルの例外...
0xffff0018:
b vector_irq
-> スタブ関数へジャンプ
※例外ベクタテーブルの詳細は __vectors_start を参照
vector_irq:
動作モードを判定
-> CPSR[0:4] が動作モードを表す(0b00000 〜 0b11111 ...
ジャンプ先のアドレスを取得
-> ジャンプ先のアドレステーブルはスタブ関数の後ろに...
b __irq_usr
-> 例外ハンドラへジャンプ
--[[linux-2.6.33/CONFIG_VECTORS_BASE]]
--[[linux-2.6.33/__vectors_start]]
-スタブ関数とアドレステーブルの構造は下記の通り。
先頭 --> +----------+
| |
| stub | <-- vector_stub マクロで各種ス...
| 関数 |
| |
vector_ --> +----------+
stub の | 0 用 | <-- 各モード用のハンドラのアド...
ラベル 1: +----------+ 1エントリ 4バイト
| 1 用 |
+----------+
| ... |
+----------+
| 15 用 |
+----------+
**引数 [#za57385c]
-name
--生成する関数の名前
--例えば hogehoge を指定すると、
vector_hogehoge スタブ関数が定義される。
-mode
--
-correction
--
**返り値 [#o4dd2b7a]
-なし、関数ではない
**参考 [#i0c9b2bf]
*実装 [#cb463f30]
/*
* Vector stubs.
*
* This code is copied to 0xffff0200 so we can use branc...
* vectors, rather than ldr's. Note that this code must...
* exceed 0x300 bytes.
*
* Common stub entry macro:
* Enter in IRQ mode, spsr = SVC/USR CPSR, lr = SVC/US...
*
* SP points to a minimal amount of processor-private me...
* of which is copied into r0 for the mode specific abor...
*/
.macro vector_stub, name, mode, correction=0
.align 5
-2^5 = 32バイト境界に配置する
vector_\name:
.if \correction
sub lr, lr, #\correction
.endif
@
@ Save r0, lr_<exception> (parent PC) and spsr_<excepti...
@ (parent CPSR)
@
stmia sp, {r0, lr} @ save r0, lr
mrs lr, spsr
str lr, [sp, #8] @ save spsr
@
@ Prepare for SVC32 mode. IRQs remain disabled.
@
mrs r0, cpsr
eor r0, r0, #(\mode ^ SVC_MODE | PSR_ISETSTATE)
msr spsr_cxsf, r0
-
--[[linux-2.6.33/SVC_MODE]]
--[[linux-2.6.33/PSR_ISETSTATE]]
@
@ the branch table must immediately follow this code
@
and lr, lr, #0x0f
THUMB( adr r0, 1f )
THUMB( ldr lr, [r0, lr, lsl #2] )
-
--[[linux-2.6.33/THUMB()]]
mov r0, sp
ARM( ldr lr, [pc, lr, lsl #2] )
-
--[[linux-2.6.33/ARM()]]
movs pc, lr @ branch to handler in SVC mode
ENDPROC(vector_\name)
-
--[[linux-2.6.33/ENDPROC()]]
.align 2
@ handler addresses follow this label
1:
.endm
*コメント [#nfcdaef6]
終了行:
*参照元 [#k629ed1a]
#backlinks
*説明 [#w3d46434]
-パス: [[linux-2.6.33/arch/arm/kernel/entry-armv.S]]
-例外ベクタからジャンプする先となるスタブ関数を作成するた...
--FIXME: スーパバイザコール例外のときの動作を説明。
-このマクロで生成されるスタブ関数
--[[linux-2.6.33/vector_irq()]]
--[[linux-2.6.33/vector_dabt()]]
--[[linux-2.6.33/vector_pabt()]]
--[[linux-2.6.33/vector_und()]]
-基本的には、例外発生 -> 例外ベクタ -> スタブ関数 -> 例外...
-例外発生時の動作は下記の通り。
ただしスーパバイザコール例外(swi/svc)だけは動作が違うの...
例: IRQ(割り込み例外)、動作モード 0b0000(ユーザモード...
----------
(例外発生)
-> ベース(0xffff0000) + オフセット(0x18) = 0xffff001...
※ベースは CONFIG_VECTORS_BASE を参照
※オフセットは ARM アーキテクチャマニュアルの例外...
0xffff0018:
b vector_irq
-> スタブ関数へジャンプ
※例外ベクタテーブルの詳細は __vectors_start を参照
vector_irq:
動作モードを判定
-> CPSR[0:4] が動作モードを表す(0b00000 〜 0b11111 ...
ジャンプ先のアドレスを取得
-> ジャンプ先のアドレステーブルはスタブ関数の後ろに...
b __irq_usr
-> 例外ハンドラへジャンプ
--[[linux-2.6.33/CONFIG_VECTORS_BASE]]
--[[linux-2.6.33/__vectors_start]]
-スタブ関数とアドレステーブルの構造は下記の通り。
先頭 --> +----------+
| |
| stub | <-- vector_stub マクロで各種ス...
| 関数 |
| |
vector_ --> +----------+
stub の | 0 用 | <-- 各モード用のハンドラのアド...
ラベル 1: +----------+ 1エントリ 4バイト
| 1 用 |
+----------+
| ... |
+----------+
| 15 用 |
+----------+
**引数 [#za57385c]
-name
--生成する関数の名前
--例えば hogehoge を指定すると、
vector_hogehoge スタブ関数が定義される。
-mode
--
-correction
--
**返り値 [#o4dd2b7a]
-なし、関数ではない
**参考 [#i0c9b2bf]
*実装 [#cb463f30]
/*
* Vector stubs.
*
* This code is copied to 0xffff0200 so we can use branc...
* vectors, rather than ldr's. Note that this code must...
* exceed 0x300 bytes.
*
* Common stub entry macro:
* Enter in IRQ mode, spsr = SVC/USR CPSR, lr = SVC/US...
*
* SP points to a minimal amount of processor-private me...
* of which is copied into r0 for the mode specific abor...
*/
.macro vector_stub, name, mode, correction=0
.align 5
-2^5 = 32バイト境界に配置する
vector_\name:
.if \correction
sub lr, lr, #\correction
.endif
@
@ Save r0, lr_<exception> (parent PC) and spsr_<excepti...
@ (parent CPSR)
@
stmia sp, {r0, lr} @ save r0, lr
mrs lr, spsr
str lr, [sp, #8] @ save spsr
@
@ Prepare for SVC32 mode. IRQs remain disabled.
@
mrs r0, cpsr
eor r0, r0, #(\mode ^ SVC_MODE | PSR_ISETSTATE)
msr spsr_cxsf, r0
-
--[[linux-2.6.33/SVC_MODE]]
--[[linux-2.6.33/PSR_ISETSTATE]]
@
@ the branch table must immediately follow this code
@
and lr, lr, #0x0f
THUMB( adr r0, 1f )
THUMB( ldr lr, [r0, lr, lsl #2] )
-
--[[linux-2.6.33/THUMB()]]
mov r0, sp
ARM( ldr lr, [pc, lr, lsl #2] )
-
--[[linux-2.6.33/ARM()]]
movs pc, lr @ branch to handler in SVC mode
ENDPROC(vector_\name)
-
--[[linux-2.6.33/ENDPROC()]]
.align 2
@ handler addresses follow this label
1:
.endm
*コメント [#nfcdaef6]
ページ名: