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