source: atk2-sc3_fl850f1l/arch/v850_gcc/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: 21.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 by Embedded and Real-Time Systems Laboratory
8$ Graduate School of Information Science, Nagoya Univ., JAPAN
9$
10$ 上記著作権者は,以下の(1)(4)の条件を満たす場合に限り,本ソフトウェ
11$ ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
12$ 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
13$ (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
14$ 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
15$ スコード中に含まれていること.
16$ (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
17$ 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
18$ 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
19$ の無保証規定を掲載すること.
20$ (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
21$ 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
22$ と.
23$ (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
24$ 作権表示,この利用条件および下記の無保証規定を掲載すること.
25$ (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
26$ 報告すること.
27$ (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
28$ 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
29$ また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
30$ 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
31$ 免責すること.
32$
33$ 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
34$ よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
35$ に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
36$ アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
37$ の責任を負わない.
38$
39$
40$ =====================================================================
41
42$DEBUG_OPT_TF = 1$
43
44$
45$ パス4のプロセッサ依存テンプレート(V850E2M用)
46$
47$FUNCTION GET_SSTK_TSKINICTXB$
48 $bottom = PEEK(ARGV[1] + offsetof_TINIB_TSKINICTXB_sstk_bottom, sizeof_void_ptr)$
49 $size = PEEK(ARGV[1] + offsetof_TINIB_TSKINICTXB_sstksz, sizeof_StackType)$
50 $RESULT = (bottom - size)$
51$END$
52
53$FUNCTION GET_USTK_TSKINICTXB$
54 $bottom = PEEK(ARGV[1] + offsetof_TINIB_TSKINICTXB_stk_bottom, sizeof_void_ptr)$
55 $size = PEEK(ARGV[1] + offsetof_TINIB_TSKINICTXB_stksz, sizeof_StackType)$
56 $RESULT = (bottom - size)$
57$END$
58
59$
60$ OSAP.ID_LISTを読み込むため
61$
62$INCLUDE "cfg2_out.tf"$
63
64$
65$ 保護ドメインのラベルの作成
66$ OSAP.LABEL[domid]:保護ドメインのラベル
67$
68$OSAP.LABEL[TDOM_KERNEL] = "kernel"$
69$FOREACH domid OSAP.ID_LIST$
70 $OSAP.LABEL[domid] = domid$
71$END$
72$OSAP.LABEL[TDOM_NONE] = "shared"$
73
74$
75$ 標準のセクションのメモリオブジェクト属性の定義
76$
77$MEMATR_TEXT = (TA_NOWRITE|TA_EXEC)$
78$MEMATR_RODATA = (TA_NOWRITE|TA_EXEC)$
79$MEMATR_DATA = TA_MEMINI$
80$MEMATR_BSS = TA_NULL$
81$MEMATR_PRSV = TA_MEMPRSV$
82$MEMATR_ROSDATA = (TA_SDATA|TA_MEMINI|TA_NOWRITE|TA_EXEC)$
83$MEMATR_SDATA = (TA_SDATA|TA_MEMINI)$
84$MEMATR_SBSS = TA_SDATA$
85
86$
87$ 保護ドメイン毎のデフォルトのアクセス許可パターンの作成
88$
89$DEFAULT_ACPTN[TDOM_KERNEL] = VALUE("TACP_KERNEL", TACP_KERNEL)$
90$FOREACH domid OSAP.ID_LIST$
91 $DEFAULT_ACPTN[domid] = VALUE(FORMAT("TACP(%1%)", domid), 1 << (domid - 1))$
92$END$
93$DEFAULT_ACPTN[TDOM_NONE] = VALUE("TACP_SHARED", TACP_SHARED)$
94
95$
96$ OSAP初期化コンテキストブロックのための宣言
97$
98$FUNCTION PREPARE_OSAPINICTXB$
99 $IF LENGTH(TSK.ID_LIST)$
100 $FOREACH tskid TSK.ID_LIST$
101 $IF !OSAP.TRUSTED[TSK.OSAPID[tskid]]$
102 extern uint8 $FORMAT("__start_user_stack%s", tskid)$;$NL$
103 extern uint8 $FORMAT("__limit_user_stack%s", tskid)$;$NL$
104 $END$
105 $END$
106 $END$
107 $FOREACH tskpri RANGE(TMIN_TPRI, TMAX_TPRI)$
108 $IF LENGTH(shared_ustack_size[tskpri])$
109 extern uint8 $FORMAT("__start_shared_user_stack%s", tskpri)$;$NL$
110 extern uint8 $FORMAT("__limit_shared_user_stack%s", tskpri)$;$NL$
111 $END$
112 $END$
113
114
115 $IF LENGTH(OSAP.ID_LIST)$
116 $FOREACH domid OSAP.ID_LIST$
117 $IF !OSAP.TRUSTED[domid]$
118$ RX領域(専用)
119 extern uint8 __start_text_$OSAP.LABEL[domid]$;$NL$
120 extern uint8 __limit_text_$OSAP.LABEL[domid]$;$NL$
121$ R領域(専用)
122 extern uint8 __start_sram_$OSAP.LABEL[domid]$_$FORMAT("%x", MEMATR_ROSDATA & ~TA_MEMINI)$;$NL$
123 extern uint8 __limit_sram_$OSAP.LABEL[domid]$_$FORMAT("%x", MEMATR_ROSDATA & ~TA_MEMINI)$;$NL$
124$ RWX領域(専用)
125 extern uint8 __start_ram_$OSAP.LABEL[domid]$;$NL$
126 extern uint8 __limit_ram_$OSAP.LABEL[domid]$;$NL$
127 extern uint8 __start_sram_$OSAP.LABEL[domid]$;$NL$
128 extern uint8 __limit_sram_$OSAP.LABEL[domid]$;$NL$
129$ 共有リード専用ライト
130 extern uint8 $FORMAT("__start_ram_%s_%x_%x", OSAP.LABEL[domid], +DEFAULT_ACPTN[domid], +TACP_SHARED)$;$NL$
131 extern uint8 $FORMAT("__limit_ram_%s_%x_%x", OSAP.LABEL[domid], +DEFAULT_ACPTN[domid], +TACP_SHARED)$;$NL$
132 extern uint8 $FORMAT("__start_sram_%s_%x_%x", OSAP.LABEL[domid], +DEFAULT_ACPTN[domid], +TACP_SHARED)$;$NL$
133 extern uint8 $FORMAT("__limit_sram_%s_%x_%x", OSAP.LABEL[domid], +DEFAULT_ACPTN[domid], +TACP_SHARED)$;$NL$
134$ extern uint8 $FORMAT("__start_ram_%s_srpw", OSAP.LABEL[domid])$;$NL$
135$ extern uint8 $FORMAT("__limit_ram_%s_srpw", OSAP.LABEL[domid])$;$NL$
136$ extern uint8 $FORMAT("__start_sram_%s_srpw", OSAP.LABEL[domid])$;$NL$
137$ extern uint8 $FORMAT("__limit_sram_%s_srpw", OSAP.LABEL[domid])$;$NL$
138 $END$
139 $END$
140 $NL$
141 $END$$NL$
142
143$ 共有領域
144 extern uint8 __start_text_$OSAP.LABEL[TDOM_NONE]$;$NL$
145 extern uint8 __limit_text_$OSAP.LABEL[TDOM_NONE]$;$NL$
146 extern uint8 __start_sram_$OSAP.LABEL[TDOM_NONE]$_$FORMAT("%x", MEMATR_ROSDATA & ~TA_MEMINI)$;$NL$
147 extern uint8 __limit_sram_$OSAP.LABEL[TDOM_NONE]$_$FORMAT("%x", MEMATR_ROSDATA & ~TA_MEMINI)$;$NL$
148 extern uint8 __start_ram_$OSAP.LABEL[TDOM_NONE]$;$NL$
149 extern uint8 __limit_ram_$OSAP.LABEL[TDOM_NONE]$;$NL$
150 extern uint8 __start_sram_$OSAP.LABEL[TDOM_NONE]$;$NL$
151 extern uint8 __limit_sram_$OSAP.LABEL[TDOM_NONE]$;$NL$
152$ 共有リード専用ライト領域全体
153 extern uint8 __start_srpw_all;$NL$
154 extern uint8 __limit_srpw_all;$NL$
155 extern uint8 __start_ssrpw_all;$NL$
156 extern uint8 __limit_ssrpw_all;$NL$
157 $NL$
158$ extern const OSAPMPUINFOB_INFO _kernel_osap_mpu_info_tbl[];$NL$
159$END$
160
161$FUNCTION GENERATE_TARGET_MPUINFOB$
162$
163$ ドメインごとのMPU設定情報を生成
164$
165 $FILE "kernel_mem.c"$
166
167 $PREPARE_OSAPINICTXB()$
168
169$
170$ 共有リードライト領域 / 共有リード専有ライト領域(sdata) / rosdata_shared領域
171$ の情報取得
172$
173 $check_shared_mo = 0x00$
174 $check_srpw_mo = 0x00$
175 $check_rosdata_mo = 0x00$
176 $check_sdata_mo = 0x00$
177 $LIST_SHARED_MO = {}$
178 $LIST_SRPW_MO = {}$
179 $LIST_ROSDATA_MO = {}$
180 $preid = -1$
181 $FOREACH moid MO_START_LIST$
182$ // メモリオブジェクトの先頭をパス2時点での順にチェック
183 $IF LENGTH(FIND(MO_MPROTECT_LIST, moid))$
184$ // メモリ保護単位の先頭の場合
185 $IF (MO.ACPTN1[moid] == TACP_SHARED) && (MO.ACPTN2[moid] == TACP_SHARED)$
186 $IF ((check_shared_mo & 0x10) != 0x10)$
187$ // 共有リードライト領域の先頭の場合
188 $SHARED_AREA_BASE[check_shared_mo] = MO.BASEADDR[moid]$
189 $SHARED_AREA_MO[check_shared_mo] = moid$
190 $LIST_SHARED_MO = APPEND(LIST_SHARED_MO, check_shared_mo)$
191 $check_shared_mo = check_shared_mo | 0x10$
192 $END$
193 $ELIF (check_shared_mo & 0x10) == 0x10$
194$ // 共有リードライト領域の終端の場合
195 $IF preid == -1$
196 $ERROR$
197 $FORMAT("unexpected preid.")$
198 $END$
199 $END$
200 $check_shared_mo = check_shared_mo & 0x0f$
201 $SHARED_AREA_LIMIT[check_shared_mo] = MO.LIMITADDR[preid]$
202 $SHARED_AREA_SIZE[check_shared_mo] = SHARED_AREA_LIMIT[check_shared_mo] - SHARED_AREA_BASE[check_shared_mo]$
203 $SHARED_AREA_LIMIT_MO[check_shared_mo] = preid$
204 $check_shared_mo = check_shared_mo + 1$
205 $END$
206
207 $END$
208
209 $preid = moid$
210 $END$
211 $IF (check_shared_mo & 0x10) == 0x10$
212 $IF preid == -1$
213 $ERROR$
214 $FORMAT("unexpected preid.")$
215 $END$
216 $END$
217 $check_shared_mo = check_shared_mo & 0x0f$
218 $SHARED_AREA_LIMIT[check_shared_mo] = MO.LIMITADDR[preid]$
219 $SHARED_AREA_LIMIT_MO[check_shared_mo] = preid$
220 $SHARED_AREA_SIZE[check_shared_mo] = SHARED_AREA_LIMIT[check_shared_mo] - SHARED_AREA_BASE[check_shared_mo]$
221 $check_shared_mo = check_shared_mo + 1$
222 $END$
223$
224$ エラーチェック
225$
226 $FOREACH id LIST_SHARED_MO$
227 $IF DEBUG_OPT_TF$
228 $WARNING$
229 $id$$NL$
230 $SHARED_AREA_MO[id]$$NL$
231 $SHARED_AREA_LIMIT_MO[id]$$NL$
232 $FORMAT("0x%x", SHARED_AREA_BASE[id])$$NL$
233 $FORMAT("0x%x", SHARED_AREA_LIMIT[id])$$NL$
234 $FORMAT("0x%x", SHARED_AREA_SIZE[id])$$NL$
235 $END$
236 $END$
237 $IF ((MO.MEMATR[SHARED_AREA_MO[id]] & TA_SDATA) == TA_SDATA)$
238 $IF LENGTH(SHARED_DATA.BASE)$
239 $ERROR$
240 $FORMAT("unexpected mematr: %d, %x", id, MO.MEMATR[SHARED_AREA_MO[id]])$
241 $END$
242 $ELSE$
243 $SHARED_DATA.BASE = SHARED_AREA_BASE[id]$
244 $SHARED_DATA.LIMIT = SHARED_AREA_LIMIT[id]$
245 $SHARED_DATA.SIZE = SHARED_AREA_SIZE[id]$
246 $SHARED_DATA.BASE_MO = SHARED_AREA_MO[id]$
247 $SHARED_DATA.LIMIT_MO = SHARED_AREA_LIMIT_MO[id]$
248 $END$
249 $ELSE$
250 $ERROR$
251 $FORMAT("unexpected mematr: %d, %x", id, MO.MEMATR[SHARED_AREA_MO[id]])$
252 $END$
253 $END$
254 $END$
255
256 $FOREACH info RANGE(3,3)$
257$ // 領域の開始アドレスを読み込む
258 $start_address = SHARED_DATA.BASE$
259$ // 領域の終了アドレスを読み込む
260 $end_address = SHARED_DATA.LIMIT$
261 $ipal = (start_address & 0xfffffff0)$
262 $ipau = (end_address & 0xfffffff0)$
263 $WARNING$
264 $FORMAT("info%d: start=0x%x, end=0x%x", info, start_address, end_address)$
265 $END$
266 $IF (ipal != start_address) || (ipau != end_address)$
267 $ERROR$
268 $FORMAT("Not aligned: start=0x%x, end=0x%x", start_address, end_address)$
269 $END$
270 $END$
271 $IF ipal != ipau$
272 $valid[info] = 0x01$
273 $ipau = (ipau - 0x1) & 0xfffffffc$
274 $FOREACH osap OSAP.ID_LIST$
275 $IF !OSAP.TRUSTED[osap]$
276 $OSAP.MPRC[osap] = 0x09$
277 $END$
278 $END$
279 $ELSE$
280 $valid[info] = 0x00$
281 $END$
282 $WARNING$
283 $FORMAT("info%d: ipal=0x%x, ipau=0x%x", info, ipal, ipau)$
284 $END$
285 $END$
286
287$ $IF LENGTH(OSAP.ID_LIST) > 0$
288$ $ RX領域(専用)
289$ $comment[0] = "iregion 0"$
290$ $access[0] = 0x03$
291$ $ RX領域(専用ショートデータ)
292$ $comment[1] = "iregion 1"$
293$ $access[1] = 0x03$
294$ $ RWX領域(専用)
295$ $comment[2] = "dregion 1"$
296$ $access[2] = 0x06$
297$ $ RWX領域(専用ショートデータ)
298$ $comment[3] = "dregion 2"$
299$ $access[3] = 0x06$
300$ $ 共有リード専用ライト
301$ $comment[4] = "dregion 3"$
302$ $access[4] = 0x06$
303$ $ 共有リード専用ライト(ショートデータ)
304$ $comment[5] = "dregion 4"$
305$ $access[5] = 0x06$
306$
307$ $dominib_info = SYMBOL("_kernel_osap_mpu_info_tbl")$
308$ const OSAPMPUINFOB_INFO _kernel_osap_mpu_info_tbl[TNUM_OSAP] ={$NL$
309$ $JOINEACH domid OSAP.ID_LIST ",\n"$
310$ $label[0] = FORMAT("text_%s", OSAP.LABEL[domid])$
311$ $label[1] = FORMAT("rosdata_%s", OSAP.LABEL[domid])$
312$ $label[2] = FORMAT("ram_%s", OSAP.LABEL[domid])$
313$ $label[3] = FORMAT("sram_%s", OSAP.LABEL[domid])$
314$ $label[4] = FORMAT("ram_%s_%x_%x", OSAP.LABEL[domid], +DEFAULT_ACPTN[domid], +TACP_SHARED)$
315$ $label[5] = FORMAT("sram_%s_%x_%x", OSAP.LABEL[domid], +DEFAULT_ACPTN[domid], +TACP_SHARED)$
316$
317$ $TAB${$NL$
318$ $FOREACH info RANGE(0,5)$
319$ $ // 領域の開始アドレスを読み込む
320$ $start_address = PEEK(dominib_info, 4)$
321$ $ // 領域の終了アドレスを読み込む
322$ $end_address = PEEK(dominib_info + 4, 4)$
323$ $dominib_info = dominib_info + 8$
324$
325$ $ipal = (start_address & 0xfffffff0)$
326$ $ipau = (end_address & 0xfffffff0)$
327$ $IF (ipal != start_address) || (ipau != end_address)$
328$ $ERROR$
329$ $FORMAT("Not aligned: start=0x%x, end=0x%x", start_address, end_address)$$NL$
330$ $FORMAT("ipal=0x%x, ipau=0x%x", ipal, ipau)$
331$ $END$
332$ $END$
333$ $IF ipal != ipau$
334$ $valid = 0x01$
335$ $ELSE$
336$ $valid = 0x00$
337$ $END$
338$ $ipal = (ipal | valid)$
339$ $ipau = (ipau | access[info])$
340$
341$ $IF !OSAP.TRUSTED[domid]$
342$ $TAB$$TAB$( (uint8 *)(&__start_$label[info]$ + $valid$) ), /* IPAL($comment[info]$) : $FORMAT("0x%x", ipal)$ */$NL$
343$ $TAB$$TAB$( (uint8 *)(&__limit_$label[info]$ + $access[info]$ - 0x10) ), /* IPAU($comment[info]$) : $FORMAT("0x%x", ipau)$ */$NL$
344$ $ELSE$
345$ $TAB$$TAB$( (uint8 *)NULL ), /* IPAL($comment[info]$) : $FORMAT("0x%x", ipal)$ */$NL$
346$ $TAB$$TAB$( (uint8 *)NULL ), /* IPAU($comment[info]$) : $FORMAT("0x%x", ipau)$ */$NL$
347$ $END$
348$ $END$
349$ $TAB$}
350$ $END$
351$ ,$NL$};$NL$
352$ $NL$
353$ $END$
354
355$END$
356
357$
358$ TSKINICTXBの初期化情報を生成
359$
360$DOMINICTXB_KERNEL = "{ NULL }"$
361
362$FUNCTION GENERATE_OSAPINIB_MPUINFOB$
363$ $TAB$$TAB${ (OSAPMPUINFOB_INFO *)&_kernel_osap_mpu_info_tbl[$ARGV[1]$] }$NL$
364
365 $IF !LENGTH(OSAP.MPRC[ARGV[1]])$
366 $OSAP.MPRC[ARGV[1]] = 0x01$
367 $END$
368$ RX領域(専用)
369 $comment[0] = "iregion 0"$
370 $access[0] = 0x03$
371$ RX領域(専用ショートデータ)
372 $comment[1] = "iregion 1"$
373 $access[1] = 0x03$
374$ RWX領域(専用)
375 $comment[2] = "dregion 1"$
376 $access[2] = 0x06$
377$ RWX領域(専用ショートデータ)
378 $comment[3] = "dregion 2"$
379 $access[3] = 0x06$
380$ 共有リード専用ライト
381 $comment[1] = "dregion 3"$
382 $access[1] = 0x07$
383$ 共有リード専用ライト(ショートデータ)
384 $comment[2] = "dregion 4"$
385 $access[2] = 0x07$
386
387 $osapinib_info = SYMBOL("osapinib_table")$
388 $osapinib_offset = sizeof_OSAPINIB * (ARGV[1] - 1)$
389 $osapinib_info = osapinib_info + osapinib_offset + offsetof_OSAPINIB_osapmpu$
390 $label[0] = FORMAT("text_%s", OSAP.LABEL[ARGV[1]])$
391 $label[1] = FORMAT("sram_%s_%x", OSAP.LABEL[ARGV[1]], MEMATR_ROSDATA & ~TA_MEMINI)$
392 $label[2] = FORMAT("ram_%s", OSAP.LABEL[ARGV[1]])$
393 $label[3] = FORMAT("sram_%s", OSAP.LABEL[ARGV[1]])$
394 $label[1] = FORMAT("ram_%s_%x_%x", OSAP.LABEL[ARGV[1]], +DEFAULT_ACPTN[ARGV[1]], +TACP_SHARED)$
395 $label[2] = FORMAT("sram_%s_%x_%x", OSAP.LABEL[ARGV[1]], +DEFAULT_ACPTN[ARGV[1]], +TACP_SHARED)$
396$ $label[4] = FORMAT("ram_%s_srpw", OSAP.LABEL[ARGV[1]])$
397$ $label[5] = FORMAT("sram_%s_srpw", OSAP.LABEL[ARGV[1]])$
398
399 $TAB$$TAB${$NL$
400 $FOREACH info RANGE(1,2)$
401$ // 領域の開始アドレスを読み込む
402 $start_address = PEEK(osapinib_info, 4)$
403$ // 領域の終了アドレスを読み込む
404 $end_address = PEEK(osapinib_info + 4, 4)$
405 $osapinib_info = osapinib_info + 8$
406
407 $ipal = (start_address & 0xfffffff0)$
408 $ipau = (end_address & 0xfffffff0)$
409 $IF (ipal != start_address) || (ipau != end_address)$
410 $ERROR$
411 $FORMAT("osap is %s, info is %d", ARGV[1], info)$$NL$
412 $FORMAT("Not aligned: start=0x%x, end=0x%x", start_address, end_address)$$NL$
413 $FORMAT("ipal=0x%x, ipau=0x%x", ipal, ipau)$
414 $END$
415 $END$
416 $IF ipal != ipau$
417 $valid[info] = 0x01$
418 $ipau = (ipau - 0x1) & 0xfffffffc$
419 $OSAP.MPRC[ARGV[1]] = OSAP.MPRC[ARGV[1]] | (0x01 << info)$
420 $ELSE$
421 $valid[info] = 0x00$
422 $END$
423
424 $IF !OSAP.TRUSTED[ARGV[1]]$
425 $TAB$$TAB$$TAB$( (uint8 *)($FORMAT("0x%x", ipal)$) ), /* MPLA$info$ : &__start_$label[info]$ */$NL$
426 $TAB$$TAB$$TAB$( (uint8 *)($FORMAT("0x%x", ipau)$) ), /* MPLA$info$ : &__limit_$label[info]$ */$NL$
427 $ELSE$
428 $TAB$$TAB$$TAB$( (uint8 *)NULL ), /* MPLA$info$ : $FORMAT("0x%x", ipal)$ */$NL$
429 $TAB$$TAB$$TAB$( (uint8 *)NULL ), /* MPUA$info$ : $FORMAT("0x%x", ipau)$ */$NL$
430 $END$
431 $END$
432 $IF !OSAP.TRUSTED[ARGV[1]]$
433 $OSAP.MPRC[ARGV[1]] = OSAP.MPRC[ARGV[1]] | 0x01$
434 $TAB$$TAB$$TAB$( (uint32)($FORMAT("0x%x", OSAP.MPRC[ARGV[1]])$) ), /* MPRC */$NL$
435 $ELSE$
436 $TAB$$TAB$$TAB$( (uint32)0 ), /* MPRC */$NL$
437 $END$
438 $TAB$$TAB$}$NL$
439 $NL$
440$END$
441
442$FUNCTION GENERATE_TSKINICTXB$
443 $TAB$$TAB${$NL$
444 $TAB$$TAB$$TAB$$TSK.TINIB_SSTKSZ[ARGV[1]]$,$NL$
445 $TAB$$TAB$$TAB$((void *)((uint8 *)($TSK.TINIB_SSTK[ARGV[1]]$)
446 $SPC$+ ($TSK.TINIB_SSTKSZ[ARGV[1]]$))),$NL$
447 $IF OSAP.TRUSTED[TSK.OSAPID[ARGV[1]]]$
448 $TAB$$TAB$$TAB$0,$NL$
449 $TAB$$TAB$$TAB$0,$NL$
450 $ELSE$
451 $TAB$$TAB$$TAB$$TSK.TINIB_USTKSZ[ARGV[1]]$,$NL$
452 $TAB$$TAB$$TAB$((void *)((uint8 *)($TSK.TINIB_USTK[ARGV[1]]$)
453 $SPC$+ ($TSK.TINIB_USTKSZ[ARGV[1]]$))),$NL$
454 $END$
455 $TAB$$TAB$},$NL$
456$END$
457
458$FUNCTION GENERATE_STKMPUINFOB$
459 $TAB$$TAB${$NL$
460 $IF OSAP.TRUSTED[TSK.OSAPID[ARGV[1]]]$
461 $TAB$$TAB$$TAB$0,$NL$
462 $TAB$$TAB$$TAB$0,$NL$
463 $ELSE$
464 $p_tinib = SYMBOL("tinib_table")$
465 $TRACE(TSK.ID[ARGV[1]])$
466 $p_tinib = p_tinib + TSK.ID[ARGV[1]] * sizeof_TINIB$
467 $start_address = PEEK(p_tinib + offsetof_TINIB_STKMPUINFOB_start_ustk, 4)$
468 $end_address = PEEK(p_tinib + offsetof_TINIB_STKMPUINFOB_limit_ustk, 4)$
469 $mpl = (start_address & 0xfffffff0)$
470 $mpu = (end_address & 0xfffffff0)$
471 $IF (mpl != start_address) || (mpu != end_address)$
472 $ERROR$
473 $FORMAT("task is %s", ARGV[1])$$NL$
474 $FORMAT("user stack in not aligned: start=0x%x, end=0x%x", start_address, end_address)$$NL$
475 $FORMAT("mpla=0x%x, mpua=0x%x", mpl, mpu)$
476 $END$
477 $END$
478 $IF mpl == mpu$
479 $ERROR$
480 $FORMAT("task is %s", ARGV[1])$$NL$
481 $FORMAT("user stack size is 0: start=0x%x, end=0x%x", start_address, end_address)$$NL$
482 $FORMAT("mpla=0x%x, mpua=0x%x", mpl, mpu)$
483 $END$
484 $END$
485 $mpu = (mpu - 0x1) & 0xfffffffc$
486 $TAB$$TAB$$TAB$$FORMAT("(uint8 *)0x%x /* &__start_user_stack %s */", mpl, ARGV[1])$,$NL$
487 $TAB$$TAB$$TAB$$FORMAT("(uint8 *)0x%x /* &__limit_user_stack %s */", mpu, ARGV[1])$,$NL$
488$ $ $IF EQ(TSK.STK[tskid],"NULL")$
489$ $ $ // stkがNULLの場合の処理
490$ $ $IF LENGTH(TSK.SHARED_USTK_ID[tskid])$
491$ $ $ // 共有スタック
492$ $ $TAB$$TAB$$TAB$$FORMAT("&__start_shared_user_stack%s", TSK.PRIORITY[ARGV[1]])$,$NL$
493$ $ $TAB$$TAB$$TAB$$FORMAT("(&__limit_shared_user_stack%s - 0x10)", TSK.PRIORITY[ARGV[1]])$,$NL$
494$ $ $ELSE$
495$ $ $ // 固有スタック
496$ $ $TAB$$TAB$$TAB$$FORMAT("&__start_user_stack%s", ARGV[1])$,$NL$
497$ $ $TAB$$TAB$$TAB$$FORMAT("(&__limit_user_stack%s - 0x10)", ARGV[1])$,$NL$
498$ $ $END$
499$ $ $ELSE$
500$ $ $ // stkがNULLでない場合の処理
501$ $ $TAB$$TAB$$TAB$$FORMAT("(uint8 *)%s", TSK.TINIB_USTK[ARGV[1]])$,$NL$
502$ $ $TAB$$TAB$$TAB$$FORMAT("(uint8 *)((uint32)%s + %d - 0x10)", TSK.TINIB_USTK[ARGV[1]], TSK.TINIB_USTKSZ[ARGV[1]])$,$NL$
503$ $ $END$
504 $END$
505 $TAB$$TAB$},$NL$
506$END$
507
508$
509$ 非依存部の読込み
510$
511$INCLUDE "kernel/kernel_mem.tf"$
512
513$
514$ 共有のMPU設定情報を生成
515$ kernel_mem3.cの宣言位置と合わせる
516$
517$FILE "kernel_mem.c"$
518
519$ RWX領域
520$comment[3] = "MPU 3"$
521$access[3] = 0x47$
522
523$shared_meminib = SYMBOL("shared_meminib_table")$
524$TNUM_SHARED_REGION = 1$
525const uint32 tnum_shared_mem = $TNUM_SHARED_REGION * 2$;$NL$
526uint8 * const shared_meminib_table[$TNUM_SHARED_REGION * 2$] = {$NL$
527$FOREACH info RANGE(3,3)$
528$ // 領域の開始アドレスを読み込む
529 $start_address = SHARED_DATA.BASE$
530$ // 領域の終了アドレスを読み込む
531 $end_address = SHARED_DATA.LIMIT$
532 $ipal = (start_address & 0xfffffff0)$
533 $ipau = (end_address & 0xfffffff0)$
534 $WARNING$
535 $FORMAT("info%d: start=0x%x, end=0x%x", info, start_address, end_address)$
536 $END$
537 $IF (ipal != start_address) || (ipau != end_address)$
538 $ERROR$
539 $FORMAT("Not aligned: start=0x%x, end=0x%x", start_address, end_address)$
540 $END$
541 $END$
542 $IF ipal != ipau$
543 $valid[info] = 0x01$
544 $ipau = (ipau - 0x1) & 0xfffffffc$
545 $ELSE$
546 $valid[info] = 0x00$
547 $END$
548 $WARNING$
549 $FORMAT("info%d: ipal=0x%x, ipau=0x%x", info, ipal, ipau)$
550 $END$
551 $TAB$$TAB$$FORMAT("( (uint8 *)0x%x )", ipal)$, /* MPLA($comment[info]$) */$NL$
552 $TAB$$TAB$$FORMAT("( (uint8 *)0x%x )", ipau)$, /* MPUA($comment[info]$) */$NL$
553$END$
554};$NL$
555$NL$
556
557$TRACE(valid[1])$
558$TRACE(valid[2])$
559$TRACE(valid[3])$
560
561$ $mpu_region_control = 0x01$
562$ $mprc_ex = 2$
563$ $FOREACH x RANGE(1,3)$
564$ $IF valid[x] == 0x01$
565$ $mpu_region_control = mpu_region_control | mprc_ex$
566$ $END$
567$ $mprc_ex = mprc_ex * 2$
568$ $END$
569$ const uint32 mpu_region_control = $mpu_region_control$; /* MPRC */$NL$
570
Note: See TracBrowser for help on using the repository browser.