source: ssp_aarch64/trunk/arm64_gcc/prc_support.S@ 353

Last change on this file since 353 was 353, checked in by nmir-saito, 6 years ago

initial import

File size: 11.3 KB
Line 
1/*
2 * TOPPERS/SSP Kernel
3 * Smallest Set Profile Kernel
4 *
5 * Copyright (C) 2008 by Embedded and Real-Time Systems Laboratory
6 * Graduate School of Information Science, Nagoya Univ., JAPAN
7 * Copyright (C) 2018 by Naoki Saito
8 * Nagoya Municipal Industrial Research Institute, JAPAN
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用)
58 */
59
60#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) /* 型キャストを行うマクロ */
64
65#include "kernel_impl.h"
66
67/*
68 * ディスパッチャの動作開始
69 */
70 .text
71 .align 2
72 .globl start_dispatch
73 .type start_dispatch, function
74start_dispatch:
75 /*
76 * このルーチンは,カーネル起動時に,すべての割込みを禁止した状æ…
77‹
78 * (割込みロック状æ…
79‹ã¨åŒç­‰ï¼‰ã§å‘¼ã³å‡ºã•ã‚Œã‚‹ï¼Ž
80 *
81 * ここでは dispatcher を呼び出す前の初期設定を行う.
82 * (1) システム状æ…
83‹ã®åˆæœŸåŒ–.以下の状æ…
84‹ã¸ç§»è¡Œã™ã‚‹ï¼Ž
85 * ・å…
86¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯è§£é™¤çŠ¶æ…
87‹(カーネル管理外の割込み許可)
88 * ・CPUロック状æ…
89‹(カーネル管理の割込み禁止)
90 * ・割込み優å…
91ˆåº¦ãƒžã‚¹ã‚¯å…
92¨è§£é™¤çŠ¶æ…
93‹
94 * ・ディスパッチ許可状æ…
95‹
96 *
97 * (1-1) 割込み優å…
98ˆåº¦ãƒžã‚¹ã‚¯ã¯ gicc_initializeで,GICC_PMR を初期化することにより
99 * すでに(モデル上の)割込み優å…
100ˆåº¦ãƒžã‚¹ã‚¯å…
101¨è§£é™¤çŠ¶æ…
102‹ã«ãªã£ã¦ã„る.
103 * (1-2) ディスパッチ禁止フラグは task_initialize で disdsp を false に初期化しているため
104 * すでにディスパッチ許可状æ…
105‹ã«ãªã£ã¦ã„る.
106 * (1-3) ここではカーネル管理の割込みを禁止する.
107 *
108 * (2) スタックポインタの初期化
109 * start_dispatch が呼び出されるとここに戻ってくることはないため
110 * スタックポインタをここで初期化する.
111 */
112 ldr x0, =_kernel_istkpt // setup stack
113 ldr x0, [x0]
114 mov sp, x0
115
116 // カーネル管理内
117の割込み禁止
118 msr daifset, #3
119
120 // dispatcher呼び出し
121 b dispatcher
122
123/*
124 * カーネルの終了処理の呼出し
125 *
126 * スタックを非タスクコンテキスト用に切り替え.
127 *
128 */
129 .text
130 .align 2
131 .globl call_exit_kernel
132 .type call_exit_kernel, function
133call_exit_kernel:
134 /*
135 * スタックポインタの初期化
136 */
137 ldr x0, =_kernel_istkpt
138 ldr x0, [x0]
139 mov sp, x0
140
141 b exit_kernel /* カーネルの終了処理を呼ぶ */
142
143
144/*
145 * 割込み/例外コンテキスト保存処理
146 */
147.macro __save_context
148 /*
149 * x0 - x29 の保存(x0,x1ペアからx28, x29まで)
150 */
151 stp x1, x0, [sp, #-16]!
152 stp x3, x2, [sp, #-16]!
153 stp x5, x4, [sp, #-16]!
154 stp x7, x6, [sp, #-16]!
155 stp x9, x8, [sp, #-16]!
156 stp x11, x10, [sp, #-16]!
157 stp x13, x12, [sp, #-16]!
158 stp x15, x14, [sp, #-16]!
159 stp x17, x16, [sp, #-16]!
160 stp x19, x18, [sp, #-16]!
161 stp x21, x20, [sp, #-16]!
162 stp x23, x22, [sp, #-16]!
163 stp x25, x24, [sp, #-16]!
164 stp x27, x26, [sp, #-16]!
165 stp x29, x28, [sp, #-16]!
166
167 /*
168 * spsr_el1, x30をペアで保存
169 */
170 mrs x21, spsr_el1
171 stp x21, x30, [sp, #-16]!
172
173 /*
174 * esr_el1, elr_el1 をペアで保存
175 */
176 mrs x21, esr_el1
177 mrs x22, elr_el1
178 stp x21, x22, [sp, #-16]!
179
180 /*
181 * SPの調整(16ビットアライメントにする)
182 */
183 mov x1, #8
184 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を減算しておく
191 */
192 sub sp, sp, #16
193.endm
194
195/*
196 * コンテキスト復帰処理
197 */
198.macro __restore_context
199 /*
200 * スタックに保存した一部データの破棄(アライメント調整分を考æ…
201®)
202 */
203 mov x1, #40
204 ldr x2, [sp, #24]
205 add x1, x1, x2
206 add sp, sp, x1
207 /*
208 * ELR/SPSR の復å…
209ƒ
210 */
211 ldp x21, x22, [sp], #16
212 msr elr_el1, x21
213 msr spsr_el1, x22
214 /*
215 * x0 - x30 の復å…
216ƒ
217 */
218 ldr x30, [sp], #8
219 ldp x29, x28, [sp], #16
220 ldp x27, x26, [sp], #16
221 ldp x25, x24, [sp], #16
222 ldp x23, x22, [sp], #16
223 ldp x21, x20, [sp], #16
224 ldp x19, x18, [sp], #16
225 ldp x17, x16, [sp], #16
226 ldp x15, x14, [sp], #16
227 ldp x13, x12, [sp], #16
228 ldp x11, x10, [sp], #16
229 ldp x9, x8, [sp], #16
230 ldp x7, x6, [sp], #16
231 ldp x5, x4, [sp], #16
232 ldp x3, x2, [sp], #16
233 ldp x1, x0, [sp], #16
234.endm
235
236/*
237 * 割込み/例外の出口処理
238 * 前提:CPUロック状æ…
239‹, ネストカウンタデクリメント済み
240 */
241 .text
242 .align 2
243 .global ret_int
244ret_int:
245 // 戻りå…
246ˆã®ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã‚’確認し,多段割込みならリターン
247 ldr x1, =_kernel_intnest
248 ldrb w3, [x1]
249 cbnz w3, int_return
250
251ret_int_2: // 初段の割込みの場合
252 // reqflg が false なら呼び出しå…
253ƒã¸æˆ»ã‚‹
254 ldr x0, =reqflg
255 ldr w1, [x0]
256 cbz w1, int_return
257
258ret_int_3: // reqflg が true の場合
259 mov w1, #0 // reqflg = false
260 str w1, [x0]
261
262 // ディスパッチ禁止なら呼び出しå…
263ƒã¸æˆ»ã‚‹
264 ldr x0, =disdsp
265 ldr w1, [x0]
266 cbnz w1, int_return
267
268 /*
269 * 遅
270延ディスパッチ
271 * search_schedtsk の返値(x0)を引数として run_task を呼び出す
272 */
273 bl search_schedtsk
274 bl run_task
275
276 /*
277 * 呼び出しå…
278ƒã¸ãƒªã‚¿ãƒ¼ãƒ³
279 */
280int_return:
281 __restore_context // レジスタ復帰
282 eret
283
284/*
285 * 割込みベクタ
286 * 最初に割込み発生前のスタックに戻してからレジスタを保存する
287 * ハードウェアによってPSTATE.{I,F} がセット済であることを前提とする
288 */
289 .text
290 .global vectors
291 .align 11
292vectors:
293 /*
294 * From EL1t
295 */
296
297 // Sync EL1
298 msr spsel, #0 // 例外発生前のスタック(SP_EL0)に戻す
299 __save_context
300 mov x22, #0 // 例外番号をx22にセット
301 b gic_exc_entry
302
303 // IRQ EL1
304 .align 7
305 msr spsel, #0 // 例外発生前のスタック(SP_EL0)に戻す
306 __save_context
307 b gic_int_entry
308
309 // FIQ EL1
310 .align 7
311 msr spsel, #0 // 例外発生前のスタック(SP_EL0)へ戻す
312 __save_context
313 b gic_int_entry
314
315 // SError EL1
316 .align 7
317 msr spsel, #0 // 例外発生前のスタック(SP_EL0)へ戻す
318 __save_context
319 mov x22, #1 // 例外番号をx22にセット
320 b gic_exc_entry
321
322 /*
323 * From EL1h
324 */
325
326 // Sync EL1
327 .align 7
328 __save_context
329 mov x22, #2 // 例外番号をx22にセット
330 b gic_exc_entry
331
332 // IRQ EL1
333 .align 7
334 __save_context
335 b gic_int_entry
336
337 // FIQ EL1
338 .align 7
339 __save_context
340 b gic_int_entry
341
342 // Error EL1
343 .align 7
344 __save_context
345 mov x22, #3 // 例外番号をx22にセット
346 b gic_exc_entry
347
348 /*
349 * From EL0t
350 */
351
352 // Sync EL0
353 .align 7
354 msr spsel, #0 // 例外発生前のスタック(SP_EL0)に戻す
355 __save_context
356 mov x22, #4 // 例外番号をx22にセット
357 b gic_exc_entry
358
359 // IRQ EL0
360 .align 7
361 msr spsel, #0 // 例外発生前のスタック(SP_EL0)に戻す
362 __save_context
363 b gic_int_entry
364
365 // FIQ EL0
366 .align 7
367 msr spsel, #0 // 例外発生前のスタック(SP_EL0)に戻す
368 __save_context
369 b gic_int_entry
370
371 // Error EL0
372 .align 7
373 msr spsel, #0 // 例外発生前のスタック(SP_EL0)に戻す
374 __save_context
375 mov x22, #5 // 例外番号をx22にセット
376 b gic_exc_entry
377
378 /*
379 * From EL0 using AArch32
380 */
381
382 // AArch32 sync
383 .align 7
384 msr spsel, #0 // 例外発生前のスタック(SP_EL0)に戻す
385 __save_context
386 mov x22, #6 // 例外番号をx22にセット
387 b gic_exc_entry
388
389 // AArch32 IRQ
390 .align 7
391 msr spsel, #0 // 例外発生前のスタック(SP_EL0)に戻す
392 __save_context
393 b gic_int_entry
394
395 // AArch32 FIQ
396 .align 7
397 msr spsel, #0 // 例外発生前のスタック(SP_EL0)に戻す
398 __save_context
399 b gic_int_entry
400
401 // AArch32 Error
402 .align 7
403 msr spsel, #0 // 例外発生前のスタック(SP_EL0)に戻す
404 __save_context
405 mov x22, #7 // 例外番号をx22にセット
406 b gic_exc_entry
Note: See TracBrowser for help on using the repository browser.