source: atk2-sc3_fl850f1l/arch/v850_ccrh/prc_meminib.tf@ 117

Last change on this file since 117 was 117, checked in by ertl-ishikawa, 9 years ago

ATK2-SC3 1.3.2 FL850F1L(RH850F1L)依存部(GCC/GHS/CCRH)を追加

File size: 11.5 KB
Line 
1$
2$ TOPPERS ATK2
3$ Toyohashi Open Platform for Embedded Real-Time Systems
4$ Automotive Kernel Version 2
5$
6$ Copyright (C) 2014-2015 by Center for Embedded Computing Systems
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$ 本ソフトウェアは,AUTOSAR(AUTomotive Open System ARchitecture)仕
33$ 様に基づいている.上記の許諾は,AUTOSARの知的財産権を許諾するもので
34$ はない.AUTOSARは,AUTOSAR仕様に基づいたソフトウェアを商用目的で利
35$ 用する者に対して,AUTOSARパートナーになることを求めている.
36$
37$ 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
38$ よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
39$ に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
40$ アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
41$ の責任を負わない.
42$
43$ $Id: prc_meminib.tf 189 2015-06-26 01:54:57Z t_ishikawa $
44$
45
46$ =====================================================================
47$ kernel_mem.cの共通部分の生成
48$ =====================================================================
49
50$FILE "kernel_mem.c"$
51
52$ =====================================================================
53$ シンボルと仮メモリオブジェクト初期化ブロックの読込みと前処理
54$ =====================================================================
55
56$
57$ シンボルと仮メモリオブジェクト初期化ブロックの読込み
58$
59$ MO.BASEADDR[moid]:メモリオブジェクトの先頭番地
60$ MO.LIMITADDR[moid]:メモリオブジェクトの上限番地
61$ MO.POFFSET[moid]:物理アドレスとのオフセット
62$ MO_MEMTOP_LIST:サイズが0でないメモリオブジェクトのリスト
63
64$OMIT_STANDARD_MEMINIB = 1$
65$IF OMIT_STANDARD_MEMINIB$
66 $MO_MEMTOP_LIST = {}$
67 $memtop_table = SYMBOL("memtop_table")$
68 $offset = 0$
69 $FOREACH moid MO_START_LIST$
70 $IF MO.LINKER[moid]$
71 $next = AT(MO_START_LIST, (FIND(MO_START_LIST, moid) + 1))$
72 $IF LENGTH(next)$
73 $last = FIND(MO_ORDER, next) - 1$
74 $ELSE$
75 $last = LENGTH(MO_ORDER) - 1$
76 $END$
77 $TRACE(MO.SECTION[moid])$
78 $FOREACH moid2 RANGE(FIND(MO_ORDER, moid), last)$
79 $moid2 = AT(MO_ORDER, moid2)$
80 $TRACE(MO.SECTION[moid2])$
81 $IF !LENGTH(MO.BASEADDR[moid])$
82 $MO.BASEADDR[moid] = START_SYMBOL(moid2)$
83 $END$
84 $IF LENGTH(LIMIT_SYMBOL(moid2))$
85 $MO.LIMITADDR[moid] = LIMIT_SYMBOL(moid2)$
86 $END$
87 $END$
88 $IF !LENGTH(MO.BASEADDR[moid])$
89 $IF LENGTH(MO.LIMITADDR[moid])$
90 $ERROR$conflict MO BASE and LIMIT$END$
91 $END$
92 $MO.BASEADDR[moid] = 0xffffffff$
93 $MO.LIMITADDR[moid] = 0xffffffff$
94 $END$
95 $IF LENGTH(MO.BASEADDR[moid])$
96 $IF !LENGTH(MO.LIMITADDR[moid])$
97 $ERROR$conflict MO BASE and LIMIT$END$
98 $END$
99 $END$
100 $MO.POFFSET[moid] = 0$
101 $ELSE$
102 $MO.BASEADDR[moid] = PEEK(memtop_table + offset, sizeof_void_ptr)$
103 $offset = offset + sizeof_void_ptr$
104 $MO.LIMITADDR[moid] = (MO.BASEADDR[moid] + MO.SIZE[moid]) & ((1 << sizeof_void_ptr * 8) - 1)$
105 $IF LENGTH(MO.PADDR[moid])$
106 $MO.POFFSET[moid] = MO.PADDR[moid] - MO.BASEADDR[moid]$
107 $ELSE$
108 $MO.POFFSET[moid] = 0$
109 $END$
110 $END$
111
112 $IF MO.BASEADDR[moid] != MO.LIMITADDR[moid]$
113 $IF MO.BASEADDR[moid] < MO.LIMITADDR[moid]
114 || MO.LIMITADDR[moid] == 0$
115 $MO_MEMTOP_LIST = APPEND(MO_MEMTOP_LIST, moid)$
116 $ELIF MO.TYPE[moid] == TOPPERS_ATTMEM$
117 $ERROR MO.TEXT_LINE[moid]$
118 $FORMAT(_("%1% `%2%\' is too large"),
119 "size", MO.SIZE[moid])$
120 $END$
121 $ELSE$
122 $ERROR MO.TEXT_LINE[moid]$
123 $FORMAT(_("illegal memory object size"))$$NL$
124 $FORMAT("0x%x", MO.BASEADDR[moid])$$NL$
125 $FORMAT("0x%x", MO.LIMITADDR[moid])$
126 $END$
127 $END$
128 $END$
129 $END$
130$END$
131
132$ =====================================================================
133$ メモリオブジェクト初期化ブロックの生成
134$ =====================================================================
135
136$FUNCTION GENERATE_MEMINIB_TABLE$
137$ // メモリオブジェクト初期化ブロックに出力するエントリの決定
138$
139$ // tnum_meminib:メモリオブジェクト初期化ブロックに出力するエントリ数
140$ // genzero:アドレス0に対応するエントリを出力する
141 $tnum_meminib = 0$
142 $prev = 0$
143 $TRACE(MO_MEMTOP_ORDER)$
144 $FOREACH moid MO_MEMTOP_ORDER$
145 $IF !prev && MO.BASEADDR[moid] != 0$
146 $genzero = 1$
147 $tnum_meminib = tnum_meminib + 1$
148 $END$
149 $IF LENGTH(MO.SUPPRESSLIMIT[moid])$
150 $tnum_meminib = tnum_meminib + 1$
151 $ELSE$
152 $tnum_meminib = tnum_meminib + 2$
153 $END$
154 $prev = moid$
155 $END$
156
157$ // tsize_meminibの妥当性チェック
158 $IF tsize_meminib < tnum_meminib$
159 $ERROR$$FORMAT(_("illegal memory object initialization block size"))$$END$
160 $END$
161
162$ // tnum_meminibの生成
163 const uint32 tnum_meminib = $tnum_meminib$U;$NL$
164 $NL$
165
166$ // memtop_tableの生成
167 void *const memtop_table[$tsize_meminib$] = {$NL$
168 $IF LENGTH(genzero)$
169 $TAB$0,$NL$
170 $END$
171 $JOINEACH moid MO_MEMTOP_ORDER ",\n"$
172 $IF MO.LINKER[moid]$
173 $TAB$$FORMAT("(void *)0x%x", MO.BASEADDR[moid])$
174 $SPC$/* #__s$MO.SECTION[moid]$ */
175 $IF !LENGTH(MO.SUPPRESSLIMIT[moid])$
176 ,$NL$$TAB$$FORMAT("(void *)0x%x", MO.LIMITADDR[moid])$
177 $SPC$/* #__e$MO.SECTION[ALT(MO.MERGELAST[moid],moid)]$ */
178 $END$
179 $ELSE$
180 $TAB$(void *)($MO.BASE[moid]$)
181 $SPC$/* $FORMAT("%x", MO.BASEADDR[moid])$ */
182 $IF !LENGTH(MO.SUPPRESSLIMIT[moid])$
183 ,$NL$$TAB$(void *)(((uint8 *)($MO.BASE[moid]$)) + ($MO.SIZE[moid]$))
184 $SPC$/* $FORMAT("%x", MO.LIMITADDR[moid])$ */
185 $END$
186 $END$
187 $END$
188 $IF tnum_meminib < tsize_meminib$
189 $FOREACH i RANGE(tnum_meminib + 1, tsize_meminib)$
190 ,$NL$$TAB$NULL
191 $END$
192 $END$$NL$
193 };$NL$
194 $NL$
195
196$ // meminib_tableの生成
197 const MEMINIB meminib_table[$tsize_meminib$] = {$NL$
198 $IF LENGTH(genzero)$
199 $TAB${ TA_NULL, TACP_KERNEL, TACP_KERNEL, TACP_KERNEL },$NL$
200 $END$
201 $JOINEACH moid MO_MEMTOP_ORDER ",\n"$
202 $TAB${
203 $IF MO.TYPE[moid] == TOPPERS_USTACK$
204 $SPC$TOPPERS_USTACK|($MO.MEMATR[moid]$),
205 $ELSE$
206 $IF MO.TYPE[moid] == TOPPERS_ATTMEM$
207 $SPC$TOPPERS_ATTMEM|($FORMAT("0x%xU", +MO.MEMATR[moid])$),
208 $ELSE$
209 $SPC$TOPPERS_ATTSEC|($FORMAT("0x%xU", +MO.MEMATR[moid])$),
210 $END$
211 $END$
212 $SPC$$MO.ACPTN_R[moid]$,
213 $SPC$$MO.ACPTN_W[moid]$,
214 $SPC$$MO.ACPTN_X[moid]$
215 $SPC$}
216 $IF !LENGTH(MO.SUPPRESSLIMIT[moid])$
217 ,$NL$$TAB${ TA_NULL, TACP_KERNEL, TACP_KERNEL, TACP_KERNEL }
218 $END$
219 $END$
220 $IF tnum_meminib < tsize_meminib$
221 $FOREACH i RANGE(tnum_meminib + 1, tsize_meminib)$
222 ,$NL$$TAB${ 0U, 0U, 0U, 0U }
223 $END$
224 $END$$NL$
225 };$NL$
226 $NL$
227
228$
229$ dataセクション初期化ブロックの生成
230$
231 $IF !OMIT_IDATA && LENGTH(DATASEC_LIST) && !LENGTH(DATASEC_LIST_OPTIMIZED)$
232$ // サイズが0でないdataセクションのリスト(MO_DATASEC_LIST)を作成
233$ // パス3で作成していない場合には,ここで作成する.
234 $MO_DATASEC_LIST = {}$
235 $FOREACH moid DATASEC_LIST$
236 $IF MO.BASEADDR[moid] != MO.LIMITADDR[moid]$
237 $MO_DATASEC_LIST = APPEND(MO_DATASEC_LIST, moid)$
238 $END$
239 $END$
240 $END$
241
242 $IF OMIT_STANDARD_DATASECINIB$
243 /*$NL$
244 $SPC$* Data Section Management Functions$NL$
245 $SPC$*/$NL$
246 $NL$
247
248$ // dataセクションの数
249 #define TNUM_DATASEC $IF !OMIT_IDATA$$LENGTH(MO_DATASEC_LIST)$U$ELSE$0$END$$NL$
250 #define TNUM_DATASEC_TBL $IF !OMIT_IDATA$$LENGTH(DATASEC_LIST)$U$ELSE$0$END$$NL$
251 $NL$
252
253 $IF ISFUNCTION("DEFINE_CONST_VAR")$
254 $DEFINE_CONST_VAR("const uint32", "tnum_datasec")$ = TNUM_DATASEC;$NL$
255 $ELSE$
256 const uint32 tnum_datasec = TNUM_DATASEC;$NL$
257 $END$
258 $NL$
259
260 $IF !OMIT_IDATA && LENGTH(DATASEC_LIST)$
261 $IF ISFUNCTION("DEFINE_CONST_VAR")$
262 $DEFINE_CONST_VAR("const DATASECINIB", "datasecinib_table[TNUM_DATASEC_TBL]")$ = {
263 $ELSE$
264 const DATASECINIB datasecinib_table[TNUM_DATASEC_TBL] = {
265 $END$
266 $IF LENGTH(MO_DATASEC_LIST)$
267 $NL$
268 $JOINEACH moid MO_DATASEC_LIST ",\n"$
269 $IF LENGTH(START_SYMBOL(moid))$
270 $TAB${ $FORMAT("(void *)0x%xU, (void *)0x%xU, (void *)0x%xU", START_SYMBOL(moid), LIMIT_SYMBOL(moid),
271 SYMBOL(FORMAT("__s%s", MO.SECTION[moid])))$ }
272 $ELSE$
273 $TAB${ 0U, 0U, 0U }
274 $END$
275 $SPC$ /* #__s$MO.SECTION[moid]$, &__e$MO.SECTION[moid]$,
276 &__s$MO.SECTION[moid]$.R */
277 $END$$NL$
278 $ELSE$
279 { 0U, 0U, 0U }
280 $END$
281 };$NL$
282 $ELSE$
283 TOPPERS_EMPTY_LABEL(const DATASECINIB, datasecinib_table);$NL$
284 $END$$NL$
285 $END$
286
287$
288$ bssセクション初期化ブロックの生成
289$
290 $IF LENGTH(BSSSEC_LIST) && !LENGTH(BSSSEC_LIST_OPTIMIZED)$
291$ // サイズが0でないbssセクションのリスト(MO_BSSSEC_LIST)を作成
292 $MO_BSSSEC_LIST = {}$
293 $FOREACH moid BSSSEC_LIST$
294 $IF MO.BASEADDR[moid] != MO.LIMITADDR[moid]$
295 $MO_BSSSEC_LIST = APPEND(MO_BSSSEC_LIST, moid)$
296 $END$
297 $END$
298 $END$
299
300 $IF OMIT_STANDARD_BSSSECINIB$
301 /*$NL$
302 $SPC$* BSS Section Management Functions$NL$
303 $SPC$*/$NL$
304 $NL$
305
306 $IF LENGTH(BSSSEC_LIST)$
307$ // bssセクションの数
308 const uint32 tnum_bsssec = $LENGTH(MO_BSSSEC_LIST)$U;$NL$
309 $NL$
310
311$ // bssセクション初期化ブロック
312 const BSSSECINIB bsssecinib_table[$LENGTH(BSSSEC_LIST)$] = {
313 $IF LENGTH(MO_BSSSEC_LIST)$
314 $NL$
315 $JOINEACH moid MO_BSSSEC_LIST ",\n"$
316 $IF LENGTH(START_SYMBOL(moid))$
317 $TAB${ $FORMAT("(void *)0x%xU, (void *)0x%xU", START_SYMBOL(moid), LIMIT_SYMBOL(moid))$ }
318 $ELSE$
319 $TAB${ 0, 0 }
320 $END$
321 $SPC$ /* #__s$MO.SECTION[moid]$, #__e$MO.SECTION[moid]$ */
322 $END$$NL$
323 $ELSE$
324 { 0, 0 }
325 $END$
326 };$NL$
327 $ELSE$
328 const uint32 tnum_bsssec = 0U;$NL$
329 TOPPERS_EMPTY_LABEL(const BSSSECINIB, bsssecinib_table);$NL$
330 $END$$NL$
331 $END$
332
333$END$
334
335$OMIT_STANDARD_DATASECINIB = 1$
336$OMIT_STANDARD_BSSSECINIB = 1$
337
Note: See TracBrowser for help on using the repository browser.