source: atk2-sc3_fl850f1l/kernel/memory.c@ 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: 14.4 KB
Line 
1/*
2 * TOPPERS ATK2
3 * Toyohashi Open Platform for Embedded Real-Time Systems
4 * Automotive Kernel Version 2
5 *
6 * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
7 * Toyohashi Univ. of Technology, JAPAN
8 * Copyright (C) 2004-2015 by Center for Embedded Computing Systems
9 * Graduate School of Information Science, Nagoya Univ., JAPAN
10 * Copyright (C) 2011-2015 by FUJI SOFT INCORPORATED, JAPAN
11 * Copyright (C) 2011-2013 by Spansion LLC, USA
12 * Copyright (C) 2011-2015 by NEC Communication Systems, Ltd., JAPAN
13 * Copyright (C) 2011-2015 by Panasonic Advanced Technology Development Co., Ltd., JAPAN
14 * Copyright (C) 2011-2014 by Renesas Electronics Corporation, JAPAN
15 * Copyright (C) 2011-2015 by Sunny Giken Inc., JAPAN
16 * Copyright (C) 2011-2015 by TOSHIBA CORPORATION, JAPAN
17 * Copyright (C) 2011-2015 by Witz Corporation
18 * Copyright (C) 2014-2015 by AISIN COMCRUISE Co., Ltd., JAPAN
19 * Copyright (C) 2014-2015 by eSOL Co.,Ltd., JAPAN
20 * Copyright (C) 2014-2015 by SCSK Corporation, JAPAN
21 *
22 * 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
23 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
24 * 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
25 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
26 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
27 * スコード中に含まれていること.
28 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
29 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
30 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
31 * の無保証規定を掲載すること.
32 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
33 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
34 * と.
35 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
36 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
37 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
38 * 報告すること.
39 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
40 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
41 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
42 * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
43 * 免責すること.
44 *
45 * 本ソフトウェアは,AUTOSAR(AUTomotive Open System ARchitecture)仕
46 * 様に基づいている.上記の許諾は,AUTOSARの知的財産権を許諾するもので
47 * はない.AUTOSARは,AUTOSAR仕様に基づいたソフトウェアを商用目的で利
48 * 用する者に対して,AUTOSARパートナーになることを求めている.
49 *
50 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
51 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
52 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
53 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
54 * の責任を負わない.
55 *
56 * $Id: memory.c 187 2015-06-25 03:39:04Z t_ishikawa $
57 */
58
59#include "kernel_impl.h"
60#include "check.h"
61#include "task.h"
62#include "interrupt.h"
63#include "memory.h"
64
65/*
66 * メモリオブジェクト管理モジュール
67 */
68
69/*
70 * トレースマクロのデフォルト定義
71 */
72
73#ifndef LOG_CHKISRMEMACS_ENTER
74#define LOG_CHKISRMEMACS_ENTER(ISRID, Address, Size)
75#endif /* LOG_CHKISRMEMACS_ENTER */
76
77#ifndef LOG_CHKISRMEMACS_LEAVE
78#define LOG_CHKISRMEMACS_LEAVE(ercd)
79#endif /* LOG_CHKISRMEMACS_LEAVE */
80
81#ifndef LOG_CHKTSKMEMACS_ENTER
82#define LOG_CHKTSKMEMACS_ENTER(TaskID, Address, Size)
83#endif /* LOG_CHKTSKMEMACS_ENTER */
84
85#ifndef LOG_CHKTSKMEMACS_LEAVE
86#define LOG_CHKTSKMEMACS_LEAVE(ercd)
87#endif /* LOG_CHKTSKMEMACS_LEAVE */
88
89
90/*
91 * 内部関数のプロトタイプ宣言
92 */
93#ifndef USE_TSKINICTXB
94
95LOCAL_INLINE AccessType check_address_sstack(const MemoryStartAddressType base, MemorySizeType size, const TINIB *p_tinib);
96LOCAL_INLINE AccessType check_address_ustack(const MemoryStartAddressType base, MemorySizeType size, const TINIB *p_tinib);
97
98#endif /* USE_TSKINICTXB */
99
100/*
101 * タスクメモリアクセスチェックシステムサービス
102 * 指定された タスク の 指定されたメモリ領域のアクセス権をチェックする
103 */
104#ifdef TOPPERS_CheckTaskMemoryAccess
105
106AccessType
107CheckTaskMemoryAccess(TaskType TaskID, MemoryStartAddressType Address, MemorySizeType Size)
108{
109 AccessType access;
110 StatusType ercd;
111 TCB *p_tcb;
112 boolean over_region;
113
114 LOG_CHKTSKMEMACS_ENTER(TaskID, Address, Size);
115
116 CHECK_DISABLEDINT();
117 CHECK_CALLEVEL(CALLEVEL_CHECKTASKMEMORYACCESS);
118 CHECK_ID(TaskID < tnum_task);
119 CHECK_VALUE(Size > 0U);
120
121 p_tcb = get_tcb(TaskID);
122
123 access = check_task_memory(p_tcb, Address, Size, &over_region);
124 CHECK_ILLEGAL_ADDRESS(over_region == FALSE);
125
126 exit_finish:
127 LOG_CHKTSKMEMACS_LEAVE(access);
128 return(access);
129
130#ifdef CFG_USE_ERRORHOOK
131 exit_errorhook:
132 x_nested_lock_os_int();
133#ifdef CFG_USE_PARAMETERACCESS
134 _errorhook_par1.tskid = TaskID;
135 _errorhook_par2.adr = Address;
136 _errorhook_par3.sz = Size;
137#endif /* CFG_USE_PARAMETERACCESS */
138 call_errorhook(ercd, OSServiceId_CheckTaskMemoryAccess);
139 x_nested_unlock_os_int();
140#endif /* CFG_USE_ERRORHOOK */
141
142 exit_no_errorhook:
143 access = AP_NoAccess;
144 goto exit_finish;
145}
146
147#endif /* TOPPERS_CheckTaskMemoryAccess */
148
149/*
150 * ISRメモリアクセスチェックシステムサービス
151 * 指定された ISR の 指定されたメモリ領域のアクセス権をチェックする
152 */
153#ifdef TOPPERS_CheckISRMemoryAccess
154
155AccessType
156CheckISRMemoryAccess(ISRType ISRID, MemoryStartAddressType Address, MemorySizeType Size)
157{
158 AccessType access;
159 StatusType ercd;
160 ISRCB *p_isrcb;
161 boolean over_region;
162
163 LOG_CHKISRMEMACS_ENTER(ISRID, Address, Size);
164
165 CHECK_DISABLEDINT();
166 CHECK_CALLEVEL(CALLEVEL_CHECKISRMEMORYACCESS);
167 CHECK_ID(ISRID < tnum_isr2);
168 CHECK_VALUE(Size > 0U);
169
170 p_isrcb = get_isrcb(ISRID);
171
172 access = check_isr_memory(p_isrcb, Address, Size, &over_region);
173 CHECK_ILLEGAL_ADDRESS(over_region == FALSE);
174
175 exit_finish:
176 LOG_CHKISRMEMACS_LEAVE(access);
177 return(access);
178
179#ifdef CFG_USE_ERRORHOOK
180 exit_errorhook:
181 x_nested_lock_os_int();
182#ifdef CFG_USE_PARAMETERACCESS
183 _errorhook_par1.isrid = ISRID;
184 _errorhook_par2.adr = Address;
185 _errorhook_par3.sz = Size;
186#endif /* CFG_USE_PARAMETERACCESS */
187 call_errorhook(ercd, OSServiceId_CheckISRMemoryAccess);
188 x_nested_unlock_os_int();
189#endif /* CFG_USE_ERRORHOOK */
190
191 exit_no_errorhook:
192 access = AP_NoAccess;
193 goto exit_finish;
194}
195
196#endif /* TOPPERS_CheckISRMemoryAccess */
197
198/*
199 * メモリアクセスチェック関数
200 */
201
202/*
203 * スタックアクセスチェック本体
204 */
205#ifdef TOPPERS_check_address_stack
206
207AccessType
208check_address_stack(const MemoryStartAddressType base, MemorySizeType size, const MemoryStartAddressType mobase, MemorySizeType mosize)
209{
210 AccessType result;
211 if (within_memobj(base, size, mobase, mosize) != FALSE) {
212 result = AP_Readable | AP_Writable | AP_StackSpace;
213 }
214 else {
215 result = NO_ACCESS;
216 }
217 return(result);
218}
219
220#endif /* TOPPERS_check_address_stack */
221
222#ifndef USE_TSKINICTXB
223
224LOCAL_INLINE AccessType
225check_address_sstack(const MemoryStartAddressType base, MemorySizeType size, const TINIB *p_tinib)
226{
227 return(check_address_stack(base, size, p_tinib->sstk, p_tinib->sstksz));
228}
229
230LOCAL_INLINE AccessType
231check_address_ustack(const MemoryStartAddressType base, MemorySizeType size, const TINIB *p_tinib)
232{
233 return(check_address_stack(base, size, p_tinib->ustk, p_tinib->ustksz));
234}
235
236#endif /* USE_TSKINICTXB */
237
238
239#ifndef OMIT_STANDARD_MEMINIB
240/*
241 * メモリオブジェクト初期化ブロックの検索
242 */
243#ifdef TOPPERS_search_meminib
244
245uint32
246search_meminib(MemoryStartAddressType addr)
247{
248 uint32 left, right, i;
249
250 left = 0U;
251 right = tnum_meminib - 1U;
252 while (left < right) {
253 i = (left + right + 1U) / 2U;
254 if (addr < (MemoryStartAddressType const) memtop_table[i]) {
255 right = i - 1U;
256 }
257 else {
258 left = i;
259 }
260 }
261 return(left);
262}
263
264#endif /* TOPPERS_search_meminib */
265/*
266 * メモリアクセスチェック
267 * メモリプロテクション単位(OSアプリケーション) でのチェックを行う
268 *
269 * 信頼OSアプリケーションの場合は,バックグラウンドをチェックする
270 * 現実装では全領域アクセス可能
271 * 非信頼OSアプリケーションの場合は,メモリオブジェクトの属性を返却する
272 */
273#ifdef TOPPERS_check_osap_memory
274
275AccessType
276check_osap_memory(OSAPCB *p_osapcb, const MemoryStartAddressType adr, MemorySizeType size)
277{
278 AccessType access = AP_NoAccess;
279 const MEMINIB *p_meminib;
280 uint32 pos;
281 uint32 btptn;
282 MemoryStartAddressType sadr = adr;
283 MemoryStartAddressType eadr = (MemoryStartAddressType) ((MemorySizeType) sadr + size);
284
285 if (p_osapcb->p_osapinib->osap_trusted != FALSE) {
286 access = probe_trusted_osap_mem(sadr, eadr);
287 }
288 else {
289
290 pos = search_meminib(sadr);
291 p_meminib = &(meminib_table[pos]);
292 if ((pos + 1U) < tnum_meminib) {
293 if (((uint8 *) eadr - 1) < (uint8 * const) memtop_table[pos + 1U]) {
294 btptn = p_osapcb->p_osapinib->btptn;
295 access |= ((p_meminib->acptnr & btptn) != 0U) ? AP_Readable : AP_NoAccess;
296 access |= ((p_meminib->acptnw & btptn) != 0U) ? AP_Writable : AP_NoAccess;
297 access |= ((p_meminib->acptnx & btptn) != 0U) ? AP_Executable : AP_NoAccess;
298 }
299 }
300 }
301 return(access);
302}
303
304#endif /* TOPPERS_check_osap_memory */
305
306/*
307 * ISRメモリアクセスチェックシステムサービス(カーネル内部用)
308 */
309#ifdef TOPPERS_check_isr_memory
310
311AccessType
312check_isr_memory(ISRCB *p_isrcb, const MemoryStartAddressType adr, MemorySizeType size, boolean *over_region)
313{
314 AccessType access = AP_NoAccess;
315 uint32 pos;
316 MemoryStartAddressType sadr = adr;
317 MemorySizeType memsize;
318
319 pos = search_meminib(sadr);
320 memsize = (MemorySizeType) (((uint8 *) (((pos + 1U) < tnum_meminib) ?
321 ((uint8 * const) memtop_table[pos + 1U]) : 0U)) - (const uint8 *) adr);
322
323 /* リージョンを跨ったか判定 */
324 if (size > memsize) {
325 *over_region = TRUE;
326 }
327 else {
328 *over_region = FALSE;
329 access = check_address_stack(adr, size, _ostk, _ostksz);
330 }
331
332 /* 機能レベル2ではC2ISRは信頼しかないので,全アクセス可能にする */
333 access |= (AP_Readable | AP_Writable | AP_Executable);
334
335 return(access);
336}
337
338#endif /* TOPPERS_check_isr_memory */
339
340/*
341 * タスクメモリアクセスチェックシステムサービス(カーネル内部用)
342 */
343#ifdef TOPPERS_check_task_memory
344
345AccessType
346check_task_memory(const TCB *p_tcb, const MemoryStartAddressType adr, MemorySizeType size, boolean *over_region)
347{
348 AccessType access = AP_NoAccess;
349 const MEMINIB *p_meminib;
350 uint32 pos;
351 uint32 btptn;
352 MemoryStartAddressType sadr = adr;
353 MemorySizeType memsize;
354
355 pos = search_meminib(sadr);
356 memsize = (MemorySizeType) (((uint8 *) (((pos + 1U) < tnum_meminib) ?
357 ((uint8 * const) memtop_table[pos + 1U]) : 0U)) - (const uint8 *) adr);
358
359 /* リージョンを跨ったか判定 */
360 if (size > memsize) {
361 *over_region = TRUE;
362 }
363 else {
364 *over_region = FALSE;
365 }
366
367 if (p_tcb->p_tinib->p_osapcb->p_osapinib->osap_trusted != FALSE) {
368 access = check_address_sstack(adr, size, p_tcb->p_tinib);
369
370 /* 信頼タスクの場合は全アクセス可能 */
371 access |= (AP_Readable | AP_Writable | AP_Executable);
372 }
373 else if (*over_region == FALSE) {
374 p_meminib = &(meminib_table[pos]);
375 if ((p_meminib->mematr & TOPPERS_USTACK) == 0U) {
376 btptn = p_tcb->p_tinib->p_osapcb->p_osapinib->btptn;
377 access |= ((p_meminib->acptnr & btptn) != 0U) ? AP_Readable : AP_NoAccess;
378 access |= ((p_meminib->acptnw & btptn) != 0U) ? AP_Writable : AP_NoAccess;
379 access |= ((p_meminib->acptnx & btptn) != 0U) ? AP_Executable : AP_NoAccess;
380 }
381 else {
382 access = check_address_ustack(adr, size, p_tcb->p_tinib);
383 }
384 }
385 else {
386 /* 上記以外の場合,処理は行わない(戻り値:AP_NoAccess) */
387 }
388
389 return(access);
390}
391
392#endif /* TOPPERS_check_task_memory */
393#endif /* OMIT_STANDARD_MEMINIB */
394
395/*
396 * スタートアップフック,シャットダウンフックの
397 * メモリアクセスチェックシステムサービス(カーネル内部用)
398 */
399#ifdef TOPPERS_check_hook_memory
400
401AccessType
402check_hook_memory(const MemoryStartAddressType adr, MemorySizeType size)
403{
404 AccessType access;
405 MemoryStartAddressType eadr = (MemoryStartAddressType) ((const MemorySizeType) adr + size);
406
407 access = probe_nthkstk(adr, eadr);
408
409 if (access == AP_NoAccess) {
410 access = check_osap_memory(p_runosap, adr, size);
411 }
412
413 return(access);
414}
415
416#endif /* TOPPERS_check_hook_memory */
417
418/*
419 * メモリアクセス権のチェック
420 */
421#ifdef TOPPERS_probe_memory_access
422
423AccessType
424probe_memory_access(const MemoryStartAddressType base, MemorySizeType size)
425{
426 AccessType access;
427 boolean dummy;
428 MemoryStartAddressType base_adr = base;
429
430 if (run_trusted != FALSE) {
431 /* 信頼OSアプリケーションの場合は,バックグラウンドをチェックする */
432 access = probe_trusted_osap_mem(base, (MemoryStartAddressType) ((uint8 *) base_adr + size));
433 }
434 else {
435 /*
436 * 非信頼OSアプリケーションの場合は,実行中のフックルーチン,タスク
437 * をチェックする
438 */
439 if (is_running_nontrusted_hook() != FALSE) {
440 access = check_hook_memory(base, size);
441 }
442 else {
443 access = check_task_memory(p_runtsk, base, size, &dummy);
444 }
445 }
446 return(access);
447}
448
449#endif /* TOPPERS_probe_memory_access */
450
451/*
452 * メモリへの書込み権のチェック
453 */
454#ifdef TOPPERS_probe_memory_read
455
456boolean
457probe_memory_read(const MemoryStartAddressType base, MemorySizeType size)
458{
459 return((probe_memory_access(base, size) & AP_Readable) == AP_Readable);
460}
461
462#endif /* TOPPERS_probe_memory_read */
463
464/*
465 * メモリへの書込み権のチェック
466 */
467#ifdef TOPPERS_probe_memory_write
468
469boolean
470probe_memory_write(const MemoryStartAddressType base, MemorySizeType size)
471{
472 return((probe_memory_access(base, size) & AP_Writable) == AP_Writable);
473}
474
475#endif /* TOPPERS_probe_memory_write */
476
477/*
478 * メモリに対する読書き権のチェック
479 */
480#ifdef TOPPERS_probe_memory_read_write
481
482boolean
483probe_memory_read_write(const MemoryStartAddressType base, MemorySizeType size)
484{
485 return((probe_memory_access(base, size) & (AP_Readable | AP_Writable)) == (AP_Readable | AP_Writable));
486}
487
488#endif /* TOPPERS_probe_memory_read_write */
489
490/*
491 * DATAセクションとBSSセクションの初期化
492 */
493#ifdef TOPPERS_initialize_sections
494#ifndef OMIT_INITIALIZE_SECTIONS
495
496void
497initialize_sections(void)
498{
499 uint32 i;
500 uint8 *p_src, *p_dst;
501 const DATASECINIB *p_datasecinib;
502 const BSSSECINIB *p_bsssecinib;
503
504 for (i = 0U; i < tnum_datasec; i++) {
505 p_datasecinib = &(datasecinib_table[i]);
506 p_src = (uint8 *) p_datasecinib->start_idata;
507 for (p_dst = (uint8 *) p_datasecinib->start_data;
508 ((const MemoryStartAddressType) p_dst) < (const MemoryStartAddressType) p_datasecinib->end_data; p_dst++) {
509 *p_dst = *p_src;
510 p_src++;
511 }
512 }
513 for (i = 0U; i < tnum_bsssec; i++) {
514 p_bsssecinib = &(bsssecinib_table[i]);
515 for (p_dst = (uint8 *) p_bsssecinib->start_bss;
516 ((const MemoryStartAddressType) p_dst) < (const MemoryStartAddressType) p_bsssecinib->end_bss; p_dst++) {
517 *p_dst = 0U;
518 }
519 }
520}
521
522#endif /* OMIT_INITIALIZE_SECTIONS */
523#endif /* TOPPERS_initialize_sections */
Note: See TracBrowser for help on using the repository browser.