source: atk2-sc3-1.4.0-ntisr/arch/v850_gcc/prc_mpu.c

Last change on this file was 172, checked in by ertl-ishikawa, 8 years ago

ATK2-SC3 1.4.0 RH850依存部 非信頼C2ISR対応を追加

  • Property svn:executable set to *
File size: 10.8 KB
Line 
1/*
2 * TOPPERS ATK2
3 * Toyohashi Open Platform for Embedded Real-Time Systems
4 * Automotive Kernel Version 2
5 *
6 * Copyright (C) 2013-2015 by Embedded and Real-Time Systems Laboratory
7 * Graduate School of Information Science, Nagoya Univ., JAPAN
8 *
9 * 上記著作権者
10は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
11 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
12 * 変・再é…
13å¸ƒï¼ˆä»¥ä¸‹ï¼Œåˆ©ç”¨ã¨å‘¼ã¶ï¼‰ã™ã‚‹ã“とを無償で許諾する.
14 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
15 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
16 * スコード中に含まれていること.
17 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
18 * 用できる形で再é…
19å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
20å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
21 * 者
22マニュアルなど)に,上記の著作権表示,この利用条件および下記
23 * の無保証規定を掲載すること.
24 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
25 * 用できない形で再é…
26å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
27 * と.
28 * (a) 再é…
29å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
30マニュアルなど)に,上記の著
31 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
32 * (b) 再é…
33å¸ƒã®å½¢æ…
34‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
35 * 報告すること.
36 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
37 * 害からも,上記著作権者
38およびTOPPERSプロジェクトをå…
39è²¬ã™ã‚‹ã“と.
40 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
41 * 由に基づく請求からも,上記著作権者
42およびTOPPERSプロジェクトを
43 * å…
44è²¬ã™ã‚‹ã“と.
45 *
46 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者
47お
48 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
49 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
50 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
51 * の責任を負わない.
52 *
53 * $Id$
54 */
55
56/*
57 * MPUドライバ
58 */
59
60#include "kernel_impl.h"
61#include "task.h"
62#include "memory.h"
63#include "prc_sil.h"
64#include "Os_Lcfg.h"
65#include <t_syslog.h>
66
67void *p_ctxosap;
68
69void
70target_mpu_initialize(void)
71{
72#ifdef __v850e2v3__
73 uint8 *ipal;
74 uint8 *ipau;
75
76 /*
77 * bselを保護設定用に
78 */
79 ipal = (uint8 *)0x00001001;
80 LDSR_REG(BSEL, (uint32)ipal);
81
82 /*
83 * IPA2: å…
84±æœ‰ãƒªãƒ¼ãƒ‰é ˜åŸŸ
85 */
86 ipal = shared_meminib_table[0];
87 ipau = shared_meminib_table[1];
88 IPA_WRITE(2, ipal, ipau);
89
90 /*
91 * IPA3: å…
92±æœ‰rosdata
93 */
94 ipal = shared_meminib_table[2];
95 ipau = shared_meminib_table[3];
96 IPA_WRITE(3, ipal, ipau);
97
98 /*
99 * DPA5: å…
100±æœ‰ãƒªãƒ¼ãƒ‰ãƒ©ã‚¤ãƒˆé ˜åŸŸ
101 */
102 ipal = shared_meminib_table[4];
103 ipau = shared_meminib_table[5];
104 DPA_WRITE(5, ipal, ipau);
105
106 /*
107 * MPU有効
108 * 特権モードではデフォルトのメモリマップ
109 * ハンドラ内
110ではMPU無効
111 */
112 ipal = (uint8 *)0x07;
113 LDSR_REG(MPM, (uint32)ipal);
114
115 /*
116 * bselを基本設定用に戻す
117 */
118 LDSR_REG(BSEL, (0U));
119
120#elif defined(__v850e3v5__)
121 uint32 mpm = 0x0U;
122
123 /*
124 * MPU0: ユーザスタックMPU領域の設定
125 */
126 LDSR_REG(2, 6, (uint32)(MPAT_E | MPAT_G | MPAT_UX | MPAT_UW | MPAT_UR))
127
128 mpu_shared_area_initialize();
129
130 /*
131 * MPU有効
132 * DW = 0 バックグラウンドの書込みは禁止
133 * SVP = 0 特権でのアクセス制限はしない
134 * MPE = 1 MPU有効
135 */
136 /*
137 * RH850/F1L用の設定
138 * DR = 1 バックグラウンドの書込みは禁止
139 * DW = 0 バックグラウンドの書込みは禁止
140 * DX = 1 バックグラウンドの書込みは禁止
141 * RH850/F1H用の設定
142 * DR = 0 バックグラウンドのアクセスは禁止
143 * DW = 0 バックグラウンドのアクセスは禁止
144 * DX = 0 バックグラウンドのアクセスは禁止
145 */
146 LDSR_REG(0, 5, (uint32)TARGET_MPM_CONFIG);
147
148
149#else /* __v850e3v5__ */
150#error please define ether __v850e2v3__ or __v850e3v5__
151#endif /* __v850e2v3__ */
152
153}
154
155void
156target_impu_exc_handler(void *p_excinf)
157{
158 uint32 sreg;
159 uint32 vmtid;
160
161#if defined(__v850e2v3__)
162 sreg = 0x00001000; /* プロセッサ保護違反バンク */
163 LDSR_REG(BSEL, sreg);
164 STSR_REG(VMTID, vmtid);
165 STSR_REG(VMADR, sreg);
166 LDSR_REG(BSEL, (0U));
167
168#elif defined(__v850e3v5__)
169 vmtid = (uint32)p_runosap;
170 STSR_REG(2, 0, (sreg));
171
172#else /* __v850e3v5__ */
173#error please define ether __v850e2v3__ or __v850e3v5__
174#endif /* __v850e2v3__ */
175
176 syslog(LOG_EMERG, "MPU EXCEPTION (RX) at 0x%x OCCURED!!", sreg);
177 syslog(LOG_EMERG, "p_dominib = 0x%x", vmtid);
178 while(1);
179}
180
181void
182target_dmpu_exc_handler(void *p_excinf)
183{
184 uint32 sreg;
185 uint32 vmtid;
186
187#if defined(__v850e2v3__)
188 sreg = 0x00001000; /* プロセッサ保護違反バンク */
189 LDSR_REG(BSEL, (sreg));
190 STSR_REG(VMTID, (vmtid));
191 STSR_REG(VMADR, (sreg));
192 LDSR_REG(BSEL, (0U));
193#elif defined(__v850e3v5__)
194 vmtid = (uint32)p_runosap;
195 STSR_REG(2, 0, (sreg));
196
197#else /* __v850e3v5__ */
198#error please define ether __v850e2v3__ or __v850e3v5__
199#endif /* __v850e2v3__ */
200
201 syslog(LOG_EMERG, "MPU EXCEPTION (RWX) at 0x%x OCCURED!!", sreg);
202 syslog(LOG_EMERG, "p_dominib = 0x%x", vmtid);
203 while(1);
204}
205
206/*
207 * 保護違反FEレベル例外ハンドラ
208 */
209void
210target_protection_handler(void *p_excinf)
211{
212 uint32 feic = 0;
213
214 /*
215 * FEレベル例外要因の読出し
216 */
217#if defined(__v850e2v3__)
218 LDSR_REG(BSEL, 0U);
219 STSR_REG(FEIC, feic);
220
221#elif defined(__v850e3v5__)
222 STSR_REG(FEIC, 0, feic);
223
224#else /* __v850e3v5__ */
225#error please define ether __v850e2v3__ or __v850e3v5__
226#endif /* __v850e2v3__ */
227
228 switch(feic){
229 case FE_MIP: /* 実行保護違反例外 */
230 target_impu_exc_handler(NULL);
231 break;
232 case FE_MDP: /* データ保護違反例外 */
233 target_dmpu_exc_handler(NULL);
234 break;
235 default:
236 break;
237 }
238}
239
240#if 1
241/*
242 * 指定されたアドレスがユーザモード時に書込み可能かをチェックする
243 */
244#ifdef OMIT_PROBE_MEM_WRITE
245boolean
246probe_mem_write(const MemoryStartAddressType base, MemorySizeType size)
247{
248 uint32 sreg;
249 boolean ret;
250
251 /*
252 * 信頼OSAPならば任意のアドレスにアクセス可能
253 */
254 if(run_trusted != FALSE){
255 return TRUE;
256 }
257
258#ifdef __v850e2v3__
259 sreg = 0x00001000; /* プロセッサ保護違反バンク */
260 /*
261 * バンクをセット
262 */
263 LDSR_REG(BSEL, (sreg));
264 /*
265 * å…
266ˆé ­ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’MCAにセット
267 */
268 LDSR_REG(MCA, (uint32)base);
269
270 /*
271 * サイズをMCSにセット
272 */
273 LDSR_REG(MCS, (uint32)size);
274
275 /*
276 * メモリ保護設定チェック開始
277 */
278 LDSR_REG(MCC, 0U);
279
280 /*
281 * メモリ保護設定チェック結果を読み出す
282 */
283 STSR_REG(MCR, sreg);
284#elif __v850e3v5__
285 /*
286 * å…
287ˆé ­ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’MCAにセット
288 */
289 LDSR_REG(8, 5, (uint32)base);
290 /*
291 * サイズをMCSにセット
292 */
293 LDSR_REG(9, 5, (uint32)size);
294 /*
295 * メモリ保護設定チェック開始
296 */
297 LDSR_REG(10, 5, 0U);
298 /*
299 * メモリ保護設定チェック結果を読み出す
300 */
301 STSR_REG(11, 5, sreg);
302#else
303#error hoge!
304#endif
305
306 if(sreg & 0x00000100){
307 /* オーバフローの場合 */
308 ret = FALSE;
309 } else if(sreg & 0x00000004){
310 /* ライト許可の場合 */
311 ret = TRUE;
312 } else {
313 ret = FALSE;
314 }
315
316#ifdef __v850e2v3__
317 /*
318 * バンクを戻す
319 */
320 LDSR_REG(BSEL, 0U);
321#endif /* __v850e2v3__ */
322
323 return ret;
324}
325#endif /* OMIT_PROBE_MEM_WRITE */
326
327#ifdef __v850e2v3__
328/*
329 * 指定されたアドレスがユーザモード時に読込み可能かをチェックする
330 */
331#ifdef OMIT_PROBE_MEM_READ
332boolean
333probe_mem_read(const MemoryStartAddressType base, MemorySizeType size)
334{
335 uint32 sreg;
336 boolean ret;
337
338 /*
339 * 信頼OSAPならば任意のアドレスにアクセス可能
340 */
341 if(run_trusted != FALSE){
342 return TRUE;
343 }
344
345 sreg = 0x00001000; /* プロセッサ保護違反バンク */
346 /*
347 * バンクをセット
348 */
349 LDSR_REG(BSEL, sreg);
350
351 /*
352 * å…
353ˆé ­ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’MCAにセット
354 */
355 LDSR_REG(MCA, (uint32)base);
356
357 /*
358 * サイズをMCSにセット
359 */
360 LDSR_REG(MCS, (uint32)size);
361
362 /*
363 * メモリ保護設定チェック開始
364 */
365 LDSR_REG(MCC, (uint32)size);
366
367 /*
368 * メモリ保護設定チェック結果を読み出す
369 */
370 STSR_REG(MCR, sreg);
371
372 if(sreg & 0x00000100){
373 /* オーバフローの場合 */
374 ret = FALSE;
375 } else if(sreg & 0x00000002){
376 /* リード許可の場合 */
377 ret = TRUE;
378 } else {
379 ret = FALSE;
380 }
381
382 /*
383 * バンクを戻す
384 */
385 LDSR_REG(BSEL, 0U);
386
387 return ret;
388}
389#endif /* OMIT_PROBE_MEM_READ */
390
391/*
392 * 指定された領域がユーザスタック領域に収まっているかをチェックする
393 */
394#ifdef OMIT_PROBE_STACK
395
396boolean
397probe_stack(const void *base, MemorySizeType size)
398{
399 uint32 sreg;
400 boolean ret;
401
402 sreg = 0x00001000; /* プロセッサ保護違反バンク */
403 /*
404 * バンクをセット
405 */
406 LDSR_REG(BSEL, sreg);
407
408 /*
409 * å…
410ˆé ­ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’MCAにセット
411 */
412 LDSR_REG(MCA, (uint32)base);
413
414 /*
415 * サイズをMCSにセット
416 */
417 LDSR_REG(MCS, (uint32)size);
418
419 /*
420 * メモリ保護設定チェック開始
421 */
422 LDSR_REG(MCC, 0U);
423
424 /*
425 * メモリ保護設定チェック結果を読み出す
426 */
427 STSR_REG(MCR, sreg);
428
429 if(sreg & 0x00000100){
430 /* オーバフローの場合 */
431 ret = FALSE;
432 } else if(sreg & 0x00000010){
433 /* スタックの場合 */
434 ret = TRUE;
435 } else {
436 ret = FALSE;
437 }
438
439 /*
440 * バンクを戻す
441 */
442 LDSR_REG(BSEL, 0U);
443
444
445 return ret;
446}
447#endif /* OMIT_PROBE_STACK */
448#endif /* __v850e2v3__ */
449#endif
450
451AccessType
452probe_trusted_osap_mem(const MemoryStartAddressType sadr, const MemoryStartAddressType eadr)
453{
454 /*
455 * 信頼OSAPならば任意のアドレスにアクセス可能
456 */
457 return(AP_Executable|AP_Readable|AP_Writable);
458}
459
Note: See TracBrowser for help on using the repository browser.