source: atk2-sc3-1.4.0-ntisr/arch/v850_gcc/prc_mem_common.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: 30.3 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) 2015-2016 by Center for Embedded Computing Systems
8$ Graduate School of Information Science, Nagoya Univ., JAPAN
9$
10$ 上記著作権者
11は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
12$ ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
13$ 変・再é…
14å¸ƒï¼ˆä»¥ä¸‹ï¼Œåˆ©ç”¨ã¨å‘¼ã¶ï¼‰ã™ã‚‹ã“とを無償で許諾する.
15$ (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
16$ 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
17$ スコード中に含まれていること.
18$ (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
19$ 用できる形で再é…
20å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
21å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
22$ 者
23マニュアルなど)に,上記の著作権表示,この利用条件および下記
24$ の無保証規定を掲載すること.
25$ (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
26$ 用できない形で再é…
27å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
28$ と.
29$ (a) 再é…
30å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
31マニュアルなど)に,上記の著
32$ 作権表示,この利用条件および下記の無保証規定を掲載すること.
33$ (b) 再é…
34å¸ƒã®å½¢æ…
35‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
36$ 報告すること.
37$ (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
38$ 害からも,上記著作権者
39およびTOPPERSプロジェクトをå…
40è²¬ã™ã‚‹ã“と.
41$ また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
42$ 由に基づく請求からも,上記著作権者
43およびTOPPERSプロジェクトを
44$ å…
45è²¬ã™ã‚‹ã“と.
46$
47$ 本ソフトウェアは,無保証で提供されているものである.上記著作権者
48お
49$ よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
50$ に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
51$ アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
52$ の責任を負わない.
53$
54$
55$ =====================================================================
56
57$DEBUG_OPT_TF = 1$
58
59$
60$ パス4のプロセッサ依存テンプレート(V850用)
61$
62
63$ システムスタックのå…
64ˆé ­ç•ªåœ°å–å¾— (for kernel_mem.tf)
65$FUNCTION GET_SSTK_TSKINICTXB$
66 $bottom = PEEK(ARGV[1] + offsetof_TINIB_TSKINICTXB_sstk_bottom, sizeof_void_ptr)$
67 $size = PEEK(ARGV[1] + offsetof_TINIB_TSKINICTXB_sstksz, sizeof_StackType)$
68 $RESULT = (bottom - size)$
69$END$
70
71$ ユーザスタックのå…
72ˆé ­ç•ªåœ°å–å¾— (for kernel_mem.tf)
73$FUNCTION GET_USTK_TSKINICTXB$
74 $bottom = PEEK(ARGV[1] + offsetof_TINIB_TSKINICTXB_stk_bottom, sizeof_void_ptr)$
75 $size = PEEK(ARGV[1] + offsetof_TINIB_TSKINICTXB_stksz, sizeof_StackType)$
76 $RESULT = (bottom - size)$
77$END$
78
79$
80$ OSAP.ID_LISTを読み込むため
81$
82$INCLUDE "cfg2_out.tf"$
83
84$
85$ 保護ドメインのラベルの作成
86$ OSAP.LABEL[domid]:保護ドメインのラベル
87$
88$OSAP.LABEL[TDOM_KERNEL] = "kernel"$
89$FOREACH domid OSAP.ID_LIST$
90 $OSAP.LABEL[domid] = domid$
91$END$
92$OSAP.LABEL[TDOM_NONE] = "shared"$
93
94$
95$ 標準のセクションのメモリオブジェクト属性の定義
96$
97$MEMATR_TEXT = (TA_NOWRITE|TA_EXEC)$
98$MEMATR_RODATA = (TA_NOWRITE|TA_EXEC)$
99$MEMATR_DATA = TA_MEMINI$
100$MEMATR_BSS = TA_NULL$
101$MEMATR_PRSV = TA_MEMPRSV$
102$MEMATR_ROSDATA = (TA_SDATA|TA_MEMINI|TA_NOWRITE|TA_EXEC)$
103$MEMATR_SDATA = (TA_SDATA|TA_MEMINI)$
104$MEMATR_SBSS = TA_SDATA$
105
106$
107$ 保護ドメイン毎のデフォルトのアクセス許可パターンの作成
108$
109$DEFAULT_ACPTN[TDOM_KERNEL] = VALUE("TACP_KERNEL", TACP_KERNEL)$
110$FOREACH domid OSAP.ID_LIST$
111 $DEFAULT_ACPTN[domid] = VALUE(FORMAT("TACP(%1%)", domid), 1 << (domid - 1))$
112$END$
113$DEFAULT_ACPTN[TDOM_NONE] = VALUE("TACP_SHARED", TACP_SHARED)$
114
115$
116$ MPU設定情
117報生成の準備
118$ 状æ…
119‹å®šç¾©ï¼š
120$ check == 0 : 初期状æ…
121‹
122$ check == 1 : å…
123±æœ‰ãƒªãƒ¼ãƒ‰ã§ãªã„or非信頼からライトできない範囲
124$ check == 2 : å…
125±æœ‰ãƒªãƒ¼ãƒ‰ãƒ©ã‚¤ãƒˆãƒ‡ãƒ¼ã‚¿ã®ç¯„囲
126$ check == 3 : å…
127±æœ‰ãƒªãƒ¼ãƒ‰å°‚有ライトショートデータの範囲
128$ check == 4 : å…
129±æœ‰ãƒªãƒ¼ãƒ‰å°‚有ライトデータの範囲
130$ check_r == 0 : 初期状æ…
131‹
132$ check_r == 1 : 対象外
133$ check_r == 2 : å…
134±æœ‰ãƒªãƒ¼ãƒ‰ROMの範囲
135$ check_r == 3 : å…
136±æœ‰ãƒªãƒ¼ãƒ‰RAMの範囲
137$
138$check = 0$
139$check_r = 0$
140$memtop_table = SYMBOL("memtop_table")$
141$offset = 0$
142$FOREACH osap OSAP.ID_LIST$
143 $IF !OSAP.TRUSTED[osap]$
144 $OSAP.mem_area_mo[osap] = {}$
145 $END$
146$END$
147$shared_mem_area_mo = {}$
148$FOREACH mo MO_MPROTECT_LIST$
149 $start_sym = ""$
150 $IF EQ(MO.TYPE[mo], "TOPPERS_ATTMEM")$
151$ // OsMemoryArea対応
152 $IF EQ(MO.OSAPID[mo], "TDOM_NONE")$
153$ // å…
154±æœ‰é ˜åŸŸ
155 $shared_mem_area_mo = APPEND(shared_mem_area_mo, mo)$
156 $ELIF !EQ(MO.OSAPID[mo], "TDOM_KERNEL")$
157$ // 非信頼OSAP専有領域
158 $TRACE("ATT_MEM?")$
159 $TRACE(mo)$
160 $OSAP.mem_area_mo[MO.OSAPID[mo]] = APPEND(OSAP.mem_area_mo[MO.OSAPID[mo]], mo)$
161 $END$
162 $END$
163 $IF LENGTH(pre_mo) && ((check >= 2) || (check_r >= 2))$
164$ // 空でないメモリオブジェクトを探す
165 $FOREACH at RANGE(FIND(MO_ORDER, pre_mo), FIND(MO_ORDER, mo) - 1)$
166 $cur_mo = AT(MO_ORDER, at)$
167 $start = START_MO_SYMBOL(cur_mo)$
168 $limit = LIMIT_MO_SYMBOL(cur_mo)$
169 $TRACE("cur_mo")$
170 $TRACE(cur_mo)$
171 $IF LENGTH(start) && !EQ(start, "")$
172 $IF EQ(start_sym, "")$
173 $start_sym = start$
174 $END$
175 $IF LENGTH(limit)$
176 $limit_sym = limit$
177 $END$
178 $END$
179 $END$
180 $END$
181
182 $IF check == 2$
183$ // å…
184±æœ‰é ˜åŸŸã®çµ‚端番地
185 $IF !LENGTH(shared_mo_start) || EQ(shared_mo_start, "")$
186 $shared_mo_start = start_sym$
187 $END$
188 $shared_mo_limit = limit_sym$
189 $TRACE("##############")$
190 $TRACE(shared_mo_limit)$
191 $ELIF check == 3$
192$ // å…
193±æœ‰ãƒªãƒ¼ãƒ‰å°‚有ライトsdata領域の終端番地
194 $sosap_mo_start[MO.OSAPID[pre_mo]] = start_sym$
195 $sosap_mo_limit[MO.OSAPID[pre_mo]] = limit_sym$
196 $ELIF check == 4$
197$ // å…
198±æœ‰ãƒªãƒ¼ãƒ‰å°‚有ライト領域の終端番地
199 $osap_mo_start[MO.OSAPID[pre_mo]] = start_sym$
200 $osap_mo_limit[MO.OSAPID[pre_mo]] = limit_sym$
201 $TRACE("########## check srpw ##########")$
202 $TRACE(MO.OSAPID[pre_mo])$
203 $TRACE(osap_mo_start)$
204 $ELIF check == 5$
205$ // 非信頼OSAPの専有リードROM領域
206 $osap_text_start[MO.OSAPID[pre_mo]] = start_sym$
207 $osap_text_limit[MO.OSAPID[pre_mo]] = limit_sym$
208 $ELIF check == 6$
209$ // 非信頼OSAPの専有リードRAM領域
210 $sosap_text_start[MO.OSAPID[pre_mo]] = start_sym$
211 $sosap_text_limit[MO.OSAPID[pre_mo]] = limit_sym$
212 $ELIF check == 7$
213$ // 非信頼OSAPの専有リードライトショート領域
214 $sosap_data_start[MO.OSAPID[pre_mo]] = start_sym$
215 $sosap_data_limit[MO.OSAPID[pre_mo]] = limit_sym$
216 $ELIF check == 8$
217$ // 非信頼OSAPの専有リードライト領域
218 $TRACE("########## check prw ##########")$
219 $TRACE(MO.OSAPID[pre_mo])$
220 $TRACE(start_sym)$
221 $TRACE(osap_data_start[MO.OSAPID[pre_mo]])$
222 $osap_data_start[MO.OSAPID[pre_mo]] = start_sym$
223 $osap_data_limit[MO.OSAPID[pre_mo]] = limit_sym$
224 $END$
225
226 $IF check_r == 2$
227$ // å…
228±æœ‰ãƒªãƒ¼ãƒ‰ROM領域の終端番地
229 $IF !LENGTH(shared_rom_mo_start) || EQ(shared_rom_mo_start, "")$
230 $shared_rom_mo_start = start_sym$
231 $END$
232 $shared_rom_mo_limit = limit_sym$
233 $TRACE("########## shared_rom limit ##########")$
234 $TRACE(shared_rom_mo_limit)$
235 $ELIF check_r == 3$
236$ // å…
237±æœ‰ãƒªãƒ¼ãƒ‰RAM領域の終端番地
238 $IF !LENGTH(shared_ram_mo_start) || EQ(shared_ram_mo_start, "")$
239 $shared_ram_mo_start = start_sym$
240 $END$
241 $shared_ram_mo_limit = limit_sym$
242 $TRACE("########## shared_ram limit ##########")$
243 $TRACE(shared_ram_mo_limit)$
244 $END$
245
246 $start_sym = START_MO_SYMBOL(mo)$
247 $limit_sym = LIMIT_MO_SYMBOL(mo)$
248 $IF EQ(MO.TYPE[mo], "TOPPERS_ATTMEM") || EQ(MO.TYPE[mo], "TOPPERS_USTACK")$
249 $check = 1$
250 $check_r = 1$
251 $ELIF !EQ(MO.ACPTN_R[mo], "TACP_SHARED")$
252$ // å…
253±æœ‰ãƒªãƒ¼ãƒ‰ã§ãªã„
254 $IF !EQ(MO.ACPTN_R[mo], "TACP_KERNEL")$
255$ // 非信頼OSAPの専有リード領域
256 $IF EQ(MO.ACPTN_W[mo], "TACP_KERNEL")$
257$ // 非信頼OSAPの専有リード領域
258 $IF (MO.MEMATR[mo] & TA_SDATA) == 0$
259$ // 非信頼OSAPの専有リードROM領域
260 $osap_text_start[MO.OSAPID[mo]] = start_sym$
261 $check = 5$
262 $ELSE$
263$ // 非信頼OSAPの専有リードRAM領域
264 $sosap_text_start[MO.OSAPID[mo]] = start_sym$
265 $check = 6$
266 $END$
267 $ELSE$
268$ // 非信頼OSAPの専有リードライト領域
269 $IF (MO.MEMATR[mo] & TA_SDATA) != 0$
270$ // sdata
271 $sosap_data_start[MO.OSAPID[mo]] = start_sym$
272 $check = 7$
273 $ELSE$
274$ // not sdata
275 $osap_data_start[MO.OSAPID[mo]] = start_sym$
276 $check = 8$
277 $END$
278 $END$
279 $ELSE$
280 $check = 1$
281 $check_r = 1$
282 $END$
283 $ELIF EQ(MO.ACPTN_W[mo], "TACP_SHARED")$
284$ // å…
285±æœ‰ãƒªãƒ¼ãƒ‰ãƒ©ã‚¤ãƒˆ
286 $IF LENGTH(shared_mo_start)$
287 $IF check != 2$
288$ // pre_moがå…
289±æœ‰ãƒªãƒ¼ãƒ‰ãƒ©ã‚¤ãƒˆã§ãªã„場合はメモリ領域が連続していない
290$ // ためエラーとする
291 $ERROR$
292 shared mo duplicate
293 $END$
294 $END$
295 $ELSE$
296 $shared_mo_start = start_sym$
297 $END$
298 $TRACE("start_srw")$
299 $TRACE(mo)$
300 $check = 2$
301 $check_r = 1$
302 $ELIF MO.MEMREG[mo] == STANDARD_RAM$
303$ // å…
304±æœ‰ãƒªãƒ¼ãƒ‰RAM領域
305 $IF !EQ(MO.ACPTN_W[mo], "TACP_KERNEL")$
306$ // å…
307±æœ‰ãƒªãƒ¼ãƒ‰å°‚有ライト
308 $IF (MO.MEMATR[mo] & TA_SDATA) != 0$
309$ // sdata
310 $sosap_mo_start[MO.OSAPID[mo]] = start_sym$
311 $check = 3$
312 $ELSE$
313$ // not sdata
314 $osap_mo_start[MO.OSAPID[mo]] = start_sym$
315 $check = 4$
316 $END$
317 $ELSE$
318 $check = 1$
319 $END$
320 $IF LENGTH(shared_ram_mo_start)$
321 $IF check_r != 3$
322$ // pre_moがå…
323±æœ‰ãƒªãƒ¼ãƒ‰ã§ãªã„場合はメモリ領域が連続していない
324$ // ためエラーとする
325 $ERROR$
326 shared_ram mo duplicate
327 $END$
328 $END$
329 $ELSE$
330 $shared_ram_mo_start = start_sym$
331 $END$
332 $check_r = 3$
333 $ELIF MO.MEMREG[mo] == STANDARD_ROM$
334$ // å…
335±æœ‰ãƒªãƒ¼ãƒ‰ROM領域
336 $check = 1$
337 $IF LENGTH(shared_rom_mo_start)$
338 $IF check_r != 2$
339$ // pre_moがå…
340±æœ‰ãƒªãƒ¼ãƒ‰ã§ãªã„場合はメモリ領域が連続していない
341$ // ためエラーとする
342 $ERROR$
343 shared_rom mo duplicate
344 $END$
345 $END$
346 $ELSE$
347 $shared_rom_mo_start = start_sym$
348 $END$
349 $check_r = 2$
350 $ELSE$
351 $check = 1$
352 $check_r = 1$
353 $END$
354
355 $pre_mo = mo$
356$END$
357$TRACE(pre_mo)$
358$TRACE(mo)$
359$IF ((check >= 2) || (check_r >= 2))$
360 $start_sym = ""$
361$ // 空でないメモリオブジェクトを探す
362 $FOREACH at RANGE(FIND(MO_ORDER, pre_mo), LENGTH(MO_ORDER) - 1)$
363 $cur_mo = AT(MO_ORDER, at)$
364 $start = START_MO_SYMBOL(cur_mo)$
365 $limit = LIMIT_MO_SYMBOL(cur_mo)$
366 $IF LENGTH(start) && !EQ(start, "")$
367 $IF EQ(start_sym, "")$
368 $start_sym = start$
369 $END$
370 $IF LENGTH(limit)$
371 $limit_sym = limit$
372 $END$
373 $END$
374 $END$
375$END$
376
377$IF check == 2$
378$ // å…
379±æœ‰é ˜åŸŸã®çµ‚端番地
380 $IF !LENGTH(shared_mo_start) || EQ(shared_mo_start, "")$
381 $shared_mo_start = start_sym$
382 $END$
383 $shared_mo_limit = limit_sym$
384 $TRACE("**************")$
385 $TRACE(shared_mo_limit)$
386$ELIF check == 3$
387$ // å…
388±æœ‰ãƒªãƒ¼ãƒ‰å°‚有ライトsdata領域の終端番地
389 $sosap_mo_start[MO.OSAPID[pre_mo]] = start_sym$
390 $sosap_mo_limit[MO.OSAPID[pre_mo]] = limit_sym$
391$ELIF check == 4$
392$ // å…
393±æœ‰ãƒªãƒ¼ãƒ‰å°‚有ライト領域の終端番地
394 $osap_mo_start[MO.OSAPID[pre_mo]] = start_sym$
395 $osap_mo_limit[MO.OSAPID[pre_mo]] = limit_sym$
396$END$
397
398$IF check_r == 2$
399$ // å…
400±æœ‰ãƒªãƒ¼ãƒ‰ROM領域の終端番地
401 $IF !LENGTH(shared_rom_mo_start) || EQ(shared_rom_mo_start, "")$
402 $shared_rom_mo_start = start_sym$
403 $END$
404 $shared_rom_mo_limit = limit_sym$
405 $TRACE("########## shared_rom limit ##########")$
406 $TRACE(shared_rom_mo_limit)$
407$ELIF check_r == 3$
408$ // å…
409±æœ‰ãƒªãƒ¼ãƒ‰RAM領域の終端番地
410 $IF !LENGTH(shared_ram_mo_start) || EQ(shared_ram_mo_start, "")$
411 $shared_ram_mo_start = start_sym$
412 $END$
413 $shared_ram_mo_limit = limit_sym$
414 $TRACE("########## shared_ram limit ##########")$
415 $TRACE(shared_ram_mo_limit)$
416$END$
417
418$
419$ MPUにセットする上下限アドレスを取得し,
420$ OSAPごとのMPRC設定値をセットする
421$ ARGV[1] : å…
422ˆé ­ã‚¢ãƒ‰ãƒ¬ã‚¹
423$ ARGV[2] : 末尾アドレス
424$ ARGV[3] : MPRCのビット位置
425$ RETURN : {MPUにセットする上限アドレス, 下限アドレス}
426$
427$FUNCTION GET_MPUL_SET_MPRC$
428 $start_address = ALT(ARGV[1], MPU_PAGE_MASK)$
429 $end_address = ALT(ARGV[2], MPU_PAGE_MASK)$
430 $TRACE(start_address)$
431 $ipal = (start_address & MPU_PAGE_MASK)$
432 $ipau = (end_address & MPU_PAGE_MASK)$
433 $WARNING$
434 $FORMAT("info%d: start=0x%x, end=0x%x", info, start_address, end_address)$
435 $END$
436 $IF (ipal != start_address) || (ipau != end_address)$
437 $ERROR$
438 $FORMAT("Not aligned: start=0x%x, end=0x%x", start_address, end_address)$
439 $END$
440 $END$
441 $IF ipal != ipau$
442 $ipau = (ipau - 0x1) & 0xfffffffc$
443 $FOREACH osap OSAP.ID_LIST$
444 $IF !OSAP.TRUSTED[osap]$
445 $OSAP.MPRC[osap] = OSAP.MPRC[osap] | (0x1 << ARGV[3])$
446 $TRACE(OSAP.MPRC[osap])$
447 $END$
448 $END$
449 $END$
450 $WARNING$
451 $FORMAT("info%d: ipal=0x%x, ipau=0x%x", info, ipal, ipau)$
452 $END$
453
454 $RESULT = APPEND(ipal, ipau)$
455$END$
456
457$
458$ MPUにセットする上下限アドレスを取得し,
459$ OSAPごとのMPRC設定値をセットする
460$ ARGV[1] : å…
461ˆé ­ã‚¢ãƒ‰ãƒ¬ã‚¹
462$ ARGV[2] : 末尾アドレス
463$ ARGV[3] : MPRCのビット位置
464$ ARGV[4] : OSAPID
465$ RETURN : {MPUにセットする上限アドレス, 下限アドレス}
466$
467$FUNCTION GET_MPUL_SET_MPRC_OSAP$
468 $TRACE("GET_MPUL_SET_MPRC_OSAP")$
469 $TRACE(ARGV[4])$
470 $start_address = ALT(ARGV[1], MPU_PAGE_MASK)$
471 $end_address = ALT(ARGV[2], MPU_PAGE_MASK)$
472 $ipal = (start_address & MPU_PAGE_MASK)$
473 $ipau = (end_address & MPU_PAGE_MASK)$
474 $WARNING$
475 $FORMAT("info%d: start=0x%x, end=0x%x", info, start_address, end_address)$
476 $END$
477 $IF (ipal != start_address) || (ipau != end_address)$
478 $ERROR$
479 $FORMAT("Not aligned: start=0x%x, end=0x%x", start_address, end_address)$
480 $END$
481 $END$
482 $IF ipal != ipau$
483 $ipau = (ipau - 0x1) & 0xfffffffc$
484 $OSAP.MPRC[ARGV[4]] = OSAP.MPRC[ARGV[4]] | (0x1 << ARGV[3])$
485 $END$
486 $WARNING$
487 $FORMAT("info%d: ipal=0x%x, ipau=0x%x", info, ipal, ipau)$
488 $END$
489
490 $RESULT = APPEND(ipal, ipau)$
491$END$
492
493$
494$ å…
495±æœ‰é ˜åŸŸåˆæœŸåŒ–ブロックのMPU設定に関連したデータを生成
496$ 初期化ブロックをkernel_mem.cに出力する処理は,pass2と
497$ 合わせるために,ここで実施しない
498$
499$FUNCTION GENERATE_TARGET_MPUINFOB$
500$ // OSAPごとのMPRCレジスタ設定値を初期化
501$ // ユーザスタック領域MPU0は必
502ず有効
503 $FOREACH osap OSAP.ID_LIST$
504 $IF !OSAP.TRUSTED[osap]$
505 $OSAP.MPRC[osap] = 0x01$
506 $END$
507 $END$
508 $cur_shared_mpu_id = 0$
509
510 $PREPARE_OSAPINICTXB()$
511
512 $FOREACH osap OSAP.ID_LIST$
513 $IF LENGTH(ENUM_MPU_OSAP_ATTMEM[osap]) &&
514 (ENUM_MPU_OSAP_ATTMEM[osap] > 0)$
515 static MPUINFOB mpu_area_info_$osap$[$ENUM_MPU_OSAP_ATTMEM[osap]$] = {$NL$
516
517 $cur_osap_mpu_id = TNUM_MPU_OSAP_DEFAULT + 1$
518 $FOREACH mo OSAP.mem_area_mo[osap]$
519$ // 専有ATT_MEM
520 $osap_mpu_reg = GET_MPUL_SET_MPRC_OSAP(MO.BASEADDR[mo],
521 MO.LIMITADDR[mo],
522 cur_osap_mpu_id,
523 osap)$
524$ // MPATのデフォルトはE|G|SX|SW|SR
525 $osap_mpu_mpat = 0xF8$
526 $IF !EQ(MO.ACPTN_R[mo], "TACP_KERNEL")$
527 $osap_mpu_mpat = osap_mpu_mpat | 0x01$
528 $END$
529 $IF !EQ(MO.ACPTN_W[mo], "TACP_KERNEL")$
530 $osap_mpu_mpat = osap_mpu_mpat | 0x02$
531 $END$
532 $IF !EQ(MO.ACPTN_X[mo], "TACP_KERNEL")$
533 $osap_mpu_mpat = osap_mpu_mpat | 0x04$
534 $END$
535 $ipal = AT(osap_mpu_reg, 0)$
536 $ipau = AT(osap_mpu_reg, 1)$
537 $TAB$$TAB${$NL$
538 $TAB$$TAB$$TAB$( (uint32)($FORMAT("0x%x", +ipal)$) ), /* MPUL$cur_osap_mpu_id$ */$NL$
539 $TAB$$TAB$$TAB$( (uint32)($FORMAT("0x%x", +ipau)$) ), /* MPUA$cur_osap_mpu_id$ */$NL$
540 $TAB$$TAB$$TAB$( (uint32)($FORMAT("0x%x", +osap_mpu_mpat)$) ), /* MPAT$cur_osap_mpu_id$ */$NL$
541 $TAB$$TAB$},$NL$
542 $cur_osap_mpu_id = cur_osap_mpu_id + 1$
543 $END$
544 };$NL$
545 $NL$
546 $END$
547 $END$
548
549 $IF USE_MPU_SRW_DATA_SDATA$
550$ // å…
551±æœ‰ãƒªãƒ¼ãƒ‰ãƒ©ã‚¤ãƒˆ
552 $shared_mpu_reg[cur_shared_mpu_id] =
553 GET_MPUL_SET_MPRC(shared_mo_start, shared_mo_limit,
554 TNUM_MPU_REG - cur_shared_mpu_id - 1)$
555 $shared_mpu_reg[cur_shared_mpu_id] = APPEND(shared_mpu_reg[cur_shared_mpu_id], { 1, 1, 1 })$
556 $TRACE("********** srw *********")$
557 $TRACE(cur_shared_mpu_id)$
558 $TRACE(shared_mpu_reg[cur_shared_mpu_id])$
559 $cur_shared_mpu_id = cur_shared_mpu_id + 1$
560 $END$
561 $IF USE_MPU_SR_TEXT$
562$ // å…
563±æœ‰ãƒªãƒ¼ãƒ‰ROM
564 $TRACE(shared_rom_mo_start)$
565 $shared_mpu_reg[cur_shared_mpu_id] =
566 GET_MPUL_SET_MPRC(shared_rom_mo_start, shared_rom_mo_limit,
567 TNUM_MPU_REG - cur_shared_mpu_id - 1)$
568 $shared_mpu_reg[cur_shared_mpu_id] = APPEND(shared_mpu_reg[cur_shared_mpu_id], { 1, 0, 1 })$
569 $cur_shared_mpu_id = cur_shared_mpu_id + 1$
570 $END$
571 $IF USE_MPU_SR_DATA_SDATA$
572$ // å…
573±æœ‰ãƒªãƒ¼ãƒ‰RAM
574 $shared_mpu_reg[cur_shared_mpu_id] =
575 GET_MPUL_SET_MPRC(shared_ram_mo_start, shared_ram_mo_limit,
576 TNUM_MPU_REG - cur_shared_mpu_id - 1)$
577 $shared_mpu_reg[cur_shared_mpu_id] = APPEND(shared_mpu_reg[cur_shared_mpu_id], { 1, 0, 1 })$
578 $cur_shared_mpu_id = cur_shared_mpu_id + 1$
579 $END$
580 $FOREACH mo shared_mem_area_mo$
581$ // å…
582±æœ‰ATT_MEM
583 $shared_mpu_reg[cur_shared_mpu_id] =
584 GET_MPUL_SET_MPRC(MO.BASEADDR[mo], MO.LIMITADDR[mo],
585 TNUM_MPU_REG - cur_shared_mpu_id - 1)$
586 $shared_mpu_reg[cur_shared_mpu_id] = APPEND(shared_mpu_reg[cur_shared_mpu_id], { MO.ACPTN_R[mo],
587 MO.ACPTN_W[mo],
588 MO.ACPTN_X[mo] })$
589 $cur_shared_mpu_id = cur_shared_mpu_id + 1$
590 $END$
591 $FOREACH mpuid RANGE(cur_shared_mpu_id, TNUM_MPU_SHARED - 1)$
592 $shared_mpu_reg[cur_shared_mpu_id] = { 0, 0, 0, 0, 0 }$
593 $END$
594$END$
595
596$FUNCTION GENERATE_OSAPINIB_MPUINFOB$
597 $cur_osap_mpu_id = 1$
598
599$ // 関数呼び出しでARGVが上書きされるためここで保存する
600 $arg_osapid = ARGV[1]$
601
602 $TAB$$TAB${$NL$
603 $IF !OSAP.TRUSTED[arg_osapid]$
604 $IF !LENGTH(OSAP.MPRC[arg_osapid])$
605 $OSAP.MPRC[arg_osapid] = 0x01$
606 $END$
607 $IF USE_MPU_SRPW_DATA$
608$ // å…
609±æœ‰ãƒªãƒ¼ãƒ‰å°‚有ライトデータ
610 $osap_mpu_reg = GET_MPUL_SET_MPRC_OSAP(osap_mo_start[arg_osapid],
611 osap_mo_limit[arg_osapid],
612 cur_osap_mpu_id,
613 arg_osapid)$
614 $ipal = AT(osap_mpu_reg, 0)$
615 $ipau = AT(osap_mpu_reg, 1)$
616 $TAB$$TAB$$TAB$( (uint8 *)($FORMAT("0x%x", +ipal)$) ), /* MPUL$cur_osap_mpu_id$ */$NL$
617 $TAB$$TAB$$TAB$( (uint8 *)($FORMAT("0x%x", +ipau)$) ), /* MPUA$cur_osap_mpu_id$ */$NL$
618 $cur_osap_mpu_id = cur_osap_mpu_id + 1$
619 $END$
620 $IF USE_MPU_SRPW_SDATA$
621$ // å…
622±æœ‰ãƒªãƒ¼ãƒ‰å°‚有ライトショートデータ
623 $osap_mpu_reg = GET_MPUL_SET_MPRC_OSAP(sosap_mo_start[arg_osapid],
624 sosap_mo_limit[arg_osapid],
625 cur_osap_mpu_id,
626 arg_osapid)$
627 $ipal = AT(osap_mpu_reg, 0)$
628 $ipau = AT(osap_mpu_reg, 1)$
629 $TAB$$TAB$$TAB$( (uint8 *)($FORMAT("0x%x", +ipal)$) ), /* MPLA$cur_osap_mpu_id$ */$NL$
630 $TAB$$TAB$$TAB$( (uint8 *)($FORMAT("0x%x", +ipau)$) ), /* MPLA$cur_osap_mpu_id$ */$NL$
631 $cur_osap_mpu_id = cur_osap_mpu_id + 1$
632 $END$
633 $IF USE_MPU_PR_TEXT$
634$ // 専有リードROM
635 $osap_mpu_reg = GET_MPUL_SET_MPRC_OSAP(osap_text_start[arg_osapid],
636 osap_text_limit[arg_osapid],
637 cur_osap_mpu_id,
638 arg_osapid)$
639 $ipal = AT(osap_mpu_reg, 0)$
640 $ipau = AT(osap_mpu_reg, 1)$
641 $TAB$$TAB$$TAB$( (uint8 *)($FORMAT("0x%x", +ipal)$) ), /* MPLA$cur_osap_mpu_id$ */$NL$
642 $TAB$$TAB$$TAB$( (uint8 *)($FORMAT("0x%x", +ipau)$) ), /* MPLA$cur_osap_mpu_id$ */$NL$
643 $cur_osap_mpu_id = cur_osap_mpu_id + 1$
644 $END$
645 $IF USE_MPU_PR_SDATA$
646$ // 専有リードRAM
647 $osap_mpu_reg = GET_MPUL_SET_MPRC_OSAP(sosap_text_start[arg_osapid],
648 sosap_text_limit[arg_osapid],
649 cur_osap_mpu_id,
650 arg_osapid)$
651 $ipal = AT(osap_mpu_reg, 0)$
652 $ipau = AT(osap_mpu_reg, 1)$
653 $TAB$$TAB$$TAB$( (uint8 *)($FORMAT("0x%x", +ipal)$) ), /* MPLA$cur_osap_mpu_id$ */$NL$
654 $TAB$$TAB$$TAB$( (uint8 *)($FORMAT("0x%x", +ipau)$) ), /* MPLA$cur_osap_mpu_id$ */$NL$
655 $cur_osap_mpu_id = cur_osap_mpu_id + 1$
656 $END$
657 $IF USE_MPU_PRW_DATA$
658$ // 専有リードライトデータ
659 $osap_mpu_reg = GET_MPUL_SET_MPRC_OSAP(osap_data_start[arg_osapid],
660 osap_data_limit[arg_osapid],
661 cur_osap_mpu_id,
662 arg_osapid)$
663 $ipal = AT(osap_mpu_reg, 0)$
664 $ipau = AT(osap_mpu_reg, 1)$
665 $TAB$$TAB$$TAB$( (uint8 *)($FORMAT("0x%x", +ipal)$) ), /* MPUL$cur_osap_mpu_id$ */$NL$
666 $TAB$$TAB$$TAB$( (uint8 *)($FORMAT("0x%x", +ipau)$) ), /* MPUA$cur_osap_mpu_id$ */$NL$
667 $cur_osap_mpu_id = cur_osap_mpu_id + 1$
668 $END$
669 $IF USE_MPU_PRW_SDATA$
670$ // å…
671±æœ‰ãƒªãƒ¼ãƒ‰å°‚有ライトショートデータ
672 $osap_mpu_reg = GET_MPUL_SET_MPRC_OSAP(sosap_data_start[arg_osapid],
673 sosap_data_limit[arg_osapid],
674 cur_osap_mpu_id,
675 arg_osapid)$
676 $ipal = AT(osap_mpu_reg, 0)$
677 $ipau = AT(osap_mpu_reg, 1)$
678 $TAB$$TAB$$TAB$( (uint8 *)($FORMAT("0x%x", +ipal)$) ), /* MPUL$cur_osap_mpu_id$ */$NL$
679 $TAB$$TAB$$TAB$( (uint8 *)($FORMAT("0x%x", +ipau)$) ), /* MPUA$cur_osap_mpu_id$ */$NL$
680 $cur_osap_mpu_id = cur_osap_mpu_id + 1$
681 $END$
682 $IF LENGTH(ENUM_MPU_OSAP_ATTMEM[arg_osapid]) &&
683 (ENUM_MPU_OSAP_ATTMEM[arg_osapid] > 0)$
684 $TAB$$TAB$$TAB$mpu_area_info_$arg_osapid$, /* mpu_area_info */$NL$
685 $TAB$$TAB$$TAB$$ENUM_MPU_OSAP_ATTMEM[arg_osapid]$U,$NL$
686 $ELSE$
687 $TAB$$TAB$$TAB$NULL, /* mpu_area_info */$NL$
688 $TAB$$TAB$$TAB$0U,$NL$
689 $END$
690 $TAB$$TAB$$TAB$( (uint32)$FORMAT("0x%x", +OSAP.MPRC[arg_osapid])$ ),/* MPRC */$NL$
691 $ELSE$
692 $IF USE_MPU_SRPW_DATA$
693$ // å…
694±æœ‰ãƒªãƒ¼ãƒ‰å°‚有ライトデータ
695 $TAB$$TAB$$TAB$0, 0, /* MPU$mpu_id$ */$NL$
696 $cur_osap_mpu_id = cur_osap_mpu_id + 1$
697 $END$
698 $IF USE_MPU_SRPW_SDATA$
699$ // å…
700±æœ‰ãƒªãƒ¼ãƒ‰å°‚有ライトショートデータ
701 $TAB$$TAB$$TAB$0, 0, /* MPU$mpu_id$ */$NL$
702 $cur_osap_mpu_id = cur_osap_mpu_id + 1$
703 $END$
704 $IF USE_MPU_PR_TEXT$
705$ // 専有リードROM
706 $TAB$$TAB$$TAB$0, 0, /* MPU$mpu_id$ */$NL$
707 $cur_osap_mpu_id = cur_osap_mpu_id + 1$
708 $END$
709 $IF USE_MPU_PR_SDATA$
710$ // 専有リードRAM
711 $TAB$$TAB$$TAB$0, 0, /* MPU$mpu_id$ */$NL$
712 $cur_osap_mpu_id = cur_osap_mpu_id + 1$
713 $END$
714 $IF USE_MPU_PRW_DATA$
715$ // 専有リードライトデータ
716 $TAB$$TAB$$TAB$0, 0, /* MPU$mpu_id$ */$NL$
717 $cur_osap_mpu_id = cur_osap_mpu_id + 1$
718 $END$
719 $IF USE_MPU_PRW_SDATA$
720$ // å…
721±æœ‰ãƒªãƒ¼ãƒ‰å°‚有ライトショートデータ
722 $TAB$$TAB$$TAB$0, 0, /* MPU$mpu_id$ */$NL$
723 $cur_osap_mpu_id = cur_osap_mpu_id + 1$
724 $END$
725 $TAB$$TAB$$TAB$NULL, /* mpu_area_info */$NL$
726 $TAB$$TAB$$TAB$0U,$NL$
727 $TAB$$TAB$$TAB$( (uint32)0 ),/* MPRC */$NL$
728 $END$
729 $TAB$$TAB$}$NL$
730 $NL$
731$END$
732
733$FUNCTION GENERATE_TSKINICTXB$
734 $TAB$$TAB${$NL$
735 $TAB$$TAB$$TAB$$TSK.TINIB_SSTKSZ[ARGV[1]]$,$NL$
736 $TAB$$TAB$$TAB$((void *)((uint8 *)($TSK.TINIB_SSTK[ARGV[1]]$)
737 $SPC$+ ($TSK.TINIB_SSTKSZ[ARGV[1]]$))),$NL$
738 $IF OSAP.TRUSTED[TSK.OSAPID[ARGV[1]]] || (tmin_os_restarttask <= ARGV[1])$
739 $TAB$$TAB$$TAB$0,$NL$
740 $TAB$$TAB$$TAB$0,$NL$
741 $ELSE$
742 $TAB$$TAB$$TAB$$TSK.TINIB_USTKSZ[ARGV[1]]$,$NL$
743 $TAB$$TAB$$TAB$((void *)((uint8 *)($TSK.TINIB_USTK[ARGV[1]]$)
744 $SPC$+ ($TSK.TINIB_USTKSZ[ARGV[1]]$))),$NL$
745 $END$
746 $TAB$$TAB$},$NL$
747$END$
748
749$FUNCTION GENERATE_STKMPUINFOB$
750 $TAB$$TAB${$NL$
751 $IF OSAP.TRUSTED[TSK.OSAPID[ARGV[1]]] || (tmin_os_restarttask <= ARGV[1])$
752 $TAB$$TAB$$TAB$0,$NL$
753 $TAB$$TAB$$TAB$0,$NL$
754 $ELSE$
755 $IF EQ(TSK.STK[ARGV[1]],"NULL")$
756$ // stkがNULLの場合の処理
757 $IF LENGTH(TSK.SHARED_USTK_ID[ARGV[1]])$
758$ // å…
759±æœ‰ã‚¹ã‚¿ãƒƒã‚¯
760 $section = SECTION_SHARED_USTACK(TSK.SHARED_USTK_ID[ARGV[1]])$
761 $ELSE$
762$ // 固有スタック
763 $section = SECTION_USTACK(ARGV[1])$
764 $END$
765 $start_address = START_SYMBOL(section)$
766 $end_address = LIMIT_SYMBOL(section)$
767 $ELSE$
768$ // stkがNULLでない場合の処理
769 $p_tinib = SYMBOL("tinib_table")$
770 $p_tinib = p_tinib + TSK.ID[ARGV[1]] * sizeof_TINIB$
771 $start_address = PEEK(p_tinib + offsetof_TINIB_STKMPUINFOB_start_ustk, 4)$
772 $end_address = PEEK(p_tinib + offsetof_TINIB_STKMPUINFOB_limit_ustk, 4)$
773 $END$
774 $mpl = (start_address & MPU_PAGE_MASK)$
775 $mpu = (end_address & MPU_PAGE_MASK)$
776 $IF (mpl != start_address) || (mpu != end_address)$
777 $ERROR$
778 $FORMAT("task is %s", ARGV[1])$$NL$
779 $FORMAT("user stack in not aligned: start=0x%x, end=0x%x", start_address, end_address)$$NL$
780 $FORMAT("mpla=0x%x, mpua=0x%x", mpl, mpu)$
781 $END$
782 $END$
783 $IF mpl == mpu$
784 $ERROR$
785 $FORMAT("task is %s", ARGV[1])$$NL$
786 $FORMAT("user stack size is 0: start=0x%x, end=0x%x", start_address, end_address)$$NL$
787 $FORMAT("mpla=0x%x, mpua=0x%x", mpl, mpu)$
788 $END$
789 $END$
790 $mpu = (mpu - 0x1) & 0xfffffffc$
791 $TAB$$TAB$$TAB$$FORMAT("(void *)0x%x /* &__start_user_stack %s */", +mpl, ARGV[1])$,$NL$
792 $TAB$$TAB$$TAB$$FORMAT("(void *)0x%x /* &__limit_user_stack %s */", +mpu, ARGV[1])$,$NL$
793 $END$
794 $TAB$$TAB$},$NL$
795$END$
796
797$MEMORY_ALIGN = 4$
798$FUNCTION HOOK_ERRORCHECK_MEM_PASS4$
799$ // baseがメモリ保護境界の制約に合致していない場合 NOS0813
800 $TRACE(MEMORY_ALIGN)$
801 $IF (MO.BASEADDR[ARGV[1]] & (MEMORY_ALIGN - 1)) != 0$
802 $ERROR MO.TEXT_LINE[ARGV[1]]$
803 $FORMAT(_("%1% `%2%\' is not aligned to %3%"),
804 "OsMemoryAreaStartAddress", MO.BASEADDR[ARGV[1]], MEMORY_ALIGN)$
805 $END$
806 $END$
807$END$
808
809$
810$ 非依存部の読込み
811$
812$INCLUDE "kernel/kernel_mem.tf"$
813
814$
815$ å…
816±æœ‰ã®MPU設定情
817報を生成
818$ pass2での宣言位置と合わせる
819$
820$FILE "kernel_mem.c"$
821
822$IF TNUM_MPU_SHARED > 0$
823 uint8 * const shared_meminib_table[$TNUM_MPU_SHARED * 3$] = {$NL$
824 $FOREACH memid RANGE(0,TNUM_MPU_SHARED-1)$
825 $TRACE(memid)$
826 $TRACE(shared_mpu_reg[memid])$
827 $TRACE(AT(shared_mpu_reg[memid], 0))$
828 $TRACE(AT(shared_mpu_reg[memid], 1))$
829 $TAB$$FORMAT("( (uint8 *)0x%x )", +AT(shared_mpu_reg[memid], 0))$, /* MPUL$TNUM_MPU_REG - 1 - memid$ */$NL$
830 $TAB$$FORMAT("( (uint8 *)0x%x )", +AT(shared_mpu_reg[memid], 1))$, /* MPUA$TNUM_MPU_REG - 1 - memid$ */$NL$
831$ // MPATのデフォルトはE|G|SX|SW|SR
832 $osap_mpu_mpat = 0xF8$
833 $IF AT(shared_mpu_reg[memid], 2) != 0$
834$ // MPAT |= UR
835 $osap_mpu_mpat = osap_mpu_mpat | 0x01$
836 $END$
837 $IF AT(shared_mpu_reg[memid], 3) != 0$
838$ // MPAT |= UW
839 $osap_mpu_mpat = osap_mpu_mpat | 0x02$
840 $END$
841 $IF AT(shared_mpu_reg[memid], 4) != 0$
842$ // MPAT |= UX
843 $osap_mpu_mpat = osap_mpu_mpat | 0x04$
844 $END$
845 $TAB$$FORMAT("( (uint8 *)0x%x )", +osap_mpu_mpat)$, /* MPAT$TNUM_MPU_REG - 1 - memid$ */$NL$
846 $END$
847 };$NL$
848 $NL$
849$END$
850
Note: See TracBrowser for help on using the repository browser.