source: ssp_rpi3/trunk/arch/arm64_gcc/common/core_support.S@ 384

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

add target dependent files of ssp for rpi3

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