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

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

set svn:mime-type to files

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