source: azure_iot_hub_f767zi/trunk/asp_baseplatform/monitor/arch/riscv32.c@ 457

Last change on this file since 457 was 457, 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: 7.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) 2003-2016 by Ryosuke Takeuchi
7 * GJ Business Division RICOH COMPANY,LTD. JAPAN
8 * Copyright (C) 2017-2019 by TOPPERS PROJECT Educational Working Group.
9 *
10 * 上記著作権者は,Free Software Foundation によって公表されている
11 * GNU General Public License の Version 2 に記述されている条件か,以
12 * 下の(1)~(4)の条件を満たす場合に限り,本ソフトウェア(本ソフトウェ
13 * アを改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下,
14 * 利用と呼ぶ)することを無償で許諾する.
15 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
16 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
17 * スコード中に含まれていること.
18 * (2) 本ソフトウェアを再利用可能なバイナリコード(リロケータブルオブ
19 * ジェクトファイルやライブラリなど)の形で利用する場合には,利用
20 * に伴うドキュメント(利用者マニュアルなど)に,上記の著作権表示,
21 * この利用条件および下記の無保証規定を掲載すること.
22 * (3) 本ソフトウェアを再利用不可能なバイナリコードの形または機器に組
23 * み込んだ形で利用する場合には,次のいずれかの条件を満たすこと.
24 * (a) 利用に伴うドキュメント(利用者マニュアルなど)に,上記の著作
25 * 権表示,この利用条件および下記の無保証規定を掲載すること.
26 * (b) 利用の形態を,別に定める方法によって,上記著作権者に報告する
27 * こと.
28 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
29 * 害からも,上記著作権者を免責すること.
30 *
31 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者は,
32 * 本ソフトウェアに関して,その適用可能性も含めて,いかなる保証も行わ
33 * ない.また,本ソフトウェアの利用により直接的または間接的に生じたい
34 * かなる損害に関しても,その責任を負わない.
35 *
36 * @(#) $Id$
37 */
38
39/*
40 * TOPPERS/ASP用タスクモニタCPU依存プログラム.
41 *
42 */
43
44#include <itron.h>
45#include <sil.h>
46#include <stdio.h>
47#include "kernel_impl.h"
48#include "task.h"
49#include "task_expansion.h"
50#include "monitor.h"
51
52extern void dispatch_r(void);
53
54#define set_align(a, b) ((ulong_t)a & ~(b-1))
55
56/*
57 * レジスタの構造体
58 */
59typedef struct t_reg{
60 uint32_t ra;
61 uint32_t gp;
62 uint32_t tp;
63 uint32_t s0;
64 uint32_t s1;
65 uint32_t s2;
66 uint32_t s3;
67 uint32_t s4;
68 uint32_t s5;
69}T_REG;
70
71/*
72 * メモリのマッピング定義構造体
73 */
74
75typedef struct t_memdef{
76 uint32_t mstart;
77 uint32_t mend;
78 uint8_t mtype;
79 uint8_t mstate;
80}T_MEMDEF;
81
82/*
83 * RISC-V/32のメモリマッピング
84 */
85
86static T_MEMDEF const memdefine[] = {
87 {0x00000000, 0x1FFFFFFF, PORT_AREA, MREAD_WRITE},
88#if defined(TOPPERS_HIFIVE1)
89 {0x20000000, 0x3FFFFFFF, MEMORY_AREA, MREAD_ONLY },
90 {0x80000000, 0x80003FFF, MEMORY_AREA, MREAD_WRITE},
91#else
92#error "No support board type in RISC-V/32 groups."
93#endif
94};
95
96static T_REG sreg;
97
98/******************************************************************************
99 * ハードウェアポート属性参照関数
100 ******************************************************************************/
101/*
102 * アドレスからメモリ領域属性を取り出す
103 * mode=0:領域の型
104 * mode=1:読み取り書き込み属性
105 */
106
107char
108getMemoryType(ulong_t address, int_t mode)
109{
110 int_t count = sizeof(memdefine) / sizeof(T_MEMDEF);
111 int_t i;
112
113 for(i = 0 ; i < count ; i++){
114 if(address >= memdefine[i].mstart && address <= memdefine[i].mend){
115 if(mode == 0)
116 return memdefine[i].mtype;
117 else
118 return memdefine[i].mstate;
119 }
120 }
121 return NONE_AREA;
122}
123
124/*
125 * アドレスからアライン後のアドレスを取り出す
126 */
127
128ulong_t
129MonAlignAddress(ulong_t address)
130{
131 return address;
132}
133
134/******************************************************************************
135 * メモリアクセス用関数
136 ******************************************************************************/
137/*
138 * メモリ領域に対する読み出し関数
139 * 領域のチェックを行い、エラーならゼロを返す
140 */
141int_t
142MemoryRead(ulong_t address, intptr_t p, int_t type)
143{
144 int_t len;
145
146 switch(getMemoryType(address, 0)){
147 case PORT_AREA:
148 if(type == 2){
149 len = 2;
150 *((UH *)p) = sil_reh_mem((VP)address);
151 }
152 else if(type == 4){
153 len = 4;
154 *((UW *)p) = sil_rew_mem((VP)address);
155 }
156 else{
157 len = 1;
158 *((UB *)p) = sil_reb_mem((VP)address);
159 }
160 break;
161 case MEMORY_AREA:
162 if(type == 2){
163 len = 2;
164 *((UH *)p) = *((UH *)set_align(address, len));
165 }
166 else if(type == 4){
167 len = 4;
168 *((UW *)p) = *((UW *)set_align(address, len));
169 }
170 else{
171 len = 1;
172 *((UB *)p) = *((UB *)address);
173 }
174 break;
175 default:
176 len = 0;
177 break;
178 }
179 return len;
180}
181
182/*
183 * メモリ領域に対する書き込み関数
184 * 領域のチェックを行い、エラーならゼロを返す
185 */
186int_t
187MemoryWrite(ulong_t address, intptr_t p, int_t type)
188{
189 int_t len;
190
191 switch(getMemoryType(address, 0)){
192 case PORT_AREA:
193 if(type == 2){
194 len = 2;
195 address = set_align(address, len);
196 sil_wrh_mem((VP)address, *((UH *)p));
197 }
198 else if(type == 4){
199 len = 4;
200 address = set_align(address, len);
201 sil_wrw_mem((VP)address, *((UW *)p));
202 }
203 else{
204 len = 1;
205 sil_wrb_mem((VP)address, *((UB *)p));
206 }
207 break;
208 case MEMORY_AREA:
209 if(getMemoryType(address, 1) == MREAD_ONLY){
210 len = 0;
211 }
212 else if(type == 2){
213 len = 2;
214 *((UH *)address) = *((UH *)set_align(p, len));
215 }
216 else if(type == 4){
217 len = 4;
218 *((UW *)address) = *((UW *)set_align(p, len));
219 }
220 else{
221 len = 1;
222 *((UB *)address) = *((UB *)p);
223 }
224 break;
225 default:
226 len = 0;
227 break;
228 }
229 return len;
230}
231
232/******************************************************************************
233 * モニタ用関数
234 ******************************************************************************/
235/*
236 * レジスタ内容の表示
237 */
238void
239display_registers(ID tskid)
240{
241 ER ercd;
242 T_RTST rtst;
243
244 ercd = ref_tst(tskid, &rtst);
245 if(ercd == E_OK){
246 if(rtst.tskpc == (FP)dispatch_r){
247 sreg = *((T_REG *)rtst.tsksp);
248 printf(" RA =%08lx SP =%08x\n", (long)sreg.ra, (UW)((long)rtst.tsksp+sizeof(T_REG)));
249 printf(" GP =%08x TP =%08x S0 =%08x S1 =%08x\n", sreg.gp, sreg.tp, sreg.s0, sreg.s1);
250 printf(" S2 =%08x S3 =%08x S4 =%08x S5 =%08x\n", sreg.s2, sreg.s3, sreg.s4, sreg.s5);
251 printf(" %08lx %04x\n", (long)sreg.ra, *((UH*)(sreg.ra & ~1)));
252 return;
253 }
254 else if(rtst.tskstat == TTS_DMT){
255 printf(" wait in activate_r() !!\n");
256 return;
257 }
258 }
259 printf(" wait in dispatch() !!\n");
260}
261
Note: See TracBrowser for help on using the repository browser.