source: anotherchoice/tags/jsp-1.4.4-full-UTF8/config/armv4/az9360mb/sys_support.S@ 26

Last change on this file since 26 was 26, checked in by ykominami, 10 years ago

initial

File size: 10.7 KB
Line 
1/*
2 * TOPPERS/JSP Kernel
3 * Toyohashi Open Platform for Embedded Real-Time Systems/
4 * Just Standard Profile Kernel
5 *
6 * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
7 * Toyohashi Univ. of Technology, JAPAN
8 *
9 * Copyright (C) 2005-2007 by Y.D.K.Co.,LTD Technologies company
10 *
11 * 上記著作権者
12は,以下の (1)〜(4) の条件か,Free Software Foundation
13 * によってå…
14¬è¡¨ã•ã‚Œã¦ã„ã‚‹ GNU General Public License の Version 2 に記
15 * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア
16 * を改変したものを含む.以下同じ)を使用・複製・改変・再é…
17å¸ƒï¼ˆä»¥ä¸‹ï¼Œ
18 * 利用と呼ぶ)することを無償で許諾する.
19 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
20 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
21 * スコード中に含まれていること.
22 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
23 * 用できる形で再é…
24å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
25å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
26 * 者
27マニュアルなど)に,上記の著作権表示,この利用条件および下記
28 * の無保証規定を掲載すること.
29 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
30 * 用できない形で再é…
31å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
32 * と.
33 * (a) 再é…
34å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
35マニュアルなど)に,上記の著
36 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
37 * (b) 再é…
38å¸ƒã®å½¢æ…
39‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
40 * 報告すること.
41 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
42 * 害からも,上記著作権者
43およびTOPPERSプロジェクトをå…
44è²¬ã™ã‚‹ã“と.
45 *
46 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者
47お
48 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も
49 * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直
50 * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない.
51 *
52 * @(#) $Id: sys_support.S,v 1.2 2007/05/21 01:33:50 honda Exp $
53 */
54
55#define _MACRO_ONLY
56#include "jsp_kernel.h"
57#include <ns9360.h>
58
59/* プロセッサモード */
60Mode_SVC = 0x13
61
62/* ステータスレジスタ割り込みbit */
63I_Bit = 0x80
64F_Bit = 0x40
65
66/* BBUS reset register */
67BBUS_RESET_BASE = 0x90600000
68
69
70/*
71 * 低レベルのターゲットシステム依存の初期化
72 *
73 * スタートアップモジュールの中で,メモリ初期化の前に呼び出される.
74 */
75
76 .text
77 .align 2
78 .global hardware_init_hook
79hardware_init_hook:
80
81/*
82 * NS9360依存の初期化
83 */
84/*
85 * bbus_reset
86 */
87 mov r0, #0x0
88 ldr r0, =BBUS_RESET_BASE
89 mov r1, #0x0
90 str r1, [r0, #0]
91
92/*
93 * CS、GPIO Initial
94 */
95 stmfd sp!, {r4 - r11,lr} /* レジスタの保存 */
96 bl cpu_CsGpioInit
97 ldmfd sp!,{r4 - r11,lr}
98
99/*----*/
100init_done:
101 mov pc, lr
102
103
104/*
105 *
106 * 割込みの出å…
107¥ã‚Šå£å‡¦ç†
108 *
109 */
110 .text
111 .align 4
112 .global IRQ_Handler
113IRQ_Handler:
114
115 /*
116 * 割込みモード
117 *
118 * cpsrがspsr_irqに復帰å…
119ˆãŒr14_irq(lp)にå…
120¥ã‚Šï¼Œ
121 * spsr_irqとr14_irqとr13(sp)_irqが r14,r13となる.
122 */
123
124 /*
125 * タスクの動作時モード(スーパーバイザーモード)へ
126 */
127 mov sp,#(CPSR_SVC | CPSR_FIQ_BIT | CPSR_IRQ_BIT)
128 msr cpsr_all, sp
129 stmfd sp!, {r0-r3,ip,lr,pc} /* pcはダミー */
130
131
132 /*
133 * spsrと戻り番地を取得するためにIRQモードへ
134 */
135 mov r0,#(CPSR_IRQ | CPSR_FIQ_BIT | CPSR_IRQ_BIT)
136 msr cpsr,r0
137 sub r0,lr,#4
138 mrs r1,spsr
139
140
141 /*
142 * スーパーバイザーモードに
143 */
144 and r2, r1, #CPSR_FIQ_BIT /* FIQビットの継承 */
145 orr r2, r2, #(CPSR_SVC|CPSR_IRQ_BIT)
146 msr cpsr, r2
147 str r0, [sp,#0x18] /* Store pc */
148 stmfd sp!,{r1} /* spsr */
149
150
151 /*
152 * 多重割り込みか判定
153 */
154 ldr r2, =interrupt_count
155 ldr r3, [r2]
156 add r0,r3,#1
157 str r0, [r2]
158 cmp r3, #0x00
159
160 moveq r2,sp /* ネスト割り込みでない場合 */
161 ldreq sp,=STACKTOP /* スタックの変更 */
162 stmeqfd sp!,{r2} /* タスクスタックの保存 */
163
164 /*
165 * 割り込み要因の判定.
166 * INT_IDの読み込み.(ここにある必
167要はない.)
168 */
169
170 ldr r3, =ISRADDR_REG
171 ldr r0, [r3] /* 割り込みベクタの読み出し */
172
173 /*
174 * 未定義の割込みかチェック
175 */
176 cmp r0, #0x00
177 beq undefined_interrupt
178
179 /*
180 * 割り込み許可
181 */
182 mrs r2, cpsr
183 and r2, r2, #~CPSR_IRQ_BIT /* 割込み許可 */
184 msr cpsr,r2
185
186 /*
187 * Call Handler
188 */
189 mov lr, pc
190 mov pc, r0
191
192 /*
193 * 割り込み禁止
194 */
195 mrs r2, cpsr
196 and r2, r2, #CPSR_FIQ_BIT /* FIQビットの継承 */
197 orr r2, r2, #(CPSR_SVC|CPSR_IRQ_BIT)
198 msr cpsr,r2
199
200 /*
201 * 割込みネスト回数(interrupt_count) デクリメント
202 */
203 ldr r2, =interrupt_count
204 ldr r1, [r2]
205 sub r3, r1, #1
206 str r3, [r2]
207 cmp r3, #0x00
208 bne return_to_task_irq
209
210 /*
211 * 割込みネストが無いので、å…
212¨ã¦ã®ãƒžã‚¹ã‚¯ã‚’クリア
213 */
214 ldr r2, =ISRADDR_REG
215 str r0, [r2] /* 割込みマスククリア */
216 /*
217 * タスクスタックの復帰
218 */
219 ldmfd sp!,{r0}
220 mov sp, r0
221
222 ldr r1, =reqflg /* Check reqflg */
223 ldr r0, [r1]
224 cmp r0, #0
225 beq return_to_task_irq
226 mov r0, #0
227 str r0, [r1] /* Clear reqflg */
228 b ret_int
229
230return_to_task_irq:
231 /*
232 * 復帰処理
233 * 割り込み許可となるがタスクコンテキスト上に保存しているため,
234 * 問題はない
235 */
236 ldmfd sp!,{r1} /* CPSRの復帰処理 */
237 mrs r2, cpsr /* FIQを継承 */
238 and r2, r2, #CPSR_FIQ_BIT
239 and r1, r1, #~CPSR_FIQ_BIT
240 orr r1, r1, r2
241 msr spsr, r1
242 ldmfd sp!,{r0-r3,ip,lr,pc}^ /*タスク復帰 + 割込み許可 */
243
244 /*
245 * 未定義の割込みがå…
246¥ã£ãŸã¨ãã«å‘¼ã³å‡ºã™
247 */
248undefined_interrupt:
249 b undef_interrupt
250
251
252/*
253 * キャッシュ制御関係
254 * UW cpuEnableICache( void );
255 * UW cpuEnableDCache( void );
256 * UW cpuEnableMMU( UW tlbaddr );
257 * UW cpuDCache_Line_Invalid( UW mva );
258 * UW cpuDCache_Line_Flush( UW mva );
259 * UW cpuDCache_Line_FlushInalid( UW mva );
260 * UW cpuDCache_DrainWriteBuffer( void );
261 */
262
263
264 .global cpuEnableICache, cpuEnableDCache
265 .global cpuEnableMMU
266 .global cpuDCache_Line_Invalid, cpuDCache_Line_Flush
267 .global cpuDCache_Line_FlushInvalid, cpuDCache_DrainWriteBuffer
268
269
270#define CP15_ICACHE 0x1000
271#define CP15_DCACHE 0x0004
272#define CP15_MMU 0x0001
273
274
275/*
276 * CP15-R1のI-cache bit(b12)=1 にする。
277 * 引数なし
278 */
279cpuEnableICache:
280 mcr p15, 0, r0, c7, c5, 0 /* ICache invalidate */
281 nop
282 nop
283 nop
284 nop
285 nop
286 nop
287 nop
288 nop
289 mrc p15, 0, r0, c1, c0, 0 /* CP15 R1 */
290 orr r0, r0, #CP15_ICACHE /* I-Cache enable */
291 mcr p15, 0, r0, c1, c0, 0 /* Set CP15 R1 I-cache */
292 mov pc, lr
293
294
295/*
296 * CP15-R7でDcache invalidate 実施後にCP15-R1のD-cache bit(b2)=1にする。
297 * 引数なし。
298 */
299cpuEnableDCache:
300 mcr p15, 0, r0, c7, c6, 0 /* DC all invalidate */
301 mrc p15, 0, r0, c1, c0, 0 /* CP15 R1 */
302 orr r0, r0, #CP15_DCACHE /* D-Cache enable */
303 mcr p15, 0, r0, c1, c0, 0 /* Set CP15 R1 D-cache */
304 mov pc,lr
305
306
307/*
308 * CP15-R1のMMU bit(bit0)=1にする。TLB設定後にTBLアドレスを引数にコールする。
309 * r0:TLB address
310 */
311cpuEnableMMU:
312 mcr p15, 0, r0, c2, c0, 0 /* Set CP15 R2 TLB pointer */
313 mov r0, #0 /* */
314 mvn r0, r0 /* all domain is manager */
315 mcr p15, 0, r0, c3, c0, 0 /* set Domain access (CP15 R3) */
316
317 mrc p15, 0, r0, c1, c0, 0 /* CP15 R1 */
318 orr r0, r0, #CP15_MMU /* MMU enable */
319 mcr p15, 0, r0, c1, c0, 0 /* Set CP15 R1 MMU enable */
320 mov pc,lr
321
322
323/*
324 * CP15-R7のInvalidate DCache single entry(MVA)を実行する。
325 * r0:MVA
326 */
327cpuDCache_Line_Invalid:
328 mcr p15, 0, r0, c7, c6, 1 /* DC invalidate single entry(MVA) */
329 mov pc,lr
330
331
332/*
333 * CP15-R7のClean DCache single entry(MVA)を実行する。
334 * r0:MVA
335 */
336cpuDCache_Line_Flush:
337 mcr p15, 0, r0, c7, c10, 1 /* DC clean single entry(MVA) */
338 mov pc,lr
339
340
341/*
342 * CP15-R7のClean & Invalidate DCache single entry(MVA)を実行する。
343 * r0:MVA
344 */
345cpuDCache_Line_FlushInvalid:
346 mcr p15, 0, r0, c7, c14, 1 /* DC clean single entry(MVA) */
347 mov pc,lr
348
349
350/*
351 * CP15-R7のDrain write bufferを実行する。
352 */
353cpuDCache_DrainWriteBuffer:
354 mcr p15, 0, r0, c7, c10, 4 /* Drain write buffer */
355 mov pc,lr
356
Note: See TracBrowser for help on using the repository browser.