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

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

initial

File size: 9.2 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 *
9 * 上記著作権者
10は,以下の (1)〜(4) の条件か,Free Software Foundation
11 * によってå…
12¬è¡¨ã•ã‚Œã¦ã„ã‚‹ GNU General Public License の Version 2 に記
13 * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア
14 * を改変したものを含む.以下同じ)を使用・複製・改変・再é…
15å¸ƒï¼ˆä»¥ä¸‹ï¼Œ
16 * 利用と呼ぶ)することを無償で許諾する.
17 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
18 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
19 * スコード中に含まれていること.
20 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
21 * 用できる形で再é…
22å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
23å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
24 * 者
25マニュアルなど)に,上記の著作権表示,この利用条件および下記
26 * の無保証規定を掲載すること.
27 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
28 * 用できない形で再é…
29å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
30 * と.
31 * (a) 再é…
32å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
33マニュアルなど)に,上記の著
34 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
35 * (b) 再é…
36å¸ƒã®å½¢æ…
37‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
38 * 報告すること.
39 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
40 * 害からも,上記著作権者
41およびTOPPERSプロジェクトをå…
42è²¬ã™ã‚‹ã“と.
43 *
44 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者
45お
46 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も
47 * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直
48 * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない.
49 *
50 * @(#) $Id: cpu_support.S,v 1.27 2007/01/05 01:02:31 honda Exp $
51 */
52
53/*
54 * プロセッサ依存モジュール アセンブリ言語部(ARMv4用)
55 */
56#define _MACRO_ONLY
57#include "jsp_kernel.h"
58#include "offset.h"
59#include <armv4.h>
60#include <t_config.h>
61
62/*
63 * タスクディスパッチャ
64 *
65 * dispatch は,スーパーバイザーモード・割込み禁止状æ…
66‹ã§å‘¼ã³å‡ºã•ãªã‘れば
67 * ならない.
68 * _exit_and_dispatch も,スーパーバイザーモード・割込み禁止状æ…
69‹ã§å‘¼ã³å‡ºã™
70 * のが原則であるが,カーネル起動時に対応するため,IRQモードで呼び出した
71 * 場合にも対応している.
72 */
73
74 .text
75 .align 4
76 .globl dispatch
77 .globl exit_and_dispatch
78dispatch:
79 stmfd sp!, {r4 - r11,lr} /* レジスタの保存 */
80 ldr r0, =runtsk /* runtskを読み込む */
81 ldr r1, [r0]
82 str sp, [r1,#TCB_sp] /* タスクスタックを保存 */
83 adr r2, dispatch_r
84 str r2, [r1,#TCB_pc] /* 実行再開番地を保存 */
85 ldr r6, =interrupt_count /* r6 <-interrupt_count */
86 mov r5, #(CPSR_SVC|CPSR_IRQ_BIT) /* 割り込み禁止(スーパーバイザーモード) */
87 mov r4, #(CPSR_SVC) /* 割り込み許可(スーパーバイザーモード) */
88 b dispatcher_1
89
90dispatch_r:
91 ldmfd sp!,{r4 - r11,lr}
92 /*
93 * タスク例外処理ルーチンの起動
94 * dispatch_r は dispatcher_1 から呼び出されるため,
95 * tcbのアドレスはr1にå…
96¥ã£ã¦ã„ã‚‹
97 */
98 ldrb r0,[r1,#TCB_enatex]
99 tst r0,#TCB_enatex_mask
100 beq dispatch_r_1 /* enatex が FALSE ならリターン */
101 ldr r0,[r1,#TCB_texptn] /* texptnをロード */
102 tst r0,r0 /* texptn が0で無ければ */
103 bne call_texrtn /* タスク例外ルーチンの呼び出し */
104dispatch_r_1:
105 mov pc,lr
106
107
108
109exit_and_dispatch:
110 ldr r6, =interrupt_count /* interrupt_countを0クリア */
111 mov r3, #0
112 str r3, [r6]
113 /*
114 * FIQは常に禁止する.
115 */
116 mov r5, #(CPSR_SVC|CPSR_IRQ_BIT) /* 割り込み禁止(スーパーバイザーモード) */
117 mov r4, #(CPSR_SVC) /* 割り込み許可(スーパーバイザーモード) */
118 mrs r0, cpsr /* FIQを継承 */
119 and r0, r0, #CPSR_FIQ_BIT
120 orr r0, r0, r5
121 msr cpsr, r0 /* スーパーバイザーモード */
122dispatcher_1:
123 /*
124 * ここではスーパーバイザーモード・割込み禁止状æ…
125‹ã§ãªã‘ればならない.
126 */
127 ldr r0, =schedtsk /* schedtsk を読み込む */
128 ldr r1, [r0]
129 ldr r2, =runtsk /* schedtsk を runtskに */
130 str r1, [r2] /* schedtsk がいない場合はruntskをNULLに */
131 cmp r1, #0
132 beq dispatcher_2
133dispatcher_3:
134 ldr sp, [r1,#TCB_sp] /* タスクスタックを復帰 */
135 ldr pc, [r1,#TCB_pc] /* 実行再開番地を復帰 */
136dispatcher_2:
137 mov r3,#1
138 str r3, [r6] /* interupt_count = 1 */
139 ldr sp, =STACKTOP
140 /* sleepモードを持つCPUなら書き換える */
141 mrs r0, cpsr /* FIQを継承 */
142 and r0, r0, #CPSR_FIQ_BIT
143 orr r0, r0, r4
144 msr cpsr, r0 /* 割込み待
145ち */
146 WAIT_INTERRUPT
147 mrs r0, cpsr /* FIQを継承 */
148 and r0, r0, #CPSR_FIQ_BIT
149 orr r0, r0, r5
150 msr cpsr, r0 /* 割込み禁止 */
151 mov r3,#0
152 str r3, [r6] /* interrupt_count = 0 */
153 b dispatcher_1
154
155
156
157/*
158 * タスク起動時処理
159 */
160 .text
161 .globl activate_r
162activate_r:
163 mov r1,#(CPSR_SVC|CPSR_FIQ_BIT) /* 割り込み許可(スーパーバイザーモード) */
164 mrs r2, cpsr /* FIQを継承 */
165 and r2, r2, #CPSR_FIQ_BIT
166 orr r1, r1, r2
167 msr cpsr, r1 /* 割込み許可 */
168 ldr lr, =ext_tsk /* 戻り番地設定 */
169 ldmfd sp!, {r0,pc} /* 引数,PC設定 */
170
171
172
173/*
174 * 割込みハンドラ/CPU例外ハンドラ出口処理
175 *
176 * ret_int はスーパーバイザーモード・IRQ割込み禁止状æ…
177‹ã§å‘¼ã³å‡ºã™ï¼Ž
178 */
179 .text
180 .globl ret_int
181 .globl ret_exc
182ret_int:
183ret_exc:
184 /*
185 * スーパーバイザーモードで来ること
186 */
187 ldr r2, =runtsk /* runtsk を読み込む */
188 ldr r1, [r2]
189 ldr r2, =enadsp
190 ldr r0, [r2]
191 cmp r0, #0
192 beq ret_int_1
193 ldr r2, =schedtsk
194 ldr r0, [r2]
195 cmp r0, r1 /* schedtsk と runtsk を比較 */
196 beq ret_int_1
197 stmfd sp!, {r4-r11} /* 残りのレジスタを保存 */
198 str sp, [r1,#TCB_sp] /* タスクスタックを保存 */
199 adr r0, ret_int_r /* 実行再開番地を保存 */
200 str r0, [r1,#TCB_pc]
201 b dispatcher_1
202ret_int_r:
203 ldmfd sp!, {r4-r11} /* レジスタの復帰 */
204ret_int_1:
205 /*
206 * タスク例外処理ルーチンの起動
207 * dispatch_r は dispatcher_1 から呼び出されるため,
208 * tcbのアドレスはr1にå…
209¥ã£ã¦ã„ã‚‹
210 * ret_int_1 は ret_exe から呼び出される
211 */
212 ldrb r0, [r1,#TCB_enatex]
213 tst r0, #TCB_enatex_mask
214 beq ret_int_2 /* enatex が FALSE ならリターン */
215 ldr r0, [r1,#TCB_texptn] /* texptnをロード */
216 tst r0, r0 /* texptn が0で無ければ */
217 blne call_texrtn /* タスク例外ルーチンの呼び出し */
218ret_int_2:
219 ldmfd sp!, {r0} /* spsr を復帰 */
220 mrs r2, cpsr /* FIQを継承 */
221 and r2, r2, #CPSR_FIQ_BIT
222 and r0, r0, #~CPSR_FIQ_BIT
223 orr r0, r0, r2
224 msr spsr, r0 /* 戻りå…
225ˆã®cpsrをspsrに設定 */
226 ldmfd sp!,{r0-r3,ip,lr,pc}^ /* タスクに復帰 ^付きなので、cpsr <- spsr */
227
228 /*
229 * 微少時間待
230ち
231 */
232 .globl sil_dly_nse
233sil_dly_nse:
234 sub r0, r0, #SIL_DLY_TIM1
235 cmp r0, #0
236 bgt _sil_dly_nse1
237 movle pc, lr
238_sil_dly_nse1:
239 sub r0, r0, #SIL_DLY_TIM2
240 cmp r0, #0
241 bgt _sil_dly_nse1
242 movle pc, lr
Note: See TracBrowser for help on using the repository browser.