source: anotherchoice/tags/jsp-1.4.4-full-UTF8/config/m32c-renesas/makeoffset.c@ 26

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

initial

File size: 9.7 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) 2003-2004 by Naoki Saito
7 * Nagoya Municipal Industrial Research Institute, 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: makeoffset.c,v 1.3 2005/11/24 12:41:23 honda Exp $
51 */
52
53
54/*
55 * offset.inc (もしくは offset.h) について
56 *
57 * offset.inc は構造体の特定の要素が構造体のå…
58ˆé ­ã‹ã‚‰ä½•ãƒã‚¤ãƒˆç›®ã«
59 * 存在するかということや, 特定のビットフィールドがå…
60ˆé ­ã‹ã‚‰
61 * 何バイトå…
62ˆã®ä½•ãƒ“ット目に存在するか, という情
63報を
64 * アセンブリ言語ファイルに与えるために存在している.
65 *
66 * offset.inc ファイルの中身は, 単なるシンボル定義ファイルである.
67 * シンボルといっても定義するシンボルの名称にはパターンがあり,
68 * 大きく分けて次の3種類に分類できる.
69 *
70 * <構造体名>_<要素名> (例) TCB_sp, TCB_pc, TCB_enatex など
71 * <構造体名>_<要素名>_bit (例) TCB_enatex_bit など
72 * <構造体名>_<要素名>_mask (例) TCB_enatex_mask など
73 *
74 * (例)
75 * TCB_texptn .equ 14
76 * TCB_sp .equ 20
77 * TCB_pc .equ 24
78 * TCB_enatex .equ 13
79 * TCB_enatex_bit .equ 6
80 * TCB_enatex_mask .equ 0040H
81 *
82 * 一番はじめは特定の要素が構造体のå…
83ˆé ­ã‹ã‚‰ä½•ãƒã‚¤ãƒˆå…
84ˆã«ã‚るか
85 * ということを示す数値につけるラベルの名称.
86 * 二番目は特定のビットフィールド中のビットが, 下位から数えて
87 * 何ビット目にあるかということを示す数値につけるラベルの名称.
88 * 0から始まる数値で表現する. 最も下位のビットは第0ビットである.
89 * 三番目はå…
90ˆã»ã©ã® <構造体名>_<要素名>_bit とも関連するが,
91 * 特定のビットフィールド中のビットのマスク値の名称.
92 * _bit と *_mask の値の間には次の関係がある.
93 * (*_mask) == (1 << *_bit)
94 * * (例) TCB_enatex_bit が 6 の時, TCB_enatex_mask は 40H
95 *
96 * ちなみにM32C依存部の実装
97では, 特定ビットのチェックなどに
98 * ビット命令アドレッシングを使用しているので *_mask というラベルは
99 * 使用していない.
100 */
101
102/*
103 * offset.inc の作り方(M32Cターゲット依存部向け)
104 *
105 * GNU Cコンパイラを用いているターゲット依存部については,
106 * カーネルのトップディレクトリの下にある util というディレクトリの
107 * 下に genoffset という perl スクリプトが用意されているので,
108 * 特に手動で offset.h を作成する必
109要はない.
110 * genoffset は GNU 開発環境を想定して作成されているので,
111 * 生成されるアセンブリ言語疑似命令や生成規則の異なる他の
112 * Cコンパイラにはそのまま適用できない可能性がある.
113 * そこで, ここではWindows環境 向けの genoffset を用意せず,
114 * 作り方をここに記し, 手作業で offset.inc を作成してもらうことと
115 * する. 以下にその方法を示す. なお, この方法はM32Cの開発環境や
116 * 命令セットに依存しているため, 他のターゲットを使用している場合は
117 * そのまま適用できない.
118 *
119 * 1. makeoffset.c というファイルからCコンパイラを使用して
120 * アセンブリ言語ファイル makeoffset.a30 を生成する.
121 * コンパイルオプションはカーネルコードに与えるものと同じ
122 * ものを与える.
123 * ルネサス製ツール TM を使用している場合は, プロジェクトエディタの
124 * 生成手順ビューから makeoffset.a30 を選び, 右クリックメニューの
125 * 「部分ビルド」を選択することで生成できる.
126 * もしくはコマンドプロンプトでメイクファイルと同じディレクトリに
127 * 移動し, "make -f メイクファイル名 makeoffset.a30" を
128 * 実行しても同様の結果が得られる. (メイクファイルはTMが使用して
129 * いるものと同じファイルを指定可能)
130 *
131 * 2. å…
132ˆã»ã©ã® 1. の作業で得られた, makeoffset.a30 ファイルから
133 * "! BEGIN XXXX" ではじまり "! END" で終わっている部分を探す.
134 *
135 * 4箇所あり, それぞれ少しずつ異なるので順に説明する.
136 * (以下, 説明中ではアセンブリ言語ファイルのコメント行は省く)
137 *
138 * (1) 構造体のå…
139ˆé ­ã‹ã‚‰ãƒ¡ãƒ³ãƒã¸ã®ã‚ªãƒ•ã‚»ãƒƒãƒˆ
140 *
141 * ! BEGIN TCB_texptn
142 * bset 00H,0000000eH
143 * ! END
144 *
145 * 上記"! BEGIN"の後ろの文字列がoffset.incで定義するシンボル名となる.
146 * そのシンボルの値は, 次行のbset命令の第2オペランドの値である
147 * 0000000eHがそれに相当する. これが構造体のå…
148ˆé ­ã‹ã‚‰texptnまでの
149 * オフセット値となる. したがってこの場合, offset.inc には
150 * TCB_texptn .equ 14
151 * という行を記述する.
152 *
153 * (2) 構造体のメンバが構造体で, その中のメンバに対するオフセット
154 *
155 * TCB_sp についてもほぼ同様だが, sp はTCB構造体の直接の
156 * メンバでなくTCB構造体のメンバであるCTXB構造体のメンバで
157 * ある点が異なる. それでも定義するシンボル名としては
158 * TCB_sp のように表現する. アセンブリ言語ファイルでは
159 *
160 * ! BEGIN TCB_sp
161 * mov.l 00000014H,A0
162 * extz [A0],R0
163 * bset 0,R0L
164 * mov.l #00000014H,A0
165 * mov.b R0L,[[A0]]
166 * ! END *
167 *
168 * のようになり,14H(=20) が求める値なのでoffset.inc には次のように
169 * 記述する.
170 *
171 * TCB_sp .equ 20
172 *
173 * (3) メンバが関数へのポインタであった場合
174 *
175 * 次は TCB_pc の場合.
176 *
177 * ! BEGIN TCB_pc
178 * mov.l #00000018H,A0
179 * jsri.a [A0]
180 * ! END
181 *
182 * pc も sp と同じく, TCB構造体の直接のメンバではないが
183 * TCB_pc と表現している. これは関数のアドレスを格納する変数なので,
184 * (((TCB *)0)->tskctxb.pc)();
185 * として関数呼び出しのように記述すると上記のようなアセンブリ言語
186 * コードを出力する. シンボル定義する際のシンボル名は今までと
187 * 同じく, TCB_pc とする.
188 * 求める値は構造体から関数ポインタまでのオフセットであり, 上のmov.l
189 * 命令の結果から 00000018H(=24) となる.
190 * したがって, offset.inc には次のように記述する.
191 *
192 * TCB_pc .equ 24
193 *
194 * (4) 構造体のメンバがビットフィールドでそのビット位置も知りたい場合
195 *
196 * ! BEGIN TCB_enatex
197 * bset 6,0000000cH+1
198 * ! END
199 *
200 * 今までと同様, BEGIN の後の文字列をシンボル名とする.
201 * ここでのTCB_enatexの値は構造体のå…
202ˆé ­ã‹ã‚‰ãƒ“ットフィールドを含むバ
203 * イトまでのオフセットで, M32Cのビット命令アドレッシングは指定でき
204 * るビット位置が0から7の間に収まるようにアクセスするアドレスに適当
205 * 数が加えられるので cH+1(=13) となっている. また, ビットフィールド
206 * 中の最下位ビットからのビット位置は 6となる.
207 * 以上より次のように書くことができる.
208 *
209 * TCB_enatex .equ 13
210 * TCB_enatex_bit .equ 6
211 * TCB_enatex_mask .equ 40H
212 */
213
214#include "jsp_kernel.h"
215#include "task.h"
216
217
218void makeoffset(void);
219
220void
221makeoffset(void)
222{
223 asm("! BEGIN TCB_texptn\n");
224 (INT)(((TCB *)0)->texptn) |= 1;
225 asm("! END");
226
227 asm("! BEGIN TCB_sp\n");
228 *(char *)(((TCB *)0)->tskctxb.sp) |= 1;
229 asm("! END");
230
231 asm("! BEGIN TCB_pc\n");
232 (((TCB *)0)->tskctxb.pc)();
233 asm("! END");
234
235 asm("! BEGIN TCB_enatex\n");
236 (INT)(((TCB *)0)->enatex) = 1;
237 asm("! END");
238}
239
Note: See TracBrowser for help on using the repository browser.