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