- Timestamp:
- Jul 3, 2020, 7:19:17 PM (4 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
EcnlProtoTool/trunk/asp3_dcre/arch/arm_gcc/common/core_test.h
r321 r429 4 4 * Advanced Standard Profile Kernel 5 5 * 6 * Copyright (C) 2006-201 6by Embedded and Real-Time Systems Laboratory6 * Copyright (C) 2006-2019 by Embedded and Real-Time Systems Laboratory 7 7 * Graduate School of Information Science, Nagoya Univ., JAPAN 8 8 * … … 36 36 * の責任を負わない. 37 37 * 38 * $Id $38 * $Id: core_test.h 1244 2019-07-16 21:41:05Z ertl-hiro $ 39 39 */ 40 40 … … 54 54 55 55 /* 56 * CPU例外の発生56 * 不正アドレスの定義(メモリのない番地に設定する) 57 57 */ 58 59 58 #ifndef ILLEGAL_IADDR 60 59 #define ILLEGAL_IADDR 0xd0000000U /* 不正命令アドレス */ … … 66 65 67 66 /* 67 * サンプルプログラムで用いるCPU例外の発生 68 */ 69 #if defined(USE_CPUEXC_SVC) 70 71 #define CPUEXC1 EXCNO_SVC /* スーパバイザコール */ 72 #define RAISE_CPU_EXCEPTION RAISE_CPU_EXCEPTION_SVC 73 #define PREPARE_RETURN_CPUEXC PREPARE_RETURN_CPUEXC_SVC 74 75 #elif defined(USE_CPUEXC_PABORT) 76 77 #define CPUEXC1 EXCNO_PABORT /* プリフェッチアボート */ 78 #define RAISE_CPU_EXCEPTION RAISE_CPU_EXCEPTION_PABORT 79 #define PREPARE_RETURN_CPUEXC PREPARE_RETURN_CPUEXC_PABORT 80 81 #elif defined(USE_CPUEXC_DABORT) 82 83 #define CPUEXC1 EXCNO_DABORT /* データアボート */ 84 #define RAISE_CPU_EXCEPTION RAISE_CPU_EXCEPTION_DABORT 85 #define PREPARE_RETURN_CPUEXC PREPARE_RETURN_CPUEXC_DABORT 86 87 #elif defined(USE_CPUEXC_FATAL) 88 89 #define CPUEXC1 EXCNO_FATAL /* フェイタルデータアボート */ 90 #define RAISE_CPU_EXCEPTION RAISE_CPU_EXCEPTION_FATAL 91 /* フェイタルデータアボート例外ハンドラからリターンしてはならない */ 92 93 #else 94 95 #define CPUEXC1 EXCNO_UNDEF /* 未定義命令 */ 96 #define RAISE_CPU_EXCEPTION RAISE_CPU_EXCEPTION_UNDEF 97 #define PREPARE_RETURN_CPUEXC PREPARE_RETURN_CPUEXC_UNDEF 98 99 #endif 100 101 /* 68 102 * スーパバイザコールによるCPU例外の発生 69 103 * 70 * CPU例外ハンドラから,そのままリターンすることができる.svc命令によ 71 * りlrレジスタが上書きされるため,lrレジスタは破壊されるものと指定し 72 * ている. 104 * svc #0によりCPU例外を発生させる.svc命令によりlrレジスタが上書きさ 105 * れるため,lrレジスタは破壊されるものと指定している.CPU例外ハンド 106 * ラからそのままリターンすることで,svc命令の次の命令から実行が継続 107 * する. 73 108 */ 74 #if defined(USE_SVC_CPUEXC) 75 76 #define CPUEXC1 EXCNO_SVC /* スーパバイザコール */ 77 #define RAISE_CPU_EXCEPTION Asm("svc #0":::"lr") 78 #define PREPARE_RETURN_CPUEXC 109 #define RAISE_CPU_EXCEPTION_SVC Asm("svc #0":::"lr") 110 #define PREPARE_RETURN_CPUEXC_SVC 79 111 80 112 /* 81 113 * プリフェッチアボートによるCPU例外の発生 82 114 * 83 * プリフェッチアボートを起こした命令をスキップしてCPU例外ハンドラから 84 * リターンするために,戻り番地はそのままで良い(ARMモードで使うことを 85 * 想定). 115 * 不正な番地を関数の先頭番地として呼び出すことで,プリフェッチアボー 116 * トによるCPU例外を発生させる.不正な番地に分岐した命令をスキップし 117 * てCPU例外ハンドラからリターンするために,戻り番地には,lrレジスタ 118 * の値(不正な番地への分岐命令からのリターン番地が入っている)を設定 119 * する. 86 120 */ 87 #elif defined(USE_PABORT_CPUEXC) 88 89 #define CPUEXC1 EXCNO_PABORT /* プリフェッチアボート */ 90 #define RAISE_CPU_EXCEPTION ((void (*)(void)) ILLEGAL_IADDR)() 91 #define PREPARE_RETURN_CPUEXC 121 #define RAISE_CPU_EXCEPTION_PABORT (((void (*)(void)) ILLEGAL_IADDR)()) 122 #define PREPARE_RETURN_CPUEXC_PABORT (((T_EXCINF *) p_excinf)->pc \ 123 = ((T_EXCINF *) p_excinf)->lr) 92 124 93 125 /* 94 126 * データアボートによるCPU例外の発生 95 127 * 96 * データアボートを起こした命令をスキップしてCPU例外ハンドラからリター 97 * ンするために,戻り番地から4を減算する(ARMモードで使うことを想定). 128 * 不正な番地をリードすることで,データアボートによるCPU例外を発生さ 129 * せる.データアボートを起こした命令をスキップしてCPU例外ハンドラか 130 * らリターンするために,戻り番地から4を減算する(ARMモードで使うこと 131 * を想定している). 98 132 */ 99 #elif defined(USE_DABORT_CPUEXC) 100 101 #include "arm.h" 102 #define CPUEXC1 EXCNO_DABORT /* データアボート */ 103 #define RAISE_CPU_EXCEPTION (void)(*((volatile uint32_t *) ILLEGAL_DADDR)) 104 #define PREPARE_RETURN_CPUEXC ((T_EXCINF *) p_excinf)->pc -= 4U 133 #define RAISE_CPU_EXCEPTION_DABORT (void)(*((volatile uint32_t *) \ 134 ILLEGAL_DADDR)) 135 #define PREPARE_RETURN_CPUEXC_DABORT (((T_EXCINF *) p_excinf)->pc -= 4U) 105 136 106 137 /* 107 * フェイタルデータアボート 処理138 * フェイタルデータアボートによるCPU例外の発生 108 139 * 109 * スタックポインタを不正にして,フェイタルデータアボート処理を行わせ 110 * る.CPU例外ハンドラからはリターンできない. 140 * スタックポインタを不正にして,未定義命令を実行することで,フェイタ 141 * ルデータアボートによるCPU例外を発生させる.CPU例外ハンドラからリター 142 * ンしてはならない. 111 143 */ 112 #elif defined(USE_FATAL_DABORT_CPUEXC) 113 114 #define CPUEXC1 EXCNO_DABORT /* データアボート */ 115 #define RAISE_CPU_EXCEPTION Asm("mov sp, %0"::"I"(ILLEGAL_DADDR)) 144 #define RAISE_CPU_EXCEPTION_FATAL Asm("mov sp, %0\n" \ 145 "\t.word 0xf0500090" \ 146 ::"I"(ILLEGAL_DADDR)) 116 147 117 148 /* 118 149 * 未定義命令によるCPU例外の発生 119 150 * 120 * RAISE_CPU_EXCEPTIONは,ARMモードで使うことを想定している.CPU例外ハ 121 * ンドラから,そのままリターンすることができる.使用している未定義命 122 * 令は,"Multiply and multiply accumulate"命令群のエンコーディング内 123 * における未定義命令である. 151 * 未定義命令によりCPU例外を発生させる.使用している未定義命令は, 152 * "Multiply and multiply accumulate"命令群のエンコーディング内におけ 153 * る未定義命令である.CPU例外ハンドラからそのままリターンすることで, 154 * 未定義命令の次の命令から実行が継続する(ARMモードで使うことを想定 155 * している). 124 156 */ 125 #else 157 #define RAISE_CPU_EXCEPTION_UNDEF Asm(".word 0xf0500090") 158 #define PREPARE_RETURN_CPUEXC_UNDEF 126 159 127 #define CPUEXC1 EXCNO_UNDEF /* 未定義命令 */128 #define RAISE_CPU_EXCEPTION Asm(".word 0xf0500090")129 #define PREPARE_RETURN_CPUEXC130 131 #endif132 160 #endif /* TOPPERS_CORE_TEST_H */
Note:
See TracChangeset
for help on using the changeset viewer.