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

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

initial

File size: 15.1 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-2004 by Embedded and Real-Time Systems Laboratory
7 * Toyohashi Univ. of Technology, JAPAN
8 * Copyright (C) 2001-2010 by Industrial Technology Institute,
9 * Miyagi Prefectural Government, JAPAN
10 * Copyright (C) 2001-2004 by Dep. of Computer Science and Engineering
11 * Tomakomai National College of Technology, JAPAN
12 *
13 * 上記著作権者
14は,以下の (1)〜(4) の条件か,Free Software Foundation
15 * によってå…
16¬è¡¨ã•ã‚Œã¦ã„ã‚‹ GNU General Public License の Version 2 に記
17 * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア
18 * を改変したものを含む.以下同じ)を使用・複製・改変・再é…
19å¸ƒï¼ˆä»¥ä¸‹ï¼Œ
20 * 利用と呼ぶ)することを無償で許諾する.
21 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
22 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
23 * スコード中に含まれていること.
24 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
25 * 用できる形で再é…
26å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
27å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
28 * 者
29マニュアルなど)に,上記の著作権表示,この利用条件および下記
30 * の無保証規定を掲載すること.
31 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
32 * 用できない形で再é…
33å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
34 * と.
35 * (a) 再é…
36å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
37マニュアルなど)に,上記の著
38 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
39 * (b) 再é…
40å¸ƒã®å½¢æ…
41‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
42 * 報告すること.
43 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
44 * 害からも,上記著作権者
45およびTOPPERSプロジェクトをå…
46è²¬ã™ã‚‹ã“と.
47 *
48 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者
49お
50 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も
51 * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直
52 * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない.
53 *
54 * @(#) $Id: cpu_support.S,v 1.17 2007/03/23 07:22:15 honda Exp $
55 */
56
57/*
58 * プロセッサ依存モジュール アセンブリ言語部(H8用)
59 */
60
61#define _MACRO_ONLY
62#include "jsp_kernel.h"
63#include "offset.h"
64
65/*
66 * NMIを除くすべての割込みを禁止
67 */
68#define DISINT orc.b #H8INT_DIS_ALL, ccr
69
70/*
71 * すべての割込みを許可
72 */
73#define ENAINT andc.b #H8INT_ENA_ALL, ccr
74
75
76 .h8300h
77
78 .text
79 .align 2
80
81/*
82 * タスクディスパッチャ
83 *
84 *  _dispatch は、割込み外ネストカウンタ = 0,割込み禁止状æ…
85‹
86 * で呼び出さなければならない.exit_and_dispatch も,割込みネスト
87 * カウンタ = 0・割込み禁止状æ…
88‹ã§å‘¼ã³å‡ºã™ã®ãŒåŽŸå‰‡ã§ã‚るが,カーネル
89 * 起動時に対応するため,割込みネストカウンタ = 1で呼び出した場合に
90 * も対応している.
91 */
92
93 .global _dispatch
94_dispatch:
95 push.l er4 /* er4〜6を保存 */
96 push.l er5
97 push.l er6
98 mov.l @_runtsk, er0 /* er0 <- runtsk */
99 mov.l sp, @(TCB_sp, er0) /* タスクスタックポインタを保存 */
100 mov.l #dispatch_r, er1 /* 実行再開番地 */
101 mov.l er1, @(TCB_pc, er0)
102 bra dispatcher
103
104dispatch_r:
105 pop.l er6 /* er4〜6を復å…
106ƒ */
107 pop.l er5
108 pop.l er4
109 mov.l @_runtsk, er0
110 mov.b @(TCB_enatex, er0), r1l /* runtsk->enatex のチェック */
111 btst #TCB_enatex_bit, r1l
112 beq dispatch_r_1
113 mov.l @(TCB_texptn, er0), er1 /* runtsk->texptn のチェック */
114 beq dispatch_r_1
115 jmp @_call_texrtn
116
117dispatch_r_1:
118 rts /* dispatch()の呼び出しå…
119ƒã¸ãƒªã‚¿ãƒ¼ãƒ³ */
120
121 .global _exit_and_dispatch
122_exit_and_dispatch:
123 /* 割り込み禁止で呼ばれる */
124 mov.b #0, r0l /* 割込みネストカウンタをクリア */
125 mov.b r0l, @_intnest
126
127/*
128 * ディスパッテャ本体
129 */
130dispatcher:
131 /*
132 * ここには割り込み禁止で来ること
133 */
134
135 /*
136 * ここでruntskにschedtskを代å…
137¥ã™ã‚‹ã®ã¯ï¼’つの意味がある。
138 *  (1) schedtsk != NULLの場合
139 *     通常のタスク切り替えを行う。
140 *  (2) schedtsk == NULLの場合
141 *     runtskにNULLを代å…
142¥ã—ておく。
143 *     (dispatcher_1以降の割込み待
144ちで割込みがå…
145¥ã‚Šã€ãã®ä¸­ã§
146 *      iget_tid()がコールされたときに正しくTSK_NONEを返すため
147 *      には、実行状æ…
148‹ã®ã‚¿ã‚¹ã‚¯ãŒãªã„時に、runtskをNULLにして
149 *      おく必
150要がある。)
151 */
152 mov.l @_schedtsk, er0 /* er0 <- schedtsk */
153 mov.l er0, @_runtsk /* schedtskをruntskに */
154 /* 実行すべきタスクがなければ、割込み待
155ちへ分岐 */
156 beq dispatcher_1
157 mov.l @(TCB_sp, er0), sp
158 mov.l @(TCB_pc, er0), er0 /* 実行再開番地を復帰 */
159 jmp @er0
160
161
162 /*
163 * 実行すべきタスクがない場合の割込み待
164ち
165 *
166 * ここで割込みモードに切り換えるのは,ここで発生する割込み処理
167 * にどのスタックを使うかという問題の解決と,割込みハンドラ内
168で
169 * のタスクディスパッチの防止という二つの意味がある.
170 */
171dispatcher_1:
172 /* スタックを割り込みスタックに切替え */
173 mov.l #STACKTOP, sp
174 /* 割込みネストカウンタを1にする */
175 mov.b #1, r0l
176 mov.b r0l, @_intnest
177
178 /*
179 * r1l:割込み許可時にccrに設定する値
180 *   割込みハンドラ内
181ではchg_ipmが使用できないので、
182 *   task_intmaskは1回読み込んでおけば、OK
183 */
184#ifdef SUPPORT_CHG_IPM
185 mov.b @_task_intmask, r1l
186#else /* SUPPORT_CHG_IPM */
187 mov.b #H8INT_ENA_ALL, r1l
188#endif /* SUPPORT_CHG_IPM */
189
190 /* CPUロックフラグをクリア */
191 sub.l er0, er0
192 mov.l er0, @_iscpulocked
193
194
195dispatcher_2_enable_interrupt:
196 /*
197 * ldc命令直後は割込み禁止であり、割込み要求があっても
198 * 次の命令が実行される。
199 * (割込みから戻ってきてsleepするケースはない)
200 */
201 ldc.b r1l, ccr /* 割り込み許可 */
202#ifndef NO_SLEEP
203 sleep /* 割込み待
204ち */
205#else /* NO_SLEEP */
206 nop
207#endif /* NO_SLEEP */
208 DISINT /* 割り込み禁止 */
209
210 mov.l @_reqflg, er0 /* reqflgのチェック */
211 /* reqflgはBOOL型 -> int型(32bits) */
212 /* reqflg==NULLならば、もう1度割込み待
213ち */
214 beq dispatcher_2_enable_interrupt
215 sub.l er0, er0
216 mov.l er0, @_reqflg /* reqflgのクリア */
217 /* 割込みネストカウンタをクリア */
218 mov.b r0l, @_intnest
219 bra dispatcher
220
221/*
222 *
223 * 割込みハンドラå…
224¥å£å‡¦ç†
225 *  割込み要因に依らず、å…
226±é€šãªéƒ¨åˆ†
227 *  (cpu_config.hのINTHDR_ENTRYからの続き)
228 *
229 *    以下の状æ…
230‹ã§ã“こにやってくる
231 *     ・割込み禁止
232 *     ・er0〜er3退避済み
233 *     ・er2:C言語ルーチンのå…
234ˆé ­ã‚¢ãƒ‰ãƒ¬ã‚¹
235 *     ・r3l:割込み許可時に割込みマスクに設定する値
236 */
237 .global _common_interrupt_process
238_common_interrupt_process:
239 push.l er4 /* 最適化対策でer4も退避 */
240 mov.b @_intnest, r0l /* 割込みネストカウンタのチェック */
241 bne _interrupt_from_int /* intnetが0でなければ、*/
242 /* 多重割込みの処理へ */
243
244 /*
245 * 初段の割込みの場合
246 */
247 mov.b #1, r1l /* 割込みネストカウンタ←1 */
248 mov.b r1l, @_intnest
249 mov.l sp, er0
250 mov.l #STACKTOP, sp /* スタック切替 */
251 push.l er0 /* タスクスタックポインタの退避 */
252 ldc.b r3l, ccr /* 割込み許可 */
253 jsr @er2 /* C言語ルーチン呼び出し */
254 DISINT /* 割込み禁止 */
255 mov.b #0, r0l /* 割込みネストカウンタのクリア */
256 mov.b r0l, @_intnest
257 mov.l @sp, sp /* スタック切替 */
258 mov.l @_reqflg, er0 /* reqflgのチェック */
259 beq _ret_to_task_int /* reqflgがFALSEなら */
260 /* ret_to_task_intに飛ぶ */
261 sub.l er0, er0
262 mov.l er0, @_reqflg /* reqflgをクリア */
263 bra ret_int /* 出口処理へジャンプ */
264
265 /*
266 * 多重割込みの場合
267 *  割込み禁止でここにやってくる
268 *
269 *  割込みネストカウンタのインクリメントは以下の理由で
270 *  省略している
271 *   ・割込みが2レベルしかない
272 *   ・CPU例外をサポートしない
273 *     exc_sense_context()のことを考æ…
274®ã—なくても良い
275 */
276_interrupt_from_int:
277 /* 割込みネストカウンタのインクリメントは省略 */
278 ldc.b r3l, ccr /* 割込み許可 */
279 jsr @er2 /* C言語ルーチン呼び出し */
280 DISINT /* 割込み禁止 */
281 /* 割込みネストカウンタのディクリメントは省略 */
282
283 /*
284 * 本来はここで戻りå…
285ˆãŒã€å‰²è¾¼ã¿å¾…
286ちのsleep命令かどうかのチェッ
287 * クが必
288要である。(もし、割込みハンドラ内
289でreqflg=TRUEにして
290 * もディスパッチャが呼ばれない=タスクが実行されない)
291 * H8の場合、sleep命令の直前にある割込み許可のldc命令の実行直
292 * 後は割込み禁止であり、割込み要求があったとしても割込みは受
293 * け付けないで、sleep命令が実行される。そのため、割込みから
294 * 戻った直後にsleep命令が実行されるケースは考æ…
295®ã—なくて良い。
296 */
297
298 /*
299 * ディスパッチャを呼ばずに、割込みå…
300ƒã«æˆ»ã‚‹å ´åˆ
301 */
302_ret_to_task_int:
303 /* レジスタを復å…
304ƒ */
305 pop.l er4 /* er4は最適化対策 */
306 pop.l er3
307 pop.l er2
308 pop.l er1
309 pop.l er0
310 rte /* 割込みå…
311ƒã¸ãƒªã‚¿ãƒ¼ãƒ³ */
312
313/*
314 * 出口処理においてスタックポインタが指している番地からCCRレジスタが
315 * 積まれている番地までのオフセットの定義
316 *
317 *  +0:er4
318 *  +4:er3
319 *  +8:er2
320 * +12:er1
321 * +16:er0
322 * +20:ccr ←ここをsp相対アクセスする
323 */
324#define OFFSET_CCR 20
325
326/*
327 * 割込みハンドラ出口処理
328 *
329 * 戻りå…
330ˆãŒã‚¿ã‚¹ã‚¯ã§reqflgがセットされている場合のみここにくる。
331 * 割込みネストカウンタ = 0,割込み禁止状æ…
332‹,スクラッチレジスタを
333 * 保存した状æ…
334‹ã§å‘¼ã³å‡ºã™ã“と。
335 *
336 */
337
338ret_int:
339 mov.l @_enadsp, er0 /* enadspのチェック */
340 beq ret_int_1 /* ディスパッチ禁止ならret_int_1へ */
341
342 mov.l @_runtsk, er0 /* er0 <- runtsk */
343 mov.l @_schedtsk, er1 /* er1 <- schedtsk */
344 cmp.l er0, er1 /* runtsk と schedtsk を比較 */
345 beq ret_int_1 /* 同じならret_int_1へ */
346
347 push.l er5 /* レジスタ退避 */
348 push.l er6
349
350 mov.l sp, @(TCB_sp, er0) /* タスクスタックポインタを保存 */
351 mov.l #ret_int_r, er1 /* 実行再開番地 */
352 mov.l er1, @(TCB_pc, er0)
353 bra dispatcher:16
354 /* 8ビットPC相対分岐では届かないため、16ビット指定 */
355
356/*
357 * 割込みの出口でディスパッチャからここに戻ってくる
358 */
359ret_int_r:
360 pop.l er6 /* レジスタ復å…
361ƒ */
362 pop.l er5
363
364 /*
365 * タスクスイッチしない場合はここから合流する
366 */
367ret_int_1:
368 /* タスク例外許可状æ…
369‹ã®ãƒã‚§ãƒƒã‚¯ */
370 mov.l @_runtsk, er0
371 mov.b @(TCB_enatex, er0), r1l
372 btst #TCB_enatex_bit, r1l /* TCB.enatex=0 -> CCR.Z=1 */
373 beq ret_int_2 /* タスク例外禁止状æ…
374‹ãªã‚‰ã‚¸ãƒ£ãƒ³ãƒ— */
375
376 /* タスク例外処理要求のチェック */
377 mov.l @(TCB_texptn, er0), er1
378 beq ret_int_2 /* タスク例外処理要求がなければジャンプ */
379 jsr @_call_texrtn /* タスク例外処理ルーチン起動 */
380
381ret_int_2:
382 /* CPUロックフラグをクリア */
383 sub.l er0, er0
384 mov.l er0, @_iscpulocked
385
386#ifdef SUPPORT_CHG_IPM
387 /*
388 * スタックに積んであるccr(戻りå…
389ˆã®å‰²è¾¼ã¿ãƒžã‚¹ã‚¯ï¼‰ã‚’
390 * task_intmaskにする。(下記参ç…
391§ï¼‰
392 */
393 mov.b @(OFFSET_CCR, sp), r0l
394 mov.b @_task_intmask, r1l
395 and.b #H8INT_ENA_ALL, r0l
396 or.b r1l, r0l
397 mov.b r0l, @(OFFSET_CCR, sp)
398#endif /* SUPPORT_CHG_IPM */
399 /* レジスタを復å…
400ƒ */
401 pop.l er4 /*   +0:er4 */
402 pop.l er3 /*   +4:er3 */
403 pop.l er2 /*   +8:er2 */
404 pop.l er1 /*  +12:er1 */
405 pop.l er0 /*  +16:er0 */
406 /* +20:ccr ←ここを書き換える */
407 rte
408
409
410/*
411 * タスク起動処理
412 */
413
414 .globl _activate_r
415_activate_r:
416 /* CPUロックフラグをクリア */
417 sub.l er0, er0
418 mov.l er0, @_iscpulocked
419
420 /* 割込み許可 */
421#ifdef SUPPORT_CHG_IPM
422 mov.b @_task_intmask, r0l
423 ldc.b r0l, ccr
424#else /* SUPPORT_CHG_IPM */
425 ENAINT
426#endif /* SUPPORT_CHG_IPM */
427
428 mov.l #_ext_tsk, er2
429 push.l er2
430 mov.l @_runtsk, er2
431 mov.l @(TCB_tinib, er2), er2
432 mov.l @(TINIB_task, er2), er1 /* タスク起動番地 */
433 /* 拡張情
434報(タスクへの引数) */
435 mov.l @(TINIB_exinf, er2), er0
436 jmp @er1
437
438
439/*
440 * 微少時間待
441ち
442 *  プロトタイプ宣言はsil.h内
443にある
444 *   void sil_dly_nse(UINT dlytim);
445 */
446 .globl _sil_dly_nse
447_sil_dly_nse:
448 /* er0 = dlytim */
449 sub.l #SIL_DLY_TIM1, er0
450 ble sil_dly_nse_2
451 /* dlytim < SIL_DLY_TIM1 ならループ終了 */
452sil_dly_nse_1:
453 sub.l #SIL_DLY_TIM2, er0
454 bgt sil_dly_nse_1
455 /* dlytim > SIL_DLY_TIM2 ならループ続行 */
456sil_dly_nse_2:
457 rts
458
459
460/**************************************************************
461 * 以下、å…
462±é€šéƒ¨ã¨ã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ã«ã¯å«ã¾ã‚Œãªã„独自の部分
463 **************************************************************/
464
465/*
466 * no_reg_exception()
467 * CPU例外として登録されていない例外が発生すると呼び出される。
468 * 例外が発生した時点のPC,ER0〜7を出力してカーネル
469 * を停止する。
470 *
471 *  スタック構造
472 *   +0:er0
473 *   +4:er1
474 *   +8:er2
475 *  +12:er3
476 *  +16:er4
477 *  +20:er5
478 *  +24:er6
479 *  +28:crr
480 *  +29:pc
481 *  +32〜:割込み前に使用されていたスタック領域
482 */
483 .globl _no_reg_exception
484_no_reg_exception:
485
486 push.l er6 /* ER0〜6を保存 */
487 push.l er5
488 push.l er4
489 push.l er3
490 push.l er2
491 push.l er1
492 push.l er0
493
494 mov.l sp, er0 /* 引数設定 */
495 /* SP は +32 で、発生時点の値 */
496 jsr @_cpu_experr /* cpu_experr()の呼び出し */
497
Note: See TracBrowser for help on using the repository browser.