2003-03-29 Andrew Cagney <cagney@redhat.com>
[deliverable/binutils-gdb.git] / sim / arm / wrapper.c
CommitLineData
c906108c 1/* run front end support for arm
86c735a5
NC
2 Copyright (C) 1995, 1996, 1997, 2000, 2001, 2002
3 Free Software Foundation, Inc.
c906108c 4
86c735a5 5 This file is part of ARM SIM.
c906108c 6
86c735a5
NC
7 GCC is free software; you can redistribute it and/or modify it
8 under the terms of the GNU General Public License as published
9 by the Free Software Foundation; either version 2, or (at your
10 option) any later version.
c906108c 11
86c735a5
NC
12 GCC is distributed in the hope that it will be useful, but
13 WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
15 the GNU General Public License for more details.
c906108c 16
86c735a5
NC
17 You should have received a copy of the GNU General Public
18 License along with this program; if not, write to the Free
19 Software Foundation, Inc., 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. */
c906108c 21
86c735a5
NC
22/* This file provides the interface between the simulator and
23 run.c and gdb (when the simulator is linked with gdb).
c906108c
SS
24 All simulator interaction should go through this file. */
25
26#include <stdio.h>
27#include <stdarg.h>
6d358e86 28#include <string.h>
c906108c
SS
29#include <bfd.h>
30#include <signal.h>
3c25f8c7
AC
31#include "gdb/callback.h"
32#include "gdb/remote-sim.h"
c906108c
SS
33#include "armdefs.h"
34#include "armemu.h"
35#include "dbg_rdi.h"
6d358e86 36#include "ansidecl.h"
86c735a5 37#include "sim-utils.h"
de4112fa 38#include "run-sim.h"
26216b98 39#include "gdb/sim-arm.h"
c906108c
SS
40
41host_callback *sim_callback;
42
43static struct ARMul_State *state;
44
45/* Who is using the simulator. */
46static SIM_OPEN_KIND sim_kind;
47
48/* argv[0] */
49static char *myname;
50
51/* Memory size in bytes. */
058f270d 52static int mem_size = (1 << 21);
c906108c
SS
53
54/* Non-zero to display start up banner, and maybe other things. */
55static int verbosity;
56
57/* Non-zero to set big endian mode. */
58static int big_endian;
59
7a292a7a
SS
60int stop_simulator;
61
f603c8fe
NC
62/* Cirrus DSP registers.
63
64 We need to define these registers outside of maverick.c because
65 maverick.c might not be linked in unless --target=arm9e-* in which
66 case wrapper.c will not compile because it tries to access Cirrus
67 registers. This should all go away once we get the Cirrus and ARM
68 Coprocessor to coexist in armcopro.c-- aldyh. */
69
70struct maverick_regs
71{
72 union
73 {
74 int i;
75 float f;
76 } upper;
77
78 union
79 {
80 int i;
81 float f;
82 } lower;
83};
84
85union maverick_acc_regs
86{
87 long double ld; /* Acc registers are 72-bits. */
88};
89
90struct maverick_regs DSPregs[16];
91union maverick_acc_regs DSPacc[4];
92ARMword DSPsc;
93
dfcd3bfb 94static void
c906108c
SS
95init ()
96{
97 static int done;
98
99 if (!done)
100 {
dfcd3bfb 101 ARMul_EmulateInit ();
c906108c
SS
102 state = ARMul_NewState ();
103 state->bigendSig = (big_endian ? HIGH : LOW);
dfcd3bfb
JM
104 ARMul_MemoryInit (state, mem_size);
105 ARMul_OSInit (state);
c906108c
SS
106 state->verbose = verbosity;
107 done = 1;
108 }
109}
110
111/* Set verbosity level of simulator.
112 This is not intended to produce detailed tracing or debugging information.
113 Just summaries. */
114/* FIXME: common/run.c doesn't do this yet. */
115
116void
117sim_set_verbose (v)
118 int v;
119{
120 verbosity = v;
121}
122
123/* Set the memory size to SIZE bytes.
dfcd3bfb 124 Must be called before initializing simulator. */
c906108c
SS
125/* FIXME: Rename to sim_set_mem_size. */
126
dfcd3bfb 127void
c906108c
SS
128sim_size (size)
129 int size;
130{
131 mem_size = size;
132}
133
dfcd3bfb 134void
86c735a5
NC
135ARMul_ConsolePrint VPARAMS ((ARMul_State * state,
136 const char * format,
137 ...))
c906108c
SS
138{
139 va_list ap;
140
141 if (state->verbose)
142 {
143 va_start (ap, format);
144 vprintf (format, ap);
145 va_end (ap);
146 }
147}
148
6d358e86 149ARMword
86c735a5
NC
150ARMul_Debug (state, pc, instr)
151 ARMul_State * state ATTRIBUTE_UNUSED;
152 ARMword pc ATTRIBUTE_UNUSED;
153 ARMword instr ATTRIBUTE_UNUSED;
c906108c 154{
6d358e86 155 return 0;
c906108c
SS
156}
157
158int
159sim_write (sd, addr, buffer, size)
6d358e86 160 SIM_DESC sd ATTRIBUTE_UNUSED;
c906108c 161 SIM_ADDR addr;
86c735a5 162 unsigned char * buffer;
c906108c
SS
163 int size;
164{
165 int i;
3943c96b 166
c906108c 167 init ();
3943c96b 168
c906108c 169 for (i = 0; i < size; i++)
917bca4f 170 ARMul_SafeWriteByte (state, addr + i, buffer[i]);
3943c96b 171
c906108c
SS
172 return size;
173}
174
175int
176sim_read (sd, addr, buffer, size)
6d358e86 177 SIM_DESC sd ATTRIBUTE_UNUSED;
c906108c 178 SIM_ADDR addr;
86c735a5 179 unsigned char * buffer;
c906108c
SS
180 int size;
181{
182 int i;
917bca4f 183
c906108c 184 init ();
86c735a5 185
c906108c 186 for (i = 0; i < size; i++)
917bca4f
NC
187 buffer[i] = ARMul_SafeReadByte (state, addr + i);
188
c906108c
SS
189 return size;
190}
191
192int
193sim_trace (sd)
6d358e86 194 SIM_DESC sd ATTRIBUTE_UNUSED;
dfcd3bfb 195{
86c735a5
NC
196 (*sim_callback->printf_filtered)
197 (sim_callback,
198 "This simulator does not support tracing\n");
c906108c
SS
199 return 1;
200}
201
202int
203sim_stop (sd)
6d358e86 204 SIM_DESC sd ATTRIBUTE_UNUSED;
c906108c 205{
7a292a7a
SS
206 state->Emulate = STOP;
207 stop_simulator = 1;
208 return 1;
c906108c
SS
209}
210
211void
212sim_resume (sd, step, siggnal)
6d358e86
NC
213 SIM_DESC sd ATTRIBUTE_UNUSED;
214 int step;
215 int siggnal ATTRIBUTE_UNUSED;
c906108c
SS
216{
217 state->EndCondition = 0;
7a292a7a 218 stop_simulator = 0;
c906108c
SS
219
220 if (step)
221 {
222 state->Reg[15] = ARMul_DoInstr (state);
223 if (state->EndCondition == 0)
224 state->EndCondition = RDIError_BreakpointReached;
225 }
226 else
227 {
dfcd3bfb 228 state->NextInstr = RESUME; /* treat as PC change */
c906108c
SS
229 state->Reg[15] = ARMul_DoProg (state);
230 }
231
232 FLUSHPIPE;
233}
234
235SIM_RC
236sim_create_inferior (sd, abfd, argv, env)
6d358e86 237 SIM_DESC sd ATTRIBUTE_UNUSED;
6b4a8935 238 struct bfd * abfd;
86c735a5
NC
239 char ** argv;
240 char ** env;
c906108c 241{
dfcd3bfb 242 int argvlen = 0;
1e6b544a 243 int mach;
c906108c
SS
244 char **arg;
245
246 if (abfd != NULL)
247 ARMul_SetPC (state, bfd_get_start_address (abfd));
248 else
dfcd3bfb 249 ARMul_SetPC (state, 0); /* ??? */
c906108c 250
1e6b544a
AO
251 mach = bfd_get_mach (abfd);
252
3943c96b
NC
253 switch (mach)
254 {
255 default:
86c735a5
NC
256 (*sim_callback->printf_filtered)
257 (sim_callback,
10b57fcb
NC
258 "Unknown machine type '%d'; please update sim_create_inferior.\n",
259 mach);
3943c96b
NC
260 /* fall through */
261
f1129fb8 262 case 0:
3943c96b 263 /* We wouldn't set the machine type with earlier toolchains, so we
f1129fb8
NC
264 explicitly select a processor capable of supporting all ARMs in
265 32bit mode. */
0f026fd0
NC
266 /* We choose the XScale rather than the iWMMXt, because the iWMMXt
267 removes the FPE emulator, since it conflicts with its coprocessors.
268 For the most generic ARM support, we want the FPE emulator in place. */
272fcdcd
NC
269 case bfd_mach_arm_XScale:
270 ARMul_SelectProcessor (state, ARM_v5_Prop | ARM_v5e_Prop | ARM_XScale_Prop);
271 break;
272
0f026fd0
NC
273 case bfd_mach_arm_iWMMXt:
274 {
275 extern int SWI_vector_installed;
276 ARMword i;
277
278 if (! SWI_vector_installed)
279 {
280 /* Intialise the hardware vectors to zero. */
281 if (! SWI_vector_installed)
282 for (i = ARMul_ResetV; i <= ARMFIQV; i += 4)
283 ARMul_WriteWord (state, i, 0);
284
285 /* ARM_WriteWord will have detected the write to the SWI vector,
286 but we want SWI_vector_installed to remain at 0 so that thumb
287 mode breakpoints will work. */
288 SWI_vector_installed = 0;
289 }
290 }
291 ARMul_SelectProcessor (state, ARM_v5_Prop | ARM_v5e_Prop | ARM_XScale_Prop | ARM_iWMMXt_Prop);
292 break;
293
f603c8fe
NC
294 case bfd_mach_arm_ep9312:
295 ARMul_SelectProcessor (state, ARM_v4_Prop | ARM_ep9312_Prop);
296 break;
297
f1129fb8 298 case bfd_mach_arm_5:
c17aa318
NC
299 if (bfd_family_coff (abfd))
300 {
301 /* This is a special case in order to support COFF based ARM toolchains.
302 The COFF header does not have enough room to store all the different
303 kinds of ARM cpu, so the XScale, v5T and v5TE architectures all default
304 to v5. (See coff_set_flags() in bdf/coffcode.h). So if we see a v5
305 machine type here, we assume it could be any of the above architectures
306 and so select the most feature-full. */
307 ARMul_SelectProcessor (state, ARM_v5_Prop | ARM_v5e_Prop | ARM_XScale_Prop);
308 break;
309 }
310 /* Otherwise drop through. */
25180f8a 311
f1129fb8
NC
312 case bfd_mach_arm_5T:
313 ARMul_SelectProcessor (state, ARM_v5_Prop);
314 break;
3943c96b 315
f1129fb8
NC
316 case bfd_mach_arm_5TE:
317 ARMul_SelectProcessor (state, ARM_v5_Prop | ARM_v5e_Prop);
318 break;
319
f1129fb8
NC
320 case bfd_mach_arm_4:
321 case bfd_mach_arm_4T:
322 ARMul_SelectProcessor (state, ARM_v4_Prop);
323 break;
324
325 case bfd_mach_arm_3:
326 case bfd_mach_arm_3M:
3943c96b
NC
327 ARMul_SelectProcessor (state, ARM_Lock_Prop);
328 break;
329
f1129fb8
NC
330 case bfd_mach_arm_2:
331 case bfd_mach_arm_2a:
3943c96b
NC
332 ARMul_SelectProcessor (state, ARM_Fix26_Prop);
333 break;
334 }
335
5f7d0a33
NC
336 if ( mach != bfd_mach_arm_3
337 && mach != bfd_mach_arm_3M
338 && mach != bfd_mach_arm_2
339 && mach != bfd_mach_arm_2a)
f1129fb8
NC
340 {
341 /* Reset mode to ARM. A gdb user may rerun a program that had entered
342 THUMB mode from the start and cause the ARM-mode startup code to be
5f7d0a33
NC
343 executed in THUMB mode. */
344 ARMul_SetCPSR (state, SVC32MODE);
f1129fb8
NC
345 }
346
c906108c
SS
347 if (argv != NULL)
348 {
5f7d0a33
NC
349 /* Set up the command line by laboriously stringing together
350 the environment carefully picked apart by our caller. */
351
352 /* Free any old stuff. */
c906108c
SS
353 if (state->CommandLine != NULL)
354 {
dfcd3bfb 355 free (state->CommandLine);
c906108c
SS
356 state->CommandLine = NULL;
357 }
dfcd3bfb 358
5f7d0a33 359 /* See how much we need. */
c906108c 360 for (arg = argv; *arg != NULL; arg++)
dfcd3bfb
JM
361 argvlen += strlen (*arg) + 1;
362
5f7d0a33 363 /* Allocate it. */
dfcd3bfb 364 state->CommandLine = malloc (argvlen + 1);
c906108c
SS
365 if (state->CommandLine != NULL)
366 {
367 arg = argv;
dfcd3bfb 368 state->CommandLine[0] = '\0';
5f7d0a33 369
c906108c
SS
370 for (arg = argv; *arg != NULL; arg++)
371 {
dfcd3bfb
JM
372 strcat (state->CommandLine, *arg);
373 strcat (state->CommandLine, " ");
c906108c
SS
374 }
375 }
376 }
377
378 if (env != NULL)
379 {
5f7d0a33 380 /* Now see if there's a MEMSIZE spec in the environment. */
c906108c
SS
381 while (*env)
382 {
dfcd3bfb 383 if (strncmp (*env, "MEMSIZE=", sizeof ("MEMSIZE=") - 1) == 0)
c906108c 384 {
c906108c 385 char *end_of_num;
dfcd3bfb 386
5f7d0a33 387 /* Set up memory limit. */
dfcd3bfb
JM
388 state->MemSize =
389 strtoul (*env + sizeof ("MEMSIZE=") - 1, &end_of_num, 0);
c906108c
SS
390 }
391 env++;
392 }
393 }
394
395 return SIM_RC_OK;
396}
397
398void
399sim_info (sd, verbose)
6d358e86
NC
400 SIM_DESC sd ATTRIBUTE_UNUSED;
401 int verbose ATTRIBUTE_UNUSED;
c906108c
SS
402{
403}
404
dfcd3bfb 405static int
c906108c
SS
406frommem (state, memory)
407 struct ARMul_State *state;
408 unsigned char *memory;
409{
410 if (state->bigendSig == HIGH)
86c735a5
NC
411 return (memory[0] << 24) | (memory[1] << 16)
412 | (memory[2] << 8) | (memory[3] << 0);
c906108c 413 else
86c735a5
NC
414 return (memory[3] << 24) | (memory[2] << 16)
415 | (memory[1] << 8) | (memory[0] << 0);
c906108c
SS
416}
417
c906108c 418static void
dfcd3bfb 419tomem (state, memory, val)
c906108c
SS
420 struct ARMul_State *state;
421 unsigned char *memory;
422 int val;
423{
424 if (state->bigendSig == HIGH)
425 {
426 memory[0] = val >> 24;
427 memory[1] = val >> 16;
428 memory[2] = val >> 8;
429 memory[3] = val >> 0;
430 }
431 else
432 {
433 memory[3] = val >> 24;
434 memory[2] = val >> 16;
435 memory[1] = val >> 8;
436 memory[0] = val >> 0;
437 }
438}
439
440int
441sim_store_register (sd, rn, memory, length)
6d358e86 442 SIM_DESC sd ATTRIBUTE_UNUSED;
c906108c
SS
443 int rn;
444 unsigned char *memory;
6d358e86 445 int length ATTRIBUTE_UNUSED;
c906108c
SS
446{
447 init ();
f1129fb8 448
26216b98 449 switch ((enum sim_arm_regs) rn)
3463c3fb 450 {
26216b98
AC
451 case SIM_ARM_R0_REGNUM:
452 case SIM_ARM_R1_REGNUM:
453 case SIM_ARM_R2_REGNUM:
454 case SIM_ARM_R3_REGNUM:
455 case SIM_ARM_R4_REGNUM:
456 case SIM_ARM_R5_REGNUM:
457 case SIM_ARM_R6_REGNUM:
458 case SIM_ARM_R7_REGNUM:
459 case SIM_ARM_R8_REGNUM:
460 case SIM_ARM_R9_REGNUM:
461 case SIM_ARM_R10_REGNUM:
462 case SIM_ARM_R11_REGNUM:
463 case SIM_ARM_R12_REGNUM:
464 case SIM_ARM_R13_REGNUM:
465 case SIM_ARM_R14_REGNUM:
466 case SIM_ARM_R15_REGNUM: /* PC */
467 case SIM_ARM_FP0_REGNUM:
468 case SIM_ARM_FP1_REGNUM:
469 case SIM_ARM_FP2_REGNUM:
470 case SIM_ARM_FP3_REGNUM:
471 case SIM_ARM_FP4_REGNUM:
472 case SIM_ARM_FP5_REGNUM:
473 case SIM_ARM_FP6_REGNUM:
474 case SIM_ARM_FP7_REGNUM:
475 case SIM_ARM_FPS_REGNUM:
476 ARMul_SetReg (state, state->Mode, rn, frommem (state, memory));
477 break;
478
479 case SIM_ARM_PS_REGNUM:
3463c3fb 480 state->Cpsr = frommem (state, memory);
10b57fcb 481 ARMul_CPSRAltered (state);
26216b98
AC
482 break;
483
f603c8fe
NC
484 case SIM_ARM_MAVERIC_COP0R0_REGNUM:
485 case SIM_ARM_MAVERIC_COP0R1_REGNUM:
486 case SIM_ARM_MAVERIC_COP0R2_REGNUM:
487 case SIM_ARM_MAVERIC_COP0R3_REGNUM:
488 case SIM_ARM_MAVERIC_COP0R4_REGNUM:
489 case SIM_ARM_MAVERIC_COP0R5_REGNUM:
490 case SIM_ARM_MAVERIC_COP0R6_REGNUM:
491 case SIM_ARM_MAVERIC_COP0R7_REGNUM:
492 case SIM_ARM_MAVERIC_COP0R8_REGNUM:
493 case SIM_ARM_MAVERIC_COP0R9_REGNUM:
494 case SIM_ARM_MAVERIC_COP0R10_REGNUM:
495 case SIM_ARM_MAVERIC_COP0R11_REGNUM:
496 case SIM_ARM_MAVERIC_COP0R12_REGNUM:
497 case SIM_ARM_MAVERIC_COP0R13_REGNUM:
498 case SIM_ARM_MAVERIC_COP0R14_REGNUM:
499 case SIM_ARM_MAVERIC_COP0R15_REGNUM:
500 memcpy (& DSPregs [rn - SIM_ARM_MAVERIC_COP0R0_REGNUM],
501 memory, sizeof (struct maverick_regs));
502 return sizeof (struct maverick_regs);
503
504 case SIM_ARM_MAVERIC_DSPSC_REGNUM:
505 memcpy (&DSPsc, memory, sizeof DSPsc);
506 return sizeof DSPsc;
507
0f026fd0
NC
508#ifdef __IWMMXT__
509 case SIM_ARM_IWMMXT_COP0R0_REGNUM:
510 case SIM_ARM_IWMMXT_COP0R1_REGNUM:
511 case SIM_ARM_IWMMXT_COP0R2_REGNUM:
512 case SIM_ARM_IWMMXT_COP0R3_REGNUM:
513 case SIM_ARM_IWMMXT_COP0R4_REGNUM:
514 case SIM_ARM_IWMMXT_COP0R5_REGNUM:
515 case SIM_ARM_IWMMXT_COP0R6_REGNUM:
516 case SIM_ARM_IWMMXT_COP0R7_REGNUM:
517 case SIM_ARM_IWMMXT_COP0R8_REGNUM:
518 case SIM_ARM_IWMMXT_COP0R9_REGNUM:
519 case SIM_ARM_IWMMXT_COP0R10_REGNUM:
520 case SIM_ARM_IWMMXT_COP0R11_REGNUM:
521 case SIM_ARM_IWMMXT_COP0R12_REGNUM:
522 case SIM_ARM_IWMMXT_COP0R13_REGNUM:
523 case SIM_ARM_IWMMXT_COP0R14_REGNUM:
524 case SIM_ARM_IWMMXT_COP0R15_REGNUM:
525 case SIM_ARM_IWMMXT_COP1R0_REGNUM:
526 case SIM_ARM_IWMMXT_COP1R1_REGNUM:
527 case SIM_ARM_IWMMXT_COP1R2_REGNUM:
528 case SIM_ARM_IWMMXT_COP1R3_REGNUM:
529 case SIM_ARM_IWMMXT_COP1R4_REGNUM:
530 case SIM_ARM_IWMMXT_COP1R5_REGNUM:
531 case SIM_ARM_IWMMXT_COP1R6_REGNUM:
532 case SIM_ARM_IWMMXT_COP1R7_REGNUM:
533 case SIM_ARM_IWMMXT_COP1R8_REGNUM:
534 case SIM_ARM_IWMMXT_COP1R9_REGNUM:
535 case SIM_ARM_IWMMXT_COP1R10_REGNUM:
536 case SIM_ARM_IWMMXT_COP1R11_REGNUM:
537 case SIM_ARM_IWMMXT_COP1R12_REGNUM:
538 case SIM_ARM_IWMMXT_COP1R13_REGNUM:
539 case SIM_ARM_IWMMXT_COP1R14_REGNUM:
540 case SIM_ARM_IWMMXT_COP1R15_REGNUM:
541 return Store_Iwmmxt_Register (rn - SIM_ARM_IWMMXT_COP0R0_REGNUM, memory);
542#endif
26216b98
AC
543 default:
544 return 0;
3463c3fb 545 }
26216b98 546
c906108c
SS
547 return -1;
548}
549
550int
551sim_fetch_register (sd, rn, memory, length)
6d358e86 552 SIM_DESC sd ATTRIBUTE_UNUSED;
c906108c
SS
553 int rn;
554 unsigned char *memory;
6d358e86 555 int length ATTRIBUTE_UNUSED;
c906108c
SS
556{
557 ARMword regval;
558
559 init ();
f1129fb8 560
26216b98
AC
561 switch ((enum sim_arm_regs) rn)
562 {
563 case SIM_ARM_R0_REGNUM:
564 case SIM_ARM_R1_REGNUM:
565 case SIM_ARM_R2_REGNUM:
566 case SIM_ARM_R3_REGNUM:
567 case SIM_ARM_R4_REGNUM:
568 case SIM_ARM_R5_REGNUM:
569 case SIM_ARM_R6_REGNUM:
570 case SIM_ARM_R7_REGNUM:
571 case SIM_ARM_R8_REGNUM:
572 case SIM_ARM_R9_REGNUM:
573 case SIM_ARM_R10_REGNUM:
574 case SIM_ARM_R11_REGNUM:
575 case SIM_ARM_R12_REGNUM:
576 case SIM_ARM_R13_REGNUM:
577 case SIM_ARM_R14_REGNUM:
578 case SIM_ARM_R15_REGNUM: /* PC */
579 regval = ARMul_GetReg (state, state->Mode, rn);
580 break;
581
582 case SIM_ARM_FP0_REGNUM:
583 case SIM_ARM_FP1_REGNUM:
584 case SIM_ARM_FP2_REGNUM:
585 case SIM_ARM_FP3_REGNUM:
586 case SIM_ARM_FP4_REGNUM:
587 case SIM_ARM_FP5_REGNUM:
588 case SIM_ARM_FP6_REGNUM:
589 case SIM_ARM_FP7_REGNUM:
590 case SIM_ARM_FPS_REGNUM:
591 memset (memory, 0, length);
592 return 0;
593
594 case SIM_ARM_PS_REGNUM:
595 regval = ARMul_GetCPSR (state);
596 break;
597
f603c8fe
NC
598 case SIM_ARM_MAVERIC_COP0R0_REGNUM:
599 case SIM_ARM_MAVERIC_COP0R1_REGNUM:
600 case SIM_ARM_MAVERIC_COP0R2_REGNUM:
601 case SIM_ARM_MAVERIC_COP0R3_REGNUM:
602 case SIM_ARM_MAVERIC_COP0R4_REGNUM:
603 case SIM_ARM_MAVERIC_COP0R5_REGNUM:
604 case SIM_ARM_MAVERIC_COP0R6_REGNUM:
605 case SIM_ARM_MAVERIC_COP0R7_REGNUM:
606 case SIM_ARM_MAVERIC_COP0R8_REGNUM:
607 case SIM_ARM_MAVERIC_COP0R9_REGNUM:
608 case SIM_ARM_MAVERIC_COP0R10_REGNUM:
609 case SIM_ARM_MAVERIC_COP0R11_REGNUM:
610 case SIM_ARM_MAVERIC_COP0R12_REGNUM:
611 case SIM_ARM_MAVERIC_COP0R13_REGNUM:
612 case SIM_ARM_MAVERIC_COP0R14_REGNUM:
613 case SIM_ARM_MAVERIC_COP0R15_REGNUM:
614 memcpy (memory, & DSPregs [rn - SIM_ARM_MAVERIC_COP0R0_REGNUM],
615 sizeof (struct maverick_regs));
616 return sizeof (struct maverick_regs);
617
618 case SIM_ARM_MAVERIC_DSPSC_REGNUM:
619 memcpy (memory, & DSPsc, sizeof DSPsc);
620 return sizeof DSPsc;
621
0f026fd0
NC
622#ifdef __IWMMXT__
623 case SIM_ARM_IWMMXT_COP0R0_REGNUM:
624 case SIM_ARM_IWMMXT_COP0R1_REGNUM:
625 case SIM_ARM_IWMMXT_COP0R2_REGNUM:
626 case SIM_ARM_IWMMXT_COP0R3_REGNUM:
627 case SIM_ARM_IWMMXT_COP0R4_REGNUM:
628 case SIM_ARM_IWMMXT_COP0R5_REGNUM:
629 case SIM_ARM_IWMMXT_COP0R6_REGNUM:
630 case SIM_ARM_IWMMXT_COP0R7_REGNUM:
631 case SIM_ARM_IWMMXT_COP0R8_REGNUM:
632 case SIM_ARM_IWMMXT_COP0R9_REGNUM:
633 case SIM_ARM_IWMMXT_COP0R10_REGNUM:
634 case SIM_ARM_IWMMXT_COP0R11_REGNUM:
635 case SIM_ARM_IWMMXT_COP0R12_REGNUM:
636 case SIM_ARM_IWMMXT_COP0R13_REGNUM:
637 case SIM_ARM_IWMMXT_COP0R14_REGNUM:
638 case SIM_ARM_IWMMXT_COP0R15_REGNUM:
639 case SIM_ARM_IWMMXT_COP1R0_REGNUM:
640 case SIM_ARM_IWMMXT_COP1R1_REGNUM:
641 case SIM_ARM_IWMMXT_COP1R2_REGNUM:
642 case SIM_ARM_IWMMXT_COP1R3_REGNUM:
643 case SIM_ARM_IWMMXT_COP1R4_REGNUM:
644 case SIM_ARM_IWMMXT_COP1R5_REGNUM:
645 case SIM_ARM_IWMMXT_COP1R6_REGNUM:
646 case SIM_ARM_IWMMXT_COP1R7_REGNUM:
647 case SIM_ARM_IWMMXT_COP1R8_REGNUM:
648 case SIM_ARM_IWMMXT_COP1R9_REGNUM:
649 case SIM_ARM_IWMMXT_COP1R10_REGNUM:
650 case SIM_ARM_IWMMXT_COP1R11_REGNUM:
651 case SIM_ARM_IWMMXT_COP1R12_REGNUM:
652 case SIM_ARM_IWMMXT_COP1R13_REGNUM:
653 case SIM_ARM_IWMMXT_COP1R14_REGNUM:
654 case SIM_ARM_IWMMXT_COP1R15_REGNUM:
655 return Fetch_Iwmmxt_Register (rn - SIM_ARM_IWMMXT_COP0R0_REGNUM, memory);
656#endif
26216b98
AC
657 default:
658 return 0;
659 }
272fcdcd
NC
660
661 while (length)
662 {
663 tomem (state, memory, regval);
664
665 length -= 4;
666 memory += 4;
667 regval = 0;
668 }
669
c906108c
SS
670 return -1;
671}
672
de4112fa
NC
673#ifdef SIM_TARGET_SWITCHES
674
675static void sim_target_parse_arg_array PARAMS ((char **));
676
677typedef struct
678{
679 char * swi_option;
680 unsigned int swi_mask;
681} swi_options;
682
683#define SWI_SWITCH "--swi-support"
684
685static swi_options options[] =
686 {
687 { "none", 0 },
688 { "demon", SWI_MASK_DEMON },
689 { "angel", SWI_MASK_ANGEL },
690 { "redboot", SWI_MASK_REDBOOT },
691 { "all", -1 },
692 { "NONE", 0 },
693 { "DEMON", SWI_MASK_DEMON },
694 { "ANGEL", SWI_MASK_ANGEL },
695 { "REDBOOT", SWI_MASK_REDBOOT },
696 { "ALL", -1 }
697 };
698
699
700int
701sim_target_parse_command_line (argc, argv)
702 int argc;
703 char ** argv;
704{
705 int i;
706
707 for (i = 1; i < argc; i++)
708 {
709 char * ptr = argv[i];
710 int arg;
711
712 if ((ptr == NULL) || (* ptr != '-'))
713 break;
714
715 if (strncmp (ptr, SWI_SWITCH, sizeof SWI_SWITCH - 1) != 0)
716 continue;
717
718 if (ptr[sizeof SWI_SWITCH - 1] == 0)
719 {
720 /* Remove this option from the argv array. */
721 for (arg = i; arg < argc; arg ++)
722 argv[arg] = argv[arg + 1];
723 argc --;
724
725 ptr = argv[i];
726 }
727 else
728 ptr += sizeof SWI_SWITCH;
729
730 swi_mask = 0;
731
732 while (* ptr)
733 {
734 int i;
735
736 for (i = sizeof options / sizeof options[0]; i--;)
737 if (strncmp (ptr, options[i].swi_option,
738 strlen (options[i].swi_option)) == 0)
739 {
740 swi_mask |= options[i].swi_mask;
741 ptr += strlen (options[i].swi_option);
742
743 if (* ptr == ',')
744 ++ ptr;
745
746 break;
747 }
748
749 if (i < 0)
750 break;
751 }
752
753 if (* ptr != 0)
754 fprintf (stderr, "Ignoring swi options: %s\n", ptr);
755
756 /* Remove this option from the argv array. */
757 for (arg = i; arg < argc; arg ++)
758 argv[arg] = argv[arg + 1];
759 argc --;
760 i --;
761 }
762 return argc;
763}
764
765static void
766sim_target_parse_arg_array (argv)
767 char ** argv;
768{
769 int i;
770
771 for (i = 0; argv[i]; i++)
772 ;
773
774 return (void) sim_target_parse_command_line (i, argv);
775}
776
777void
778sim_target_display_usage ()
779{
780 fprintf (stderr, "%s=<list> Comma seperated list of SWI protocols to supoport.\n\
781 This list can contain: NONE, DEMON, ANGEL, REDBOOT and/or ALL.\n",
782 SWI_SWITCH);
783}
784#endif
785
c906108c
SS
786SIM_DESC
787sim_open (kind, ptr, abfd, argv)
788 SIM_OPEN_KIND kind;
789 host_callback *ptr;
6b4a8935 790 struct bfd *abfd;
c906108c
SS
791 char **argv;
792{
793 sim_kind = kind;
6c9e0292 794 if (myname) free (myname);
c1a72ffd 795 myname = (char *) xstrdup (argv[0]);
c906108c 796 sim_callback = ptr;
dfcd3bfb 797
de4112fa
NC
798#ifdef SIM_TARGET_SWITCHES
799 sim_target_parse_arg_array (argv);
800#endif
801
c906108c
SS
802 /* Decide upon the endian-ness of the processor.
803 If we can, get the information from the bfd itself.
804 Otherwise look to see if we have been given a command
805 line switch that tells us. Otherwise default to little endian. */
806 if (abfd != NULL)
807 big_endian = bfd_big_endian (abfd);
808 else if (argv[1] != NULL)
809 {
810 int i;
dfcd3bfb 811
058f270d 812 /* Scan for endian-ness and memory-size switches. */
c906108c 813 for (i = 0; (argv[i] != NULL) && (argv[i][0] != 0); i++)
dfcd3bfb
JM
814 if (argv[i][0] == '-' && argv[i][1] == 'E')
815 {
816 char c;
817
818 if ((c = argv[i][2]) == 0)
819 {
820 ++i;
821 c = argv[i][0];
822 }
823
824 switch (c)
825 {
826 case 0:
827 sim_callback->printf_filtered
828 (sim_callback, "No argument to -E option provided\n");
829 break;
830
831 case 'b':
832 case 'B':
833 big_endian = 1;
834 break;
835
836 case 'l':
837 case 'L':
838 big_endian = 0;
839 break;
840
841 default:
842 sim_callback->printf_filtered
843 (sim_callback, "Unrecognised argument to -E option\n");
844 break;
845 }
846 }
058f270d
AC
847 else if (argv[i][0] == '-' && argv[i][1] == 'm')
848 {
849 if (argv[i][2] != '\0')
850 sim_size (atoi (&argv[i][2]));
851 else if (argv[i + 1] != NULL)
852 {
853 sim_size (atoi (argv[i + 1]));
854 i++;
855 }
856 else
857 {
858 sim_callback->printf_filtered (sim_callback,
859 "Missing argument to -m option\n");
860 return NULL;
861 }
862
863 }
c906108c
SS
864 }
865
866 return (SIM_DESC) 1;
867}
868
869void
870sim_close (sd, quitting)
6d358e86
NC
871 SIM_DESC sd ATTRIBUTE_UNUSED;
872 int quitting ATTRIBUTE_UNUSED;
c906108c 873{
86c735a5
NC
874 if (myname)
875 free (myname);
6c9e0292 876 myname = NULL;
c906108c
SS
877}
878
879SIM_RC
880sim_load (sd, prog, abfd, from_tty)
881 SIM_DESC sd;
882 char *prog;
883 bfd *abfd;
6d358e86 884 int from_tty ATTRIBUTE_UNUSED;
c906108c 885{
c906108c
SS
886 bfd *prog_bfd;
887
888 prog_bfd = sim_load_file (sd, myname, sim_callback, prog, abfd,
dfcd3bfb 889 sim_kind == SIM_OPEN_DEBUG, 0, sim_write);
c906108c
SS
890 if (prog_bfd == NULL)
891 return SIM_RC_FAIL;
892 ARMul_SetPC (state, bfd_get_start_address (prog_bfd));
893 if (abfd == NULL)
894 bfd_close (prog_bfd);
895 return SIM_RC_OK;
896}
897
898void
899sim_stop_reason (sd, reason, sigrc)
6d358e86 900 SIM_DESC sd ATTRIBUTE_UNUSED;
c906108c
SS
901 enum sim_stop *reason;
902 int *sigrc;
903{
7a292a7a
SS
904 if (stop_simulator)
905 {
906 *reason = sim_stopped;
907 *sigrc = SIGINT;
908 }
909 else if (state->EndCondition == 0)
c906108c
SS
910 {
911 *reason = sim_exited;
912 *sigrc = state->Reg[0] & 255;
913 }
914 else
915 {
916 *reason = sim_stopped;
917 if (state->EndCondition == RDIError_BreakpointReached)
918 *sigrc = SIGTRAP;
0f026fd0
NC
919 else if ( state->EndCondition == RDIError_DataAbort
920 || state->EndCondition == RDIError_AddressException)
921 *sigrc = SIGBUS;
c906108c
SS
922 else
923 *sigrc = 0;
924 }
925}
926
927void
928sim_do_command (sd, cmd)
6d358e86
NC
929 SIM_DESC sd ATTRIBUTE_UNUSED;
930 char *cmd ATTRIBUTE_UNUSED;
dfcd3bfb 931{
86c735a5
NC
932 (*sim_callback->printf_filtered)
933 (sim_callback,
934 "This simulator does not accept any commands.\n");
c906108c
SS
935}
936
c906108c
SS
937void
938sim_set_callbacks (ptr)
939 host_callback *ptr;
940{
941 sim_callback = ptr;
942}
This page took 0.219976 seconds and 4 git commands to generate.