source: azure_iot_hub_f767zi/trunk/asp_baseplatform/monitor/arch/riscv64.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.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) 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 unsigned long ra;
61 unsigned long gp;
62 unsigned long tp;
63 unsigned long s0;
64 unsigned long s1;
65 unsigned long s2;
66 unsigned long s3;
67 unsigned long s4;
68 unsigned long s5;
69}T_REG;
70
71/*
72 * メモリのマッピング定義構造体
73 */
74
75typedef struct t_memdef{
76 uintptr_t mstart;
77 uint32_t mend;
78 uint8_t mtype;
79 uint8_t mstate;
80}T_MEMDEF;
81
82/*
83 * RISC-V/64のメモリマッピング
84 */
85
86static T_MEMDEF const memdefine[] = {
87 {0x02000000L, 0x02FFFFFFL, PORT_AREA, MREAD_WRITE},
88 {0x0C000000L, 0x0CFFFFFFL, PORT_AREA, MREAD_WRITE},
89 {0x38000000L, 0x3807FFFFL, PORT_AREA, MREAD_WRITE},
90 {0x40000000L, 0x413FFFFFL, PORT_AREA, MREAD_WRITE},
91 {0x50000000L, 0x543FFFFFL, PORT_AREA, MREAD_WRITE},
92#if defined(TOPPERS_K210)
93 {0x80000000L, 0x807FFFFFL, MEMORY_AREA, MREAD_WRITE},
94 {0x88000000L, 0x881FFFFFL, MEMORY_AREA, MREAD_ONLY },
95#else
96#error "No support board type in RISC-V/64 groups."
97#endif
98};
99
100static T_REG sreg;
101
102/******************************************************************************
103 * ハードウェアポート属性参照関数
104 ******************************************************************************/
105/*
106 * アドレスからメモリ領域属性を取り出す
107 * mode=0:領域の型
108 * mode=1:読み取り書き込み属性
109 */
110
111char
112getMemoryType(ulong_t address, int_t mode)
113{
114 int_t count = sizeof(memdefine) / sizeof(T_MEMDEF);
115 int_t i;
116
117 for(i = 0 ; i < count ; i++){
118 if(address >= memdefine[i].mstart && address <= memdefine[i].mend){
119 if(mode == 0)
120 return memdefine[i].mtype;
121 else
122 return memdefine[i].mstate;
123 }
124 }
125 return NONE_AREA;
126}
127
128/*
129 * アドレスからアライン後のアドレスを取り出す
130 */
131
132ulong_t
133MonAlignAddress(ulong_t address)
134{
135 return address;
136}
137
138/******************************************************************************
139 * メモリアクセス用関数
140 ******************************************************************************/
141/*
142 * メモリ領域に対する読み出し関数
143 * 領域のチェックを行い、エラーならゼロを返す
144 */
145int_t
146MemoryRead(ulong_t address, intptr_t p, int_t type)
147{
148 int_t len;
149
150 switch(getMemoryType(address, 0)){
151 case PORT_AREA:
152 if(type == 2){
153 len = 2;
154 *((UH *)p) = sil_reh_mem((VP)address);
155 }
156 else if(type == 4){
157 len = 4;
158 *((UW *)p) = sil_rew_mem((VP)address);
159 }
160 else{
161 len = 1;
162 *((UB *)p) = sil_reb_mem((VP)address);
163 }
164 break;
165 case MEMORY_AREA:
166 if(type == 2){
167 len = 2;
168 *((UH *)p) = *((UH *)set_align(address, len));
169 }
170 else if(type == 4){
171 len = 4;
172 *((UW *)p) = *((UW *)set_align(address, len));
173 }
174 else{
175 len = 1;
176 *((UB *)p) = *((UB *)address);
177 }
178 break;
179 default:
180 len = 0;
181 break;
182 }
183 return len;
184}
185
186/*
187 * メモリ領域に対する書き込み関数
188 * 領域のチェックを行い、エラーならゼロを返す
189 */
190int_t
191MemoryWrite(ulong_t address, intptr_t p, int_t type)
192{
193 int_t len;
194
195 switch(getMemoryType(address, 0)){
196 case PORT_AREA:
197 if(type == 2){
198 len = 2;
199 address = set_align(address, len);
200 sil_wrh_mem((VP)address, *((UH *)p));
201 }
202 else if(type == 4){
203 len = 4;
204 address = set_align(address, len);
205 sil_wrw_mem((VP)address, *((UW *)p));
206 }
207 else{
208 len = 1;
209 sil_wrb_mem((VP)address, *((UB *)p));
210 }
211 break;
212 case MEMORY_AREA:
213 if(getMemoryType(address, 1) == MREAD_ONLY){
214 len = 0;
215 }
216 else if(type == 2){
217 len = 2;
218 *((UH *)address) = *((UH *)set_align(p, len));
219 }
220 else if(type == 4){
221 len = 4;
222 *((UW *)address) = *((UW *)set_align(p, len));
223 }
224 else{
225 len = 1;
226 *((UB *)address) = *((UB *)p);
227 }
228 break;
229 default:
230 len = 0;
231 break;
232 }
233 return len;
234}
235
236/******************************************************************************
237 * モニタ用関数
238 ******************************************************************************/
239/*
240 * レジスタ内容の表示
241 */
242void
243display_registers(ID tskid)
244{
245 ER ercd;
246 T_RTST rtst;
247
248 ercd = ref_tst(tskid, &rtst);
249 if(ercd == E_OK){
250 if(rtst.tskpc == (FP)dispatch_r){
251 sreg = *((T_REG *)rtst.tsksp);
252 printf(" RA =%lx SP =%lx\n", (long)sreg.ra, (long)((long)rtst.tsksp+sizeof(T_REG)));
253 printf(" GP =%lx TP =%lx S0 =%lx S1 =%lx\n", sreg.gp, sreg.tp, sreg.s0, sreg.s1);
254 printf(" S2 =%lx S3 =%lx S4 =%lx S5 =%lx\n", sreg.s2, sreg.s3, sreg.s4, sreg.s5);
255 printf(" %lx %04x\n", (long)sreg.ra, *((UH*)(sreg.ra & ~1)));
256 return;
257 }
258 else if(rtst.tskstat == TTS_DMT){
259 printf(" wait in activate_r() !!\n");
260 return;
261 }
262 }
263 printf(" wait in dispatch() !!\n");
264}
265
Note: See TracBrowser for help on using the repository browser.