source: atk2-sc3_fl850f1l/arch/v850_ccrh/prc_mem.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: 15.7 KB
Line 
1$ ======================================================================
2$
3$ TOPPERS ATK2
4$ Toyohashi Open Platform for Embedded Real-Time Systems
5$ Automotive Kernel Version 2
6$
7$ Copyright (C) 2013-2015 by Center for Embedded Computing Systems
8$ Graduate School of Information Science, Nagoya Univ., JAPAN
9$ Copyright (C) 2013 by Embedded and Real-Time Systems Laboratory
10$ Graduate School of Information Science, Nagoya Univ., JAPAN
11$
12$ 上記著作権者は,以下の(1)(4)の条件を満たす場合に限り,本ソフトウェ
13$ ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
14$ 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
15$ (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
16$ 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
17$ スコード中に含まれていること.
18$ (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
19$ 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
20$ 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
21$ の無保証規定を掲載すること.
22$ (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
23$ 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
24$ と.
25$ (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
26$ 作権表示,この利用条件および下記の無保証規定を掲載すること.
27$ (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
28$ 報告すること.
29$ (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
30$ 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
31$ また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
32$ 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
33$ 免責すること.
34$
35$ 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
36$ よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
37$ に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
38$ アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
39$ の責任を負わない.
40$
41$
42$ =====================================================================
43
44$DEBUG_OPT_TF = 1$
45
46$FILE "kernel_mem.c"$
47#pragma section kernel
48
49$
50$ パス4のプロセッサ依存テンプレート(V850E2M用)
51$
52$FUNCTION GET_SSTK_TSKINICTXB$
53 $bottom = PEEK(ARGV[1] + offsetof_TINIB_TSKINICTXB_sstk_bottom, sizeof_void_ptr)$
54 $size = PEEK(ARGV[1] + offsetof_TINIB_TSKINICTXB_sstksz, sizeof_StackType)$
55 $RESULT = (bottom - size)$
56$END$
57
58$FUNCTION GET_USTK_TSKINICTXB$
59 $bottom = PEEK(ARGV[1] + offsetof_TINIB_TSKINICTXB_stk_bottom, sizeof_void_ptr)$
60 $size = PEEK(ARGV[1] + offsetof_TINIB_TSKINICTXB_stksz, sizeof_StackType)$
61 $RESULT = (bottom - size)$
62$END$
63
64$
65$ OSAP.ID_LISTを読み込むため
66$
67$INCLUDE "cfg2_out.tf"$
68
69$
70$ 保護ドメインのラベルの作成
71$ OSAP.LABEL[domid]:保護ドメインのラベル
72$
73$OSAP.LABEL[TDOM_KERNEL] = "kernel"$
74$FOREACH domid OSAP.ID_LIST$
75 $OSAP.LABEL[domid] = domid$
76$END$
77$OSAP.LABEL[TDOM_NONE] = "shared"$
78
79$
80$ 標準のセクションのメモリオブジェクト属性の定義
81$
82$MEMATR_TEXT = (TA_NOWRITE|TA_EXEC)$
83$MEMATR_RODATA = (TA_NOWRITE|TA_EXEC)$
84$MEMATR_DATA = TA_MEMINI$
85$MEMATR_BSS = TA_NULL$
86$MEMATR_PRSV = TA_MEMPRSV$
87$MEMATR_ROSDATA = (TA_SDATA|TA_MEMINI|TA_NOWRITE|TA_EXEC)$
88$MEMATR_SDATA = (TA_SDATA|TA_MEMINI)$
89$MEMATR_SBSS = TA_SDATA$
90
91$
92$ 保護ドメイン毎のデフォルトのアクセス許可パターンの作成
93$
94$DEFAULT_ACPTN[TDOM_KERNEL] = VALUE("TACP_KERNEL", TACP_KERNEL)$
95$FOREACH domid OSAP.ID_LIST$
96 $DEFAULT_ACPTN[domid] = VALUE(FORMAT("TACP(%1%)", domid), 1 << (domid - 1))$
97$END$
98$DEFAULT_ACPTN[TDOM_NONE] = VALUE("TACP_SHARED", TACP_SHARED)$
99
100$
101$ ユーザスタック領域のセクション名を返す
102$ ARGV[1]:タスクID
103$
104$FUNCTION SECTION_USTACK$
105 $RESULT = FORMAT(".user_stack.%s.bss", ARGV[1])$
106$END$
107
108$
109$ 基本タスクの共有スタックのセクション名
110$ ARGV[1]:共有スタックID(タスク優先度)
111$ kernel.tfから呼ばれる
112$
113$FUNCTION SECTION_SHARED_USTACK$
114 $RESULT = FORMAT(".shared_user_stack.%s.bss", ARGV[1])$
115$END$
116
117$FUNCTION START_SYMBOL$
118 $symbol = CONCAT("__s", MO.SECTION[ARGV[1]])$
119 $IF !EQ(MO.ILABEL[ARGV[1]], "")$
120 $symbol = CONCAT(symbol, ".R")$
121 $END$
122 $RESULT = SYMBOL(symbol)$
123$END$
124
125$FUNCTION LIMIT_SYMBOL$
126 $symbol = CONCAT("__e", MO.SECTION[ARGV[1]])$
127 $IF !EQ(MO.ILABEL[ARGV[1]], "")$
128 $symbol = CONCAT(symbol, ".R")$
129 $END$
130 $RESULT = SYMBOL(symbol)$
131$END$
132
133$
134$ MPU設定情報生成の準備
135$
136$check = 0$
137$FOREACH mo MO_MPROTECT_LIST$
138 $IF LENGTH(pre_mo) && check >= 2$
139$ // 空でないメモリオブジェクトを探す
140 $FOREACH at RANGE(FIND(MO_ORDER, pre_mo), FIND(MO_ORDER, mo) - 1)$
141 $cur_mo = AT(MO_ORDER, at)$
142 $start = START_SYMBOL(cur_mo)$
143 $limit = LIMIT_SYMBOL(cur_mo)$
144 $IF LENGTH(start)$
145 $IF !LENGTH(start_sym)$
146 $start_sym = start$
147 $END$
148 $IF LENGTH(limit)$
149 $limit_sym = limit$
150 $END$
151 $END$
152 $END$
153 $END$
154
155 $IF check == 1$
156 $NOOP()$
157 $ELIF check == 2$
158$ // 共有領域の終端番地
159 $IF !LENGTH(shared_mo_start)$
160 $shared_mo_start = start_sym$
161 $END$
162 $shared_mo_limit = limit_sym$
163 $ELIF check == 3$
164$ // 共有リード専有ライトsdata領域の終端番地
165 $sosap_mo_start[MO.OSAPID[pre_mo]] = start_sym$
166 $sosap_mo_limit[MO.OSAPID[pre_mo]] = limit_sym$
167 $ELIF check == 4$
168$ // 共有リード専有ライト領域の終端番地
169 $osap_mo_start[MO.OSAPID[pre_mo]] = start_sym$
170 $osap_mo_limit[MO.OSAPID[pre_mo]] = limit_sym$
171 $END$
172
173 $start_sym = START_SYMBOL(mo)$
174 $limit_sym = LIMIT_SYMBOL(mo)$
175 $IF EQ(MO.TYPE[mo], "TOPPERS_USTACK")$
176$ // ユーザスタック
177 $ustk_mo = APPEND(ustk_mo, mo)$
178 $check = 1$
179 $ELIF EQ(MO.ACPTN_W[mo], "TACP_SHARED")$
180$ // 共有リードライト
181 $IF LENGTH(shared_mo_start)$
182 $ERROR$
183 shared mo duplicate
184 $END$
185 $END$
186 $shared_mo_start = start_sym$
187 $check = 2$
188 $ELIF !EQ(MO.ACPTN_W[mo], "TACP_KERNEL")$
189$ // 共有リード専有ライト
190 $IF (MO.MEMATR[mo] & TA_SDATA) != 0$
191$ // sdata
192 $sosap_mo_start[MO.OSAPID[mo]] = start_sym$
193 $check = 3$
194 $ELSE$
195$ // not sdata
196 $osap_mo_start[MO.OSAPID[mo]] = start_sym$
197 $check = 4$
198 $END$
199 $ELSE$
200 $check = 0$
201 $END$
202
203 $pre_mo = mo$
204$END$
205$IF check >= 2$
206$ // 空でないメモリオブジェクトを探す
207 $FOREACH at RANGE(FIND(MO_ORDER, pre_mo), FIND(MO_ORDER, mo))$
208 $cur_mo = AT(MO_ORDER, at)$
209 $start = START_SYMBOL(cur_mo)$
210 $limit = LIMIT_SYMBOL(cur_mo)$
211 $IF LENGTH(start)$
212 $IF !LENGTH(start_sym)$
213 $start_sym = start$
214 $END$
215 $IF LENGTH(limit)$
216 $limit_sym = limit$
217 $END$
218 $END$
219 $END$
220$END$
221
222$IF check == 1$
223 $NOOP()$
224$ELIF check == 2$
225$ // 共有領域の終端番地
226 $shared_mo_start = start_sym$
227 $shared_mo_limit = limit_sym$
228$ELIF check == 3$
229$ // 共有リード専有ライトsdata領域の終端番地
230 $sosap_mo_start[MO.OSAPID[pre_mo]] = start_sym$
231 $sosap_mo_limit[MO.OSAPID[pre_mo]] = limit_sym$
232$ELIF check == 4$
233$ // 共有リード専有ライト領域の終端番地
234 $osap_mo_start[MO.OSAPID[pre_mo]] = start_sym$
235 $osap_mo_limit[MO.OSAPID[pre_mo]] = limit_sym$
236$END$
237
238
239$FUNCTION GENERATE_TARGET_MPUINFOB$
240$
241$ ドメインごとのMPU設定情報を生成
242$
243 $FOREACH info RANGE(3,3)$
244 $start_address = 0$
245 $end_address = 0$
246 $IF LENGTH(shared_mo_start)$
247$ // 領域の開始アドレスを読み込む
248 $start_address = shared_mo_start$
249$ // 領域の終了アドレスを読み込む
250 $end_address = shared_mo_limit$
251 $END$
252 $ipal = (start_address & 0xfffffff0)$
253 $ipau = (end_address & 0xfffffff0)$
254 $WARNING$
255 $FORMAT("info%d: start=0x%x, end=0x%x", info, start_address, end_address)$
256 $END$
257 $IF (ipal != start_address) || (ipau != end_address)$
258 $ERROR$
259 $FORMAT("Not aligned: start=0x%x, end=0x%x", start_address, end_address)$
260 $END$
261 $END$
262 $IF ipal != ipau$
263 $valid[info] = 0x01$
264 $ipau = (ipau - 0x1) & 0xfffffffc$
265 $FOREACH osap OSAP.ID_LIST$
266 $IF !OSAP.TRUSTED[osap]$
267 $OSAP.MPRC[osap] = 0x09$
268 $END$
269 $END$
270 $ELSE$
271 $valid[info] = 0x00$
272 $END$
273 $WARNING$
274 $FORMAT("info%d: ipal=0x%x, ipau=0x%x", info, ipal, ipau)$
275 $END$
276 $END$
277
278$END$
279
280$
281$ TSKINICTXBの初期化情報を生成
282$
283$DOMINICTXB_KERNEL = "{ NULL }"$
284
285$FUNCTION GENERATE_OSAPINIB_MPUINFOB$
286
287 $IF !LENGTH(OSAP.MPRC[ARGV[1]])$
288 $OSAP.MPRC[ARGV[1]] = 0x01$
289 $END$
290 $info = 1$
291 $TAB$$TAB${$NL$
292 $start_address = 0$
293 $end_address = 0$
294 $IF LENGTH(osap_mo_start[ARGV[1]])$
295$ // 領域の開始アドレスを読み込む
296 $start_address = osap_mo_start[ARGV[1]]$
297$ // 領域の終了アドレスを読み込む
298 $end_address = osap_mo_limit[ARGV[1]]$
299 $END$
300
301 $TRACE(ARGV[1])$
302 $TRACE(start_address)$
303 $TRACE(end_address)$
304
305 $ipal = (start_address & 0xfffffff0)$
306 $ipau = (end_address & 0xfffffff0)$
307 $IF (ipal != start_address) || (ipau != end_address)$
308 $ERROR$
309 $FORMAT("osap is %s, info is %d", ARGV[1], info)$$NL$
310 $FORMAT("Not aligned: start=0x%x, end=0x%x", start_address, end_address)$$NL$
311 $FORMAT("ipal=0x%x, ipau=0x%x", ipal, ipau)$
312 $END$
313 $END$
314 $IF ipal != ipau$
315 $valid[1] = 0x01$
316 $ipau = (ipau - 0x1) & 0xfffffffc$
317 $OSAP.MPRC[ARGV[1]] = OSAP.MPRC[ARGV[1]] | 0x02$
318 $ELSE$
319 $valid[1] = 0x00$
320 $END$
321
322 $IF !OSAP.TRUSTED[ARGV[1]]$
323 $TAB$$TAB$$TAB$( (uint8 *)($FORMAT("0x%x", ipal)$) ), /* MPLA0 */$NL$
324 $TAB$$TAB$$TAB$( (uint8 *)($FORMAT("0x%x", ipau)$) ), /* MPLA0 */$NL$
325 $ELSE$
326 $TAB$$TAB$$TAB$( (uint8 *)NULL ), /* MPLA$info$ : $FORMAT("0x%x", ipal)$ */$NL$
327 $TAB$$TAB$$TAB$( (uint8 *)NULL ), /* MPUA$info$ : $FORMAT("0x%x", ipau)$ */$NL$
328 $END$
329
330 $info = 2$
331 $start_address = 0$
332 $end_address = 0$
333 $IF LENGTH(sosap_mo_start[ARGV[1]])$
334$ // 領域の開始アドレスを読み込む
335 $start_address = sosap_mo_start[ARGV[1]]$
336$ // 領域の終了アドレスを読み込む
337 $end_address = sosap_mo_limit[ARGV[1]]$
338 $END$
339
340 $ipal = (start_address & 0xfffffff0)$
341 $ipau = (end_address & 0xfffffff0)$
342 $IF (ipal != start_address) || (ipau != end_address)$
343 $ERROR$
344 $FORMAT("osap is %s, info is %d", ARGV[1], info)$$NL$
345 $FORMAT("Not aligned: start=0x%x, end=0x%x", start_address, end_address)$$NL$
346 $FORMAT("ipal=0x%x, ipau=0x%x", ipal, ipau)$
347 $END$
348 $END$
349 $IF ipal != ipau$
350 $valid[2] = 0x01$
351 $ipau = (ipau - 0x1) & 0xfffffffc$
352 $OSAP.MPRC[ARGV[1]] = OSAP.MPRC[ARGV[1]] | 0x04$
353 $ELSE$
354 $valid[2] = 0x00$
355 $END$
356
357 $IF !OSAP.TRUSTED[ARGV[1]]$
358 $TAB$$TAB$$TAB$( (uint8 *)($FORMAT("0x%x", ipal)$) ), /* MPLA1 */$NL$
359 $TAB$$TAB$$TAB$( (uint8 *)($FORMAT("0x%x", ipau)$) ), /* MPLA1 */$NL$
360 $ELSE$
361 $TAB$$TAB$$TAB$( (uint8 *)NULL ), /* MPLA$info$ : $FORMAT("0x%x", ipal)$ */$NL$
362 $TAB$$TAB$$TAB$( (uint8 *)NULL ), /* MPUA$info$ : $FORMAT("0x%x", ipau)$ */$NL$
363 $END$
364 $IF !OSAP.TRUSTED[ARGV[1]]$
365 $OSAP.MPRC[ARGV[1]] = OSAP.MPRC[ARGV[1]] | 0x01$
366 $TAB$$TAB$$TAB$( (uint32)($FORMAT("0x%x", OSAP.MPRC[ARGV[1]])$) ), /* MPRC */$NL$
367 $ELSE$
368 $TAB$$TAB$$TAB$( (uint32)0 ), /* MPRC */$NL$
369 $END$
370 $TAB$$TAB$}$NL$
371 $NL$
372$END$
373
374$FUNCTION GENERATE_TSKINICTXB$
375 $TAB$$TAB${$NL$
376 $TAB$$TAB$$TAB$$TSK.TINIB_SSTKSZ[ARGV[1]]$,$NL$
377 $TAB$$TAB$$TAB$((void *)((uint8 *)($TSK.TINIB_SSTK[ARGV[1]]$)
378 $SPC$+ ($TSK.TINIB_SSTKSZ[ARGV[1]]$))),$NL$
379 $IF OSAP.TRUSTED[TSK.OSAPID[ARGV[1]]]$
380 $TAB$$TAB$$TAB$0,$NL$
381 $TAB$$TAB$$TAB$0,$NL$
382 $ELSE$
383 $TAB$$TAB$$TAB$$TSK.TINIB_USTKSZ[ARGV[1]]$,$NL$
384 $TAB$$TAB$$TAB$((void *)((uint8 *)($TSK.TINIB_USTK[ARGV[1]]$)
385 $SPC$+ ($TSK.TINIB_USTKSZ[ARGV[1]]$))),$NL$
386 $END$
387 $TAB$$TAB$},$NL$
388$END$
389
390$FUNCTION GENERATE_STKMPUINFOB$
391 $TAB$$TAB${$NL$
392 $IF OSAP.TRUSTED[TSK.OSAPID[ARGV[1]]]$
393 $TAB$$TAB$$TAB$0,$NL$
394 $TAB$$TAB$$TAB$0,$NL$
395 $ELSE$
396 $IF EQ(TSK.STK[ARGV[1]],"NULL")$
397$ // stkがNULLの場合の処理
398 $IF LENGTH(TSK.SHARED_USTK_ID[ARGV[1]])$
399$ // 共有スタック
400 $section = SECTION_SHARED_USTACK(TSK.SHARED_USTK_ID[ARGV[1]])$
401 $start_address = SYMBOL(CONCAT("__s", section))$
402 $end_address = SYMBOL(CONCAT("__e", section))$
403 $ELSE$
404$ // 固有スタック
405 $section = SECTION_USTACK(ARGV[1])$
406 $start_address = SYMBOL(CONCAT("__s", section))$
407 $end_address = SYMBOL(CONCAT("__e", section))$
408 $END$
409 $ELSE$
410$ // stkがNULLでない場合の処理
411 $p_tinib = SYMBOL("tinib_table")$
412 $p_tinib = p_tinib + TSK.ID[ARGV[1]] * sizeof_TINIB$
413 $start_address = PEEK(p_tinib + offsetof_TINIB_STKMPUINFOB_start_ustk, 4)$
414 $end_address = PEEK(p_tinib + offsetof_TINIB_STKMPUINFOB_limit_ustk, 4)$
415 $END$
416 $mpl = (start_address & 0xfffffff0)$
417 $mpu = (end_address & 0xfffffff0)$
418 $IF (mpl != start_address) || (mpu != end_address)$
419 $ERROR$
420 $FORMAT("task is %s", ARGV[1])$$NL$
421 $FORMAT("user stack in not aligned: start=0x%x, end=0x%x", start_address, end_address)$$NL$
422 $FORMAT("mpla=0x%x, mpua=0x%x", mpl, mpu)$
423 $END$
424 $END$
425 $IF mpl == mpu$
426 $ERROR$
427 $FORMAT("task is %s", ARGV[1])$$NL$
428 $FORMAT("user stack size is 0: start=0x%x, end=0x%x", start_address, end_address)$$NL$
429 $FORMAT("mpla=0x%x, mpua=0x%x", mpl, mpu)$
430 $END$
431 $END$
432 $mpu = (mpu - 0x1) & 0xfffffffc$
433 $TAB$$TAB$$TAB$$FORMAT("(void *)0x%x /* &__start_user_stack %s */", mpl, ARGV[1])$,$NL$
434 $TAB$$TAB$$TAB$$FORMAT("(void *)0x%x /* &__limit_user_stack %s */", mpu, ARGV[1])$,$NL$
435 $END$
436 $TAB$$TAB$},$NL$
437$END$
438
439$
440$ meminibの依存部の読込み
441$
442$INCLUDE "arch/v850_ccrh/prc_meminib.tf"$
443
444$
445$ 非依存部の読込み
446$
447$INCLUDE "kernel/kernel_mem.tf"$
448
449$FILE "kernel_mem.c"$
450
451$
452$ 共有のMPU設定情報を生成
453$ kernel_mem3.cの宣言位置と合わせる
454$
455
456$comment[3] = "MPU 3"$
457
458$shared_meminib = SYMBOL("shared_meminib_table")$
459$TNUM_SHARED_REGION = 1$
460const uint32 tnum_shared_mem = $TNUM_SHARED_REGION * 2$;$NL$
461uint8 * const shared_meminib_table[$TNUM_SHARED_REGION * 2$] = {$NL$
462$FOREACH info RANGE(3,3)$
463 $start_address = 0$
464 $end_address = 0$
465 $IF LENGTH(shared_mo_start)$
466$ // 領域の開始アドレスを読み込む
467 $start_address = shared_mo_start$
468$ // 領域の終了アドレスを読み込む
469 $end_address = shared_mo_limit$
470 $END$
471 $ipal = (start_address & 0xfffffff0)$
472 $ipau = (end_address & 0xfffffff0)$
473 $WARNING$
474 $FORMAT("info%d: start=0x%x, end=0x%x", info, start_address, end_address)$
475 $END$
476 $IF (ipal != start_address) || (ipau != end_address)$
477 $ERROR$
478 $FORMAT("Not aligned: start=0x%x, end=0x%x", start_address, end_address)$
479 $END$
480 $END$
481 $IF ipal != ipau$
482 $valid[info] = 0x01$
483 $ipau = (ipau - 0x1) & 0xfffffffc$
484 $ELSE$
485 $valid[info] = 0x00$
486 $END$
487 $WARNING$
488 $FORMAT("info%d: ipal=0x%x, ipau=0x%x", info, ipal, ipau)$
489 $END$
490 $TAB$$TAB$$FORMAT("( (uint8 *)0x%x )", ipal)$, /* MPLA($comment[info]$) */$NL$
491 $TAB$$TAB$$FORMAT("( (uint8 *)0x%x )", ipau)$, /* MPUA($comment[info]$) */$NL$
492$END$
493};$NL$
494$NL$
495
Note: See TracBrowser for help on using the repository browser.