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