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

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

initial

File size: 12.6 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) 2004 by Embedded and Real-Time Systems Laboratory
8 * Graduate School of Information Science, Nagoya Univ., 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.4 2005/07/06 01:48:21 honda Exp $
52 */
53
54#define _MACRO_ONLY
55
56/*
57 * アプリケーションとå…
58±é€šã®ã‚¤ãƒ³ã‚¯ãƒ«ãƒ¼ãƒ‰ãƒ•ã‚¡ã‚¤ãƒ«
59 */
60#include <kernel.h>
61/*
62 * ターゲット依存情
63報の定義
64 */
65#include <t_config.h>
66
67#include "jsp_kernel.h"
68#include "offset.h"
69#include <nios2.h>
70
71 .set noat
72 .section .exceptions, "xa"
73 .align 2
74 .global _irq_entry
75 .type _irq_entry, @function
76_irq_entry:
77 /*
78 * 例外要因の判定
79 */
80 rdctl et, estatus
81 andi et, et, 1
82 beq et, zero, _check_trap
83 rdctl et, ipending
84 beq et, zero, _check_trap
85
86
87 /*
88 * 例外要因は割込み
89 */
90 addi ea, ea, -4 /* 戻り番地をデクリメント */
91
92 addi sp, sp, -76 /* レジスタの保存 */
93 rdctl et, estatus
94 stw et, 0(sp)
95 stw at, 4(sp)
96 stw r2, 8(sp)
97 stw r3, 12(sp)
98 stw r4, 16(sp)
99 stw r5, 20(sp)
100 stw r6, 24(sp)
101 stw r7, 28(sp)
102 stw r8, 32(sp)
103 stw r9, 36(sp)
104 stw r10, 40(sp)
105 stw r11, 44(sp)
106 stw r12, 48(sp)
107 stw r13, 52(sp)
108 stw r14, 56(sp)
109 stw r15, 60(sp)
110 stw fp, 64(sp)
111 stw ra, 68(sp)
112 stw ea, 72(sp)
113
114 /*
115 * 多重割込みか判定
116 */
117 ldw r3, %gprel(interrupt_count)(gp) /* ネスト回数のチェック */
118 bltu zero, r3, nest_int
119
120 movhi r2, %hiadj(STACKTOP-4)
121 addi r2, r2, %lo(STACKTOP-4)
122 stw sp, 0(r2) /* スタックポインタの保存 */
123 mov sp, r2 /* スタックポインタのå…
124¥ã‚Œæ›¿ãˆ */
125nest_int:
126 /*
127 * 割込み要因の判定と呼び出し
128 */
129 call int_handler_call
130
131ret_from_int:
132 ldw r3, %gprel(interrupt_count)(gp)
133 bltu zero, r3, res_reg_and_ret /* ネスト回数が1以上なら戻る */
134
135 ldw r2, 0(sp) /* スタックポインタを戻す */
136 mov sp, r2 /* スタックポインタを戻す */
137
138 ldw r3, %gprel(reqflg)(gp) /* reqflgのチェック */
139 beq r3, zero, res_reg_and_ret
140 br ret_int
141
142res_reg_and_ret:
143 ldw et, 0(sp) /* レジスタの復帰 */
144 wrctl estatus, et
145 ldw at, 4(sp)
146 ldw r2, 8(sp)
147 ldw r3, 12(sp)
148 ldw r4, 16(sp)
149 ldw r5, 20(sp)
150 ldw r6, 24(sp)
151 ldw r7, 28(sp)
152 ldw r8, 32(sp)
153 ldw r9, 36(sp)
154 ldw r10, 40(sp)
155 ldw r11, 44(sp)
156 ldw r12, 48(sp)
157 ldw r13, 52(sp)
158 ldw r14, 56(sp)
159 ldw r15, 60(sp)
160 ldw fp, 64(sp)
161 ldw ra, 68(sp)
162 ldw ea, 72(sp)
163 addi sp, sp, 76
164 eret
165
166
167_check_trap:
168 /*
169 * Trapか判定
170 */
171 ldw et, -4(ea) /* 例外を出した命令を取得 */
172 xorhi et, et, 0x003b /* 上位16bit */
173 xori et, et, 0x683a /* 下位16bit */
174 beq et, zero, trap_handler
175
176_check_exc:
177 addi sp, sp, -76
178 rdctl et, estatus
179 stw et, 0(sp)
180 stw at, 4(sp)
181 stw r2, 8(sp)
182 stw r3, 12(sp)
183 stw r4, 16(sp)
184 stw r5, 20(sp)
185 stw r6, 24(sp)
186 stw r7, 28(sp)
187 stw r8, 32(sp)
188 stw r9, 36(sp)
189 stw r10, 40(sp)
190 stw r11, 44(sp)
191 stw r12, 48(sp)
192 stw r13, 52(sp)
193 stw r14, 56(sp)
194 stw r15, 60(sp)
195 stw fp, 64(sp)
196 stw ra, 68(sp)
197 stw ea, 72(sp)
198 mov r4, sp /* ハンドラの引数 */
199
200 /*
201 * 多重割込みか判定
202 */
203 ldw r3, %gprel(interrupt_count)(gp) /* ネスト回数のチェック */
204 bltu zero, r3, nest_int_exc
205
206 movhi r2, %hiadj(STACKTOP-4)
207 addi r2, r2, %lo(STACKTOP-4)
208 stw sp, 0(r2) /* スタックポインタの保存 */
209 mov sp, r2 /* スタックポインタのå…
210¥ã‚Œæ›¿ãˆ */
211nest_int_exc:
212
213 call exc_handler_call /* CPU例外ハンドラ呼び出しルーチンの実行 */
214
215 br ret_from_int /* リターン処理 */
216
217
218trap_handler:
219 /*
220 * Trapハンドラー
221 */
222 eret
223
224
225
226 .set noat
227 .align 2
228 .global ret_int
229 .global ret_exc
230ret_int:
231ret_exc:
232 stw zero, %gprel(reqflg)(gp) /* reqflg を FALSEに */
233 ldw r5, %gprel(runtsk)(gp) /* r5 <- runtsk */
234 ldw r6, %gprel(enadsp)(gp) /* r6 <- enadsp */
235 beq r6, zero, ret_int_1 /* enadsp が FALSE なら ret_int_1 へ */
236 ldw r4, %gprel(schedtsk)(gp) /* r4 <- schedtsk */
237 beq r4, r5, ret_int_1 /* runtsk と schedtskが同じならret_int_1へ */
238 addi sp, sp, -32 /* 残りのレジスタを保存 */
239 stw r16, 0(sp)
240 stw r17, 4(sp)
241 stw r18, 8(sp)
242 stw r19, 12(sp)
243 stw r20, 16(sp)
244 stw r21, 20(sp)
245 stw r22, 24(sp)
246 stw r23, 28(sp)
247 stw sp, TCB_sp(r5) /* タスクスタックをTCBに保存 */
248 movhi r2, %hiadj(ret_int_r) /* 実行開始番地を保存 */
249 addi r2, r2, %lo(ret_int_r)
250 stw r2, TCB_pc(r5) /* 実行再開番地をTCBに保存 */
251 br dispatcher
252
253ret_int_r:
254 ldw r16, 0(sp) /* レジスタを復帰 */
255 ldw r17, 4(sp)
256 ldw r18, 8(sp)
257 ldw r19, 12(sp)
258 ldw r20, 16(sp)
259 ldw r21, 20(sp)
260 ldw r22, 24(sp)
261 ldw r23, 28(sp)
262 addi sp, sp, 32
263ret_int_1:
264 /*
265 * タスク例外ルーチンの起動
266 * ret_int_r は dispatcher から呼び出されるため,
267 * tcbのアドレスは r4 にå…
268¥ã£ã¦ã„ã‚‹
269 */
270 ldw r5, TCB_enatex(r4) /* r5 <- enatex */
271#if TCB_enatex_mask > 0xffff
272 andhi r6, r5, %hi(TCB_enatex_mask)
273#else
274 andi r6, r5, %lo(TCB_enatex_mask)
275#endif /* TCB_enatex_mask > 0xffff */
276 andhi r6, r5, 4
277 beq r6, zero, ret_int_2 /* enatex が FALSE ならリターン */
278 ldw r7, TCB_texptn(r4) /* r7 <- texptn, texptnが0でなければ */
279 beq zero, r7, ret_int_2
280 call call_texrtn /* タスク例外ルーチンの呼び出し */
281
282ret_int_2:
283 ldw et, 0(sp) /* レジスタを復帰 */
284 wrctl estatus, et
285 ldw at, 4(sp)
286 ldw r2, 8(sp)
287 ldw r3, 12(sp)
288 ldw r4, 16(sp)
289 ldw r5, 20(sp)
290 ldw r6, 24(sp)
291 ldw r7, 28(sp)
292 ldw r8, 32(sp)
293 ldw r9, 36(sp)
294 ldw r10, 40(sp)
295 ldw r11, 44(sp)
296 ldw r12, 48(sp)
297 ldw r13, 52(sp)
298 ldw r14, 56(sp)
299 ldw r15, 60(sp)
300 ldw fp, 64(sp)
301 ldw ra, 68(sp)
302 ldw ea, 72(sp)
303 addi sp, sp, 76
304 eret
305
306
307
308
309 .global dispatch
310 .align 2
311dispatch:
312 addi sp, sp, -40 /* レジスタを保存 */
313 stw r16, 0(sp)
314 stw r17, 4(sp)
315 stw r18, 8(sp)
316 stw r19, 12(sp)
317 stw r20, 16(sp)
318 stw r21, 20(sp)
319 stw r22, 24(sp)
320 stw r23, 28(sp)
321 stw fp, 32(sp)
322 stw ra, 36(sp)
323 ldw r4, %gprel(runtsk)(gp) /* r4 <- runtsk */
324 stw sp, TCB_sp(r4) /* タスクスタックをTCBに保存 */
325 movhi r5, %hiadj(dispatch_r) /* 実行開始番地を保存 */
326 addi r5, r5, %lo(dispatch_r)
327 stw r5, TCB_pc(r4) /* 実行再開番地をTCBに保存 */
328 br dispatcher
329
330dispatch_r:
331 ldw r16, 0(sp) /* レジスタを復帰 */
332 ldw r17, 4(sp)
333 ldw r18, 8(sp)
334 ldw r19, 12(sp)
335 ldw r20, 16(sp)
336 ldw r21, 20(sp)
337 ldw r22, 24(sp)
338 ldw r23, 28(sp)
339 ldw fp, 32(sp)
340 /*
341 * タスク例外ルーチンの起動
342 * dispatch_r は dispatcher から呼び出されるため,
343 * tcb のアドレスは r4 にå…
344¥ã£ã¦ã„ã‚‹
345 */
346 ldw r5, TCB_enatex(r4) /* r5 <- enatex */
347#if TCB_enatex_mask > 0xffff
348 andhi r6, r5, %hi(TCB_enatex_mask)
349#else
350 andi r6, r5, %lo(TCB_enatex_mask)
351#endif /* TCB_enatex_mask > 0xffff */
352 beq r6, zero, dispatch_r_1 /* enatex が FALSE ならリターン */
353 ldw r7, TCB_texptn(r4) /* r7 <- texptn, texptnが0でなければ */
354 beq r7, zero, dispatch_r_1
355 call call_texrtn /* タスク例外ルーチンの呼び出し */
356
357dispatch_r_1:
358 ldw ra, 36(sp) /* 残りのレジスタを復帰 */
359 addi sp, sp, 40
360 ret
361
362
363
364 .global exit_and_dispatch
365exit_and_dispatch:
366 stw zero, %gprel(interrupt_count)(gp) /* interrupt_count をクリア */
367dispatcher:
368 /*
369 * ここは割込み禁止で来ること
370 */
371 ldw r4, %gprel(schedtsk)(gp) /* r4 <- schedtsk */
372 stw r4, %gprel(runtsk)(gp) /* schedtsk を runtskに */
373 beq r4, zero, dispatcher_1 /* schedtskがあるか */
374 ldw sp, TCB_sp(r4) /* TCBからタスクスタックを復帰 */
375 ldw r5, TCB_pc(r4) /* TCBから実行再開番地を復帰 */
376 jmp r5
377dispatcher_1:
378 /*
379 * ここで割込みモードに切り替えるのは,ここで発生する割込み処理
380 * にどのスタックを使うかという問題の解決と,割込みハンドラ内
381で
382 * のタスクディスパッチの防止という2つの意味がある.
383 */
384 movhi sp, %hiadj(STACKTOP) /* 割込みスタックに変更 */
385 addi sp, sp, %lo(STACKTOP)
386 movi r5, 1 /* interrupt_count を1に */
387 stw r5, %gprel(interrupt_count)(gp)
388dispatcher_2:
389 wrctl status, r5 /* 割込みの許可 */
390 nop
391 nop
392 nop
393 nop
394 wrctl status, zero /* 割込みの禁止 */
395 ldw r6, %gprel(reqflg)(gp) /* r6 <- reqflg */
396 beq r6, zero, dispatcher_2 /* reqflg が FALSE なら */
397 stw zero, %gprel(interrupt_count)(gp) /* interrupt_count をクリア */
398 stw zero, %gprel(reqflg)(gp) /* reqflg を FALSE に */
399 br dispatcher
400
401
402 .text
403 .global activate_r
404 .align 2
405activate_r:
406 movi r2, 1
407 wrctl status, r2 /* 割込み許可 */
408 ldw r4, 4(sp) /* 引数(exinf) */
409 ldw r2, 0(sp) /* タスクの実行番地 */
410 addi sp, sp, 8
411 movhi ra, %hiadj(ext_tsk)
412 addi ra, ra, %lo(ext_tsk)
413 jmp r2 /* タスクの実行開始 */
414
415
Note: See TracBrowser for help on using the repository browser.