source: atk2-sc3-1.4.0-ntisr/kernel/kernel_mem.tf@ 172

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

ATK2-SC3 1.4.0 RH850依存部 非信頼C2ISR対応を追加

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