source: mypx/target/macosx_gcc/target_config.h

このファイルの最終更新内容7 で kominami が 2015/09/12 9:22:12 に更新しました

TOPPERS/ASP 1.9.1

ファイルサイズ: 16.9 KB
 
1/*
2 *  TOPPERS/ASP Kernel
3 *      Toyohashi Open Platform for Embedded Real-Time Systems/
4 *      Advanced Standard Profile Kernel
5 *
6 *  Copyright (C) 2006-2014 by Embedded and Real-Time Systems Laboratory
7 *              Graduate School of Information Science, Nagoya Univ., JAPAN
8 *
9 *  Ÿåµ­Ãøºîž¢ŒÔ€Ï¡€°Ê²Œ€Î(1)¡Á(4)€ÎŸò·ï€òËþ€¿€¹Ÿì¹ç€ËžÂ€ê¡€ËÜ¥œ¥Õ¥È¥Š¥§
10 *  ¥¢¡ÊËÜ¥œ¥Õ¥È¥Š¥§¥¢€ò²þÊÑ€·€¿€â€Î€òŽÞ€à¡¥°Ê²ŒÆ±€ž¡Ë€ò»ÈÍÑ¡ŠÊ£Àœ¡Š²þ
11 *  ÊÑ¡ŠºÆÇÛÉۡʰʲŒ¡€ÍøÍрȞƀ֡ˀ¹€ë€³€È€ò̵œþ€ÇµöÂú€¹€ë¡¥
12 *  (1) ËÜ¥œ¥Õ¥È¥Š¥§¥¢€ò¥œ¡Œ¥¹¥³¡Œ¥É€Î·Á€ÇÍøÍÑ€¹€ëŸì¹ç€Ë€Ï¡€Ÿåµ­€ÎÃøºî
13 *      ž¢ÉœŒš¡€€³€ÎÍøÍÑŸò·ï€ª€è€Ó²Œµ­€Î̵ÊÝŸÚµ¬Äꀬ¡€€œ€Î€Þ€Þ€Î·Á€Ç¥œ¡Œ
14 *      ¥¹¥³¡Œ¥ÉÃæ€ËŽÞ€Þ€ì€Æ€€€ë€³€È¡¥
15 *  (2) ËÜ¥œ¥Õ¥È¥Š¥§¥¢€ò¡€¥é¥€¥Ö¥é¥ê·ÁŒ°€Ê€É¡€ÂŸ€Î¥œ¥Õ¥È¥Š¥§¥¢³«È¯€Ë»È
16 *      Íрǀ­€ë·Á€ÇºÆÇÛÉÛ€¹€ëŸì¹ç€Ë€Ï¡€ºÆÇÛÉÛ€ËÈŒ€Š¥É¥­¥å¥á¥ó¥È¡ÊÍøÍÑ
17 *      ŒÔ¥Þ¥Ë¥å¥¢¥ë€Ê€É¡Ë€Ë¡€Ÿåµ­€ÎÃøºîž¢ÉœŒš¡€€³€ÎÍøÍÑŸò·ï€ª€è€Ó²Œµ­
18 *      €Î̵ÊÝŸÚµ¬Äê€ò·ÇºÜ€¹€ë€³€È¡¥
19 *  (3) ËÜ¥œ¥Õ¥È¥Š¥§¥¢€ò¡€µ¡Žï€ËÁȀ߹þ€à€Ê€É¡€ÂŸ€Î¥œ¥Õ¥È¥Š¥§¥¢³«È¯€Ë»È
20 *      Íрǀ­€Ê€€·Á€ÇºÆÇÛÉÛ€¹€ëŸì¹ç€Ë€Ï¡€Œ¡€Î€€€º€ì€«€ÎŸò·ï€òËþ€¿€¹€³
21 *      €È¡¥
22 *    (a) ºÆÇÛÉÛ€ËÈŒ€Š¥É¥­¥å¥á¥ó¥È¡ÊÍøÍьԥޥ˥奢¥ë€Ê€É¡Ë€Ë¡€Ÿåµ­€ÎÃø
23 *        ºîž¢ÉœŒš¡€€³€ÎÍøÍÑŸò·ï€ª€è€Ó²Œµ­€Î̵ÊÝŸÚµ¬Äê€ò·ÇºÜ€¹€ë€³€È¡¥
24 *    (b) ºÆÇÛÉۀηÁÂÖ€ò¡€ÊÌ€ËÄê€á€ëÊýË¡€Ë€è€Ã€Æ¡€TOPPERS¥×¥í¥ž¥§¥¯¥È€Ë
25 *        Êó¹ð€¹€ë€³€È¡¥
26 *  (4) ËÜ¥œ¥Õ¥È¥Š¥§¥¢€ÎÍøÍрˀè€êÄŸÀÜŪ€Þ€¿€ÏŽÖÀÜŪ€ËÀž€ž€ë€€€«€Ê€ë»
27 *      ³²€«€é€â¡€Ÿåµ­Ãøºîž¢ŒÔ€ª€è€ÓTOPPERS¥×¥í¥ž¥§¥¯¥È€òÌÈÀÕ€¹€ë€³€È¡¥
28 *      €Þ€¿¡€ËÜ¥œ¥Õ¥È¥Š¥§¥¢€Î¥æ¡Œ¥¶€Þ€¿€Ï¥š¥ó¥É¥æ¡Œ¥¶€«€é€Î€€€«€Ê€ëÍý
29 *      ͳ€ËŽð€Å€¯ÀÁµá€«€é€â¡€Ÿåµ­Ãøºîž¢ŒÔ€ª€è€ÓTOPPERS¥×¥í¥ž¥§¥¯¥È€ò
30 *      ÌÈÀÕ€¹€ë€³€È¡¥
31 *
32 *  ËÜ¥œ¥Õ¥È¥Š¥§¥¢€Ï¡€ÌµÊÝŸÚ€ÇÄó¶¡€µ€ì€Æ€€€ë€â€Î€Ç€¢€ë¡¥Ÿåµ­Ãøºîž¢ŒÔ€ª
33 *  €è€ÓTOPPERS¥×¥í¥ž¥§¥¯¥È€Ï¡€ËÜ¥œ¥Õ¥È¥Š¥§¥¢€ËŽØ€·€Æ¡€ÆÃÄê€Î»ÈÍÑÌÜŪ
34 *  €ËÂЀ¹€ëŬ¹çÀ­€âŽÞ€á€Æ¡€€€€«€Ê€ëÊÝŸÚ€â¹Ô€ï€Ê€€¡¥€Þ€¿¡€ËÜ¥œ¥Õ¥È¥Š¥§
35 *  ¥¢€ÎÍøÍрˀè€êÄŸÀÜŪ€Þ€¿€ÏŽÖÀÜŪ€ËÀž€ž€¿€€€«€Ê€ë»³²€ËŽØ€·€Æ€â¡€€œ
36 *  €ÎÀÕÇ€€òÉé€ï€Ê€€¡¥
37 *
38 *  $Id$
39 */
40
41/*
42 *              ¥¿¡Œ¥²¥Ã¥È°Íž¥â¥ž¥å¡Œ¥ë¡ÊMac OS XÍÑ¡Ë
43 *
44 *  ¥«¡Œ¥Í¥ë€Î¥¿¡Œ¥²¥Ã¥È°ÍžÉô€Î¥€¥ó¥¯¥ë¡Œ¥É¥Õ¥¡¥€¥ë¡¥kernel_impl.h€Î¥¿¡Œ
45 *  ¥²¥Ã¥È°ÍžÉô€Î°ÌÃÖÉÕ€±€È€Ê€ë¡¥
46 */
47
48#ifndef TOPPERS_TARGET_CONFIG_H
49#define TOPPERS_TARGET_CONFIG_H
50
51/*
52 *  Éžœà€Î¥€¥ó¥¯¥ë¡Œ¥É¥Õ¥¡¥€¥ë
53 */
54#ifndef TOPPERS_MACRO_ONLY
55#include <sys/types.h>
56#include <unistd.h>
57#include <stdlib.h>
58#include <setjmp.h>
59#include <signal.h>
60#include <stdio.h>
61
62#ifdef TOPPERS_SUPPORT_OVRHDR
63#include "overrun.h"
64#endif /* TOPPERS_SUPPORT_OVRHDR */
65#endif /* TOPPERS_MACRO_ONLY */
66
67/*
68 *  ¥¿¡Œ¥²¥Ã¥È¥·¥¹¥Æ¥à€ÎOS°Íž€ÎÄêµÁ
69 */
70#include "macosx.h"
71
72/*
73 *  ¥¿¡Œ¥²¥Ã¥ÈÄêµÁ€Î¥ª¥Ö¥ž¥§¥¯¥È°À­
74 */
75#define TARGET_INHATR   TA_NONKERNEL    /* ¥«¡Œ¥Í¥ëŽÉÍý³°€Î³ä¹þ€ß */
76
77/*
78 *  ¥š¥é¡Œ¥Á¥§¥Ã¥¯ÊýË¡€Î»ØÄê
79 */
80#define CHECK_STKSZ_ALIGN       16      /* ¥¹¥¿¥Ã¥¯¥µ¥€¥º€Î¥¢¥é¥€¥óñ°Ì */
81#define CHECK_FUNC_ALIGN        4       /* ŽØ¿ô€Î¥¢¥é¥€¥óñ°Ì */
82#define CHECK_FUNC_NONNULL              /* ŽØ¿ô€ÎÈóNULL¥Á¥§¥Ã¥¯ */
83#define CHECK_STACK_ALIGN       16      /* ¥¹¥¿¥Ã¥¯Îΰè€Î¥¢¥é¥€¥óñ°Ì */
84#define CHECK_STACK_NONNULL             /* ¥¹¥¿¥Ã¥¯Îΰè€ÎÈóNULL¥Á¥§¥Ã¥¯ */
85#define CHECK_MPF_ALIGN         4       /* žÇÄêĹ¥á¥â¥ê¥×¡Œ¥ëÎΰè€Î¥¢¥é¥€¥óñ°Ì */
86#define CHECK_MPF_NONNULL               /* žÇÄêĹ¥á¥â¥ê¥×¡Œ¥ëÎΰè€ÎÈóNULL¥Á¥§¥Ã¥¯ */
87#define CHECK_MB_ALIGN          4       /* ŽÉÍýÎΰè€Î¥¢¥é¥€¥óñ°Ì */
88
89/*
90 *  ¥È¥ì¡Œ¥¹¥í¥°€ËŽØ€¹€ëÀßÄê
91 */
92#ifdef TOPPERS_ENABLE_TRACE
93#include "logtrace/trace_config.h"
94#endif /* TOPPERS_ENABLE_TRACE */
95
96/*
97 *  ¥È¥ì¡Œ¥¹¥í¥°¥Þ¥¯¥í€Î¥Ç¥Õ¥©¥ë¥ÈÄêµÁ
98 */
99#ifndef LOG_INH_ENTER
100#define LOG_INH_ENTER(inhno)
101#endif /* LOG_INH_ENTER */
102
103#ifndef LOG_INH_LEAVE
104#define LOG_INH_LEAVE(inhno)
105#endif /* LOG_INH_LEAVE */
106
107#ifndef LOG_EXC_ENTER
108#define LOG_EXC_ENTER(excno)
109#endif /* LOG_EXC_ENTER */
110
111#ifndef LOG_EXC_LEAVE
112#define LOG_EXC_LEAVE(excno)
113#endif /* LOG_EXC_LEAVE */
114
115/*
116 *  ¥¢¡Œ¥­¥Æ¥¯¥Á¥ã¡Ê¥×¥í¥»¥Ã¥µ¡Ë°Íž€ÎÄêµÁ
117 */
118#if defined(__ppc__)
119
120#define JMPBUF_PC                               21                      /* jmp_bufÃæ€Ç€ÎPC€Î°ÌÃÖ */
121#define JMPBUF_SP                               0                       /* jmp_bufÃæ€Ç€ÎSP€Î°ÌÃÖ */
122#define TASK_STACK_MERGIN               4U
123#define DEFAULT_ISTKSZ                  SIGSTKSZ        /* ¥·¥°¥Ê¥ë¥¹¥¿¥Ã¥¯€Î¥µ¥€¥º */
124
125#elif defined(__i386__)
126
127#define JMPBUF_PC                               12                      /* jmp_bufÃæ€Ç€ÎPC€Î°ÌÃÖ */
128#define JMPBUF_SP                               9                       /* jmp_bufÃæ€Ç€ÎSP€Î°ÌÃÖ */
129#define TASK_STACK_MERGIN               4U
130#define DEFAULT_ISTKSZ                  SIGSTKSZ        /* ¥·¥°¥Ê¥ë¥¹¥¿¥Ã¥¯€Î¥µ¥€¥º */
131
132#elif defined(__x86_64__)
133
134#error architecture not supported
135#define JMPBUF_PC                               7                       /* jmp_bufÃæ€Ç€ÎPC€Î°ÌÃÖ */
136#define JMPBUF_SP                               2                       /* jmp_bufÃæ€Ç€ÎSP€Î°ÌÃÖ */
137#define TASK_STACK_MERGIN               8U
138#define DEFAULT_ISTKSZ                  SIGSTKSZ        /* ¥·¥°¥Ê¥ë¥¹¥¿¥Ã¥¯€Î¥µ¥€¥º */
139
140#else
141#error architecture not supported
142#endif
143
144/*
145 *  Éžœà€Î³ä¹þ€ßŽÉÍýµ¡Çœ€ÎœéŽü²œ€ò¹Ô€ï€Ê€€€¿€á€ÎÄêµÁ
146 */
147#define OMIT_INITIALIZE_INTERRUPT
148
149#ifndef TOPPERS_MACRO_ONLY
150
151/*
152 *  ¥¿¥¹¥¯¥³¥ó¥Æ¥­¥¹¥È¥Ö¥í¥Ã¥¯€ÎÄêµÁ
153 */
154typedef struct task_context_block {
155        jmp_buf         env;                    /* ¥³¥ó¥Æ¥­¥¹¥ÈŸðÊó */
156} TSKCTXB;
157
158/*
159 *  ³ä¹þ€ß¥Ï¥ó¥É¥éœéŽü²œ¥Ö¥í¥Ã¥¯
160 *
161 *  Éžœà€Î³ä¹þ€ß¥Ï¥ó¥É¥éœéŽü²œ¥Ö¥í¥Ã¥¯€Ë¡€³ä¹þ€ßÍ¥ÀèÅÙ€òÄɲÀ·€¿€â€Î¡¥
162 */
163typedef struct interrupt_handler_initialization_block {
164        INHNO           inhno;                  /* ³ä¹þ€ß¥Ï¥ó¥É¥éÈÖ¹æ */
165        ATR                     inhatr;                 /* ³ä¹þ€ß¥Ï¥ó¥É¥é°À­ */
166        FP                      int_entry;              /* ³ä¹þ€ß¥Ï¥ó¥É¥é€ÎœÐÆþžýœèÍý€ÎÈÖÃÏ */
167        PRI                     intpri;                 /* ³ä¹þ€ßÍ¥ÀèÅÙ */
168} INHINIB;
169
170/*
171 *  ³ä¹þ€ß¥Ï¥ó¥É¥éÈÖ¹æ€Î¿ô¡Êkernel_cfg.c¡Ë
172 */
173extern const uint_t     tnum_inhno;
174
175/*
176 *  ³ä¹þ€ß¥Ï¥ó¥É¥éœéŽü²œ¥Ö¥í¥Ã¥¯€Î¥š¥ê¥¢¡Êkernel_cfg.c¡Ë
177 */
178extern const INHINIB    inhinib_table[];
179
180/*
181 *  ¥·¥°¥Ê¥ë¥»¥Ã¥ÈÁàºî¥Þ¥¯¥í
182 */
183#define sigequalset(set1, set2)         (*(set1) == *(set2))
184#define sigassignset(set1, set2)        (*(set1) = *(set2))
185#define sigjoinset(set1, set2)          (*(set1) |= *(set2))
186
187/*
188 *  ³ä¹þ€ßÍ¥ÀèÅÙ¥Þ¥¹¥¯€Ë€è€ë¥·¥°¥Ê¥ë¥Þ¥¹¥¯¡Êkernel_cfg.c¡Ë
189 *
190 *  ³ä¹þ€ßÍ¥ÀèÅÙ¥Þ¥¹¥¯€Ë€è€Ã€Æ¥Þ¥¹¥¯€µ€ì€Æ€€€ë³ä¹þ€ß€È¡€³ä¹þ€ß°À­€¬Àß
191 *  Äꀵ€ì€Æ€€€Ê€€³ä¹þ€ß€ËÂбþ€¹€ë¥·¥°¥Ê¥ë€ò¥Þ¥¹¥¯€¹€ë€¿€á€Î¥·¥°¥Ê¥ë¥Þ
192 *  ¥¹¥¯€òÊÝ»ý€¹€ëÇÛÎó¡¥ÇÛÎó€Î¥€¥ó¥Ç¥Ã¥¯¥¹€Ï¡€³ä¹þ€ßÍ¥ÀèÅÙ¥Þ¥¹¥¯€ÎÉ乿
193 *  €òȿş€·€¿€â€Î¡¥
194 *
195 *  sigmask_table[0]¡§³ä¹þ€ß°À­€¬ÀßÄꀵ€ì€Æ€€€Ê€€³ä¹þ€ß€ËÂбþ€¹€ë¥·¥°
196 *                    ¥Ê¥ë€Î€ß€ò¥Þ¥¹¥¯€¹€ë¥·¥°¥Ê¥ë¥Þ¥¹¥¯
197 *  sigmask_table[-TMIN_INTPRI]¡§¥«¡Œ¥Í¥ëŽÉÍý€Î³ä¹þ€ß€¹€Ù€Æ€È¡€³ä¹þ€ß°
198 *                    À­€¬ÀßÄꀵ€ì€Æ€€€Ê€€³ä¹þ€ß€ËÂбþ€¹€ë¥·¥°¥Ê¥ë€ò¥Þ
199 *                    ¥¹¥¯€¹€ë¥·¥°¥Ê¥ë¥Þ¥¹¥¯
200 *  sigmask_table[6]¡§NMI€ÈSIGUSR2€òœü€¯€¹€Ù€Æ€Î³ä¹þ€ß€È¡€³ä¹þ€ß°À­€¬Àß
201 *                    Äꀵ€ì€Æ€€€Ê€€³ä¹þ€ß€ËÂбþ€¹€ë¥·¥°¥Ê¥ë€ò¥Þ¥¹¥¯€¹€ë
202 *                    ¥·¥°¥Ê¥ë¥Þ¥¹¥¯
203 *  sigmask_table[7]¡§sigmask_table[6]€ÈƱ€žÃÍ
204 */
205extern const sigset_t sigmask_table[8];
206
207/*
208 *  ³ä¹þ€ßÍ×µá¶Ø»ß¥Õ¥é¥°ŒÂžœ€Î€¿€á€ÎÊÑ¿ô€ÎœéŽüÃÍ¡Êkernel_cfg.c¡Ë
209 */
210extern const sigset_t sigmask_disint_init;
211
212/*
213 *  ³ä¹þ€ß¥í¥Ã¥¯¡¿CPU¥í¥Ã¥¯€Ø€Î°Ü¹Ô€Ç¥Þ¥¹¥¯€¹€ë¥·¥°¥Ê¥ë€òÊÝ»ý€¹€ëÊÑ¿ô
214 */
215extern sigset_t sigmask_intlock;        /* ³ä¹þ€ß¥í¥Ã¥¯€Ç¥Þ¥¹¥¯€¹€ë¥·¥°¥Ê¥ë */
216extern sigset_t sigmask_cpulock;        /* CPU¥í¥Ã¥¯€Ç¥Þ¥¹¥¯€¹€ë¥·¥°¥Ê¥ë */
217
218/*
219 *  ¥³¥ó¥Æ¥­¥¹¥È€Î»²ŸÈ
220 */
221Inline bool_t
222sense_context(void)
223{
224        stack_t ss;
225
226        sigaltstack(NULL, &ss);
227        return((ss.ss_flags & SA_ONSTACK) != 0);
228}
229
230/*
231 *  CPU¥í¥Ã¥¯¥Õ¥é¥°ŒÂžœ€Î€¿€á€ÎÊÑ¿ô
232 */
233extern volatile bool_t          lock_flag;              /* CPU¥í¥Ã¥¯¥Õ¥é¥°€òÉœ€¹ÊÑ¿ô */
234extern volatile sigset_t        saved_sigmask;  /* ¥·¥°¥Ê¥ë¥Þ¥¹¥¯€òÊÝž€¹€ëÊÑ¿ô */
235
236/*
237 *  ³ä¹þ€ßÍ¥ÀèÅÙ¥Þ¥¹¥¯ŒÂžœ€Î€¿€á€ÎÊÑ¿ô
238 */
239extern volatile PRI                     ipm_value;              /* ³ä¹þ€ßÍ¥ÀèÅÙ¥Þ¥¹¥¯€òÉœ€¹ÊÑ¿ô */
240
241/*
242 *  ³ä¹þ€ßÍ×µá¶Ø»ß¥Õ¥é¥°ŒÂžœ€Î€¿€á€ÎÊÑ¿ô
243 */
244extern volatile sigset_t        sigmask_disint; /* žÄỀ˥ޥ¹¥¯€·€Æ€€€ë¥·¥°¥Ê¥ë */
245
246/*
247 *  ¥·¥°¥Ê¥ë¥Þ¥¹¥¯€ÎÀßÄê
248 *
249 *  žœºß€ÎŸõÂÖ¡Ê¥³¥ó¥Æ¥­¥¹¥È¡€CPU¥í¥Ã¥¯¥Õ¥é¥°¡€³ä¹þ€ßÍ¥ÀèÅÙ¥Þ¥¹¥¯¡€³ä¹þ
250 *  €ß¶Ø»ß¥Õ¥é¥°¡Ë€ò»²ŸÈ€·€Æ¡€žœºß€Î¥·¥°¥Ê¥ë¥Þ¥¹¥¯€Èsaved_sigmask€òŬÀÚ
251 *  €ÊÃÍ€ËÀßÄꀹ€ë¡¥
252 */
253Inline void
254set_sigmask(void)
255{
256        sigset_t        sigmask;
257
258        sigassignset(&sigmask, &(sigmask_table[-ipm_value]));
259        sigjoinset(&sigmask, &sigmask_disint);
260        if (sense_context()) {
261                sigaddset(&sigmask, SIGUSR2);
262        }
263        if (lock_flag) {
264                sigassignset(&saved_sigmask, &sigmask);
265                sigjoinset(&sigmask, &sigmask_cpulock);
266        }
267        sigprocmask(SIG_SETMASK, &sigmask, NULL);
268}
269
270/*
271 *  CPU¥í¥Ã¥¯ŸõÂր؀ΰܹÔ
272 */
273Inline void
274x_lock_cpu(void)
275{
276        assert(!lock_flag);
277        sigprocmask(SIG_BLOCK, &sigmask_cpulock, (sigset_t *) &saved_sigmask);
278        lock_flag = true;
279}
280
281#define t_lock_cpu()    x_lock_cpu()
282#define i_lock_cpu()    x_lock_cpu()
283
284/*
285 *  CPU¥í¥Ã¥¯ŸõÂրβòœü
286 */
287Inline void
288x_unlock_cpu(void)
289{
290        assert(lock_flag);
291        lock_flag = false;
292        sigprocmask(SIG_SETMASK, (sigset_t *) &saved_sigmask, NULL);
293}
294
295#define t_unlock_cpu()  x_unlock_cpu()
296#define i_unlock_cpu()  x_unlock_cpu()
297
298/*
299 *  CPU¥í¥Ã¥¯ŸõÂրλ²ŸÈ
300 */
301Inline bool_t
302x_sense_lock(void)
303{
304        return(lock_flag);
305}
306
307#define t_sense_lock()  x_sense_lock()
308#define i_sense_lock()  x_sense_lock()
309
310/*
311 *  ³ä¹þ€ßÍ¥ÀèÅÙ¥Þ¥¹¥¯€ÎÀßÄê
312 */
313Inline void
314x_set_ipm(PRI intpri)
315{
316        ipm_value = intpri;
317        set_sigmask();
318}
319
320#define t_set_ipm(intpri)       x_set_ipm(intpri)
321#define i_set_ipm(intpri)       x_set_ipm(intpri)
322
323/*
324 *  ³ä¹þ€ßÍ¥ÀèÅÙ¥Þ¥¹¥¯€Î»²ŸÈ
325 */
326Inline PRI
327x_get_ipm(void)
328{
329        return(ipm_value);
330}
331
332#define t_get_ipm()     x_get_ipm()
333#define i_get_ipm()     x_get_ipm()
334
335/*
336 *  ³ä¹þ€ßÈÖ¹æ€ÎÈϰπÎÈœÄê
337 */
338#define VALID_INTNO(intno)      (1 <= (intno) && (intno) <= 30 \
339                                                                && (intno) != SIGKILL && (intno) != SIGSTOP)
340#define VALID_INTNO_CREISR(intno)       VALID_INTNO(intno)
341#define VALID_INTNO_DISINT(intno)       VALID_INTNO(intno)
342
343/*
344 *  ³ä¹þ€ßÍ×µá¶Ø»ß¥Õ¥é¥°€Î¥»¥Ã¥È
345 *
346 *  ³ä¹þ€ß°À­€¬ÀßÄꀵ€ì€Æ€€€Ê€€³ä¹þ€ßÍ×µá¥é¥€¥ó€ËÂЀ·€Æ³ä¹þ€ßÍ×µá¶Ø»ß
347 *  ¥Õ¥é¥°€ò¥»¥Ã¥È€·€è€Š€È€·€¿Ÿì¹ç€Ë€Ï¡€false€òÊÖ€¹¡¥
348 */
349Inline bool_t
350x_disable_int(INTNO intno)
351{
352        if (sigismember(&(sigmask_table[0]), intno)
353                                || !sigismember(&(sigmask_table[7]), intno)) {
354                return(false);
355        }
356        sigaddset(&sigmask_disint, intno);
357        set_sigmask();
358        return(true);
359}
360
361#define t_disable_int(intno)    x_disable_int(intno)
362#define i_disable_int(intno)    x_disable_int(intno)
363
364/*
365 *  ³ä¹þ€ßÍ×µá¶Ø»ß¥Õ¥é¥°€Î¥¯¥ê¥¢
366 *
367 *  ³ä¹þ€ß°À­€¬ÀßÄꀵ€ì€Æ€€€Ê€€³ä¹þ€ßÍ×µá¥é¥€¥ó€ËÂЀ·€Æ³ä¹þ€ßÍ×µá¶Ø»ß
368 *  ¥Õ¥é¥°€ò¥¯¥ê¥¢€·€è€Š€È€·€¿Ÿì¹ç€Ë€Ï¡€false€òÊÖ€¹¡¥
369 */
370Inline bool_t
371x_enable_int(INTNO intno)
372{
373        if (sigismember(&(sigmask_table[0]), intno)
374                                || !sigismember(&(sigmask_table[7]), intno)) {
375                return(false);
376        }
377        sigdelset(&sigmask_disint, intno);
378        set_sigmask();
379        return(true);
380}
381
382#define t_enable_int(intno)             x_enable_int(intno)
383#define i_enable_int(intno)             x_enable_int(intno)
384
385/*
386 *  ³ä¹þ€ßÍ×µá€Î¥¯¥ê¥¢
387 */
388Inline void
389x_clear_int(INTNO intno)
390{
391}
392
393#define t_clear_int(intno)              x_clear_int(intno)
394#define i_clear_int(intno)              x_clear_int(intno)
395
396/*
397 *  ³ä¹þ€ßÍ×µá€Î¥Á¥§¥Ã¥¯
398 */
399Inline bool_t
400x_probe_int(INTNO intno)
401{
402        sigset_t        sigmask;
403
404        sigpending(&sigmask);
405        return(sigismember(&sigmask, intno));
406}
407
408#define t_probe_int(intno)              x_probe_int(intno)
409#define i_probe_int(intno)              x_probe_int(intno)
410
411/*
412 *  ³ä¹þ€ß¥Ï¥ó¥É¥é€ÎÆþžý€ÇɬÍ×€ÊIRCÁàºî
413 */
414Inline void
415i_begin_int(INTNO intno)
416{
417}
418
419/*
420 *  ³ä¹þ€ß¥Ï¥ó¥É¥é€ÎœÐžý€ÇɬÍ×€ÊIRCÁàºî
421 */
422Inline void
423i_end_int(INTNO intno)
424{
425}
426
427/*
428 *  ºÇ¹âÍ¥Àèœç°Ì¥¿¥¹¥¯€Ø€Î¥Ç¥£¥¹¥Ñ¥Ã¥Á
429 *
430 *  dispatch€Ï¡€¥¿¥¹¥¯¥³¥ó¥Æ¥­¥¹¥È€«€éžÆ€ÓœÐ€µ€ì€¿¥µ¡Œ¥Ó¥¹¥³¡Œ¥ëœèÍý€«
431 *  €éžÆ€ÓœÐ€¹€Ù€­€â€Î€Ç¡€¥¿¥¹¥¯¥³¥ó¥Æ¥­¥¹¥È¡ŠCPU¥í¥Ã¥¯ŸõÂÖ¡Š¥Ç¥£¥¹¥Ñ¥Ã
432 *  ¥Áµö²ÄŸõÂÖ¡Š¡Ê¥â¥Ç¥ëŸå€Î¡Ë³ä¹þ€ßÍ¥ÀèÅÙ¥Þ¥¹¥¯Á޲òœüŸõÂրǞƀӜЀµ€Ê
433 *  €±€ì€Ð€Ê€é€Ê€€¡¥
434 */
435extern void     dispatch(void);
436
437/*
438 *  ¥Ç¥£¥¹¥Ñ¥Ã¥Á¥ã€Îưºî³«»Ï
439 *
440 *  start_dispatch€òreturn€Ë¥Þ¥¯¥íÄêµÁ€¹€ë€³€È€Ç¡€¥«¡Œ¥Í¥ë€ÎœéŽü²œŽ°Î»
441 *  žå€Ësta_ker€«€émain€Ë¥ê¥¿¡Œ¥ó€µ€»¡€¥·¥°¥Ê¥ë¥¹¥¿¥Ã¥¯€«€éžµ€Î¥¹¥¿¥Ã¥¯
442 *  €ËÌ္¡¥
443 */
444#define start_dispatch()        return
445
446/*
447 *  žœºß€Î¥³¥ó¥Æ¥­¥¹¥È€òŒÎ€Æ€Æ¥Ç¥£¥¹¥Ñ¥Ã¥Á
448 *
449 *  exit_and_dispatch€Ï¡€ext_tsk€«€éžÆ€ÓœÐ€¹€Ù€­€â€Î€Ç¡€¥¿¥¹¥¯¥³¥ó¥Æ¥­
450 *  ¥¹¥È¡ŠCPU¥í¥Ã¥¯ŸõÂÖ¡Š¥Ç¥£¥¹¥Ñ¥Ã¥Áµö²ÄŸõÂÖ¡Š¡Ê¥â¥Ç¥ëŸå€Î¡Ë³ä¹þ€ßÍ¥Àè
451 *  ÅÙ¥Þ¥¹¥¯Á޲òœüŸõÂրǞƀӜЀµ€Ê€±€ì€Ð€Ê€é€Ê€€¡¥
452 */
453extern void     exit_and_dispatch(void);
454
455/*
456 *  ³ä¹þ€ß¥Ï¥ó¥É¥éœÐžýœèÍý
457 */
458extern void     ret_int(void);
459
460/*
461 *  CPUÎã³°¥Ï¥ó¥É¥éœÐžýœèÍý
462 */
463extern void     ret_exc(void);
464
465/*
466 *  ¥«¡Œ¥Í¥ë€ÎœªÎ»œèÍý€ÎžÆœÐ€·
467 *
468 *  call_exit_kernel€Ï¡€¥«¡Œ¥Í¥ë€ÎœªÎ»»þ€ËžÆ€ÓœÐ€¹€Ù€­€â€Î€Ç¡€È󥿥¹¥¯
469 *  ¥³¥ó¥Æ¥­¥¹¥È€ËÀڀꎹ€š€Æ¡€¥«¡Œ¥Í¥ë€ÎœªÎ»œèÍý¡Êexit_kernel¡Ë€òžÆ€ÓœÐ
470 *  €¹¡¥
471 */
472extern void call_exit_kernel(void) NoReturn;
473
474/*
475 *  ¥¿¥¹¥¯¥³¥ó¥Æ¥­¥¹¥È€ÎœéŽü²œ
476 *
477 *  ¥¿¥¹¥¯€¬µÙ»ßŸõÂÖ€«€éŒÂ¹Ô€Ç€­€ëŸõÂր˰ܹԀ¹€ë»þ€ËžÆ€Ð€ì€ë¡¥€³€Î»þÅÀ
478 *  €Ç¥¹¥¿¥Ã¥¯Îΰè€ò»È€Ã€Æ€Ï€Ê€é€Ê€€¡¥
479 *
480 *  activate_context€ò¡€¥€¥ó¥é¥€¥óŽØ¿ô€Ç€Ï€Ê€¯¥Þ¥¯¥íÄêµÁ€È€·€Æ€€€ë€Î€Ï¡€
481 *  €³€Î»þÅÀ€Ç€ÏTCB€¬ÄêµÁ€µ€ì€Æ€€€Ê€€€¿€á€Ç€¢€ë¡¥
482 *
483 *  Intel¥×¥í¥»¥Ã¥µ€Ç€Ï¡€¥¹¥¿¥Ã¥¯€Ï16¥Ó¥Ã¥È¶­³Š€Ë¥¢¥é¥€¥ó€·€Æ€€€Ê€±€ì€Ð
484 *  €Ê€é€Ê€€¡¥
485 */
486extern void     start_r(void);
487
488#define activate_context(p_tcb)                                                                                 \
489{                                                                                                                                               \
490        ((intptr_t *) &((p_tcb)->tskctxb.env))[JMPBUF_PC]                                       \
491                                                                                        = (intptr_t) start_r;           \
492        ((intptr_t *) &((p_tcb)->tskctxb.env))[JMPBUF_SP]                                       \
493                                                = ((((intptr_t)((char *)((p_tcb)->p_tinib->stk) \
494                                                                + (p_tcb)->p_tinib->stksz)) & ~0x0f)    \
495                                                                - TASK_STACK_MERGIN);                                   \
496}
497
498/*
499 *  ³ä¹þ€ß¥Ï¥ó¥É¥éÈÖ¹æ€ÈCPUÎã³°¥Ï¥ó¥É¥éÈÖ¹æ€ÎÈϰπÎÈœÄê
500 */
501#define VALID_INHNO_DEFINH(inhno)               VALID_INTNO((INTNO)(inhno))
502#define VALID_EXCNO_DEFEXC(excno)               VALID_INTNO((INTNO)(excno))
503
504/*
505 *  ³ä¹þ€ß¥Ï¥ó¥É¥é€ÎÀßÄê
506 *
507 *  ¥Ù¥¯¥È¥ëÈÖ¹æinhno€Î³ä¹þ€ß¥Ï¥ó¥É¥é€ÎœÐÆþžýœèÍý€ÎÈÖÃÏ€òint_entry€Ë¡€
508 *  ³ä¹þ€ßÍ¥ÀèÅÙ€òintpri€ËÀßÄꀹ€ë¡¥
509 */
510Inline void
511x_define_inh(INHNO inhno, FP int_entry, PRI intpri)
512{
513        struct sigaction        sigact;
514
515        assert(VALID_INHNO_DEFINH(inhno));
516        sigact.sa_handler = (void (*)(int))(int_entry);
517        sigact.sa_flags = SA_ONSTACK;
518        sigassignset(&(sigact.sa_mask), &(sigmask_table[-intpri]));
519        sigaddset(&(sigact.sa_mask), SIGUSR2);
520        sigaction(inhno, &sigact, NULL);
521}
522
523/*
524 *  CPUÎã³°¥Ï¥ó¥É¥é€ÎÀßÄê
525 *
526 *  ¥Ù¥¯¥È¥ëÈÖ¹æexcno€ÎCPUÎã³°¥Ï¥ó¥É¥é€ÎœÐÆþžýœèÍý€ÎÈÖÃÏ€òexc_entry€ËÀß
527 *  Äꀹ€ë¡¥
528 *
529 *  SA_NODEFER€Ë€è€ê¡€¥·¥°¥Ê¥ë¥Ï¥ó¥É¥é€Îµ¯Æ°»þ€Ë¡€€œ€Î¥·¥°¥Ê¥ë€ò¥Þ¥¹¥¯
530 *  €¹€ë€Î€òÍ޻߀·€Æ€€€ë¡¥
531 */
532Inline void
533x_define_exc(EXCNO excno, FP exc_entry)
534{
535        struct sigaction        sigact;
536
537        assert(VALID_EXCNO_DEFEXC(excno));
538        sigact.sa_sigaction =
539                                (void (*)(int, struct __siginfo *, void *))(exc_entry);
540        sigact.sa_flags = (SA_ONSTACK | SA_SIGINFO | SA_NODEFER);
541        sigemptyset(&(sigact.sa_mask));
542        sigaddset(&(sigact.sa_mask), SIGUSR2);
543        sigaction(excno, &sigact, NULL);
544}
545
546/*
547 *  ¥ª¡Œ¥Ð¥é¥ó¥Ï¥ó¥É¥éÄä»ß€Î€¿€á€Î¥Þ¥¯¥í
548 */
549#ifdef TOPPERS_SUPPORT_OVRHDR
550#define OVRTIMER_STOP() {                               \
551                        i_lock_cpu();                           \
552                        _kernel_ovrtimer_stop();        \
553                        i_unlock_cpu();                         \
554                }
555#else /* TOPPERS_SUPPORT_OVRHDR */
556#define OVRTIMER_STOP()
557#endif /* TOPPERS_SUPPORT_OVRHDR */
558
559/*
560 *  ³ä¹þ€ß¥Ï¥ó¥É¥é€ÎÆþžýœèÍý€ÎÀžÀ®¥Þ¥¯¥í
561 */
562#define INT_ENTRY(inhno, inthdr)        _kernel_##inthdr##_##inhno
563
564#define INTHDR_ENTRY(inhno, inthdr, intpri)                                             \
565void _kernel_##inthdr##_##inhno(void)                                                   \
566{                                                                                                                               \
567        PRI             saved_ipm;                                                                                      \
568                                                                                                                                \
569        saved_ipm = _kernel_ipm_value;                                                          \
570        _kernel_ipm_value = intpri;                                                                     \
571        OVRTIMER_STOP();                                                                                        \
572        LOG_INH_ENTER(inhno);                                                                           \
573        inthdr();                       /* ³ä¹þ€ß¥Ï¥ó¥É¥é€òžÆ€ÓœÐ€¹ */                  \
574        LOG_INH_LEAVE(inhno);                                                                           \
575        _kernel_ret_int();      /* ³ä¹þ€ß¥Ï¥ó¥É¥éœÐžýœèÍý€òžÆ€ÓœÐ€¹ */  \
576        _kernel_ipm_value = saved_ipm;                                                          \
577        _kernel_lock_flag = false;                                                                      \
578}
579
580/*
581 *  CPUÎã³°¥Ï¥ó¥É¥é€ÎÆþžýœèÍý€ÎÀžÀ®¥Þ¥¯¥í
582 */
583#define EXC_ENTRY(excno, exchdr)        _kernel_##exchdr##_##excno
584
585#define EXCHDR_ENTRY(excno, excno_num, exchdr)                                                  \
586void _kernel_##exchdr##_##excno(int sig,                                                                \
587                                                struct __siginfo *p_info, void *p_ctx)                  \
588{                                                                                                                                               \
589        bool_t          saved_lock_flag;                                                                                \
590                                                                                                                                                \
591        saved_lock_flag = _kernel_lock_flag;                                                            \
592        if (exc_sense_nonkernel(p_ctx)) {                                                                       \
593                /* ¥«¡Œ¥Í¥ëŽÉÍý³°€ÎCPUÎã³°¥Ï¥ó¥É¥é€ÎŸì¹ç */                                             \
594                exchdr(p_ctx);                  /* CPUÎã³°¥Ï¥ó¥É¥é€òžÆ€ÓœÐ€¹ */                 \
595        }                                                                                                                                       \
596        else {                                                                                                                          \
597                /* ¥«¡Œ¥Í¥ëŽÉÍý€ÎCPUÎã³°¥Ï¥ó¥É¥é€ÎŸì¹ç */                                               \
598                OVRTIMER_STOP();                                                                                                \
599                LOG_EXC_ENTER(excno);                                                                                   \
600                exchdr(p_ctx);                  /* CPUÎã³°¥Ï¥ó¥É¥é€òžÆ€ÓœÐ€¹ */                 \
601                LOG_EXC_LEAVE(excno);                                                                                   \
602                _kernel_ret_exc();              /* CPUÎã³°¥Ï¥ó¥É¥éœÐžýœèÍý€òžÆ€ÓœÐ€¹ */ \
603        }                                                                                                                                       \
604        _kernel_lock_flag = saved_lock_flag;                                                            \
605}
606
607/*
608 *  CPUÎã³°€ÎȯÀž€·€¿»þ€Î¥³¥ó¥Æ¥­¥¹¥È€Î»²ŸÈ
609 *
610 *  CPUÎã³°€ÎȯÀž€·€¿»þ€Î¥³¥ó¥Æ¥­¥¹¥È€¬¡€¥¿¥¹¥¯¥³¥ó¥Æ¥­¥¹¥È€Î»þ€Ëfalse¡€
611 *  €œ€Š€Ç€Ê€€»þ€Ëtrue€òÊÖ€¹¡¥
612 */
613Inline bool_t
614exc_sense_context(void *p_excinf)
615{
616        return(((ucontext_t *) p_excinf)->uc_onstack != 0);
617}
618
619/*
620 *  ¥«¡Œ¥Í¥ëŽÉÍý³°€ÎCPUÎã³°€ÎÈœÊÌ
621 *
622 *  ¥«¡Œ¥Í¥ëŽÉÍý³°€ÎCPUÎã³°€Î»þ€Ëtrue¡€€œ€Š€Ç€Ê€€»þ€Ëfalse€òÊÖ€¹¡¥
623 */
624Inline bool_t
625exc_sense_nonkernel(void *p_excinf)
626{
627        sigset_t        sigmask;
628
629        sigassignset(&sigmask, &(((ucontext_t *) p_excinf)->uc_sigmask));
630        return(sigismember(&sigmask, SIGUSR2));
631}
632
633/*
634 *  CPUÎã³°€ÎȯÀž€·€¿»þ€Î¥³¥ó¥Æ¥­¥¹¥È€È³ä¹þ€ß€Î¥Þ¥¹¥¯ŸõÂրλ²ŸÈ
635 *
636 *  CPUÎã³°€ÎȯÀž€·€¿»þ€Î¥·¥¹¥Æ¥àŸõÂÖ€¬¡€¥«¡Œ¥Í¥ëŒÂ¹ÔÃæ€Ç€Ê€¯¡€¥¿¥¹¥¯¥³
637 *  ¥ó¥Æ¥­¥¹¥È€Ç€¢€ê¡€Á޳ä¹þ€ß¥í¥Ã¥¯ŸõÂրǀʀ¯¡€CPU¥í¥Ã¥¯ŸõÂրǀʀ¯¡€³ä
638 *  ¹þ€ßÍ¥ÀèÅÙ¥Þ¥¹¥¯Á޲òœüŸõÂրǀ¢€ë»þ€Ëtrue¡€€œ€Š€Ç€Ê€€»þ€Ëfalse€òÊÖ€¹
639 *  ¡ÊCPUÎã³°€¬¥«¡Œ¥Í¥ëŽÉÍý³°€Î³ä¹þ€ßœèÍýÃæ€ÇȯÀž€·€¿Ÿì¹ç€Ë€âfalse€òÊÖ
640 *  €¹¡Ë¡¥
641 */
642Inline bool_t
643exc_sense_intmask(void *p_excinf)
644{
645        return(!exc_sense_context(p_excinf) && !exc_sense_nonkernel(p_excinf)
646                                                                                                && ipm_value == TIPM_ENAALL);
647}
648
649/*
650 *  ¥¿¡Œ¥²¥Ã¥È¥·¥¹¥Æ¥à°Íž€ÎœéŽü²œ
651 */
652extern void     target_initialize(void);
653
654/*
655 *  ¥¿¡Œ¥²¥Ã¥È¥·¥¹¥Æ¥à€ÎœªÎ»
656 *
657 *  ¥·¥¹¥Æ¥à€òœªÎ»€¹€ë»þ€Ë»È€Š¡¥
658 */
659extern void     target_exit(void) NoReturn;
660
661#endif /* TOPPERS_MACRO_ONLY */
662
663/*
664 *  ¥«¡Œ¥Í¥ë€Î³ä€êÉÕ€±€ë¥á¥â¥êÎΰè€ÎŽÉÍý
665 *
666 *  target_config.c€Ë¡€TLSF¡Ê¥ª¡Œ¥×¥ó¥œ¡Œ¥¹€Î¥á¥â¥êŽÉÍý¥é¥€¥Ö¥é¥ê¡Ë€òÍÑ
667 *  €€€¿¥á¥â¥êŽÉÍý¥ë¡Œ¥Á¥ó€òŽÞ€á€Æ€€€ë¡¥
668 */
669#define OMIT_KMM_ALLOCONLY
670
671#endif /* TOPPERS_TARGET_CONFIG_H */
詳しい使い方は TracBrowser を参照してください。