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

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

Azure IoT への送信内容を、検出したpersonとcarの数を送信するよう変更。
Azure IoT CentralからLEDのON/OFFが出来るよう更新。

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-csrc;charset=UTF-8
File size: 11.3 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 uintptr_t sp0 = *(((uintptr_t*)p_excinf) + P_EXCONF_OFFSET_SP);
76 uintptr_t sp1 = *(((uintptr_t*)p_excinf) + P_EXCONF_OFFSET_SP + 1);
77 unsigned long excno = mcause & MCAUSE_CAUSE;
78 static int count = 0;
79
80 if (count == 0) {
81 count++;
82
83 if((long)mcause < 0)
84 excno += TMAX_MACHNE_INTNO / 2;
85
86 switch (excno) {
87 case EXC_INSTRUCTION_ADDRESS_MISALIGNED:
88 syslog_0(LOG_EMERG, "\nUnregistered instruction address misaligned occurs.");
89 break;
90 case EXC_INSTRUCTION_ADDRESS_FAULT:
91 syslog_0(LOG_EMERG, "\nUnregistered instruction address fault occurs.");
92 break;
93 case EXC_ILLEGAL_INSTRUCTION:
94 syslog_0(LOG_EMERG, "\nUnregistered illegal instruction occurs.");
95 break;
96 case EXC_BREAKPOINT:
97 syslog_0(LOG_EMERG, "\nUnregistered breakpoint occurs.");
98 break;
99 case EXC_LOAD_ADDRESS_MISALIGNED:
100 syslog_0(LOG_EMERG, "\nUnregistered load address misaligned occurs.");
101 break;
102 case EXC_LOAD_ADDRESS_FAULT:
103 syslog_0(LOG_EMERG, "\nUnregistered load address fault occurs.");
104 break;
105 case EXC_STORE_AMO_ADDRESS_MISALIGNED:
106 syslog_0(LOG_EMERG, "\nUnregistered store AMO address misaligned occurs.");
107 break;
108 case EXC_STORE_AMO_ACCESS_FAUT:
109 syslog_0(LOG_EMERG, "\nUnregistered store AMO access faut occurs.");
110 break;
111 case EXC_ENVIRONMENT_CALL_FROM_MMODE:
112 syslog_0(LOG_EMERG, "\nUnregistered environment call from MMODE occurs.");
113 break;
114 default:
115 syslog_0(LOG_EMERG, "\nUnregistered Interrupt occurs.");
116 break;
117 }
118
119 syslog_4(LOG_EMERG, "Excno = 0x%02X, PC = 0x%X, mstatus = 0x%X, p_excinf = 0x%X",
120 excno, pc, mstatus, p_excinf);
121
122 syslog_3(LOG_EMERG, "SP0 = 0x%X, SP1 = 0x%X, runtsk = 0x%X", sp0, sp1, p_runtsk->p_tinib->task);
123
124 unsigned int *addr = (((unsigned int *)p_excinf) + P_EXCONF_OFFSET_SP + 3);
125 syslog_5(LOG_EMERG, "a0%x:%08X%08X %08X%08X", 0, addr[0], addr[1], addr[2], addr[3]); addr+=4;
126 syslog_5(LOG_EMERG, "a0%x:%08X%08X %08X%08X", 2, addr[0], addr[1], addr[2], addr[3]); addr+=4;
127 syslog_5(LOG_EMERG, "a0%x:%08X%08X %08X%08X", 4, addr[0], addr[1], addr[2], addr[3]); addr+=4;
128 syslog_5(LOG_EMERG, "a0%x:%08X%08X %08X%08X", 6, addr[0], addr[1], addr[2], addr[3]); addr+=4;
129 syslog_5(LOG_EMERG, "a0%x:%08X%08X %08X%08X", 8, addr[0], addr[1], addr[2], addr[3]); addr+=4;
130 syslog_5(LOG_EMERG, "a1%x:%08X%08X %08X%08X", 0, addr[0], addr[1], addr[2], addr[3]); addr+=4;
131 syslog_5(LOG_EMERG, "a1%x:%08X%08X %08X%08X", 2, addr[0], addr[1], addr[2], addr[3]); addr+=4;
132 syslog_5(LOG_EMERG, "a1%x:%08X%08X %08X%08X", 4, addr[0], addr[1], addr[2], addr[3]); addr+=4;
133 syslog_5(LOG_EMERG, "a1%x:%08X%08X %08X%08X", 6, addr[0], addr[1], addr[2], addr[3]); addr+=4;
134 syslog_5(LOG_EMERG, "a1%x:%08X%08X %08X%08X", 8, addr[0], addr[1], addr[2], addr[3]); addr+=4;
135 syslog_5(LOG_EMERG, "a1%x:%08X%08X %08X%08X",10, addr[0], addr[1], addr[2], addr[3]); addr+=4;
136 syslog_5(LOG_EMERG, "a2%x:%08X%08X %08X%08X", 0, addr[0], addr[1], addr[2], addr[3]); addr+=4;
137 syslog_5(LOG_EMERG, "a2%x:%08X%08X %08X%08X", 2, addr[0], addr[1], addr[2], addr[3]); addr+=4;
138 syslog_5(LOG_EMERG, "a2%x:%08X%08X %08X%08X", 4, addr[0], addr[1], addr[2], addr[3]); addr+=4;
139 syslog_5(LOG_EMERG, "a2%x:%08X%08X %08X%08X", 6, addr[0], addr[1], addr[2], addr[3]); addr+=4;
140 syslog_5(LOG_EMERG, "a2%x:%08X%08X %08X%08X", 8, addr[0], addr[1], addr[2], addr[3]); addr+=4;
141 syslog_5(LOG_EMERG, "a2%x:%08X%08X %08X%08X",10, addr[0], addr[1], addr[2], addr[3]); addr+=4;
142
143 addr = (unsigned int *)((sp0 + 15) / 16);
144 syslog_5(LOG_EMERG, "%08X:%08X %08X %08X %08X", (unsigned int)&addr[-4], addr[-4], addr[-3], addr[-2], addr[-1]);
145 syslog_5(LOG_EMERG, "%08X:%08X %08X %08X %08X", (unsigned int)&addr[ 0], addr[ 0], addr[ 1], addr[ 2], addr[ 3]);
146 syslog_5(LOG_EMERG, "%08X:%08X %08X %08X %08X", (unsigned int)&addr[ 4], addr[ 4], addr[ 5], addr[ 6], addr[ 7]);
147 syslog_5(LOG_EMERG, "%08X:%08X %08X %08X %08X", (unsigned int)&addr[ 8], addr[ 8], addr[ 9], addr[10], addr[11]);
148 syslog_5(LOG_EMERG, "%08X:%08X %08X %08X %08X", (unsigned int)&addr[12], addr[12], addr[13], addr[14], addr[15]);
149
150 addr = (unsigned int *)((sp1 + 15) / 16);
151 syslog_5(LOG_EMERG, "%08X:%08X %08X %08X %08X", (unsigned int)&addr[-4], addr[-4], addr[-3], addr[-2], addr[-1]);
152 syslog_5(LOG_EMERG, "%08X:%08X %08X %08X %08X", (unsigned int)&addr[ 0], addr[ 0], addr[ 1], addr[ 2], addr[ 3]);
153 syslog_5(LOG_EMERG, "%08X:%08X %08X %08X %08X", (unsigned int)&addr[ 4], addr[ 4], addr[ 5], addr[ 6], addr[ 7]);
154 syslog_5(LOG_EMERG, "%08X:%08X %08X %08X %08X", (unsigned int)&addr[ 8], addr[ 8], addr[ 9], addr[10], addr[11]);
155 syslog_5(LOG_EMERG, "%08X:%08X %08X %08X %08X", (unsigned int)&addr[12], addr[12], addr[13], addr[14], addr[15]);
156 }
157
158 target_exit();
159}
160#endif /* OMIT_DEFAULT_INT_HANDLER */
161
162/*
163 * プロセッサ依存の初期化
164 */
165void
166prc_initialize(void)
167{
168 extern void software_init_hook(void);
169 void (*volatile fp)(void) = software_init_hook;
170 int i;
171
172 /*
173 * software_init_hookへのポインタを,一旦volatile指定のあるfpに代
174 * 入してから使うのは,0との比較が最適化で削除されないようにするた
175 * めである.
176 */
177 if (fp != 0) {
178 (*fp)();
179 }
180
181 /*
182 * CPUロックフラグ実現のための変数の初期化
183 */
184 lock_flag = true;
185 kernel_mie = KERNEL_MIE;
186 clear_csr(mie, KERNEL_MIE);
187 set_csr(mie, MIP_MSIP);
188 inest_lvl = 0;
189
190 /*
191 * 例外ベクタテーブルの初期化
192 */
193#ifndef OMIT_DEFAULT_INT_HANDLER
194 for(i = 0 ; i < TMAX_MACHNE_INTNO ; i++){
195 m_interrupt_handlers[i].exc_handler = (FP)default_int_handler;
196 }
197#endif
198 saved_trap = read_csr(mtvec);
199 write_csr(mtvec, &trap_entry);
200 ena_intm();
201
202 /*
203 * FPU拡張の初期化
204 */
205 if(read_csr(misa) & (1 << ('F' - 'A'))){
206 set_csr(mstatus, MSTATUS_FS); /* FPU設定、但し割込みはサポートしない */
207 write_csr(fcsr, 0); /* ラウンディングモード設定 */
208 }
209
210 (void)(i);
211}
212
213/*
214 * プロセッサ依存の終了処理
215 */
216void
217prc_terminate(void)
218{
219 extern void software_term_hook(void);
220 void (*volatile fp)(void) = software_term_hook;
221
222 /*
223 * software_term_hookへのポインタを,一旦volatile指定のあるfpに代
224 * 入してから使うのは,0との比較が最適化で削除されないようにするた
225 * めである.
226 */
227 if (fp != 0) {
228 (*fp)();
229 }
230
231 write_csr(mtvec, saved_trap);
232}
233
234/*
235 * C言語レベル MACHINE割込みハンドラ
236 */
237uint32_t
238handle_trap(unsigned long mcause, void *p_excinf)
239{
240 uint32_t intno = mcause & MCAUSE_CAUSE;
241 void (*func)(unsigned long, void *);
242
243 if(inest_lvl++ == 0)
244 write_csr(mtvec, &trap_nest);
245 if((long)mcause < 0)
246 intno += TMAX_MACHNE_INTNO / 2;
247 if(intno < TMAX_MACHNE_INTNO){
248 func = (void(*)(unsigned long, void *))m_interrupt_handlers[intno].exc_handler;
249 if(func != NULL)
250 func(mcause, p_excinf);
251 }
252 else{
253 syslog_1(LOG_EMERG, "Irrigal machine Exception mcause = %08X", (int)intno);
254 }
255 if(--inest_lvl == 0)
256 write_csr(mtvec, &trap_entry);
257 return inest_lvl;
258}
259
260/*
261 * CPU例外の発生状況のログ出力
262 *
263 * CPU例外ハンドラの中から,CPU例外情報ポインタ(p_excinf)を引数とし
264 * て呼び出すことで,CPU例外の発生状況をシステムログに出力する.
265 */
266#ifdef SUPPORT_XLOG_SYS
267
268void
269xlog_sys(void *p_excinf)
270{
271 unsigned long *excsp = (unsigned long *) p_excinf;
272
273 syslog_0(LOG_ERROR, "CPU Exception Information:");
274 syslog_4(LOG_ERROR, "mstatus = %08x PC = %x mcause = %x STACK = %x",
275 *((excsp + P_EXCINF_OFFSET_MSTATUS)),
276 *((excsp + P_EXCINF_OFFSET_PC)),
277 *((excsp + P_EXCINF_OFFSET_MCAUSE)),
278 ((unsigned long)excsp + 19 * 4));
279 syslog_1(LOG_ERROR, "p_excinf = %x", (unsigned long)excsp);
280}
281
282#endif /* SUPPORT_XLOG_SYS */
Note: See TracBrowser for help on using the repository browser.