source: azure_iot_hub_riscv/trunk/asp_baseplatform/arch/riscv_gcc/prc_config.c@ 453

Last change on this file since 453 was 453, checked in by coas-nagasima, 4 years ago

ファイルを追加

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-csrc;charset=UTF-8
File size: 8.0 KB
Line 
1/*
2 * TOPPERS/ASP Kernel
3 * Toyohashi Open Platform for Embedded Real-Time Systems/
4 * Advanced Standard Profile Kernel
5 *
6 * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
7 * Toyohashi Univ. of Technology, JAPAN
8 * Copyright (C) 2005-2009 by Embedded and Real-Time Systems Laboratory
9 * Graduate School of Information Science, Nagoya Univ., JAPAN
10 * Copyright (C) 2017-2019 by TOPPERS PROJECT Educational Working Group.
11 *
12 * 上記著作権者は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ
13 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
14 * 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
15 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
16 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
17 * スコード中に含まれていること.
18 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
19 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
20 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
21 * の無保証規定を掲載すること.
22 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
23 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
24 * と.
25 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
26 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
27 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
28 * 報告すること.
29 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
30 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
31 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
32 * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
33 * 免責すること.
34 *
35 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
36 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
37 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
38 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
39 * の責任を負わない.
40 *
41 * @(#) $Id$
42 */
43
44/*
45 * プロセッサ依存モジュール(RISC-V用)
46 */
47
48#include "kernel_impl.h"
49#include "check.h"
50#include "task.h"
51
52/*
53 * CPUロックフラグ実現のための変数
54 */
55volatile bool_t lock_flag; /* CPUロックフラグの値を保持する変数 */
56volatile uint16_t inest_lvl; /* 割込みネストを保存する変数 */
57volatile unsigned long kernel_mie; /* デフォルトのMIE値を保存する変数 */
58static unsigned long saved_trap; /* MACHINE TRAPデータの保存変数 */
59
60/*
61 * MACHINE割込みハンドラ領域のテーブル
62 */
63volatile EXCVE m_interrupt_handlers[TMAX_MACHNE_INTNO];
64
65
66#ifndef OMIT_DEFAULT_INT_HANDLER
67/*
68 * 未登録の割込みが発生した場合に呼び出される
69 */
70static void
71default_int_handler(unsigned long mcause, void *p_excinf)
72{
73 unsigned long mstatus = *(((uintptr_t*)p_excinf) + P_EXCINF_OFFSET_MSTATUS);
74 uintptr_t pc = *(((uintptr_t*)p_excinf) + P_EXCINF_OFFSET_PC);
75 unsigned long excno = mcause & MCAUSE_CAUSE;
76
77 if((long)mcause < 0)
78 excno += TMAX_MACHNE_INTNO / 2;
79
80 switch (excno) {
81 case EXC_INSTRUCTION_ADDRESS_MISALIGNED:
82 syslog(LOG_EMERG, "\nUnregistered instruction address misaligned occurs.");
83 break;
84 case EXC_INSTRUCTION_ADDRESS_FAULT:
85 syslog(LOG_EMERG, "\nUnregistered instruction address fault occurs.");
86 break;
87 case EXC_ILLEGAL_INSTRUCTION:
88 syslog(LOG_EMERG, "\nUnregistered illegal instruction occurs.");
89 break;
90 case EXC_BREAKPOINT:
91 syslog(LOG_EMERG, "\nUnregistered breakpoint occurs.");
92 break;
93 case EXC_LOAD_ADDRESS_MISALIGNED:
94 syslog(LOG_EMERG, "\nUnregistered load address misaligned occurs.");
95 break;
96 case EXC_LOAD_ADDRESS_FAULT:
97 syslog(LOG_EMERG, "\nUnregistered load address fault occurs.");
98 break;
99 case EXC_STORE_AMO_ADDRESS_MISALIGNED:
100 syslog(LOG_EMERG, "\nUnregistered store AMO address misaligned occurs.");
101 break;
102 case EXC_STORE_AMO_ACCESS_FAUT:
103 syslog(LOG_EMERG, "\nUnregistered store AMO access faut occurs.");
104 break;
105 case EXC_ENVIRONMENT_CALL_FROM_MMODE:
106 syslog(LOG_EMERG, "\nUnregistered environment call from MMODE occurs.");
107 break;
108 default:
109 syslog(LOG_EMERG, "\nUnregistered Interrupt occurs.");
110 break;
111 }
112
113 syslog(LOG_EMERG, "Excno = 0x%02X, PC = 0x%X, mstatus = 0x%X, p_excinf = 0x%X",
114 excno, pc, mstatus, p_excinf);
115
116 target_exit();
117}
118#endif /* OMIT_DEFAULT_INT_HANDLER */
119
120/*
121 * プロセッサ依存の初期化
122 */
123void
124prc_initialize(void)
125{
126 extern void software_init_hook(void);
127 void (*volatile fp)(void) = software_init_hook;
128 int i;
129
130 /*
131 * software_init_hookへのポインタを,一旦volatile指定のあるfpに代
132 * 入してから使うのは,0との比較が最適化で削除されないようにするた
133 * めである.
134 */
135 if (fp != 0) {
136 (*fp)();
137 }
138
139 /*
140 * CPUロックフラグ実現のための変数の初期化
141 */
142 lock_flag = true;
143 kernel_mie = KERNEL_MIE;
144 clear_csr(mie, KERNEL_MIE);
145 set_csr(mie, MIP_MSIP);
146 inest_lvl = 0;
147
148 /*
149 * 例外ベクタテーブルの初期化
150 */
151#ifndef OMIT_DEFAULT_INT_HANDLER
152 for(i = 0 ; i < TMAX_MACHNE_INTNO ; i++){
153 m_interrupt_handlers[i].exc_handler = (FP)default_int_handler;
154 }
155#endif
156 saved_trap = read_csr(mtvec);
157 write_csr(mtvec, &trap_entry);
158 ena_intm();
159
160 /*
161 * FPU拡張の初期化
162 */
163 if(read_csr(misa) & (1 << ('F' - 'A'))){
164 set_csr(mstatus, MSTATUS_FS); /* FPU設定、但し割込みはサポートしない */
165 write_csr(fcsr, 0); /* ラウンディングモード設定 */
166 }
167
168 (void)(i);
169}
170
171/*
172 * プロセッサ依存の終了処理
173 */
174void
175prc_terminate(void)
176{
177 extern void software_term_hook(void);
178 void (*volatile fp)(void) = software_term_hook;
179
180 /*
181 * software_term_hookへのポインタを,一旦volatile指定のあるfpに代
182 * 入してから使うのは,0との比較が最適化で削除されないようにするた
183 * めである.
184 */
185 if (fp != 0) {
186 (*fp)();
187 }
188
189 write_csr(mtvec, saved_trap);
190}
191
192/*
193 * C言語レベル MACHINE割込みハンドラ
194 */
195uint32_t
196handle_trap(unsigned long mcause, void *p_excinf)
197{
198 uint32_t intno = mcause & MCAUSE_CAUSE;
199 void (*func)(unsigned long, void *);
200
201 if(inest_lvl++ == 0)
202 write_csr(mtvec, &trap_nest);
203 if((long)mcause < 0)
204 intno += TMAX_MACHNE_INTNO / 2;
205 if(intno < TMAX_MACHNE_INTNO){
206 func = (void(*)(unsigned long, void *))m_interrupt_handlers[intno].exc_handler;
207 if(func != NULL)
208 func(mcause, p_excinf);
209 }
210 else{
211 syslog_1(LOG_EMERG, "Irrigal machine Exception mcause = %08X", (int)intno);
212 }
213 if(--inest_lvl == 0)
214 write_csr(mtvec, &trap_entry);
215 return inest_lvl;
216}
217
218/*
219 * CPU例外の発生状況のログ出力
220 *
221 * CPU例外ハンドラの中から,CPU例外情報ポインタ(p_excinf)を引数とし
222 * て呼び出すことで,CPU例外の発生状況をシステムログに出力する.
223 */
224#ifdef SUPPORT_XLOG_SYS
225
226void
227xlog_sys(void *p_excinf)
228{
229 unsigned long *excsp = (unsigned long *) p_excinf;
230
231 syslog_0(LOG_ERROR, "CPU Exception Information:");
232 syslog_4(LOG_ERROR, "mstatus = %08x PC = %x mcause = %x STACK = %x",
233 *((excsp + P_EXCINF_OFFSET_MSTATUS)),
234 *((excsp + P_EXCINF_OFFSET_PC)),
235 *((excsp + P_EXCINF_OFFSET_MCAUSE)),
236 ((unsigned long)excsp + 19 * 4));
237 syslog_1(LOG_ERROR, "p_excinf = %x", (unsigned long)excsp);
238}
239
240#endif /* SUPPORT_XLOG_SYS */
Note: See TracBrowser for help on using the repository browser.