source: target/macosx_gcc/target_config.c

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

TOPPERS/ASP 1.9.1

ファイルサイズ: 11.5 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-2011 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
45#include "kernel_impl.h"
46#include "task.h"
47
48/*
49 *  ¥È¥ì¡Œ¥¹¥í¥°¥Þ¥¯¥í€Î¥Ç¥Õ¥©¥ë¥ÈÄêµÁ
50 */
51#ifndef LOG_DSP_ENTER
52#define LOG_DSP_ENTER(p_tcb)
53#endif /* LOG_DSP_ENTER */
54
55#ifndef LOG_DSP_LEAVE
56#define LOG_DSP_LEAVE(p_tcb)
57#endif /* LOG_DSP_LEAVE */
58
59/*
60 *  TMIN_INTPRI€ÎÈϰπΥÁ¥§¥Ã¥¯
61 */
62#if (TMIN_INTPRI > -1) || (-6 > TMIN_INTPRI)
63#error TMIN_INTPRI out of range.
64#endif /* (TMIN_INTPRI > -1) || (-6 > TMIN_INTPRI) */
65
66/*
67 *  ³ä¹þ€ß¥í¥Ã¥¯¡¿CPU¥í¥Ã¥¯€Ø€Î°Ü¹Ô€Ç¥Þ¥¹¥¯€¹€ë¥·¥°¥Ê¥ë€òÊÝ»ý€¹€ëÊÑ¿ô
68 */
69sigset_t        sigmask_intlock;        /* ³ä¹þ€ß¥í¥Ã¥¯€Ç¥Þ¥¹¥¯€¹€ë¥·¥°¥Ê¥ë */
70sigset_t        sigmask_cpulock;        /* CPU¥í¥Ã¥¯€Ç¥Þ¥¹¥¯€¹€ë¥·¥°¥Ê¥ë */
71
72/*
73 *  CPU¥í¥Ã¥¯¥Õ¥é¥°ŒÂžœ€Î€¿€á€ÎÊÑ¿ô
74 */
75volatile bool_t         lock_flag;              /* CPU¥í¥Ã¥¯¥Õ¥é¥°€òÉœ€¹ÊÑ¿ô */
76volatile sigset_t       saved_sigmask;  /* ¥·¥°¥Ê¥ë¥Þ¥¹¥¯€òÊÝž€¹€ëÊÑ¿ô */
77
78/*
79 *  ³ä¹þ€ßÍ¥ÀèÅÙ¥Þ¥¹¥¯ŒÂžœ€Î€¿€á€ÎÊÑ¿ô
80 */
81volatile PRI            ipm_value;              /* ³ä¹þ€ßÍ¥ÀèÅÙ¥Þ¥¹¥¯€òÉœ€¹ÊÑ¿ô */
82
83/*
84 *  ³ä¹þ€ßÍ×µá¶Ø»ß¥Õ¥é¥°ŒÂžœ€Î€¿€á€ÎÊÑ¿ô
85 */
86volatile sigset_t       sigmask_disint; /* žÄỀ˥ޥ¹¥¯€·€Æ€€€ë¥·¥°¥Ê¥ë */
87
88/*
89 *  ¥Ç¥£¥¹¥Ñ¥Ã¥Á¥ãËÜÂ΀γä¹þ€ßÂÔ€ÁÃæ€Ç€¢€ë€³€È€òŒš€¹ÊÑ¿ô
90 */
91static bool_t   dispatcher_idle;        /* ³ä¹þ€ßÂÔ€ÁÃæ€Ç€¢€ë */
92
93/*
94 *  ¥Ç¥£¥¹¥Ñ¥Ã¥Á¥ãËÜÂÎ
95 *
96 *  LOG_DSP_ENTER€ÈLOG_DSP_LEAVE€ò¡€dispatcher€ËÆþ€ì€º¡€€³€ì€òžÆ€ÓœÐ€¹
97 *  ŽØ¿ô€ÎŠ€ËÆþ€ì€Æ€€€ëÍýͳ€ÏŒ¡€ÎÄ̀ꡥLOG_DSP_ENTER€Ï¡€¥Ç¥£¥¹¥Ñ¥Ã¥Á€Î
98 *  ưºî³«»Ï»þ¡Êmain€«€éžÆ€Ð€ì€¿»þ¡Ë€Ë€Ï¡€žÆ€ÓœÐ€·€Æ€Ï€Ê€é€Ê€€€¿€á¡€
99 *  dispatcher€ËÆþ€ì€ë€³€È€¬€Ç€­€Ê€€¡¥LOG_DSP_LEAVE€Ï¡€ÀÚŽ¹€šžå€Î¥¿¥¹¥¯
100 *  €Î¥¹¥¿¥Ã¥¯€ÇžÆ€ÓœÐ€µ€Ê€±€ì€Ð€Ê€é€Ê€€€¿€á¡€_longjmp€òŒÂ¹Ô€·€¿žå€ËžÆ
101 *  €ÓœÐ€¹É¬Í×€¬€¢€ê¡€dispatcher€òžÆ€ÓœÐ€¹ŽØ¿ô€ÎŠ€ËÆþ€ì€Ê€±€ì€Ð€Ê€é€Ê
102 *  €€¡¥
103 */
104static void
105dispatcher(void)
106{
107        sigset_t        sigmask;
108
109        while ((p_runtsk = p_schedtsk) == NULL) {
110                /*
111                 *  CPU¥í¥Ã¥¯ŸõÂÖ€ò²òœü€¹€ëœàÈ÷€ò€¹€ë¡¥sigmask€Ë€Ï¡€CPU¥í¥Ã¥¯Ÿõ
112                 *  Âր˰ܹԀ¹€ëÁ°€Î¥·¥°¥Ê¥ë¥Þ¥¹¥¯€òŒè€êœÐ€¹¡¥
113                 */
114                lock_flag = false;
115                sigassignset(&sigmask, &saved_sigmask);
116                do {
117                        /*
118                         *  ³ä¹þ€ßÂÔ€Á€ÎŽÖ€ËȯÀž€·€¿³ä¹þ€ß¥Ï¥ó¥É¥é€Ç€ÏSIGUSR2€ò
119                         *  raise€·€Ê€€€è€Š€Ë¡€dispatcher_idle€òtrue€Ë€¹€ë¡¥
120                         */
121                        dispatcher_idle = true;
122                        sigsuspend(&sigmask);                   /* ³ä¹þ€ßÂÔ€Á */
123                        dispatcher_idle = false;
124                } while (!reqflg);
125                reqflg = false;
126
127                /*
128                 *  CPU¥í¥Ã¥¯ŸõÂÖ€ËÌ္¡¥³ä¹þ€ßÂÔ€Á€ÎŽÖ€ËŒÂ¹Ô€·€¿³ä¹þ€ß¥Ï¥ó¥É¥é
129                 *  €Ë€è€ê¡€saved_sigmask€Ïœñ€­Ž¹€ï€ë²ÄÇœÀ­€¬€¢€ë€¿€á¡€žµ€ÎÃÍ€Ë
130                 *  Ì္ɬÍ×€¬€¢€ë¡¥
131                 */
132                sigassignset(&saved_sigmask, &sigmask);
133                lock_flag = true;
134        }
135        _longjmp(p_runtsk->tskctxb.env, 1);
136}
137
138/*
139 *  ºÇ¹âÍ¥Àèœç°Ì¥¿¥¹¥¯€Ø€Î¥Ç¥£¥¹¥Ñ¥Ã¥Á
140 */
141void
142dispatch(void)
143{
144#ifdef TOPPERS_SUPPORT_OVRHDR
145        ovrtimer_stop();                                        /* ¥ª¡Œ¥Ð¥é¥ó¥¿¥€¥Þ€ÎÄä»ß */
146#endif /* TOPPERS_SUPPORT_OVRHDR */
147        if (_setjmp(p_runtsk->tskctxb.env) == 0) {
148                LOG_DSP_ENTER(p_runtsk);
149                dispatcher();
150                assert(0);
151        }
152        LOG_DSP_LEAVE(p_runtsk);
153#ifdef TOPPERS_SUPPORT_OVRHDR
154        ovrtimer_start();                                       /* ¥ª¡Œ¥Ð¥é¥ó¥¿¥€¥Þ€Îưºî³«»Ï */
155#endif /* TOPPERS_SUPPORT_OVRHDR */
156        calltex();
157}
158
159/*
160 *  ºÇ¹âÍ¥Àèœç°Ì¥¿¥¹¥¯€Ø€Î¥Ç¥£¥¹¥Ñ¥Ã¥Á¡Ê¥·¥°¥Ê¥ë¥Ï¥ó¥É¥éÍÑ¡Ë
161 */
162static void
163dispatch_handler(int sig, struct __siginfo *p_info, void *p_ctx)
164{
165#ifdef TOPPERS_SUPPORT_OVRHDR
166        /*
167         *  ¥ª¡Œ¥Ð¥é¥ó¥Ï¥ó¥É¥éµ¡Çœ€ò¥µ¥Ý¡Œ¥È€¹€ëŸì¹ç€Ë€Ï¡€dispatch_handler
168         *  €Ïɬ€ºµ¯Æ°€µ€ì€ë¡¥¥Ç¥£¥¹¥Ñ¥Ã¥Á€¬É¬Í׀ʀ€Ÿì¹ç€Ë€Ï¡€¥ª¡Œ¥Ð¥é¥ó¥Ï
169         *  ¥ó¥É¥é€Îưºî³«»Ï€Î€ß€ò¹Ô€Š¡¥
170         */
171        if (!(!dispatcher_idle && reqflg)) {
172                ovrtimer_start();                               /* ¥ª¡Œ¥Ð¥é¥ó¥¿¥€¥Þ€Îưºî³«»Ï */
173                return;
174        }
175        reqflg = false;
176#endif /* TOPPERS_SUPPORT_OVRHDR */
177
178        /*
179         *  ¥·¥°¥Ê¥ë¥Ï¥ó¥É¥é€ÎŒÂ¹Ô³«»ÏÁ°€Î¥·¥°¥Ê¥ë¥Þ¥¹¥¯€òsaved_sigmask€ËÂå
180         *  Æþ€·¡€CPU¥í¥Ã¥¯ŸõÂր˰ܹԀ¹€ë¡¥
181         */
182        sigassignset(&saved_sigmask, &(((ucontext_t *) p_ctx)->uc_sigmask));
183        lock_flag = true;
184
185        if (dspflg && p_runtsk != p_schedtsk) {
186                if (_setjmp(p_runtsk->tskctxb.env) == 0) {
187                        LOG_DSP_ENTER(p_runtsk);
188                        dispatcher();
189                        assert(0);
190                }
191                LOG_DSP_LEAVE(p_runtsk);
192        }
193#ifdef TOPPERS_SUPPORT_OVRHDR
194        ovrtimer_start();                                       /* ¥ª¡Œ¥Ð¥é¥ó¥¿¥€¥Þ€Îưºî³«»Ï */
195#endif /* TOPPERS_SUPPORT_OVRHDR */
196        calltex();
197
198        /*
199         *  ¥·¥°¥Ê¥ë¥Ï¥ó¥É¥é€«€é€Î¥ê¥¿¡Œ¥óžå€Î¥·¥°¥Ê¥ë¥Þ¥¹¥¯€¬saved_sigmask
200         *  €Ë€Ê€ë€è€Š€ËÀßÄꀷ¡€CPU¥í¥Ã¥¯ŸõÂÖ€ò²òœü€¹€ë¡¥
201         */
202        lock_flag = false;
203        sigassignset(&(((ucontext_t *) p_ctx)->uc_sigmask), &saved_sigmask);
204}
205
206/*
207 *  žœºß€Î¥³¥ó¥Æ¥­¥¹¥È€òŒÎ€Æ€Æ¥Ç¥£¥¹¥Ñ¥Ã¥Á
208 */
209void
210exit_and_dispatch(void)
211{
212        LOG_DSP_ENTER(p_runtsk);
213        dispatcher();
214        assert(0);
215}
216
217/*
218 *  ³ä¹þ€ß¥Ï¥ó¥É¥éœÐžýœèÍý
219 *
220 *  ³ä¹þ€ß¥Ï¥ó¥É¥éÃæ€Ç€Ï¡€¥«¡Œ¥Í¥ëŽÉÍý€Î³ä¹þ€ß€ò¶Ø»ß€·€Æ€€€ë€¿€á¡€œÐžý
221 *  œèÍý€Ç³ä¹þ€ß€ò¶Ø»ß€¹€ëɬÍ׀πʀ€¡¥
222 */
223void
224ret_int(void)
225{
226#ifndef TOPPERS_SUPPORT_OVRHDR
227        /*
228         *  ¥Ç¥£¥¹¥Ñ¥Ã¥Á¥ã€Îµ¯Æ°€òÍ׵္€ë¡¥
229         *
230         *  reqflg€ò¥Á¥§¥Ã¥¯€·€¿ÄŸžå€Ë³ä¹þ€ß€¬Æþ€Ã€Æ€â¡€Æþ€Ã€¿ÂŠ€Î³ä¹þ€ß€Ç
231         *  ¥¿¥¹¥¯¥Ç¥£¥¹¥Ñ¥Ã¥Á¥ã€Îµ¯Æ°€òÍ׵္€ë€¿€á¡€reqflg€ò¥Á¥§¥Ã¥¯€¹€ë
232         *  Á°€Ë³ä¹þ€ß€ò¶Ø»ß€¹€ëɬÍ×€¬€Ê€€¡¥
233         */
234        if (!dispatcher_idle && reqflg) {
235                reqflg = false;
236                raise(SIGUSR2);
237        }
238#else /* TOPPERS_SUPPORT_OVRHDR */
239        /*
240         *  ¥ª¡Œ¥Ð¥é¥ó¥Ï¥ó¥É¥éµ¡Çœ€ò¥µ¥Ý¡Œ¥È€¹€ëŸì¹ç€Ë€Ï¡€¥ª¡Œ¥Ð¥é¥ó¥¿¥€¥Þ
241         *  €òưºî³«»Ï€¹€ë€¿€á€Ë¡€dispatch_handler€òɬ€ºµ¯Æ°€¹€ë¡¥
242         */
243        raise(SIGUSR2);
244#endif /* TOPPERS_SUPPORT_OVRHDR */
245}
246
247/*
248 *  CPUÎã³°¥Ï¥ó¥É¥éœÐžýœèÍý
249 */
250void
251ret_exc(void)
252{
253#ifndef TOPPERS_SUPPORT_OVRHDR
254        /*
255         *  ¥Ç¥£¥¹¥Ñ¥Ã¥Á¥ã€Îµ¯Æ°€òÍ׵္€ë¡¥
256         *
257         *  reqflg€ò¥Á¥§¥Ã¥¯€·€¿ÄŸžå€Ë³ä¹þ€ß€¬Æþ€Ã€Æ€â¡€Æþ€Ã€¿ÂŠ€Î³ä¹þ€ß€Ç
258         *  ¥¿¥¹¥¯¥Ç¥£¥¹¥Ñ¥Ã¥Á¥ã€Îµ¯Æ°€òÍ׵္€ë€¿€á¡€reqflg€ò¥Á¥§¥Ã¥¯€¹€ë
259         *  Á°€Ë³ä¹þ€ß€ò¶Ø»ß€¹€ëɬÍ×€¬€Ê€€¡¥
260         */
261        if (!dispatcher_idle && reqflg) {
262                reqflg = false;
263                raise(SIGUSR2);
264        }
265#else /* TOPPERS_SUPPORT_OVRHDR */
266        /*
267         *  ¥ª¡Œ¥Ð¥é¥ó¥Ï¥ó¥É¥éµ¡Çœ€ò¥µ¥Ý¡Œ¥È€¹€ëŸì¹ç€Ë€Ï¡€¥ª¡Œ¥Ð¥é¥ó¥¿¥€¥Þ
268         *  €òưºî³«»Ï€¹€ë€¿€á€Ë¡€dispatch_handler€òɬ€ºµ¯Æ°€¹€ë¡¥
269         */
270        raise(SIGUSR2);
271#endif /* TOPPERS_SUPPORT_OVRHDR */
272}
273
274/*
275 *  ¥«¡Œ¥Í¥ë€ÎœªÎ»œèÍý€ÎžÆœÐ€·
276 */
277void
278call_exit_kernel(void)
279{
280        sigset_t                        sigmask;
281        struct sigaction        sigact;
282
283        /*
284         *  SIGUSR2€Î¥·¥°¥Ê¥ë¥Ï¥ó¥É¥é€Ëexit_kernel€òÅÐÏ¿
285         */
286        sigact.sa_handler = (void (*)(int)) exit_kernel;
287        sigact.sa_flags = SA_ONSTACK;
288        sigemptyset(&(sigact.sa_mask));
289        sigaction(SIGUSR2, &sigact, NULL);
290
291        /*
292         *  SIGUSR2€Î¥Þ¥¹¥¯€ò²òœü
293         */
294        sigemptyset(&sigmask);
295        sigaddset(&sigmask, SIGUSR2);
296        sigprocmask(SIG_UNBLOCK, &sigmask, NULL);
297
298        /*
299         *  exit_kernel€ÎžÆœÐ€·
300         */
301        raise(SIGUSR2);
302        assert(0);
303        while (true);
304}
305
306/*
307 *  ¥¿¥¹¥¯³«»Ï»þœèÍý
308 */
309void
310start_r(void)
311{
312#ifdef TOPPERS_SUPPORT_OVRHDR
313        ovrtimer_start();                                       /* ¥ª¡Œ¥Ð¥é¥ó¥¿¥€¥Þ€Îưºî³«»Ï */
314#endif /* TOPPERS_SUPPORT_OVRHDR */
315        t_unlock_cpu();
316        (*(p_runtsk->p_tinib->task))(p_runtsk->p_tinib->exinf);
317        (void) ext_tsk();
318        assert(0);
319}
320
321/*
322 *  ¥¿¡Œ¥²¥Ã¥È°Íž€ÎœéŽü²œ
323 */
324void
325target_initialize(void)
326{
327        struct sigaction        sigact;
328
329        /*
330         *  ³ä¹þ€ß¥í¥Ã¥¯€Ø€Î°Ü¹Ô€Ç¥Þ¥¹¥¯€¹€ë¥·¥°¥Ê¥ë€òÊÝ»ý€¹€ëÊÑ¿ô€ÎœéŽü²œ
331         */
332        sigassignset(&sigmask_intlock, &(sigmask_table[6]));
333        sigaddset(&sigmask_intlock, SIGUSR2);
334
335        /*
336         *  CPU¥í¥Ã¥¯€Ø€Î°Ü¹Ô€Ç¥Þ¥¹¥¯€¹€ë¥·¥°¥Ê¥ë€òÊÝ»ý€¹€ëÊÑ¿ô€ÎœéŽü²œ
337         */
338        sigassignset(&sigmask_cpulock, &(sigmask_table[-TMIN_INTPRI]));
339        sigaddset(&sigmask_cpulock, SIGUSR2);
340
341        /*
342         *  CPU¥í¥Ã¥¯¥Õ¥é¥°ŒÂžœ€Î€¿€á€ÎÊÑ¿ô€ÎœéŽü²œ
343         *
344         *  saved_sigmask€Ï¡€¥«¡Œ¥Í¥ëµ¯Æ°»þ€ËžÆ€ÓœÐ€¹set_sigmask€ÇœéŽü²œ€µ
345         *  €ì€ë¡¥
346         */
347        lock_flag = true;
348
349        /*
350         *  ³ä¹þ€ßÍ¥ÀèÅÙ¥Þ¥¹¥¯ŒÂžœ€Î€¿€á€ÎÊÑ¿ô€ÎœéŽü²œ
351         */
352        ipm_value = TIPM_ENAALL;
353
354        /*
355         *  ³ä¹þ€ßÍ×µá¶Ø»ß¥Õ¥é¥°ŒÂžœ€Î€¿€á€ÎÊÑ¿ô€ÎœéŽü²œ
356         */
357        sigassignset(&sigmask_disint, &sigmask_disint_init);
358
359        /*
360         *  ¥Ç¥£¥¹¥Ñ¥Ã¥Á¥ãËÜÂ΀Υ¢¥€¥É¥ë¥ë¡Œ¥×Ãæ€Ç€¢€ë€³€È€òŒš€¹ÊÑ¿ô€ÎœéŽü²œ
361         */
362        dispatcher_idle = false;
363
364        /*
365         *  SIGUSR2€Î¥·¥°¥Ê¥ë¥Ï¥ó¥É¥é€Ë¥Ç¥£¥¹¥Ñ¥Ã¥Á¥ã€òÅÐÏ¿
366         */
367        sigact.sa_sigaction = dispatch_handler;
368        sigact.sa_flags = SA_SIGINFO;
369        sigassignset(&(sigact.sa_mask), &sigmask_cpulock);
370        sigaction(SIGUSR2, &sigact, NULL);
371}
372
373/*
374 *  ¥¿¡Œ¥²¥Ã¥È°Íž€ÎœªÎ»œèÍý
375 */
376void
377target_exit(void)
378{
379        /*
380         *  ¥×¥í¥»¥¹€ÎœªÎ»œèÍý
381         */
382        exit(0);
383}
384
385/*
386 *  ¥·¥¹¥Æ¥à¥í¥°€ÎÄã¥ì¥Ù¥ëœÐÎπ΀¿€á€ÎÊž»úœÐÎÏ
387 */
388void
389target_fput_log(char c)
390{
391        write(STDERR_FILENO, &c, 1);
392}
393
394/*
395 *  ³ä¹þ€ßŽÉÍýµ¡Çœ€ÎœéŽü²œ
396 */
397void
398initialize_interrupt(void)
399{
400        uint_t                  i;
401        const INHINIB   *p_inhinib;
402
403        for (i = 0; i < tnum_inhno; i++) {
404                p_inhinib = &(inhinib_table[i]);
405                x_define_inh(p_inhinib->inhno, p_inhinib->int_entry,
406                                                                                                p_inhinib->intpri);
407        }
408}
409
410/*
411 *  ¥á¥€¥óŽØ¿ô
412 */
413int
414main()
415{
416        sigset_t                        sigmask;
417        stack_t                         ss;
418        struct sigaction        sigact;
419
420        /*
421         *  SIGUSR2°Ê³°€Î€¹€Ù€Æ€Î¥·¥°¥Ê¥ë€ò¥Þ¥¹¥¯
422         */
423        sigfillset(&sigmask);
424        sigdelset(&sigmask, SIGUSR2);
425        sigprocmask(SIG_BLOCK, &sigmask, NULL);
426
427        /*
428         *  ¥·¥°¥Ê¥ë¥¹¥¿¥Ã¥¯¡ÊÈ󥿥¹¥¯¥³¥ó¥Æ¥­¥¹¥ÈÍрΥ¹¥¿¥Ã¥¯¡Ë€ÎÀßÄê
429         */
430        ss.ss_sp = (char *)(istk);
431        ss.ss_size = (int)(istksz);
432        ss.ss_flags = 0;
433        sigaltstack(&ss, NULL);
434
435        /*
436         *  SIGUSR2€Î¥·¥°¥Ê¥ë¥Ï¥ó¥É¥é€Ësta_ker€òÅÐÏ¿
437         */
438        sigact.sa_handler = (void (*)(int)) sta_ker;
439        sigact.sa_flags = SA_ONSTACK;
440        sigemptyset(&(sigact.sa_mask));
441        sigaction(SIGUSR2, &sigact, NULL);
442
443        /*
444         *  sta_ker€ÎžÆœÐ€·
445         */
446        raise(SIGUSR2);
447
448        /*
449         *  ¥Ç¥£¥¹¥Ñ¥Ã¥Á¥ã€Îưºî³«»Ï
450         *
451         *  target_initialize€Ç¡€lock_flag€òtrue€Ë¡€ipm_value€òTIPM_ENAALL
452         *  €ËœéŽü²œ€·€Æ€€€ë€¿€á¡€set_sigmask€òžÆ€ÓœÐ€·€Æ¥·¥°¥Ê¥ë¥Þ¥¹¥¯€È
453         *  saved_sigmask€òÀßÄꀹ€ë€³€È€Ç¡€CPU¥í¥Ã¥¯ŸõÂÖ¡Š¡Ê¥â¥Ç¥ëŸå€Î¡Ë³ä
454         *  ¹þ€ßÍ¥ÀèÅÙ¥Þ¥¹¥¯€¬TIPM_ENAALL€ÎŸõÂրˀʀ롥
455         *
456         *  €Þ€¿¡€initialize_task€Çdisdsp€òfalse€ËœéŽü²œ€·€Æ€€€ë€¿€á¡€¥Ç¥£
457         *  ¥¹¥Ñ¥Ã¥Áµö²ÄŸõÂրˀʀÀƀ€€ë¡¥
458         */
459        set_sigmask();
460        dispatcher();
461        assert(0);
462        return(0);
463}
464
465/*
466 *  ¥«¡Œ¥Í¥ë€Î³ä€êÉÕ€±€ë¥á¥â¥êÎΰè€ÎŽÉÍý
467 *
468 *  TLSF¡Ê¥ª¡Œ¥×¥ó¥œ¡Œ¥¹€Î¥á¥â¥êŽÉÍý¥é¥€¥Ö¥é¥ê¡Ë€òÍÑ€€€ÆŒÂžœ¡¥
469 */
470#ifdef TOPPERS_SUPPORT_DYNAMIC_CRE
471
472#include "tlsf.h"
473
474static bool_t   tlsf_initialized = false;
475
476void
477initialize_kmm(void)
478{
479        if (init_memory_pool(kmmsz, kmm) >= 0) {
480                tlsf_initialized = true;
481        }
482}
483
484void *
485kernel_malloc(SIZE size)
486{
487        if (tlsf_initialized) {
488                return(malloc_ex(size, kmm));
489        }
490        else {
491                return(NULL);
492        }
493}
494
495void
496kernel_free(void *ptr)
497{
498        if (tlsf_initialized) {
499                free_ex(ptr, kmm);
500        }
501}
502
503#endif /* TOPPERS_SUPPORT_DYNAMIC_CRE */
詳しい使い方は TracBrowser を参照してください。