source: ssp_rpi3/trunk/arch/arm64_gcc/bcm283x/chip_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: 8.3 KB
Line 
1/*
2 * TOPPERS/SSP Kernel
3 * Smallest Set Profile Kernel
4 *
5 * Copyright (C) 2018,2019 by Naoki Saito
6 * Nagoya Municipal Industrial Research Institute, JAPAN
7 *
8 * 上記著作権者
9は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
10 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
11 * 変・再é…
12å¸ƒï¼ˆä»¥ä¸‹ï¼Œåˆ©ç”¨ã¨å‘¼ã¶ï¼‰ã™ã‚‹ã“とを無償で許諾する.
13 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
14 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
15 * スコード中に含まれていること.
16 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
17 * 用できる形で再é…
18å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
19å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
20 * 者
21マニュアルなど)に,上記の著作権表示,この利用条件および下記
22 * の無保証規定を掲載すること.
23 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
24 * 用できない形で再é…
25å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
26 * と.
27 * (a) 再é…
28å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
29マニュアルなど)に,上記の著
30 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
31 * (b) 再é…
32å¸ƒã®å½¢æ…
33‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
34 * 報告すること.
35 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
36 * 害からも,上記著作権者
37およびTOPPERSプロジェクトをå…
38è²¬ã™ã‚‹ã“と.
39 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
40 * 由に基づく請求からも,上記著作権者
41およびTOPPERSプロジェクトを
42 * å…
43è²¬ã™ã‚‹ã“と.
44 *
45 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者
46お
47 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
48 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
49 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
50 * の責任を負わない.
51 *
52 */
53
54/*
55 * チップ依存モジュール アセンブリ言語部(BCM2837)
56 */
57
58#define TOPPERS_MACRO_ONLY
59#define UINT_C(val) (val) /* uint_t型の定数を作るマクロ */
60#define ULONG_C(val) (val) /* ulong_t型の定数を作るマクロ */
61#define UINT64_C(val) (val) /* uint64_t型の定数を作るマクロ */
62#define CAST(type, val) (val) /* 型キャストを行うマクロ */
63
64#include "kernel_impl.h"
65
66/*
67 * 例外å…
68¥å£ã®æ“ä½œ
69 * x22: excno(0..7)
70 */
71 .text
72 .align 2
73 .global chip_exc_entry
74chip_exc_entry:
75 mov x0, sp
76 str x22, [x0, #8] // save excno in stack
77
78 adrp x1, current_intpri // save int priority in stack
79 add x1, x1, :lo12:current_intpri
80 ldr w2, [x1]
81 str w2, [x0]
82
83 mov x1, x22 // arg: excno
84 bl call_exc_handler
85
86 // 例外発生直前のIフラグまたはFフラグが1ならカーネル管理外のCPU例外とみなす
87 ldr x3, [x0, #32] // SPSR --> x1
88 tst x3, #(3 << 6)
89 b.ne ret_exc
90
91 // カーネル管理のCPU例外の場合は割込みの出口処理とå…
92±é€š
93 msr daifclr, #AARCH64_DAIF_FIQ
94 b ret_int
95
96/*
97 * FIQのå…
98¥å£å‡¦ç†
99 */
100 .text
101 .align 2
102 .global chip_fiq_entry
103chip_fiq_entry:
104 ldr x30, =ret_fiq // return to ret_fiq
105 b call_fiq_handler
106
107/*
108 * 割込みå…
109¥å£ã®æ“ä½œ
110 */
111 .text
112 .align 2
113 .global chip_int_entry
114chip_int_entry:
115 mov x0, sp
116 /*
117 * 割込み要因の特定と保存
118 */
119find_int_src_core: // find a interrupt source from core(core 0)
120 movz x1,#:abs_g1_nc:CORE0_IRQ_SRC
121 movk x1,#:abs_g0_nc:CORE0_IRQ_SRC
122 ldr w2, [x1]
123 mov x9, xzr
1241:
125 tst w2, #0x1
126 b.ne 2f
127 lsr w2, w2, #1
128 add w9, w9, #1
129 cmp w9, #32
130 b.ne 1b
1312:
132 cmp w9, #8 // pending interrupt is GPU interrupt
133 b.eq find_int_src_basic
134 cmp w9, #32 // pending interrupt is not found
135 b.eq find_int_src_basic
136 b find_int_src_exit
137
138find_int_src_basic: // basic pending register
139 mov w9, #32
140 movz x1,#:abs_g1_nc:IRQ_PEND_B
141 movk x1,#:abs_g0_nc:IRQ_PEND_B
142 ldr w2, [x1]
1431:
144 tst w2, #0x1
145 b.ne 2f
146 lsr w2, w2, #1
147 add w9, w9, #1
148 cmp w9, #64
149 b.ne 1b
1502:
151 cmp w9, #(32+8) // GPU pending register 1
152 b.eq find_int_src_gpu1
153 cmp w9, #(32+9) // GPU pending register 2
154 b.eq find_int_src_gpu2
155 cmp w9, #(32+10) // GPU irq 7
156 b.eq gpu_irq_7
157 cmp w9, #(32+11) // GPU irq 9
158 b.eq gpu_irq_9
159 cmp w9, #(32+12) // GPU irq 10
160 b.eq gpu_irq_10
161 cmp w9, #(32+13) // GPU irq 18
162 b.eq gpu_irq_18
163 cmp w9, #(32+14) // GPU irq 19
164 b.eq gpu_irq_19
165 cmp w9, #(32+15) // GPU irq 53
166 b.eq gpu_irq_53
167 cmp w9, #(32+16) // GPU irq 54
168 b.eq gpu_irq_54
169 cmp w9, #(32+17) // GPU irq 55
170 b.eq gpu_irq_55
171 cmp w9, #(32+18) // GPU irq 56
172 b.eq gpu_irq_56
173 cmp w9, #(32+19) // GPU irq 57
174 b.eq gpu_irq_57
175 cmp w9, #(32+20) // GPU irq 62
176 b.eq gpu_irq_62
177 cmp w9, #64 // pending interrupt is not found
178 b.eq find_int_src_gpu1
179
180 b find_int_src_exit // others
181
182gpu_irq_7:
183 mov w9, #(64+7)
184 b find_int_src_exit
185gpu_irq_9:
186 mov w9, #(64+9)
187 b find_int_src_exit
188gpu_irq_10:
189 mov w9, #(64+10)
190 b find_int_src_exit
191gpu_irq_18:
192 mov w9, #(64+18)
193 b find_int_src_exit
194gpu_irq_19:
195 mov w9, #(64+19)
196 b find_int_src_exit
197gpu_irq_53:
198 mov w9, #(64+53)
199 b find_int_src_exit
200gpu_irq_54:
201 mov w9, #(64+54)
202 b find_int_src_exit
203gpu_irq_55:
204 mov w9, #(64+55)
205 b find_int_src_exit
206gpu_irq_56:
207 mov w9, #(64+56)
208 b find_int_src_exit
209gpu_irq_57:
210 mov w9, #(64+57)
211 b find_int_src_exit
212gpu_irq_62:
213 mov w9, #(64+62)
214 b find_int_src_exit
215
216find_int_src_gpu1: // GPU pending register 1
217 mov w9, #64
218 movz x1,#:abs_g1_nc:IRQ_PEND_1
219 movk x1,#:abs_g0_nc:IRQ_PEND_1
220 ldr w2, [x1]
2211:
222 tst w2, #0x1
223 b.ne 2f
224 lsr w2, w2, #1
225 add w9, w9, #1
226 cmp w9, #96
227 b.ne 1b
2282:
229 cmp w9, #96 // pending interrupt is not found
230 b.eq find_int_src_gpu2
231 b find_int_src_exit
232
233find_int_src_gpu2: // GPU pending register 2
234 mov w9, #96
235 movz x1,#:abs_g1_nc:IRQ_PEND_2
236 movk x1,#:abs_g0_nc:IRQ_PEND_2
237 ldr w2, [x1]
2381:
239 tst w2, #0x1
240 b.ne find_int_src_exit
241 lsr w2, w2, #1
242 add w9, w9, #1
243 cmp w9, #128 // pending interrupt is not found (and interrupt source is unknown)
244 b.ne 1b
245
246find_int_src_exit:
247 cmp w9, #128
248 b.eq ret_int
249 str w9, [x0, #8] // save intno to (sp+8)
250
251 /*
252 * 割込み発生直前の割込み優å…
253ˆåº¦ï¼ˆå†…
254部表現)を保存
255 */
256 adrp x1, current_intpri
257 add x1, x1, :lo12:current_intpri
258 ldr w2, [x1]
259 str w2, [x0]
260
261 /*
262 * 割込み要因の優å…
263ˆåº¦ã‚’取得
264 */
265 adrp x3, _kernel_intpri_table
266 add x3, x3, #:lo12:_kernel_intpri_table
267 ldr w4, [x3, x9, lsl #2]
268
269 // 発生した割込みの優å…
270ˆåº¦ã‚’もとに割込みをマスク
271 mov w0, w4 // arg: intpri
272 bl chip_mask_interrupt
273
274 // D,A,F フラグをクリアしておく(CPUロック相当にする)
275 msr daifclr, #(AARCH64_DAIF_DBG | AARCH64_DAIF_SERR | AARCH64_DAIF_FIQ)
276
277 // ハンドラ呼び出し
278 mov x0, sp
279 ldr w9, [x0, #8]
280 mov w0, w9 // arg: intno
281 bl call_int_handler
282 /* そのまま chip_ret_int へ */
283
284/*
285 * 割込み出口のGIC操作
286 */
287chip_ret_int:
288 // 割込み発生前の優å…
289ˆåº¦ã«æˆ»ã™
290 mov x0, sp
291 adrp x1, current_intpri
292 add x1, x1, :lo12:current_intpri
293 ldr w2, [x0] // previous int priority
294 str w2, [x1]
295
296 // 優å…
297ˆåº¦ã‚’å…
298ƒã«å‰²è¾¼ã¿ã®ãƒžã‚¹ã‚¯ã‚’戻す
299 mov w0, w2
300 bl chip_unmask_interrupt
301
302 b ret_int
Note: See TracBrowser for help on using the repository browser.