HOS-V4 Advance の開発リポジトリ
Revision | 9c641234368d4c5b8b4fa0b639b9f1799f3ed950 (tree) |
---|---|
Zeit | 2008-05-25 00:45:48 |
Autor | ryuz <ryuz> |
Commiter | ryuz |
(none)
@@ -25,21 +25,19 @@ | ||
25 | 25 | .global _kernel_irq_hdr |
26 | 26 | _kernel_irq_hdr: |
27 | 27 | /* ---- レジスタ退避 */ |
28 | - mrs r13, cpsr /* cpsrをr13に退避 */ | |
29 | 28 | msr cpsr_c, #(Mode_SYS | F_Bit | I_Bit) /* SYSモードに移行 */ |
30 | 29 | stmfd sp!, {r0-r3, r12, lr} /* SYSモードの汎用レジスタ退避 */ |
31 | 30 | msr cpsr_c, #(Mode_IRQ | F_Bit | I_Bit) /* IRQモードに移行 */ |
32 | 31 | mov r0, lr /* lr_irq 取り出し */ |
33 | 32 | mrs r1, spsr /* spsr_irq 取り出し */ |
34 | - mov r2, r13 /* cpsrを取り出し */ | |
35 | 33 | msr cpsr_c, #(Mode_SYS | F_Bit | I_Bit) /* SYSモードに移行 */ |
36 | 34 | stmfd sp!, {r0, r1} /* lr_irq, spsr_irq退避 */ |
37 | 35 | |
38 | 36 | /* ---- 割込みマスク設定 */ |
39 | 37 | ldr r0, =_kernel_ictxcb |
40 | 38 | ldr r3, [r0, #ICTXCB_IMSK] /* 古いimsk値を取り出し */ |
41 | - and r2, r2, #(F_Bit | I_Bit) | |
42 | - strb r2, [r0, #ICTXCB_IMSK] /* cpsr値をimsk値に設定 */ | |
39 | + orr r1, r3, #I_Bit /* 割込みマスク */ | |
40 | + strb r1, [r0, #ICTXCB_IMSK] /* cpsr値をimsk値に設定 */ | |
43 | 41 | |
44 | 42 | /* ---- 多重割込み判定 */ |
45 | 43 | ldrb r1, [r0, #ICTXCB_INTCNT] /* 割り込みネストカウンタ値取得 */ |
@@ -68,23 +66,20 @@ _kernel_irq_hdr: | ||
68 | 66 | strb r1, [r0, #ICTXCB_INTCNT] /* 割り込みネストカウンタ値設定 */ |
69 | 67 | |
70 | 68 | /* ---- 割込みマスク値復帰処理 */ |
71 | - ldr r1, [sp, #4] /* spsr_irq 値取り出し */ | |
72 | - and r1, r1, #(F_Bit | I_Bit) | |
73 | - cmp r1, r3 /* 旧imsk値と比較 */ | |
74 | - bne return_int /* 不一致なら終了処理スキップ */ | |
75 | 69 | strb r3, [r0, #ICTXCB_IMSK] /* マスク値復帰 */ |
76 | - | |
70 | + | |
77 | 71 | /* ---- 割込み終了処理 */ |
78 | 72 | bl _kernel_end_inh /* 割り込み終了処理 */ |
79 | - | |
73 | + | |
74 | + /* ---- 復帰先割込みマスク設定 */ | |
80 | 75 | ldr r0, =_kernel_ictxcb |
81 | 76 | ldr r1, [sp, #4] /* spsr_irq 値取り出し */ |
82 | - ldrb r0, [r0, #ICTXCB_IMSK] /* この時点でのimsk値取り出し */ | |
83 | - bic r1, r1, #(F_Bit | I_Bit) | |
84 | - and r0, r0, #(F_Bit | I_Bit) | |
85 | - orr r1, r1, r0 | |
86 | - str r1, [sp, #4] /* spsr_irq にimsk値反映 */ | |
87 | - | |
77 | + tst r1, #I_Bit /* 割禁と同時にIRQが入る場合があるのでケア */ | |
78 | + ldreqb r0, [r0, #ICTXCB_IMSK] /* この時点でのimsk値取り出し */ | |
79 | + biceq r1, r1, #(F_Bit | I_Bit) | |
80 | + orreq r1, r1, r0 | |
81 | + streq r1, [sp, #4] /* spsr_irq にimsk値反映 */ | |
82 | + | |
88 | 83 | return_int: |
89 | 84 | /* ---- 復帰処理 */ |
90 | 85 | ldmfd sp!, {r0, r1} /* lr_irq, spsr_irq 復帰 */ |
@@ -95,8 +90,8 @@ return_int: | ||
95 | 90 | ldmfd sp!, {r0-r3, r12, lr} /* SYSモードの汎用レジスタ復帰 */ |
96 | 91 | msr cpsr_c, #(Mode_IRQ | F_Bit | I_Bit) /* IRQモードに移行 */ |
97 | 92 | subs pc, lr, #4 /* 割込み復帰 */ |
98 | - | |
99 | - | |
93 | + | |
94 | + | |
100 | 95 | /* ---- 多重割り込み処理 */ |
101 | 96 | multiple_int: |
102 | 97 | /* ---- スタックを8バイトアライメントに移動 */ |
@@ -65,9 +65,9 @@ SRC_DIRS += . .. | ||
65 | 65 | |
66 | 66 | |
67 | 67 | # %jp{オプションフラグ}%en{option flags} |
68 | -AFLAGS = -mcpu=arm7tdmi -mthumb-interwork -gdwarf-2 | |
69 | -CFLAGS = -mcpu=arm7tdmi -mthumb-interwork -gdwarf-2 | |
70 | -LNFLAGS = -mcpu=arm7tdmi -mthumb-interwork -gdwarf-2 -nostartfiles -Wl,-Map,$(TARGET).map,-T$(LINK_SCRIPT) | |
68 | +AFLAGS = -mcpu=arm7tdmi -mthumb-interwork | |
69 | +CFLAGS = -mcpu=arm7tdmi -mthumb-interwork | |
70 | +LNFLAGS = -mcpu=arm7tdmi -mthumb-interwork -nostartfiles -Wl,-Map,$(TARGET).map,-T$(LINK_SCRIPT) | |
71 | 71 | |
72 | 72 | |
73 | 73 | # %jp{コンパイラ依存の設定読込み}%en{compiler dependent definitions} |