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

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

initial

File size: 21.9 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 * Copyright (C) 2000-2003 by Industrial Technology Institute,
9 * Miyagi Prefectural Government, JAPAN
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
53#define _MACRO_ONLY
54
55#include "jsp_kernel.h"
56#include "offset.h"
57
58 .section .text
59 .align 2
60
61 .set noat
62 /* atレジスタを利用したときにワーニングを出力しないよう指定 */
63 .set noreorder
64
65/*
66 * 例外/割り込み出å…
67¥å£å‡¦ç†ãƒ«ãƒ¼ãƒãƒ³ï¼ˆä¸€èˆ¬ä¾‹å¤–)
68 *
69 * 仕様:
70 * ・CPU例外ハンドラは、非タスクコンテキストで実行する。
71 * ・k0 レジスタを、割込み/例外ネストカウンタとして使用する。
72 * ・reqflg をチェックする前に割込みを禁止しないと、reqflg をチェック後に起動さ
73 * れた割込みハンドラ内
74でディスパッチが要求された場合にディスパッチされない。
75 * ・割込み許可/不許可の処理は、EXLビットを用いて行う。
76 * これは、呼出å…
77ƒã®ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã® CPUロック状æ…
78‹ã‚’保存するためである。
79 * ただし、å…
80±é€šéƒ¨ã«å‡¦ç†ã‚’移行する場合にはIEビットを用いて、割込み許可/不許可
81 * を実現する必
82要があるために、IEビットによる割込み許可/不許可に変更している
83 * 事に注意。
84 * (例:遅
85延ディスパッチの処理にå…
86¥ã‚‹ç›´å‰ã€ã‚¿ã‚¹ã‚¯ä¾‹å¤–処理を呼出す直前)
87 *
88 * C言語ルーチンでlong long型を使う場合はレジスタの待
89避/復å…
90ƒã‚’double wordで行
91 * うべきだが、使用頻度が低いのと、出å…
92¥å£å‡¦ç†ã®ã‚ªãƒ¼ãƒãƒ¼ãƒ˜ãƒƒãƒ‰ã‚’考えて、wordで待
93
94 * 避/復å…
95ƒã‚’行っている。将来的には待
96避するデータサイズをタスク属性で指定できる
97 * ようにする予定
98 */
99
100 .global general_exception
101 .global join_interrupt_and_exception
102 /* 関数呼出(proc_interrupt_sys)時に必
103要 */
104
105general_exception:
106 addi sp, sp, -25*4
107 sw sp, 0*4(sp) /* EXCSTACK構造体用(cpu_experr関数用) */
108 sw at, 1*4(sp)
109 sw v0, 2*4(sp)
110 sw v1, 3*4(sp)
111 sw a0, 4*4(sp)
112 sw a1, 5*4(sp)
113 sw a2, 6*4(sp)
114 sw a3, 7*4(sp)
115 sw t0, 8*4(sp)
116 sw t1, 9*4(sp)
117 sw t2, 10*4(sp)
118 sw t3, 11*4(sp)
119 sw t4, 12*4(sp)
120 sw t5, 13*4(sp)
121 sw t6, 14*4(sp)
122 sw t7, 15*4(sp)
123 sw t8, 16*4(sp)
124 sw t9, 17*4(sp)
125 sw gp, 18*4(sp)
126 sw fp, 19*4(sp)
127 sw ra, 20*4(sp)
128
129 mfc0 a1, Status /* a1 -> 例外処理で使う */
130 mfc0 t1, EPC
131
132 sw a1, 21*4(sp) /* Status */
133 sw t1, 22*4(sp) /* EPC */
134
135 mfhi t2 /* 乗除算レジスタ HI の待
136避 */
137 mflo t3 /* 乗除算レジスタ LO の待
138避 */
139
140 sw t2, 23*4(sp) /* HI */
141 sw t3, 24*4(sp) /* LO */
142
143 move a0, sp /* 例外ハンドラの引数設定 */
144 /* 引数は、例外発生時のデータを退避したスタック領域へのポインタ
145 割込みコントローラのデータを含めると複雑になるため、
146 対象はMIPS3コアのレジスタ部分のみとする。 */
147
148 PUSH_ICU_IPM /* 割込みコントローラの割込みマスクの
149 待
150避マクロ(システム依存部で定義) */
151
152 bgtz k0, multipul_exception /* 初段の例外と多重例外の判別 */
153 addi k0, k0, 1 /* ネストカウンタのインクリメント */
154
155/* 初段の例外の場合 */
156first_exception:
157 la t3, _stack_top /* _stack_top は、システム依存部
158 (リンカスクリプト推奨)定義 */
159 /* スタックポインタの減算(t3=t3-4)は、
160 _stack_top 設定時に行っているので、
161 ここでは不要 */
162 sw sp, (t3) /* タスクスタックポインタの保存 */
163 move sp, t3 /* スタック切り替え */
164
165 jal proc_interrupt_and_exception /* 割込みと例外の判別処理へ */
166 nop
167
168 /* 割込み禁止で戻ってくる */
169 la t2, reqflg
170 lw t3, (t2) /* t3 = reqflg */
171 lw sp, (sp) /* スタック切り替え */
172 beq t3, zero, ret_to_task_int /* ディスパッチ要求がない場合 */
173 nop
174
175 j ret_int /* 割込み/例外の出口処理へ */
176 sw zero, (t2) /* reqflg のクリア */
177
178/* 多重例外(多重割込み)の場合 (例外ハンドラの引数は既に a0 に設定済み) */
179multipul_exception:
180 jal proc_interrupt_and_exception /* 割込みと例外の判別処理へ */
181 nop
182
183/* ディスパッチャを呼ばずに単純に割込みå…
184ƒï¼ˆä¾‹å¤–発生å…
185ƒï¼‰ã«æˆ»ã‚‹å ´åˆ */
186ret_to_task_int:
187 POP_ICU_IPM /* 割込みコントローラの割込みマスクの
188 復帰マクロ(システム依存部で定義) */
189
190 lw t0, 23*4(sp) /* HI */
191 lw t1, 24*4(sp) /* LO */
192
193 mthi t0 /* 乗除算レジスタ HI の復å…
194ƒ */
195 mtlo t1 /* 乗除算レジスタ LO の復å…
196ƒ */
197
198/* 保留:long long型を使用した場合 */
199 lw t0, 21*4(sp) /* Status */
200 lw t1, 22*4(sp) /* EPC */
201
202 lw at, 1*4(sp)
203 lw v0, 2*4(sp)
204 lw v1, 3*4(sp)
205 lw a0, 4*4(sp)
206 lw a1, 5*4(sp)
207 lw a2, 6*4(sp)
208 lw a3, 7*4(sp)
209
210 /*
211 * 多重例外時なので、タスクスイッチがない場合なので、タスクコンテキスト
212 * の割込みマスクが変更されている心é…
213ã¯ãªã„。
214 * (ステータスレジスタはå…
215ƒã®å€¤ã‚’そのまま書き戻す)
216 */
217 mtc0 t0, Status
218 mtc0 t1, EPC
219
220 lw t0, 8*4(sp)
221 lw t1, 9*4(sp)
222 lw t2, 10*4(sp)
223 lw t3, 11*4(sp)
224 lw t4, 12*4(sp)
225 lw t5, 13*4(sp)
226 lw t6, 14*4(sp)
227 lw t7, 15*4(sp)
228 lw t8, 16*4(sp)
229 lw t9, 17*4(sp)
230 lw gp, 18*4(sp)
231 lw fp, 19*4(sp)
232 lw ra, 20*4(sp)
233
234 addi sp, sp, 25*4 /* ERET 命令は、直後の命令を実行しない
235 ので遅
236延スロットにはå…
237¥ã‚Œã‚‰ã‚Œãªã„。*/
238
239 eret /* 例外からの復帰 */
240 nop
241
242/*
243 * 割込みと例外の判別処理関数
244 * 以下のレジスタに値が代å…
245¥æ¸ˆã¿
246 * a0 : 例外ハンドラの引数, a1 : ステータスレジスタ
247 */
248proc_interrupt_and_exception:
249 addi sp, sp, -4
250 sw ra, 0(sp)
251
252 mfc0 a2, Cause
253 andi t2, a2, ExcCode_mask
254 beq t2, zero, proc_interrupt /* 割込みと例外の判別 */
255 /* ここから直接proc_interrupt_sysへ飛びたいが、届かない
256 可能性があるので、一度proc_interruptに飛ぶ。 */
257 nop
258
259/* 割込み以外の例外の処理 */
260 la t4, exc_table
261 /* a1 = Status */
262 ori t5, a1, SR_EXL
263 xori t5, t5, SR_EXL /* EXLビットクリア */
264 /* 割込み以外の例外はCPUロック状æ…
265‹ã§ã‚‚受け付けるので、CPUロック
266 状æ…
267‹ã‚’保存する必
268要がある。そのためIEビットは操作せずに、割り
269 込み禁止・許可はEXLビットを用いて実現する */
270 add t6, t4, t2 /* 例外コード対応アドレスの設定 */
271 lw t7, (t6) /* C言語ルーチンの呼出アドレス取得 */
272 jalr t7 /* C言語ルーチン呼び出し */
273 mtc0 t5, Status /* 割込み許可 (EXLビット = 0) */
274
275 mfc0 t0, Status
276 ori t0, t0, SR_EXL
277 mtc0 t0, Status /* 割込み禁止 (EXLビット = 1) */
278
279 NOP_FOR_CP0_HAZARD /* CP0ハザードのための時間稼ぎマクロ
280 (このマクロはシステム依存部定義) */
281
282 j join_interrupt_and_exception /* 例外・割込みの合流地点へ */
283 nop
284
285/* 割込みの場合の処理 */
286proc_interrupt:
287
288/*
289 * 割込みコントローラの多様性に対応するため、実装
290はシステム依存部で行う。
291 * 実装
292方法は、
293 * マクロ(PROC_INTERRUPT_SYS)または、関数呼出(proc_interrupt_sys)
294 * とする。
295 *
296 * ・呼出時にセットされている引数
297 * a1 : ステータスレジスタ
298 * a2 : 原因レジスタ
299 *
300 * ・実装
301時には、raレジスタを破壊してはならない。
302 *
303 * ・実装
304するå…
305·ä½“的な処理の流れ:
306 * 1. 割込み要因の判別
307 * 2. 割込みマスク(コア、割込みコントローラ)の設定
308 * 3. 割込み許可
309 * 4. C言語ルーチンの呼出
310 * 5. 割込み禁止
311 * 6. 割込みコントローラの割込み要求のクリア
312 * (7. join_interrupt_and_exceptionに戻る。; 関数呼出の場合)
313 */
314
315#ifdef PROC_INTERRUPT_SYS
316 PROC_INTERRUPT_SYS
317#else /* PROC_INTERRUPT_SYS */
318 j proc_interrupt_sys
319 nop
320#endif /* PROC_INTERRUPT_SYS */
321
322/* 例外・割込み処理の合流地点 */
323join_interrupt_and_exception:
324 addi k0, k0, -1 /* ネストカウンタ ディクリメント */
325 lw ra, (sp) /* ra を復å…
326ƒ */
327 jr ra /* proc_interrupt_and_exeption の呼出å…
328ƒ
329 に戻る */
330 addi sp, sp, 4
331
332/*
333 * 割り込みハンドラ/CPU例外ハンドラ出口処理
334 *
335 * 戻りå…
336ˆãŒã‚¿ã‚¹ã‚¯ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã§reqflgがセットされている場合のみ、ここにくる。
337 * ・k0 = 0、割込み禁止状æ…
338‹ã€æ±Žç”¨ãƒ¬ã‚¸ã‚¹ã‚¿ã‚’保存した状æ…
339‹ã§å‘¼ã³å‡ºã™ã“と。
340 * ・t1にruntskの値をå…
341¥ã‚Œã¦ã‹ã‚‰ret_int_1にジャンプすること。
342 */
343
344ret_int:
345 POP_ICU_IPM /* 割込みコントローラの割込みマスクの
346 復帰マクロ(システム依存部で定義) */
347
348 lw t1, 21*4(sp) /* Status */
349 ori t1, t1, SR_EXL /* 割込み処理にå…
350¥ã‚‹ã¨ãã®ã€CPUロック
351 状æ…
352‹ã‚’保持したいので、割込み禁止は
353 EXLビットを用いて行う。 */
354 mtc0 t1, Status /* MIPS3コアの割込みマスクの復帰
355 + EXLビットによる割込み禁止 */
356
357 la t0, enadsp
358 la t3, runtsk
359 lw t2, (t0) /* t2 = enadsp */
360 lw t1, (t3) /* t1 = runtsk */
361 beq t2, zero, ret_int_1 /* ディスパッチ禁止ならジャンプ */
362 nop
363 la t4, schedtsk
364 lw t5, (t4) /* t5 = schedtsk */
365 beq t1, t5, ret_int_1 /* runtsk = schedtsk ならジャンプ */
366 nop
367
368/* ディスパッチャを経由する場合の処理 (t1 = runtsk に注意) */
369 /* ここから、割込み禁止/許可を、EXLビットを用いて実現する方法に変更 */
370 mfc0 t0, Status
371 ori t0, t0, SR_EXL_IE
372 xori t0, t0, SR_EXL_IE /* lock_cpu 相当 (割込み禁止)
373 + EXLビットクリア (割込み許可) */
374 mtc0 t0, Status
375
376 addi sp, sp, -8*4 /* スクラッチレジスタの保存 */
377 sw s0, 0*4(sp)
378 sw s1, 1*4(sp)
379 sw s2, 2*4(sp)
380 sw s3, 3*4(sp)
381 sw s4, 4*4(sp)
382 sw s5, 5*4(sp)
383 sw s6, 6*4(sp)
384 sw s7, 7*4(sp)
385 /* t1 = runtsk に注意 */
386 sw sp, TCB_sp(t1) /* runtsk->sp = sp
387 (タスクスタックポインタの保存) */
388 la t2, ret_int_r
389
390 j dispatcher /* ディスパッチャ呼び出し */
391 sw t2, TCB_pc(t1) /* runtsk->pc = ret_int_r
392 (実行再開番地の保存) */
393
394/*
395 * 割込み・例外の出口処理
396 * ・ディスパッチャ処理において、t1 = runtsk となっていることに注意
397 * ・スタックポインタも設定済み
398 */
399/* ディスパッチャ呼び出し後のタスクコンテキストからの合流地点 */
400ret_int_r:
401 lw s0, 0*4(sp) /* スクラッチレジスタの復å…
402ƒ */
403 lw s1, 1*4(sp)
404 lw s2, 2*4(sp)
405 lw s3, 3*4(sp)
406 lw s4, 4*4(sp)
407 lw s5, 5*4(sp)
408 lw s6, 6*4(sp)
409 lw s7, 7*4(sp)
410 addi sp, sp, 8*4
411
412 mfc0 t0, Status
413 ori t0, t0, SR_EXL_IE /* unlock_cpu 相当 (割込み許可)
414 + EXLビットセット (割込み禁止) */
415 mtc0 t0, Status
416
417/* ディスパッチャを経由しない場合の合流地点 (t1 = runtsk に注意) */
418ret_int_1:
419
420 /* タスク例外処理要求のチェック */
421 lb t2, TCB_enatex(t1)
422 andi t4, t2, TCB_enatex_mask /* t3 = runtsk->enatex */
423 beq t4, zero, ret_int_2 /* タスク例外処理禁止の時、ジャンプ */
424 nop
425
426 lw t5, TCB_texptn(t1) /* t5 = runtsk->texptn */
427 beq t5, zero, ret_int_2 /* タスク例外要求が無い時、ジャンプ */
428 nop
429
430 mfc0 t0, Status
431 ori t0, t0, SR_EXL_IE
432 xori t0, t0, SR_EXL_IE /* lock_cpu相当 (割込み禁止)
433 + EXLビットクリア (割込み許可) */
434 mtc0 t0, Status
435
436 jal call_texrtn /* タスク例外処理ルーチン(ターゲット非
437 依存部定義)の呼び出し */
438 nop
439 /* call_texrtn()(task.c)では、実際のタスク例外処理ルーチン呼び
440 出し前後で、unlock_cpu、lock_cpu処理を行っているので、状æ…
441‹ã¯
442 保持される。 */
443
444 mfc0 t0, Status
445 ori t0, t0, SR_EXL_IE /* unlock_cpu 相当 (割込み許可)
446 + EXLビットセット (割込み禁止) */
447 mtc0 t0, Status
448 /* ここまでが、割込み禁止/許可を、EXLビットを用いて実現する方法 */
449
450ret_int_2:
451 /* レジスタの復帰 (Statusレジスタは、既に復å…
452ƒæ¸ˆã¿) */
453 lw t1, 22*4(sp) /* EPC */
454 mtc0 t1, EPC
455
456 lw t2, 23*4(sp) /* HI */
457 lw t3, 24*4(sp) /* LO */
458
459 mthi t2 /* 乗除算レジスタ HI の復å…
460ƒ */
461 mtlo t3 /* 乗除算レジスタ LO の復å…
462ƒ */
463
464 lw at, 1*4(sp)
465 lw v0, 2*4(sp)
466 lw v1, 3*4(sp)
467 lw a0, 4*4(sp)
468 lw a1, 5*4(sp)
469 lw a2, 6*4(sp)
470 lw a3, 7*4(sp)
471 lw t0, 8*4(sp)
472 lw t1, 9*4(sp)
473 lw t2, 10*4(sp)
474 lw t3, 11*4(sp)
475 lw t4, 12*4(sp)
476 lw t5, 13*4(sp)
477 lw t6, 14*4(sp)
478 lw t7, 15*4(sp)
479 lw t8, 16*4(sp)
480 lw t9, 17*4(sp)
481
482 lw gp, 18*4(sp)
483 lw fp, 19*4(sp)
484 lw ra, 20*4(sp)
485
486 addi sp, sp, 25*4
487
488 eret /* 割込み/例外処理からの復帰 */
489 nop
490
491/*
492 * タスクディスパッチャ
493 * ・dispatch は、k0 = 0、CPUロック(割込み禁止)状æ…
494‹ã§å‘¼ã³å‡ºã•ãªã‘ればならない。
495 * ・exit_and_dispatch は,k0 = 0、CPUロック(割込み禁止)状æ…
496‹ã§å‘¼ã³å‡ºã™ã®ãŒåŽŸå‰‡
497 * しかし、カーネル起動処理のため,k0 = 1で呼び出した場合にも対応している。
498 */
499
500 .global dispatch
501 .global exit_and_dispatch
502
503/* タスクディスパッチャを明示的に呼び出す時 */
504dispatch:
505 addi sp, sp, -13*4
506 sw at, 1*4(sp) /* スクラッチレジスタの待
507避 */
508 sw s0, 2*4(sp)
509 sw s1, 3*4(sp)
510 sw s2, 4*4(sp)
511 sw s3, 5*4(sp)
512 sw s4, 6*4(sp)
513 sw s5, 7*4(sp)
514 sw s6, 8*4(sp)
515 sw s7, 9*4(sp)
516 sw gp, 10*4(sp)
517 sw fp, 11*4(sp)
518 sw ra, 12*4(sp)
519
520 la t0, runtsk
521 la t2, dispatch_r
522 lw t1, (t0) /* t1 = runtsk */
523 sw sp, TCB_sp(t1) /* runtsk->sp = sp */
524 j dispatcher
525 sw t2, TCB_pc(t1) /* runtsk->pc = dispatch_r */
526
527/* 現在実行中のコンテキストを捨てて、タスクディスパッチャを呼び出す時 */
528exit_and_dispatch:
529 move k0, zero /* ネストカウンタをクリア */
530
531dispatcher:
532 /* ここには CPUロック(割り込み禁止)で来ること */
533 la t0, schedtsk
534 lw t1, (t0) /* t1 = schedtsk */
535 beq t1, zero, dispatcher_2 /* schedtsk が無ければ割込み待
536ちへ */
537 nop
538
539dispatcher_1:
540 la t0, runtsk
541 sw t1, (t0) /* runtsk = t1 (= schedtsk)
542 (タスクスイッチの実行) */
543 lw t2, TCB_pc(t1) /* 実行再開番地を取得する。
544 実行再開番地は以下の3通り
545 ・ディスパッチャの出口 dispatch_r
546 ・割込み/例外の出口 ret_int_r
547 ・タスク起動直後 activate_r
548 いずれの場合も t1=runtsk として呼び
549 出していることに注意。 */
550 jr t2 /* 実行再開番地へジャンプ */
551 lw sp, TCB_sp(t1) /* スタックポインタを復å…
552ƒ */
553
554 /*
555 * 実行すべきタスクが現れるまで待
556つ処理
557 *
558 * ここでコンテキストを切り換えるのは,
559 * ・ここで発生する割込み処理にどのスタックを使うかという問題の解決
560 * ・割込みハンドラ内
561でのタスクディスパッチの防止
562 * という二つの意味がある.
563 */
564dispatcher_2:
565 la t2, runtsk
566 sw zero, (t2) /* runtsk = NULL
567 これは、iget_id が、TSK_NONEを返す
568 場合に対応するため。*/
569
570 la sp, _stack_top /* スタック切り替え */
571 /* _stack_top は、システム依存部
572 (リンカスクリプト推奨)定義 */
573 li k0, 1 /* ネストカウンタ=1 */
574
575 /* ループ内
576で使う定数の準備 */
577 la t2, reqflg /* reqflg のアドレス */
578 li t3, ~SR_ERL_EXL /* Status の割込み関連ビット */
579 li t4, ~SR_IE /* Status の割込み許可ビット */
580
581dispatcher_3:
582 mfc0 t1, Status
583 and t1, t1, t3 /* ERL, EXL ビットクリア */
584 ori t1, t1, SR_IE /* IEビットセット */
585 mtc0 t1, Status /* 割込み許可 : unlock_cpu 相当 */
586 and t1, t1, t4 /* IEビットリセット */
587 mtc0 t1, Status /* 割込み禁止 : lock_cpu 相当 */
588
589 NOP_FOR_CP0_HAZARD /* CP0ハザードのための時間稼ぎマクロ
590 (このマクロはシステム依存部定義) */
591
592 lw t5, (t2) /* t5 = reqflg */
593
594 beq t5, zero, dispatcher_3 /* ディスパッチ要求がなければループの
595 å…
596ˆé ­ã¸ */
597 nop
598 sw zero, (t2) /* reqflg = NULL (reqflgをクリア) */
599 j dispatcher /* 実行再開番地の取得処理へジャンプ */
600 move k0, zero /* ネストカウンタをクリア */
601
602/*
603 * ディスパッチャ出口処理
604 * ・ディスパッチャ処理において、t1 = runtsk となっていることに注意
605 * ・スタックポインタも設定済み
606 */
607dispatch_r:
608 lw at, 1*4(sp) /* スクラッチレジスタを復帰 */
609 lw s0, 2*4(sp)
610 lw s1, 3*4(sp)
611 lw s2, 4*4(sp)
612 lw s3, 5*4(sp)
613 lw s4, 6*4(sp)
614 lw s5, 7*4(sp)
615 lw s6, 8*4(sp)
616 lw s7, 9*4(sp)
617 lw gp, 10*4(sp)
618 lw fp, 11*4(sp)
619 lw ra, 12*4(sp)
620 addi sp, sp, 13*4
621
622 /* タスク例外処理要求のチェック */
623 lb t2, TCB_enatex(t1)
624 andi t4, t2, TCB_enatex_mask /* t4 = runtsk->enatex */
625 beq t4, zero, dispatch_r_1 /* タスク例外処理禁止の時、ジャンプ */
626 nop
627
628 lw t5, TCB_texptn(t1) /* t5 = runtsk->texptn */
629 beq t5, zero, dispatch_r_1 /* タスク例外要求が無い時、ジャンプ */
630 nop
631
632 j call_texrtn /* タスク例外処理ルーチン(ターゲット非
633 依存部定義)の呼び出し */
634 nop
635 /* call_texrtn()(task.c)では、実際のタスク例外処理ルーチン呼び
636 出し前後で、unlock_cpu、lock_cpu処理を行っているので、状æ…
637‹ã¯
638 保持される。 */
639
640dispatch_r_1:
641 jr ra /* dispatch 呼び出しå…
642ƒã¸æˆ»ã‚‹ */
643 nop
644
645/*
646 * タスク起動処理
647 * ・ディスパッチャ処理において、t1 = runtsk となっていることに注意
648 * ・スタックポインタも設定済み
649 */
650
651 .globl activate_r
652
653activate_r:
654 /* ここに来るときは、CPUロックになっている(IEビット = 0) */
655
656 /* 割り込み許可の準備 */
657 mfc0 t0, Status
658 ori t0, t0, SR_ERL_EXL_IE /* xorを使うため、1度ビットセットする */
659 xori t0, t0, SR_ERL_EXL /* ERL, EXLビットをクリア
660 (IEビットは残す) */
661
662 /* タスク関係の設定準備 */
663 /* t1 = runtsk (ディスパッチャで設定) */
664 lw t2, TCB_tinib(t1) /* t2 = runtsk->tinib */
665
666 /* タスク起動番地の設定 */
667 lw t3, TINIB_task(t2) /* t3 = runtsk->tinib->task */
668
669 /* タスクへの引数(拡張情
670報)設定 */
671 lw a0, TINIB_exinf(t2) /* a0 = runtsk->tinib->exinf */
672
673 mtc0 t0, Status /* unlock_cpu 相当 (割込み許可) */
674
675 la ra, ext_tsk /* タスクからの戻り番地を設定 */
676
677 j t3 /* タスク起動 */
678 nop
Note: See TracBrowser for help on using the repository browser.