source: mypx/arch/m68k_gcc/prc_support.S @ 7

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

TOPPERS/ASP 1.9.1

ファイルサイズ: 15.3 KB
 
1/*
2 *  TOPPERS/ASP Kernel
3 *      Toyohashi Open Platform for Embedded Real-Time Systems/
4 *      Advanced Standard Profile Kernel
5 *
6 *  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
7 *                              Toyohashi Univ. of Technology, JAPAN
8 *  Copyright (C) 2005-2010 by Embedded and Real-Time Systems Laboratory
9 *              Graduate School of Information Science, Nagoya Univ., JAPAN
10 *
11 *  Ÿåµ­Ãøºîž¢ŒÔ€Ï¡€°Ê²Œ€Î(1)¡Á(4)€ÎŸò·ï€òËþ€¿€¹Ÿì¹ç€ËžÂ€ê¡€ËÜ¥œ¥Õ¥È¥Š¥§
12 *  ¥¢¡ÊËÜ¥œ¥Õ¥È¥Š¥§¥¢€ò²þÊÑ€·€¿€â€Î€òŽÞ€à¡¥°Ê²ŒÆ±€ž¡Ë€ò»ÈÍÑ¡ŠÊ£Àœ¡Š²þ
13 *  ÊÑ¡ŠºÆÇÛÉۡʰʲŒ¡€ÍøÍрȞƀ֡ˀ¹€ë€³€È€ò̵œþ€ÇµöÂú€¹€ë¡¥
14 *  (1) ËÜ¥œ¥Õ¥È¥Š¥§¥¢€ò¥œ¡Œ¥¹¥³¡Œ¥É€Î·Á€ÇÍøÍÑ€¹€ëŸì¹ç€Ë€Ï¡€Ÿåµ­€ÎÃøºî
15 *      ž¢ÉœŒš¡€€³€ÎÍøÍÑŸò·ï€ª€è€Ó²Œµ­€Î̵ÊÝŸÚµ¬Äꀬ¡€€œ€Î€Þ€Þ€Î·Á€Ç¥œ¡Œ
16 *      ¥¹¥³¡Œ¥ÉÃæ€ËŽÞ€Þ€ì€Æ€€€ë€³€È¡¥
17 *  (2) ËÜ¥œ¥Õ¥È¥Š¥§¥¢€ò¡€¥é¥€¥Ö¥é¥ê·ÁŒ°€Ê€É¡€ÂŸ€Î¥œ¥Õ¥È¥Š¥§¥¢³«È¯€Ë»È
18 *      Íрǀ­€ë·Á€ÇºÆÇÛÉÛ€¹€ëŸì¹ç€Ë€Ï¡€ºÆÇÛÉÛ€ËÈŒ€Š¥É¥­¥å¥á¥ó¥È¡ÊÍøÍÑ
19 *      ŒÔ¥Þ¥Ë¥å¥¢¥ë€Ê€É¡Ë€Ë¡€Ÿåµ­€ÎÃøºîž¢ÉœŒš¡€€³€ÎÍøÍÑŸò·ï€ª€è€Ó²Œµ­
20 *      €Î̵ÊÝŸÚµ¬Äê€ò·ÇºÜ€¹€ë€³€È¡¥
21 *  (3) ËÜ¥œ¥Õ¥È¥Š¥§¥¢€ò¡€µ¡Žï€ËÁȀ߹þ€à€Ê€É¡€ÂŸ€Î¥œ¥Õ¥È¥Š¥§¥¢³«È¯€Ë»È
22 *      Íрǀ­€Ê€€·Á€ÇºÆÇÛÉÛ€¹€ëŸì¹ç€Ë€Ï¡€Œ¡€Î€€€º€ì€«€ÎŸò·ï€òËþ€¿€¹€³
23 *      €È¡¥
24 *    (a) ºÆÇÛÉÛ€ËÈŒ€Š¥É¥­¥å¥á¥ó¥È¡ÊÍøÍьԥޥ˥奢¥ë€Ê€É¡Ë€Ë¡€Ÿåµ­€ÎÃø
25 *        ºîž¢ÉœŒš¡€€³€ÎÍøÍÑŸò·ï€ª€è€Ó²Œµ­€Î̵ÊÝŸÚµ¬Äê€ò·ÇºÜ€¹€ë€³€È¡¥
26 *    (b) ºÆÇÛÉۀηÁÂÖ€ò¡€ÊÌ€ËÄê€á€ëÊýË¡€Ë€è€Ã€Æ¡€TOPPERS¥×¥í¥ž¥§¥¯¥È€Ë
27 *        Êó¹ð€¹€ë€³€È¡¥
28 *  (4) ËÜ¥œ¥Õ¥È¥Š¥§¥¢€ÎÍøÍрˀè€êÄŸÀÜŪ€Þ€¿€ÏŽÖÀÜŪ€ËÀž€ž€ë€€€«€Ê€ë»
29 *      ³²€«€é€â¡€Ÿåµ­Ãøºîž¢ŒÔ€ª€è€ÓTOPPERS¥×¥í¥ž¥§¥¯¥È€òÌÈÀÕ€¹€ë€³€È¡¥
30 *      €Þ€¿¡€ËÜ¥œ¥Õ¥È¥Š¥§¥¢€Î¥æ¡Œ¥¶€Þ€¿€Ï¥š¥ó¥É¥æ¡Œ¥¶€«€é€Î€€€«€Ê€ëÍý
31 *      ͳ€ËŽð€Å€¯ÀÁµá€«€é€â¡€Ÿåµ­Ãøºîž¢ŒÔ€ª€è€ÓTOPPERS¥×¥í¥ž¥§¥¯¥È€ò
32 *      ÌÈÀÕ€¹€ë€³€È¡¥
33 *
34 *  ËÜ¥œ¥Õ¥È¥Š¥§¥¢€Ï¡€ÌµÊÝŸÚ€ÇÄó¶¡€µ€ì€Æ€€€ë€â€Î€Ç€¢€ë¡¥Ÿåµ­Ãøºîž¢ŒÔ€ª
35 *  €è€ÓTOPPERS¥×¥í¥ž¥§¥¯¥È€Ï¡€ËÜ¥œ¥Õ¥È¥Š¥§¥¢€ËŽØ€·€Æ¡€ÆÃÄê€Î»ÈÍÑÌÜŪ
36 *  €ËÂЀ¹€ëŬ¹çÀ­€âŽÞ€á€Æ¡€€€€«€Ê€ëÊÝŸÚ€â¹Ô€ï€Ê€€¡¥€Þ€¿¡€ËÜ¥œ¥Õ¥È¥Š¥§
37 *  ¥¢€ÎÍøÍрˀè€êÄŸÀÜŪ€Þ€¿€ÏŽÖÀÜŪ€ËÀž€ž€¿€€€«€Ê€ë»³²€ËŽØ€·€Æ€â¡€€œ
38 *  €ÎÀÕÇ€€òÉé€ï€Ê€€¡¥
39 *
40 *  $Id$
41 */
42
43/*
44 *              ¥×¥í¥»¥Ã¥µ°Íž¥â¥ž¥å¡Œ¥ë ¥¢¥»¥ó¥Ö¥êžÀžìÉô¡ÊM68040ÍÑ¡Ë
45 */
46
47#define TOPPERS_MACRO_ONLY
48#define UINT_C(val)                     (val)           /* uint_t·¿€ÎÄê¿ô€òºî€ë¥Þ¥¯¥í */
49#define ULONG_C(val)            (val)           /* ulong_t·¿€ÎÄê¿ô€òºî€ë¥Þ¥¯¥í */
50#define CAST(type, val)         (val)           /* ·¿¥­¥ã¥¹¥È€ò¹Ô€Š¥Þ¥¯¥í */
51#include "kernel_impl.h"
52#include "offset.h"
53
54/*
55 *  ¥¿¥¹¥¯¥Ç¥£¥¹¥Ñ¥Ã¥Á¥ã
56 */
57        .text
58        .globl dispatch
59dispatch:
60        /*
61         *  €³€Î¥ë¡Œ¥Á¥ó€Ï¡€¥¿¥¹¥¯¥³¥ó¥Æ¥­¥¹¥È¡ŠCPU¥í¥Ã¥¯ŸõÂÖ¡Š¥Ç¥£¥¹¥Ñ¥Ã¥Á
62         *  µö²ÄŸõÂÖ¡Š¡Ê¥â¥Ç¥ëŸå€Î¡Ë³ä¹þ€ßÍ¥ÀèÅÙ¥Þ¥¹¥¯Á޲òœüŸõÂրǞƀӜЀµ
63         *  €ì€ë¡¥
64         */
65        movem.l %d2-%d7/%a2-%a6, -(%sp)         /* ¥ì¥ž¥¹¥¿€òÊÝž */
66        move.l p_runtsk, %a0                            /* p_runtsk€òA0€Ë */
67        move.l %sp, TCB_msp(%a0)                        /* ¥¿¥¹¥¯¥¹¥¿¥Ã¥¯€òÊÝž */
68        move.l #dispatch_r, TCB_pc(%a0)         /* ŒÂ¹ÔºÆ³«ÈÖÃÏ€òÊÝž */
69        jbra dispatcher
70
71dispatch_r:
72        movem.l (%sp)+, %d2-%d7/%a2-%a6         /* ¥ì¥ž¥¹¥¿€òÉüµ¢ */
73        btst.b #TCB_enatex_bit, TCB_enatex(%a0)
74        jbeq dispatch_r_1                                       /* enatex€¬false€Ê€é¥ê¥¿¡Œ¥ó */
75        tst.l TCB_texptn(%a0)                           /* texptn€¬0€Ê€é¥ê¥¿¡Œ¥ó */
76        jbeq dispatch_r_1
77        tst.l ipmflg                                            /* ipmflg€¬true€Ç€¢€ì€Ð            */
78        jbne call_texrtn                                        /*  ¥¿¥¹¥¯Îã³°œèÍý¥ë¡Œ¥Á¥ó€ÎžÆœÐ€· */
79dispatch_r_1:
80        rts
81
82/*
83 *  ¥Ç¥£¥¹¥Ñ¥Ã¥Á¥ã€Îưºî³«»Ï¡Êprc_support.S¡Ë
84 */
85        .globl start_dispatch
86start_dispatch:
87        /*
88         *  €³€Î¥ë¡Œ¥Á¥ó€Ï¡€¥«¡Œ¥Í¥ëµ¯Æ°»þ€Ë¡€€¹€Ù€Æ€Î³ä¹þ€ß€ò¶Ø»ß€·€¿ŸõÂÖ
89         * ¡Ê³ä¹þ€ß¥í¥Ã¥¯ŸõÂÖ€ÈÆ±Åù¡Ë€ÇžÆ€ÓœÐ€µ€ì€ë¡¥€Þ€¿¡€³ä¹þ€ß¥â¡Œ¥É¡ÊÈó
90         *  ¥¿¥¹¥¯¥³¥ó¥Æ¥­¥¹¥È€ÈƱÅù¡Ë€ÇžÆ€ÓœÐ€µ€ì€ë€³€È€òÁÛÄꀷ€Æ€€€ë¡¥
91         *
92         *  prc_initialize€Ç¡€lock_flag€òtrue€Ë¡€saved_iipm€òIIPM_ENAALL€Ë
93         *  œéŽü²œ€·€Æ€€€ë€¿€á¡€¥«¡Œ¥Í¥ëŽÉÍý³°€Î³ä¹þ€ß€òµö²Ä€¹€ë€³€È€Ç¡€
94         *  CPU¥í¥Ã¥¯ŸõÂÖ¡Š¡Ê¥â¥Ç¥ëŸå€Î¡Ë³ä¹þ€ßÍ¥ÀèÅÙ¥Þ¥¹¥¯Á޲òœüŸõÂրˀʀ롥
95         *  €Þ€¿¡€initialize_task€Çdisdsp€òfalse€ËœéŽü²œ€·€Æ€€€ë€¿€á¡€¥Ç¥£
96         *  ¥¹¥Ñ¥Ã¥Áµö²ÄŸõÂրˀʀÀƀ€€ë¡¥
97         */
98#if TIPM_LOCK == -7
99        or.w #0x1000, %sr                                       /* ¥Þ¥¹¥¿¥â¡Œ¥É€Ë */
100#else /* TIPM_LOCK == -7 */
101        move.w %sr, %d0                                         /* ¥Þ¥¹¥¿¥â¡Œ¥É¡Š                */
102        and.w #~0x0700, %d0                                     /*  ¥«¡Œ¥Í¥ëŽÉÍý³°€Î³ä¹þ€ß€òµö²Ä */
103        or.w #(0x1000 | IIPM_LOCK), %d0
104        move.w %d0, %sr
105#endif /* TIPM_LOCK == -7 */
106        jbra dispatcher_0
107
108/*
109 *  žœºß€Î¥³¥ó¥Æ¥­¥¹¥È€òŒÎ€Æ€Æ¥Ç¥£¥¹¥Ñ¥Ã¥Á
110 */
111        .globl exit_and_dispatch
112exit_and_dispatch:
113        /* ¥Ç¥£¥¹¥Ñ¥Ã¥Á¥ãËÜÂΡÊdispatcher¡Ë€Ø */
114
115/*
116 *  ¥Ç¥£¥¹¥Ñ¥Ã¥Á¥ãËÜÂÎ
117 */
118dispatcher:
119        /*
120         *  €³€Î¥ë¡Œ¥Á¥ó€Ï¡€¥¿¥¹¥¯¥³¥ó¥Æ¥­¥¹¥È¡ŠCPU¥í¥Ã¥¯ŸõÂÖ¡Š¥Ç¥£¥¹¥Ñ¥Ã¥Á
121         *  µö²ÄŸõÂÖ¡Š¡Ê¥â¥Ç¥ëŸå€Î¡Ë³ä¹þ€ßÍ¥ÀèÅÙ¥Þ¥¹¥¯Á޲òœüŸõÂրǞƀӜЀµ
122         *  €ì€ë¡¥
123         *
124         *  €¹€Ê€ï€Á¡€¥Þ¥¹¥¿¥â¡Œ¥É¡Šlock_flag€¬true¡Šdisdsp€¬false¡Šdspflg
125         *  €¬true¡Šsaved_iipm€¬IIPM_ENAALL€È€Ê€Ã€Æ€€€ë¡¥ŒÂ¹ÔºÆ³«ÈÖÃπ؀″
126         *  €ÎŸõÂր΀ހÞʬŽô€¹€ë¡¥
127         */
128#ifdef LOG_DSP_ENTER
129        move.l p_runtsk, %d0                            /* p_runtsk€ò¥Ñ¥é¥á¡Œ¥¿€Ë */
130        move.l %d0, -(%sp)
131        jsr log_dsp_enter
132        addq.l #4, %sp
133#endif /* LOG_DSP_ENTER */
134dispatcher_0:
135        move.l p_schedtsk, %a0                          /* p_schedtsk€òp_runtsk€Ë */
136        move.l %a0, p_runtsk
137        jbeq dispatcher_1                                       /* p_runtsk€¬NULL€Ê€édispatcher_1€Ø */
138        move.l TCB_msp(%a0), %sp                        /* ¥¿¥¹¥¯¥¹¥¿¥Ã¥¯€òÉüµ¢ */
139#ifdef LOG_DSP_LEAVE
140        move.l %a0, -(%sp)                                      /* p_runtsk€ò¥Ñ¥é¥á¡Œ¥¿€Ë */
141        jsr log_dsp_leave
142        addq.l #4, %sp
143        move.l p_runtsk, %a0
144#endif /* LOG_DSP_LEAVE */
145        move.l TCB_pc(%a0), %a1                         /* ŒÂ¹ÔºÆ³«ÈÖÃÏ€ØÊ¬Žô */
146        jmp (%a1)
147dispatcher_1:
148        /*
149         *  CPU¥í¥Ã¥¯ŸõÂÖ€ò²òœü€¹€ëœàÈ÷€ò€¹€ë¡¥
150         */
151        move.w %sr, %d0                                         /* SR€òD0€ËÊÝž */
152        clr.l lock_flag                                         /* CPU¥í¥Ã¥¯²òœüŸõÂÖ€Ë */
153dispatcher_2:
154        /*
155         *  ³ä¹þ€ß€òµö²Ä€·¡€³ä¹þ€ß¥â¡Œ¥É€ËÀڀꎹ€š€Æ¡€³ä¹þ€ß€òÂԀġ¥
156         *
157         *  €³€³€Ç³ä¹þ€ß¥â¡Œ¥É€ËÀڀꎹ€š€ë€Î€Ï¡€€³€³€ÇȯÀž€¹€ë³ä¹þ€ßœèÍý€Ë
158         *  €É€Î¥¹¥¿¥Ã¥¯€ò»È€Š€«€È€€€ŠÌäÂê€Î²ò·è€È¡€³ä¹þ€ß¥Ï¥ó¥É¥éÆâ€Ç€Î¥¿
159         *  ¥¹¥¯¥Ç¥£¥¹¥Ñ¥Ã¥Á€ÎËɻ߀Ȁ€€Š2€Ä€Î°ÕÌ£€¬€¢€ë¡¥
160         *
161         *  ¥×¥í¥»¥Ã¥µ€ò³ä¹þ€ßÂÔ€Á€Ë°Ü¹Ô€µ€»€ëœèÍý€È¡€³ä¹þ€ßµö²Ä€È€Ï¡€ÉÔ²Ä
162         *  ʬ€Ë¹Ô€Ê€ŠÉ¬Í×€¬€¢€ë¡ÊM68040€Ç€ÏstopÌ¿Îá€ÇΟÊý¹Ô€Ê€Š€Î€ÇÌäÂê€Ê
163         *  €€¡Ë¡¥€³€ì€òÉÔ²Äʬ€Ë¹Ô€Ê€ï€Ê€€Ÿì¹ç¡€³ä¹þ€ß€òµö²Ä€·€¿ÄŸžå€Ë³ä¹þ
164         *  €ß€¬Æþ€ê¡€€œ€ÎÃæ€Ç¥¿¥¹¥¯€¬ŒÂ¹Ô²ÄÇœŸõÂրˀʀë€È¡€ŒÂ¹Ô€¹€Ù€­¥¿¥¹
165         *  ¥¯€¬€¢€ë€Ë€â€«€«€ï€é€º¥×¥í¥»¥Ã¥µ€¬³ä¹þ€ßÂÔ€Á€Ë€Ê€Ã€Æ€·€Þ€Š¡¥
166         *
167         *  ³ä¹þ€ßÂÔ€Á€ÎŽÖ€Ï¡€p_runtsk€òNULL¡Ê¡á0¡Ë€ËÀßÄꀷ€Ê€±€ì€Ð€Ê€é€Ê
168         *  €€¡¥€³€Î€è€Š€ËÀßÄꀷ€Ê€€€È¡€³ä¹þ€ß¥Ï¥ó¥É¥é€«€éiget_tid€òžÆ€ÓœÐ
169         *  €·€¿ºÝ€Îưºî€¬»ÅÍ̀˹çÃ×€·€Ê€¯€Ê€ë¡¥
170         */
171        stop #0x2000                                            /* ³ä¹þ€ßÂÔ€Á */
172        move.w %d0, %sr                                         /* žµ€ÎŸõÂÖ€ËÌ္ */
173        tst.l reqflg                                            /* reqflg€¬false€Ê€édispatcher_2€Ø */
174        jbeq dispatcher_2
175        clr.l reqflg                                            /* reqflg€òfalse€Ë */
176        /*
177         *  CPU¥í¥Ã¥¯ŸõÂÖ€ËÌ္¡¥³ä¹þ€ßÂÔ€Á€ÎŽÖ€ËŒÂ¹Ô€·€¿³ä¹þ€ß¥Ï¥ó¥É¥é€Ë€è
178         *  €ê¡€saved_iipm€¬œñ€­Ž¹€š€é€ì€ë²ÄÇœÀ­€¬€¢€ë€¿€á¡€žµ€ÎÃÍ€ËÌ္ɬ
179         *  Í×€¬€¢€ë¡¥dispatcher€¬ŒÂ¹Ô€µ€ì€ë»þ€Ï¡€saved_iipm€¬IIPM_ENAALL
180         *  €È€Ê€Ã€Æ€€€ë€¿€á¡€€³€³€Ç€Ïsaved_iipm€òIIPM_ENAALL¡Ê¡á0¡Ë€ËÌျ
181         *  €Ð€è€€¡¥
182         */
183        clr.w saved_iipm                                        /* saved_iipm€ò0€Ë€¹€ë */
184        move.l #true, lock_flag                         /* CPU¥í¥Ã¥¯ŸõÂÖ€Ë */
185        jbra dispatcher_0
186
187/*
188 *  ¥«¡Œ¥Í¥ë€ÎœªÎ»œèÍý€ÎžÆœÐ€·
189 *
190 *  M68040€Ç€Ï¡€¥â¡Œ¥ÉÀÚŽ¹€š€Ë€è€ê¥¹¥¿¥Ã¥¯€âÀڀꎹ€ï€ë€¿€á¡€ÌÀŒšÅª€Ê¥¹
191 *  ¥¿¥Ã¥¯ÀÚŽ¹€š€ÏɬÍ׀ʀ€¡¥ºÇœé€«€é³ä¹þ€ß¥â¡Œ¥É€Ç€¢€Ã€¿Ÿì¹ç€â¡€Æ±€žœè
192 *  Íý€Ç€è€€¡¥
193 */
194        .globl call_exit_kernel
195call_exit_kernel:
196        and.w #~0x1000, %sr                                     /* ³ä¹þ€ß¥â¡Œ¥É€Ë */
197        jmp exit_kernel                                         /* ¥«¡Œ¥Í¥ë€ÎœªÎ»œèÍý€òžÆ€Ö */
198       
199/*
200 *  ¥¿¥¹¥¯³«»Ï»þœèÍý
201 */
202        .text
203        .globl start_r
204start_r:
205        clr.l lock_flag                                         /* CPU¥í¥Ã¥¯²òœüŸõÂÖ€Ë */
206        and.w #~0x0700, %sr
207        move.l TCB_p_tinib(%a0), %a1            /* p_runtsk->p_tinib€òA1€Ë */
208        move.l TINIB_exinf(%a1), -(%sp)         /* exinf€ò¥¹¥¿¥Ã¥¯€ËÀÑ€à */
209        move.l #ext_tsk, -(%sp)                         /* ext_tsk€ò¥¹¥¿¥Ã¥¯€ËÀÑ€à */
210        move.l TINIB_task(%a1), %a0                     /* ¥¿¥¹¥¯€Îµ¯Æ°ÈÖÃÏ€òA0€Ë */
211        jmp (%a0)
212
213/*
214 *  ³ä¹þ€ß¥Ï¥ó¥É¥éœÐžýœèÍý
215 *
216 *  ret_int€Ï¡€³ä¹þ€ß¥Ï¥ó¥É¥é€«€éÌá€Ã€¿ÄŸžå€ËŒÂ¹Ô€¹€ë¥ë¡Œ¥Á¥ó€Ç¡€
217 *  INTHDR_ENTRY¥Þ¥¯¥í€ÇÅž³«€¹€ë³ä¹þ€ß¥Ï¥ó¥É¥é€ÎÆþžýœèÍý€Ç¡€³ä¹þ€ß¥Ï¥ó
218 *  ¥É¥é€«€é€ÎÌá€êÈÖÃÏ€ËÀßÄꀵ€ì€ë¡¥
219 */
220        .text
221        .globl ret_int
222ret_int:
223        btst.b #4, 16(%sp)                                      /* Ìá€êÀ耬³ä¹þ€ß¥â¡Œ¥É€Ê€é */
224        jbeq ret_int_1                                          /*           €¹€°€Ë¥ê¥¿¡Œ¥ó */
225        /*
226         *  ¥«¡Œ¥Í¥ëŽÉÍý€Î³ä¹þ€ß€ò¶Ø»ß€¹€ë¡¥€³€Î»þÅÀ€Ç€Ï¡€CPU¥í¥Ã¥¯ŸõÂÖ€Ë
227         *  €Ï€Ê€é€Ê€€¡Êlock_flag€Èsaved_iipm€Ï¹¹¿·€·€Ê€€¡Ë¡¥
228         *
229         *  reqflg€ò¥Á¥§¥Ã¥¯€¹€ëÁ°€Ë³ä¹þ€ß€ò¶Ø»ß€¹€ë€Î€Ï¡€reqflg€ò¥Á¥§¥Ã¥¯
230         *  €·€¿ÄŸžå€Ë³ä¹þ€ß¥Ï¥ó¥É¥é€¬µ¯Æ°€µ€ì¡€€œ€ÎÃæ€Ç¥Ç¥£¥¹¥Ñ¥Ã¥Á€¬Í×µá
231         *  €µ€ì€¿Ÿì¹ç€Ë¡€€¹€°€Ë¥Ç¥£¥¹¥Ñ¥Ã¥Á€µ€ì€Ê€€€È€€€ŠÌäÂꀬÀž€ž€ë€¿€á
232         *  €Ç€¢€ë¡¥
233         */
234#if TIPM_LOCK == -7
235        or.w #0x0700, %sr                                       /* €¹€Ù€Æ€Î³ä¹þ€ß€ò¶Ø»ß */
236#else /* TIPM_LOCK == -7 */
237        /*
238         *  €³€Î¥ë¡Œ¥Á¥ó€Ï¥«¡Œ¥Í¥ëŽÉÍý€Î³ä¹þ€ß€«€éµ¯Æ°€µ€ì€ë€¿€á¡€€³€³€Ç€Ï¡€
239         *  ³ä¹þ€ßÍ¥ÀèÅÙ¥Þ¥¹¥¯€¬TIPM_LOCK€è€ê€âÄ €ÈÁÛÄê€Ç€­€ë¡¥
240         */
241        move.w %sr, %d0                                         /* ¥«¡Œ¥Í¥ëŽÉÍý€Î³ä¹þ€ß€ò¶Ø»ß */
242        and.w #~0x0700, %d0
243        or.w #IIPM_LOCK, %d0
244        move.w %d0, %sr
245#endif /* TIPM_LOCK == -7 */
246        tst.l reqflg                                            /* reqflg€¬true€Ç€¢€ì€Ðret_int_2€Ø */
247        jbne ret_int_2
248ret_int_1:
249        /*
250         *  ³ä¹þ€ßœèÍý€«€é€Î¥ê¥¿¡Œ¥ó€Ë€è€ê¡€CPU¥í¥Ã¥¯²òœüŸõÂր˰ܹԀ¹€ë€è€Š
251         *  œàÈ÷€¹€ë¡¥³ä¹þ€ßÍ¥ÀèÅÙ¥Þ¥¹¥¯€Ï¡€RTEÌ¿Îá€Ë€è€êžµ€ÎÃÍ€ËÌá€ë€¿€á¡€
252         *  lock_flag€òfalse€Ë€·€Æ€ª€±€Ð€è€€¡Êlock_flag€òfalse€Ë€¹€ë€Î€Ï¡€
253         *  CPU¥í¥Ã¥¯ŸõÂր΀ހ޳ä¹þ€ß¥Ï¥ó¥É¥é€«€éÌá€Ã€¿»þ€ÎÂкö¡Ë¡¥
254         */
255        clr.l lock_flag                                         /* CPU¥í¥Ã¥¯²òœü€ÎœàÈ÷ */
256        movem.l (%sp)+, %d0-%d1/%a0-%a1         /* ¥¹¥¯¥é¥Ã¥Á¥ì¥ž¥¹¥¿€òÉüµ¢ */
257        rte
258
259ret_int_2:
260        movem.l (%sp)+, %d0-%d1/%a0-%a1         /* ¥¹¥¯¥é¥Ã¥Á¥ì¥ž¥¹¥¿€òÉüµ¢ */
261        addq.l #8, %sp                                          /* ¥¹¥í¡Œ¥¢¥Š¥§¥€¥Õ¥ì¡Œ¥à€òŒÎ€Æ€ë */
262        or.w #0x1000, %sr                                       /* ¥Þ¥¹¥¿¥â¡Œ¥É€Ë¡Ê¥¹¥¿¥Ã¥¯ÀÚŽ¹€š¡Ë*/
263        movem.l %d0-%d1/%a0-%a1, -(%sp)         /* ¥¹¥¯¥é¥Ã¥Á¥ì¥ž¥¹¥¿€òÊÝž */
264ret_int_3:
265        /*
266         *  €³€³€Ø€Ï¡€CPUÎã³°¥Ï¥ó¥É¥é€ÎœÐžýœèÍý€«€é€âʬŽô€·€Æ€¯€ë¡¥
267         *
268         *  €³€³€Ç€Ï¡€Ìá€êÀ耬¥¿¥¹¥¯€Ç€¢€ê¡€¥¹¥¿¥Ã¥¯€Ï¡€Îã³°¥¹¥¿¥Ã¥¯¥Õ¥ì¡Œ
269         *  ¥à€ÎŸå€Ë¥¹¥¯¥é¥Ã¥Á¥ì¥ž¥¹¥¿€Î€ß€¬ÊÝž€µ€ì€¿ŸõÂրˀʀÀƀ€€ë¡¥€Þ
270         *  €¿¡€¥×¥í¥»¥Ã¥µ€Ï¡€¥Þ¥¹¥¿¥â¡Œ¥É¡Š¥«¡Œ¥Í¥ëŽÉÍý€Î³ä¹þ€ß€ò¶Ø»ß€·€¿
271         *  ŸõÂրȀʀÀƀ€€ë¡¥
272         */
273        clr.l reqflg                                            /* reqflg€òfalse€Ë */
274        /*
275         *  CPU¥í¥Ã¥¯ŸõÂր˰ܹԀ·¡€³ä¹þ€ßÍ¥ÀèÅÙ¥Þ¥¹¥¯€ò³ä¹þ€ßœèÍýÁ°€ÎÃÍ€ËÀß
276         *      Äꀹ€ë¡¥¥«¡Œ¥Í¥ëŽÉÍý€Î³ä¹þ€ß€Ï€¹€Ç€Ë¶Ø»ß€·€Æ€€€ë€Î€Ç¡€lock_flag
277         *  €Èsaved_iipm€ò¹¹¿·€¹€ë¡¥saved_iipm€Ï¡€Ìá€êÀè€Î³ä¹þ€ßÍ¥ÀèÅÙ¥Þ¥¹
278         *  ¥¯¡Ê€ÎÆâÉôÉœžœ¡Ë€ËÀßÄꀹ€ë¡¥
279         *
280         *  €³€Î»þÅÀ€ÇCPU¥í¥Ã¥¯ŸõÂրȀ¹€ë€Î€Ï¡€dispatcher€ØÊ¬Žô€¹€ë»þ€È¡€
281         *  call_texrtn€òžÆ€ÓœÐ€¹»þ€Ë¡€CPU¥í¥Ã¥¯ŸõÂրˀʀÀƀ€€ëɬÍ×€¬€¢€ë
282         *  €¿€á€Ç€¢€ë¡¥
283         */
284        move.w 16(%sp), %d0                                     /* Ìá€êÀè€ÎSR€òD0€Ë */
285        and.w #0x0700, %d0                                      /* IPM€òŒè€êœÐ€·€Æsaved_iipm€Ë */
286        move.w %d0, saved_iipm
287        move.l #true, lock_flag                         /* lock_flag€òtrue€Ë */
288        /*
289         *  dspflg€¬false€Ç€¢€ëŸì¹ç€È¡€p_runtsk€Èp_schedtsk€¬Æ±€žŸì¹ç€Ë€Ï¡€
290         *  ¥Ç¥£¥¹¥Ñ¥Ã¥Á€ò¹Ô€ï€Ê€€¡¥€³€Î¥Á¥§¥Ã¥¯€¬É¬Í׀ʀ΀ϡ€¥¿¥¹¥¯Îã³°œè
291         *  Íý¥ë¡Œ¥Á¥ó€ÎžÆœÐ€·€¬É¬Í׀ʟì¹ç€Ë¡€¥Ç¥£¥¹¥Ñ¥Ã¥Á€¬É¬Í׀ʀ¯€Æ€â¡€
292         *  reqflg€òtrue€Ë€¹€ë€¿€á€Ç€¢€ë¡¥
293         */
294        move.l p_runtsk, %a0                            /* p_runtsk€òA0€Ë */
295        tst.l dspflg                                            /* dspflg€¬false€Ê€éret_int_4€Ø */
296        jbeq ret_int_4
297        cmp.l p_schedtsk, %a0                           /* p_runtsk€Èp_schedtsk€¬Æ±€ž€Ê€é */
298        jbeq ret_int_4                                          /*                    ret_int_4€Ø */
299        movem.l %d2-%d7/%a2-%a6, -(%sp)         /* »Ä€ê€Î¥ì¥ž¥¹¥¿€òÊÝž */
300        move.l %sp, TCB_msp(%a0)                        /* ¥¿¥¹¥¯¥¹¥¿¥Ã¥¯€òÊÝž */
301        move.l #ret_int_r, TCB_pc(%a0)          /* ŒÂ¹ÔºÆ³«ÈÖÃÏ€òÊÝž */
302        jbra dispatcher
303
304ret_int_r:
305        movem.l (%sp)+, %d2-%d7/%a2-%a6         /* ¥ì¥ž¥¹¥¿€òÉüµ¢ */
306ret_int_4:
307        /*
308         *  enatex€¬true€Ç¡€texptn€¬0€Ç€Ê€¯¡€ipmflg€¬true€Ç€¢€ì€Ð¡€¥¿¥¹¥¯
309         *  Îã³°œèÍý¥ë¡Œ¥Á¥ó€òžÆ€ÓœÐ€¹¡¥
310         */
311        btst.b #TCB_enatex_bit, TCB_enatex(%a0)
312        jbeq ret_int_5                                          /* enatex€¬false€Ê€éret_int_5€Ø */
313        tst.l TCB_texptn(%a0)                           /* texptn€¬0€Ê€éret_int_5€Ø */
314        jbeq ret_int_5
315        tst.l ipmflg                                            /* ipmflg€¬false€Ê€éret_int_5€Ø */
316        jbeq ret_int_5
317        jsr call_texrtn                                         /* ¥¿¥¹¥¯Îã³°œèÍý¥ë¡Œ¥Á¥ó€ÎžÆœÐ€· */
318ret_int_5:
319        /*
320         *  ³ä¹þ€ßœèÍý€«€é€Î¥ê¥¿¡Œ¥ó€Ë€è€ê¡€CPU¥í¥Ã¥¯²òœüŸõÂր˰ܹԀ¹€ë€è
321         *  €ŠœàÈ÷€¹€ë¡¥³ä¹þ€ßÍ¥ÀèÅÙ¥Þ¥¹¥¯€Ï¡€RTEÌ¿Îá€Ë€è€êžµ€ÎÃÍ€ËÌá€ë€¿
322         *  €á¡€lock_flag€òfalse€Ë€·€Æ€ª€±€Ð€è€€¡¥
323         */
324        clr.l lock_flag                                         /* CPU¥í¥Ã¥¯²òœü€ÎœàÈ÷ */
325        movem.l (%sp)+, %d0-%d1/%a0-%a1         /* ¥¹¥¯¥é¥Ã¥Á¥ì¥ž¥¹¥¿€òÉüµ¢ */
326        rte
327
328/*
329 *  CPUÎã³°¥Ï¥ó¥É¥éœÐÆþžýœèÍý
330 *
331 *  exchdr_entry€Ï¡€CPUÎã³°€¬È¯Àž€·€¿»þ€ËŒÂ¹Ô€¹€ë¥ë¡Œ¥Á¥ó€Ç¡€EXCHDR_ENTRY
332 *  ¥Þ¥¯¥í€ÇÅž³«€¹€ëCPUÎã³°¥Ï¥ó¥É¥é€ÎÆþžýœèÍý€«€é¡€CPUÎã³°¥Ï¥ó¥É¥é€ÎÈÖÃÏ€ò
333 *  A1€Ë¡€CPUÎã³°¥Ï¥ó¥É¥éÈÖ¹æ€òD1€ËÆþ€ì€ÆÊ¬Žô€·€Æ€¯€ë¡¥
334 *
335 *  CPUÎã³°¥Ï¥ó¥É¥é€Ï¡€È󥿥¹¥¯¥³¥ó¥Æ¥­¥¹¥È€ÇŒÂ¹Ô€¹€ë¡¥€œ€Î€¿€á¡€CPUÎã
336 *  ³°¥Ï¥ó¥É¥é€òžÆ€ÓœÐ€¹Á°€Ë³ä¹þ€ß¥â¡Œ¥É€Ë°Ü¹Ô€·¡€¥ê¥¿¡Œ¥ó€·€Æ€­€¿žå€Ë
337 *  žµ€Î¥â¡Œ¥É€ËÌ္¡¥žµ€Î¥â¡Œ¥É€ËÌ္€¿€á€Ë¡€³ä¹þ€ß¥â¡Œ¥É€Ë°Ü¹Ô€¹€ëÁ°
338 *  €ÎSR€ò³ä¹þ€ß¥¹¥¿¥Ã¥¯Ÿå€ËÊÝž€¹€ë¡Ê¥ê¥¿¡Œ¥óÀè€ÎSR€ò»²ŸÈ€¹€ëŒê€â€¢€ë
339 *  €¬¡€¥¿¥¹¥¯¥¹¥¿¥Ã¥¯Ÿå€ËÊÝž€µ€ì€ëŸì¹ç€¬€¢€ê¡€»²ŸÈ€¹€ë€Î€¬ÌÌÅݡˡ¥
340 */
341        .text
342        .globl exchdr_entry
343exchdr_entry:
344        lea.l 16(%sp), %a0                                      /* Îã³°¥Õ¥ì¡Œ¥à€ÎÀèÆ¬€òA0€Ë */
345        move.w %sr, %d0                                         /* SR€òD0€Ë */
346        and.w #~0x1000, %sr                                     /* ³ä¹þ€ß¥â¡Œ¥É€Ë¡Ê¥¹¥¿¥Ã¥¯ÀÚŽ¹€š¡Ë*/
347        move.l %d0, -(%sp)                                      /* žµ€ÎSR€ò¥¹¥¿¥Ã¥¯€ËÊÝž */
348        and.w #0x0700, %d0                                      /* IPM€¬INT_IPM(TMIN_INTPRI) */
349        cmp.w #INT_IPM(TMIN_INTPRI), %d0        /*    €è€êŸ®€µ€±€ì€Ð¡€¥«¡Œ¥Í¥ë */
350        blt exchdr_entry_1                                      /*    ŽÉÍý€ÎCPUÎã³°€ÎœèÍý€Ø */
351
352        /*
353         *  ¥«¡Œ¥Í¥ëŽÉÍý³°€ÎCPUÎã³°¥Ï¥ó¥É¥é€ÎžÆœÐ€·
354         */
355        move.l lock_flag, %d0                           /* žµ€Îlock_flag€ò¥¹¥¿¥Ã¥¯€ËÊÝž */
356        move.l %d0, -(%sp)
357        move.l %a0, -(%sp)                                      /* A0€ò¥Ñ¥é¥á¡Œ¥¿€Ë */
358        jsr (%a1)                                                       /* CPUÎã³°¥Ï¥ó¥É¥é€òžÆ€ÓœÐ€¹ */
359        addq.l #4, %sp                                          /* ¥¹¥¿¥Ã¥¯Ÿå€Î°ú¿ô€òŒÎ€Æ€ë */
360        move.l (%sp)+, %d0                                      /* lock_flag€òžµ€ËÌ္ */
361        move.l %d0, lock_flag
362        move.l (%sp)+, %d0                                      /* SR€òžµ€ËÌ္ */
363        move.w %d0, %sr
364        movem.l (%sp)+, %d0-%d1/%a0-%a1         /* ¥¹¥¯¥é¥Ã¥Á¥ì¥ž¥¹¥¿€òÉüµ¢ */
365        rte
366
367        /*
368         *  ¥«¡Œ¥Í¥ëŽÉÍý€ÎCPUÎã³°¥Ï¥ó¥É¥é€ÎžÆœÐ€·
369         */
370exchdr_entry_1:
371#ifdef LOG_EXC_LEAVE                                    /* excno_num€òlog_exc_leave€Î */
372        move.l %d1, -(%sp)                                      /*               ¥Ñ¥é¥á¡Œ¥¿€Ë */
373#endif /* LOG_EXC_LEAVE */
374        move.l %a0, -(%sp)                                      /* A0€òCPUÎã³°¥Ï¥ó¥É¥é€Î¥Ñ¥é¥á¡Œ¥¿€Ë */
375#ifdef LOG_EXC_ENTER
376        move.l %a1, -(%sp)                                      /* A1€òÊÝž */
377        move.l %d1, -(%sp)                                      /* excno_num€ò¥Ñ¥é¥á¡Œ¥¿€Ë */
378        jsr _kernel_log_exc_enter                       /* log_exc_enter€òžÆ€ÓœÐ€¹ */
379        addq.l #4, %sp
380        move.l (%sp)+, %a1                                      /* A1€òÉüµ¢ */
381#endif /* LOG_EXC_ENTER */
382        jsr (%a1)                                                       /* CPUÎã³°¥Ï¥ó¥É¥é€òžÆ€ÓœÐ€¹ */
383        addq.l #4, %sp                                          /* ¥¹¥¿¥Ã¥¯Ÿå€Î°ú¿ô€òŒÎ€Æ€ë */
384#ifdef LOG_EXC_LEAVE
385        jsr _kernel_log_exc_leave                       /* log_exc_leave€òžÆ€ÓœÐ€¹ */
386        addq.l #4, %sp
387#endif /* LOG_EXC_LEAVE */
388ret_exc:
389        move.l (%sp)+, %d0                                      /* žµ€ÎSR€òD0€Ë */
390        and.w #0x1000, %d0                                      /* žµ€¬³ä¹þ€ß¥â¡Œ¥É€Ê€é */
391        jbeq ret_exc_1                                          /*       €¹€°€Ë¥ê¥¿¡Œ¥ó */
392        /*
393         *  ¥«¡Œ¥Í¥ëŽÉÍý€Î³ä¹þ€ß€ò¶Ø»ß€·¡€¥Þ¥¹¥¿¥â¡Œ¥É€ËÌ္¡¥€³€Î»þÅÀ€Ç€Ï¡€
394         *  CPU¥í¥Ã¥¯ŸõÂրˀπʀé€Ê€€¡Êlock_flag€Èsaved_iipm€Ï¹¹¿·€·€Ê€€¡Ë¡¥
395         *
396         *  reqflg€ò¥Á¥§¥Ã¥¯€¹€ëÁ°€Ë³ä¹þ€ß€ò¶Ø»ß€¹€ë€Î€Ï¡€reqflg€ò¥Á¥§¥Ã¥¯
397         *  €·€¿ÄŸžå€Ë³ä¹þ€ß¥Ï¥ó¥É¥é€¬µ¯Æ°€µ€ì¡€€œ€ÎÃæ€Ç¥Ç¥£¥¹¥Ñ¥Ã¥Á€¬Í×µá
398         *  €µ€ì€¿Ÿì¹ç€Ë¡€€¹€°€Ë¥Ç¥£¥¹¥Ñ¥Ã¥Á€µ€ì€Ê€€€È€€€ŠÌäÂꀬÀž€ž€ë€¿€á
399         *  €Ç€¢€ë¡¥
400         */
401#if TIPM_LOCK == -7
402        or.w #0x1700, %sr                                       /* ¥Þ¥¹¥¿¥â¡Œ¥É¡ŠÁ޳ä¹þ€ß¶Ø»ß */
403#else /* TIPM_LOCK == -7 */
404        /*
405         *  €³€Î¥ë¡Œ¥Á¥ó€Ï¥«¡Œ¥Í¥ëŽÉÍý€ÎCPUÎã³°€«€éµ¯Æ°€µ€ì€ë€¿€á¡€€³€³€Ç€Ï¡€
406         *  ³ä¹þ€ßÍ¥ÀèÅÙ¥Þ¥¹¥¯€¬TIPM_LOCK€è€ê€âÄ €ÈÁÛÄê€Ç€­€ë¡¥
407         */
408        move.w %sr, %d0                                         /* ¥Þ¥¹¥¿¥â¡Œ¥É¡Š                */
409        and.w #~0x0700, %d0                                     /*    ¥«¡Œ¥Í¥ëŽÉÍý€Î³ä¹þ€ß€ò¶Ø»ß */
410        or.w #(0x1000|IIPM_LOCK), %d0
411        move.w %d0, %sr
412#endif /* TIPM_LOCK == -7 */
413        /*
414         *  CPUÎã³°€Ç€Ï³ä¹þ€ß¥â¡Œ¥É€ËÀڀꎹ€ï€é€Ê€€€¿€á¡€reqflg€¬true€ÎŸì¹ç¡€
415         *  ret_int_2€Ç€Ï€Ê€¯¡€ret_int_3€ØÊ¬Žô€¹€ë¡¥
416         */
417        tst.l reqflg                                            /* reqflg€¬true€Ç€¢€ì€Ðret_int_3€Ø */
418        jbne ret_int_3
419ret_exc_1:
420        movem.l (%sp)+, %d0-%d1/%a0-%a1         /* ¥¹¥¯¥é¥Ã¥Á¥ì¥ž¥¹¥¿€òÉüµ¢ */
421        rte
422
423/*
424 *  ÈùŸ¯»þŽÖÂÔ€Á¡ÊËÜÍè€ÏSIL€Î¥¿¡Œ¥²¥Ã¥È°ÍžÉô¡Ë
425 */
426        .globl _sil_dly_nse
427_sil_dly_nse:
428        subi.l #SIL_DLY_TIM1, %d0                       /* D0€«€éSIL_DLY_TIM1€ò°ú€¯ */
429        jbhi _sil_dly_nse_1                                     /* ·ë²Ì€¬0°Ê²Œ€Ê€é¥ê¥¿¡Œ¥ó */
430        rts
431_sil_dly_nse_1:
432        subi.l #SIL_DLY_TIM2, %d0                       /* D0€«€éSIL_DLY_TIM2€ò°ú€¯ */
433        jbhi _sil_dly_nse_1                                     /* ·ë²Ì€¬0€è€êÂ瀭€±€ì€Ð¥ë¡Œ¥× */
434        rts
詳しい使い方は TracBrowser を参照してください。