source: anotherchoice/tags/jsp-1.4.4-full-UTF8/config/microblaze/cpu_support.S@ 26

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

initial

File size: 15.2 KB
Line 
1/*
2 *
3 * TOPPERS/JSP Kernel
4 * Toyohashi Open Platform for Embedded Real-Time Systems/
5 * Just Standard Profile Kernel
6 *
7 * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
8 * Toyohashi Univ. of Technology, JAPAN
9 *
10 * 上記著作権者
11は,以下の (1)〜(4) の条件か,Free Software Foundation
12 * によってå…
13¬è¡¨ã•ã‚Œã¦ã„ã‚‹ GNU General Public License の Version 2 に記
14 * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア
15 * を改変したものを含む.以下同じ)を使用・複製・改変・再é…
16å¸ƒï¼ˆä»¥ä¸‹ï¼Œ
17 * 利用と呼ぶ)することを無償で許諾する.
18 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
19 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
20 * スコード中に含まれていること.
21 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
22 * 用できる形で再é…
23å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
24å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
25 * 者
26マニュアルなど)に,上記の著作権表示,この利用条件および下記
27 * の無保証規定を掲載すること.
28 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
29 * 用できない形で再é…
30å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
31 * と.
32 * (a) 再é…
33å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
34マニュアルなど)に,上記の著
35 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
36 * (b) 再é…
37å¸ƒã®å½¢æ…
38‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
39 * 報告すること.
40 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
41 * 害からも,上記著作権者
42およびTOPPERSプロジェクトをå…
43è²¬ã™ã‚‹ã“と.
44 *
45 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者
46お
47 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も
48 * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直
49 * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない.
50 *
51 * @(#) $Id: cpu_support.S,v 1.15 2007/04/19 06:38:27 honda Exp $
52 */
53
54#define _MACRO_ONLY
55
56/*
57 * アプリケーションとå…
58±é€šã®ã‚¤ãƒ³ã‚¯ãƒ«ãƒ¼ãƒ‰ãƒ•ã‚¡ã‚¤ãƒ«
59 */
60#include <kernel.h>
61
62/*
63 * ターゲット依存情
64報の定義
65 */
66#include <t_config.h>
67
68#include "jsp_kernel.h"
69#include "offset.h"
70#include <microblaze_asm.inc>
71#include <microblaze.h>
72
73
74/*
75 * INTCの設計について,
76 *
77 * 保存するレジスタ
78 * R3-R4 Return Valus (Volatile)
79 * R5-R10 Passing parameters (Volatile)
80 * R11-R12 Temporaries (Volatile)
81 * R14 Return address for interrupt
82 * R15 Return address for Sub-routine
83 * R16 Return address for Trap(Debugger)
84 * R17 Return address for Exeptions
85 * ?R18 Reserved for Assember
86 */
87
88#define STACK_TOP (STACKTOP - 0x4)
89
90#define INTC_ISR (INTC_BASE + INTC_INT_STATUS_REG)
91#define INTC_IPR (INTC_BASE + INTC_INT_PENDING_REG)
92#define INTC_IER (INTC_BASE + INTC_INT_ENABLE_REG)
93#define INTC_IAR (INTC_BASE + INTC_INT_ACK_REG)
94#define INTC_SIE (INTC_BASE + INTC_SET_INT_ENABLE)
95#define INTC_CIE (INTC_BASE + INTC_CLEAR_INT_ENABLE)
96#define INTC_IVR (INTC_BASE + INTC_INT_VECTOR_REG)
97#define INTC_MER (INTC_BASE + INTC_MASTER_ENABLE_REG)
98
99
100/*
101 * 例外エントリ
102 * Not Support!
103 */
104 .text
105 .globl exception_entry
106 .align 2
107exception_entry:
108 nop
109
110
111
112
113 .text
114 .globl interrupt_entry
115 .align 2
116interrupt_entry:
117/*
118 * スタックポインタの切り替えが必
119要
120 */
121 addik r1,r1,-64
122 swi r3, r1, 60
123 swi r4, r1, 56
124 swi r5, r1, 52
125 swi r6, r1, 48
126 swi r7, r1, 44
127 swi r8, r1, 40
128 swi r9, r1, 36
129 swi r10, r1, 32
130 swi r11, r1, 28
131 swi r12, r1, 24
132 swi r14, r1, 20
133 swi r15, r1, 16
134 swi r16, r1, 12
135 swi r17, r1, 8
136 swi r18, r1, 4
137 mfs r3, rmsr /* msrの保存 */
138 swi r3, r1, 0
139
140 lwi r5, r13, interrupt_count
141 bgti r5, nest_int /* ネスト回数が1以上ならスタックを切り替えない */
142
143 /*
144 * スタックポインタ切り替え
145 */
146 la r4, r0, STACK_TOP /* タスク独立部のスタックの読み込み */
147 sw r1, r0, r4 /* タスクスタックの保存 */
148 Mov r1, r4 /* スタックポインタ切り替え */
149nest_int:
150 /*
151 * 割込みネスト回数のインクリメント
152 */
153 addi r5, r5, 1
154 swi r5, r13, interrupt_count
155
156 lwi r3, r0, INTC_IVR /* ベクタの読み込み */
157 add r3, r3, r3 /* ベクタを4倍 */
158 add r3, r3, r3
159 lwi r5, r3, int_handler_table /* ハンドラアドレスの読み込み */
160 lwi r6, r3, int_bit_table /* マスクビットの読み込み */
161 swi r6, r0, INTC_CIE /* 発生した割込みをマスク */
162 ori r4, r0, 0x02 | MSR_CACHE_SETTING /* r4 = 0x02 */
163 Push r6 /* マスクビットをスタックに */
164
165 mts rmsr,r4 /* 割込み許可(MSR(IE)をセット)*/
166
167 brald r15, r5 /* ハンドラ呼び出し */
168 nop
169
170 la r4, r0, MSR_CACHE_SETTING
171 mts rmsr,r4 /* 割込み禁止 */
172
173// ori r4, r0, 0x03 /* r4 = 0x03 */
174// swi r4, r0, INTC_MER /* INTC_MER = 0x0 INTCスタート */
175
176 Pop r6 /* マスクビットの取り出し */
177// swi r6, r0, INTC_IAR /* ACK */
178 swi r6, r0, INTC_SIE /* 発生割込みの許可 */
179
180 /*
181 * 割込みネスト回数のデクリメント
182 */
183 lwi r5, r13, interrupt_count
184 addi r5, r5, -1
185 swi r5, r13, interrupt_count
186
187 bgti r5, ret_to_task_int /* ネスト回数が1以上なら戻る */
188
189 lw r1, r0, r1 /* スタックポインタを戻す */
190 lwi r4, r13, reqflg /* reqflg のチェック */
191 beqi r4, ret_to_task_int /* FALSE なら タスクに戻る */
192 bri ret_int /* TRUE なら ret_int に */
193ret_to_task_int:
194 lwi r3, r1, 0
195 mts rmsr,r3
196 lwi r18, r1, 4
197 lwi r17, r1, 8
198 lwi r16, r1, 12
199 lwi r15, r1, 16
200 lwi r14, r1, 20
201 lwi r12, r1, 24
202 lwi r11, r1, 28
203 lwi r10, r1, 32
204 lwi r9, r1, 36
205 lwi r8, r1, 40
206 lwi r7, r1, 44
207 lwi r6, r1, 48
208 lwi r5, r1, 52
209 lwi r4, r1, 56
210 lwi r3, r1, 60
211 rtid r14,0
212 addik r1,r1,64
213
214
215
216 /*
217 * 未登録の割込みが発生すると呼び出される
218 * Not Yet!
219 */
220 .globl no_reg_interrupt
221 .align 2
222no_reg_interrupt:
223 nop
224
225
226 /*
227 * タスクディスパッチャ
228 *
229 * dispatch は,interrupt_count = 0
230 * MSRの IE=0 の割込み禁止状æ…
231‹ã§å‘¼ã³å‡ºã•ãªã‘ればならない.
232 * exit_and_dispatch も同様に,interrupt_count = 0 割込み禁止状æ…
233‹ã§
234 * 呼び出すのが原則であるが,カーネル起動時に対応するため,
235 * interrupt_count = 1 で呼び出した場合にも対応している.
236 *
237 */
238
239 .globl dispatch
240 .align 2
241dispatch:
242 addi r1, r1, -64 /* スクラッチレジスタ以外を保存する */
243 swi r15, r1, 60
244 mfs r3, rmsr /* msrの保存(キャッシュの設定の保存) */
245 swi r3, r1, 56
246 swi r18, r1, 52 /* 必
247要か? */
248 swi r19, r1, 48
249 swi r20, r1, 44
250 swi r21, r1, 40
251 swi r22, r1, 36
252 swi r23, r1, 32
253 swi r24, r1, 28
254 swi r25, r1, 24
255 swi r26, r1, 20
256 swi r27, r1, 16
257 swi r28, r1, 12
258 swi r29, r1, 8
259 swi r30, r1, 4
260 swi r31, r1, 0
261 lwi r4 , r13, runtsk /* r4 <- runtsk */
262 swi r1 , r4, TCB_sp /* タスクスタックをTCBに保存 */
263 la r5 , r0, dispatch_r /* 実行再開番地を保存 */
264 swi r5 , r4, TCB_pc /* 実行再開番地をTCBに保存 */
265 bri dispatcher
266
267dispatch_r:
268 lwi r31, r1, 0 /* レジスタを復帰 */
269 lwi r30, r1, 4
270 lwi r29, r1, 8
271 lwi r28, r1, 12
272 lwi r27, r1, 16
273 lwi r26, r1, 20
274 lwi r25, r1, 24
275 lwi r24, r1, 28
276 lwi r23, r1, 32
277 lwi r22, r1, 36
278 lwi r21, r1, 40
279 lwi r20, r1, 44
280 lwi r19, r1, 48
281 lwi r18, r1, 52
282 lwi r3, r1, 56 /* MSRを戻す(キャッシュの設定を戻す) */
283 mts rmsr,r3
284 addi r1, r1, 60 /* スタックポインタを戻す */
285 /*
286 * タスク例外処理ルーチンの起動
287 * dispatch_r は dispatcher から呼び出されるため,
288 * tcb のアドレスは r4 にå…
289¥ã£ã¦ã„ã‚‹
290 * Not Yet!
291 */
292 lwi r5, r4, TCB_enatex /* r5 <- enatex */
293 andi r6, r5, TCB_enatex_mask
294 beqi r6, dispatch_r_1 /* enatex が FALSE ならリターン */
295 lwi r7, r4, TCB_texptn /* r5 <- texptn */
296 beqi r7, dispatch_r_1 /* texptn が 0 でなければ */
297 brlid r15 call_texrtn /* タスク例外ルーチンの呼び出し */
298 nop
299dispatch_r_1:
300 Pop r15
301 rtsd r15,8
302 nop
303
304
305
306 .globl exit_and_dispatch
307exit_and_dispatch:
308 /* interrupt_count をクリア */
309 swi r0, r13, interrupt_count
310dispatcher:
311 /*
312 * ここは割込み禁止で来ること
313 */
314 lwi r4, r13, schedtsk /* r4 <- schedtsk */
315 swi r4, r13, runtsk /* schedtsk を runtsk に */
316 beqi r4, dispatcher_1 /* schedtsk があるか */
317 lwi r1, r4, TCB_sp /* TCBからタスクスタックを復帰 */
318 lwi r5, r4, TCB_pc /* TCBから実行再開番地を復帰 */
319 bra r5
320dispatcher_1:
321 /*
322 * ここで割込みモードに切り替えるのは,ここで発生する割込み処理
323 * にどのスタックを使うかという問題の解決と,割込みハンドラ内
324で
325 * のタスクディスパッチの防止という2つの意味がある.
326 */
327 la r1, r0, STACKTOP /* 割込みスタックに変更 */
328 la r6, r0, 1 /* interrupt_count を1に */
329 swi r6, r13, interrupt_count
330 la r5, r0, 0x02 | MSR_CACHE_SETTING /* IE = '1' */
331 la r4, r0, MSR_CACHE_SETTING /* IE = '0' */
332dispatcher_2:
333 mts rmsr, r5 /* 割込み許可(MSR(IE)をセット) */
334 nop
335 nop
336 mts rmsr, r4 /* 割込み禁止(MSR(IE)をクリア) */
337 lwi r6, r13, reqflg /* r6 <- reqflg */
338 beqi r6, dispatcher_2 /* reqflg が FALSE なら */
339 swi r0, r13, interrupt_count /* interrupt_count をクリア */
340 swi r0, r13, reqflg /* reqflg を FALSE に */
341 bri dispatcher
342
343 /*
344 * 割込みハンドラ/CPU例外ハンドラ出口処理
345 *
346 * 戻りå…
347ˆãŒã‚¿ã‚¹ã‚¯ã§ reqflg がセットされている場合のみここにくる.
348 * interrupt_count = 0,割込み禁止状æ…
349‹ï¼Œã‚¹ã‚¯ãƒ©ãƒƒãƒãƒ¬ã‚¸ã‚¹ã‚¿ã‚’保存した
350 * 状æ…
351‹ã§å‘¼ã³å‡ºã™ã“と.
352 */
353 .align 2
354 .globl ret_int
355 .globl ret_exc
356ret_exc:
357ret_int:
358 swi r0, r13, reqflg /* reqflg を FALSE に */
359 lwi r4, r13, runtsk /* r4 <- runtsk */
360 lwi r6, r13, enadsp /* r6 <- enadsp */
361 beqi r6, ret_int_1 /* enadsp が FALSE なら ret_int_1 へ */
362 lwi r5, r13, schedtsk /* r5 <- schedtsk */
363 sub r6, r5, r4 /* runtsk と schedtsk が同じなら */
364 beqi r6, ret_int_1 /* ret_int_1 へ */
365 addi r1, r1, -52 /* 残りのレジスタを保存する */
366 swi r19, r1, 48
367 swi r20, r1, 44
368 swi r21, r1, 40
369 swi r22, r1, 36
370 swi r23, r1, 32
371 swi r24, r1, 28
372 swi r25, r1, 24
373 swi r26, r1, 20
374 swi r27, r1, 16
375 swi r28, r1, 12
376 swi r29, r1, 8
377 swi r30, r1, 4
378 swi r31, r1, 0
379 swi r1 , r4, TCB_sp /* タスクスタックをTCBに保存 */
380 la r6 , r0, ret_int_r /* 実行再開番地を保存 */
381 swi r6 , r4, TCB_pc /* 実行再開番地をTCBに保存 */
382 bri dispatcher
383
384ret_int_r:
385 lwi r31, r1, 0 /* レジスタを復帰 */
386 lwi r30, r1, 4
387 lwi r29, r1, 8
388 lwi r28, r1, 12
389 lwi r27, r1, 16
390 lwi r26, r1, 20
391 lwi r25, r1, 24
392 lwi r24, r1, 28
393 lwi r23, r1, 32
394 lwi r22, r1, 36
395 lwi r21, r1, 40
396 lwi r20, r1, 44
397 lwi r19, r1, 48
398 addi r1, r1, 52
399 lwi r3, r1, 0 /* MSR を戻す(キャッシュの設定を戻す)*/
400 mts rmsr, r3
401ret_int_1:
402 /*
403 * タスク例外ルーチンの起動
404 * ret_int_r は dispatcher から呼び出されるため,
405 * tcb のアドレスは r4 にå…
406¥ã£ã¦ã„ã‚‹
407 */
408 lwi r5, r4, TCB_enatex /* r5 <- enatex */
409 andi r6, r5, TCB_enatex_mask
410 beqi r6, ret_int_2 /* enatex が FALSE ならリターン */
411 lwi r7, r4, TCB_texptn /* r5 <- texptn */
412 beqi r7, ret_int_2 /* texptn が 0 でなければ */
413 brlid r15 call_texrtn /* タスク例外ルーチンの呼び出し */
414 nop
415ret_int_2:
416 lwi r3, r1, 0 /* MSR を戻す(割込みIE=0で割込み禁止になる)*/
417 mts rmsr,r3
418 lwi r18, r1, 4
419 lwi r17, r1, 8
420 lwi r16, r1, 12
421 lwi r15, r1, 16
422 lwi r14, r1, 20
423 lwi r12, r1, 24
424 lwi r11, r1, 28
425 lwi r10, r1, 32
426 lwi r9, r1, 36
427 lwi r8, r1, 40
428 lwi r7, r1, 44
429 lwi r6, r1, 48
430 lwi r5, r1, 52
431 lwi r4, r1, 56
432 lwi r3, r1, 60
433 rtid r14,0
434 addik r1,r1,64
435
436
437
438 /*
439 * タスク起動処理
440 *
441 * スタックの取り方
442 * Microblaze Processor Reference Guide 52〜53より
443 * 関数呼出しのさい引数は,r5〜r10 に格納する.
444 * それと同時に呼出しå…
445ƒã¯ã‚¹ã‚¿ãƒƒã‚¯ãƒ•ãƒ¬ãƒ¼ãƒ ã«å¼•æ•°ã®æ ¼ç´å ´æ‰€ã‚’確保する必
446要
447 * がある.さらにその上にはリンクレジスタ(R15)の分の領域が必
448要となる.
449 * 呼出しå…
450ˆã¯æ›´ã«ä»–の関数を呼び出す場合等に r5〜r10 をこの領域に保存す
451 * る.
452 * Low Address
453 * --------------------
454 * new_sp -> | Link Register(R15) |
455 * --------------------
456 * | Arg1用の領域 |
457 * --------------------
458 * | Arg2用の領域 |
459 * --------------------
460 * | .... |
461 * --------------------
462 * High Address
463 */
464
465 .text
466 .globl activate_r
467 .align 2
468activate_r:
469 ori r4, r0, 0x02 | MSR_CACHE_SETTING /* msrの初期値 */
470 mts rmsr,r4 /* 割込み許可(MSR(IE)をセット) */
471 lw r11, r1, r0 /* タスクの実行番地 */
472 lwi r5, r1, 4 /* 引数(exinf) */
473 la r15, r0, ext_tsk -8 /* タスクからの戻りå…
474ˆ */
475 bra r11 /* タスクの実行開始 */
476
477
478
479 /*
480 * 微少時間待
481ち
482 */
483 .globl _sil_dly_nse
484_sil_dly_nse:
485 addi r5, r5, -SIL_DLY_TIM1
486 bgti r5, _sil_dly_nse_1
487 rtsd r15, 8
488 nop
489_sil_dly_nse_1:
490 addi r5, r5, -SIL_DLY_TIM2
491 bgti r5, _sil_dly_nse_1
492 rtsd r15, 8
493 nop
Note: See TracBrowser for help on using the repository browser.