source: asp3_wo_tecs/trunk/target/macosx_xcode/target_kernel_impl.h@ 302

Last change on this file since 302 was 302, checked in by ertl-honda, 7 years ago

TECSレスのASP3の開発のため以下のtrunkからコピー
http://dev.toppers.jp/svn/asp3/branches/WO_TECS-3.C.0

File size: 20.9 KB
Line 
1/*
2 * TOPPERS/ASP Kernel
3 * Toyohashi Open Platform for Embedded Real-Time Systems/
4 * Advanced Standard Profile Kernel
5 *
6 * Copyright (C) 2006-2015 by Embedded and Real-Time Systems Laboratory
7 * Graduate School of Information Science, Nagoya Univ., JAPAN
8 *
9 * 上記著作権者
10は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
11 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
12 * 変・再é…
13å¸ƒï¼ˆä»¥ä¸‹ï¼Œåˆ©ç”¨ã¨å‘¼ã¶ï¼‰ã™ã‚‹ã“とを無償で許諾する.
14 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
15 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
16 * スコード中に含まれていること.
17 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
18 * 用できる形で再é…
19å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
20å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
21 * 者
22マニュアルなど)に,上記の著作権表示,この利用条件および下記
23 * の無保証規定を掲載すること.
24 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
25 * 用できない形で再é…
26å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
27 * と.
28 * (a) 再é…
29å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
30マニュアルなど)に,上記の著
31 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
32 * (b) 再é…
33å¸ƒã®å½¢æ…
34‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
35 * 報告すること.
36 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
37 * 害からも,上記著作権者
38およびTOPPERSプロジェクトをå…
39è²¬ã™ã‚‹ã“と.
40 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
41 * 由に基づく請求からも,上記著作権者
42およびTOPPERSプロジェクトを
43 * å…
44è²¬ã™ã‚‹ã“と.
45 *
46 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者
47お
48 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
49 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
50 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
51 * の責任を負わない.
52 *
53 * $Id: target_kernel_impl.h 479 2016-01-03 07:28:41Z ertl-hiro $
54 */
55
56/*
57 * カーネルのターゲット依存部(Mac OS X用)
58 *
59 * カーネルのターゲット依存部のヘッダファイル.kernel_impl.hのターゲッ
60 * ト依存部の位置付けとなる.
61 */
62
63#ifndef TOPPERS_TARGET_KERNEL_IMPL_H
64#define TOPPERS_TARGET_KERNEL_IMPL_H
65
66/*
67 * 標準のインクルードファイル
68 */
69#ifndef TOPPERS_MACRO_ONLY
70#include <sys/types.h>
71#include <stdlib.h>
72#include <setjmp.h>
73#include <signal.h>
74#include <stdio.h>
75
76#include <kernel.h>
77#include <t_syslog.h>
78#ifdef TOPPERS_SUPPORT_OVRHDR
79#include "overrun.h"
80#endif /* TOPPERS_SUPPORT_OVRHDR */
81#endif /* TOPPERS_MACRO_ONLY */
82
83/*
84 * ターゲットシステムのOS依存の定義
85 */
86#include "macosx.h"
87
88/*
89 * ターゲット定義のオブジェクト属性
90 */
91#define TARGET_INHATR TA_NONKERNEL /* カーネル管理外の割込み */
92
93/*
94 * エラーチェック方法の指定
95 */
96#define CHECK_STKSZ_ALIGN 16 /* スタックサイズのアライン単位 */
97#define CHECK_INTPTR_ALIGN 4 /* intptr_t型の変数のアライン単位 */
98#define CHECK_INTPTR_NONNULL /* intptr_t型の変数の非NULLチェック */
99#define CHECK_FUNC_ALIGN 4 /* 関数のアライン単位 */
100#define CHECK_FUNC_NONNULL /* 関数の非NULLチェック */
101#define CHECK_STACK_ALIGN 16 /* スタック領域のアライン単位 */
102#define CHECK_STACK_NONNULL /* スタック領域の非NULLチェック */
103#define CHECK_MPF_ALIGN 4 /* 固定長メモリプール領域のアライン単位 */
104#define CHECK_MPF_NONNULL /* 固定長メモリプール領域の非NULLチェック */
105#define CHECK_MB_ALIGN 4 /* 管理領域のアライン単位 */
106
107/*
108 * トレースログに関する設定
109 */
110#ifdef TOPPERS_ENABLE_TRACE
111#include "arch/logtrace/trace_config.h"
112#endif /* TOPPERS_ENABLE_TRACE */
113
114/*
115 * トレースログマクロのデフォルト定義
116 */
117#ifndef LOG_INH_ENTER
118#define LOG_INH_ENTER(inhno)
119#endif /* LOG_INH_ENTER */
120
121#ifndef LOG_INH_LEAVE
122#define LOG_INH_LEAVE(inhno)
123#endif /* LOG_INH_LEAVE */
124
125#ifndef LOG_EXC_ENTER
126#define LOG_EXC_ENTER(excno)
127#endif /* LOG_EXC_ENTER */
128
129#ifndef LOG_EXC_LEAVE
130#define LOG_EXC_LEAVE(excno)
131#endif /* LOG_EXC_LEAVE */
132
133/*
134 * アーキテクチャ(プロセッサ)依存の定義
135 */
136#if defined(__ppc__)
137
138#define JMPBUF_PC 21 /* jmp_buf中でのPCの位置 */
139#define JMPBUF_SP 0 /* jmp_buf中でのSPの位置 */
140#define TASK_STACK_MERGIN 4U
141#define DEFAULT_ISTKSZ SIGSTKSZ /* シグナルスタックのサイズ */
142
143#elif defined(__i386__)
144
145#define JMPBUF_PC 12 /* jmp_buf中でのPCの位置 */
146#define JMPBUF_SP 9 /* jmp_buf中でのSPの位置 */
147#define TASK_STACK_MERGIN 4U
148#define DEFAULT_ISTKSZ SIGSTKSZ /* シグナルスタックのサイズ */
149
150#elif defined(__x86_64__)
151
152#error architecture not supported
153#define JMPBUF_PC 7 /* jmp_buf中でのPCの位置 */
154#define JMPBUF_SP 2 /* jmp_buf中でのSPの位置 */
155#define TASK_STACK_MERGIN 8U
156#define DEFAULT_ISTKSZ SIGSTKSZ /* シグナルスタックのサイズ */
157
158#else
159#error architecture not supported
160#endif
161
162/*
163 * 標準の割込み管理機能の初期化を行わないための定義
164 */
165#define OMIT_INITIALIZE_INTERRUPT
166
167#ifndef TOPPERS_MACRO_ONLY
168
169/*
170 * タスクコンテキストブロックの定義
171 */
172typedef struct task_context_block {
173 jmp_buf env; /* コンテキスト情
174å ± */
175} TSKCTXB;
176
177/*
178 * 割込みハンドラ初期化ブロック
179 *
180 * 標準の割込みハンドラ初期化ブロックに,割込み優å…
181ˆåº¦ã‚’追加したもの.
182 */
183typedef struct interrupt_handler_initialization_block {
184 INHNO inhno; /* 割込みハンドラ番号 */
185 ATR inhatr; /* 割込みハンドラ属性 */
186 FP int_entry; /* 割込みハンドラの出å…
187¥å£å‡¦ç†ã®ç•ªåœ° */
188 PRI intpri; /* 割込み優å…
189ˆåº¦ */
190} INHINIB;
191
192/*
193 * 割込みハンドラ番号の数(kernel_cfg.c)
194 */
195extern const uint_t tnum_def_inhno;
196
197/*
198 * 割込みハンドラ初期化ブロックのエリア(kernel_cfg.c)
199 */
200extern const INHINIB inhinib_table[];
201
202/*
203 * シグナルセット操作マクロ
204 */
205#define sigequalset(set1, set2) (*(set1) == *(set2))
206#define sigassignset(set1, set2) (*(set1) = *(set2))
207#define sigjoinset(set1, set2) (*(set1) |= *(set2))
208
209/*
210 * 割込み優å…
211ˆåº¦ãƒžã‚¹ã‚¯ã«ã‚ˆã‚‹ã‚·ã‚°ãƒŠãƒ«ãƒžã‚¹ã‚¯ï¼ˆkernel_cfg.c)
212 *
213 * 割込み優å…
214ˆåº¦ãƒžã‚¹ã‚¯ã«ã‚ˆã£ã¦ãƒžã‚¹ã‚¯ã•ã‚Œã¦ã„る割込みと,割込み属性が設
215 * 定されていない割込みに対応するシグナルをマスクするためのシグナルマ
216 * スクを保持するé…
217åˆ—.é…
218åˆ—のインデックスは,割込み優å…
219ˆåº¦ãƒžã‚¹ã‚¯ã®ç¬¦å·
220 * を反転したもの.
221 *
222 * sigmask_table[0]:割込み属性が設定されていない割込みに対応するシグ
223 * ナルのみをマスクするシグナルマスク
224 * sigmask_table[-TMIN_INTPRI]:カーネル管理の割込みすべてと,割込み属
225 * 性が設定されていない割込みに対応するシグナルをマ
226 * スクするシグナルマスク
227 * sigmask_table[6]:NMIとSIGUSR2を除くすべての割込みと,割込み属性が設
228 * 定されていない割込みに対応するシグナルをマスクする
229 * シグナルマスク
230 * sigmask_table[7]:sigmask_table[6]と同じ値
231 */
232extern const sigset_t sigmask_table[8];
233
234/*
235 * 割込み要求禁止フラグ実現のための変数の初期値(kernel_cfg.c)
236 */
237extern const sigset_t sigmask_disint_init;
238
239/*
240 * 割込みロック/CPUロックへの移行でマスクするシグナルを保持する変数
241 */
242extern sigset_t sigmask_intlock; /* 割込みロックでマスクするシグナル */
243extern sigset_t sigmask_cpulock; /* CPUロックでマスクするシグナル */
244
245/*
246 * コンテキストの参ç…
247§
248 */
249Inline bool_t
250sense_context(void)
251{
252 stack_t ss;
253
254 sigaltstack(NULL, &ss);
255 return((ss.ss_flags & SA_ONSTACK) != 0);
256}
257
258/*
259 * CPUロックフラグ実現のための変数
260 */
261extern volatile bool_t lock_flag; /* CPUロックフラグを表す変数 */
262extern volatile sigset_t saved_sigmask; /* シグナルマスクを保存する変数 */
263
264/*
265 * 割込み優å…
266ˆåº¦ãƒžã‚¹ã‚¯å®Ÿç¾ã®ãŸã‚ã®å¤‰æ•°
267 */
268extern volatile PRI intpri_value; /* 割込み優å…
269ˆåº¦ãƒžã‚¹ã‚¯ã‚’表す変数 */
270
271/*
272 * 割込み要求禁止フラグ実現のための変数
273 */
274extern volatile sigset_t sigmask_disint; /* 個別にマスクしているシグナル */
275
276/*
277 * シグナルマスクの設定
278 *
279 * 現在の状æ…
280‹ï¼ˆã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆï¼ŒCPUロックフラグ,割込み優å…
281ˆåº¦ãƒžã‚¹ã‚¯ï¼Œå‰²è¾¼
282 * み禁止フラグ)を参ç…
283§ã—て,現在のシグナルマスクとsaved_sigmaskを適切
284 * な値に設定する.
285 */
286Inline void
287set_sigmask(void)
288{
289 sigset_t sigmask;
290
291 sigassignset(&sigmask, &(sigmask_table[-intpri_value]));
292 sigjoinset(&sigmask, &sigmask_disint);
293 if (sense_context()) {
294 sigaddset(&sigmask, SIGUSR2);
295 }
296 if (lock_flag) {
297 sigassignset(&saved_sigmask, &sigmask);
298 sigjoinset(&sigmask, &sigmask_cpulock);
299 }
300 sigprocmask(SIG_SETMASK, &sigmask, NULL);
301}
302
303/*
304 * CPUロック状æ…
305‹ã¸ã®ç§»è¡Œ
306 */
307Inline void
308lock_cpu(void)
309{
310 assert(!lock_flag);
311 sigprocmask(SIG_BLOCK, &sigmask_cpulock, (sigset_t *) &saved_sigmask);
312 lock_flag = true;
313}
314
315/*
316 * CPUロック状æ…
317‹ã¸ã®ç§»è¡Œï¼ˆãƒ‡ã‚£ã‚¹ãƒ‘ッチできる状æ…
318‹ï¼‰
319 */
320#define lock_cpu_dsp() lock_cpu()
321
322/*
323 * CPUロック状æ…
324‹ã®è§£é™¤
325 */
326Inline void
327unlock_cpu(void)
328{
329 assert(lock_flag);
330 lock_flag = false;
331 sigprocmask(SIG_SETMASK, (sigset_t *) &saved_sigmask, NULL);
332}
333
334/*
335 * CPUロック状æ…
336‹ã®è§£é™¤ï¼ˆãƒ‡ã‚£ã‚¹ãƒ‘ッチできる状æ…
337‹ï¼‰
338 */
339#define unlock_cpu_dsp() unlock_cpu()
340
341/*
342 * CPUロック状æ…
343‹ã®å‚ç…
344§
345 */
346Inline bool_t
347sense_lock(void)
348{
349 return(lock_flag);
350}
351
352/*
353 * 割込みを受け付けるための遅
354延処理
355 */
356Inline void
357delay_for_interrupt(void)
358{
359}
360
361/*
362 * 割込み優å…
363ˆåº¦ãƒžã‚¹ã‚¯ã®è¨­å®š
364 */
365Inline void
366t_set_ipm(PRI intpri)
367{
368 intpri_value = intpri;
369 set_sigmask();
370}
371
372/*
373 * 割込み優å…
374ˆåº¦ãƒžã‚¹ã‚¯ã®å‚ç…
375§
376 */
377Inline PRI
378t_get_ipm(void)
379{
380 return(intpri_value);
381}
382
383/*
384 * 割込み番号の範囲の判定
385 */
386#define VALID_INTNO(intno) (1 <= (intno) && (intno) <= 30 \
387 && (intno) != SIGKILL && (intno) != SIGSTOP)
388
389/*
390 * 割込み要求禁止フラグのセット
391 *
392 * 割込み属性が設定されていない割込み要求ラインに対して割込み要求禁止
393 * フラグをセットしようとした場合には,falseを返す.
394 */
395Inline bool_t
396disable_int(INTNO intno)
397{
398 if (sigismember(&(sigmask_table[0]), intno)
399 || !sigismember(&(sigmask_table[7]), intno)) {
400 return(false);
401 }
402 sigaddset(&sigmask_disint, intno);
403 set_sigmask();
404 return(true);
405}
406
407/*
408 * 割込み要求禁止フラグのクリア
409 *
410 * 割込み属性が設定されていない割込み要求ラインに対して割込み要求禁止
411 * フラグをクリアしようとした場合には,falseを返す.
412 */
413Inline bool_t
414enable_int(INTNO intno)
415{
416 if (sigismember(&(sigmask_table[0]), intno)
417 || !sigismember(&(sigmask_table[7]), intno)) {
418 return(false);
419 }
420 sigdelset(&sigmask_disint, intno);
421 set_sigmask();
422 return(true);
423}
424
425/*
426 * 割込み要求のクリア
427 */
428Inline void
429clear_int(INTNO intno)
430{
431}
432
433/*
434 * 割込み要求のチェック
435 */
436Inline bool_t
437probe_int(INTNO intno)
438{
439 sigset_t sigmask;
440
441 sigpending(&sigmask);
442 return(sigismember(&sigmask, intno));
443}
444
445/*
446 * 最高優å…
447ˆé †ä½ã‚¿ã‚¹ã‚¯ã¸ã®ãƒ‡ã‚£ã‚¹ãƒ‘ッチ
448 *
449 * dispatchは,タスクコンテキストから呼び出されたサービスコール処理か
450 * ら呼び出すべきもので,タスクコンテキスト・CPUロック状æ…
451‹ãƒ»ãƒ‡ã‚£ã‚¹ãƒ‘ッ
452 * チ許可状æ…
453‹ãƒ»ï¼ˆãƒ¢ãƒ‡ãƒ«ä¸Šã®ï¼‰å‰²è¾¼ã¿å„ªå…
454ˆåº¦ãƒžã‚¹ã‚¯å…
455¨è§£é™¤çŠ¶æ…
456‹ã§å‘¼ã³å‡ºã•ãª
457 * ければならない.
458 */
459extern void dispatch(void);
460
461/*
462 * 非タスクコンテキストからのディスパッチ要求
463 */
464#define request_dispatch()
465
466/*
467 * ディスパッチャの動作開始
468 *
469 * start_dispatchをreturnにマクロ定義することで,カーネルの初期化完了
470 * 後にsta_kerからmainにリターンさせ,シグナルスタックからå…
471ƒã®ã‚¹ã‚¿ãƒƒã‚¯
472 * に戻す.
473 */
474#define start_dispatch() return
475
476/*
477 * 現在のコンテキストを捨ててディスパッチ
478 *
479 * exit_and_dispatchは,ext_tskから呼び出すべきもので,タスクコンテキ
480 * スト・CPUロック状æ…
481‹ãƒ»ãƒ‡ã‚£ã‚¹ãƒ‘ッチ許可状æ…
482‹ãƒ»ï¼ˆãƒ¢ãƒ‡ãƒ«ä¸Šã®ï¼‰å‰²è¾¼ã¿å„ªå…
483ˆ
484 * 度マスクå…
485¨è§£é™¤çŠ¶æ…
486‹ã§å‘¼ã³å‡ºã•ãªã‘ればならない.
487 */
488extern void exit_and_dispatch(void);
489
490/*
491 * 割込みハンドラ出口処理
492 */
493extern void ret_int(void);
494
495/*
496 * CPU例外ハンドラ出口処理
497 */
498extern void ret_exc(void);
499
500/*
501 * カーネルの終了処理の呼出し
502 *
503 * call_exit_kernelは,カーネルの終了時に呼び出すべきもので,非タスク
504 * コンテキストに切り換えて,カーネルの終了処理(exit_kernel)を呼び出
505 * す.
506 */
507extern void call_exit_kernel(void) NoReturn;
508
509/*
510 * タスクコンテキストの初期化
511 *
512 * タスクが休止状æ…
513‹ã‹ã‚‰å®Ÿè¡Œã§ãã‚‹çŠ¶æ…
514‹ã«ç§»è¡Œã™ã‚‹æ™‚に呼ばれる.この時点
515 * でスタック領域を使ってはならない.
516 *
517 * activate_contextを,インライン関数ではなくマクロ定義としているのは,
518 * この時点ではTCBが定義されていないためである.
519 */
520extern void start_r(void);
521
522#define activate_context(p_tcb) \
523{ \
524 ((intptr_t *) &((p_tcb)->tskctxb.env))[JMPBUF_PC] \
525 = (intptr_t) start_r; \
526 ((intptr_t *) &((p_tcb)->tskctxb.env))[JMPBUF_SP] \
527 = (intptr_t)((char *)((p_tcb)->p_tinib->stk) \
528 + (p_tcb)->p_tinib->stksz \
529 - TASK_STACK_MERGIN); \
530}
531
532/*
533 * 割込みハンドラ番号とCPU例外ハンドラ番号の範囲の判定
534 */
535#define VALID_INHNO(inhno) VALID_INTNO((INTNO)(inhno))
536#define VALID_EXCNO(excno) VALID_INTNO((INTNO)(excno))
537
538/*
539 * 割込みハンドラの設定
540 *
541 * ベクトル番号inhnoの割込みハンドラの出å…
542¥å£å‡¦ç†ã®ç•ªåœ°ã‚’int_entryに,
543 * 割込み優å…
544ˆåº¦ã‚’intpriに設定する.
545 */
546Inline void
547define_inh(INHNO inhno, FP int_entry, PRI intpri)
548{
549 struct sigaction sigact;
550
551 assert(VALID_INHNO(inhno));
552 sigact.sa_sigaction =
553 (void (*)(int, struct __siginfo *, void *))(int_entry);
554 sigact.sa_flags = (SA_ONSTACK | SA_SIGINFO);
555 sigassignset(&(sigact.sa_mask), &(sigmask_table[-intpri]));
556 sigaddset(&(sigact.sa_mask), SIGUSR2);
557 sigaction(inhno, &sigact, NULL);
558}
559
560/*
561 * CPU例外ハンドラの設定
562 *
563 * ベクトル番号excnoのCPU例外ハンドラの出å…
564¥å£å‡¦ç†ã®ç•ªåœ°ã‚’exc_entryに設
565 * 定する.
566 *
567 * SA_NODEFERにより,シグナルハンドラの起動時に,そのシグナルをマスク
568 * するのを抑止している.
569 */
570Inline void
571define_exc(EXCNO excno, FP exc_entry)
572{
573 struct sigaction sigact;
574
575 assert(VALID_EXCNO(excno));
576 sigact.sa_sigaction =
577 (void (*)(int, struct __siginfo *, void *))(exc_entry);
578 sigact.sa_flags = (SA_ONSTACK | SA_SIGINFO | SA_NODEFER);
579 sigemptyset(&(sigact.sa_mask));
580 sigaddset(&(sigact.sa_mask), SIGUSR2);
581 sigaction(excno, &sigact, NULL);
582}
583
584/*
585 * オーバランハンドラ動作開始/停止のためのマクロ
586 */
587#ifdef TOPPERS_SUPPORT_OVRHDR
588
589#define OVRTIMER_START() do { \
590 if (_kernel_p_runtsk != NULL) { \
591 _kernel_ovrtimer_start(); \
592 } \
593 } while (0)
594
595#define OVRTIMER_STOP() _kernel_ovrtimer_stop()
596
597#else /* TOPPERS_SUPPORT_OVRHDR */
598
599#define OVRTIMER_START() ((void) 0)
600#define OVRTIMER_STOP() ((void) 0)
601
602#endif /* TOPPERS_SUPPORT_OVRHDR */
603
604/*
605 * 割込みハンドラのå…
606¥å£å‡¦ç†ã®ç”Ÿæˆãƒžã‚¯ãƒ­
607 */
608#define INT_ENTRY(inhno, inthdr) _kernel_##inthdr##_##inhno
609
610#define INTHDR_ENTRY(inhno, inthdr, intpri) \
611void _kernel_##inthdr##_##inhno(int sig, \
612 struct __siginfo *p_info, void *p_ctx) \
613{ \
614 PRI saved_intpri; \
615 \
616 lock_cpu(); \
617 saved_intpri = _kernel_intpri_value; \
618 _kernel_intpri_value = intpri; \
619 if (((ucontext_t *) p_ctx)->uc_onstack == 0) { \
620 OVRTIMER_STOP(); \
621 } \
622 unlock_cpu(); \
623 \
624 LOG_INH_ENTER(inhno); \
625 inthdr(); /* 割込みハンドラを呼び出す */ \
626 LOG_INH_LEAVE(inhno); \
627 \
628 if (!sense_lock()) { \
629 lock_cpu(); \
630 } \
631 if (((ucontext_t *) p_ctx)->uc_onstack == 0) { \
632 if (_kernel_p_runtsk != _kernel_p_schedtsk) { \
633 raise(SIGUSR2); /* ディスパッチャの起動を要求する */ \
634 } \
635 else { \
636 OVRTIMER_START(); \
637 } \
638 } \
639 _kernel_intpri_value = saved_intpri; \
640 unlock_cpu(); \
641}
642
643/*
644 * CPU例外ハンドラのå…
645¥å£å‡¦ç†ã®ç”Ÿæˆãƒžã‚¯ãƒ­
646 */
647#define EXC_ENTRY(excno, exchdr) _kernel_##exchdr##_##excno
648
649#define EXCHDR_ENTRY(excno, excno_num, exchdr) \
650void _kernel_##exchdr##_##excno(int sig, \
651 struct __siginfo *p_info, void *p_ctx) \
652{ \
653 if (exc_sense_nonkernel(p_ctx)) { \
654 bool_t saved_lock_flag; \
655 \
656 /* カーネル管理外のCPU例外ハンドラの場合 */ \
657 saved_lock_flag = _kernel_lock_flag; \
658 exchdr(p_ctx); /* CPU例外ハンドラを呼び出す */ \
659 _kernel_lock_flag = saved_lock_flag; \
660 } \
661 else { \
662 /* カーネル管理のCPU例外ハンドラの場合 */ \
663 lock_cpu(); \
664 if (((ucontext_t *) p_ctx)->uc_onstack == 0) { \
665 OVRTIMER_STOP(); \
666 } \
667 unlock_cpu(); \
668 \
669 LOG_EXC_ENTER(excno); \
670 exchdr(p_ctx); /* CPU例外ハンドラを呼び出す */ \
671 LOG_EXC_LEAVE(excno); \
672 \
673 if (!sense_lock()) { \
674 lock_cpu(); \
675 } \
676 if (((ucontext_t *) p_ctx)->uc_onstack == 0) { \
677 if (_kernel_p_runtsk != _kernel_p_schedtsk) { \
678 raise(SIGUSR2); /* ディスパッチャの起動を要求する */ \
679 } \
680 else { \
681 OVRTIMER_START(); \
682 } \
683 } \
684 unlock_cpu(); \
685 } \
686}
687
688/*
689 * CPU例外の発生した時のコンテキストの参ç…
690§
691 *
692 * CPU例外の発生した時のコンテキストが,タスクコンテキストの時にfalse,
693 * そうでない時にtrueを返す.
694 */
695Inline bool_t
696exc_sense_context(void *p_excinf)
697{
698 return(((ucontext_t *) p_excinf)->uc_onstack != 0);
699}
700
701/*
702 * カーネル管理外のCPU例外の判別
703 *
704 * カーネル管理外のCPU例外の時にtrue,そうでない時にfalseを返す.
705 */
706Inline bool_t
707exc_sense_nonkernel(void *p_excinf)
708{
709 sigset_t sigmask;
710
711 sigassignset(&sigmask, &(((ucontext_t *) p_excinf)->uc_sigmask));
712 return(sigismember(&sigmask, SIGUSR2));
713}
714
715/*
716 * CPU例外の発生した時のコンテキストと割込みのマスク状æ…
717‹ã®å‚ç…
718§
719 *
720 * CPU例外の発生した時のシステム状æ…
721‹ãŒï¼Œã‚«ãƒ¼ãƒãƒ«å†…
722のクリティカルセクショ
723 * ンの実行中でなく,å…
724¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯çŠ¶æ…
725‹ã§ãªãï¼ŒCPUロック状æ…
726‹ã§ãªãï¼Œã‚«ãƒ¼
727 * ネル管理外の割込みハンドラ実行中でなく,カーネル管理外のCPU例外ハン
728 * ドラ実行中でなく,タスクコンテキストであり,割込み優å…
729ˆåº¦ãƒžã‚¹ã‚¯ãŒå…
730¨
731 * 解除である時にtrue,そうでない時にfalseを返す.
732 */
733Inline bool_t
734exc_sense_intmask(void *p_excinf)
735{
736 return(!exc_sense_context(p_excinf) && !exc_sense_nonkernel(p_excinf)
737 && intpri_value == TIPM_ENAALL);
738}
739
740/*
741 * ターゲットシステム依存の初期化
742 */
743extern void target_initialize(void);
744
745/*
746 * ターゲットシステムの終了
747 *
748 * システムを終了する時に使う.
749 */
750extern void target_exit(void) NoReturn;
751
752#endif /* TOPPERS_MACRO_ONLY */
753
754/*
755 * カーネルの割り付けるメモリ領域の管理
756 *
757 * target_kernel_impl.cに,TLSF(オープンソースのメモリ管理ライブラリ)
758 * を用いたメモリ管理ルーチンを含めている.
759 */
760#define OMIT_KMM_ALLOCONLY
761
762#endif /* TOPPERS_TARGET_KERNEL_IMPL_H */
Note: See TracBrowser for help on using the repository browser.