source: azure_iot_hub_f767zi/trunk/asp_baseplatform/monitor/arch/powerpc32.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: 9.3 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-2009 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/JSP用タスクモニタ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
56#define set_align(a, b) ((UW)a & ~(b-1))
57
58/*
59 * レジスタの構造体
60 */
61typedef struct t_reg{
62#ifdef SUPPORT_FLOATING_POINT_REG
63 UW memo_msr;
64 UW memo_off;
65 UW fps[33*2+1];
66#endif /* SUPPORT_FLOATING_POINT_REG */
67 UW r13;
68 UW r14;
69 UW r15;
70 UW r16;
71 UW r17;
72 UW r18;
73 UW r19;
74 UW r20;
75 UW r21;
76 UW r22;
77 UW r23;
78 UW r24;
79 UW r25;
80 UW r26;
81 UW r27;
82 UW r28;
83 UW r29;
84 UW r30;
85 UW r31;
86 UW lr2;
87
88 UW r0;
89 UW r3;
90 UW r4;
91 UW r5;
92 UW r6;
93 UW r7;
94 UW r8;
95 UW r9;
96 UW r10;
97 UW r11;
98 UW r12;
99 UW srr0;
100 UW srr1;
101 UW lr;
102 UW ctr;
103 UW cr;
104 UW xer;
105 UW dummy;
106}T_REG;
107
108/*
109 * メモリのマッピング定義構造体
110 */
111
112typedef struct t_memdef{
113 UW mstart;
114 UW mend;
115 UB mtype;
116 UB mstate;
117}T_MEMDEF;
118
119/*
120 * POWERPC32のメモリマッピング
121 */
122
123static T_MEMDEF const memdefine[] = {
124 {0x00000000, 0x0FFFFFFF, MEMORY_AREA, MREAD_WRITE},
125#ifdef SUPPORT_MIRROR_MEMORY
126 {0x20000000, 0x2FFFFFFF, MEMORY_AREA, MREAD_WRITE},
127#endif
128#if defined(SANTAMARIA)
129 {0xEC000000, 0xEC7FFFFF, MEMORY_AREA, MREAD_ONLY },
130 {0xFF400000, 0xFF4FFFFF, PORT_AREA, MREAD_WRITE},
131 {0xFFF00000, 0xFFFFFFFF, MEMORY_AREA, MREAD_ONLY }
132#elif defined(EP440XC)
133 {0xE0000000, 0xE00004FF, PORT_AREA, MREAD_ONLY },
134 {0xE0010000, 0xE0013FFF, MEMORY_AREA, MREAD_WRITE},
135 {0xEF600000, 0xEF6011FF, PORT_AREA, MREAD_WRITE},
136 {0xFFF00000, 0xFFFFFFFF, MEMORY_AREA, MREAD_ONLY }
137#elif defined(EP460XC)
138 {0xD8000000, 0xD8FFFFFF, PORT_AREA, MREAD_WRITE},
139 {0xE2000000, 0xE20FFFFF, PORT_AREA, MREAD_WRITE},
140 {0xEF600000, 0xEF6011FF, PORT_AREA, MREAD_WRITE},
141 {0xFFF00000, 0xFFFFFFFF, MEMORY_AREA, MREAD_ONLY }
142#else
143#error "No board type in POWERPC32 groups."
144#endif
145};
146
147static T_REG sreg;
148
149/******************************************************************************
150 * ハードウェアポート属性参照関数
151 ******************************************************************************/
152/*
153 * アドレスからメモリ領域属性を取り出す
154 * mode=0:領域の型
155 * mode=1:読み取り書き込み属性
156 */
157
158UB
159getMemoryType(UW address, INT mode)
160{
161 INT count = sizeof(memdefine) / sizeof(T_MEMDEF);
162 INT i;
163
164 for(i = 0 ; i < count ; i++){
165 if(address >= memdefine[i].mstart && address <= memdefine[i].mend){
166 if(mode == 0)
167 return memdefine[i].mtype;
168 else
169 return memdefine[i].mstate;
170 }
171 }
172 return NONE_AREA;
173}
174
175/*
176 * アドレスからアライン後のアドレスを取り出す
177 */
178
179UW
180MonAlignAddress(UW address)
181{
182 return address;
183}
184
185/******************************************************************************
186 * メモリアクセス用関数
187 ******************************************************************************/
188/*
189 * メモリ領域に対する読み出し関数
190 * 領域のチェックを行い、エラーならゼロを返す
191 */
192INT
193MemoryRead(UW address, VP_INT p, INT type)
194{
195 INT len;
196
197 switch(getMemoryType(address, 0)){
198 case PORT_AREA:
199 if(type == 2){
200 len = 2;
201#ifdef PANEL_SIMULATION
202 if(!NetDeviceRead((unsigned long)address, len, (void *)p))
203#endif
204 asm("eieio");
205 *((UH *)p) = sil_reh_mem((VP)address);
206 }
207 else if(type == 4){
208 len = 4;
209#ifdef PANEL_SIMULATION
210 if(!NetDeviceRead((unsigned long)address, len, (void *)p))
211#endif
212 *((UW *)p) = sil_rew_mem_ppc((VP)address);
213 }
214 else{
215#ifdef PANEL_SIMULATION
216 len = 1;
217 if(!NetDeviceRead((unsigned long)address, len, (void *)p))
218 *((UB *)p) = sil_reb_mem_ppc((VP)address);
219#else
220 len = 1;
221 *((UB *)p) = sil_reb_mem_ppc((VP)address);
222#endif
223 }
224 break;
225 case MEMORY_AREA:
226 if(type == 2){
227 len = 2;
228 *((UH *)p) = *((UH *)set_align(address, len));
229 }
230 else if(type == 4){
231 len = 4;
232 *((UW *)p) = *((UW *)set_align(address, len));
233 }
234 else{
235 len = 1;
236 *((UB *)p) = *((UB *)address);
237 }
238 break;
239 default:
240 len = 0;
241 break;
242 }
243 return len;
244}
245
246/*
247 * メモリ領域に対する書き込み関数
248 * 領域のチェックを行い、エラーならゼロを返す
249 */
250INT
251MemoryWrite(UW address, VP_INT p, INT type)
252{
253 INT len;
254
255 switch(getMemoryType(address, 0)){
256 case PORT_AREA:
257 if(type == 2){
258 len = 2;
259 address = set_align(address, len);
260#ifdef PANEL_SIMULATION
261 if(!NetDeviceWrite((unsigned long)address, len, (void *)p))
262#endif
263 sil_wrh_mem((VP)address, *((UH *)p));
264 }
265 else if(type == 4){
266 len = 4;
267 address = set_align(address, len);
268#ifdef PANEL_SIMULATION
269 if(!NetDeviceWrite((unsigned long)address, len, (void *)p))
270#endif
271 sil_wrw_mem((VP)address, *((UW *)p));
272 }
273 else{
274#ifdef PANEL_SIMULATION
275 len = 1;
276 if(!NetDeviceWrite((unsigned long)address, len, (void *)p))
277 sil_wrb_mem((VP)address, *((UB *)p));
278#else
279 len = 1;
280 sil_wrb_mem((VP)address, *((UB *)p));
281#endif
282 }
283 break;
284 case MEMORY_AREA:
285 if(getMemoryType(address, 1) == MREAD_ONLY){
286 len = 0;
287 }
288 else if(type == 2){
289 len = 2;
290 *((UH *)address) = *((UH *)set_align(p, len));
291 }
292 else if(type == 4){
293 len = 4;
294 *((UW *)address) = *((UW *)set_align(p, len));
295 }
296 else{
297 len = 1;
298 *((UB *)address) = *((UB *)p);
299 }
300 break;
301 default:
302 len = 0;
303 break;
304 }
305 return len;
306}
307
308/******************************************************************************
309 * モニタ用関数
310 ******************************************************************************/
311/*
312 * レジスタ内容の表示
313 */
314void
315display_registers(ID tskid)
316{
317 ER ercd;
318 T_RTST rtst;
319
320 ercd = ref_tst(tskid, &rtst);
321 if(ercd == E_OK){
322 if(rtst.tskpc == (FP)_kernel_break_wait){
323 sreg = *((T_REG *)(rtst.tsksp-4));
324 printf(" PC =%08lx SP =%08x MSR =%08x", (long)sreg.srr0, (UW)((long)rtst.tsksp+sizeof(T_REG)), sreg.srr1);
325 printf(" LR =%08x CTR=%08x CR=%08x\n", sreg.lr, sreg.ctr, sreg.cr);
326 printf(" R0 =%08x R3 =%08x R4 =%08x", sreg.r0, sreg.r3, sreg.r4);
327 printf(" R5 =%08x R6 =%08x R7 =%08x\n", sreg.r5, sreg.r6, sreg.r7);
328 printf(" R8 =%08x R9 =%08x R10=%08x", sreg.r8, sreg.r9, sreg.r10);
329 printf(" R11=%08x R12=%08x R13=%08x\n", sreg.r11, sreg.r12, sreg.r13);
330 printf(" R14=%08x R15=%08x R16=%08x\n", sreg.r14, sreg.r15, sreg.r16);
331 printf(" R17=%08x R18=%08x R19=%08x\n", sreg.r17, sreg.r18, sreg.r19);
332 printf(" R20=%08x R21=%08x R22=%08x\n", sreg.r20, sreg.r21, sreg.r22);
333 printf(" R23=%08x R24=%08x R25=%08x\n", sreg.r23, sreg.r24, sreg.r25);
334 printf(" R26=%08x R27=%08x R28=%08x\n", sreg.r26, sreg.r27, sreg.r28);
335 printf(" R29=%08x R30=%08x R31=%08x\n", sreg.r29, sreg.r30, sreg.r31);
336 printf(" XER=%08x\n", sreg.xer);
337 printf(" %08lx %08x\n", (long)sreg.srr0, *((UW*)sreg.srr0));
338 return;
339 }
340 else if(rtst.tskstat == TTS_DMT){
341 printf(" wait in activate_r() !!\n");
342 return;
343 }
344 }
345 printf(" wait in dispatch() !!\n");
346}
347
348
349void __va_arg_type_violation(void)
350{}
351
Note: See TracBrowser for help on using the repository browser.