- Timestamp:
- Aug 23, 2017, 9:27:43 AM (7 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
EcnlProtoTool/trunk/asp3_dcre/arch/arm_gcc/common/core_support.S
- Property svn:keywords deleted
-
Property svn:mime-type
changed from
text/plain
totext/plain;charset=UTF-8
r279 r321 9 9 * Graduate School of Information Science, Nagoya Univ., JAPAN 10 10 * 11 * ä¸è¨èä½æ¨©è 12 ã¯ï¼ä»¥ä¸ã®(1)ï½(4)ã®æ¡ä»¶ãæºããå ´åã«éãï¼æ¬ã½ããã¦ã§ 13 * ã¢ï¼æ¬ã½ããã¦ã§ã¢ãæ¹å¤ãããã®ãå«ãï¼ä»¥ä¸åãï¼ã使ç¨ã»è¤è£½ã»æ¹ 14 * å¤ã»åé 15 å¸ï¼ä»¥ä¸ï¼å©ç¨ã¨å¼ã¶ï¼ãããã¨ãç¡åã§è¨±è«¾ããï¼ 16 * (1) æ¬ã½ããã¦ã§ã¢ãã½ã¼ã¹ã³ã¼ãã®å½¢ã§å©ç¨ããå ´åã«ã¯ï¼ä¸è¨ã®èä½ 17 * 権表示ï¼ãã®å©ç¨æ¡ä»¶ããã³ä¸è¨ã®ç¡ä¿è¨¼è¦å®ãï¼ãã®ã¾ã¾ã®å½¢ã§ã½ã¼ 18 * ã¹ã³ã¼ãä¸ã«å«ã¾ãã¦ãããã¨ï¼ 19 * (2) æ¬ã½ããã¦ã§ã¢ãï¼ã©ã¤ãã©ãªå½¢å¼ãªã©ï¼ä»ã®ã½ããã¦ã§ã¢éçºã«ä½¿ 20 * ç¨ã§ããå½¢ã§åé 21 å¸ããå ´åã«ã¯ï¼åé 22 å¸ã«ä¼´ãããã¥ã¡ã³ãï¼å©ç¨ 23 * è 24 ããã¥ã¢ã«ãªã©ï¼ã«ï¼ä¸è¨ã®èä½æ¨©è¡¨ç¤ºï¼ãã®å©ç¨æ¡ä»¶ããã³ä¸è¨ 25 * ã®ç¡ä¿è¨¼è¦å®ãæ²è¼ãããã¨ï¼ 26 * (3) æ¬ã½ããã¦ã§ã¢ãï¼æ©å¨ã«çµã¿è¾¼ããªã©ï¼ä»ã®ã½ããã¦ã§ã¢éçºã«ä½¿ 27 * ç¨ã§ããªãå½¢ã§åé 28 å¸ããå ´åã«ã¯ï¼æ¬¡ã®ããããã®æ¡ä»¶ãæºããã 29 * ã¨ï¼ 30 * (a) åé 31 å¸ã«ä¼´ãããã¥ã¡ã³ãï¼å©ç¨è 32 ããã¥ã¢ã«ãªã©ï¼ã«ï¼ä¸è¨ã®è 33 * ä½æ¨©è¡¨ç¤ºï¼ãã®å©ç¨æ¡ä»¶ããã³ä¸è¨ã®ç¡ä¿è¨¼è¦å®ãæ²è¼ãããã¨ï¼ 34 * (b) åé 35 å¸ã®å½¢æ 36 ãï¼å¥ã«å®ããæ¹æ³ã«ãã£ã¦ï¼TOPPERSããã¸ã§ã¯ãã« 37 * å ±åãããã¨ï¼ 38 * (4) æ¬ã½ããã¦ã§ã¢ã®å©ç¨ã«ããç´æ¥çã¾ãã¯éæ¥çã«çãããããªãæ 39 * 害ãããï¼ä¸è¨èä½æ¨©è 40 ããã³TOPPERSããã¸ã§ã¯ããå 41 責ãããã¨ï¼ 42 * ã¾ãï¼æ¬ã½ããã¦ã§ã¢ã®ã¦ã¼ã¶ã¾ãã¯ã¨ã³ãã¦ã¼ã¶ããã®ãããªãç 43 * ç±ã«åºã¥ãè«æ±ãããï¼ä¸è¨èä½æ¨©è 44 ããã³TOPPERSããã¸ã§ã¯ãã 45 * å 46 責ãããã¨ï¼ 11 * 上記著作権者は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ 12 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改 13 * 変・再配布(以下,利用と呼ぶ)することを無償で許諾する. 14 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 15 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー 16 * スコード中に含まれていること. 17 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 18 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 19 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 20 * の無保証規定を掲載すること. 21 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 22 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ 23 * と. 24 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 25 * 作権表示,この利用条件および下記の無保証規定を掲載すること. 26 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに 27 * 報告すること. 28 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 29 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. 30 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理 31 * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを 32 * 免責すること. 47 33 * 48 * æ¬ã½ããã¦ã§ã¢ã¯ï¼ç¡ä¿è¨¼ã§æä¾ããã¦ãããã®ã§ããï¼ä¸è¨èä½æ¨©è 49 ã 50 * ãã³TOPPERSããã¸ã§ã¯ãã¯ï¼æ¬ã½ããã¦ã§ã¢ã«é¢ãã¦ï¼ç¹å®ã®ä½¿ç¨ç®ç 51 * ã«å¯¾ããé©åæ§ãå«ãã¦ï¼ãããªãä¿è¨¼ãè¡ããªãï¼ã¾ãï¼æ¬ã½ããã¦ã§ 52 * ã¢ã®å©ç¨ã«ããç´æ¥çã¾ãã¯éæ¥çã«çãããããªãæ害ã«é¢ãã¦ãï¼ã 53 * ã®è²¬ä»»ãè² ããªãï¼ 34 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お 35 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的 36 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ 37 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ 38 * の責任を負わない. 54 39 * 55 40 * $Id$ … … 57 42 58 43 /* 59 * ã«ã¼ãã«ã®ã³ã¢ä¾åé¨ã®ã¢ã»ã³ããªè¨èªé¨ï¼ARMç¨ï¼44 * カーネルのコア依存部のアセンブリ言語部(ARM用) 60 45 */ 61 46 62 47 #define TOPPERS_MACRO_ONLY 63 48 #define TOPPERS_ASM_MACRO 64 #define UINT_C(val) (val) /* uint_t åã®å®æ°ãä½ããã¯ã*/65 #define ULONG_C(val) (val) /* ulong_t åã®å®æ°ãä½ããã¯ã*/66 #define CAST(type, val) (val) /* åãã£ã¹ããè¡ããã¯ã*/49 #define UINT_C(val) (val) /* uint_t型の定数を作るマクロ */ 50 #define ULONG_C(val) (val) /* ulong_t型の定数を作るマクロ */ 51 #define CAST(type, val) (val) /* 型キャストを行うマクロ */ 67 52 #include "kernel_impl.h" 68 53 #include "offset.h" … … 70 55 71 56 /* 72 * ä¾å¤ãã¯ã¿57 * 例外ベクタ 73 58 */ 74 59 ASECTION(.vector) … … 76 61 AGLOBAL(vector_table) 77 62 ALABEL(vector_table) 78 ldr pc, reset_vector /* ãªã»ãã*/79 ldr pc, undef_vector /* æªå®ç¾©å½ä»¤*/80 ldr pc, svc_vector /* ã½ããã¦ã§ã¢å²è¾¼ã¿*/81 ldr pc, pabort_vector /* ããªãã§ããã¢ãã¼ã*/82 ldr pc, dabort_vector /* ãã¼ã¿ã¢ãã¼ã*/83 ldr pc, reset_vector /* æªä½¿ç¨*/63 ldr pc, reset_vector /* リセット */ 64 ldr pc, undef_vector /* 未定義命令 */ 65 ldr pc, svc_vector /* ソフトウェア割込み */ 66 ldr pc, pabort_vector /* プリフェッチアボート */ 67 ldr pc, dabort_vector /* データアボート */ 68 ldr pc, reset_vector /* 未使用 */ 84 69 ldr pc, irq_vector /* IRQ */ 85 70 ldr pc, fiq_vector /* FIQ */ 86 71 87 72 /* 88 * ä¾å¤ãã¯ã¿ã®å½ä»¤ããåç 89 §ãããã¸ã£ã³ãå 90 ã¢ãã¬ã¹ 73 * 例外ベクタの命令から参照されるジャンプ先アドレス 91 74 */ 92 75 AGLOBAL(vector_ref_table) … … 108 91 109 92 /* 110 * ã¿ã¹ã¯ãã£ã¹ãããã£93 * タスクディスパッチャ 111 94 */ 112 95 ATEXT … … 115 98 ALABEL(dispatch) 116 99 /* 117 * ãã®ã«ã¼ãã³ã¯ï¼ã¿ã¹ã¯ã³ã³ããã¹ãã»CPUããã¯ç¶æ 118 ã»å²è¾¼ã¿åªå 119 度 120 * ãã¹ã¯å 121 ¨è§£é¤ç¶æ 122 ã»ãã£ã¹ããã許å¯ç¶æ 123 ã§å¼ã³åºãããï¼ 124 */ 125 push {r12,lr} /* æ»ãçªå°ãä¿åï¼r12ã¯ããã¼ */ 100 * このルーチンは,タスクコンテキスト・CPUロック状態・割込み優先度 101 * マスク全解除状態・ディスパッチ許可状態で呼び出される. 102 */ 103 push {r12,lr} /* 戻り番地を保存,r12はダミー */ 126 104 #ifdef TOPPERS_SUPPORT_OVRHDR 127 105 bl ovrtimer_stop 128 106 #endif /* TOPPERS_SUPPORT_OVRHDR */ 129 stmfd sp!, {r4-r11} /* éã¹ã¯ã©ããã¬ã¸ã¹ã¿ã®ä¿å*/130 ldr r0, =p_runtsk /* p_runtsk âr0 */107 stmfd sp!, {r4-r11} /* 非スクラッチレジスタの保存 */ 108 ldr r0, =p_runtsk /* p_runtsk → r0 */ 131 109 ldr r0, [r0] 132 str sp, [r0,#TCB_sp] /* ã¹ã¿ãã¯ãã¤ã³ã¿ãä¿å*/110 str sp, [r0,#TCB_sp] /* スタックポインタを保存 */ 133 111 adr r1, dispatch_r 134 str r1, [r0,#TCB_pc] /* å®è¡åéçªå°ãä¿å*/135 b dispatcher /* r0 ã«ã¯p_runtskãæ ¼ç´ããã¦ãã*/112 str r1, [r0,#TCB_pc] /* 実行再開番地を保存 */ 113 b dispatcher /* r0にはp_runtskが格納されている */ 136 114 137 115 ALABEL(dispatch_r) 138 ldmfd sp!, {r4-r11} /* éã¹ã¯ã©ããã¬ã¸ã¹ã¿ã®å¾©å¸°*/116 ldmfd sp!, {r4-r11} /* 非スクラッチレジスタの復帰 */ 139 117 #ifdef TOPPERS_SUPPORT_OVRHDR 140 118 bl ovrtimer_start 141 119 #endif /* TOPPERS_SUPPORT_OVRHDR */ 142 pop {r12,lr} /* æ»ãçªå°ã復帰*/120 pop {r12,lr} /* 戻り番地を復帰 */ 143 121 bx lr 144 122 145 123 /* 146 * ãã£ã¹ãããã£ã®åä½éå§124 * ディスパッチャの動作開始 147 125 */ 148 126 AGLOBAL(start_dispatch) 149 127 ALABEL(start_dispatch) 150 128 /* 151 * ãã®ã«ã¼ãã³ã¯ï¼ã«ã¼ãã«èµ·åæã«ï¼éã¿ã¹ã¯ã³ã³ããã¹ãã§ï¼NMIã 152 * é¤ããã¹ã¦ã®å²è¾¼ã¿ãç¦æ¢ããç¶æ 153 ï¼å 154 ¨å²è¾¼ã¿ããã¯ç¶æ 155 ã¨åçï¼ã§ 156 * å¼ã³åºãããï¼ 129 * このルーチンは,カーネル起動時に,非タスクコンテキストで,NMIを 130 * 除くすべての割込みを禁止した状態(全割込みロック状態と同等)で 131 * 呼び出される. 157 132 * 158 * dispatcher_0ã¸åå²ããåã«ï¼ã¿ã¹ã¯ã³ã³ããã¹ãã»CPUããã¯ç¶æ 159 ã» 160 * å²è¾¼ã¿åªå 161 度ãã¹ã¯å 162 ¨è§£é¤ç¶æ 163 ã«ãï¼ä½¿ç¨ããã¹ã¿ãã¯ãï¼IDã1ã®ã¿ 164 * ã¹ã¯ã®ã¹ã¿ãã¯é åã«åãæããªããã°ãªããªãï¼ 165 */ 166 167 /* 168 * ã¿ã¹ã¯ã³ã³ããã¹ãã«åãæããï¼ 169 */ 170 ldr r2, =excpt_nest_count /* ä¾å¤ãã¹ãã«ã¦ã³ãã0ã« */ 133 * dispatcher_0へ分岐する前に,タスクコンテキスト・CPUロック状態・ 134 * 割込み優先度マスク全解除状態にし,使用するスタックを,IDが1のタ 135 * スクのスタック領域に切り換えなければならない. 136 */ 137 138 /* 139 * タスクコンテキストに切り換える. 140 */ 141 ldr r2, =excpt_nest_count /* 例外ネストカウントを0に */ 171 142 mov r0, #0 172 143 str r0, [r2] 173 144 174 145 /* 175 * ID ã1ã®ã¿ã¹ã¯ã®ã¹ã¿ãã¯é åã«åãæããï¼176 */ 177 ldr r0, =tcb_table /* tcb_table[0] âr0 */178 ldr r2, [r0,#TCB_p_tinib] /* tcb_table[0].p_tinib âr2 */146 * IDが1のタスクのスタック領域に切り換える. 147 */ 148 ldr r0, =tcb_table /* tcb_table[0] → r0 */ 149 ldr r2, [r0,#TCB_p_tinib] /* tcb_table[0].p_tinib → r2 */ 179 150 ldr r0, [r2,#TINIB_stk] 180 151 ldr r1, [r2,#TINIB_stksz] … … 182 153 183 154 /* 184 * CPUããã¯ç¶æ 185 ã«ãã¦ï¼ãã£ã¹ãããã£æ¬ä½ã¸åå²ããï¼ 155 * CPUロック状態にして,ディスパッチャ本体へ分岐する. 186 156 */ 187 157 msr cpsr_c, #(CPSR_SVC_MODE AOR CPSR_CPULOCK) … … 189 159 190 160 /* 191 * ç¾å¨ã®ã³ã³ããã¹ããæ¨ã¦ã¦ãã£ã¹ããã161 * 現在のコンテキストを捨ててディスパッチ 192 162 */ 193 163 AGLOBAL(exit_and_dispatch) 194 164 ALABEL(exit_and_dispatch) 195 165 /* 196 * ãã®ã«ã¼ãã³ã¯ï¼ã¿ã¹ã¯ã³ã³ããã¹ãã»CPUããã¯ç¶æ 197 ã»å²è¾¼ã¿åªå 198 度 199 * ãã¹ã¯å 200 ¨è§£é¤ç¶æ 201 ã»ãã£ã¹ããã許å¯ç¶æ 202 ã§å¼ã³åºãããï¼ 166 * このルーチンは,タスクコンテキスト・CPUロック状態・割込み優先度 167 * マスク全解除状態・ディスパッチ許可状態で呼び出される. 203 168 */ 204 169 #ifdef LOG_DSP_ENTER 205 ldr r0, =p_runtsk /* p_runtsk âr0 */170 ldr r0, =p_runtsk /* p_runtsk → r0 */ 206 171 ldr r0, [r0] 207 172 #endif /* LOG_DSP_ENTER */ 208 /* ãã£ã¹ãããã£æ¬ä½ï¼dispatcherï¼ã¸*/209 210 /* 211 * ãã£ã¹ãããã£æ¬ä½173 /* ディスパッチャ本体(dispatcher)へ */ 174 175 /* 176 * ディスパッチャ本体 212 177 */ 213 178 ALABEL(dispatcher) 214 179 #ifdef LOG_DSP_ENTER 215 180 /* 216 * ããã®æç¹ã®ã¬ã¸ã¹ã¿ç¶æ 217 ã 218 * r0ï¼p_runtskï¼ã¿ã¹ã¯åæãåï¼ 181 * 【この時点のレジスタ状態】 182 * r0:p_runtsk(タスク切換え前) 219 183 */ 220 184 bl log_dsp_enter … … 223 187 ALABEL(dispatcher_0) 224 188 /* 225 * ãã®ã«ã¼ãã³ã¯ï¼ã¿ã¹ã¯ã³ã³ããã¹ãã»CPUããã¯ç¶æ 226 ã»å²è¾¼ã¿åªå 227 度 228 * ãã¹ã¯å 229 ¨è§£é¤ç¶æ 230 ã»ãã£ã¹ããã許å¯ç¶æ 231 ã§å¼ã³åºãããï¼å®è¡åéçª 232 * å°ã¸ããã®ç¶æ 233 ã®ã¾ã¾åå²ããï¼ 234 */ 235 ldr r0, =p_schedtsk /* p_schedtsk â r4 â p_runtsk */ 189 * このルーチンは,タスクコンテキスト・CPUロック状態・割込み優先度 190 * マスク全解除状態・ディスパッチ許可状態で呼び出される.実行再開番 191 * 地へもこの状態のまま分岐する. 192 */ 193 ldr r0, =p_schedtsk /* p_schedtsk → r4 → p_runtsk */ 236 194 ldr r4, [r0] 237 195 ldr r1, =p_runtsk 238 196 str r4, [r1] 239 tst r4, r4 /* p_runtsk ãNULLãªãdispatcher_1ã¸*/197 tst r4, r4 /* p_runtskがNULLならdispatcher_1へ */ 240 198 beq dispatcher_1 241 ldr sp, [r4,#TCB_sp] /* ã¿ã¹ã¯ã¹ã¿ãã¯ã復帰*/199 ldr sp, [r4,#TCB_sp] /* タスクスタックを復帰 */ 242 200 #ifdef LOG_DSP_LEAVE 243 mov r0, r4 /* p_runtsk ããã©ã¡ã¼ã¿ã«æ¸¡ã*/201 mov r0, r4 /* p_runtskをパラメータに渡す */ 244 202 bl log_dsp_leave 245 203 #endif /* LOG_DSP_LEAVE */ 246 ldr r0, [r4,#TCB_pc] /* å®è¡åéçªå°ã復帰 */ 247 bx r0 /* p_runtskãr4ã«å 248 ¥ããç¶æ 249 ã§åå²ãã */ 250 251 /* 252 * ã¢ã¤ãã«å¦ç 204 ldr r0, [r4,#TCB_pc] /* 実行再開番地を復帰 */ 205 bx r0 /* p_runtskをr4に入れた状態で分岐する */ 206 207 /* 208 * アイドル処理 253 209 * 254 * å²è¾¼ã¿ããã¹ã¦è¨±å¯ãï¼CPUããã¯è§£é¤ç¶æ 255 ã«ãã¦å²è¾¼ã¿ãå¾ 256 ã¤ï¼ 210 * 割込みをすべて許可し,CPUロック解除状態にして割込みを待つ. 257 211 * 258 * ã¿ã¼ã²ããã«ãã£ã¦ã¯ï¼çé»åã¢ã¼ãçã«ç§»è¡ããããï¼æ¨æºã®æ¹æ³ 259 * ã¨ç°ãªãæé ãå¿ 260 è¦ãªå ´åãããï¼ãã®ãããªã¿ã¼ã²ããã§ã¯ï¼ã¿ã¼ 261 * ã²ããä¾åé¨ã§TOPPERS_CUSTOM_IDLEãå®ç¾©ãï¼ã¢ã»ã³ãã©ãã¯ãã¨ã 262 * ã¦ï¼toppers_asm_custom_idleãç¨æããã°ããï¼ 212 * ターゲットによっては,省電力モード等に移行するため,標準の方法 213 * と異なる手順が必要な場合がある.そのようなターゲットでは,ター 214 * ゲット依存部でTOPPERS_CUSTOM_IDLEを定義し,アセンブラマクロとし 215 * て,toppers_asm_custom_idleを用意すればよい. 263 216 */ 264 217 ALABEL(dispatcher_1) … … 266 219 toppers_asm_custom_idle 267 220 #else /* TOPPERS_CUSTOM_IDLE */ 268 msr cpsr_c, #CPSR_SVC_MODE /* å²è¾¼ã¿ã許å¯ï¼ã¹ã¼ããã¤ã¶ã¢ã¼ãï¼*/221 msr cpsr_c, #CPSR_SVC_MODE /* 割込みを許可(スーパバイザモード)*/ 269 222 #endif /* TOPPERS_CUSTOM_IDLE */ 270 b dispatcher_1 /* å²è¾¼ã¿å¾ 271 ã¡ */ 272 273 /* 274 * ã«ã¼ãã«ã®çµäºå¦çã®å¼åºã 223 b dispatcher_1 /* 割込み待ち */ 224 225 /* 226 * カーネルの終了処理の呼出し 275 227 * 276 * å²è¾¼ã¿ããã¯ç¶æ 277 ã«ãï¼ä½¿ç¨ããã¹ã¿ãã¯ãéã¿ã¹ã¯ã³ã³ããã¹ãç¨ã®ã¹ã¿ã 278 * ã¯é åã«åãæ¿ãï¼exit_kernelãå¼ã³åºãï¼ 228 * 割込みロック状態にし,使用するスタックを非タスクコンテキスト用のスタッ 229 * ク領域に切り替え,exit_kernelを呼び出す. 279 230 */ 280 231 AGLOBAL(call_exit_kernel) 281 232 ALABEL(call_exit_kernel) 282 233 msr cpsr_c, #(CPSR_SVC_MODE AOR CPSR_INTLOCK) 283 ldr r0, =istkpt /* éã¿ã¹ã¯ã³ã³ããã¹ãã®ã¹ã¿ãã¯ã¸*/234 ldr r0, =istkpt /* 非タスクコンテキストのスタックへ */ 284 235 ldr sp, [r0] 285 236 b exit_kernel 286 237 287 238 /* 288 * ã¿ã¹ã¯ã®å®è¡éå§æå¦ç239 * タスクの実行開始時処理 289 240 */ 290 241 ATEXT … … 292 243 AGLOBAL(start_r) 293 244 /* 294 * ãã£ã¹ãããã£æ¬ä½ããå¼ã³åºãããããï¼p_runtskã¯r4ã«å 295 ¥ã£ã¦ããï¼ 245 * ディスパッチャ本体から呼び出されるため,p_runtskはr4に入っている. 296 246 */ 297 247 ALABEL(start_r) … … 300 250 #endif /* TOPPERS_SUPPORT_OVRHDR */ 301 251 msr cpsr_c, #(CPSR_SVC_MODE AOR CPSR_UNLOCK) 302 /* CPUããã¯è§£é¤ç¶æ 303 ã« */ 304 ldr lr, =ext_tsk /* ã¿ã¹ã¯æ¬ä½ããã®æ»ãçªå°ãè¨å® */ 305 ldr r2, [r4,#TCB_p_tinib] /* p_runtsk->p_tinib â r2 */ 306 ldr r0, [r2,#TINIB_exinf] /* exinfããã©ã¡ã¼ã¿ã« */ 307 ldr r1, [r2,#TINIB_task] /* ã¿ã¹ã¯èµ·åçªå°ã«ã¸ã£ã³ã */ 252 /* CPUロック解除状態に */ 253 ldr lr, =ext_tsk /* タスク本体からの戻り番地を設定 */ 254 ldr r2, [r4,#TCB_p_tinib] /* p_runtsk->p_tinib → r2 */ 255 ldr r0, [r2,#TINIB_exinf] /* exinfをパラメータに */ 256 ldr r1, [r2,#TINIB_task] /* タスク起動番地にジャンプ */ 308 257 bx r1 309 258 310 259 /* 311 * å²è¾¼ã¿ãã³ãã©ã®åºå 312 ¥å£å¦ç 260 * 割込みハンドラの出入口処理 313 261 */ 314 262 #ifndef OMIT_IRQ_HANDLER … … 318 266 ALABEL(irq_handler) 319 267 /* 320 * ããã«ã¯ï¼IRQã¢ã¼ãã§åå²ãã¦ããï¼321 */ 322 #if __TARGET_ARCH_ARM < 6 323 /* 324 * ã¹ã¼ããã¤ã¶ã¢ã¼ãã«åãæãï¼ã¹ã¯ã©ããã¬ã¸ã¹ã¿ãä¿åããï¼268 * ここには,IRQモードで分岐してくる. 269 */ 270 #if __TARGET_ARCH_ARM < 6 271 /* 272 * スーパバイザモードに切り換え,スクラッチレジスタを保存する. 325 273 */ 326 274 msr cpsr_c, #(CPSR_SVC_MODE AOR CPSR_IRQ_BIT) 327 stmfd sp!, {r0-r5,r12,lr,pc} /* pcã¯ã¹ãã¼ã¹ç¢ºä¿ã®ãã */ 328 329 /* 330 * IRQã¢ã¼ãã«æ»ãã¦ï¼æ»ãçªå°ã¨spsrï¼æ»ãå 331 ã®cpsrï¼ãåå¾ããï¼ 275 stmfd sp!, {r0-r5,r12,lr,pc} /* pcはスペース確保のため */ 276 277 /* 278 * IRQモードに戻して,戻り番地とspsr(戻り先のcpsr)を取得する. 332 279 */ 333 280 msr cpsr_c, #(CPSR_IRQ_MODE AOR CPSR_IRQ_BIT) … … 336 283 337 284 /* 338 * ã¹ã¼ããã¤ã¶ã¢ã¼ãã«åãæãï¼æ»ãçªå°ã¨spsrãä¿åããï¼285 * スーパバイザモードに切り換え,戻り番地とspsrを保存する. 339 286 */ 340 287 msr cpsr_c, #(CPSR_SVC_MODE AOR CPSR_IRQ_BIT) 341 str r2, [sp,#0x20] /* æ»ãçªå°ãã¹ã¿ãã¯ã«ä¿å */ 342 push {r1} /* spsrãã¹ã¿ãã¯ã«ä¿å */ 343 #else /* __TARGET_ARCH_ARM < 6 */ 344 /* 345 * æ»ãå 346 ï¼lrï¼ã¨spsrï¼cpsr_svcï¼ãã¹ã¼ããã¤ã¶ã¢ã¼ãã®ã¹ã¿ãã¯ã« 347 * ä¿åããï¼ 348 */ 349 sub lr, lr, #4 /* æ»ãçªå°ã®ç®åº */ 288 str r2, [sp,#0x20] /* 戻り番地をスタックに保存 */ 289 push {r1} /* spsrをスタックに保存 */ 290 #else /* __TARGET_ARCH_ARM < 6 */ 291 /* 292 * 戻り先(lr)とspsr(cpsr_svc)をスーパバイザモードのスタックに 293 * 保存する. 294 */ 295 sub lr, lr, #4 /* 戻り番地の算出 */ 350 296 srsfd #CPSR_SVC_MODE! 351 297 352 298 /* 353 * ã¹ã¼ããã¤ã¶ã¢ã¼ãã«åãæãï¼ã¹ã¯ã©ããã¬ã¸ã¹ã¿ãä¿åããï¼299 * スーパバイザモードに切り換え,スクラッチレジスタを保存する. 354 300 */ 355 301 cps #CPSR_SVC_MODE … … 358 304 359 305 /* 360 * ã¹ã¿ãã¯ãã¤ã³ã¿ã®èª¿æ´306 * スタックポインタの調整 361 307 */ 362 308 and r1, sp, #4 363 309 sub sp, sp, r1 364 push {r0,r1} /* r0 ã¯ã¹ãã¼ã¹ç¢ºä¿ã®ãã*/365 366 /* 367 * ä¾å¤ãã¹ãã«ã¦ã³ããã¤ã³ã¯ãªã¡ã³ãããï¼å²è¾¼ã¿ãéã¿ã¹ã¯ã³ã³ãã368 * ã¹ãã§çºçããå ´åã«ã¯ï¼irq_handler_1ã¸åå²ããï¼310 push {r0,r1} /* r0はスペース確保のため */ 311 312 /* 313 * 例外ネストカウントをインクリメントする.割込みが非タスクコンテキ 314 * ストで発生した場合には,irq_handler_1へ分岐する. 369 315 */ 370 316 ldr r2, =excpt_nest_count … … 372 318 add r3, r3, #1 373 319 str r3, [r2] 374 teq r3, #1 /* å²è¾¼ã¿ãéã¿ã¹ã¯ã³ã³ããã¹ãã§çºç*/375 bne irq_handler_1 /* ãªãirq_handler_1ã«åå²*/320 teq r3, #1 /* 割込みが非タスクコンテキストで発生 */ 321 bne irq_handler_1 /* ならirq_handler_1に分岐 */ 376 322 377 323 #ifdef TOPPERS_SUPPORT_OVRHDR 378 324 /* 379 * ãªã¼ãã©ã³ã¿ã¤ããåæ¢ããï¼325 * オーバランタイマを停止する. 380 326 */ 381 327 bl ovrtimer_stop … … 383 329 384 330 /* 385 * éã¿ã¹ã¯ã³ã³ããã¹ãç¨ã®ã¹ã¿ãã¯ã«åãæããï¼386 */ 387 mov r3, sp /* ãã®æç¹ã®ã¹ã¿ãã¯ãã¤ã³ã¿ãr3ã«*/388 ldr r2, =istkpt /* éã¿ã¹ã¯ã³ã³ããã¹ãç¨ã®ã¹ã¿ãã¯ã«*/331 * 非タスクコンテキスト用のスタックに切り換える. 332 */ 333 mov r3, sp /* この時点のスタックポインタをr3に */ 334 ldr r2, =istkpt /* 非タスクコンテキスト用のスタックに */ 389 335 ldr sp, [r2] 390 push {r0,r3} /* åæãåã®ã¹ã¿ãã¯ãã¤ã³ã¿ãä¿å*/391 /* r0 ã¯ã¹ãã¼ã¹ç¢ºä¿ã®ãã*/336 push {r0,r3} /* 切換え前のスタックポインタを保存 */ 337 /* r0はスペース確保のため */ 392 338 ALABEL(irq_handler_1) 393 339 /* 394 * å²è¾¼ã¿ã³ã³ããã¼ã©ãæä½ãï¼å²è¾¼ã¿çªå·ãåå¾ããï¼340 * 割込みコントローラを操作し,割込み番号を取得する. 395 341 */ 396 342 bl irc_begin_int 397 343 #if TNUM_INHNO <= 256 || __TARGET_ARCH_ARM <= 6 398 cmp r4, #TNUM_INHNO /* TNUM_INHNO ã®å¤ã«ãã£ã¦ã¯ã¨ã©ã¼ã«ãªã*/344 cmp r4, #TNUM_INHNO /* TNUM_INHNOの値によってはエラーになる */ 399 345 #else /* TNUM_INHNO <= 256 || __TARGET_ARCH_ARM <= 6 */ 400 346 movw r3, #TNUM_INHNO 401 347 cmp r4, r3 402 348 #endif /* TNUM_INHNO <= 256 || __TARGET_ARCH_ARM <= 6 */ 403 bhs irq_handler_2 /* ã¹ããªã¢ã¹å²è¾¼ã¿ãªã */ 404 /* irq_handler_2ã«åå² */ 405 /* 406 * CPUããã¯è§£é¤ç¶æ 407 ã«ããï¼ 349 bhs irq_handler_2 /* スプリアス割込みなら */ 350 /* irq_handler_2に分岐 */ 351 /* 352 * CPUロック解除状態にする. 408 353 */ 409 354 #if __TARGET_ARCH_ARM < 6 … … 419 364 #ifdef LOG_INH_ENTER 420 365 /* 421 * ãã°åºåã®å¼åºã422 */ 423 mov r0, r4 /* å²è¾¼ã¿çªå·ããã©ã¡ã¼ã¿ã«æ¸¡ã*/366 * ログ出力の呼出し 367 */ 368 mov r0, r4 /* 割込み番号をパラメータに渡す */ 424 369 bl log_inh_enter 425 370 #endif /* LOG_INH_ENTER */ 426 371 427 372 /* 428 * å²è¾¼ã¿ãã³ãã©ã®å¼åºã429 */ 430 ldr r2, =inh_table /* å²è¾¼ã¿ãã³ãã©ãã¼ãã«ã®èªè¾¼ã¿*/431 ldr r1, [r2,r4,lsl #2] /* å²è¾¼ã¿ãã³ãã©ã®çªå° âr1 */432 mov lr, pc /* å²è¾¼ã¿ãã³ãã©ã®å¼åºã*/373 * 割込みハンドラの呼出し 374 */ 375 ldr r2, =inh_table /* 割込みハンドラテーブルの読込み */ 376 ldr r1, [r2,r4,lsl #2] /* 割込みハンドラの番地 → r1 */ 377 mov lr, pc /* 割込みハンドラの呼出し */ 433 378 bx r1 434 379 435 380 #ifdef LOG_INH_LEAVE 436 381 /* 437 * ãã°åºåã®å¼åºã438 */ 439 mov r0, r4 /* å²è¾¼ã¿çªå·ããã©ã¡ã¼ã¿ã«æ¸¡ã*/382 * ログ出力の呼出し 383 */ 384 mov r0, r4 /* 割込み番号をパラメータに渡す */ 440 385 bl log_inh_leave 441 386 #endif /* LOG_INH_LEAVE */ 442 387 443 388 /* 444 * ã«ã¼ãã«ç®¡çã®å²è¾¼ã¿ãç¦æ¢ããï¼389 * カーネル管理の割込みを禁止する. 445 390 */ 446 391 #if __TARGET_ARCH_ARM < 6 … … 455 400 456 401 /* 457 * å²è¾¼ã¿ã³ã³ããã¼ã©ãæä½ããï¼402 * 割込みコントローラを操作する. 458 403 */ 459 404 ALABEL(irq_handler_2) … … 461 406 462 407 /* 463 * ä¾å¤ãã¹ãã«ã¦ã³ãããã¯ãªã¡ã³ãããï¼408 * 例外ネストカウントをデクリメントする. 464 409 */ 465 410 ldr r2, =excpt_nest_count 466 411 ldr r3, [r2] 467 412 subs r3, r3, #1 468 str r3, [r2] /* æ»ãå 469 ãéã¿ã¹ã¯ã³ã³ããã¹ããªã */ 470 bne irq_handler_5 /* irq_handler_5ã«åå² */ 471 472 /* 473 * ã¿ã¹ã¯ç¨ã®ã¹ã¿ãã¯ã«æ»ãï¼ 413 str r3, [r2] /* 戻り先が非タスクコンテキストなら */ 414 bne irq_handler_5 /* irq_handler_5に分岐 */ 415 416 /* 417 * タスク用のスタックに戻す. 474 418 */ 475 419 pop {r0,r3} … … 477 421 478 422 /* 479 * p_runtsk ãNULLãå¤å®ããï¼480 */ 481 ldr r0, =p_runtsk /* p_runtsk âr0 */423 * p_runtskがNULLか判定する. 424 */ 425 ldr r0, =p_runtsk /* p_runtsk → r0 */ 482 426 ldr r0, [r0] 483 tst r0, r0 /* p_runtskãNULLã§ãªããã° */ 484 bne irq_handler_3 /* irq_handler_3ã«åå² */ 485 486 /* 487 * ã¿ã¹ã¯ã®ã¹ã¿ãã¯ã«ä¿åããã¹ã¯ã©ããã¬ã¸ã¹ã¿çãæ¨ã¦ãï¼ 488 */ 489 pop {r0,r1} /* ã¹ã¿ãã¯ãã¤ã³ã¿ã®èª¿æ´ãå 490 ã«æ»ã */ 427 tst r0, r0 /* p_runtskがNULLでなければ */ 428 bne irq_handler_3 /* irq_handler_3に分岐 */ 429 430 /* 431 * タスクのスタックに保存したスクラッチレジスタ等を捨てる. 432 */ 433 pop {r0,r1} /* スタックポインタの調整を元に戻す */ 491 434 add sp, sp, r1 492 add sp, sp, #40 /* ã¹ã¯ã©ããã¬ã¸ã¹ã¿ãæ¨ã¦ã*/435 add sp, sp, #40 /* スクラッチレジスタを捨てる */ 493 436 b dispatcher_0 494 437 495 438 /* 496 * ãã£ã¹ããããå¿ 497 è¦ãå¤å®ããï¼ 439 * ディスパッチが必要か判定する. 498 440 */ 499 441 ALABEL(irq_handler_3) 500 ldr r1, =p_schedtsk /* p_schedtsk âr1 */442 ldr r1, =p_schedtsk /* p_schedtsk → r1 */ 501 443 ldr r1, [r1] 502 teq r0, r1 /* p_runtsk ã¨p_schedtskãåããªã*/503 beq irq_handler_4 /* irq_handler_4 ã¸*/504 505 /* 506 * ã³ã³ããã¹ããä¿åããï¼507 */ 508 stmfd sp!, {r6-r11} /* éã¹ã¯ã©ããã¬ã¸ã¹ã¿ã®ä¿å*/509 str sp, [r0,#TCB_sp] /* ã¹ã¿ãã¯ãã¤ã³ã¿ãä¿å*/510 adr r1, ret_int_r /* å®è¡åéçªå°ãä¿å*/444 teq r0, r1 /* p_runtskとp_schedtskが同じなら */ 445 beq irq_handler_4 /* irq_handler_4へ */ 446 447 /* 448 * コンテキストを保存する. 449 */ 450 stmfd sp!, {r6-r11} /* 非スクラッチレジスタの保存 */ 451 str sp, [r0,#TCB_sp] /* スタックポインタを保存 */ 452 adr r1, ret_int_r /* 実行再開番地を保存 */ 511 453 str r1, [r0,#TCB_pc] 512 b dispatcher /* r0 ã«ã¯p_runtskãæ ¼ç´ããã¦ãã*/454 b dispatcher /* r0にはp_runtskが格納されている */ 513 455 514 456 ALABEL(ret_int_r) 515 457 /* 516 * ã³ã³ããã¹ãã復帰ããï¼517 */ 518 ldmfd sp!, {r6-r11} /* éã¹ã¯ã©ããã¬ã¸ã¹ã¿ã®å¾©å¸°*/458 * コンテキストを復帰する. 459 */ 460 ldmfd sp!, {r6-r11} /* 非スクラッチレジスタの復帰 */ 519 461 520 462 ALABEL(irq_handler_4) 521 463 #ifdef TOPPERS_SUPPORT_OVRHDR 522 464 /* 523 * ãªã¼ãã©ã³ã¿ã¤ããåä½éå§ããï¼465 * オーバランタイマを動作開始する. 524 466 */ 525 467 bl ovrtimer_start … … 527 469 528 470 /* 529 * å²è¾¼ã¿ï¼CPUä¾å¤å¦çããã®ãªã¿ã¼ã³471 * 割込み/CPU例外処理からのリターン 530 472 * 531 * å²è¾¼ã¿ï¼CPUä¾å¤å¦çããã®ãªã¿ã¼ã³ã«ããï¼CPUããã¯è§£é¤ç¶æ 532 ã«é· 533 * 移ããããã«ããå¿ 534 è¦ããããï¼ARMã¯CPSRã®ãããã«ãã£ã¦CPUãã 535 * ã¯ç¶æ 536 ã表ãã¦ããããï¼CPSRãå 537 ã«æ»ãã¦ãªã¿ã¼ã³ããã°ããï¼ 473 * 割込み/CPU例外処理からのリターンにより,CPUロック解除状態に遷 474 * 移するようにする必要があるが,ARMはCPSRのビットによってCPUロッ 475 * ク状態を表しているため,CPSRを元に戻してリターンすればよい. 538 476 */ 539 477 ALABEL(irq_handler_5) 540 pop {r0,r1} /* ã¹ã¿ãã¯ãã¤ã³ã¿ã®èª¿æ´ãå 541 ã«æ»ã */ 478 pop {r0,r1} /* スタックポインタの調整を元に戻す */ 542 479 add sp, sp, r1 543 480 544 481 #if __TARGET_ARCH_ARM < 6 545 ldmfd sp!, {r0} /* æ»ãå 546 ã®cpsrãspsrã«è¨å® */ 482 ldmfd sp!, {r0} /* 戻り先のcpsrをspsrに設定 */ 547 483 msr spsr_cxsf, r0 548 ldmfd sp!, {r0-r5,r12,lr,pc}^ /* ã³ã³ããã¹ãã®å¾©å¸°*/549 /* ^ ä»ããªã®ã§ï¼spsr âcpsr */484 ldmfd sp!, {r0-r5,r12,lr,pc}^ /* コンテキストの復帰 */ 485 /* ^付きなので,spsr → cpsr */ 550 486 #else /* __TARGET_ARCH_ARM < 6 */ 551 487 ldmfd sp!, {r0-r5,r12,lr} … … 555 491 556 492 /* 557 * CPUä¾å¤ãã³ãã©åºå 558 ¥å£å¦ç 493 * CPU例外ハンドラ出入口処理 559 494 */ 560 495 ALABEL(start_exc_entry) 561 496 562 497 /* 563 * æªå®ç¾©å½ä»¤498 * 未定義命令 564 499 */ 565 500 #ifndef OMIT_UNDEF_HANDLER … … 569 504 ALABEL(undef_handler) 570 505 /* 571 * ããã«ã¯ï¼æªå®ç¾©ã¢ã¼ãã§åå²ãã¦ããï¼572 */ 573 #if __TARGET_ARCH_ARM < 6 574 /* 575 * I ãããã¨Fããããã»ãããï¼ã¹ã¼ããã¤ã¶ã¢ã¼ãã«åãæãï¼ã¹ã¯576 * ã©ããã¬ã¸ã¹ã¿ãä¿åããï¼506 * ここには,未定義モードで分岐してくる. 507 */ 508 #if __TARGET_ARCH_ARM < 6 509 /* 510 * IビットとFビットをセットし,スーパバイザモードに切り換え,スク 511 * ラッチレジスタを保存する. 577 512 */ 578 513 msr cpsr_c, #(CPSR_SVC_MODE AOR CPSR_FIQ_IRQ_BIT) 579 stmfd sp!, {r0-r5,r12,lr,pc} /* pc ã¯ã¹ãã¼ã¹ç¢ºä¿ã®ãã*/580 581 /* 582 * æªå®ç¾©ã¢ã¼ãã«æ»ãã¦ï¼æ»ãçªå°ã¨spsrãåå¾ããï¼514 stmfd sp!, {r0-r5,r12,lr,pc} /* pcはスペース確保のため */ 515 516 /* 517 * 未定義モードに戻して,戻り番地とspsrを取得する. 583 518 */ 584 519 msr cpsr_c, #(CPSR_UND_MODE AOR CPSR_FIQ_IRQ_BIT) … … 587 522 588 523 /* 589 * ã¹ã¼ããã¤ã¶ã¢ã¼ãã«åãæãï¼æ»ãçªå°ã¨spsrãä¿åããï¼524 * スーパバイザモードに切り換え,戻り番地とspsrを保存する. 590 525 */ 591 526 msr cpsr_c, #(CPSR_SVC_MODE AOR CPSR_FIQ_IRQ_BIT) 592 str r2, [sp,#0x20] /* æ»ãçªå°ãã¹ã¿ãã¯ã«ä¿å */ 593 push {r1} /* spsrãã¹ã¿ãã¯ã«ä¿å */ 594 #else /* __TARGET_ARCH_ARM < 6 */ 595 /* 596 * æ»ãå 597 ï¼lrï¼ã¨spsrï¼cpsr_svcï¼ãã¹ã¼ããã¤ã¶ã¢ã¼ãã®ã¹ã¿ãã¯ã« 598 * ä¿åããï¼ 527 str r2, [sp,#0x20] /* 戻り番地をスタックに保存 */ 528 push {r1} /* spsrをスタックに保存 */ 529 #else /* __TARGET_ARCH_ARM < 6 */ 530 /* 531 * 戻り先(lr)とspsr(cpsr_svc)をスーパバイザモードのスタックに 532 * 保存する. 599 533 */ 600 534 srsfd #CPSR_SVC_MODE! 601 535 602 536 /* 603 * ã¹ã¼ããã¤ã¶ã¢ã¼ãã«åãæãï¼ã¹ã¯ã©ããã¬ã¸ã¹ã¿ãä¿åããï¼537 * スーパバイザモードに切り換え,スクラッチレジスタを保存する. 604 538 */ 605 539 cps #CPSR_SVC_MODE … … 611 545 612 546 /* 613 * ã¹ã¼ããã¤ã¶ã³ã¼ã«547 * スーパバイザコール 614 548 */ 615 549 #ifndef OMIT_SVC_HANDLER … … 619 553 ALABEL(svc_handler) 620 554 /* 621 * ããã«ã¯ï¼ã¹ã¼ããã¤ã¶ã¢ã¼ãã§åå²ãã¦ããï¼622 */ 623 #if __TARGET_ARCH_ARM < 6 624 /* 625 * I ãããã¨Fããããã»ãããï¼ã¹ã¯ã©ããã¬ã¸ã¹ã¿ãä¿åããï¼555 * ここには,スーパバイザモードで分岐してくる. 556 */ 557 #if __TARGET_ARCH_ARM < 6 558 /* 559 * IビットとFビットをセットし,スクラッチレジスタを保存する. 626 560 */ 627 561 msr cpsr_c, #(CPSR_SVC_MODE AOR CPSR_FIQ_IRQ_BIT) 628 stmfd sp!, {r0-r5,r12,lr,pc} /* pc ã¯ã¹ãã¼ã¹ç¢ºä¿ã®ãã*/629 630 /* 631 * æ»ãçªå°ã¨spsrãåå¾ããï¼562 stmfd sp!, {r0-r5,r12,lr,pc} /* pcはスペース確保のため */ 563 564 /* 565 * 戻り番地とspsrを取得する. 632 566 */ 633 567 mov r2, lr … … 635 569 636 570 /* 637 * æ»ãçªå°ã¨spsrãä¿åããï¼ 638 */ 639 str r2, [sp,#0x20] /* æ»ãçªå°ãã¹ã¿ãã¯ã«ä¿å */ 640 push {r1} /* spsrãã¹ã¿ãã¯ã«ä¿å */ 641 #else /* __TARGET_ARCH_ARM < 6 */ 642 /* 643 * æ»ãå 644 ï¼lrï¼ã¨spsrï¼cpsr_svcï¼ãã¹ã¼ããã¤ã¶ã¢ã¼ãã®ã¹ã¿ãã¯ã« 645 * ä¿åããï¼ 571 * 戻り番地とspsrを保存する. 572 */ 573 str r2, [sp,#0x20] /* 戻り番地をスタックに保存 */ 574 push {r1} /* spsrをスタックに保存 */ 575 #else /* __TARGET_ARCH_ARM < 6 */ 576 /* 577 * 戻り先(lr)とspsr(cpsr_svc)をスーパバイザモードのスタックに 578 * 保存する. 646 579 */ 647 580 srsfd #CPSR_SVC_MODE! 648 581 649 582 /* 650 * ã¹ã¼ããã¤ã¶ã¢ã¼ãã§ï¼ã¹ã¯ã©ããã¬ã¸ã¹ã¿ãä¿åããï¼651 */ 652 cps #CPSR_SVC_MODE /* ä¸è¦ã¨æããã*/583 * スーパバイザモードで,スクラッチレジスタを保存する. 584 */ 585 cps #CPSR_SVC_MODE /* 不要と思われる */ 653 586 stmfd sp!, {r0-r5,r12,lr} 654 587 #endif /* __TARGET_ARCH_ARM < 6 */ … … 658 591 659 592 /* 660 * ããªãã§ããã¢ãã¼ã593 * プリフェッチアボート 661 594 */ 662 595 #ifndef OMIT_PABORT_HANDLER … … 666 599 ALABEL(pabort_handler) 667 600 /* 668 * ããã«ã¯ï¼ã¢ãã¼ãã¢ã¼ãã§åå²ãã¦ããï¼669 */ 670 #if __TARGET_ARCH_ARM < 6 671 /* 672 * I ãããã¨Fããããã»ãããï¼ã¹ã¼ããã¤ã¶ã¢ã¼ãã«åãæãï¼ã¹ã¯673 * ã©ããã¬ã¸ã¹ã¿ãä¿åããï¼601 * ここには,アボートモードで分岐してくる. 602 */ 603 #if __TARGET_ARCH_ARM < 6 604 /* 605 * IビットとFビットをセットし,スーパバイザモードに切り換え,スク 606 * ラッチレジスタを保存する. 674 607 */ 675 608 msr cpsr_c, #(CPSR_SVC_MODE AOR CPSR_FIQ_IRQ_BIT) 676 stmfd sp!, {r0-r5,r12,lr,pc} /* pc ã¯ã¹ãã¼ã¹ç¢ºä¿ã®ãã*/677 678 /* 679 * ã¢ãã¼ãã¢ã¼ãã«æ»ãã¦ï¼æ»ãçªå°ã¨spsrãåå¾ããï¼609 stmfd sp!, {r0-r5,r12,lr,pc} /* pcはスペース確保のため */ 610 611 /* 612 * アボートモードに戻して,戻り番地とspsrを取得する. 680 613 */ 681 614 msr cpsr_c, #(CPSR_ABT_MODE AOR CPSR_FIQ_IRQ_BIT) … … 684 617 685 618 /* 686 * ã¹ã¼ããã¤ã¶ã¢ã¼ãã«åãæãï¼æ»ãçªå°ã¨spsrãä¿åããï¼619 * スーパバイザモードに切り換え,戻り番地とspsrを保存する. 687 620 */ 688 621 msr cpsr_c, #(CPSR_SVC_MODE AOR CPSR_FIQ_IRQ_BIT) 689 str r2, [sp,#0x20] /* æ»ãçªå°ãã¹ã¿ãã¯ã«ä¿å */ 690 push {r1} /* spsrãã¹ã¿ãã¯ã«ä¿å */ 691 #else /* __TARGET_ARCH_ARM < 6 */ 692 /* 693 * æ»ãå 694 ï¼lrï¼ã¨spsrï¼cpsr_svcï¼ãã¹ã¼ããã¤ã¶ã¢ã¼ãã®ã¹ã¿ãã¯ã« 695 * ä¿åããï¼ 622 str r2, [sp,#0x20] /* 戻り番地をスタックに保存 */ 623 push {r1} /* spsrをスタックに保存 */ 624 #else /* __TARGET_ARCH_ARM < 6 */ 625 /* 626 * 戻り先(lr)とspsr(cpsr_svc)をスーパバイザモードのスタックに 627 * 保存する. 696 628 */ 697 629 srsfd #CPSR_SVC_MODE! 698 630 699 631 /* 700 * ã¹ã¼ããã¤ã¶ã¢ã¼ãã«åãæãï¼ã¹ã¯ã©ããã¬ã¸ã¹ã¿ãä¿åããï¼632 * スーパバイザモードに切り換え,スクラッチレジスタを保存する. 701 633 */ 702 634 cps #CPSR_SVC_MODE … … 708 640 709 641 /* 710 * ãã¼ã¿ã¢ãã¼ã642 * データアボート 711 643 */ 712 644 #ifndef OMIT_DABORT_HANDLER … … 716 648 ALABEL(dabort_handler) 717 649 /* 718 * ããã«ã¯ï¼ã¢ãã¼ãã¢ã¼ãã§åå²ãã¦ããï¼650 * ここには,アボートモードで分岐してくる. 719 651 * 720 * ãã¼ã¿ã¢ãã¼ããï¼CPUä¾å¤ã®å 721 ¥å£ï¼start_exc_entryã¨end_exc_entry 722 * ã®éï¼ã§çºçããå ´åã«ã¯ï¼fatal_dabort_handlerã«åå²ããï¼ã¢ãã¼ 723 * ãã¢ã¼ãã®spãæ±ç¨ã¬ã¸ã¹ã¿ã®ä»£ããã«ä½¿ç¨ããï¼ 652 * データアボートが,CPU例外の入口(start_exc_entryとend_exc_entry 653 * の間)で発生した場合には,fatal_dabort_handlerに分岐する.アボー 654 * トモードのspを汎用レジスタの代わりに使用する. 724 655 */ 725 656 ldr sp, =start_exc_entry+8 … … 733 664 #if __TARGET_ARCH_ARM < 6 734 665 /* 735 * I ãããã¨Fããããã»ãããï¼ã¹ã¼ããã¤ã¶ã¢ã¼ãã«åãæãï¼ã¹ã¯736 * ã©ããã¬ã¸ã¹ã¿ãä¿åããï¼666 * IビットとFビットをセットし,スーパバイザモードに切り換え,スク 667 * ラッチレジスタを保存する. 737 668 */ 738 669 msr cpsr_c, #(CPSR_SVC_MODE AOR CPSR_FIQ_IRQ_BIT) 739 stmfd sp!, {r0-r5,r12,lr,pc} /* pc ã¯ã¹ãã¼ã¹ç¢ºä¿ã®ãã*/740 741 /* 742 * ã¢ãã¼ãã¢ã¼ãã«æ»ãã¦ï¼æ»ãçªå°ã¨spsrãåå¾ããï¼670 stmfd sp!, {r0-r5,r12,lr,pc} /* pcはスペース確保のため */ 671 672 /* 673 * アボートモードに戻して,戻り番地とspsrを取得する. 743 674 */ 744 675 msr cpsr_c, #(CPSR_ABT_MODE AOR CPSR_FIQ_IRQ_BIT) … … 747 678 748 679 /* 749 * ã¹ã¼ããã¤ã¶ã¢ã¼ãã«åãæãï¼æ»ãçªå°ã¨spsrãä¿åããï¼680 * スーパバイザモードに切り換え,戻り番地とspsrを保存する. 750 681 */ 751 682 msr cpsr_c, #(CPSR_SVC_MODE AOR CPSR_FIQ_IRQ_BIT) 752 str r2, [sp,#0x20] /* æ»ãçªå°ãã¹ã¿ãã¯ã«ä¿å */ 753 push {r1} /* spsrãã¹ã¿ãã¯ã«ä¿å */ 754 #else /* __TARGET_ARCH_ARM < 6 */ 755 /* 756 * æ»ãå 757 ï¼lrï¼ã¨spsrï¼cpsr_svcï¼ãã¹ã¼ããã¤ã¶ã¢ã¼ãã®ã¹ã¿ãã¯ã« 758 * ä¿åããï¼ 683 str r2, [sp,#0x20] /* 戻り番地をスタックに保存 */ 684 push {r1} /* spsrをスタックに保存 */ 685 #else /* __TARGET_ARCH_ARM < 6 */ 686 /* 687 * 戻り先(lr)とspsr(cpsr_svc)をスーパバイザモードのスタックに 688 * 保存する. 759 689 */ 760 690 srsfd #CPSR_SVC_MODE! 761 691 762 692 /* 763 * ã¹ã¼ããã¤ã¶ã¢ã¼ãã«åãæãï¼ã¹ã¯ã©ããã¬ã¸ã¹ã¿ãä¿åããï¼693 * スーパバイザモードに切り換え,スクラッチレジスタを保存する. 764 694 */ 765 695 cps #CPSR_SVC_MODE … … 771 701 772 702 /* 773 * CPUä¾å¤ã®å 774 ¥å£ã§çºçãããã¼ã¿ã¢ãã¼ã 703 * CPU例外の入口で発生したデータアボート 775 704 */ 776 705 ALABEL(fatal_dabort_handler) 777 706 #if __TARGET_ARCH_ARM < 6 778 707 /* 779 * I ãããã¨Fããããã»ãããï¼ã¹ã¼ããã¤ã¶ã¢ã¼ãã«åãæãï¼ã¹ã¿ã780 * ã¯ãã¤ã³ã¿ãåæåãï¼ã¹ã¯ã©ããã¬ã¸ã¹ã¿ãä¿åããï¼708 * IビットとFビットをセットし,スーパバイザモードに切り換え,スタッ 709 * クポインタを初期化し,スクラッチレジスタを保存する. 781 710 */ 782 711 msr cpsr_c, #(CPSR_SVC_MODE AOR CPSR_FIQ_IRQ_BIT) 783 712 ldr sp, =istkpt 784 713 ldr sp, [sp] 785 stmfd sp!, {r0-r5,r12,lr,pc} /* pc ã¯ã¹ãã¼ã¹ç¢ºä¿ã®ãã*/786 787 /* 788 * ã¢ãã¼ãã¢ã¼ãã«æ»ãã¦ï¼æ»ãçªå°ã¨spsrãåå¾ããï¼714 stmfd sp!, {r0-r5,r12,lr,pc} /* pcはスペース確保のため */ 715 716 /* 717 * アボートモードに戻して,戻り番地とspsrを取得する. 789 718 */ 790 719 msr cpsr_c, #(CPSR_ABT_MODE AOR CPSR_FIQ_IRQ_BIT) … … 793 722 794 723 /* 795 * ã¹ã¼ããã¤ã¶ã¢ã¼ãã«åãæãï¼æ»ãçªå°ã¨spsrãä¿åããï¼724 * スーパバイザモードに切り換え,戻り番地とspsrを保存する. 796 725 */ 797 726 msr cpsr_c, #(CPSR_SVC_MODE AOR CPSR_FIQ_IRQ_BIT) 798 str r2, [sp,#0x20] /* æ»ãçªå°ãã¹ã¿ãã¯ã«ä¿å*/799 push {r1} /* spsr ãã¹ã¿ãã¯ã«ä¿å*/800 #else /* __TARGET_ARCH_ARM < 6 */ 801 /* 802 * I ãããã¨Fããããã»ãããï¼ã¹ã¼ããã¤ã¶ã¢ã¼ãã«åãæãï¼ã¹ã¿ã803 * ã¯ãã¤ã³ã¿ãåæåããï¼727 str r2, [sp,#0x20] /* 戻り番地をスタックに保存 */ 728 push {r1} /* spsrをスタックに保存 */ 729 #else /* __TARGET_ARCH_ARM < 6 */ 730 /* 731 * IビットとFビットをセットし,スーパバイザモードに切り換え,スタッ 732 * クポインタを初期化する. 804 733 */ 805 734 cpsid if, #CPSR_SVC_MODE … … 808 737 809 738 /* 810 * ã¢ãã¼ãã¢ã¼ãã«æ»ãã¦ï¼æ»ãå 811 ï¼lrï¼ã¨spsrï¼cpsr_svcï¼ãã¹ã¼ã 812 * ãã¤ã¶ã¢ã¼ãã®ã¹ã¿ãã¯ã«ä¿åããï¼ 739 * アボートモードに戻して,戻り先(lr)とspsr(cpsr_svc)をスーパ 740 * バイザモードのスタックに保存する. 813 741 */ 814 742 cps #CPSR_ABT_MODE … … 816 744 817 745 /* 818 * ã¹ã¼ããã¤ã¶ã¢ã¼ãã«åãæãï¼ã¹ã¯ã©ããã¬ã¸ã¹ã¿ãä¿åããï¼746 * スーパバイザモードに切り換え,スクラッチレジスタを保存する. 819 747 */ 820 748 cps #CPSR_SVC_MODE … … 823 751 824 752 /* 825 * ä¾å¤ãã¹ãã«ã¦ã³ãã®æä¸ä½ãããã1ã«ããï¼753 * 例外ネストカウントの最上位ビットを1にする. 826 754 */ 827 755 ldr r2, =excpt_nest_count … … 842 770 ALABEL(fiq_handler) 843 771 /* 844 * ããã«ã¯ï¼FIQã¢ã¼ãã§åå²ãã¦ããï¼845 */ 846 #if __TARGET_ARCH_ARM < 6 847 /* 848 * I ãããã¨Fããããã»ãããï¼ã¹ã¼ããã¤ã¶ã¢ã¼ãã«åãæãï¼ã¹ã¯849 * ã©ããã¬ã¸ã¹ã¿ãä¿åããï¼772 * ここには,FIQモードで分岐してくる. 773 */ 774 #if __TARGET_ARCH_ARM < 6 775 /* 776 * IビットとFビットをセットし,スーパバイザモードに切り換え,スク 777 * ラッチレジスタを保存する. 850 778 */ 851 779 msr cpsr_c, #(CPSR_SVC_MODE AOR CPSR_FIQ_IRQ_BIT) 852 stmfd sp!, {r0-r5,r12,lr,pc} /* pc ã¯ã¹ãã¼ã¹ç¢ºä¿ã®ãã*/853 854 /* 855 * FIQ ã¢ã¼ãã«æ»ãã¦ï¼æ»ãçªå°ã¨spsrãåå¾ããï¼780 stmfd sp!, {r0-r5,r12,lr,pc} /* pcはスペース確保のため */ 781 782 /* 783 * FIQモードに戻して,戻り番地とspsrを取得する. 856 784 */ 857 785 msr cpsr_c, #(CPSR_FIQ_MODE AOR CPSR_FIQ_IRQ_BIT) … … 860 788 861 789 /* 862 * ã¹ã¼ããã¤ã¶ã¢ã¼ãã«åãæãï¼æ»ãçªå°ã¨spsrãä¿åããï¼790 * スーパバイザモードに切り換え,戻り番地とspsrを保存する. 863 791 */ 864 792 msr cpsr_c, #(CPSR_SVC_MODE AOR CPSR_FIQ_IRQ_BIT) 865 str r2, [sp,#0x20] /* æ»ãçªå°ãã¹ã¿ãã¯ã«ä¿å */ 866 push {r1} /* spsrãã¹ã¿ãã¯ã«ä¿å */ 867 #else /* __TARGET_ARCH_ARM < 6 */ 868 /* 869 * æ»ãå 870 ï¼lrï¼ã¨spsrï¼cpsr_svcï¼ãã¹ã¼ããã¤ã¶ã¢ã¼ãã®ã¹ã¿ãã¯ã« 871 * ä¿åããï¼ 793 str r2, [sp,#0x20] /* 戻り番地をスタックに保存 */ 794 push {r1} /* spsrをスタックに保存 */ 795 #else /* __TARGET_ARCH_ARM < 6 */ 796 /* 797 * 戻り先(lr)とspsr(cpsr_svc)をスーパバイザモードのスタックに 798 * 保存する. 872 799 */ 873 800 srsfd #CPSR_SVC_MODE! 874 801 875 802 /* 876 * ã¹ã¼ããã¤ã¶ã¢ã¼ãã«åãæãï¼ã¹ã¯ã©ããã¬ã¸ã¹ã¿ãä¿åããï¼803 * スーパバイザモードに切り換え,スクラッチレジスタを保存する. 877 804 */ 878 805 cps #CPSR_SVC_MODE … … 886 813 887 814 /* 888 * CPUä¾å¤ãã³ãã©åºå 889 ¥å£å¦çã®å 890 ±éé¨å 815 * CPU例外ハンドラ出入口処理の共通部分 891 816 * 892 * ããã®æç¹ã®ã¬ã¸ã¹ã¿ç¶æ 893 ã 894 * r4ï¼CPUä¾å¤ãã³ãã©çªå· 817 * 【この時点のレジスタ状態】 818 * r4:CPU例外ハンドラ番号 895 819 */ 896 820 ALABEL(exc_handler_1) 897 821 /* 898 * CPUä¾å¤ãçºçããç¶æ³ã®å¤æã«ç¨ããããã«ï¼CPUä¾å¤çºçåã®å² 899 * è¾¼ã¿åªå 900 度ãã¹ã¯ã¨ä¾å¤ãã¹ãã«ã¦ã³ããã¹ã¿ãã¯ã«ä¿åããï¼ 822 * CPU例外が発生した状況の判断に用いるために,CPU例外発生前の割 823 * 込み優先度マスクと例外ネストカウントをスタックに保存する. 901 824 */ 902 825 bl irc_get_intpri 903 push {r0} /* å²è¾¼ã¿åªå 904 度ãã¹ã¯ãä¿å */ 826 push {r0} /* 割込み優先度マスクを保存 */ 905 827 ldr r2, =excpt_nest_count 906 828 ldr r3, [r2] 907 push {r3} /* ä¾å¤ãã¹ãã«ã¦ã³ããä¿å */ 908 mov r5, sp /* CPUä¾å¤ã®æ 909 å ±ãè¨æ¶ãã¦ããé åã® */ 910 /* å 911 é çªå°ãr5ã«ä¿å */ 912 /* 913 * ã¹ã¿ãã¯ãã¤ã³ã¿ã®èª¿æ´ 829 push {r3} /* 例外ネストカウントを保存 */ 830 mov r5, sp /* CPU例外の情報を記憶している領域の */ 831 /* 先頭番地をr5に保存 */ 832 /* 833 * スタックポインタの調整 914 834 */ 915 835 and r1, sp, #4 916 836 sub sp, sp, r1 917 push {r0,r1} /* r0 ã¯ã¹ãã¼ã¹ç¢ºä¿ã®ãã*/918 919 /* 920 * ã«ã¼ãã«ç®¡çå¤ã®CPUä¾å¤ãå¤å®ãã837 push {r0,r1} /* r0はスペース確保のため */ 838 839 /* 840 * カーネル管理外のCPU例外か判定する 921 841 * 922 * ã«ã¼ãã«ç®¡çå¤ã®CPUä¾å¤ã¯ï¼ã«ã¼ãã«å®è¡ä¸ï¼å 923 ¨å²è¾¼ã¿ããã¯ç¶æ 924 ï¼ 925 * CPUããã¯ç¶æ 926 ï¼ã«ã¼ãã«ç®¡çå¤ã®å²è¾¼ã¿ãã³ãã©å®è¡ä¸ã«çºçãã 927 * CPUä¾å¤ã§ããï¼ARMã³ã¢ã®å ´åã¯ï¼æ»ãå 928 ã®CPSRã®IããããFããã 929 * ã®ãããããã»ããããã¦ãããªãï¼ãã該å½ããï¼ 930 */ 931 ldr r1, [r5,#T_EXCINF_cpsr] /* ä¾å¤ãã¬ã¼ã ããcpsrãåå¾ */ 842 * カーネル管理外のCPU例外は,カーネル実行中,全割込みロック状態, 843 * CPUロック状態,カーネル管理外の割込みハンドラ実行中に発生した 844 * CPU例外である.ARMコアの場合は,戻り先のCPSRのIビットかFビット 845 * のいずれかがセットされているなら,これ該当する. 846 */ 847 ldr r1, [r5,#T_EXCINF_cpsr] /* 例外フレームからcpsrを取得 */ 932 848 ands r1, r1, #CPSR_FIQ_IRQ_BIT 933 bne nk_exc_handler_1 /* ã«ã¼ãã«ç®¡çå¤ã®CPUä¾å¤ã®å¦ç㸠*/ 934 935 /* 936 * ããã®æç¹ã®ã¬ã¸ã¹ã¿ç¶æ 937 ã 938 * r2ï¼excpt_nest_countã®çªå° 939 * r3ï¼excpt_nest_countã®å¤ 940 * r4ï¼CPUä¾å¤ãã³ãã©çªå· 941 * r5ï¼CPUä¾å¤ã®æ 942 å ±ãè¨æ¶ãã¦ããé åã®å 943 é çªå° 944 */ 945 946 /* 947 * ä¾å¤ãã¹ãã«ã¦ã³ããã¤ã³ã¯ãªã¡ã³ãããï¼ 849 bne nk_exc_handler_1 /* カーネル管理外のCPU例外の処理へ */ 850 851 /* 852 * 【この時点のレジスタ状態】 853 * r2:excpt_nest_countの番地 854 * r3:excpt_nest_countの値 855 * r4:CPU例外ハンドラ番号 856 * r5:CPU例外の情報を記憶している領域の先頭番地 857 */ 858 859 /* 860 * 例外ネストカウントをインクリメントする. 948 861 */ 949 862 add r3, r3, #1 950 863 str r3, [r2] 951 teq r3, #1 /* CPU ä¾å¤çºçåãéã¿ã¹ã¯ã³ã³ããã¹ã*/952 bne exc_handler_2 /* ãªãexc_handler_2ã«åå²*/864 teq r3, #1 /* CPU例外発生前が非タスクコンテキスト */ 865 bne exc_handler_2 /* ならexc_handler_2に分岐 */ 953 866 954 867 #ifdef TOPPERS_SUPPORT_OVRHDR 955 868 /* 956 * ãªã¼ãã©ã³ã¿ã¤ããåæ¢ããï¼869 * オーバランタイマを停止する. 957 870 */ 958 871 bl ovrtimer_stop … … 960 873 961 874 /* 962 * éã¿ã¹ã¯ã³ã³ããã¹ãç¨ã®ã¹ã¿ãã¯ã«åãæããï¼963 */ 964 mov r3, sp /* ãã®æç¹ã®ã¹ã¿ãã¯ãã¤ã³ã¿ãr3ã«*/965 ldr r2, =istkpt /* éã¿ã¹ã¯ã³ã³ããã¹ãç¨ã®ã¹ã¿ãã¯ã«*/875 * 非タスクコンテキスト用のスタックに切り換える. 876 */ 877 mov r3, sp /* この時点のスタックポインタをr3に */ 878 ldr r2, =istkpt /* 非タスクコンテキスト用のスタックに */ 966 879 ldr sp, [r2] 967 push {r0,r3} /* åæãåã®ã¹ã¿ãã¯ãã¤ã³ã¿ãä¿å*/968 /* r0 ã¯ã¹ãã¼ã¹ç¢ºä¿ã®ãã*/880 push {r0,r3} /* 切換え前のスタックポインタを保存 */ 881 /* r0はスペース確保のため */ 969 882 ALABEL(exc_handler_2) 970 883 /* 971 * ããã®æç¹ã®ã¬ã¸ã¹ã¿ç¶æ 972 ã 973 * r4ï¼CPUä¾å¤ãã³ãã©çªå· 974 * r5ï¼CPUä¾å¤ã®æ 975 å ±ãè¨æ¶ãã¦ããé åã®å 976 é çªå° 977 */ 978 979 /* 980 * ï¼å¿ 981 è¦ãªãï¼å²è¾¼ã¿ã³ã³ããã¼ã©ãæä½ããï¼ 884 * 【この時点のレジスタ状態】 885 * r4:CPU例外ハンドラ番号 886 * r5:CPU例外の情報を記憶している領域の先頭番地 887 */ 888 889 /* 890 * (必要なら)割込みコントローラを操作する. 982 891 */ 983 892 bl irc_begin_exc 984 893 985 894 /* 986 * CPUããã¯è§£é¤ç¶æ 987 ã«ããï¼ 895 * CPUロック解除状態にする. 988 896 * 989 * ã«ã¼ãã«ç®¡çå¤ã®CPUä¾å¤ãã³ãã©ã¯å¥ã«ã¼ãã³ã§å¼ã³åºãããï¼åç´990 * ã«å²è¾¼ã¿ã許å¯ããã ãã§ããï¼897 * カーネル管理外のCPU例外ハンドラは別ルーチンで呼び出すため,単純 898 * に割込みを許可するだけでよい. 991 899 */ 992 900 #if __TARGET_ARCH_ARM < 6 … … 1001 909 1002 910 /* 1003 * ãã°åºåã®å¼åºã911 * ログ出力の呼出し 1004 912 */ 1005 913 #ifdef LOG_EXC_ENTER 1006 mov r0, r4 /* CPU ä¾å¤çªå·ããã©ã¡ã¼ã¿ã«æ¸¡ã*/914 mov r0, r4 /* CPU例外番号をパラメータに渡す */ 1007 915 bl log_exc_enter 1008 916 #endif /* LOG_EXC_ENTER */ 1009 917 1010 918 /* 1011 * CPUä¾å¤ãã³ãã©ã®å¼åºã 1012 */ 1013 ldr r2, =exc_table /* CPUä¾å¤ãã³ãã©ãã¼ãã«ã®èªè¾¼ã¿ */ 1014 ldr r3, [r2,r4,lsl #2] /* CPUä¾å¤ãã³ãã©ã®çªå° â r3 */ 1015 mov r0, r5 /* CPUä¾å¤ã®æ 1016 å ±ãè¨æ¶ãã¦ããé åã® */ 1017 /* å 1018 é çªå°ã第1ãã©ã¡ã¼ã¿ã«æ¸¡ã */ 1019 mov r1, r4 /* CPUä¾å¤çªå·ã第2ãã©ã¡ã¼ã¿ã«æ¸¡ã */ 1020 mov lr, pc /* CPUä¾å¤ãã³ãã©ã®å¼åºã */ 919 * CPU例外ハンドラの呼出し 920 */ 921 ldr r2, =exc_table /* CPU例外ハンドラテーブルの読込み */ 922 ldr r3, [r2,r4,lsl #2] /* CPU例外ハンドラの番地 → r3 */ 923 mov r0, r5 /* CPU例外の情報を記憶している領域の */ 924 /* 先頭番地を第1パラメータに渡す */ 925 mov r1, r4 /* CPU例外番号を第2パラメータに渡す */ 926 mov lr, pc /* CPU例外ハンドラの呼出し */ 1021 927 bx r3 1022 928 1023 929 /* 1024 * ãã°åºåã®å¼åºã930 * ログ出力の呼出し 1025 931 */ 1026 932 #ifdef LOG_EXC_LEAVE 1027 mov r0, r4 /* CPU ä¾å¤çªå·ããã©ã¡ã¼ã¿ã«æ¸¡ã*/933 mov r0, r4 /* CPU例外番号をパラメータに渡す */ 1028 934 bl log_exc_leave 1029 935 #endif /* LOG_EXC_LEAVE */ 1030 936 1031 937 /* 1032 * ã«ã¼ãã«ç®¡çã®å²è¾¼ã¿ãç¦æ¢ããï¼938 * カーネル管理の割込みを禁止する. 1033 939 */ 1034 940 #if __TARGET_ARCH_ARM < 6 … … 1043 949 1044 950 /* 1045 * å²è¾¼ã¿ã³ã³ããã¼ã©ãæä½ãã¦ï¼å²è¾¼ã¿åªå 1046 度ãã¹ã¯ãï¼CPUä¾å¤çº 1047 * çæã®å¤ã«è¨å®ããï¼ 951 * 割込みコントローラを操作して,割込み優先度マスクを,CPU例外発 952 * 生時の値に設定する. 1048 953 */ 1049 954 bl irc_end_exc 1050 955 1051 956 /* 1052 * ä¾å¤ãã¹ãã«ã¦ã³ãããã¯ãªã¡ã³ãããï¼957 * 例外ネストカウントをデクリメントする. 1053 958 */ 1054 959 ldr r2, =excpt_nest_count 1055 960 ldr r3, [r2] 1056 961 subs r3, r3, #1 1057 str r3, [r2] /* æ»ãå 1058 ãéã¿ã¹ã¯ã³ã³ããã¹ããªã */ 1059 bne exc_handler_5 /* exc_handler_5ã«åå² */ 1060 1061 /* 1062 * ã¿ã¹ã¯ç¨ã®ã¹ã¿ãã¯ã«æ»ãï¼ 962 str r3, [r2] /* 戻り先が非タスクコンテキストなら */ 963 bne exc_handler_5 /* exc_handler_5に分岐 */ 964 965 /* 966 * タスク用のスタックに戻す. 1063 967 */ 1064 968 pop {r0,r3} … … 1066 970 1067 971 /* 1068 * p_runtsk ãNULLãå¤å®ããï¼1069 */ 1070 ldr r0, =p_runtsk /* p_runtsk âr0 */972 * p_runtskがNULLか判定する. 973 */ 974 ldr r0, =p_runtsk /* p_runtsk → r0 */ 1071 975 ldr r0, [r0] 1072 tst r0, r0 /* p_runtskãNULLã§ãªããã° */ 1073 bne exc_handler_3 /* exc_handler_3ã«åå² */ 1074 1075 /* 1076 * ã¿ã¹ã¯ã®ã¹ã¿ãã¯ã«ä¿åããã¹ã¯ã©ããã¬ã¸ã¹ã¿çãæ¨ã¦ãï¼ 1077 */ 1078 pop {r0,r1} /* ã¹ã¿ãã¯ãã¤ã³ã¿ã®èª¿æ´ãå 1079 ã«æ»ã */ 976 tst r0, r0 /* p_runtskがNULLでなければ */ 977 bne exc_handler_3 /* exc_handler_3に分岐 */ 978 979 /* 980 * タスクのスタックに保存したスクラッチレジスタ等を捨てる. 981 */ 982 pop {r0,r1} /* スタックポインタの調整を元に戻す */ 1080 983 add sp, sp, r1 1081 add sp, sp, #48 /* ã¹ã¯ã©ããã¬ã¸ã¹ã¿ã¨CPUä¾å¤ãçºçãã */ 1082 b dispatcher_0 /* ç¶æ³ãå¤æããããã®è¿½å æ 1083 å ±ãæ¨ã¦ã */ 1084 1085 /* 1086 * ãã£ã¹ããããå¿ 1087 è¦ãå¤å®ããï¼ 984 add sp, sp, #48 /* スクラッチレジスタとCPU例外が発生した */ 985 b dispatcher_0 /* 状況を判断するための追加情報を捨てる */ 986 987 /* 988 * ディスパッチが必要か判定する. 1088 989 */ 1089 990 ALABEL(exc_handler_3) 1090 ldr r1, =p_schedtsk /* p_schedtsk âr1 */991 ldr r1, =p_schedtsk /* p_schedtsk → r1 */ 1091 992 ldr r1, [r1] 1092 teq r0, r1 /* p_runtsk ã¨p_schedtskãåããªã*/1093 beq exc_handler_4 /* exc_handler_4 ã¸*/1094 1095 /* 1096 * ã³ã³ããã¹ããä¿åããï¼1097 */ 1098 stmfd sp!, {r6-r11} /* éã¹ã¯ã©ããã¬ã¸ã¹ã¿ã®ä¿å*/1099 str sp, [r0,#TCB_sp] /* ã¹ã¿ãã¯ãã¤ã³ã¿ãä¿å*/1100 adr r1, ret_exc_r /* å®è¡åéçªå°ãä¿å*/993 teq r0, r1 /* p_runtskとp_schedtskが同じなら */ 994 beq exc_handler_4 /* exc_handler_4へ */ 995 996 /* 997 * コンテキストを保存する. 998 */ 999 stmfd sp!, {r6-r11} /* 非スクラッチレジスタの保存 */ 1000 str sp, [r0,#TCB_sp] /* スタックポインタを保存 */ 1001 adr r1, ret_exc_r /* 実行再開番地を保存 */ 1101 1002 str r1, [r0,#TCB_pc] 1102 b dispatcher /* r0 ã«ã¯p_runtskãæ ¼ç´ããã¦ãã*/1003 b dispatcher /* r0にはp_runtskが格納されている */ 1103 1004 1104 1005 ALABEL(ret_exc_r) 1105 1006 /* 1106 * ã³ã³ããã¹ãã復帰ããï¼1107 */ 1108 ldmfd sp!, {r6-r11} /* éã¹ã¯ã©ããã¬ã¸ã¹ã¿ã®å¾©å¸°*/1007 * コンテキストを復帰する. 1008 */ 1009 ldmfd sp!, {r6-r11} /* 非スクラッチレジスタの復帰 */ 1109 1010 1110 1011 ALABEL(exc_handler_4) 1111 1012 #ifdef TOPPERS_SUPPORT_OVRHDR 1112 1013 /* 1113 * ãªã¼ãã©ã³ã¿ã¤ããåä½éå§ããï¼1014 * オーバランタイマを動作開始する. 1114 1015 */ 1115 1016 bl ovrtimer_start … … 1117 1018 1118 1019 /* 1119 * CPU ä¾å¤å¦çããã®ãªã¿ã¼ã³1020 * CPU例外処理からのリターン 1120 1021 * 1121 * CPUä¾å¤å¦çããã®ãªã¿ã¼ã³ã«ããï¼CPUããã¯è§£é¤ç¶æ 1122 ã«é·ç§»ããã 1123 * ãã«ããå¿ 1124 è¦ããããï¼ARMã¯CPSRã®ãããã«ãã£ã¦CPUããã¯ç¶æ 1125 ã 1126 * 表ãã¦ããããï¼CPSRãå 1127 ã«æ»ãã¦ãªã¿ã¼ã³ããã°ããï¼ 1022 * CPU例外処理からのリターンにより,CPUロック解除状態に遷移するよ 1023 * うにする必要があるが,ARMはCPSRのビットによってCPUロック状態を 1024 * 表しているため,CPSRを元に戻してリターンすればよい. 1128 1025 */ 1129 1026 ALABEL(exc_handler_5) 1130 pop {r0,r1} /* ã¹ã¿ãã¯ãã¤ã³ã¿ã®èª¿æ´ãå 1131 ã«æ»ã */ 1027 pop {r0,r1} /* スタックポインタの調整を元に戻す */ 1132 1028 add sp, sp, r1 1133 add sp, sp, #8 /* ã¹ã¿ãã¯ä¸ã®æ 1134 å ±ãæ¨ã¦ã */ 1135 1136 #if __TARGET_ARCH_ARM < 6 1137 ldmfd sp!, {r0} /* æ»ãå 1138 ã®cpsrãspsrã«è¨å® */ 1029 add sp, sp, #8 /* スタック上の情報を捨てる */ 1030 1031 #if __TARGET_ARCH_ARM < 6 1032 ldmfd sp!, {r0} /* 戻り先のcpsrをspsrに設定 */ 1139 1033 msr spsr_cxsf, r0 1140 ldmfd sp!, {r0-r5,r12,lr,pc}^ /* ã³ã³ããã¹ãã®å¾©å¸°*/1141 /* ^ ä»ããªã®ã§ï¼spsr âcpsr */1034 ldmfd sp!, {r0-r5,r12,lr,pc}^ /* コンテキストの復帰 */ 1035 /* ^付きなので,spsr → cpsr */ 1142 1036 #else /* __TARGET_ARCH_ARM < 6 */ 1143 1037 ldmfd sp!, {r0-r5,r12,lr} … … 1146 1040 1147 1041 /* 1148 * ã«ã¼ãã«ç®¡çå¤ã®CPUä¾å¤ã®åºå 1149 ¥å£å¦ç 1042 * カーネル管理外のCPU例外の出入口処理 1150 1043 */ 1151 1044 ALABEL(nk_exc_handler_1) 1152 1045 /* 1153 * ããã®æç¹ã®ã¬ã¸ã¹ã¿ç¶æ 1154 ã 1155 * r1ï¼CPUä¾å¤çºçåã®CPSRã®Fãããã¨Iãããã®å¤ 1156 * r2ï¼excpt_nest_countã®çªå° 1157 * r3ï¼excpt_nest_countã®å¤ 1158 * r4ï¼CPUä¾å¤ãã³ãã©çªå· 1159 * r5ï¼CPUä¾å¤ã®æ 1160 å ±ãè¨æ¶ãã¦ããé åã®å 1161 é çªå° 1162 */ 1163 1164 /* 1165 * ä¾å¤ãã¹ãã«ã¦ã³ããã¤ã³ã¯ãªã¡ã³ãããï¼ 1046 * 【この時点のレジスタ状態】 1047 * r1:CPU例外発生前のCPSRのFビットとIビットの値 1048 * r2:excpt_nest_countの番地 1049 * r3:excpt_nest_countの値 1050 * r4:CPU例外ハンドラ番号 1051 * r5:CPU例外の情報を記憶している領域の先頭番地 1052 */ 1053 1054 /* 1055 * 例外ネストカウントをインクリメントする. 1166 1056 */ 1167 1057 add r3, r3, #1 1168 1058 str r3, [r2] 1169 teq r3, #1 /* CPU ä¾å¤çºçåãéã¿ã¹ã¯ã³ã³ããã¹ã*/1170 bne nk_exc_handler_2 /* ãªãnk_exc_handler_2ã«åå²*/1171 1172 /* 1173 * éã¿ã¹ã¯ã³ã³ããã¹ãç¨ã®ã¹ã¿ãã¯ã«åãæããï¼1174 */ 1175 mov r3, sp /* ãã®æç¹ã®ã¹ã¿ãã¯ãã¤ã³ã¿ãr3ã«*/1176 ldr r2, =istkpt /* éã¿ã¹ã¯ã³ã³ããã¹ãç¨ã®ã¹ã¿ãã¯ã«*/1059 teq r3, #1 /* CPU例外発生前が非タスクコンテキスト */ 1060 bne nk_exc_handler_2 /* ならnk_exc_handler_2に分岐 */ 1061 1062 /* 1063 * 非タスクコンテキスト用のスタックに切り換える. 1064 */ 1065 mov r3, sp /* この時点のスタックポインタをr3に */ 1066 ldr r2, =istkpt /* 非タスクコンテキスト用のスタックに */ 1177 1067 ldr sp, [r2] 1178 push {r0,r3} /* åæãåã®ã¹ã¿ãã¯ãã¤ã³ã¿ãä¿å*/1179 /* r0 ã¯ã¹ãã¼ã¹ç¢ºä¿ã®ãã*/1068 push {r0,r3} /* 切換え前のスタックポインタを保存 */ 1069 /* r0はスペース確保のため */ 1180 1070 ALABEL(nk_exc_handler_2) 1181 1071 /* 1182 * ã·ã¹ãã ç¶æ 1183 ï¼ã³ã³ããã¹ãã¯é¤ãï¼ãï¼CPUä¾å¤çºçæã®ç¶æ 1184 㸠1072 * システム状態(コンテキストは除く)を,CPU例外発生時の状態へ 1185 1073 */ 1186 1074 orr r1, r1, #CPSR_SVC_MODE … … 1188 1076 1189 1077 /* 1190 * CPUä¾å¤ãã³ãã©ã®å¼åºã 1191 */ 1192 ldr r2, =exc_table /* CPUä¾å¤ãã³ãã©ãã¼ãã«ã®èªè¾¼ã¿ */ 1193 ldr r3, [r2,r4,lsl #2] /* CPUä¾å¤ãã³ãã©ã®çªå° â r3 */ 1194 mov r0, r5 /* CPUä¾å¤ã®æ 1195 å ±ãè¨æ¶ãã¦ããé åã® */ 1196 /* å 1197 é çªå°ã第1ãã©ã¡ã¼ã¿ã«æ¸¡ã */ 1198 mov r1, r4 /* CPUä¾å¤çªå·ã第2ãã©ã¡ã¼ã¿ã«æ¸¡ã */ 1199 mov lr, pc /* CPUä¾å¤ãã³ãã©ã®å¼åºã */ 1078 * CPU例外ハンドラの呼出し 1079 */ 1080 ldr r2, =exc_table /* CPU例外ハンドラテーブルの読込み */ 1081 ldr r3, [r2,r4,lsl #2] /* CPU例外ハンドラの番地 → r3 */ 1082 mov r0, r5 /* CPU例外の情報を記憶している領域の */ 1083 /* 先頭番地を第1パラメータに渡す */ 1084 mov r1, r4 /* CPU例外番号を第2パラメータに渡す */ 1085 mov lr, pc /* CPU例外ハンドラの呼出し */ 1200 1086 bx r3 1201 1087 1202 1088 /* 1203 * ä¾å¤ãã¹ãã«ã¦ã³ãããã¯ãªã¡ã³ãããï¼1089 * 例外ネストカウントをデクリメントする. 1204 1090 */ 1205 1091 ldr r2, =excpt_nest_count 1206 1092 ldr r3, [r2] 1207 1093 subs r3, r3, #1 1208 str r3, [r2] /* æ»ãå 1209 ãéã¿ã¹ã¯ã³ã³ããã¹ããªã */ 1210 bne exc_handler_5 /* exc_handler_5ã«åå² */ 1211 1212 /* 1213 * ã¿ã¹ã¯ç¨ã®ã¹ã¿ãã¯ã«æ»ãï¼ 1094 str r3, [r2] /* 戻り先が非タスクコンテキストなら */ 1095 bne exc_handler_5 /* exc_handler_5に分岐 */ 1096 1097 /* 1098 * タスク用のスタックに戻す. 1214 1099 */ 1215 1100 pop {r0,r3} … … 1218 1103 1219 1104 /* 1220 * ã¹ãã¼ã¿ã¹ã¬ã¸ã¹ã¿ã®æä½é¢æ°1105 * ステータスレジスタの操作関数 1221 1106 * 1222 * Thumb ã¢ã¼ãã§ã¯mrs/msrå½ä»¤ã使ç¨ã§ããªãããï¼é¢æ°ã¨ãã¦å®ç¾ãã¦ï¼1223 * ARM ã¢ã¼ãã«ç§»è¡ãã¦å®è¡ããï¼1107 * Thumbモードではmrs/msr命令が使用できないため,関数として実現して, 1108 * ARMモードに移行して実行する. 1224 1109 */ 1225 1110 #ifdef __thumb__ … … 1241 1126 1242 1127 /* 1243 * å¾®å°æéå¾ 1244 ã¡ 1128 * 微少時間待ち 1245 1129 * 1246 * ãã£ãã·ã¥ã©ã¤ã³ã®ã©ã®å ´æã«ãããã®ãã£ã¦å®è¡æéãå¤ããããï¼å¤§1247 * ããã®åä½ã§ã¢ã©ã¤ã³ãã¦ããï¼1130 * キャッシュラインのどの場所にあるかのよって実行時間が変わるため,大 1131 * きめの単位でアラインしている. 1248 1132 */ 1249 1133 ATEXT … … 1252 1136 ALABEL(sil_dly_nse) 1253 1137 mov r1, #0 1254 mcr p15, 0, r1, c7, c5, 6 /* åå²äºæ¸¬å 1255 ¨ä½ã®ç¡å¹å */ 1138 mcr p15, 0, r1, c7, c5, 6 /* 分岐予測全体の無効化 */ 1256 1139 asm_inst_sync_barrier r3 1257 1140 subs r0, r0, #SIL_DLY_TIM1 1258 1141 bxls lr 1259 1142 ALABEL(sil_dly_nse1) 1260 mcr p15, 0, r1, c7, c5, 6 /* åå²äºæ¸¬å 1261 ¨ä½ã®ç¡å¹å */ 1143 mcr p15, 0, r1, c7, c5, 6 /* 分岐予測全体の無効化 */ 1262 1144 asm_inst_sync_barrier r3 1263 1145 subs r0, r0, #SIL_DLY_TIM2
Note:
See TracChangeset
for help on using the changeset viewer.