source: azure_iot_hub_riscv/trunk/asp_baseplatform/monitor/arch/sh2.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: 10.5 KB
Line 
1/*
2 * TOPPERS/ASP Educative Program
3 * Toyohashi Open Platform for Embedded Real-Time Systems/
4 * Just Standard Profile Kernel
5 *
6 * Copyright (C) 2003-2008 by Ryosuke Takeuchi
7 * GJ Business Division RICOH COMPANY,LTD. JAPAN
8 *
9 * 上記著作権者は,Free Software Foundation によって公表されている
10 * GNU General Public License の Version 2 に記述されている条件か,以
11 * 下の(1)~(4)の条件を満たす場合に限り,本ソフトウェア(本ソフトウェ
12 * アを改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下,
13 * 利用と呼ぶ)することを無償で許諾する.
14 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
15 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
16 * スコード中に含まれていること.
17 * (2) 本ソフトウェアを再利用可能なバイナリコード(リロケータブルオブ
18 * ジェクトファイルやライブラリなど)の形で利用する場合には,利用
19 * に伴うドキュメント(利用者マニュアルなど)に,上記の著作権表示,
20 * この利用条件および下記の無保証規定を掲載すること.
21 * (3) 本ソフトウェアを再利用不可能なバイナリコードの形または機器に組
22 * み込んだ形で利用する場合には,次のいずれかの条件を満たすこと.
23 * (a) 利用に伴うドキュメント(利用者マニュアルなど)に,上記の著作
24 * 権表示,この利用条件および下記の無保証規定を掲載すること.
25 * (b) 利用の形態を,別に定める方法によって,上記著作権者に報告する
26 * こと.
27 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
28 * 害からも,上記著作権者を免責すること.
29 *
30 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者は,
31 * 本ソフトウェアに関して,その適用可能性も含めて,いかなる保証も行わ
32 * ない.また,本ソフトウェアの利用により直接的または間接的に生じたい
33 * かなる損害に関しても,その責任を負わない.
34 *
35 * @(#) $Id$
36 */
37
38/*
39 * TOPPERS/ASP用タスクモニタCPU依存プログラム.
40 *
41 */
42
43#include <itron.h>
44#include <sil.h>
45#include <stdio.h>
46#include "kernel_impl.h"
47#include "task.h"
48#include "task_expansion.h"
49#ifdef SUPPORT_ETHER
50#include "netdevice.h"
51#endif
52#include "monitor.h"
53
54extern void _kernel_break_wait();
55#ifdef SUPPORT_ETHER
56extern unsigned long vectors[];
57#endif
58
59#define set_align(a, b) ((UW)a & ~(b-1))
60
61/*
62 * レジスタの構造体
63 */
64typedef struct t_reg{
65 uint32_t gbr;
66 uint32_t macl;
67 uint32_t mach;
68 uint32_t r14;
69 uint32_t r13;
70 uint32_t r12;
71 uint32_t r11;
72 uint32_t r10;
73 uint32_t r9;
74 uint32_t r8;
75 uint32_t pr;
76 uint32_t r7;
77 uint32_t r6;
78 uint32_t r5;
79 uint32_t r4;
80 uint32_t r3;
81 uint32_t r2;
82 uint32_t r1;
83 uint32_t r0;
84 uint32_t pc;
85 uint32_t sr;
86}T_REG;
87
88/*
89 * メモリのマッピング定義構造体
90 */
91
92typedef struct t_memdef{
93 uint32_t mstart;
94 uint32_t mend;
95 uint8_t mtype;
96 uint8_t mstate;
97}T_MEMDEF;
98
99/*
100 * SH2のメモリマッピング
101 */
102
103static T_MEMDEF const memdefine[] = {
104#if defined(HSB7616IT)
105 {0x00000000, 0x0001FFFF, MEMORY_AREA, MREAD_ONLY },
106 {0x02000000, 0x021FFFFF, MEMORY_AREA, MREAD_ONLY },
107 {0x04000000, 0x040FFFFF, MEMORY_AREA, MREAD_WRITE},
108 {0xFFFFE000, 0xFFFFFFFF, PORT_AREA, MREAD_WRITE}
109#elif defined(MS72060SEP01)
110 {0x00000000, 0x001FFFFF, MEMORY_AREA, MREAD_ONLY },
111 {0x01000000, 0x01FFFFFF, MEMORY_AREA, MREAD_ONLY },
112 {0x0C000000, 0x0FFFFFFF, MEMORY_AREA, MREAD_WRITE},
113 {0x10000000, 0xFFF7FFFF, PORT_AREA, MREAD_WRITE},
114 {0xFFF80000, 0xFFF9FFFF, MEMORY_AREA, MREAD_WRITE},
115 {0xFFFA0000, 0xFFFFFFFF, PORT_AREA, MREAD_WRITE}
116#elif defined(CRB_H3)
117 {0x00000000, 0x0003FFFF, MEMORY_AREA, MREAD_ONLY },
118 {0x00200000, 0x0021FFFF, MEMORY_AREA, MREAD_WRITE},
119 {0x00220000, 0x0022FFFF, MEMORY_AREA, MREAD_ONLY },
120 {0x00230000, 0x0023FFFF, PORT_AREA, MREAD_WRITE},
121 {0xFFF00000, 0xFFFCFFFF, PORT_AREA, MREAD_WRITE},
122 {0xFFFD0000, 0xFFFFFFFF, MEMORY_AREA, MREAD_WRITE}
123#else
124#error "No board type in SH2 groups."
125#endif
126};
127
128static T_REG sreg;
129
130/******************************************************************************
131 * ハードウェアポート属性参照関数
132 ******************************************************************************/
133/*
134 * アドレスからメモリ領域属性を取り出す
135 * mode=0:領域の型
136 * mode=1:読み取り書き込み属性
137 */
138
139char
140getMemoryType(ulong_t address, int_t mode)
141{
142 int_t count = sizeof(memdefine) / sizeof(T_MEMDEF);
143 int_t i;
144
145 for(i = 0 ; i < count ; i++){
146 if(address >= memdefine[i].mstart && address <= memdefine[i].mend){
147 if(mode == 0)
148 return memdefine[i].mtype;
149 else
150 return memdefine[i].mstate;
151 }
152 }
153 return NONE_AREA;
154}
155
156/*
157 * アドレスからアライン後のアドレスを取り出す
158 */
159
160ulong_t
161MonAlignAddress(ulong_t address)
162{
163 return address;
164}
165
166/******************************************************************************
167 * メモリアクセス用関数
168 ******************************************************************************/
169/*
170 * メモリ領域に対する読み出し関数
171 * 領域のチェックを行い、エラーならゼロを返す
172 */
173int_t
174MemoryRead(ulong_t address, intptr_t p, int_t type)
175{
176 int_t len;
177
178 switch(getMemoryType(address, 0)){
179 case PORT_AREA:
180 if(type == 2){
181 len = 2;
182#ifdef SUPPORT_ETHER
183 if(!NetDeviceRead((unsigned long)address, len, (void *)p))
184#endif
185 *((UH *)p) = sil_reh_mem((VP)address);
186 }
187 else if(type == 4){
188 len = 4;
189#ifdef SUPPORT_ETHER
190 if(!NetDeviceRead((unsigned long)address, len, (void *)p))
191#endif
192 *((UW *)p) = sil_rew_mem((VP)address);
193 }
194 else{
195#ifdef SUPPORT_ETHER
196 len = 1;
197 if(!NetDeviceRead((unsigned long)address, len, (void *)p))
198 *((UB *)p) = sil_reb_mem((VP)address);
199#else
200 len = 1;
201 *((UB *)p) = sil_reb_mem((VP)address);
202#endif
203 }
204 break;
205 case MEMORY_AREA:
206 if(type == 2){
207 len = 2;
208 *((UH *)p) = *((UH *)set_align(address, len));
209 }
210 else if(type == 4){
211 len = 4;
212 *((UW *)p) = *((UW *)set_align(address, len));
213 }
214 else{
215 len = 1;
216 *((UB *)p) = *((UB *)address);
217 }
218 break;
219 default:
220 len = 0;
221 break;
222 }
223 return len;
224}
225
226/*
227 * メモリ領域に対する書き込み関数
228 * 領域のチェックを行い、エラーならゼロを返す
229 */
230int_t
231MemoryWrite(ulong_t address, intptr_t p, int_t type)
232{
233 int_t len;
234
235 switch(getMemoryType(address, 0)){
236 case PORT_AREA:
237 if(type == 2){
238 len = 2;
239 address = set_align(address, len);
240#ifdef SUPPORT_ETHER
241 if(!NetDeviceWrite((unsigned long)address, len, (void *)p))
242#endif
243 sil_wrh_mem((VP)address, *((UH *)p));
244 }
245 else if(type == 4){
246 len = 4;
247 address = set_align(address, len);
248#ifdef SUPPORT_ETHER
249 if(!NetDeviceWrite((unsigned long)address, len, (void *)p))
250#endif
251 sil_wrw_mem((VP)address, *((UW *)p));
252 }
253 else{
254#ifdef SUPPORT_ETHER
255 len = 1;
256 if(!NetDeviceWrite((unsigned long)address, len, (void *)p))
257 sil_wrb_mem((VP)address, *((UB *)p));
258#else
259 len = 1;
260 sil_wrb_mem((VP)address, *((UB *)p));
261#endif
262 }
263 break;
264 case MEMORY_AREA:
265 if(getMemoryType(address, 1) == MREAD_ONLY){
266 len = 0;
267 }
268 else if(type == 2){
269 len = 2;
270 *((UH *)address) = *((UH *)set_align(p, len));
271 }
272 else if(type == 4){
273 len = 4;
274 *((UW *)address) = *((UW *)set_align(p, len));
275 }
276 else{
277 len = 1;
278 *((UB *)address) = *((UB *)p);
279 }
280 break;
281 default:
282 len = 0;
283 break;
284 }
285 return len;
286}
287
288/******************************************************************************
289 * モニタ用関数
290 ******************************************************************************/
291/*
292 * エクセプションの引数よりpcを取り出す関数
293 */
294ulong_t
295get_exception_pc(void * p_excinf)
296{
297 ulong_t pc;
298
299 pc = *(ulong_t*)((char*)p_excinf-4);
300 return pc;
301}
302
303/*
304 * レジスタ内容の表示
305 */
306void
307display_registers(ID tskid)
308{
309 ER ercd;
310 T_RTST rtst;
311
312 ercd = ref_tst(tskid, &rtst);
313 if(ercd == E_OK){
314 if(rtst.tskpc == (FP)_kernel_break_wait){
315 sreg = *((T_REG *)rtst.tsksp);
316 printf(" PC =%08lx SP =%08x PR =%08x", (long)sreg.pc, (UW)((long)rtst.tsksp+sizeof(T_REG)), sreg.pr);
317 printf(" SR =%08x MBH=%08x MBL=%08x\n", sreg.sr, sreg.mach, sreg.macl);
318 printf(" R0 =%08x R1 =%08x R2 =%08x", sreg.r0, sreg.r1, sreg.r2);
319 printf(" R3 =%08x R4 =%08x R5 =%08x\n", sreg.r3, sreg.r4, sreg.r5);
320 printf(" R6 =%08x R7 =%08x R8 =%08x", sreg.r6, sreg.r7, sreg.r8);
321 printf(" R9 =%08x R10=%08x R11=%08x\n", sreg.r9, sreg.r10, sreg.r11);
322 printf(" R12=%08x R13=%08x R14=%08x\n", sreg.r12, sreg.r13, sreg.r14);
323 printf(" %08lx %02x %02x\n", (long)sreg.pc, *((UB*)sreg.pc), *((UB*)(sreg.pc+1)));
324 return;
325 }
326 else if(rtst.tskstat == TTS_DMT){
327 printf(" wait in activate_r() !!\n");
328 return;
329 }
330 }
331 printf(" wait in dispatch() !!\n");
332}
333
334/******************************************************************************
335 * エラー通知用関数
336 ******************************************************************************/
337/*
338 * イレギュラーエクセプション
339 */
340static void
341irregular_ext_handler(void *p_excinf, const char *s)
342{
343 uint32_t pc = get_exception_pc(p_excinf);
344
345 if(runtsk){
346 if(exc_sense_context(p_excinf)){
347 syslog_3(LOG_EMERG, "Irregular Exception(%s) occured in not task Context pc=0x%x p_excinf=0x%x !", s, pc, p_excinf);
348 kernel_exit();
349 }
350 else{
351 syslog_4(LOG_ERROR, "Irregular Exception(%s) occured in tskid=%d pc=0x%x p_excinf=0x%x !", s, TSKID(runtsk), pc, p_excinf);
352 isus_tsk(TSKID(runtsk));
353 }
354 }
355 else{
356 syslog_3(LOG_EMERG, "Irregular Exception(%s) occured in Idle pc=0x%x p_excinf=0x%x !", s, pc, p_excinf);
357 kernel_exit();
358 }
359}
360
361/*
362 * 一般不当命令:General Illegal Instruction
363 */
364void
365irregular_extgii_handler(void * p_excinf)
366{
367 irregular_ext_handler(p_excinf, "GII");
368}
369
370/*
371 * スロット不当命令:Slot Illegal Instruction
372 */
373void
374irregular_extsii_handler(void * p_excinf)
375{
376 irregular_ext_handler(p_excinf, "SII");
377}
378
379/*
380 * CPUアドレスエラー:CPU Address Error
381 */
382void
383irregular_extcae_handler(void * p_excinf)
384{
385 irregular_ext_handler(p_excinf, "CAE");
386}
387
388/*
389 * DMAアドレスエラー:DMA Address Error
390 */
391void
392irregular_extdae_handler(void * p_excinf)
393{
394 irregular_ext_handler(p_excinf, "DAE");
395}
396
Note: See TracBrowser for help on using the repository browser.