3 Mode_USR EQU 0x10 ; USR モード
4 Mode_FIQ EQU 0x11 ; FIQ モード
5 Mode_IRQ EQU 0x12 ; IRQ モード
6 Mode_SVC EQU 0x13 ; SVC モード
7 Mode_ABT EQU 0x17 ; ABT モード
8 Mode_UND EQU 0x1b ; UND モード
9 Mode_SYS EQU 0x1f ; SYS モード
10 Mode_MASK EQU 0x1f ; モードビットマスク
13 T_Bit EQU 0x20 ; T ビット
14 F_Bit EQU 0x40 ; F ビット
15 I_Bit EQU 0x80 ; I ビット
18 ; ---- 割り込みハンドラ番号 ----
23 IMPORT _kernel_int_isp
24 IMPORT _kernel_sta_int
25 IMPORT _kernel_end_int
26 IMPORT _kernel_exe_inh
27 EXPORT _kernel_int_armirq ; IRQハンドラ
31 AREA inthdr_code, CODE, READONLY
34 ; ----------------------------------------------
36 ; ----------------------------------------------
39 msr cpsr_c, #Mode_SYS:OR:F_Bit:OR:I_Bit ; SYSモードに移行
40 stmfd sp!, {r0-r3, r12, lr} ; SYSモードの汎用レジスタ退避
41 msr cpsr_c, #Mode_IRQ:OR:F_Bit:OR:I_Bit ; IRQモードに移行
42 mov r0, lr ; lr_irq 取り出し
43 mrs r1, spsr ; spsr_irq 取り出し
44 msr cpsr_c, #Mode_SYS:OR:F_Bit:OR:I_Bit ; SYSモードに移行
45 stmfd sp!, {r0, r1} ; lr_irq, spsr_irq退避
48 ldr r0, =_kernel_int_nst_cnt ; 割り込みネストカウンタのアドレス取得
49 ldrb r1, [r0] ; 割り込みネストカウンタ値取得
50 subs r1, r1, #1 ; カウンタ減算(0判定が楽なのでマイナス方向にカウント)
51 strb r1, [r0] ; 割り込みネストカウンタ値設定
52 bcs multiple_int ; 多重割り込みなら分岐
55 ldr r2, _kernel_int_isp ; 割り込み用スタックの初期値アドレスを取得
56 mov r1, sp ; タスクのSPを保存
57 ldr sp, [r2] ; 割り込み用スタックに切り替え
58 stmfd sp!, {r0, r1} ; タスクのSPを割り込み用スタックに保存(8の倍数になるようにr1も)
61 bl _kernel_sta_int ; 割り込み開始
68 ldmfd sp!, {r0, r1} ; 汎用レジスタ復帰
71 mov r1, #0 ; 割り込みネストカウンタを0に戻す
72 strb r1, [r0] ; 割り込みネストカウンタ値設定
75 bl _kernel_end_int ; 割り込み終了処理
79 ldmfd sp!, {r0, r1} ; lr_irq, spsr_irq 復帰
80 msr cpsr_c, #Mode_IRQ:OR:F_Bit:OR:I_Bit ; IRQモードに移行
81 mov lr, r0 ; lr_irq 復帰
82 msr spsr_csxf, r1 ; spsr_irq 復帰
83 msr cpsr_c, #Mode_SYS:OR:F_Bit:OR:I_Bit ; SYSモードに移行
84 ldmfd sp!, {r0-r3, r12, lr} ; SYSモードの汎用レジスタ復帰
85 msr cpsr_c, #Mode_IRQ:OR:F_Bit:OR:I_Bit ; IRQモードに移行
86 subs pc, lr, #4 ; 割込み復帰
91 ; ---- スタックを8バイトアライメントに移動
92 mov r1, sp ; 割り込み発生時のSYSモードのSPに8の倍数の保証されないので
94 stmfd sp!, {r0, r1} ; タスクのSPを割り込み用スタックに保存(8の倍数になるようにr1も)
101 ldmfd sp!, {r0, r1} ; 汎用レジスタ復帰
113 AREA data, DATA, ALIGN=0
121 ; ---------------------------------------------------------------------------
123 ; ---------------------------------------------------------------------------