source: uKadecot/trunk/ssp/arch/rx630_ccrx/makeoffset.c@ 108

Last change on this file since 108 was 108, checked in by coas-nagasima, 9 years ago

MIMEプロパティの変更

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
  • Property svn:mime-type set to text/x-chdr; charset=SHIFT_JIS
File size: 7.9 KB
Line 
1/*
2 * TOPPERS/SSP Kernel
3 * Smallest Set Profile Kernel
4 *
5 * Copyright (C) 2003-2004 by Naoki Saito
6 * Nagoya Municipal Industrial Research Institute, JAPAN
7 * Copyright (C) 2008-2010 by Witz Corporation, JAPAN
8 *
9 * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation
10 * によって公表されている GNU General Public License の Version 2 に記
11 * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア
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 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
32 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も
33 * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直
34 * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない.
35 *
36 */
37
38
39/*
40 * offset.inc (もしくは offset.h) について
41 *
42 * offset.inc は構造体の特定の要素が構造体の先頭から何バイト目に
43 * 存在するかということや, 特定のビットフィールドが先頭から
44 * 何バイト先の何ビット目に存在するか, という情報を
45 * アセンブリ言語ファイルに与えるために存在している.
46 *
47 * offset.inc ファイルの中身は, 単なるシンボル定義ファイルである.
48 * シンボルといっても定義するシンボルの名称にはパターンがあり,
49 * 大きく分けて次の3種類に分類できる.
50 *
51 * <構造体名>_<要素名> (例) TCB_sp, TCB_pc, TCB_enatex など
52 * <構造体名>_<要素名>_bit (例) TCB_enatex_bit など
53 * <構造体名>_<要素名>_mask (例) TCB_enatex_mask など
54 *
55 * (例)
56 * TCB_texptn .equ 14
57 * TCB_sp .equ 20
58 * TCB_pc .equ 24
59 * TCB_enatex .equ 13
60 * TCB_enatex_bit .equ 6
61 * TCB_enatex_mask .equ 0040H
62 *
63 * 一番はじめは特定の要素が構造体の先頭から何バイト先にあるか
64 * ということを示す数値につけるラベルの名称.
65 * 二番目は特定のビットフィールド中のビットが, 下位から数えて
66 * 何ビット目にあるかということを示す数値につけるラベルの名称.
67 * 0から始まる数値で表現する. 最も下位のビットは第0ビットである.
68 * 三番目は先ほどの <構造体名>_<要素名>_bit とも関連するが,
69 * 特定のビットフィールド中のビットのマスク値の名称.
70 * _bit と *_mask の値の間には次の関係がある.
71 * (*_mask) == (1 << *_bit)
72 * * (例) TCB_enatex_bit が 6 の時, TCB_enatex_mask は 40H
73 *
74 * ちなみにM32C依存部の実装では, 特定ビットのチェックなどに
75 * ビット命令アドレッシングを使用しているので *_mask というラベルは
76 * 使用していない.
77 */
78
79/*
80 * offset.inc の作り方(M32Cターゲット依存部向け)
81 *
82 * GNU Cコンパイラを用いているターゲット依存部については,
83 * カーネルのトップディレクトリの下にある util というディレクトリの
84 * 下に genoffset という perl スクリプトが用意されているので,
85 * 特に手動で offset.h を作成する必要はない.
86 * genoffset は GNU 開発環境を想定して作成されているので,
87 * 生成されるアセンブリ言語疑似命令や生成規則の異なる他の
88 * Cコンパイラにはそのまま適用できない可能性がある.
89 * そこで, ここではWindows環境 向けの genoffset を用意せず,
90 * 作り方をここに記し, 手作業で offset.inc を作成してもらうことと
91 * する. 以下にその方法を示す. なお, この方法はM32Cの開発環境や
92 * 命令セットに依存しているため, 他のターゲットを使用している場合は
93 * そのまま適用できない.
94 *
95 * 1. makeoffset.c というファイルからCコンパイラを使用して
96 * アセンブリ言語ファイル makeoffset.a30 を生成する.
97 * コンパイルオプションはカーネルコードに与えるものと同じ
98 * ものを与える.
99 * ルネサス製ツール TM を使用している場合は, プロジェクトエディタの
100 * 生成手順ビューから makeoffset.a30 を選び, 右クリックメニューの
101 * 「部分ビルド」を選択することで生成できる.
102 * もしくはコマンドプロンプトでメイクファイルと同じディレクトリに
103 * 移動し, "make -f メイクファイル名 makeoffset.a30" を
104 * 実行しても同様の結果が得られる. (メイクファイルはTMが使用して
105 * いるものと同じファイルを指定可能)
106 *
107 * 2. 先ほどの 1. の作業で得られた, makeoffset.a30 ファイルから
108 * "! BEGIN XXXX" ではじまり "! END" で終わっている部分を探す.
109 *
110 * 4箇所あり, それぞれ少しずつ異なるので順に説明する.
111 * (以下, 説明中ではアセンブリ言語ファイルのコメント行は省く)
112 *
113 * (1) 構造体の先頭からメンバへのオフセット
114 *
115 * ! BEGIN TCB_texptn
116 * bset 00H,0000000eH
117 * ! END
118 *
119 * 上記"! BEGIN"の後ろの文字列がoffset.incで定義するシンボル名となる.
120 * そのシンボルの値は, 次行のbset命令の第2オペランドの値である
121 * 0000000eHがそれに相当する. これが構造体の先頭からtexptnまでの
122 * オフセット値となる. したがってこの場合, offset.inc には
123 * TCB_texptn .equ 14
124 * という行を記述する.
125 *
126 * (2) 構造体のメンバが構造体で, その中のメンバに対するオフセット
127 *
128 * TCB_sp についてもほぼ同様だが, sp はTCB構造体の直接の
129 * メンバでなくTCB構造体のメンバであるTSKCTXB構造体のメンバで
130 * ある点が異なる. それでも定義するシンボル名としては
131 * TCB_sp のように表現する. アセンブリ言語ファイルでは
132 *
133 * ! BEGIN TCB_sp
134 * mov.l 00000014H,A0
135 * extz [A0],R0
136 * bset 0,R0L
137 * mov.l #00000014H,A0
138 * mov.b R0L,[[A0]]
139 * ! END *
140 *
141 * のようになり,14H(=20) が求める値なのでoffset.inc には次のように
142 * 記述する.
143 *
144 * TCB_sp .equ 20
145 *
146 * (3) メンバが関数へのポインタであった場合
147 *
148 * 次は TCB_pc の場合.
149 *
150 * ! BEGIN TCB_pc
151 * mov.l #00000018H,A0
152 * jsri.a [A0]
153 * ! END
154 *
155 * pc も sp と同じく, TCB構造体の直接のメンバではないが
156 * TCB_pc と表現している. これは関数のアドレスを格納する変数なので,
157 * (((TCB *)0)->tskctxb.pc)();
158 * として関数呼び出しのように記述すると上記のようなアセンブリ言語
159 * コードを出力する. シンボル定義する際のシンボル名は今までと
160 * 同じく, TCB_pc とする.
161 * 求める値は構造体から関数ポインタまでのオフセットであり, 上のmov.l
162 * 命令の結果から 00000018H(=24) となる.
163 * したがって, offset.inc には次のように記述する.
164 *
165 * TCB_pc .equ 24
166 *
167 * (4) 構造体のメンバがビットフィールドでそのビット位置も知りたい場合
168 *
169 * ! BEGIN TCB_enatex
170 * bset 6,0000000cH+1
171 * ! END
172 *
173 * 今までと同様, BEGIN の後の文字列をシンボル名とする.
174 * ここでのTCB_enatexの値は構造体の先頭からビットフィールドを含むバ
175 * イトまでのオフセットで, M32Cのビット命令アドレッシングは指定でき
176 * るビット位置が0から7の間に収まるようにアクセスするアドレスに適当
177 * 数が加えられるので cH+1(=13) となっている. また, ビットフィールド
178 * 中の最下位ビットからのビット位置は 6となる.
179 * 以上より次のように書くことができる.
180 *
181 * TCB_enatex .equ 13
182 * TCB_enatex_bit .equ 6
183 * TCB_enatex_mask .equ 40H
184 */
185
186#include "kernel_impl.h"
187#include "task.h"
188#include "sil.h"
189
190const TCB ____BEGIN_OFF_TCB_tstat = {
191 { NULL, NULL }, NULL , 1, 0,
192 0, 0 , 0 , 0 , NULL , { NULL , NULL }
193 };
194
195const TCB ____BEGIN_OFF_TCB_tinib = {
196 { NULL, NULL }, (TINIB *)1 , 0 , 0,
197 0, 0 , 0 , 0 , NULL , { NULL , NULL }
198 };
199
200const TCB ____BEGIN_OFF_TCB_pc = {
201 { NULL, NULL }, NULL, 0, 0,
202 0, 0 , 0 , 0 , NULL , { NULL , (FP)1 }
203 };
204const TCB ____BEGIN_OFF_TCB_sp = {
205 { NULL, NULL }, NULL, 0, 0,
206 0, 0 , 0 , 0 , NULL , { (void *)1 , NULL }
207 };
208
209const TCB ____BEGIN_BIT_TCB_enatex = {
210 { NULL, NULL }, NULL, 0, 0,
211 0, 0 , 1 , 0 , NULL , { NULL , NULL }
212 };
213
214const TCB ____BEGIN_OFF_TCB_texptn = {
215 { NULL, NULL }, NULL, 0, 0,
216 0 , 0 , 0 , 1 , NULL , { NULL , NULL }
217 };
218
219const TINIB ____BEGIN_OFF_TINIB_exinf = {
220 0 , (intptr_t)1 , NULL , 0 , 0 , NULL , 0 , NULL
221 };
222
223const TINIB ____BEGIN_OFF_TINIB_task = {
224 0 , NULL , (TASK)1 , 0 , 0 , NULL , 0 , NULL
225 };
226
Note: See TracBrowser for help on using the repository browser.