source: anotherchoice/tags/jsp-1.4.4-full-UTF8/config/windows/cpu_config.c@ 26

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

initial

File size: 6.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 *
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_config.c,v 1.15 2003/12/15 07:19:22 takayuki Exp $
51 */
52
53
54/*
55 * プロセッサ依存モジュール(Windows用)
56 */
57#include <cpu_rename.h>
58
59#include <s_services.h>
60
61#include "jsp_kernel.h"
62#include "check.h"
63#include "task.h"
64
65#include <hal_msg.h>
66
67volatile char CPUStatus = CPU_STAT_LOCK; //CPU状æ…
68‹ãƒ•ãƒ©ã‚°
69
70/*
71 * タスクディスパッチャ
72 * ディスパッチャ本体はprimary_thread.cにある
73 * ここでは管理スレッドにディスパッチ依頼を出すだけ
74 */
75void
76dispatch()
77{
78 LOG_DSP_ENTER_TSK(runtsk);
79 HALDispatchRequest();
80}
81
82/* 割込み用ディスパッチャ (出力するログ情
83報のみが異なる) */
84void
85idispatch()
86{
87 LOG_DSP_ENTER_INT(runtsk);
88 HALDispatchRequest();
89}
90
91
92/*
93 * 現在のコンテキストを捨ててディスパッチ
94 * exit_and_dispatch は,CPUロック状æ…
95‹ã§å‘¼ã³å‡ºã•ãªã‘ればならない.
96 *
97 * 現在実行中のタスクのTCBを指定して破棄依頼。破棄後自動的にディスパッチャへ。
98 */
99void
100exit_and_dispatch()
101{
102 HANDLE handle;
103
104 HALDestroyRequest(runtsk);
105
106 if((handle = (HANDLE)TlsGetValue(TLS_THREADHANDLE)) != NULL)
107 CloseHandle(handle);
108
109 TlsFree(TLS_THREADHANDLE);
110 TlsFree(TLS_LOGMASK);
111
112 ExitThread(0);
113}
114
115
116/*
117 * プロセッサ依存の初期化
118 */
119
120void
121cpu_initialize()
122{
123 kprintf(("cpu_initialize()\n"));
124
125 /*
126 * 割込みエミュレータの初期化
127 */
128 ini_int();
129
130 /*
131 * 最上位構造化例外ハンドラの設定
132 */
133 ini_exc();
134}
135
136/*
137 * プロセッサ依存の終了処理
138 */
139void
140cpu_terminate()
141{
142 kprintf(("cpu_terminate()\n"));
143
144 fin_int(); //割込みエミュレータの停止
145 fin_exc(); //最上位構造化例外ハンドラの解除
146}
147
148
149/*
150 * タスク起動ルーチン
151 *
152 */
153
154DWORD WINAPI
155activate_r( LPVOID param)
156{
157 TCB * tcb = (TCB *)param;
158
159 TlsAlloc();
160 TlsSetValue(TLS_LOGMASK, 0);
161 TlsSetValue(TLS_THREADHANDLE, tcb->tskctxb.ThreadHandle);
162
163 kprintf(("Task %d : activated\n", (tcb - tcb_table) + 1));
164
165 (*(void(*)(VP_INT))tcb->tinib->task)(tcb->tinib->exinf);
166 ext_tsk();
167 return 0;
168}
169
170/*
171 * atexitで登録された関数の読出し (Windowsは何もしない -> CRTに任せる)
172 */
173void call_atexit(void)
174{}
175
176
177/*
178 * 致命的な失敗に対する対処ルーチン
179 */
180void FatalAssertion(int exp, LPCSTR format, ...)
181{
182 extern HANDLE PrimaryThreadHandle;
183 extern HANDLE CurrentRunningThreadHandle;
184
185 if(!exp)
186 {
187 va_list vl;
188 char buffer[1024];
189
190 /* エラーが起きた原因を突き止める */
191 wsprintf(buffer, "Critical assertion fail occured !!\nGetLastError = 0x%08x\n\n", GetLastError());
192
193 /* カーネルが動き出していたら... */
194 if(PrimaryThreadHandle != NULL)
195 {
196 /* カーネルの実行を止める */
197 dis_int(0);
198 if(CurrentRunningThreadHandle != NULL)
199 SuspendThread(CurrentRunningThreadHandle);
200 hw_timer_terminate();
201 }
202
203 /* 警告表示 */
204 va_start(vl, format);
205 wvsprintf(buffer + lstrlen(buffer), format, vl);
206 MessageBox(PrimaryDialogHandle, buffer, "Assertion Failed", MB_OK|MB_ICONERROR);
207
208 /* カーネル停止 */
209 HALQuitRequest();
210 }
211}
212
213 /*
214 * ログ出力をどうするかの制御
215 */
216void set_logcontrol(BOOL enable)
217{
218 BOOL result;
219 result = TlsSetValue(TLS_LOGMASK, (LPVOID)(enable == TRUE ? 0 : 1));
220 if(result == 0)
221 {
222 TlsAlloc();
223 TlsSetValue(TLS_LOGMASK, (LPVOID)(enable == TRUE ? 0 : 1));
224 }
225}
226
227 /*
228 * カーネルのデバッグ用printf
229 */
230void _kernel_debugprintf(const char * format, ... )
231{
232 va_list vl;
233 int words;
234 DWORD count;
235 char buffer[1024];
236
237 va_start(vl, format);
238 words = wvsprintf(buffer, format, vl);
239
240 if(words != 0)
241 WriteFile(GetStdHandle(STD_OUTPUT_HANDLE), buffer, words, &count, NULL);
242}
243
244#ifdef _MSC_VER //cygwinの場合はcpu_insn.Sに記述
245
246 /*
247 * タスク例外起動ルーチン
248 * コンテキストを一致させるため、
249 * タスク例外を動かしたタスクのスレッド上で動作させるためのルーチン
250 */
251void __declspec(naked) TaskExceptionPerformer(void)
252{
253 /* レジスタ退避 */
254 __asm pusha
255 __asm sub esp, FPU_CONTEXTSIZE
256 __asm fsave [esp]
257
258 /* タスク例外の起動 */
259 __asm call call_texrtn
260
261 /* 割込みマスク戻し */
262 __asm mov ebx, DWORD PTR runtsk
263 __asm mov eax, [ebx]TCB.tskctxb.InterruptLevel
264 __asm push eax
265 __asm call chg_ims
266 __asm add esp, 4
267
268 /* レジスタ復帰 */
269 __asm finit
270 __asm frstor [esp]
271 __asm add esp, FPU_CONTEXTSIZE
272 __asm popa
273 __asm ret
274}
275
276#endif
277
Note: See TracBrowser for help on using the repository browser.