source: atk2-sc3_fl850f1l/arch/v850_gcc/prc_opt.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: 25.2 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$ arch/v850_gcc/ldscript.tfのターゲット依存部
46$
47$FUNCTION GENERATE_MEMORY$
48 $NOOP()$
49$END$
50
51$FUNCTION GENERATE_OUTPUT$
52 OUTPUT_FORMAT("elf32-v850","elf32-v850","elf32-v850")$NL$
53 OUTPUT_ARCH(v850)$NL$
54 $NL$
55$END$
56
57$
58$ 保護ドメインのラベルの作成
59$ OSAP.LABEL[domid]:保護ドメインのラベル
60$
61$OSAP.LABEL[TDOM_KERNEL] = "kernel"$
62$FOREACH domid OSAP.ID_LIST$
63 $OSAP.LABEL[domid] = domid$
64$END$
65$OSAP.LABEL[TDOM_NONE] = "shared"$
66
67$
68$ 標準のセクションのメモリオブジェクト属性の定義
69$
70$MEMATR_TEXT = (TA_NOWRITE|TA_EXEC)$
71$MEMATR_RODATA = (TA_NOWRITE|TA_EXEC)$
72$MEMATR_DATA = TA_MEMINI$
73$MEMATR_BSS = TA_NULL$
74$MEMATR_PRSV = TA_MEMPRSV$
75$MEMATR_ROSDATA = (TA_SDATA|TA_MEMINI|TA_NOWRITE|TA_EXEC)$
76$MEMATR_SDATA = (TA_SDATA|TA_MEMINI)$
77$MEMATR_SBSS = TA_SDATA$
78
79
80$
81$ 保護ドメイン毎のデフォルトのアクセス許可パターンの作成
82$
83$DEFAULT_ACPTN[TDOM_KERNEL] = VALUE("TACP_KERNEL", TACP_KERNEL)$
84$FOREACH domid OSAP.ID_LIST$
85 $DEFAULT_ACPTN[domid] = VALUE(FORMAT("TACP(%1%)", domid), 1 << (domid - 1))$
86$END$
87$DEFAULT_ACPTN[TDOM_NONE] = VALUE("TACP_SHARED", TACP_SHARED)$
88
89$
90$ メモリ保護単位の実際のサイズを受け取り,受け取ったサイズ以上で,
91$ ARM MPUのサイズ制約を満たす最小値を返す
92$ ARM MPUのサイズ制約は,16B~4GBの範囲の2のべき乗
93$ ARGV[1]:実際のサイズ
94$ RESULT:ARM MPUのサイズ制約を満たす最小値
95$FUNCTION SEARCH_ARM_MPU_SIZE$
96 $IF ARGV[1] <= 0$
97 $RESULT = 0$
98 $ELSE$
99 $search_state = 0$
100 $FOREACH bit_offset { 31,30,...,4 }$
101 $compare_bit = 1 << bit_offset$
102 $IF ((ARGV[1] & compare_bit) != 0)$
103 $IF (search_state == 0)$
104 $result_size = compare_bit$
105 $search_state = 1$
106 $ELIF (search_state == 1)$
107 $result_size = (result_size << 1)$
108 $search_state = 2$
109 $END$
110 $END$
111 $END$
112 $IF (search_state == 0)$
113 $result_size = (1 << 4)$
114 $ELIF (search_state == 1) && ((ARGV[1] & 0xf) != 0)$
115 $result_size = (result_size << 1)$
116 $END$
117 $RESULT = result_size$
118 $END$
119$END$
120
121$
122$ 受け取った番地以上で,ARM MPUのアライン制約の最小値を返す
123$ ARGV[1]:番地
124$ ARGV[2]:サイズ
125$ RESULT:ARM MPUのアライン制約を満たす最小値
126$
127$FUNCTION SEARCH_ARM_MPU_ALIGN$
128 $result_align = ARGV[1]$
129 $compare_mask = ARGV[2] - 1$
130 $IF ((ARGV[1] & compare_mask) != 0)$
131 $result_align = ARGV[1] & ~compare_mask$
132 $result_align = result_align + ARGV[2]$
133 $END$
134
135 $RESULT = result_align$
136$END$
137
138$
139$ tsize_meminibの補正
140$ sdata_sharedの先頭アドレスをマスクベース方式でアラインするため,
141$ その直前のセクションのlimitとsdata_sharedのstartが異なる可能性がある
142$ よって+1しておく
143$ prsv_sharedの終端アドレスをマスクベース方式でアラインするため,
144$ prsv_sharedのサイズが空でも,パス4ではstartとlimitが異なる可能性がある
145$ よって+1しておく
146$
147$FUNCTION CALC_TSIZE_MEMINIB$
148 $tsize_meminib = tsize_meminib + 2$
149$END$
150
151$OPTIMIZE_MEMINIB = 1$
152$OPTIMIZE_DATASEC_LIST = 1$
153$OPTIMIZE_BSSSEC_LIST = 1$
154
155$
156$ OSAP初期化コンテキストブロックのための宣言
157$
158$FUNCTION PREPARE_OSAPINICTXB$
159 $IF LENGTH(TSK.ID_LIST)$
160 $FOREACH tskid TSK.ID_LIST$
161 $IF !OSAP.TRUSTED[TSK.OSAPID[tskid]]$
162 extern uint8 $FORMAT("__start_user_stack%s", tskid)$;$NL$
163 extern uint8 $FORMAT("__limit_user_stack%s", tskid)$;$NL$
164 $END$
165 $END$
166 $END$
167 $FOREACH tskpri RANGE(TMIN_TPRI, TMAX_TPRI)$
168 $IF LENGTH(shared_ustack_size[tskpri])$
169 extern uint8 $FORMAT("__start_shared_user_stack%s", tskpri)$;$NL$
170 extern uint8 $FORMAT("__limit_shared_user_stack%s", tskpri)$;$NL$
171 $END$
172 $END$
173
174
175 $IF LENGTH(OSAP.ID_LIST)$
176 $FOREACH domid OSAP.ID_LIST$
177 $IF !OSAP.TRUSTED[domid]$
178$ RX領域(専用)
179 extern uint8 __start_text_$OSAP.LABEL[domid]$;$NL$
180 extern uint8 __limit_text_$OSAP.LABEL[domid]$;$NL$
181$ R領域(専用)
182 extern uint8 __start_sram_$OSAP.LABEL[domid]$_$FORMAT("%x", MEMATR_ROSDATA & ~TA_MEMINI)$;$NL$
183 extern uint8 __limit_sram_$OSAP.LABEL[domid]$_$FORMAT("%x", MEMATR_ROSDATA & ~TA_MEMINI)$;$NL$
184$ RWX領域(専用)
185 extern uint8 __start_ram_$OSAP.LABEL[domid]$;$NL$
186 extern uint8 __limit_ram_$OSAP.LABEL[domid]$;$NL$
187 extern uint8 __start_sram_$OSAP.LABEL[domid]$;$NL$
188 extern uint8 __limit_sram_$OSAP.LABEL[domid]$;$NL$
189$ 共有リード専用ライト
190 extern uint8 $FORMAT("__start_ram_%s_%x_%x", OSAP.LABEL[domid], +DEFAULT_ACPTN[domid], +TACP_SHARED)$;$NL$
191 extern uint8 $FORMAT("__limit_ram_%s_%x_%x", OSAP.LABEL[domid], +DEFAULT_ACPTN[domid], +TACP_SHARED)$;$NL$
192 extern uint8 $FORMAT("__start_sram_%s_%x_%x", OSAP.LABEL[domid], +DEFAULT_ACPTN[domid], +TACP_SHARED)$;$NL$
193 extern uint8 $FORMAT("__limit_sram_%s_%x_%x", OSAP.LABEL[domid], +DEFAULT_ACPTN[domid], +TACP_SHARED)$;$NL$
194 $END$
195 $END$
196 $NL$
197 $END$$NL$
198
199$ 共有領域
200 extern uint8 __start_text_$OSAP.LABEL[TDOM_NONE]$;$NL$
201 extern uint8 __limit_text_$OSAP.LABEL[TDOM_NONE]$;$NL$
202 extern uint8 __start_sram_$OSAP.LABEL[TDOM_NONE]$_$FORMAT("%x", MEMATR_ROSDATA & ~TA_MEMINI)$;$NL$
203 extern uint8 __limit_sram_$OSAP.LABEL[TDOM_NONE]$_$FORMAT("%x", MEMATR_ROSDATA & ~TA_MEMINI)$;$NL$
204 extern uint8 __start_ram_$OSAP.LABEL[TDOM_NONE]$;$NL$
205 extern uint8 __limit_ram_$OSAP.LABEL[TDOM_NONE]$;$NL$
206 extern uint8 __start_sram_$OSAP.LABEL[TDOM_NONE]$;$NL$
207 extern uint8 __limit_sram_$OSAP.LABEL[TDOM_NONE]$;$NL$
208$ 共有リード専用ライト領域全体
209 extern uint8 __start_srpw_all;$NL$
210 extern uint8 __limit_srpw_all;$NL$
211 extern uint8 __start_ssrpw_all;$NL$
212 extern uint8 __limit_ssrpw_all;$NL$
213 $NL$
214$END$
215
216
217$FUNCTION GENERATE_TARGET_MPUINFOB$
218$
219$ 保護ドメイン初期化ブロックのmem依存部を生成
220$
221 $FILE "kernel_mem3.c"$
222
223 $PREPARE_OSAPINICTXB()$
224
225$END$
226
227$
228$ TSKINICTXBの初期化情報を生成
229$
230$DOMINICTXB_KERNEL = "{ NULL }"$
231
232$FUNCTION GENERATE_OSAPINIB_MPUINFOB$
233 $TAB$$TAB${$NL$
234 $IF !OSAP.TRUSTED[ARGV[1]]$
235$ RX領域(専用)
236 $TAB$$TAB$$TAB$( (uint8 *)&__start_text_$OSAP.LABEL[ARGV[1]]$ ), /* iregion 0 */$NL$
237 $TAB$$TAB$$TAB$( (uint8 *)&__limit_text_$OSAP.LABEL[ARGV[1]]$ ), /* iregion 0 */$NL$
238$ RX領域(専用ショートデータ)
239 $TAB$$TAB$$TAB$( (uint8 *)&__start_sram_$OSAP.LABEL[ARGV[1]]$_$FORMAT("%x", MEMATR_ROSDATA & ~TA_MEMINI)$ ),/* iregion 1 */$NL$
240 $TAB$$TAB$$TAB$( (uint8 *)&__limit_sram_$OSAP.LABEL[ARGV[1]]$_$FORMAT("%x", MEMATR_ROSDATA & ~TA_MEMINI)$ ),/* iregion 1 */$NL$
241$ RWX領域(専用)
242 $TAB$$TAB$$TAB$( (uint8 *)&__start_ram_$OSAP.LABEL[ARGV[1]]$ ),/* dregion 1 */$NL$
243 $TAB$$TAB$$TAB$( (uint8 *)&__limit_ram_$OSAP.LABEL[ARGV[1]]$ ),/* dregion 1 */$NL$
244$ RWX領域(専用ショートデータ)
245 $TAB$$TAB$$TAB$( (uint8 *)&__start_sram_$OSAP.LABEL[ARGV[1]]$ ),/* dregion 2 */$NL$
246 $TAB$$TAB$$TAB$( (uint8 *)&__limit_sram_$OSAP.LABEL[ARGV[1]]$ ),/* dregion 2 */$NL$
247$ 共有リード専用ライト
248 $TAB$$TAB$$TAB$$FORMAT("( (uint8 *)&__start_ram_%s_%x_%x )", OSAP.LABEL[ARGV[1]], +DEFAULT_ACPTN[ARGV[1]], +TACP_SHARED)$,/* dregion 3 */$NL$
249 $TAB$$TAB$$TAB$$FORMAT("( (uint8 *)&__limit_ram_%s_%x_%x )", OSAP.LABEL[ARGV[1]], +DEFAULT_ACPTN[ARGV[1]], +TACP_SHARED)$,/* dregion 3 */$NL$
250$ 共有リード専用ライト(ショートデータ)
251 $TAB$$TAB$$TAB$$FORMAT("( (uint8 *)&__start_sram_%s_%x_%x )", OSAP.LABEL[ARGV[1]], +DEFAULT_ACPTN[ARGV[1]], +TACP_SHARED)$,/* dregion 4 */$NL$
252 $TAB$$TAB$$TAB$$FORMAT("( (uint8 *)&__limit_sram_%s_%x_%x )", OSAP.LABEL[ARGV[1]], +DEFAULT_ACPTN[ARGV[1]], +TACP_SHARED)$,/* dregion 4 */$NL$
253 $ELSE$
254 $TAB$$TAB$$TAB$( (uint8 *)NULL ),/* iregion 0 */$NL$
255 $TAB$$TAB$$TAB$( (uint8 *)NULL ),/* iregion 0 */$NL$
256 $TAB$$TAB$$TAB$( (uint8 *)NULL ),/* iregion 1 */$NL$
257 $TAB$$TAB$$TAB$( (uint8 *)NULL ),/* iregion 1 */$NL$
258 $TAB$$TAB$$TAB$( (uint8 *)NULL ),/* dregion 1 */$NL$
259 $TAB$$TAB$$TAB$( (uint8 *)NULL ),/* dregion 1 */$NL$
260 $TAB$$TAB$$TAB$( (uint8 *)NULL ),/* dregion 2 */$NL$
261 $TAB$$TAB$$TAB$( (uint8 *)NULL ),/* dregion 2 */$NL$
262 $TAB$$TAB$$TAB$( (uint8 *)NULL ),/* dregion 3 */$NL$
263 $TAB$$TAB$$TAB$( (uint8 *)NULL ),/* dregion 3 */$NL$
264 $TAB$$TAB$$TAB$( (uint8 *)NULL ),/* dregion 4 */$NL$
265 $TAB$$TAB$$TAB$( (uint8 *)NULL ),/* dregion 4 */$NL$
266 $END$
267 $TAB$$TAB$}$NL$
268 $NL$
269$END$
270
271$FUNCTION GENERATE_TSKINICTXB$
272 $TAB$$TAB${$NL$
273 $TAB$$TAB$$TAB$$TSK.TINIB_SSTKSZ[ARGV[1]]$,$NL$
274 $TAB$$TAB$$TAB$((void *)((uint8 *)($TSK.TINIB_SSTK[ARGV[1]]$)
275 $SPC$+ ($TSK.TINIB_SSTKSZ[ARGV[1]]$))),$NL$
276 $IF OSAP.TRUSTED[TSK.OSAPID[ARGV[1]]]$
277 $TAB$$TAB$$TAB$0,$NL$
278 $TAB$$TAB$$TAB$0,$NL$
279 $ELSE$
280 $TAB$$TAB$$TAB$$TSK.TINIB_USTKSZ[ARGV[1]]$,$NL$
281 $TAB$$TAB$$TAB$((void *)((uint8 *)($TSK.TINIB_USTK[ARGV[1]]$)
282 $SPC$+ ($TSK.TINIB_USTKSZ[ARGV[1]]$))),$NL$
283 $END$
284 $TAB$$TAB$},$NL$
285$END$
286
287$FUNCTION GENERATE_STKMPUINFOB$
288 $TAB$$TAB${$NL$
289 $IF OSAP.TRUSTED[TSK.OSAPID[ARGV[1]]]$
290 $TAB$$TAB$$TAB$0,$NL$
291 $TAB$$TAB$$TAB$0,$NL$
292 $ELSE$
293 $IF EQ(TSK.STK[tskid],"NULL")$
294$ // stkがNULLの場合の処理
295 $IF LENGTH(TSK.SHARED_USTK_ID[tskid])$
296$ // 共有スタック
297 $TAB$$TAB$$TAB$$FORMAT("&__start_shared_user_stack%s", TSK.PRIORITY[ARGV[1]])$,$NL$
298 $TAB$$TAB$$TAB$$FORMAT("(&__limit_shared_user_stack%s - 0x10)", TSK.PRIORITY[ARGV[1]])$,$NL$
299 $ELSE$
300$ // 固有スタック
301 $TAB$$TAB$$TAB$$FORMAT("&__start_user_stack%s", ARGV[1])$,$NL$
302 $TAB$$TAB$$TAB$$FORMAT("(&__limit_user_stack%s - 0x10)", ARGV[1])$,$NL$
303 $END$
304 $ELSE$
305$ // stkがNULLでない場合の処理
306 $TAB$$TAB$$TAB$$FORMAT("(uint8 *)%s", TSK.TINIB_USTK[ARGV[1]])$,$NL$
307 $TAB$$TAB$$TAB$$FORMAT("(uint8 *)((uint32)%s + %d - 0x10)", TSK.TINIB_USTK[ARGV[1]], TSK.TINIB_USTKSZ[ARGV[1]])$,$NL$
308 $END$
309 $END$
310 $TAB$$TAB$},$NL$
311$END$
312
313$INCLUDE "kernel/kernel_opt.tf"$
314
315$
316$ 共有リードライト領域 / 共有リード専有ライト領域(sdata) / rosdata_shared領域
317$ の情報取得
318$
319$check_shared_mo = 0x00$
320$check_srpw_mo = 0x00$
321$check_rosdata_mo = 0x00$
322$check_sdata_mo = 0x00$
323$LIST_SHARED_MO = {}$
324$LIST_SRPW_MO = {}$
325$LIST_ROSDATA_MO = {}$
326$preid = -1$
327$FOREACH moid MO_START_LIST$
328$ // メモリオブジェクトの先頭をパス2時点での順にチェック
329 $IF LENGTH(FIND(MO_MPROTECT_LIST, moid))$
330$ // メモリ保護単位の先頭の場合
331 $IF (MO.ACPTN1[moid] == TACP_SHARED) && (MO.ACPTN2[moid] == TACP_SHARED)$
332 $IF ((check_shared_mo & 0x10) != 0x10)$
333$ // 共有リードライト領域の先頭の場合
334 $SHARED_AREA_BASE[check_shared_mo] = MO.BASEADDR[moid]$
335 $SHARED_AREA_MO[check_shared_mo] = moid$
336 $LIST_SHARED_MO = APPEND(LIST_SHARED_MO, check_shared_mo)$
337 $check_shared_mo = check_shared_mo | 0x10$
338 $END$
339 $ELIF (check_shared_mo & 0x10) == 0x10$
340$ // 共有リードライト領域の終端の場合
341 $IF preid == -1$
342 $ERROR$
343 $FORMAT("unexpected preid.")$
344 $END$
345 $END$
346 $check_shared_mo = check_shared_mo & 0x0f$
347 $SHARED_AREA_LIMIT[check_shared_mo] = MO.LIMITADDR[preid]$
348 $SHARED_AREA_SIZE[check_shared_mo] = SHARED_AREA_LIMIT[check_shared_mo] - SHARED_AREA_BASE[check_shared_mo]$
349 $SHARED_AREA_LIMIT_MO[check_shared_mo] = preid$
350 $check_shared_mo = check_shared_mo + 1$
351 $END$
352
353 $END$
354
355 $preid = moid$
356$END$
357$IF (check_shared_mo & 0x10) == 0x10$
358 $IF preid == -1$
359 $ERROR$
360 $FORMAT("unexpected preid.")$
361 $END$
362 $END$
363 $check_shared_mo = check_shared_mo & 0x0f$
364 $SHARED_AREA_LIMIT[check_shared_mo] = MO.LIMITADDR[preid]$
365 $SHARED_AREA_LIMIT_MO[check_shared_mo] = preid$
366 $SHARED_AREA_SIZE[check_shared_mo] = SHARED_AREA_LIMIT[check_shared_mo] - SHARED_AREA_BASE[check_shared_mo]$
367 $check_shared_mo = check_shared_mo + 1$
368$END$
369$
370$ エラーチェック
371$
372$FOREACH id LIST_SHARED_MO$
373 $IF DEBUG_OPT_TF$
374 $WARNING$
375 $id$$NL$
376 $SHARED_AREA_MO[id]$$NL$
377 $SHARED_AREA_LIMIT_MO[id]$$NL$
378 $FORMAT("0x%x", SHARED_AREA_BASE[id])$$NL$
379 $FORMAT("0x%x", SHARED_AREA_LIMIT[id])$$NL$
380 $FORMAT("0x%x", SHARED_AREA_SIZE[id])$$NL$
381 $END$
382 $END$
383 $IF ((MO.MEMATR[SHARED_AREA_MO[id]] & TA_SDATA) == TA_SDATA)$
384 $IF LENGTH(SHARED_DATA.BASE)$
385 $ERROR$
386 $FORMAT("unexpected mematr: %d, %x", id, MO.MEMATR[SHARED_AREA_MO[id]])$
387 $END$
388 $ELSE$
389 $SHARED_DATA.BASE = SHARED_AREA_BASE[id]$
390 $SHARED_DATA.LIMIT = SHARED_AREA_LIMIT[id]$
391 $SHARED_DATA.SIZE = SHARED_AREA_SIZE[id]$
392 $SHARED_DATA.BASE_MO = SHARED_AREA_MO[id]$
393 $SHARED_DATA.LIMIT_MO = SHARED_AREA_LIMIT_MO[id]$
394 $END$
395 $ELSE$
396 $ERROR$
397 $FORMAT("unexpected mematr: %d, %x", id, MO.MEMATR[SHARED_AREA_MO[id]])$
398 $END$
399 $END$
400$END$
401
402$
403$ data_sharedの配置アドレスを求める
404$
405$SHARED_DATA.REALSIZE = SEARCH_ARM_MPU_SIZE(SHARED_DATA.SIZE)$
406$SHARED_DATA.REALBASE = SEARCH_ARM_MPU_ALIGN(SHARED_DATA.BASE, SHARED_DATA.REALSIZE)$
407$IF DEBUG_OPT_TF$
408 $WARNING$
409 $FORMAT("data_shared: base[0x%x], size[0x%x]", SHARED_DATA.REALBASE, SHARED_DATA.REALSIZE)$$NL$
410 $END$
411$END$
412
413$
414$ 配置アドレスを指定するセクションに対する処理
415$ 配置換え対象のセクション: 必ずあるかどうか
416$ srpw_data_all: 0
417$ srpw_sdata_all: 0
418$ rosdata_shared: 1
419$ sdata_shared: 1
420$ data_shared: 1
421$
422$check_shared_mo = 0$
423$preid = -1$
424$limit_align_flag = 1$
425$FOREACH moid MO_START_LIST$
426$ // メモリオブジェクトの先頭をパス2時点での順にチェック
427 $IF MO.LINKER[moid]$
428 $IF DEBUG_OPT_TF$
429 $WARNING$
430 $FORMAT("check mo %d: SEFLAG=0x%x", moid, MO.SEFLAG[moid])$$NL$
431 $END$
432 $END$
433 $IF (moid == SHARED_DATA.BASE_MO)$
434$ // data_sharedの先頭
435 $MO.REALBASE[moid] = SHARED_DATA.REALBASE$
436 $MO.COMMENT[moid] = "data_shared_top"$
437 $IF DEBUG_OPT_TF$
438 $WARNING$
439 $FORMAT("%s[%d]=0x%x", MO.COMMENT[moid], moid, MO.REALBASE[moid])$$NL$
440 $END$
441 $END$
442 $END$
443 $IF (preid == SHARED_DATA.LIMIT_MO)$
444$ // data_sharedの終端はマスクベース方式なのでサイズの倍数にアライン
445 $at_mo_order = FIND(MO_ORDER, preid)$
446 $check_flag = 1$
447 $WHILE check_flag$
448 $IF LENGTH(AT(MO_ORDER, at_mo_order))$
449 $IF DEBUG_OPT_TF$
450 $WARNING$
451 $FORMAT("check: %d, 0x%x", AT(MO_ORDER, at_mo_order), +MO.SEFLAG[AT(MO_ORDER, at_mo_order)])$$NL$
452 $END$
453 $END$
454 $IF (MO.SEFLAG[AT(MO_ORDER, at_mo_order)] & 0x20) == 0x20$
455 $IF DEBUG_OPT_TF$
456 $WARNING$
457 $FORMAT("hit: %d, 0x%x", AT(MO_ORDER, at_mo_order), +MO.SEFLAG[AT(MO_ORDER, at_mo_order)])$$NL$
458 $END$
459 $END$
460 $MO.REALALIGN[AT(MO_ORDER, at_mo_order)] = SHARED_DATA.REALSIZE$
461 $check_flag = 0$
462 $END$
463 $ELSE$
464 $ERROR$
465 $FORMAT("shared data does not have limit label")$$NL$
466 $END$
467 $check_flag = 0$
468 $END$
469 $at_mo_order = at_mo_order + 1$
470 $END$
471 $END$
472 $END$
473
474 $preid = moid$
475$END$
476$IF (preid == SHARED_DATA.LIMIT_MO)$
477$ // data_sharedの終端はマスクベース方式なのでサイズの倍数にアライン
478 $at_mo_order = FIND(MO_ORDER, preid)$
479 $check_flag = 1$
480 $WHILE check_flag$
481 $IF LENGTH(AT(MO_ORDER, at_mo_order))$
482 $IF DEBUG_OPT_TF$
483 $WARNING$
484 $FORMAT("check: %d, 0x%x", AT(MO_ORDER, at_mo_order), +MO.SEFLAG[AT(MO_ORDER, at_mo_order)])$$NL$
485 $END$
486 $END$
487 $IF (MO.SEFLAG[AT(MO_ORDER, at_mo_order)] & 0x20) == 0x20$
488 $IF DEBUG_OPT_TF$
489 $WARNING$
490 $FORMAT("hit: %d, 0x%x", AT(MO_ORDER, at_mo_order), +MO.SEFLAG[AT(MO_ORDER, at_mo_order)])$$NL$
491 $END$
492 $END$
493 $MO.REALALIGN[AT(MO_ORDER, at_mo_order)] = SHARED_DATA.REALSIZE$
494 $check_flag = 0$
495 $END$
496 $ELSE$
497 $ERROR$
498 $FORMAT("shared data does not have limit label")$$NL$
499 $END$
500 $check_flag = 0$
501 $END$
502 $at_mo_order = at_mo_order + 1$
503 $END$
504$END$
505
506$
507$ arch/v850_gcc/ldscript.tfのターゲット依存部
508$
509
510$FUNCTION GENERATE_PROVIDE$
511 PROVIDE(_hardware_init_hook = 0);$NL$
512 PROVIDE(_software_init_hook = 0);$NL$
513 PROVIDE(_software_term_hook = 0);$NL$
514 PROVIDE(_bsssecinib_table = 0);$NL$
515 PROVIDE(_tnum_bsssec = 0);$NL$
516 PROVIDE(_datasecinib_table = 0);$NL$
517 PROVIDE(_tnum_datasec = 0);$NL$
518 $NL$
519
520 $IF LENGTH(OSAP.ID_LIST)$
521 $FOREACH domid OSAP.ID_LIST$
522 $IF !OSAP.TRUSTED[domid]$
523$ RX領域(専用)
524 PROVIDE(___start_text_$OSAP.LABEL[domid]$ = 0xfffffff0);$NL$
525 PROVIDE(___limit_text_$OSAP.LABEL[domid]$ = 0xfffffff0);$NL$
526$ R領域(専用)
527 PROVIDE(___start_sram_$OSAP.LABEL[domid]$_$FORMAT("%x", MEMATR_ROSDATA & ~TA_MEMINI)$ = 0xfffffff0);$NL$
528 PROVIDE(___limit_sram_$OSAP.LABEL[domid]$_$FORMAT("%x", MEMATR_ROSDATA & ~TA_MEMINI)$ = 0xfffffff0);$NL$
529$ RWX領域(専用)
530 PROVIDE(___start_ram_$OSAP.LABEL[domid]$ = 0xfffffff0);$NL$
531 PROVIDE(___limit_ram_$OSAP.LABEL[domid]$ = 0xfffffff0);$NL$
532 PROVIDE(___start_sram_$OSAP.LABEL[domid]$ = 0xfffffff0);$NL$
533 PROVIDE(___limit_sram_$OSAP.LABEL[domid]$ = 0xfffffff0);$NL$
534$ 共有リード専用ライト
535 PROVIDE($FORMAT("___start_ram_%s_%x_%x", OSAP.LABEL[domid], +DEFAULT_ACPTN[domid], +TACP_SHARED)$ = 0xfffffff0);$NL$
536 PROVIDE($FORMAT("___limit_ram_%s_%x_%x", OSAP.LABEL[domid], +DEFAULT_ACPTN[domid], +TACP_SHARED)$ = 0xfffffff0);$NL$
537 PROVIDE($FORMAT("___start_sram_%s_%x_%x", OSAP.LABEL[domid], +DEFAULT_ACPTN[domid], +TACP_SHARED)$ = 0xfffffff0);$NL$
538 PROVIDE($FORMAT("___limit_sram_%s_%x_%x", OSAP.LABEL[domid], +DEFAULT_ACPTN[domid], +TACP_SHARED)$ = 0xfffffff0);$NL$
539 $END$
540 $END$
541 $NL$
542 $END$$NL$
543
544$ 共有領域
545 PROVIDE(___start_text_$OSAP.LABEL[TDOM_NONE]$ = 0xfffffff0);$NL$
546 PROVIDE(___limit_text_$OSAP.LABEL[TDOM_NONE]$ = 0xfffffff0);$NL$
547 PROVIDE(___start_sram_$OSAP.LABEL[TDOM_NONE]$_$FORMAT("%x", MEMATR_ROSDATA & ~TA_MEMINI)$ = 0xfffffff0);$NL$
548 PROVIDE(___limit_sram_$OSAP.LABEL[TDOM_NONE]$_$FORMAT("%x", MEMATR_ROSDATA & ~TA_MEMINI)$ = 0xfffffff0);$NL$
549 PROVIDE(___start_ram_$OSAP.LABEL[TDOM_NONE]$ = 0xfffffff0);$NL$
550 PROVIDE(___limit_ram_$OSAP.LABEL[TDOM_NONE]$ = 0xfffffff0);$NL$
551 PROVIDE(___start_sram_$OSAP.LABEL[TDOM_NONE]$ = 0xfffffff0);$NL$
552 PROVIDE(___limit_sram_$OSAP.LABEL[TDOM_NONE]$ = 0xfffffff0);$NL$
553$ 共有リード専用ライト領域全体
554 PROVIDE(___start_srpw_all = 0xfffffff0);$NL$
555 PROVIDE(___limit_srpw_all = 0xfffffff0);$NL$
556 PROVIDE(___start_ssrpw_all = 0xfffffff0);$NL$
557 PROVIDE(___limit_ssrpw_all = 0xfffffff0);$NL$
558 STARTUP(start.o)
559 ENTRY(__reset)
560 $NL$
561$END$
562
563$FUNCTION GENERATE_GP_LABEL$
564 $TAB$$TAB$__gp = . + 32K;$NL$
565 $TAB$$TAB$__tp = . + 32K;$NL$
566$END$
567
568$TOPPERS_ATTMOD = TOPPERS_ATTSEC + 1$
569$TOPPERS_MPFAREA = TOPPERS_ATTSEC + 2$
570
571$INCLUDE "v850_gcc/ldscript.tf"$
572
573$FOREACH moid MO_ORDER$
574 $IF MO.LINKER[moid]$
575$ // セクションの開始記述の生成
576 $IF (MO.SEFLAG[moid] & 0x01) != 0$
577$ // 共有リード専有ライト領域の全体の開始番地
578 $IF (MO.SEFLAG[moid] & 0x100) != 0$
579$ // 最初に更新された値が有効となる
580 $IF !LENGTH(SRPW.BASE)$
581 $SRPW.BASE = MO.BASEADDR[moid]$
582 $IF DEBUG_OPT_TF$
583 $WARNING$
584 $FORMAT("hit: %d, 0x%x", moid, +MO.SEFLAG[moid])$$NL$
585 $END$
586 $END$
587 $END$
588 $ELIF MO.ACPTN1[moid] == 0 && MO.ACPTN2[moid] == TACP_SHARED
589 && (MO.MEMATR[moid] & TA_SDATA) != 0$
590$ // 最初に更新された値が有効となる
591 $IF !LENGTH(SRPW.BASE)$
592 $SRPW.BASE = MO.BASEADDR[moid]$
593 $END$
594 $END$
595 $END$
596
597$ // 共有リード専有ライト領域の全体の終了番地
598 $IF (MO.SEFLAG[moid] & 0x200) != 0$
599 $IF !LENGTH(SRPW.BASE)$
600 $ERROR$
601 "start_srpw label is not found"
602 $END$
603 $END$
604$ // 最後に更新された値が有効となる
605$ $SRPW.LIMIT = MO.LIMITADDR[moid]$
606 $SRPW.LIMIT = LIMIT_SYMBOL(MO.MLABEL[moid])$
607 $IF DEBUG_OPT_TF$
608 $WARNING$
609 $FORMAT("hit end: %d, 0x%x", moid, SRPW.LIMIT)$$NL$
610 $END$
611 $END$
612 $ELIF MO.ACPTN1[moid] == 0 && MO.ACPTN2[moid] == TACP_SHARED
613 && (MO.MEMATR[moid] & TA_SDATA) != 0$
614$ // 最後に更新された値が有効となる
615$ $SRPW.LIMIT = MO.LIMITADDR[moid]$
616 $SRPW.LIMIT = LIMIT_SYMBOL(MO.MLABEL[moid])$
617 $IF DEBUG_OPT_TF$
618 $WARNING$
619 $FORMAT("hit end: %d, 0x%x", moid, SRPW.LIMIT)$$NL$
620 $END$
621 $END$
622 $END$
623
624 $END$
625$END$
626
627$IF DEBUG_OPT_TF$
628 $WARNING$
629 $FORMAT("srpw area: 0x%x, 0x%x", SRPW.BASE, SRPW.LIMIT)$$NL$
630 $END$
631$END$
632
633$
634$ 共有領域の初期化ブロックを生成
635$
636$FILE "kernel_mem3.c"$
637
638$TNUM_SHARED_REGION = 3$
639const uint32 tnum_shared_mem = $TNUM_SHARED_REGION * 2$;$NL$
640uint8 * const shared_meminib_table[$TNUM_SHARED_REGION * 2$] = {$NL$
641$shared_info = SYMBOL("shared_meminib_table")$
642$ RX領域(共有)
643$start_label = PEEK(shared_info, 4)$
644$limit_label = PEEK(shared_info + 4, 4)$
645$TAB$((uint8 *)&__start_text_$OSAP.LABEL[TDOM_NONE]$),$TAB$/* iregion 2 */$NL$
646$TAB$((uint8 *)&__limit_text_$OSAP.LABEL[TDOM_NONE]$),$TAB$/* iregion 2 */$NL$
647
648$ RX領域(共有ショートデータ,共有リード専有ライトの全体)
649$ rosdata_shared
650$ srpw_data_all
651$start_label = PEEK(shared_info + 8, 4)$
652$limit_label = PEEK(shared_info + 12, 4)$
653$IF LENGTH(SRPW.BASE) && LENGTH(SRPW.LIMIT)$
654 $TAB$((uint8 *)$FORMAT("0x%x", SRPW.BASE)$),$TAB$/* iregion 3 */$NL$
655 $TAB$((uint8 *)$FORMAT("0x%x", SRPW.LIMIT)$),$TAB$/* iregion 3 */$NL$
656$ELSE$
657 $TAB$((uint8 *)NULL),$TAB$/* iregion 3 */$NL$
658 $TAB$((uint8 *)NULL),$TAB$/* iregion 3 */$NL$
659$END$
660
661$ RWX領域(共有ショートデータ,共有データ)
662$ //sdata_sharedの先頭からdata_sharedの終端(dataの先頭)まで
663$ data_sharedの先頭からsdata_sharedの終端(dataの先頭)まで
664$start_label = PEEK(shared_info + 16, 4)$
665$limit_label = PEEK(shared_info + 20, 4)$
666$start_label = SHARED_DATA.REALBASE$
667$limit_label = (SHARED_DATA.REALSIZE - 1) & ~0x0f$
668$TAB$$FORMAT("( (uint8 *)0x%x )", start_label)$,$TAB$/* dregion 5 : $FORMAT("0x%x", start_label)$ */$NL$
669$TAB$$FORMAT("( (uint8 *)0x%x )", limit_label)$,$TAB$/* dregion 5 : $FORMAT("0x%x", limit_label)$ */$NL$
670
671};$NL$
672$NL$
673
674
Note: See TracBrowser for help on using the repository browser.