source: atk2-sc3_fl850f1l/arch/v850_ghs/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: 47.9 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$
43$ V850E2M用
44$ RH850では使用しない
45$
46
47$DEBUG_OPT_TF = 1$
48
49$
50$ arch/v850_gcc/ldscript.tfのターゲット依存部
51$
52$FUNCTION GENERATE_MEMORY$
53 $NOOP()$
54$END$
55
56$FUNCTION GENERATE_OUTPUT$
57 $NL$
58$END$
59
60$
61$ 保護ドメインのラベルの作成
62$ OSAP.LABEL[domid]:保護ドメインのラベル
63$
64$OSAP.LABEL[TDOM_KERNEL] = "kernel"$
65$FOREACH domid OSAP.ID_LIST$
66 $OSAP.LABEL[domid] = domid$
67$END$
68$OSAP.LABEL[TDOM_NONE] = "shared"$
69
70$
71$ 標準のセクションのメモリオブジェクト属性の定義
72$
73$MEMATR_TEXT = (TA_NOWRITE|TA_EXEC)$
74$MEMATR_RODATA = (TA_NOWRITE|TA_EXEC)$
75$MEMATR_DATA = TA_MEMINI$
76$MEMATR_BSS = TA_NULL$
77$MEMATR_PRSV = TA_MEMPRSV$
78$MEMATR_ROSDATA = (TA_SDATA|TA_MEMINI|TA_NOWRITE|TA_EXEC)$
79$MEMATR_SDATA = (TA_SDATA|TA_MEMINI)$
80$MEMATR_SBSS = TA_SDATA$
81
82
83$
84$ 保護ドメイン毎のデフォルトのアクセス許可パターンの作成
85$
86$DEFAULT_ACPTN[TDOM_KERNEL] = VALUE("TACP_KERNEL", TACP_KERNEL)$
87$FOREACH domid OSAP.ID_LIST$
88 $DEFAULT_ACPTN[domid] = VALUE(FORMAT("TACP(%1%)", domid), 1 << (domid - 1))$
89$END$
90$DEFAULT_ACPTN[TDOM_NONE] = VALUE("TACP_SHARED", TACP_SHARED)$
91
92$
93$ メモリ保護単位の実際のサイズを受け取り,受け取ったサイズ以上で,
94$ ARM MPUのサイズ制約を満たす最小値を返す
95$ ARM MPUのサイズ制約は,16B~4GBの範囲の2のべき乗
96$ ARGV[1]:実際のサイズ
97$ RESULT:ARM MPUのサイズ制約を満たす最小値
98$FUNCTION SEARCH_ARM_MPU_SIZE$
99 $IF ARGV[1] <= 0$
100 $RESULT = 0$
101 $ELSE$
102 $search_state = 0$
103 $FOREACH bit_offset { 31,30,...,4 }$
104 $compare_bit = 1 << bit_offset$
105 $IF ((ARGV[1] & compare_bit) != 0)$
106 $IF (search_state == 0)$
107 $result_size = compare_bit$
108 $search_state = 1$
109 $ELIF (search_state == 1)$
110 $result_size = (result_size << 1)$
111 $search_state = 2$
112 $END$
113 $END$
114 $END$
115 $IF (search_state == 0)$
116 $result_size = (1 << 4)$
117 $ELIF (search_state == 1) && ((ARGV[1] & 0xf) != 0)$
118 $result_size = (result_size << 1)$
119 $END$
120 $RESULT = result_size$
121 $END$
122$END$
123
124$
125$ 受け取った番地以上で,ARM MPUのアライン制約の最小値を返す
126$ ARGV[1]:番地
127$ ARGV[2]:サイズ
128$ RESULT:ARM MPUのアライン制約を満たす最小値
129$
130$FUNCTION SEARCH_ARM_MPU_ALIGN$
131 $result_align = ARGV[1]$
132 $compare_mask = ARGV[2] - 1$
133 $IF ((ARGV[1] & compare_mask) != 0)$
134 $result_align = ARGV[1] & ~compare_mask$
135 $result_align = result_align + ARGV[2]$
136 $END$
137
138 $RESULT = result_align$
139$END$
140
141$
142$ tsize_meminibの補正
143$ sdata_sharedの先頭アドレスをマスクベース方式でアラインするため,
144$ その直前のセクションのlimitとsdata_sharedのstartが異なる可能性がある
145$ よって+1しておく
146$ prsv_sharedの終端アドレスをマスクベース方式でアラインするため,
147$ prsv_sharedのサイズが空でも,パス4ではstartとlimitが異なる可能性がある
148$ よって+1しておく
149$
150$FUNCTION CALC_TSIZE_MEMINIB$
151 $tsize_meminib = tsize_meminib + 3$
152$END$
153
154$OPTIMIZE_MEMINIB = 1$
155$OPTIMIZE_DATASEC_LIST = 1$
156$OPTIMIZE_BSSSEC_LIST = 1$
157
158$
159$ OSAP初期化コンテキストブロックのための宣言
160$
161$FUNCTION PREPARE_OSAPINICTXB$
162 $IF LENGTH(TSK.ID_LIST)$
163 $FOREACH tskid TSK.ID_LIST$
164 $IF !OSAP.TRUSTED[TSK.OSAPID[tskid]]$
165 extern uint8 $FORMAT("__start_user_stack%s", tskid)$;$NL$
166 extern uint8 $FORMAT("__limit_user_stack%s", tskid)$;$NL$
167 $END$
168 $END$
169 $END$
170 $FOREACH tskpri RANGE(TMIN_TPRI, TMAX_TPRI)$
171 $IF LENGTH(shared_ustack_size[tskpri])$
172 extern uint8 $FORMAT("__start_shared_user_stack%s", tskpri)$;$NL$
173 extern uint8 $FORMAT("__limit_shared_user_stack%s", tskpri)$;$NL$
174 $END$
175 $END$
176
177
178 $IF LENGTH(OSAP.ID_LIST)$
179 $FOREACH domid OSAP.ID_LIST$
180 $IF !OSAP.TRUSTED[domid]$
181$ RX領域(専用)
182 extern uint8 __start_text_$OSAP.LABEL[domid]$;$NL$
183 extern uint8 __limit_text_$OSAP.LABEL[domid]$;$NL$
184$ R領域(専用)
185 extern uint8 __start_sram_$OSAP.LABEL[domid]$_$FORMAT("%x", MEMATR_ROSDATA & ~TA_MEMINI)$;$NL$
186 extern uint8 __limit_sram_$OSAP.LABEL[domid]$_$FORMAT("%x", MEMATR_ROSDATA & ~TA_MEMINI)$;$NL$
187$ RWX領域(専用)
188 extern uint8 __start_ram_$OSAP.LABEL[domid]$;$NL$
189 extern uint8 __limit_ram_$OSAP.LABEL[domid]$;$NL$
190 extern uint8 __start_sram_$OSAP.LABEL[domid]$;$NL$
191 extern uint8 __limit_sram_$OSAP.LABEL[domid]$;$NL$
192$ 共有リード専用ライト
193 extern uint8 $FORMAT("__start_ram_%s_%x_%x", OSAP.LABEL[domid], +DEFAULT_ACPTN[domid], +TACP_SHARED)$;$NL$
194 extern uint8 $FORMAT("__limit_ram_%s_%x_%x", OSAP.LABEL[domid], +DEFAULT_ACPTN[domid], +TACP_SHARED)$;$NL$
195 extern uint8 $FORMAT("__start_sram_%s_%x_%x", OSAP.LABEL[domid], +DEFAULT_ACPTN[domid], +TACP_SHARED)$;$NL$
196 extern uint8 $FORMAT("__limit_sram_%s_%x_%x", OSAP.LABEL[domid], +DEFAULT_ACPTN[domid], +TACP_SHARED)$;$NL$
197$ extern uint8 $FORMAT("__start_ram_%s_srpw", OSAP.LABEL[domid])$;$NL$
198$ extern uint8 $FORMAT("__limit_ram_%s_srpw", OSAP.LABEL[domid])$;$NL$
199$ extern uint8 $FORMAT("__start_sram_%s_srpw", OSAP.LABEL[domid])$;$NL$
200$ extern uint8 $FORMAT("__limit_sram_%s_srpw", OSAP.LABEL[domid])$;$NL$
201 $END$
202 $END$
203 $NL$
204 $END$$NL$
205
206$ 共有領域
207 extern uint8 __start_text_$OSAP.LABEL[TDOM_NONE]$;$NL$
208 extern uint8 __limit_text_$OSAP.LABEL[TDOM_NONE]$;$NL$
209 extern uint8 __start_sram_$OSAP.LABEL[TDOM_NONE]$_$FORMAT("%x", MEMATR_ROSDATA & ~TA_MEMINI)$;$NL$
210 extern uint8 __limit_sram_$OSAP.LABEL[TDOM_NONE]$_$FORMAT("%x", MEMATR_ROSDATA & ~TA_MEMINI)$;$NL$
211 extern uint8 __start_ram_$OSAP.LABEL[TDOM_NONE]$;$NL$
212 extern uint8 __limit_ram_$OSAP.LABEL[TDOM_NONE]$;$NL$
213 extern uint8 __start_sram_$OSAP.LABEL[TDOM_NONE]$;$NL$
214 extern uint8 __limit_sram_$OSAP.LABEL[TDOM_NONE]$;$NL$
215$ 共有リード専用ライト領域全体
216 extern uint8 __start_srpw_all;$NL$
217 extern uint8 __limit_srpw_all;$NL$
218 extern uint8 __start_ssrpw_all;$NL$
219 extern uint8 __limit_ssrpw_all;$NL$
220 $NL$
221$ extern const OSAPMPUINFOB_INFO _kernel_osap_mpu_info_tbl[];$NL$
222$END$
223
224
225$FUNCTION GENERATE_TARGET_MPUINFOB$
226$
227$ 保護ドメイン初期化ブロックのmem依存部を生成
228$
229 $FILE "kernel_mem3.c"$
230
231 $PREPARE_OSAPINICTXB()$
232
233$END$
234
235$
236$ TSKINICTXBの初期化情報を生成
237$
238$DOMINICTXB_KERNEL = "{ NULL }"$
239
240$FUNCTION GENERATE_OSAPINIB_MPUINFOB$
241 $TAB$$TAB${$NL$
242 $IF !OSAP.TRUSTED[ARGV[1]]$
243$ RX領域(専用)
244 $TAB$$TAB$$TAB$( (uint8 *)&__start_text_$OSAP.LABEL[ARGV[1]]$ ), /* iregion 0 */$NL$
245 $TAB$$TAB$$TAB$( (uint8 *)&__limit_text_$OSAP.LABEL[ARGV[1]]$ ), /* iregion 0 */$NL$
246$ RX領域(専用ショートデータ)
247 $TAB$$TAB$$TAB$( (uint8 *)&__start_sram_$OSAP.LABEL[ARGV[1]]$_$FORMAT("%x", MEMATR_ROSDATA & ~TA_MEMINI)$ ),/* iregion 1 */$NL$
248 $TAB$$TAB$$TAB$( (uint8 *)&__limit_sram_$OSAP.LABEL[ARGV[1]]$_$FORMAT("%x", MEMATR_ROSDATA & ~TA_MEMINI)$ ),/* iregion 1 */$NL$
249$ RWX領域(専用)
250 $TAB$$TAB$$TAB$( (uint8 *)&__start_ram_$OSAP.LABEL[ARGV[1]]$ ),/* dregion 1 */$NL$
251 $TAB$$TAB$$TAB$( (uint8 *)&__limit_ram_$OSAP.LABEL[ARGV[1]]$ ),/* dregion 1 */$NL$
252$ RWX領域(専用ショートデータ)
253 $TAB$$TAB$$TAB$( (uint8 *)&__start_sram_$OSAP.LABEL[ARGV[1]]$ ),/* dregion 2 */$NL$
254 $TAB$$TAB$$TAB$( (uint8 *)&__limit_sram_$OSAP.LABEL[ARGV[1]]$ ),/* dregion 2 */$NL$
255$ 共有リード専用ライト
256 $TAB$$TAB$$TAB$$FORMAT("( (uint8 *)&__start_ram_%s_%x_%x )", OSAP.LABEL[ARGV[1]], +DEFAULT_ACPTN[ARGV[1]], +TACP_SHARED)$,/* dregion 3 */$NL$
257 $TAB$$TAB$$TAB$$FORMAT("( (uint8 *)&__limit_ram_%s_%x_%x )", OSAP.LABEL[ARGV[1]], +DEFAULT_ACPTN[ARGV[1]], +TACP_SHARED)$,/* dregion 3 */$NL$
258$ $TAB$$TAB$$TAB$$FORMAT("( (uint8 *)&__start_ram_%s_srpw )", OSAP.LABEL[ARGV[1]])$,/* dregion 3 */$NL$
259$ $TAB$$TAB$$TAB$$FORMAT("( (uint8 *)&__limit_ram_%s_srpw )", OSAP.LABEL[ARGV[1]])$,/* dregion 3 */$NL$
260$ 共有リード専用ライト(ショートデータ)
261 $TAB$$TAB$$TAB$$FORMAT("( (uint8 *)&__start_sram_%s_%x_%x )", OSAP.LABEL[ARGV[1]], +DEFAULT_ACPTN[ARGV[1]], +TACP_SHARED)$,/* dregion 4 */$NL$
262 $TAB$$TAB$$TAB$$FORMAT("( (uint8 *)&__limit_sram_%s_%x_%x )", OSAP.LABEL[ARGV[1]], +DEFAULT_ACPTN[ARGV[1]], +TACP_SHARED)$,/* dregion 4 */$NL$
263$ $TAB$$TAB$$TAB$$FORMAT("( (uint8 *)&__start_sram_%s_srpw )", OSAP.LABEL[ARGV[1]])$,/* dregion 4 */$NL$
264$ $TAB$$TAB$$TAB$$FORMAT("( (uint8 *)&__limit_sram_%s_srpw )", OSAP.LABEL[ARGV[1]])$,/* dregion 4 */$NL$
265 $ELSE$
266 $TAB$$TAB$$TAB$( (uint8 *)NULL ),/* iregion 0 */$NL$
267 $TAB$$TAB$$TAB$( (uint8 *)NULL ),/* iregion 0 */$NL$
268 $TAB$$TAB$$TAB$( (uint8 *)NULL ),/* iregion 1 */$NL$
269 $TAB$$TAB$$TAB$( (uint8 *)NULL ),/* iregion 1 */$NL$
270 $TAB$$TAB$$TAB$( (uint8 *)NULL ),/* dregion 1 */$NL$
271 $TAB$$TAB$$TAB$( (uint8 *)NULL ),/* dregion 1 */$NL$
272 $TAB$$TAB$$TAB$( (uint8 *)NULL ),/* dregion 2 */$NL$
273 $TAB$$TAB$$TAB$( (uint8 *)NULL ),/* dregion 2 */$NL$
274 $TAB$$TAB$$TAB$( (uint8 *)NULL ),/* dregion 3 */$NL$
275 $TAB$$TAB$$TAB$( (uint8 *)NULL ),/* dregion 3 */$NL$
276 $TAB$$TAB$$TAB$( (uint8 *)NULL ),/* dregion 4 */$NL$
277 $TAB$$TAB$$TAB$( (uint8 *)NULL ),/* dregion 4 */$NL$
278 $END$
279 $TAB$$TAB$}$NL$
280 $NL$
281$END$
282
283$FUNCTION GENERATE_TSKINICTXB$
284 $TAB$$TAB${$NL$
285 $TAB$$TAB$$TAB$$TSK.TINIB_SSTKSZ[ARGV[1]]$,$NL$
286 $TAB$$TAB$$TAB$((void *)((uint8 *)($TSK.TINIB_SSTK[ARGV[1]]$)
287 $SPC$+ ($TSK.TINIB_SSTKSZ[ARGV[1]]$))),$NL$
288 $IF OSAP.TRUSTED[TSK.OSAPID[ARGV[1]]]$
289 $TAB$$TAB$$TAB$0,$NL$
290 $TAB$$TAB$$TAB$0,$NL$
291 $ELSE$
292 $TAB$$TAB$$TAB$$TSK.TINIB_USTKSZ[ARGV[1]]$,$NL$
293 $TAB$$TAB$$TAB$((void *)((uint8 *)($TSK.TINIB_USTK[ARGV[1]]$)
294 $SPC$+ ($TSK.TINIB_USTKSZ[ARGV[1]]$))),$NL$
295 $END$
296 $TAB$$TAB$},$NL$
297$END$
298
299$FUNCTION GENERATE_STKMPUINFOB$
300 $TAB$$TAB${$NL$
301 $IF OSAP.TRUSTED[TSK.OSAPID[ARGV[1]]]$
302 $TAB$$TAB$$TAB$0,$NL$
303 $TAB$$TAB$$TAB$0,$NL$
304 $ELSE$
305 $IF EQ(TSK.STK[tskid],"NULL")$
306$ // stkがNULLの場合の処理
307 $IF LENGTH(TSK.SHARED_USTK_ID[tskid])$
308$ // 共有スタック
309 $TAB$$TAB$$TAB$$FORMAT("&__start_shared_user_stack%s", TSK.PRIORITY[ARGV[1]])$,$NL$
310 $TAB$$TAB$$TAB$$FORMAT("(&__limit_shared_user_stack%s - 0x10)", TSK.PRIORITY[ARGV[1]])$,$NL$
311 $ELSE$
312$ // 固有スタック
313 $TAB$$TAB$$TAB$$FORMAT("&__start_user_stack%s", ARGV[1])$,$NL$
314 $TAB$$TAB$$TAB$$FORMAT("(&__limit_user_stack%s - 0x10)", ARGV[1])$,$NL$
315 $END$
316 $ELSE$
317$ // stkがNULLでない場合の処理
318 $TAB$$TAB$$TAB$$FORMAT("(uint8 *)%s", TSK.TINIB_USTK[ARGV[1]])$,$NL$
319 $TAB$$TAB$$TAB$$FORMAT("(uint8 *)((uint32)%s + %d - 0x10)", TSK.TINIB_USTK[ARGV[1]], TSK.TINIB_USTKSZ[ARGV[1]])$,$NL$
320 $END$
321 $END$
322 $TAB$$TAB$},$NL$
323$END$
324
325$INCLUDE "kernel/kernel_opt.tf"$
326
327$
328$ 共有リードライト領域 / 共有リード専有ライト領域(sdata) / rosdata_shared領域
329$ の情報取得
330$
331$ $check_shared_mo = 0x00$
332$ $check_srpw_mo = 0x00$
333$ $check_rosdata_mo = 0x00$
334$ $check_sdata_mo = 0x00$
335$ $LIST_SHARED_MO = {}$
336$ $LIST_SRPW_MO = {}$
337$ $LIST_ROSDATA_MO = {}$
338$ $preid = -1$
339$ $FOREACH moid MO_START_LIST$
340$ $ // メモリオブジェクトの先頭をパス2時点での順にチェック
341$ $IF LENGTH(FIND(MO_MPROTECT_LIST, moid))$
342$ $ // メモリ保護単位の先頭の場合
343$ $IF !LENGTH(SDATA_BASE) && ((MO.MEMATR[moid] & TA_SDATA) == TA_SDATA)$
344$ $ // ショートデータセクションの先頭
345$ $SDATA_BASE = MO.BASEADDR[moid]$
346$ $check_sdata_mo = check_sdata_mo | 0x10$
347$ $ELIF ((MO.MEMATR[moid] & TA_SDATA) == 0)
348$ $ // ショートデータセクションの終端
349$ && ((check_sdata_mo & 0x10) == 0x10)$
350$ $IF preid == -1$
351$ $ERROR$
352$ $FORMAT("unexpected preid.")$
353$ $END$
354$ $END$
355$ $check_sdata_mo = check_sdata_mo & 0x0f$
356$ $SDATA_LIMIT = MO.LIMITADDR[preid]$
357$ $SDATA_LIMIT_MO = preid$
358$ $END$
359$
360$ $IF (MO.ACPTN1[moid] == TACP_SHARED) && (MO.ACPTN2[moid] == TACP_SHARED)$
361$ $IF ((check_shared_mo & 0x10) != 0x10)$
362$ $ // 共有リードライト領域の先頭の場合
363$ $SHARED_AREA_BASE[check_shared_mo] = MO.BASEADDR[moid]$
364$ $SHARED_AREA_MO[check_shared_mo] = moid$
365$ $LIST_SHARED_MO = APPEND(LIST_SHARED_MO, check_shared_mo)$
366$ $check_shared_mo = check_shared_mo | 0x10$
367$ $END$
368$ $ELIF (check_shared_mo & 0x10) == 0x10$
369$ $ // 共有リードライト領域の終端の場合
370$ $IF preid == -1$
371$ $ERROR$
372$ $FORMAT("unexpected preid.")$
373$ $END$
374$ $END$
375$ $check_shared_mo = check_shared_mo & 0x0f$
376$ $SHARED_AREA_LIMIT[check_shared_mo] = MO.LIMITADDR[preid]$
377$ $SHARED_AREA_SIZE[check_shared_mo] = SHARED_AREA_LIMIT[check_shared_mo] - SHARED_AREA_BASE[check_shared_mo]$
378$ $SHARED_AREA_LIMIT_MO[check_shared_mo] = preid$
379$ $check_shared_mo = check_shared_mo + 1$
380$ $END$
381$
382$ $IF LENGTH(MO.SRPW[moid]) && (MO.SRPW[moid])$
383$ $IF ((check_srpw_mo & 0x10) != 0x10)$
384$ $ // 共有リード専有ライト領域の先頭の場合
385$ $SRPW_AREA_BASE[check_srpw_mo] = MO.BASEADDR[moid]$
386$ $SRPW_AREA_MO[check_srpw_mo] = moid$
387$ $LIST_SRPW_MO = APPEND(LIST_SRPW_MO, check_srpw_mo)$
388$ $check_srpw_mo = check_srpw_mo | 0x10$
389$ $END$
390$ $ELIF (check_srpw_mo & 0x10) == 0x10$
391$ $ // 共有リード専有ライト領域の終端の場合
392$ $IF preid == -1$
393$ $ERROR$
394$ $FORMAT("unexpected preid.")$
395$ $END$
396$ $END$
397$ $check_srpw_mo = check_srpw_mo & 0x0f$
398$ $SRPW_AREA_LIMIT[check_srpw_mo] = MO.LIMITADDR[preid]$
399$ $SRPW_AREA_SIZE[check_srpw_mo] = SRPW_AREA_LIMIT[check_srpw_mo] - SRPW_AREA_BASE[check_srpw_mo]$
400$ $SRPW_AREA_LIMIT_MO[check_srpw_mo] = preid$
401$ $check_srpw_mo = check_srpw_mo + 1$
402$ $END$
403$
404$ $IF (MO.ACPTN1[moid] == 0) && (MO.ACPTN2[moid] == TACP_SHARED)
405$ && (MO.MEMATR[moid] & TA_SDATA) && (MO.OSAPID[moid] == TDOM_NONE)$
406$ $IF ((check_rosdata_mo & 0x10) != 0x10)$
407$ $ // rosdata_shared領域の先頭の場合
408$ $ROSDATA_AREA_BASE[check_rosdata_mo] = MO.BASEADDR[moid]$
409$ $ROSDATA_AREA_MO[check_rosdata_mo] = moid$
410$ $LIST_ROSDATA_MO = APPEND(LIST_ROSDATA_MO, check_rosdata_mo)$
411$ $check_rosdata_mo = check_rosdata_mo | 0x10$
412$ $END$
413$ $ELIF (check_rosdata_mo & 0x10) == 0x10$
414$ $ // rosdata_shared領域の終端の場合
415$ $IF preid == -1$
416$ $ERROR$
417$ $FORMAT("unexpected preid.")$
418$ $END$
419$ $END$
420$ $check_rosdata_mo = check_rosdata_mo & 0x0f$
421$ $ROSDATA_AREA_LIMIT[check_rosdata_mo] = MO.LIMITADDR[preid]$
422$ $ROSDATA_AREA_SIZE[check_rosdata_mo] = ROSDATA_AREA_LIMIT[check_rosdata_mo] - ROSDATA_AREA_BASE[check_rosdata_mo]$
423$ $ROSDATA_AREA_LIMIT_MO[check_rosdata_mo] = preid$
424$ $check_rosdata_mo = check_rosdata_mo + 1$
425$ $END$
426$ $END$
427$
428$ $preid = moid$
429$ $END$
430$ $IF (check_shared_mo & 0x10) == 0x10$
431$ $IF preid == -1$
432$ $ERROR$
433$ $FORMAT("unexpected preid.")$
434$ $END$
435$ $END$
436$ $check_shared_mo = check_shared_mo & 0x0f$
437$ $SHARED_AREA_LIMIT[check_shared_mo] = MO.LIMITADDR[preid]$
438$ $SHARED_AREA_LIMIT_MO[check_shared_mo] = preid$
439$ $SHARED_AREA_SIZE[check_shared_mo] = SHARED_AREA_LIMIT[check_shared_mo] - SHARED_AREA_BASE[check_shared_mo]$
440$ $check_shared_mo = check_shared_mo + 1$
441$ $END$
442$ $IF (check_srpw_mo & 0x10) == 0x10$
443$ $IF preid == -1$
444$ $ERROR$
445$ $FORMAT("unexpected preid.")$
446$ $END$
447$ $END$
448$ $check_srpw_mo = check_srpw_mo & 0x0f$
449$ $SRPW_AREA_LIMIT[check_srpw_mo] = MO.LIMITADDR[preid]$
450$ $SRPW_AREA_SIZE[check_srpw_mo] = SRPW_AREA_LIMIT[check_srpw_mo] - SRPW_AREA_BASE[check_srpw_mo]$
451$ $SRPW_AREA_LIMIT_MO[check_srpw_mo] = preid$
452$ $check_srpw_mo = check_srpw_mo + 1$
453$ $END$
454$ $IF (check_rosdata_mo & 0x10) == 0x10$
455$ $IF preid == -1$
456$ $ERROR$
457$ $FORMAT("unexpected preid.")$
458$ $END$
459$ $END$
460$ $check_rosdata_mo = check_rosdata_mo & 0x0f$
461$ $ROSDATA_AREA_LIMIT[check_rosdata_mo] = MO.LIMITADDR[preid]$
462$ $ROSDATA_AREA_SIZE[check_rosdata_mo] = ROSDATA_AREA_LIMIT[check_rosdata_mo] - ROSDATA_AREA_BASE[check_rosdata_mo]$
463$ $ROSDATA_AREA_LIMIT_MO[check_rosdata_mo] = preid$
464$ $check_rosdata_mo = check_rosdata_mo + 1$
465$ $END$
466$
467$ $
468$ $ エラーチェック
469$ $
470$ $FOREACH id LIST_SHARED_MO$
471$ $IF DEBUG_OPT_TF$
472$ $WARNING$
473$ $id$$NL$
474$ $SHARED_AREA_MO[id]$$NL$
475$ $SHARED_AREA_LIMIT_MO[id]$$NL$
476$ $FORMAT("0x%x", SHARED_AREA_BASE[id])$$NL$
477$ $FORMAT("0x%x", SHARED_AREA_LIMIT[id])$$NL$
478$ $FORMAT("0x%x", SHARED_AREA_SIZE[id])$$NL$
479$ $END$
480$ $END$
481$ $IF ((MO.MEMATR[SHARED_AREA_MO[id]] & TA_SDATA) == TA_SDATA)$
482$ $IF LENGTH(SHARED_SDATA.BASE)$
483$ $ERROR$
484$ $FORMAT("unexpected mematr: %d, %x", id, MO.MEMATR[SHARED_AREA_MO[id]])$
485$ $END$
486$ $ELSE$
487$ $SHARED_SDATA.BASE = SHARED_AREA_BASE[id]$
488$ $SHARED_SDATA.LIMIT = SHARED_AREA_LIMIT[id]$
489$ $SHARED_SDATA.SIZE = SHARED_AREA_SIZE[id]$
490$ $SHARED_SDATA.BASE_MO = SHARED_AREA_MO[id]$
491$ $SHARED_SDATA.LIMIT_MO = SHARED_AREA_LIMIT_MO[id]$
492$ $END$
493$ $ELSE$
494$ $IF LENGTH(SHARED_DATA.BASE)$
495$ $ERROR$
496$ $FORMAT("unexpected mematr: %d, %x", id, MO.MEMATR[SHARED_AREA_MO[id]])$
497$ $END$
498$ $ELSE$
499$ $SHARED_DATA.BASE = SHARED_AREA_BASE[id]$
500$ $SHARED_DATA.LIMIT = SHARED_AREA_LIMIT[id]$
501$ $SHARED_DATA.SIZE = SHARED_AREA_SIZE[id]$
502$ $SHARED_DATA.BASE_MO = SHARED_AREA_MO[id]$
503$ $SHARED_DATA.LIMIT_MO = SHARED_AREA_LIMIT_MO[id]$
504$ $END$
505$ $END$
506$ $END$
507$
508$ $FOREACH id LIST_SRPW_MO$
509$ $IF DEBUG_OPT_TF$
510$ $WARNING$
511$ $id$$NL$
512$ $SRPW_AREA_MO[id]$$NL$
513$ $SRPW_AREA_LIMIT_MO[id]$$NL$
514$ $FORMAT("0x%x", SRPW_AREA_BASE[id])$$NL$
515$ $FORMAT("0x%x", SRPW_AREA_LIMIT[id])$$NL$
516$ $FORMAT("0x%x", SRPW_AREA_SIZE[id])$$NL$
517$ $END$
518$ $END$
519$ $IF ((MO.MEMATR[SRPW_AREA_MO[id]] & TA_SDATA) == TA_SDATA)$
520$ $IF LENGTH(SRPW_SDATA.BASE)$
521$ $ERROR$
522$ $FORMAT("unexpected mematr: %d, %x", id, MO.MEMATR[SRPW_AREA_MO[id]])$
523$ $END$
524$ $ELSE$
525$ $SRPW_SDATA.BASE = SRPW_AREA_BASE[id]$
526$ $SRPW_SDATA.LIMIT = SRPW_AREA_LIMIT[id]$
527$ $SRPW_SDATA.SIZE = SRPW_AREA_SIZE[id]$
528$ $SRPW_SDATA.BASE_MO = SRPW_AREA_MO[id]$
529$ $SRPW_SDATA.LIMIT_MO = SRPW_AREA_LIMIT_MO[id]$
530$ $END$
531$ $ELSE$
532$ $IF LENGTH(SRPW_DATA.BASE)$
533$ $ERROR$
534$ $FORMAT("unexpected mematr: %d, %x", SRPW_AREA_MO[0], MO.MEMATR[SRPW_AREA_MO[id]])$
535$ $FORMAT("unexpected mematr: %d, %x", SRPW_AREA_MO[id], MO.MEMATR[SRPW_AREA_MO[id]])$
536$ $END$
537$ $ELSE$
538$ $SRPW_DATA.BASE = SRPW_AREA_BASE[id]$
539$ $SRPW_DATA.LIMIT = SRPW_AREA_LIMIT[id]$
540$ $SRPW_DATA.SIZE = SRPW_AREA_SIZE[id]$
541$ $SRPW_DATA.BASE_MO = SRPW_AREA_MO[id]$
542$ $SRPW_DATA.LIMIT_MO = SRPW_AREA_LIMIT_MO[id]$
543$ $END$
544$ $END$
545$ $END$
546$
547$ $FOREACH id LIST_ROSDATA_MO$
548$ $IF DEBUG_OPT_TF$
549$ $WARNING$
550$ $id$$NL$
551$ $ROSDATA_AREA_MO[id]$$NL$
552$ $ROSDATA_AREA_LIMIT_MO[id]$$NL$
553$ $FORMAT("0x%x", ROSDATA_AREA_BASE[id])$$NL$
554$ $FORMAT("0x%x", ROSDATA_AREA_LIMIT[id])$$NL$
555$ $FORMAT("0x%x", ROSDATA_AREA_SIZE[id])$$NL$
556$ $END$
557$ $END$
558$ $IF (id == 0)$
559$ $IF ((MO.MEMATR[ROSDATA_AREA_MO[id]] & TA_SDATA) != TA_SDATA)$
560$ $ERROR$
561$ $FORMAT("unexpected mematr: %d, %x", id, MO.MEMATR[ROSDATA_AREA_MO[id]])$
562$ $END$
563$ $ELSE$
564$ $ROSDATA.BASE = ROSDATA_AREA_BASE[id]$
565$ $ROSDATA.LIMIT = ROSDATA_AREA_LIMIT[id]$
566$ $ROSDATA.SIZE = ROSDATA_AREA_SIZE[id]$
567$ $ROSDATA.BASE_MO = ROSDATA_AREA_MO[id]$
568$ $ROSDATA.LIMIT_MO = ROSDATA_AREA_LIMIT_MO[id]$
569$ $END$
570$ $ELSE$
571$ $ERROR$
572$ $FORMAT("unexpected id: %d", id)$
573$ $END$
574$ $END$
575$ $END$
576$
577$ $
578$ $ data_sharedの配置アドレスを求める
579$ $
580$ $SHARED_DATA.REALSIZE = SEARCH_ARM_MPU_SIZE(SHARED_DATA.SIZE + SHARED_SDATA.SIZE)$
581$ $SHARED_DATA.REALBASE = SEARCH_ARM_MPU_ALIGN(SDATA_BASE, SHARED_DATA.REALSIZE)$
582$ $IF DEBUG_OPT_TF$
583$ $WARNING$
584$ $FORMAT("data_shared: base[0x%x], size[0x%x]", SHARED_DATA.REALBASE, SHARED_DATA.REALSIZE)$$NL$
585$ $END$
586$ $END$
587$
588$ $
589$ $ sdataに関するサイズを求める
590$ $
591$ $SDATA.SIZE = SDATA_LIMIT - SDATA_BASE$
592$ $SDATA.MISC_SIZE = SDATA.SIZE - (SHARED_SDATA.SIZE + ROSDATA.SIZE)$
593$
594$ $SDATA.SIZE_TO_ROSDATA = ROSDATA.BASE - SDATA_BASE$
595$
596$ $SDATA.SIZE_TO_SSHARED = SHARED_SDATA.BASE - SDATA_BASE$
597$ $SDATA.SIZE_TO_SSHARED = SDATA.SIZE_TO_SSHARED - ROSDATA.SIZE$
598$
599$ $IF LENGTH(SRPW_SDATA.SIZE)$
600$ $SDATA.MISC_SIZE = SDATA.MISC_SIZE - SRPW_SDATA.SIZE$
601$ $SDATA.SIZE_TO_SSRPW = SRPW_SDATA.BASE - SDATA_BASE$
602$ $SDATA.SIZE_TO_ROSDATA = SDATA.SIZE_TO_ROSDATA - SRPW_SDATA.SIZE$
603$ $SDATA.SIZE_TO_SSHARED = SDATA.SIZE_TO_SSHARED - SRPW_SDATA.SIZE$
604$ $END$
605$ $IF DEBUG_OPT_TF$
606$ $WARNING$
607$ $FORMAT("sdata_misc: size[0x%x]", SDATA.MISC_SIZE)$$NL$
608$ $END$
609$ $END$
610$
611$ $
612$ $ dataに関するサイズを求める
613$ $
614$ $DATA.SIZE_TO_SHARED = SHARED_DATA.BASE - SDATA_LIMIT$
615$
616$ $IF LENGTH(SRPW_DATA.SIZE)$
617$ $DATA.SIZE_TO_SRPW = SRPW_DATA.BASE - SDATA_LIMIT$
618$ $DATA.SIZE_TO_SHARED = DATA.SIZE_TO_SHARED - SRPW_DATA.SIZE$
619$ $END$
620$ $IF DEBUG_OPT_TF$
621$ $WARNING$
622$ $FORMAT("sdata_misc: size[0x%x]", SDATA.MISC_SIZE)$$NL$
623$ $END$
624$ $END$
625$
626$ $ $ERROR$
627$ $ "implemented to here.\n"
628$ $ $END$
629$ $ $DIE()$
630$
631$
632$ $
633$ $ 配置アドレスを指定するセクションに対する処理
634$ $ 配置換え対象のセクション: 必ずあるかどうか
635$ $ srpw_data_all: 0
636$ $ srpw_sdata_all: 0
637$ $ rosdata_shared: 1
638$ $ sdata_shared: 1
639$ $ data_shared: 1
640$ $
641$ $check_shared_mo = 0$
642$ $preid = -1$
643$ $limit_align_flag = 1$
644$ $FOREACH moid MO_START_LIST$
645$ $ // メモリオブジェクトの先頭をパス2時点での順にチェック
646$ $IF MO.LINKER[moid]$
647$ $IF DEBUG_OPT_TF$
648$ $WARNING$
649$ $FORMAT("check mo %d: SEFLAG=0x%x", moid, MO.SEFLAG[moid])$$NL$
650$ $END$
651$ $END$
652$ $IF !LENGTH(SDATA.REALBASE) && ((MO.MEMATR[moid] & TA_SDATA) == TA_SDATA)$
653$ $ // ショートデータセクションの先頭
654$ $ $MO.REALBASE[moid] = SDATA_BASE + ROSDATA.SIZE$
655$ $MO.REALBASE[moid] = SHARED_DATA.REALBASE + SHARED_DATA.REALSIZE$
656$ $SDATA.REALBASE = MO.REALBASE[moid]$
657$ $ $IF LENGTH(SRPW_DATA.SIZE)$
658$ $ $MO.REALBASE[moid] = MO.REALBASE[moid] + SRPW_DATA.SIZE$
659$ $ $END$
660$ $ $IF LENGTH(SRPW_SDATA.SIZE)$
661$ $ $MO.REALBASE[moid] = MO.REALBASE[moid] + SRPW_SDATA.SIZE$
662$ $ $END$
663$ $MO.COMMENT[moid] = "sdata_top"$
664$ $SDATA.START_MO = moid$
665$ $MO.SEFLAG[moid] = MO.SEFLAG[moid] & ~0x400$
666$ $IF DEBUG_OPT_TF$
667$ $WARNING$
668$ $FORMAT("sdata_top[%d]=0x%x", moid, SDATA.REALBASE)$$NL$
669$ $END$
670$ $END$
671$ $END$
672$ $IF LENGTH(SRPW_SDATA.BASE) && (moid == SRPW_SDATA.BASE_MO)$
673$ $ // srpw_sdata_allの先頭
674$ $MO.REALBASE[moid] = SDATA.REALBASE + SDATA.MISC_SIZE + ROSDATA.SIZE$
675$ $ $MO.REALBASE[moid] = SDATA_BASE$
676$ $ $IF LENGTH(SRPW_DATA.SIZE)$
677$ $ $MO.REALBASE[moid] = MO.REALBASE[moid] + SRPW_DATA.SIZE$
678$ $ $END$
679$ $MO.COMMENT[moid] = "srpw_sdata_top"$
680$ $IF DEBUG_OPT_TF$
681$ $WARNING$
682$ $FORMAT("srpw_sdata_top[%d]=0x%x", moid, MO.REALBASE[moid])$$NL$
683$ $END$
684$ $END$
685$ $END$
686$ $IF LENGTH(SRPW_SDATA.LIMIT_MO) && (preid == SRPW_SDATA.LIMIT_MO)
687$ && (moid != ROSDATA.BASE_MO)$
688$ $ // srpw_sdata_allとrosdataの間にメモリオブジェクトがある場合
689$ $MO.REALBASE[moid] = SDATA.REALBASE + SDATA.SIZE_TO_SSRPW$
690$ $ $IF LENGTH(SRPW_DATA.SIZE)$
691$ $ $MO.REALBASE[moid] = MO.REALBASE[moid] + SRPW_DATA.SIZE$
692$ $ $END$
693$ $MO.COMMENT[moid] = "srpw_sdata_limit"$
694$ $IF DEBUG_OPT_TF$
695$ $WARNING$
696$ $FORMAT("%s[%d]=0x%x", MO.COMMENT[moid], moid, MO.REALBASE[moid])$$NL$
697$ $END$
698$ $END$
699$ $END$
700$ $IF (moid == ROSDATA.BASE_MO)$
701$ $ // rosdataの先頭
702$ $MO.REALBASE[moid] = SDATA.REALBASE + SDATA.MISC_SIZE$
703$ $ $MO.REALBASE[moid] = SDATA_BASE$
704$ $ $IF LENGTH(SRPW_DATA.SIZE)$
705$ $ $MO.REALBASE[moid] = MO.REALBASE[moid] + SRPW_DATA.SIZE$
706$ $ $END$
707$ $ $IF LENGTH(SRPW_SDATA.SIZE)$
708$ $ $MO.REALBASE[moid] = MO.REALBASE[moid] + SRPW_SDATA.SIZE$
709$ $ $END$
710$ $MO.COMMENT[moid] = "rosdata_shared_top"$
711$ $IF DEBUG_OPT_TF$
712$ $WARNING$
713$ $FORMAT("%s[%d]=0x%x", MO.COMMENT[moid], moid, MO.REALBASE[moid])$$NL$
714$ $END$
715$ $END$
716$ $END$
717$ $ $IF (preid == ROSDATA.LIMIT_MO) && (preid != SDATA_LIMIT_MO)$
718$ $IF (preid == ROSDATA.LIMIT_MO) && (moid != SHARED_SDATA.BASE_MO)$
719$ $ // rosdataとsdata_sharedの間にsdataがある場合
720$ $MO.REALBASE[moid] = SDATA.REALBASE + SDATA.SIZE_TO_ROSDATA$
721$ $ $MO.REALBASE[moid] = MO.BASEADDR[moid]$
722$ $ $IF LENGTH(SRPW_DATA.SIZE)$
723$ $ $MO.REALBASE[moid] = MO.REALBASE[moid] + SRPW_DATA.SIZE$
724$ $ $END$
725$ $MO.COMMENT[moid] = "rosdata_shared_limit"$
726$ $IF DEBUG_OPT_TF$
727$ $WARNING$
728$ $FORMAT("%s[%d]=0x%x", MO.COMMENT[moid], moid, MO.REALBASE[moid])$$NL$
729$ $END$
730$ $END$
731$ $END$
732$ $IF (moid == SHARED_SDATA.BASE_MO)$
733$ $ // sdata_sharedの先頭
734$ $MO.REALBASE[moid] = SHARED_DATA.REALBASE + SHARED_DATA.SIZE$
735$ $MO.COMMENT[moid] = "sdata_shared_top"$
736$ $MO.SEFLAG[moid] = MO.SEFLAG[moid] | 0x400$
737$ $IF DEBUG_OPT_TF$
738$ $WARNING$
739$ $FORMAT("%s[%d]=0x%x", MO.COMMENT[moid], moid, MO.REALBASE[moid])$$NL$
740$ $END$
741$ $END$
742$ $END$
743$ $IF (preid == SHARED_SDATA.LIMIT_MO)$
744$ $ // sdata_sharedの終端はマスクベース方式なのでサイズの倍数にアライン
745$ $at_mo_order = FIND(MO_ORDER, preid)$
746$ $check_flag = 1$
747$ $WHILE check_flag$
748$ $IF LENGTH(AT(MO_ORDER, at_mo_order))$
749$ $IF DEBUG_OPT_TF$
750$ $WARNING$
751$ $FORMAT("check: %d, 0x%x", AT(MO_ORDER, at_mo_order), +MO.SEFLAG[AT(MO_ORDER, at_mo_order)])$$NL$
752$ $END$
753$ $END$
754$ $IF (MO.SEFLAG[AT(MO_ORDER, at_mo_order)] & 0x20) == 0x20$
755$ $IF DEBUG_OPT_TF$
756$ $WARNING$
757$ $FORMAT("hit: %d, 0x%x", AT(MO_ORDER, at_mo_order), +MO.SEFLAG[AT(MO_ORDER, at_mo_order)])$$NL$
758$ $END$
759$ $END$
760$ $MO.REALALIGN[AT(MO_ORDER, at_mo_order)] = SHARED_DATA.REALSIZE$
761$ $check_flag = 0$
762$ $END$
763$ $ELSE$
764$ $ERROR$
765$ $FORMAT("shared sdata does not have limit label")$$NL$
766$ $END$
767$ $check_flag = 0$
768$ $END$
769$ $at_mo_order = at_mo_order + 1$
770$ $END$
771$ $IF (preid != SDATA_LIMIT_MO)$
772$ $ // sdata_sharedの下にsdataがある場合
773$ $MO.REALBASE[moid] = SDATA.REALBASE + SDATA.SIZE_TO_SSHARED$
774$ $MO.COMMENT[moid] = "sdata_shared_limit"$
775$ $END$
776$ $END$
777$ $IF (preid == SDATA_LIMIT_MO)$
778$ $ // sdataの終端の場合
779$ $MO.REALBASE[moid] = SDATA.REALBASE + (SDATA.SIZE - SHARED_SDATA.SIZE)$
780$ $IF LENGTH(SRPW_DATA.SIZE)$
781$ $MO.REALBASE[moid] = MO.REALBASE[moid] + SRPW_DATA.SIZE$
782$ $END$
783$ $DATA.REALBASE = MO.REALBASE[moid]$
784$ $ $MO.REALBASE[moid] = SDATA_LIMIT + SHARED_DATA.SIZE$
785$ $ $IF LENGTH(SRPW_DATA.SIZE)$
786$ $ $MO.REALBASE[moid] = MO.REALBASE[moid] + SRPW_DATA.SIZE$
787$ $ $END$
788$ $IF DEBUG_OPT_TF$
789$ $WARNING$
790$ $FORMAT("%d: 0x%x, sdata_limit", moid, MO.REALBASE[moid])$$NL$
791$ $END$
792$ $END$
793$ $MO.COMMENT[moid] = "sdata_limit"$
794$ $DATA.START_MO = moid$
795$ $END$
796$ $IF LENGTH(SRPW_DATA.BASE_MO) && (moid == SRPW_DATA.BASE_MO)$
797$ $ // srpwの先頭の場合
798$ $MO.REALBASE[moid] = SDATA.REALBASE + (SDATA.SIZE - SHARED_SDATA.SIZE)$
799$ $ $MO.REALBASE[moid] = SDATA_BASE$
800$ $IF DEBUG_OPT_TF$
801$ $WARNING$
802$ $FORMAT("%d: 0x%x", moid, MO.REALBASE[moid])$$NL$
803$ $END$
804$ $END$
805$ $MO.COMMENT[moid] = "srpw_data_top"$
806$ $END$
807$ $IF LENGTH(SRPW_DATA.LIMIT_MO) && (preid == SRPW_DATA.LIMIT_MO)
808$ && (moid != SHARED_DATA.BASE_MO)$
809$ $ // srpw_data_allとdata_sharedの間にdataがある場合
810$ $ $MO.REALBASE[moid] = MO.BASEADDR[moid] + SHARED_DATA.SIZE$
811$ $MO.REALBASE[moid] = DATA.REALBASE + DATA.SIZE_TO_SRPW$
812$ $MO.COMMENT[moid] = "srpw_data_limit"$
813$ $IF DEBUG_OPT_TF$
814$ $WARNING$
815$ $FORMAT("%s[%d]=0x%x", MO.COMMENT[moid], moid, MO.REALBASE[moid])$$NL$
816$ $END$
817$ $END$
818$ $END$
819$ $IF (moid == SHARED_DATA.BASE_MO)$
820$ $MO.REALBASE[moid] = SHARED_DATA.REALBASE$
821$ $ $MO.REALBASE[moid] = SDATA_LIMIT$
822$ $ $IF LENGTH(SRPW_DATA.SIZE)$
823$ $ $MO.REALBASE[moid] = MO.REALBASE[moid] + SRPW_DATA.SIZE$
824$ $ $END$
825$ $IF DEBUG_OPT_TF$
826$ $WARNING$
827$ $FORMAT("%d: 0x%x", moid, MO.REALBASE[moid])$$NL$
828$ $END$
829$ $END$
830$ $MO.COMMENT[moid] = "data_shared_top"$
831$ $END$
832$ $IF (preid == SHARED_DATA.LIMIT_MO)$
833$ $ // data_sharedの下にdataがある場合
834$ $MO.REALBASE[moid] = DATA.REALBASE + DATA.SIZE_TO_SHARED$
835$ $ $MO.REALBASE[moid] = MO.BASEADDR[moid]$
836$ $limit_align_flag = 0$
837$ $MO.COMMENT[moid] = "data_shared_limit"$
838$ $IF DEBUG_OPT_TF$
839$ $WARNING$
840$ $FORMAT("%d: 0x%x, not required dummy section", moid, MO.REALBASE[moid])$$NL$
841$ $END$
842$ $END$
843$ $END$
844$ $END$
845$
846$ $preid = moid$
847$ $END$
848$ $IF limit_align_flag$
849$ $ $IF LENGTH(SRPW_DATA.LIMIT)$
850$ $ $REG.LIMIT_ALIGN[MO.MEMREG[moid]] = SRPW_DATA.LIMIT$
851$ $ $ELSE$
852$ $ $REG.LIMIT_ALIGN[MO.MEMREG[moid]] = SHARED_DATA.LIMIT$
853$ $ $END$
854$ $REG.LIMIT_ALIGN[STANDARD_RAM] = DATA.REALBASE + DATA.SIZE_TO_SHARED$
855$ $IF DEBUG_OPT_TF$
856$ $WARNING$
857$ $FORMAT("%s: 0x%x, required dummy section", REG.REGNAME[STANDARD_RAM], REG.LIMIT_ALIGN[STANDARD_RAM])$$NL$
858$ $END$
859$ $END$
860$ $END$
861
862$
863$ 共有リードライト領域 / 共有リード専有ライト領域(sdata) / rosdata_shared領域
864$ の情報取得
865$
866$check_shared_mo = 0x00$
867$check_srpw_mo = 0x00$
868$check_rosdata_mo = 0x00$
869$check_sdata_mo = 0x00$
870$LIST_SHARED_MO = {}$
871$LIST_SRPW_MO = {}$
872$LIST_ROSDATA_MO = {}$
873$preid = -1$
874$FOREACH moid MO_START_LIST$
875$ // メモリオブジェクトの先頭をパス2時点での順にチェック
876 $IF LENGTH(FIND(MO_MPROTECT_LIST, moid))$
877$ // メモリ保護単位の先頭の場合
878 $IF (MO.ACPTN1[moid] == TACP_SHARED) && (MO.ACPTN2[moid] == TACP_SHARED)$
879 $IF ((check_shared_mo & 0x10) != 0x10)$
880$ // 共有リードライト領域の先頭の場合
881 $SHARED_AREA_BASE[check_shared_mo] = MO.BASEADDR[moid]$
882 $SHARED_AREA_MO[check_shared_mo] = moid$
883 $LIST_SHARED_MO = APPEND(LIST_SHARED_MO, check_shared_mo)$
884 $check_shared_mo = check_shared_mo | 0x10$
885 $END$
886 $ELIF (check_shared_mo & 0x10) == 0x10$
887$ // 共有リードライト領域の終端の場合
888 $IF preid == -1$
889 $ERROR$
890 $FORMAT("unexpected preid.")$
891 $END$
892 $END$
893 $check_shared_mo = check_shared_mo & 0x0f$
894 $SHARED_AREA_LIMIT[check_shared_mo] = MO.LIMITADDR[preid]$
895 $SHARED_AREA_SIZE[check_shared_mo] = SHARED_AREA_LIMIT[check_shared_mo] - SHARED_AREA_BASE[check_shared_mo]$
896 $SHARED_AREA_LIMIT_MO[check_shared_mo] = preid$
897 $check_shared_mo = check_shared_mo + 1$
898 $END$
899
900 $END$
901
902 $preid = moid$
903$END$
904$IF (check_shared_mo & 0x10) == 0x10$
905 $IF preid == -1$
906 $ERROR$
907 $FORMAT("unexpected preid.")$
908 $END$
909 $END$
910 $check_shared_mo = check_shared_mo & 0x0f$
911 $SHARED_AREA_LIMIT[check_shared_mo] = MO.LIMITADDR[preid]$
912 $SHARED_AREA_LIMIT_MO[check_shared_mo] = preid$
913 $SHARED_AREA_SIZE[check_shared_mo] = SHARED_AREA_LIMIT[check_shared_mo] - SHARED_AREA_BASE[check_shared_mo]$
914 $check_shared_mo = check_shared_mo + 1$
915$END$
916$
917$ エラーチェック
918$
919$FOREACH id LIST_SHARED_MO$
920 $IF DEBUG_OPT_TF$
921 $WARNING$
922 $id$$NL$
923 $SHARED_AREA_MO[id]$$NL$
924 $SHARED_AREA_LIMIT_MO[id]$$NL$
925 $FORMAT("0x%x", SHARED_AREA_BASE[id])$$NL$
926 $FORMAT("0x%x", SHARED_AREA_LIMIT[id])$$NL$
927 $FORMAT("0x%x", SHARED_AREA_SIZE[id])$$NL$
928 $END$
929 $END$
930 $IF ((MO.MEMATR[SHARED_AREA_MO[id]] & TA_SDATA) == TA_SDATA)$
931 $IF LENGTH(SHARED_DATA.BASE)$
932 $ERROR$
933 $FORMAT("unexpected mematr: %d, %x", id, MO.MEMATR[SHARED_AREA_MO[id]])$
934 $END$
935 $ELSE$
936 $SHARED_DATA.BASE = SHARED_AREA_BASE[id]$
937 $SHARED_DATA.LIMIT = SHARED_AREA_LIMIT[id]$
938 $SHARED_DATA.SIZE = SHARED_AREA_SIZE[id]$
939 $SHARED_DATA.BASE_MO = SHARED_AREA_MO[id]$
940 $SHARED_DATA.LIMIT_MO = SHARED_AREA_LIMIT_MO[id]$
941 $END$
942 $ELSE$
943 $ERROR$
944 $FORMAT("unexpected mematr: %d, %x", id, MO.MEMATR[SHARED_AREA_MO[id]])$
945 $END$
946 $END$
947$END$
948
949$
950$ data_sharedの配置アドレスを求める
951$
952$SHARED_DATA.REALSIZE = SEARCH_ARM_MPU_SIZE(SHARED_DATA.SIZE)$
953$SHARED_DATA.REALBASE = SEARCH_ARM_MPU_ALIGN(SHARED_DATA.BASE, SHARED_DATA.REALSIZE)$
954$IF DEBUG_OPT_TF$
955 $WARNING$
956 $FORMAT("data_shared: base[0x%x], size[0x%x]", SHARED_DATA.REALBASE, SHARED_DATA.REALSIZE)$$NL$
957 $END$
958$END$
959
960$
961$ 配置アドレスを指定するセクションに対する処理
962$ 配置換え対象のセクション: 必ずあるかどうか
963$ srpw_data_all: 0
964$ srpw_sdata_all: 0
965$ rosdata_shared: 1
966$ sdata_shared: 1
967$ data_shared: 1
968$
969$check_shared_mo = 0$
970$preid = -1$
971$limit_align_flag = 1$
972$FOREACH moid MO_START_LIST$
973$ // メモリオブジェクトの先頭をパス2時点での順にチェック
974 $IF MO.LINKER[moid]$
975 $IF DEBUG_OPT_TF$
976 $WARNING$
977 $FORMAT("check mo %d: SEFLAG=0x%x", moid, MO.SEFLAG[moid])$$NL$
978 $END$
979 $END$
980 $IF (moid == SHARED_DATA.BASE_MO)$
981$ // data_sharedの先頭
982 $MO.REALBASE[moid] = SHARED_DATA.REALBASE$
983 $MO.COMMENT[moid] = "data_shared_top"$
984 $IF DEBUG_OPT_TF$
985 $WARNING$
986 $FORMAT("%s[%d]=0x%x", MO.COMMENT[moid], moid, MO.REALBASE[moid])$$NL$
987 $END$
988 $END$
989 $END$
990 $IF (preid == SHARED_DATA.LIMIT_MO)$
991$ // data_sharedの終端はマスクベース方式なのでサイズの倍数にアライン
992 $at_mo_order = FIND(MO_ORDER, preid)$
993 $check_flag = 1$
994 $WHILE check_flag$
995 $IF LENGTH(AT(MO_ORDER, at_mo_order))$
996 $IF DEBUG_OPT_TF$
997 $WARNING$
998 $FORMAT("check: %d, 0x%x", AT(MO_ORDER, at_mo_order), +MO.SEFLAG[AT(MO_ORDER, at_mo_order)])$$NL$
999 $END$
1000 $END$
1001 $IF (MO.SEFLAG[AT(MO_ORDER, at_mo_order)] & 0x20) == 0x20$
1002 $IF DEBUG_OPT_TF$
1003 $WARNING$
1004 $FORMAT("hit: %d, 0x%x", AT(MO_ORDER, at_mo_order), +MO.SEFLAG[AT(MO_ORDER, at_mo_order)])$$NL$
1005 $END$
1006 $END$
1007 $MO.REALALIGN[AT(MO_ORDER, at_mo_order)] = SHARED_DATA.REALSIZE$
1008 $check_flag = 0$
1009 $END$
1010 $ELSE$
1011 $ERROR$
1012 $FORMAT("shared data does not have limit label")$$NL$
1013 $END$
1014 $check_flag = 0$
1015 $END$
1016 $at_mo_order = at_mo_order + 1$
1017 $END$
1018 $END$
1019 $END$
1020
1021 $preid = moid$
1022$END$
1023$IF (preid == SHARED_DATA.LIMIT_MO)$
1024$ // data_sharedの終端はマスクベース方式なのでサイズの倍数にアライン
1025 $at_mo_order = FIND(MO_ORDER, preid)$
1026 $check_flag = 1$
1027 $WHILE check_flag$
1028 $IF LENGTH(AT(MO_ORDER, at_mo_order))$
1029 $IF DEBUG_OPT_TF$
1030 $WARNING$
1031 $FORMAT("check: %d, 0x%x", AT(MO_ORDER, at_mo_order), +MO.SEFLAG[AT(MO_ORDER, at_mo_order)])$$NL$
1032 $END$
1033 $END$
1034 $IF (MO.SEFLAG[AT(MO_ORDER, at_mo_order)] & 0x20) == 0x20$
1035 $IF DEBUG_OPT_TF$
1036 $WARNING$
1037 $FORMAT("hit: %d, 0x%x", AT(MO_ORDER, at_mo_order), +MO.SEFLAG[AT(MO_ORDER, at_mo_order)])$$NL$
1038 $END$
1039 $END$
1040 $MO.REALALIGN[AT(MO_ORDER, at_mo_order)] = SHARED_DATA.REALSIZE$
1041 $check_flag = 0$
1042 $END$
1043 $ELSE$
1044 $ERROR$
1045 $FORMAT("shared data does not have limit label")$$NL$
1046 $END$
1047 $check_flag = 0$
1048 $END$
1049 $at_mo_order = at_mo_order + 1$
1050 $END$
1051$END$
1052
1053
1054
1055$
1056$ arch/v850_ghs/ldscript.tfのターゲット依存部
1057$
1058
1059$FUNCTION GENERATE_PROVIDE$
1060 provide(_hardware_init_hook = 0);$NL$
1061 provide(_software_init_hook = 0);$NL$
1062 provide(_software_term_hook = 0);$NL$
1063 provide(_bsssecinib_table = 0);$NL$
1064 provide(_tnum_bsssec = 0);$NL$
1065 provide(_datasecinib_table = 0);$NL$
1066 provide(_tnum_datasec = 0);$NL$
1067 $NL$
1068
1069 $IF LENGTH(OSAP.ID_LIST)$
1070 $FOREACH domid OSAP.ID_LIST$
1071 $IF !OSAP.TRUSTED[domid]$
1072$ RX領域(専用)
1073 provide(___start_text_$OSAP.LABEL[domid]$ = 0xfffffff0);$NL$
1074 provide(___limit_text_$OSAP.LABEL[domid]$ = 0xfffffff0);$NL$
1075$ R領域(専用)
1076 provide(___start_sram_$OSAP.LABEL[domid]$_$FORMAT("%x", MEMATR_ROSDATA & ~TA_MEMINI)$ = 0xfffffff0);$NL$
1077 provide(___limit_sram_$OSAP.LABEL[domid]$_$FORMAT("%x", MEMATR_ROSDATA & ~TA_MEMINI)$ = 0xfffffff0);$NL$
1078$ RWX領域(専用)
1079 provide(___start_ram_$OSAP.LABEL[domid]$ = 0xfffffff0);$NL$
1080 provide(___limit_ram_$OSAP.LABEL[domid]$ = 0xfffffff0);$NL$
1081 provide(___start_sram_$OSAP.LABEL[domid]$ = 0xfffffff0);$NL$
1082 provide(___limit_sram_$OSAP.LABEL[domid]$ = 0xfffffff0);$NL$
1083$ 共有リード専用ライト
1084 provide($FORMAT("___start_ram_%s_%x_%x", OSAP.LABEL[domid], +DEFAULT_ACPTN[domid], +TACP_SHARED)$ = 0xfffffff0);$NL$
1085 provide($FORMAT("___limit_ram_%s_%x_%x", OSAP.LABEL[domid], +DEFAULT_ACPTN[domid], +TACP_SHARED)$ = 0xfffffff0);$NL$
1086 provide($FORMAT("___start_sram_%s_%x_%x", OSAP.LABEL[domid], +DEFAULT_ACPTN[domid], +TACP_SHARED)$ = 0xfffffff0);$NL$
1087 provide($FORMAT("___limit_sram_%s_%x_%x", OSAP.LABEL[domid], +DEFAULT_ACPTN[domid], +TACP_SHARED)$ = 0xfffffff0);$NL$
1088$ provide($FORMAT("___start_ram_%s_srpw", OSAP.LABEL[domid])$ = 0xfffffff0);$NL$
1089$ provide($FORMAT("___limit_ram_%s_srpw", OSAP.LABEL[domid])$ = 0xfffffff0);$NL$
1090$ provide($FORMAT("___start_sram_%s_srpw", OSAP.LABEL[domid])$ = 0xfffffff0);$NL$
1091$ provide($FORMAT("___limit_sram_%s_srpw", OSAP.LABEL[domid])$ = 0xfffffff0);$NL$
1092 $END$
1093 $END$
1094 $NL$
1095 $END$$NL$
1096
1097$ 共有領域
1098 provide(___start_text_$OSAP.LABEL[TDOM_NONE]$ = 0xfffffff0);$NL$
1099 provide(___limit_text_$OSAP.LABEL[TDOM_NONE]$ = 0xfffffff0);$NL$
1100 provide(___start_sram_$OSAP.LABEL[TDOM_NONE]$_$FORMAT("%x", MEMATR_ROSDATA & ~TA_MEMINI)$ = 0xfffffff0);$NL$
1101 provide(___limit_sram_$OSAP.LABEL[TDOM_NONE]$_$FORMAT("%x", MEMATR_ROSDATA & ~TA_MEMINI)$ = 0xfffffff0);$NL$
1102 provide(___start_ram_$OSAP.LABEL[TDOM_NONE]$ = 0xfffffff0);$NL$
1103 provide(___limit_ram_$OSAP.LABEL[TDOM_NONE]$ = 0xfffffff0);$NL$
1104 provide(___start_sram_$OSAP.LABEL[TDOM_NONE]$ = 0xfffffff0);$NL$
1105 provide(___limit_sram_$OSAP.LABEL[TDOM_NONE]$ = 0xfffffff0);$NL$
1106$ 共有リード専用ライト領域全体
1107 provide(___start_srpw_all = 0xfffffff0);$NL$
1108 provide(___limit_srpw_all = 0xfffffff0);$NL$
1109 provide(___start_ssrpw_all = 0xfffffff0);$NL$
1110 provide(___limit_ssrpw_all = 0xfffffff0);$NL$
1111 $NL$
1112$END$
1113
1114
1115$ $FUNCTION TARGET_PROVIDE_GP$
1116$FUNCTION GENERATE_GP_LABEL$
1117 $TAB$$TAB$__gp = . + 32K;$NL$
1118$END$
1119
1120$TOPPERS_ATTMOD = TOPPERS_ATTSEC + 1$
1121$TOPPERS_MPFAREA = TOPPERS_ATTSEC + 2$
1122
1123$INCLUDE "v850_ghs/ldscript.tf"$
1124
1125$FOREACH moid MO_ORDER$
1126 $IF MO.LINKER[moid]$
1127$ // セクションの開始記述の生成
1128 $IF (MO.SEFLAG[moid] & 0x01) != 0$
1129$ // 共有リード専有ライト領域の全体の開始番地
1130 $IF (MO.SEFLAG[moid] & 0x100) != 0$
1131$ // 最初に更新された値が有効となる
1132 $IF !LENGTH(SRPW.BASE)$
1133 $SRPW.BASE = MO.BASEADDR[moid]$
1134 $IF DEBUG_OPT_TF$
1135 $WARNING$
1136 $FORMAT("hit: %d, 0x%x", moid, +MO.SEFLAG[moid])$$NL$
1137 $END$
1138 $END$
1139 $END$
1140 $ELIF MO.ACPTN1[moid] == 0 && MO.ACPTN2[moid] == TACP_SHARED
1141 && (MO.MEMATR[moid] & TA_SDATA) != 0$
1142$ // 最初に更新された値が有効となる
1143 $IF !LENGTH(SRPW.BASE)$
1144 $SRPW.BASE = MO.BASEADDR[moid]$
1145 $END$
1146 $END$
1147 $END$
1148
1149$ // 共有リード専有ライト領域の全体の終了番地
1150 $IF (MO.SEFLAG[moid] & 0x200) != 0$
1151 $IF !LENGTH(SRPW.BASE)$
1152 $ERROR$
1153 "start_srpw label is not found"
1154 $END$
1155 $END$
1156$ // 最後に更新された値が有効となる
1157$ $SRPW.LIMIT = MO.LIMITADDR[moid]$
1158 $SRPW.LIMIT = LIMIT_SYMBOL(MO.MLABEL[moid])$
1159 $IF DEBUG_OPT_TF$
1160 $WARNING$
1161 $FORMAT("hit end: %d, 0x%x", moid, SRPW.LIMIT)$$NL$
1162 $END$
1163 $END$
1164 $ELIF MO.ACPTN1[moid] == 0 && MO.ACPTN2[moid] == TACP_SHARED
1165 && (MO.MEMATR[moid] & TA_SDATA) != 0$
1166$ // 最後に更新された値が有効となる
1167$ $SRPW.LIMIT = MO.LIMITADDR[moid]$
1168 $SRPW.LIMIT = LIMIT_SYMBOL(MO.MLABEL[moid])$
1169 $IF DEBUG_OPT_TF$
1170 $WARNING$
1171 $FORMAT("hit end: %d, 0x%x", moid, SRPW.LIMIT)$$NL$
1172 $END$
1173 $END$
1174 $END$
1175
1176 $END$
1177$END$
1178
1179$IF DEBUG_OPT_TF$
1180 $WARNING$
1181 $FORMAT("srpw area: 0x%x, 0x%x", SRPW.BASE, SRPW.LIMIT)$$NL$
1182 $END$
1183$END$
1184
1185$
1186$ 共有領域の初期化ブロックを生成
1187$
1188$FILE "kernel_mem3.c"$
1189
1190$TNUM_SHARED_REGION = 3$
1191const uint32 tnum_shared_mem = $TNUM_SHARED_REGION * 2$;$NL$
1192uint8 * const shared_meminib_table[$TNUM_SHARED_REGION * 2$] = {$NL$
1193$shared_info = SYMBOL("shared_meminib_table")$
1194$ RX領域(共有)
1195$start_label = PEEK(shared_info, 4)$
1196$limit_label = PEEK(shared_info + 4, 4)$
1197$TAB$((uint8 *)&__start_text_$OSAP.LABEL[TDOM_NONE]$),$TAB$/* iregion 2 */$NL$
1198$TAB$((uint8 *)&__limit_text_$OSAP.LABEL[TDOM_NONE]$),$TAB$/* iregion 2 */$NL$
1199$ $TAB$$FORMAT("( (uint8 *)0x%x )", start_label)$,$TAB$/* iregion 2 : $FORMAT("0x%x", start_label)$ */$NL$
1200$ $TAB$$FORMAT("( (uint8 *)0x%x )", limit_label)$,$TAB$/* iregion 2 : $FORMAT("0x%x", limit_label)$ */$NL$
1201
1202$ RX領域(共有ショートデータ,共有リード専有ライトの全体)
1203$ rosdata_shared
1204$ srpw_data_all
1205$start_label = PEEK(shared_info + 8, 4)$
1206$limit_label = PEEK(shared_info + 12, 4)$
1207$IF LENGTH(SRPW.BASE) && LENGTH(SRPW.LIMIT)$
1208 $TAB$((uint8 *)$FORMAT("0x%x", SRPW.BASE)$),$TAB$/* iregion 3 */$NL$
1209 $TAB$((uint8 *)$FORMAT("0x%x", SRPW.LIMIT)$),$TAB$/* iregion 3 */$NL$
1210$ELSE$
1211 $TAB$((uint8 *)NULL),$TAB$/* iregion 3 */$NL$
1212 $TAB$((uint8 *)NULL),$TAB$/* iregion 3 */$NL$
1213$END$
1214
1215$ RWX領域(共有ショートデータ,共有データ)
1216$ //sdata_sharedの先頭からdata_sharedの終端(dataの先頭)まで
1217$ data_sharedの先頭からsdata_sharedの終端(dataの先頭)まで
1218$start_label = PEEK(shared_info + 16, 4)$
1219$limit_label = PEEK(shared_info + 20, 4)$
1220$ $start_label = SHARED_SDATA.BASE$
1221$ $IF LENGTH(SRPW_DATA.SIZE)$
1222$ $start_label = start_label + SRPW_DATA.SIZE$
1223$ $END$
1224$ $limit_label = MO.REALBASE[DATA.START_MO]$
1225$start_label = SHARED_DATA.REALBASE$
1226$limit_label = (SHARED_DATA.REALSIZE - 1) & ~0x0f$
1227$TAB$$FORMAT("( (uint8 *)0x%x )", start_label)$,$TAB$/* dregion 5 : $FORMAT("0x%x", start_label)$ */$NL$
1228$TAB$$FORMAT("( (uint8 *)0x%x )", limit_label)$,$TAB$/* dregion 5 : $FORMAT("0x%x", limit_label)$ */$NL$
1229
1230};$NL$
1231$NL$
1232
1233
Note: See TracBrowser for help on using the repository browser.