OSDN Git Service

fda51b237f32de296555918216c20ff4e74a073f
[hos/hos-v4a.git] / kernel / source / arch / proc / arm / arm_v5 / armcc / armirq.s
1
2 ; ---- プロセッサモード定義 ----
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            ; モードビットマスク
11
12 ; ---- フラグ定義 ----
13 T_Bit                   EQU             0x20            ; T ビット
14 F_Bit                   EQU     0x40            ; F ビット
15 I_Bit                   EQU     0x80            ; I ビット
16
17
18 ; ---- 割り込みハンドラ番号 ----
19 INHNO_IRQ               EQU     0
20 INHNO_FIQ               EQU     1
21
22
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ハンドラ
28
29
30                                 PRESERVE8
31                                 AREA    inthdr_code, CODE, READONLY
32                                 CODE32
33
34 ; ----------------------------------------------
35 ;  IRQ ハンドラ
36 ; ----------------------------------------------
37 _kernel_int_armirq
38                         ; ---- レジスタ退避
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退避
46                                 
47                         ; ---- 多重割込み判定
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                                                    ; 多重割り込みなら分岐
53                                 
54                         ; ---- 割り込み用スタックに入れ替え
55                                 ldr             r2, _kernel_int_isp                                             ; 割り込み用スタックの初期値アドレスを取得
56                                 mov             r1, sp                                                                  ; タスクのSPを保存
57                                 ldr             sp, [r2]                                                                ; 割り込み用スタックに切り替え
58                                 stmfd   sp!, {r0, r1}                                                   ; タスクのSPを割り込み用スタックに保存(8の倍数になるようにr1も)
59                                 
60                         ; ---- 割り込み処理
61                                 bl              _kernel_sta_int                                                 ; 割り込み開始
62                                 
63                         ; ---- 割り込みハンドラ実行
64                                 mov             r0, #INHNO_IRQ
65                                 bl              _kernel_exe_inh
66                                 
67                         ; ---- 割り込み処理の終了設定
68                                 ldmfd   sp!, {r0, r1}                                                   ; 汎用レジスタ復帰
69                                 mov             sp, r1                                                                  ; スタックを戻す
70
71                                 mov             r1, #0                                                                  ; 割り込みネストカウンタを0に戻す
72                                 strb    r1, [r0]                                                                ; 割り込みネストカウンタ値設定
73
74                         ; ---- 遅延ディスパッチ処理
75                                 bl              _kernel_end_int                                                 ; 割り込み終了処理
76
77 return_int
78                         ; ---- 復帰処理
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                                                              ; 割込み復帰
87
88
89                         ; ---- 多重割り込み処理
90 multiple_int
91                         ; ---- スタックを8バイトアライメントに移動
92                                 mov             r1,  sp                                                                 ; 割り込み発生時のSYSモードのSPに8の倍数の保証されないので
93                                 bic             sp, sp, #0x7
94                                 stmfd   sp!, {r0, r1}                                                   ; タスクのSPを割り込み用スタックに保存(8の倍数になるようにr1も)
95                                 
96                         ; ---- 割り込みハンドラ実行
97                                 mov             r0, #INHNO_IRQ
98                                 bl              _kernel_exe_inh
99
100                         ; ---- スタックアライメント復帰
101                                 ldmfd   sp!, {r0, r1}                                                   ; 汎用レジスタ復帰
102                                 mov             sp, r1
103                                 
104                         ; ---- 割り込みカウンタ復帰
105                                 ldrb    r1, [r0]
106                                 add             r1, r1, #1
107                                 strb    r1, [r0]
108
109                                 b               return_int                                                              ; 復帰処理
110
111
112
113                         AREA data, DATA, ALIGN=0
114 _kernel_int_nst_cnt
115                         DCB      0x00
116
117
118                                 END
119
120
121 ; --------------------------------------------------------------------------- 
122 ;  End of file
123 ; ---------------------------------------------------------------------------