source: atk2-sc3_fl850f1l/kernel/kernel_mem.tf@ 473

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

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

File size: 21.3 KB
Line 
1$
2$ TOPPERS ATK2
3$ Toyohashi Open Platform for Embedded Real-Time Systems
4$ Automotive Kernel Version 2
5$
6$ Copyright (C) 2011-2015 by Center for Embedded Computing Systems
7$ Graduate School of Information Science, Nagoya Univ., JAPAN
8$ Copyright (C) 2011-2015 by FUJI SOFT INCORPORATED, JAPAN
9$ Copyright (C) 2011-2013 by Spansion LLC, USA
10$ Copyright (C) 2011-2015 by NEC Communication Systems, Ltd., JAPAN
11$ Copyright (C) 2011-2015 by Panasonic Advanced Technology Development Co., Ltd., JAPAN
12$ Copyright (C) 2011-2014 by Renesas Electronics Corporation, JAPAN
13$ Copyright (C) 2011-2015 by Sunny Giken Inc., JAPAN
14$ Copyright (C) 2011-2015 by TOSHIBA CORPORATION, JAPAN
15$ Copyright (C) 2011-2015 by Witz Corporation
16$ Copyright (C) 2014-2015 by AISIN COMCRUISE Co., Ltd., JAPAN
17$ Copyright (C) 2014-2015 by eSOL Co.,Ltd., JAPAN
18$ Copyright (C) 2014-2015 by SCSK Corporation, JAPAN
19$
20$ 上記著作権者は,以下の(1)(4)の条件を満たす場合に限り,本ソフトウェ
21$ ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
22$ 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
23$ (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
24$ 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
25$ スコード中に含まれていること.
26$ (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
27$ 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
28$ 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
29$ の無保証規定を掲載すること.
30$ (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
31$ 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
32$ と.
33$ (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
34$ 作権表示,この利用条件および下記の無保証規定を掲載すること.
35$ (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
36$ 報告すること.
37$ (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
38$ 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
39$ また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
40$ 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
41$ 免責すること.
42$
43$ 本ソフトウェアは,AUTOSAR(AUTomotive Open System ARchitecture)仕
44$ 様に基づいている.上記の許諾は,AUTOSARの知的財産権を許諾するもので
45$ はない.AUTOSARは,AUTOSAR仕様に基づいたソフトウェアを商用目的で利
46$ 用する者に対して,AUTOSARパートナーになることを求めている.
47$
48$ 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
49$ よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
50$ に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
51$ アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
52$ の責任を負わない.
53$
54$ $Id: kernel_mem.tf 187 2015-06-25 03:39:04Z t_ishikawa $
55$
56
57$ パス2,パス3からの情報の読込み
58$
59$INCLUDE "cfg2_out.tf"$
60$INCLUDE "cfg3_out.tf"$
61$INCLUDE "kernel/kernel_common.tf"$
62
63$
64$ データセクションのLMAからVMAへのコピー
65$
66$COPY_LMA()$
67
68$ =====================================================================
69$ kernel_mem.cの共通部分の生成
70$ =====================================================================
71
72$FILE "kernel_mem.c"$
73/* kernel_mem.c */$NL$
74#include "kernel/kernel_int.h"$NL$
75#include "Os_Lcfg.h"$NL$
76#include "kernel_mem.h"$NL$
77#ifndef TOPPERS_EMPTY_LABEL$NL$
78#define TOPPERS_EMPTY_LABEL(x, y) x y[0]$NL$
79#endif$NL$
80$NL$
81
82/*$NL$
83$SPC$* Include Directives (#include)$NL$
84$SPC$*/$NL$
85$NL$
86$INCLUDES$
87$NL$
88
89$ =====================================================================
90$ シンボルと仮メモリオブジェクト初期化ブロックの読込みと前処理
91$ =====================================================================
92
93$
94$ シンボルと仮メモリオブジェクト初期化ブロックの読込み
95$
96$ MO.BASEADDR[moid]:メモリオブジェクトの先頭番地
97$ MO.LIMITADDR[moid]:メモリオブジェクトの上限番地
98$ MO.POFFSET[moid]:物理アドレスとのオフセット
99$ MO_MEMTOP_LIST:サイズが0でないメモリオブジェクトのリスト
100
101$IF !OMIT_STANDARD_MEMINIB$
102 $MO_MEMTOP_LIST = {}$
103 $memtop_table = SYMBOL("memtop_table")$
104 $offset = 0$
105 $FOREACH moid MO_START_LIST$
106 $IF MO.LINKER[moid]$
107 $MO.BASEADDR[moid] = START_SYMBOL(MO.MLABEL[moid])$
108 $MO.LIMITADDR[moid] = LIMIT_SYMBOL(MO.MLABEL[moid])$
109 $MO.POFFSET[moid] = 0$
110 $ELSE$
111 $MO.BASEADDR[moid] = PEEK(memtop_table + offset, sizeof_void_ptr)$
112 $offset = offset + sizeof_void_ptr$
113 $MO.LIMITADDR[moid] = (MO.BASEADDR[moid] + MO.SIZE[moid]) & ((1 << sizeof_void_ptr * 8) - 1)$
114 $IF LENGTH(MO.PADDR[moid])$
115 $MO.POFFSET[moid] = MO.PADDR[moid] - MO.BASEADDR[moid]$
116 $ELSE$
117 $MO.POFFSET[moid] = 0$
118 $END$
119 $END$
120
121 $IF MO.BASEADDR[moid] != MO.LIMITADDR[moid]$
122 $IF MO.BASEADDR[moid] < MO.LIMITADDR[moid]
123 || MO.LIMITADDR[moid] == 0$
124 $MO_MEMTOP_LIST = APPEND(MO_MEMTOP_LIST, moid)$
125 $ELIF MO.TYPE[moid] == TOPPERS_ATTMEM$
126 $ERROR MO.TEXT_LINE[moid]$
127 $FORMAT(_("%1% `%2%\' is too large"),
128 "size", MO.SIZE[moid])$
129 $END$
130 $ELSE$
131 $ERROR MO.TEXT_LINE[moid]$
132 $FORMAT(_("illegal memory object size"))$
133 $END$
134 $END$
135 $END$
136 $END$
137$END$
138
139$
140$ メモリオブジェクトの重なりのチェック
141$
142$ MO.SUPPRESSLIMIT[moid]:次のメモリオブジェクトと隣接している
143$ MO.MERGED[moid]:併合されたユーザスタック領域の併合先
144$ MO.MERGELAST[moid]:併合された最後のユーザスタック領域(併合先のメモ
145$ リオブジェクトに設定)
146$ MO_MEMTOP_ORDER:メモリオブジェクトのベースアドレス順のリスト
147
148$MO_MEMTOP_ORDER = {}$
149$prev = 0$
150$FOREACH moid SORT(MO_MEMTOP_LIST, "MO.BASEADDR")$
151$ // ユーザスタック領域は併合される前の情報を用いてタスクスタックのMPU情報生成
152 $IF MO.TYPE[moid] == TOPPERS_USTACK$
153 $MO.NOMERGE_BASEADDR[moid] = MO.BASEADDR[moid]$
154 $MO.NOMERGE_LIMITADDR[moid] = MO.LIMITADDR[moid]$
155 $END$
156 $IF !prev || (MO.LIMITADDR[prev] <= MO.BASEADDR[moid]
157 && MO.LIMITADDR[prev] != 0)$
158$ // メモリオブジェクトの領域に重なりがない場合
159 $IF prev && MO.LIMITADDR[prev] == MO.BASEADDR[moid]$
160$ // メモリオブジェクトの領域が連続している場合
161 $IF MO.TYPE[moid] == TOPPERS_USTACK
162 && MO.TYPE[prev] == TOPPERS_USTACK
163 && MO.OSAPID[prev] == MO.OSAPID[moid]$
164$ // ユーザスタック領域の併合処理(連続している場合)
165 $MO.BASE[moid] = MO.BASE[prev]$
166 $MO.BASEADDR[moid] = MO.BASEADDR[prev]$
167 $MO.SIZE[prev] = MO.LIMITADDR[moid] - MO.BASEADDR[prev]$
168 $MO.LIMITADDR[prev] = MO.LIMITADDR[moid]$
169 $MO.SIZE[moid] = MO.SIZE[prev]$
170 $MO.MERGED[moid] = prev$
171 $MO.MERGELAST[prev] = moid$
172 $ELSE$
173 $MO.SUPPRESSLIMIT[prev] = 1$
174 $MO_MEMTOP_ORDER = APPEND(MO_MEMTOP_ORDER, moid)$
175 $prev = moid$
176 $END$
177 $ELSE$
178$ // メモリオブジェクトの領域が連続していない場合
179 $MO_MEMTOP_ORDER = APPEND(MO_MEMTOP_ORDER, moid)$
180 $prev = moid$
181 $END$
182 $ELSE$
183$ // メモリオブジェクトの領域に重なりがある場合
184 $IF MO.TYPE[moid] == TOPPERS_USTACK && !MO.LINKER[moid]
185 && MO.TYPE[prev] == TOPPERS_USTACK && !MO.LINKER[prev]
186 && MO.OSAPID[prev] == MO.OSAPID[moid]$
187$ // ユーザスタック領域の併合処理(重なりがある場合)
188 $MO.TSKID[prev] = 0$
189 $MO.TSKID[moid] = 0$
190 $MO.BASE[moid] = MO.BASE[prev]$
191 $MO.BASEADDR[moid] = MO.BASEADDR[prev]$
192 $IF MO.LIMITADDR[prev] < MO.LIMITADDR[moid]
193 && MO.LIMITADDR[prev] != 0$
194 $MO.SIZE[prev] = MO.LIMITADDR[moid] - MO.BASEADDR[prev]$
195 $MO.LIMITADDR[prev] = MO.LIMITADDR[moid]$
196 $ELSE$
197 $MO.LIMITADDR[moid] = MO.LIMITADDR[prev]$
198 $END$
199 $MO.SIZE[moid] = MO.SIZE[prev]$
200 $MO.MERGED[moid] = prev$
201 $MO.MERGELAST[prev] = moid$
202 $ELSE$
203$ // メモリオブジェクトの領域に重なりがある場合
204 $IF !(MO.TYPE[moid] == TOPPERS_USTACK && MO.TYPE[prev] == TOPPERS_USTACK)$
205$ // エラーメッセージの出力
206 $IF MO.TYPE[moid] == TOPPERS_ATTMEM$
207 $ERROR MO.TEXT_LINE[moid]$
208 $FORMAT(_("memory object overlaps with another memory object"))$
209 $END$
210 $ELIF MO.TYPE[prev] == TOPPERS_ATTMEM$
211 $ERROR MO.TEXT_LINE[prev]$
212 $FORMAT(_("memory object overlaps with another memory object"))$
213 $END$
214 $ELIF MO.TYPE[moid] == TOPPERS_USTACK$
215 $ERROR MO.TEXT_LINE[moid]$
216 $FORMAT(_("user stack area overlaps with another memory object"))$
217 $END$
218 $ELIF MO.TYPE[prev] == TOPPERS_USTACK$
219 $ERROR MO.TEXT_LINE[prev]$
220 $FORMAT(_("user stack area overlaps with another memory object"))$
221 $END$
222 $ELSE$
223 $ERROR MO.TEXT_LINE[moid]$
224 $FORMAT(_("memory objects overlap"))$
225 $END$
226 $END$
227 $END$
228 $END$
229 $END$
230$END$
231$IF MO.LIMITADDR[prev] == 0$
232 $MO.SUPPRESSLIMIT[prev] = 1$
233$END$
234
235$ =====================================================================
236$ メモリオブジェクト初期化ブロックの生成
237$ =====================================================================
238
239$IF ISFUNCTION("GENERATE_MEMINIB_TABLE")$
240$ // ターゲット依存部のメモリオブジェクト初期化ブロック生成処理を呼ぶ
241 $GENERATE_MEMINIB_TABLE()$
242$ELIF !OMIT_STANDARD_MEMINIB$
243$ // メモリオブジェクト初期化ブロックに出力するエントリの決定
244$
245$ // tnum_meminib:メモリオブジェクト初期化ブロックに出力するエントリ数
246$ // genzero:アドレス0に対応するエントリを出力する
247 $tnum_meminib = 0$
248 $prev = 0$
249 $FOREACH moid MO_MEMTOP_ORDER$
250 $IF !prev && MO.BASEADDR[moid] != 0$
251 $genzero = 1$
252 $tnum_meminib = tnum_meminib + 1$
253 $END$
254 $IF LENGTH(MO.SUPPRESSLIMIT[moid])$
255 $tnum_meminib = tnum_meminib + 1$
256 $ELSE$
257 $tnum_meminib = tnum_meminib + 2$
258 $END$
259 $prev = moid$
260 $END$
261
262$ // tsize_meminibの妥当性チェック
263 $IF tsize_meminib < tnum_meminib$
264 $ERROR$$FORMAT(_("illegal memory object initialization block size"))$$END$
265 $END$
266
267$ // tnum_meminibの生成
268 const uint32 tnum_meminib = $tnum_meminib$U;$NL$
269 $NL$
270
271$ // memtop_tableの生成
272 void *const memtop_table[$tsize_meminib$] = {$NL$
273 $IF LENGTH(genzero)$
274 $TAB$0,$NL$
275 $END$
276 $JOINEACH moid MO_MEMTOP_ORDER ",\n"$
277 $IF MO.LINKER[moid]$
278 $TAB$&__start_$MO.MLABEL[moid]$
279 $SPC$/* $FORMAT("%x", MO.BASEADDR[moid])$ */
280 $IF !LENGTH(MO.SUPPRESSLIMIT[moid])$
281 ,$NL$$TAB$&__limit_$MO.MLABEL[ALT(MO.MERGELAST[moid],moid)]$
282 $SPC$/* $FORMAT("%x", MO.LIMITADDR[moid])$ */
283 $END$
284 $ELSE$
285 $TAB$(void *)($MO.BASE[moid]$)
286 $SPC$/* $FORMAT("%x", MO.BASEADDR[moid])$ */
287 $IF !LENGTH(MO.SUPPRESSLIMIT[moid])$
288 ,$NL$$TAB$(void *)(((uint8 *)($MO.BASE[moid]$)) + ($MO.SIZE[moid]$))
289 $SPC$/* $FORMAT("%x", MO.LIMITADDR[moid])$ */
290 $END$
291 $END$
292 $END$
293 $IF tnum_meminib < tsize_meminib$
294 $FOREACH i RANGE(tnum_meminib + 1, tsize_meminib)$
295 ,$NL$$TAB$NULL
296 $END$
297 $END$$NL$
298 };$NL$
299 $NL$
300
301$ // meminib_tableの生成
302 const MEMINIB meminib_table[$tsize_meminib$] = {$NL$
303 $IF LENGTH(genzero)$
304 $TAB${ TA_NULL, TACP_KERNEL, TACP_KERNEL, TACP_KERNEL },$NL$
305 $END$
306 $JOINEACH moid MO_MEMTOP_ORDER ",\n"$
307 $TAB${
308 $IF MO.TYPE[moid] == TOPPERS_USTACK$
309 $SPC$TOPPERS_USTACK|($MO.MEMATR[moid]$),
310 $ELSE$
311 $IF MO.TYPE[moid] == TOPPERS_ATTMEM$
312 $SPC$TOPPERS_ATTMEM|($FORMAT("0x%xU", +MO.MEMATR[moid])$),
313 $ELSE$
314 $SPC$TOPPERS_ATTSEC|($FORMAT("0x%xU", +MO.MEMATR[moid])$),
315 $END$
316 $END$
317 $SPC$$MO.ACPTN_R[moid]$,
318 $SPC$$MO.ACPTN_W[moid]$,
319 $SPC$$MO.ACPTN_X[moid]$
320 $SPC$}
321 $IF !LENGTH(MO.SUPPRESSLIMIT[moid])$
322 ,$NL$$TAB${ TA_NULL, TACP_KERNEL, TACP_KERNEL, TACP_KERNEL }
323 $END$
324 $END$
325 $IF tnum_meminib < tsize_meminib$
326 $FOREACH i RANGE(tnum_meminib + 1, tsize_meminib)$
327 ,$NL$$TAB${ 0U, 0U, 0U, 0U }
328 $END$
329 $END$$NL$
330 };$NL$
331 $NL$
332$END$
333
334$
335$ dataセクション初期化ブロックの生成
336$
337$IF !OMIT_IDATA && LENGTH(DATASEC_LIST) && !LENGTH(DATASEC_LIST_OPTIMIZED)$
338$ // サイズが0でないdataセクションのリスト(MO_DATASEC_LIST)を作成
339$ // パス3で作成していない場合には,ここで作成する.
340 $MO_DATASEC_LIST = {}$
341 $FOREACH moid DATASEC_LIST$
342 $IF MO.BASEADDR[moid] != MO.LIMITADDR[moid]$
343 $MO_DATASEC_LIST = APPEND(MO_DATASEC_LIST, moid)$
344 $END$
345 $END$
346$END$
347
348$IF !OMIT_STANDARD_DATASECINIB$
349 /*$NL$
350 $SPC$* Data Section Management Functions$NL$
351 $SPC$*/$NL$
352 $NL$
353
354 $IF !OMIT_IDATA && LENGTH(DATASEC_LIST)$
355$ // dataセクション初期化ブロックで使うシンボルのextern宣言
356 $FOREACH moid MO_DATASEC_LIST$
357 extern uint8 __start_$MO.SLABEL[moid]$;$NL$
358 extern uint8 __end_$MO.SLABEL[moid]$;$NL$
359 extern uint8 __start_$MO.ILABEL[moid]$;$NL$
360 $END$$NL$
361
362$ // dataセクションの数
363 #define TNUM_DATASEC $IF !OMIT_IDATA$$LENGTH(MO_DATASEC_LIST)$U$ELSE$0$END$$NL$
364 #define TNUM_DATASEC_TBL $IF !OMIT_IDATA$$LENGTH(DATASEC_LIST)$U$ELSE$0$END$$NL$
365 $NL$
366
367 $IF ISFUNCTION("DEFINE_CONST_VAR")$
368 $DEFINE_CONST_VAR("const uint32", "tnum_datasec")$ = TNUM_DATASEC;$NL$
369 $ELSE$
370 const uint32 tnum_datasec = TNUM_DATASEC;$NL$
371 $END$
372 $NL$
373
374 $IF ISFUNCTION("DEFINE_CONST_VAR")$
375 $DEFINE_CONST_VAR("const DATASECINIB", "datasecinib_table[TNUM_DATASEC_TBL]")$ = {
376 $ELSE$
377 const DATASECINIB datasecinib_table[TNUM_DATASEC_TBL] = {
378 $END$
379 $IF LENGTH(MO_DATASEC_LIST)$
380 $NL$
381 $JOINEACH moid MO_DATASEC_LIST ",\n"$
382 $TAB${ &__start_$MO.SLABEL[moid]$, &__end_$MO.SLABEL[moid]$,
383 &__start_$MO.ILABEL[moid]$ }
384 $END$$NL$
385 $ELSE$
386 { 0U, 0U, 0U }
387 $END$
388 };$NL$
389 $ELSE$
390 const uint32 tnum_datasec = 0;$NL$
391 TOPPERS_EMPTY_LABEL(const DATASECINIB, datasecinib_table);$NL$
392 $END$$NL$
393$END$
394
395$
396$ bssセクション初期化ブロックの生成
397$
398$IF LENGTH(BSSSEC_LIST) && !LENGTH(BSSSEC_LIST_OPTIMIZED)$
399$ // サイズが0でないbssセクションのリスト(MO_BSSSEC_LIST)を作成
400 $MO_BSSSEC_LIST = {}$
401 $FOREACH moid BSSSEC_LIST$
402 $IF MO.BASEADDR[moid] != MO.LIMITADDR[moid]$
403 $MO_BSSSEC_LIST = APPEND(MO_BSSSEC_LIST, moid)$
404 $END$
405 $END$
406$END$
407
408$IF !OMIT_STANDARD_BSSSECINIB$
409 /*$NL$
410 $SPC$* BSS Section Management Functions$NL$
411 $SPC$*/$NL$
412 $NL$
413
414 $IF LENGTH(BSSSEC_LIST)$
415$ // bssセクション初期化ブロックで使うシンボルのextern宣言
416 $FOREACH moid MO_BSSSEC_LIST$
417 extern uint8 __start_$MO.SLABEL[moid]$;$NL$
418 extern uint8 __end_$MO.SLABEL[moid]$;$NL$
419 $END$$NL$
420
421$ // bssセクションの数
422 const uint32 tnum_bsssec = $LENGTH(MO_BSSSEC_LIST)$U;$NL$
423 $NL$
424
425$ // bssセクション初期化ブロック
426 const BSSSECINIB bsssecinib_table[$LENGTH(BSSSEC_LIST)$] = {
427 $IF LENGTH(MO_BSSSEC_LIST)$
428 $NL$
429 $JOINEACH moid MO_BSSSEC_LIST ",\n"$
430 $TAB${ &__start_$MO.SLABEL[moid]$, &__end_$MO.SLABEL[moid]$ }
431 $END$$NL$
432 $ELSE$
433 { 0, 0 }
434 $END$
435 };$NL$
436 $ELSE$
437 const uint32 tnum_bsssec = 0U;$NL$
438 TOPPERS_EMPTY_LABEL(const BSSSECINIB, bsssecinib_table);$NL$
439 $END$$NL$
440$END$
441
442$ ターゲット依存部で必要なMPUINFOBを出力する
443$GENERATE_TARGET_MPUINFOB()$
444
445$FOREACH moid MO_MEMTOP_LIST$
446$ // ユーザスタック領域は併合される前の情報を用いてタスクスタックのMPU情報生成
447 $IF MO.TYPE[moid] == TOPPERS_USTACK$
448$ // 併合された情報を退避して,タスク初期化ブロック生成後に復帰
449 $tmp = MO.BASEADDR[moid]$
450 $MO.BASEADDR[moid] = MO.NOMERGE_BASEADDR[moid]$
451 $MO.NOMERGE_BASEADDR[moid] = tmp$
452 $tmp = MO.LIMITADDR[moid]$
453 $MO.LIMITADDR[moid] = MO.NOMERGE_LIMITADDR[moid]$
454 $MO.NOMERGE_LIMITADDR[moid] = tmp$
455 $END$
456$END$
457
458$ タスク初期化ブロックを出力する(kernel_common.tf)
459$GENERATE_TINIB_TABLE()$
460
461$FOREACH moid MO_MEMTOP_LIST$
462$ // 併合された情報を復帰
463 $IF MO.TYPE[moid] == TOPPERS_USTACK$
464 $MO.BASEADDR[moid] = MO.NOMERGE_BASEADDR[moid]$
465 $MO.LIMITADDR[moid] = MO.NOMERGE_LIMITADDR[moid]$
466 $END$
467$END$
468
469$ OSアプリケーション初期化ブロックを出力する(kernel_common.tf)
470$GENERATE_OSAPINIB_TABLE()$
471
472$FILE "kernel_mem.h"$
473/* kernel_mem.h */$NL$
474#ifndef TOPPERS_KERNEL_MEM_H$NL$
475#define TOPPERS_KERNEL_MEM_H$NL$
476/*$NL$
477$SPC$* Include Directives (#include)$NL$
478$SPC$*/$NL$
479$NL$
480$INCLUDES$
481$NL$
482$NL$
483
484$IF !ISFUNCTION("GENERATE_MEMINIB_TABLE") && !OMIT_STANDARD_MEMINIB$
485$ // memtop_tableで参照するラベルの宣言の生成
486 $FOREACH moid MO_MEMTOP_ORDER$
487 $IF MO.LINKER[moid]$
488 extern uint8 __start_$MO.MLABEL[moid]$;$NL$
489 $IF !LENGTH(MO.SUPPRESSLIMIT[moid])$
490 extern uint8 __limit_$MO.MLABEL[ALT(MO.MERGELAST[moid],moid)]$;
491 $NL$
492 $END$
493 $END$
494 $END$$NL$
495$END$
496
497$ タスクスタック領域をextern宣言する(kernel_common.tf)
498$GENERATE_EXPORT_TSK_STK()$
499
500$ タスクをextern宣言する(kernel_common.tf)
501$EXTERN_TSK()$
502
503$ OSAP管理ブロックをextern宣言する(kernel_common.tf)
504$EXTERN_OSAPCB()$
505
506$ タスク管理ブロックをextern宣言する(kernel_common.tf)
507$EXTERN_TCB()$
508
509#endif /* TOPPERS_KERNEL_MEM_H */$NL$
510
511$ =====================================================================
512$ オブジェクト管理領域等に関するエラーチェック
513$ =====================================================================
514
515$
516$ メモリ領域を含むメモリオブジェクトのサーチ
517$
518$FUNCTION SEARCH_MO$
519 $_base = ARGV[1]$
520 $_limit = (ARGV[1] + ARGV[2]) & ((1 << sizeof_void_ptr * 8) - 1)$
521 $IF _limit < _base && _limit != 0$
522 $RESULT = 0$
523 $ELSE$
524 $i = 1$
525 $j = LENGTH(MO_MEMTOP_ORDER)$
526 $found = 0$
527
528 $WHILE !found && i <= j$
529 $k = (i + j) / 2$
530 $_moid = AT(MO_MEMTOP_ORDER,k-1)$
531 $IF _base < MO.BASEADDR[_moid]$
532 $j = k - 1$
533 $ELIF _base >= MO.LIMITADDR[_moid] && MO.LIMITADDR[_moid] != 0$
534 $i = k + 1$
535 $ELSE$
536 $found = _moid$
537 $END$
538 $END$
539 $IF found && _limit > MO.LIMITADDR[found] && MO.LIMITADDR[found] != 0$
540 $found = 0$
541 $END$
542 $RESULT = found$
543 $END$
544$END$
545
546$
547$ メモリ領域がカーネル専用のメモリオブジェクトに含まれているかのチェック
548$
549$FUNCTION CHECK_MEMOBJ_KERNEL$
550 $moid = SEARCH_MO(ARGV[1], ARGV[2])$
551 $IF moid && MO.ACPTN1[moid] == TACP_KERNEL
552 && MO.ACPTN2[moid] == TACP_KERNEL$
553 $RESULT = 0$
554 $ELSE$
555 $RESULT = 1$
556 $END$
557$END$
558
559$
560$ システムタスクのスタック領域とユーザタスクのシステムスタック領域が,
561$ カーネル専用のメモリオブジェクトに含まれているかのチェック
562$
563$IF !USE_TSKINICTXB$
564 $tinib = SYMBOL("tinib_table")$
565 $FOREACH tskid TSK.ID_LIST$
566 $sstk = PEEK(tinib + offsetof_TINIB_sstk, sizeof_void_ptr)$
567 $sstksz = PEEK(tinib + offsetof_TINIB_sstksz, sizeof_MemorySizeType)$
568 $IF CHECK_MEMOBJ_KERNEL(sstk, sstksz)$
569 $IF TSK.OSAPID[tskid] == TDOM_KERNEL$
570 $ERROR TSK.TEXT_LINE[tskid]$
571 $FORMAT(_("stack area of `%1%\' is not included in any kernel memory object"), tskid)$
572 $END$
573 $ELSE$
574 $ERROR TSK.TEXT_LINE[tskid]$
575 $FORMAT(_("system stack area of `%1%\' is not included in any kernel memory object"), tskid)$
576 $END$
577 $END$
578 $END$
579 $tinib = tinib + sizeof_TINIB$
580 $END$
581$END$
582
583$
584$ 非タスクコンテキスト用のスタック領域が,カーネル専用のメモリオブジェ
585$ クトに含まれているかのチェック
586$
587$istk = PEEK(SYMBOL("_ostk"), sizeof_void_ptr)$
588$istksz = PEEK(SYMBOL("_ostksz"), sizeof_StackType)$
589$IF CHECK_MEMOBJ_KERNEL(istk, istksz)$
590 $ERROR OSTK.TEXT_LINE[1]$
591 $FORMAT(_("interrupt context stack area is not included in any kernel memory object"))$
592 $END$
593$END$
594
595$ =====================================================================
596$ アラインメントとNULLでないかに関するエラーチェック
597$ =====================================================================
598
599$
600$ 関数の先頭番地のチェック
601$
602$IF CHECK_FUNC_ALIGN || CHECK_FUNC_NONNULL$
603$ // タスクとタスク例外処理ルーチンの先頭番地のチェック
604 $tinib = SYMBOL("tinib_table")$
605 $FOREACH tskid TSK.ID_LIST$
606 $task = PEEK(tinib + offsetof_TINIB_task, sizeof_FunctionRefType)$
607 $IF CHECK_FUNC_ALIGN && (task & (CHECK_FUNC_ALIGN - 1)) != 0$
608 $ERROR TSK.TEXT_LINE[tskid]$
609 $FORMAT(_("%1% `%2%\' of `%3%\' in %4% is not aligned"),
610 "task", TSK.TASK[tskid], tskid, "OsTask")$$END$
611 $END$
612 $IF CHECK_FUNC_NONNULL && task == 0$
613 $ERROR TSK.TEXT_LINE[tskid]$
614 $FORMAT(_("%1% `%2%\' of `%3%\' in %4% is null"),
615 "task", TSK.TASK[tskid], tskid, "OsTask")$$END$
616 $END$
617 $tinib = tinib + sizeof_TINIB$
618 $END$
619$END$
620
621$
622$ スタック領域の先頭番地のチェック
623$
624$IF CHECK_STACK_ALIGN || CHECK_STACK_NONNULL$
625 $tinib = SYMBOL("tinib_table")$
626 $FOREACH tskid TSK.ID_LIST$
627$ // タスクのシステムスタック領域の先頭番地のチェック
628 $IF USE_TSKINICTXB$
629 $sstk = GET_SSTK_TSKINICTXB(tinib)$
630 $ELSE$
631 $sstk = PEEK(tinib + offsetof_TINIB_sstk, sizeof_void_ptr)$
632 $END$
633 $IF CHECK_STACK_ALIGN && (sstk & (CHECK_STACK_ALIGN - 1)) != 0$
634 $IF TSK.OSAPID[tskid] == TDOM_KERNEL$
635 $ERROR TSK.TEXT_LINE[tskid]$
636 $FORMAT(_("%1% `%2%\' of `%3%\' in %4% is not aligned"),
637 "stk", TSK.STK[tskid], tskid, "OsTask")$$END$
638 $ELSE$
639 $ERROR TSK.TEXT_LINE[tskid]$
640 $FORMAT(_("%1% `%2%\' of `%3%\' in %4% is not aligned"),
641 "sstk", TSK.SSTK[tskid], tskid, "OsTask")$$END$
642 $END$
643 $END$
644 $IF CHECK_STACK_NONNULL && sstk == 0$
645 $IF TSK.OSAPID[tskid] == TDOM_KERNEL$
646 $ERROR TSK.TEXT_LINE[tskid]$
647 $FORMAT(_("%1% `%2%\' of `%3%\' in %4% is null"),
648 "stk", TSK.STK[tskid], tskid, "OsTask")$$END$
649 $ELSE$
650 $ERROR TSK.TEXT_LINE[tskid]$
651 $FORMAT(_("%1% `%2%\' of `%3%\' in %4% is null"),
652 "sstk", TSK.SSTK[tskid], tskid, "OsTask")$$END$
653 $END$
654 $END$
655
656$ // タスクのユーザスタック領域の先頭番地のチェック
657 $IF !OSAP.TRUSTED[TSK.OSAPID[tskid]]$
658 $IF USE_TSKINICTXB$
659 $ustk = GET_USTK_TSKINICTXB(tinib)$
660 $ELSE$
661 $ustk = PEEK(tinib + offsetof_TINIB_ustk, sizeof_void_ptr)$
662 $END$
663 $IF CHECK_USTACK_ALIGN && (ustk & (CHECK_USTACK_ALIGN - 1)) != 0$
664 $ERROR TSK.TEXT_LINE[tskid]$
665 $FORMAT(_("%1% `%2%\' of `%3%\' in %4% is not aligned"),
666 "stk", TSK.STK[tskid], tskid, "OsTask")$$END$
667 $END$
668 $IF CHECK_USTACK_NONNULL && ustk == 0$
669 $ERROR TSK.TEXT_LINE[tskid]$
670 $FORMAT(_("%1% `%2%\' of `%3%\' in %4% is null"),
671 "stk", TSK.STK[tskid], tskid, "OsTask")$$END$
672 $END$
673 $END$
674
675 $tinib = tinib + sizeof_TINIB$
676 $END$
677
678$ // 非タスクコンテキスト用のスタック領域の先頭番地のチェック
679 $istk = PEEK(SYMBOL("_ostk"), sizeof_void_ptr)$
680 $IF CHECK_STACK_ALIGN && (istk & (CHECK_STACK_ALIGN - 1)) != 0$
681 $ERROR OSTK.TEXT_LINE[1]$
682 $FORMAT(_("%1% `%2%\' in %3% is not aligned"),
683 "istk", OSTK.STK[1], "OsOsStack")$$END$
684 $END$
685 $IF CHECK_STACK_NONNULL && istk == 0$
686 $ERROR OSTK.TEXT_LINE[1]$
687 $FORMAT(_("%1% `%2%\' in %3% is null"),
688 "istk", OSTK.STK[1], "OsOsStack")$$END$
689 $END$
690$END$
Note: See TracBrowser for help on using the repository browser.