Changeset 356 for ssp_aarch64/trunk/arm64_gcc/prc_support.S
- Timestamp:
- Jun 8, 2018, 11:24:32 AM (6 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
ssp_aarch64/trunk/arm64_gcc/prc_support.S
-
Property svn:mime-type
set to
text/plain; charset=utf-8
r353 r356 8 8 * Nagoya Municipal Industrial Research Institute, JAPAN 9 9 * 10 * ä¸è¨èä½æ¨©è 11 ã¯ï¼ä»¥ä¸ã®(1)ã(4)ã®æ¡ä»¶ãæºããå ´åã«éãï¼æ¬ã½ããã¦ã§ 12 * ã¢ï¼æ¬ã½ããã¦ã§ã¢ãæ¹å¤ãããã®ãå«ãï¼ä»¥ä¸åãï¼ã使ç¨ã»è¤è£½ã»æ¹ 13 * å¤ã»åé 14 å¸ï¼ä»¥ä¸ï¼å©ç¨ã¨å¼ã¶ï¼ãããã¨ãç¡åã§è¨±è«¾ããï¼ 15 * (1) æ¬ã½ããã¦ã§ã¢ãã½ã¼ã¹ã³ã¼ãã®å½¢ã§å©ç¨ããå ´åã«ã¯ï¼ä¸è¨ã®èä½ 16 * 権表示ï¼ãã®å©ç¨æ¡ä»¶ããã³ä¸è¨ã®ç¡ä¿è¨¼è¦å®ãï¼ãã®ã¾ã¾ã®å½¢ã§ã½ã¼ 17 * ã¹ã³ã¼ãä¸ã«å«ã¾ãã¦ãããã¨ï¼ 18 * (2) æ¬ã½ããã¦ã§ã¢ãï¼ã©ã¤ãã©ãªå½¢å¼ãªã©ï¼ä»ã®ã½ããã¦ã§ã¢éçºã«ä½¿ 19 * ç¨ã§ããå½¢ã§åé 20 å¸ããå ´åã«ã¯ï¼åé 21 å¸ã«ä¼´ãããã¥ã¡ã³ãï¼å©ç¨ 22 * è 23 ããã¥ã¢ã«ãªã©ï¼ã«ï¼ä¸è¨ã®èä½æ¨©è¡¨ç¤ºï¼ãã®å©ç¨æ¡ä»¶ããã³ä¸è¨ 24 * ã®ç¡ä¿è¨¼è¦å®ãæ²è¼ãããã¨ï¼ 25 * (3) æ¬ã½ããã¦ã§ã¢ãï¼æ©å¨ã«çµã¿è¾¼ããªã©ï¼ä»ã®ã½ããã¦ã§ã¢éçºã«ä½¿ 26 * ç¨ã§ããªãå½¢ã§åé 27 å¸ããå ´åã«ã¯ï¼æ¬¡ã®ããããã®æ¡ä»¶ãæºããã 28 * ã¨ï¼ 29 * (a) åé 30 å¸ã«ä¼´ãããã¥ã¡ã³ãï¼å©ç¨è 31 ããã¥ã¢ã«ãªã©ï¼ã«ï¼ä¸è¨ã®è 32 * ä½æ¨©è¡¨ç¤ºï¼ãã®å©ç¨æ¡ä»¶ããã³ä¸è¨ã®ç¡ä¿è¨¼è¦å®ãæ²è¼ãããã¨ï¼ 33 * (b) åé 34 å¸ã®å½¢æ 35 ãï¼å¥ã«å®ããæ¹æ³ã«ãã£ã¦ï¼TOPPERSããã¸ã§ã¯ãã« 36 * å ±åãããã¨ï¼ 37 * (4) æ¬ã½ããã¦ã§ã¢ã®å©ç¨ã«ããç´æ¥çã¾ãã¯éæ¥çã«çãããããªãæ 38 * 害ãããï¼ä¸è¨èä½æ¨©è 39 ããã³TOPPERSããã¸ã§ã¯ããå 40 責ãããã¨ï¼ 41 * ã¾ãï¼æ¬ã½ããã¦ã§ã¢ã®ã¦ã¼ã¶ã¾ãã¯ã¨ã³ãã¦ã¼ã¶ããã®ãããªãç 42 * ç±ã«åºã¥ãè«æ±ãããï¼ä¸è¨èä½æ¨©è 43 ããã³TOPPERSããã¸ã§ã¯ãã 44 * å 45 責ãããã¨ï¼ 46 * 47 * æ¬ã½ããã¦ã§ã¢ã¯ï¼ç¡ä¿è¨¼ã§æä¾ããã¦ãããã®ã§ããï¼ä¸è¨èä½æ¨©è 48 ã 49 * ãã³TOPPERSããã¸ã§ã¯ãã¯ï¼æ¬ã½ããã¦ã§ã¢ã«é¢ãã¦ï¼ç¹å®ã®ä½¿ç¨ç®ç 50 * ã«å¯¾ããé©åæ§ãå«ãã¦ï¼ãããªãä¿è¨¼ãè¡ããªãï¼ã¾ãï¼æ¬ã½ããã¦ã§ 51 * ã¢ã®å©ç¨ã«ããç´æ¥çã¾ãã¯éæ¥çã«çãããããªãæ害ã«é¢ãã¦ãï¼ã 52 * ã®è²¬ä»»ãè² ããªãï¼ 53 * 54 */ 55 56 /* 57 * ããã»ããµä¾åã¢ã¸ã¥ã¼ã« ã¢ã»ã³ããªè¨èªé¨ï¼ARM64ç¨ï¼ 10 * 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ 11 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改 12 * 変・再配布(以下,利用と呼ぶ)することを無償で許諾する. 13 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 14 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー 15 * スコード中に含まれていること. 16 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 17 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 18 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 19 * の無保証規定を掲載すること. 20 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 21 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ 22 * と. 23 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 24 * 作権表示,この利用条件および下記の無保証規定を掲載すること. 25 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに 26 * 報告すること. 27 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 28 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. 29 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理 30 * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを 31 * 免責すること. 32 * 33 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お 34 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的 35 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ 36 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ 37 * の責任を負わない. 38 * 39 */ 40 41 /* 42 * プロセッサ依存モジュール アセンブリ言語部(ARM64用) 58 43 */ 59 44 60 45 #define TOPPERS_MACRO_ONLY 61 #define UINT_C(val) (val) /* uint_t åã®å®æ°ãä½ããã¯ã*/62 #define ULONG_C(val) (val) /* ulong_t åã®å®æ°ãä½ããã¯ã*/63 #define CAST(type, val) (val) /* åãã£ã¹ããè¡ããã¯ã*/46 #define UINT_C(val) (val) /* uint_t型の定数を作るマクロ */ 47 #define ULONG_C(val) (val) /* ulong_t型の定数を作るマクロ */ 48 #define CAST(type, val) (val) /* 型キャストを行うマクロ */ 64 49 65 50 #include "kernel_impl.h" 66 51 67 52 /* 68 * ãã£ã¹ãããã£ã®åä½éå§53 * ディスパッチャの動作開始 69 54 */ 70 55 .text … … 74 59 start_dispatch: 75 60 /* 76 * ãã®ã«ã¼ãã³ã¯ï¼ã«ã¼ãã«èµ·åæã«ï¼ãã¹ã¦ã®å²è¾¼ã¿ãç¦æ¢ããç¶æ 77 78 * ï¼å²è¾¼ã¿ããã¯ç¶æ 79 ã¨åçï¼ã§å¼ã³åºãããï¼ 61 * このルーチンは,カーネル起動時に,すべての割込みを禁止した状態 62 * (割込みロック状態と同等)で呼び出される. 80 63 * 81 * ããã§ã¯ dispatcher ãå¼ã³åºãåã®åæè¨å®ãè¡ãï¼ 82 * (1) ã·ã¹ãã ç¶æ 83 ã®åæåï¼ä»¥ä¸ã®ç¶æ 84 ã¸ç§»è¡ããï¼ 85 * ã»å 86 ¨å²è¾¼ã¿ããã¯è§£é¤ç¶æ 87 (ã«ã¼ãã«ç®¡çå¤ã®å²è¾¼ã¿è¨±å¯) 88 * ã»CPUããã¯ç¶æ 89 (ã«ã¼ãã«ç®¡çã®å²è¾¼ã¿ç¦æ¢) 90 * ã»å²è¾¼ã¿åªå 91 度ãã¹ã¯å 92 ¨è§£é¤ç¶æ 93 94 * ã»ãã£ã¹ããã許å¯ç¶æ 95 64 * ここでは dispatcher を呼び出す前の初期設定を行う. 65 * (1) システム状態の初期化.以下の状態へ移行する. 66 * ・全割込みロック解除状態(カーネル管理外の割込み許可) 67 * ・CPUロック状態(カーネル管理の割込み禁止) 68 * ・割込み優先度マスク全解除状態 69 * ・ディスパッチ許可状態 96 70 * 97 * (1-1) å²è¾¼ã¿åªå 98 度ãã¹ã¯ã¯ gicc_initializeã§ï¼GICC_PMR ãåæåãããã¨ã«ãã 99 * ãã§ã«ï¼ã¢ãã«ä¸ã®ï¼å²è¾¼ã¿åªå 100 度ãã¹ã¯å 101 ¨è§£é¤ç¶æ 102 ã«ãªã£ã¦ããï¼ 103 * (1-2) ãã£ã¹ãããç¦æ¢ãã©ã°ã¯ task_initialize 㧠disdsp ã false ã«åæåãã¦ãããã 104 * ãã§ã«ãã£ã¹ããã許å¯ç¶æ 105 ã«ãªã£ã¦ããï¼ 106 * (1-3) ããã§ã¯ã«ã¼ãã«ç®¡çã®å²è¾¼ã¿ãç¦æ¢ããï¼ 71 * (1-1) 割込み優先度マスクは gicc_initializeで,GICC_PMR を初期化することにより 72 * すでに(モデル上の)割込み優先度マスク全解除状態になっている. 73 * (1-2) ディスパッチ禁止フラグは task_initialize で disdsp を false に初期化しているため 74 * すでにディスパッチ許可状態になっている. 75 * (1-3) ここではカーネル管理の割込みを禁止する. 107 76 * 108 * (2) ã¹ã¿ãã¯ãã¤ã³ã¿ã®åæå109 * start_dispatch ãå¼ã³åºãããã¨ããã«æ»ã£ã¦ãããã¨ã¯ãªããã110 * ã¹ã¿ãã¯ãã¤ã³ã¿ãããã§åæåããï¼77 * (2) スタックポインタの初期化 78 * start_dispatch が呼び出されるとここに戻ってくることはないため 79 * スタックポインタをここで初期化する. 111 80 */ 112 81 ldr x0, =_kernel_istkpt // setup stack … … 114 83 mov sp, x0 115 84 116 // ã«ã¼ãã«ç®¡çå 117 ã®å²è¾¼ã¿ç¦æ¢ 85 // カーネル管理内の割込み禁止 118 86 msr daifset, #3 119 87 120 // dispatcher å¼ã³åºã88 // dispatcher呼び出し 121 89 b dispatcher 122 90 123 91 /* 124 * ã«ã¼ãã«ã®çµäºå¦çã®å¼åºã125 * 126 * ã¹ã¿ãã¯ãéã¿ã¹ã¯ã³ã³ããã¹ãç¨ã«åãæ¿ãï¼92 * カーネルの終了処理の呼出し 93 * 94 * スタックを非タスクコンテキスト用に切り替え. 127 95 * 128 96 */ … … 133 101 call_exit_kernel: 134 102 /* 135 * ã¹ã¿ãã¯ãã¤ã³ã¿ã®åæå103 * スタックポインタの初期化 136 104 */ 137 105 ldr x0, =_kernel_istkpt … … 139 107 mov sp, x0 140 108 141 b exit_kernel /* ã«ã¼ãã«ã®çµäºå¦çãå¼ã¶*/142 143 144 /* 145 * å²è¾¼ã¿/ä¾å¤ã³ã³ããã¹ãä¿åå¦ç109 b exit_kernel /* カーネルの終了処理を呼ぶ */ 110 111 112 /* 113 * 割込み/例外コンテキスト保存処理 146 114 */ 147 115 .macro __save_context 148 116 /* 149 * x0 - x29 ã®ä¿å(x0,x1ãã¢ããx28, x29ã¾ã§)117 * x0 - x29 の保存(x0,x1ペアからx28, x29まで) 150 118 */ 151 119 stp x1, x0, [sp, #-16]! … … 166 134 167 135 /* 168 * spsr_el1, x30 ããã¢ã§ä¿å136 * spsr_el1, x30をペアで保存 169 137 */ 170 138 mrs x21, spsr_el1 … … 172 140 173 141 /* 174 * esr_el1, elr_el1 ããã¢ã§ä¿å142 * esr_el1, elr_el1 をペアで保存 175 143 */ 176 144 mrs x21, esr_el1 … … 179 147 180 148 /* 181 * SP ã®èª¿æ´(16ãããã¢ã©ã¤ã¡ã³ãã«ãã)149 * SPの調整(16ビットアライメントにする) 182 150 */ 183 151 mov x1, #8 184 152 mov x2, sp 185 and x1, x2, x1 // 調æ´éã®è¨ç®(0 or 8)186 sub sp, sp, x1 // SP ã®èª¿æ´187 stp xzr, x1, [sp, #-16]! // 調æ´éãä¿å188 189 /* 190 * 追å ã®æ ¼ç´é åã確ä¿ããããï¼SPãæ¸ç®ãã¦ãã153 and x1, x2, x1 // 調整量の計算(0 or 8) 154 sub sp, sp, x1 // SPの調整 155 stp xzr, x1, [sp, #-16]! // 調整量を保存 156 157 /* 158 * 追加の格納領域を確保するため,SPを減算しておく 191 159 */ 192 160 sub sp, sp, #16 … … 194 162 195 163 /* 196 * ã³ã³ããã¹ã復帰å¦ç164 * コンテキスト復帰処理 197 165 */ 198 166 .macro __restore_context 199 167 /* 200 * ã¹ã¿ãã¯ã«ä¿åããä¸é¨ãã¼ã¿ã®ç ´æ£(ã¢ã©ã¤ã¡ã³ã調æ´åãèæ 201 ®) 168 * スタックに保存した一部データの破棄(アライメント調整分を考慮) 202 169 */ 203 170 mov x1, #40 … … 206 173 add sp, sp, x1 207 174 /* 208 * ELR/SPSR ã®å¾©å 209 175 * ELR/SPSR の復元 210 176 */ 211 177 ldp x21, x22, [sp], #16 … … 213 179 msr spsr_el1, x22 214 180 /* 215 * x0 - x30 ã®å¾©å 216 181 * x0 - x30 の復元 217 182 */ 218 183 ldr x30, [sp], #8 … … 235 200 236 201 /* 237 * å²è¾¼ã¿/ä¾å¤ã®åºå£å¦ç 238 * åæï¼CPUããã¯ç¶æ 239 , ãã¹ãã«ã¦ã³ã¿ãã¯ãªã¡ã³ãæ¸ã¿ 202 * 割込み/例外の出口処理 203 * 前提:CPUロック状態, ネストカウンタデクリメント済み 240 204 */ 241 205 .text … … 243 207 .global ret_int 244 208 ret_int: 245 // æ»ãå 246 ã®ã³ã³ããã¹ãã確èªãï¼å¤æ®µå²è¾¼ã¿ãªããªã¿ã¼ã³ 209 // 戻り先のコンテキストを確認し,多段割込みならリターン 247 210 ldr x1, =_kernel_intnest 248 211 ldrb w3, [x1] 249 212 cbnz w3, int_return 250 213 251 ret_int_2: // å段ã®å²è¾¼ã¿ã®å ´å 252 // reqflg ã false ãªãå¼ã³åºãå 253 ã¸æ»ã 214 ret_int_2: // 初段の割込みの場合 215 // reqflg が false なら呼び出し元へ戻る 254 216 ldr x0, =reqflg 255 217 ldr w1, [x0] 256 218 cbz w1, int_return 257 219 258 ret_int_3: // reqflg ã true ã®å ´å220 ret_int_3: // reqflg が true の場合 259 221 mov w1, #0 // reqflg = false 260 222 str w1, [x0] 261 223 262 // ãã£ã¹ãããç¦æ¢ãªãå¼ã³åºãå 263 ã¸æ»ã 224 // ディスパッチ禁止なら呼び出し元へ戻る 264 225 ldr x0, =disdsp 265 226 ldr w1, [x0] … … 267 228 268 229 /* 269 * é 270 延ãã£ã¹ããã 271 * search_schedtsk ã®è¿å¤(x0)ãå¼æ°ã¨ã㦠run_task ãå¼ã³åºã 230 * 遅延ディスパッチ 231 * search_schedtsk の返値(x0)を引数として run_task を呼び出す 272 232 */ 273 233 bl search_schedtsk … … 275 235 276 236 /* 277 * å¼ã³åºãå 278 ã¸ãªã¿ã¼ã³ 237 * 呼び出し元へリターン 279 238 */ 280 239 int_return: 281 __restore_context // ã¬ã¸ã¹ã¿å¾©å¸°240 __restore_context // レジスタ復帰 282 241 eret 283 242 284 243 /* 285 * å²è¾¼ã¿ãã¯ã¿286 * æåã«å²è¾¼ã¿çºçåã®ã¹ã¿ãã¯ã«æ»ãã¦ããã¬ã¸ã¹ã¿ãä¿åãã287 * ãã¼ãã¦ã§ã¢ã«ãã£ã¦PSTATE.{I,F} ãã»ããæ¸ã§ãããã¨ãåæã¨ãã244 * 割込みベクタ 245 * 最初に割込み発生前のスタックに戻してからレジスタを保存する 246 * ハードウェアによってPSTATE.{I,F} がセット済であることを前提とする 288 247 */ 289 248 .text … … 296 255 297 256 // Sync EL1 298 msr spsel, #0 // ä¾å¤çºçåã®ã¹ã¿ãã¯(SP_EL0)ã«æ»ã299 __save_context 300 mov x22, #0 // ä¾å¤çªå·ãx22ã«ã»ãã257 msr spsel, #0 // 例外発生前のスタック(SP_EL0)に戻す 258 __save_context 259 mov x22, #0 // 例外番号をx22にセット 301 260 b gic_exc_entry 302 261 303 262 // IRQ EL1 304 263 .align 7 305 msr spsel, #0 // ä¾å¤çºçåã®ã¹ã¿ãã¯(SP_EL0)ã«æ»ã264 msr spsel, #0 // 例外発生前のスタック(SP_EL0)に戻す 306 265 __save_context 307 266 b gic_int_entry … … 309 268 // FIQ EL1 310 269 .align 7 311 msr spsel, #0 // ä¾å¤çºçåã®ã¹ã¿ãã¯(SP_EL0)ã¸æ»ã270 msr spsel, #0 // 例外発生前のスタック(SP_EL0)へ戻す 312 271 __save_context 313 272 b gic_int_entry … … 315 274 // SError EL1 316 275 .align 7 317 msr spsel, #0 // ä¾å¤çºçåã®ã¹ã¿ãã¯(SP_EL0)ã¸æ»ã318 __save_context 319 mov x22, #1 // ä¾å¤çªå·ãx22ã«ã»ãã276 msr spsel, #0 // 例外発生前のスタック(SP_EL0)へ戻す 277 __save_context 278 mov x22, #1 // 例外番号をx22にセット 320 279 b gic_exc_entry 321 280 … … 327 286 .align 7 328 287 __save_context 329 mov x22, #2 // ä¾å¤çªå·ãx22ã«ã»ãã288 mov x22, #2 // 例外番号をx22にセット 330 289 b gic_exc_entry 331 290 … … 343 302 .align 7 344 303 __save_context 345 mov x22, #3 // ä¾å¤çªå·ãx22ã«ã»ãã304 mov x22, #3 // 例外番号をx22にセット 346 305 b gic_exc_entry 347 306 … … 352 311 // Sync EL0 353 312 .align 7 354 msr spsel, #0 // ä¾å¤çºçåã®ã¹ã¿ãã¯(SP_EL0)ã«æ»ã355 __save_context 356 mov x22, #4 // ä¾å¤çªå·ãx22ã«ã»ãã313 msr spsel, #0 // 例外発生前のスタック(SP_EL0)に戻す 314 __save_context 315 mov x22, #4 // 例外番号をx22にセット 357 316 b gic_exc_entry 358 317 359 318 // IRQ EL0 360 319 .align 7 361 msr spsel, #0 // ä¾å¤çºçåã®ã¹ã¿ãã¯(SP_EL0)ã«æ»ã320 msr spsel, #0 // 例外発生前のスタック(SP_EL0)に戻す 362 321 __save_context 363 322 b gic_int_entry … … 365 324 // FIQ EL0 366 325 .align 7 367 msr spsel, #0 // ä¾å¤çºçåã®ã¹ã¿ãã¯(SP_EL0)ã«æ»ã326 msr spsel, #0 // 例外発生前のスタック(SP_EL0)に戻す 368 327 __save_context 369 328 b gic_int_entry … … 371 330 // Error EL0 372 331 .align 7 373 msr spsel, #0 // ä¾å¤çºçåã®ã¹ã¿ãã¯(SP_EL0)ã«æ»ã374 __save_context 375 mov x22, #5 // ä¾å¤çªå·ãx22ã«ã»ãã332 msr spsel, #0 // 例外発生前のスタック(SP_EL0)に戻す 333 __save_context 334 mov x22, #5 // 例外番号をx22にセット 376 335 b gic_exc_entry 377 336 … … 382 341 // AArch32 sync 383 342 .align 7 384 msr spsel, #0 // ä¾å¤çºçåã®ã¹ã¿ãã¯(SP_EL0)ã«æ»ã385 __save_context 386 mov x22, #6 // ä¾å¤çªå·ãx22ã«ã»ãã343 msr spsel, #0 // 例外発生前のスタック(SP_EL0)に戻す 344 __save_context 345 mov x22, #6 // 例外番号をx22にセット 387 346 b gic_exc_entry 388 347 389 348 // AArch32 IRQ 390 349 .align 7 391 msr spsel, #0 // ä¾å¤çºçåã®ã¹ã¿ãã¯(SP_EL0)ã«æ»ã350 msr spsel, #0 // 例外発生前のスタック(SP_EL0)に戻す 392 351 __save_context 393 352 b gic_int_entry … … 395 354 // AArch32 FIQ 396 355 .align 7 397 msr spsel, #0 // ä¾å¤çºçåã®ã¹ã¿ãã¯(SP_EL0)ã«æ»ã356 msr spsel, #0 // 例外発生前のスタック(SP_EL0)に戻す 398 357 __save_context 399 358 b gic_int_entry … … 401 360 // AArch32 Error 402 361 .align 7 403 msr spsel, #0 // ä¾å¤çºçåã®ã¹ã¿ãã¯(SP_EL0)ã«æ»ã404 __save_context 405 mov x22, #7 // ä¾å¤çªå·ãx22ã«ã»ãã406 b gic_exc_entry 362 msr spsel, #0 // 例外発生前のスタック(SP_EL0)に戻す 363 __save_context 364 mov x22, #7 // 例外番号をx22にセット 365 b gic_exc_entry -
Property svn:mime-type
set to
Note:
See TracChangeset
for help on using the changeset viewer.