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

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

modify svn:mimetype of files

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