1 /* armos.c -- ARMulator OS interface: ARM6 Instruction Emulator.
2 Copyright (C) 1994 Advanced RISC Machines Ltd.
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
18 /* This file contains a model of Demon, ARM Ltd's Debug Monitor,
19 including all the SWI's required to support the C library. The code in
20 it is not really for the faint-hearted (especially the abort handling
21 code), but it is a complete example. Defining NOOS will disable all the
22 fun, and definign VAILDATE will define SWI 1 to enter SVC mode, and SWI
23 0x11 to halt the emulator. */
47 #define unlink(s) remove(s)
51 #include <unistd.h> /* For SEEK_SET etc. */
55 extern int _fisatty (FILE *);
56 #define isatty_(f) _fisatty(f)
60 #define isatty_(f) isatty((f)->_file)
64 #define isatty_(f) (~ioctl ((f)->_file, FIOINTERACTIVE, NULL))
66 #define isatty_(f) isatty (fileno (f))
83 /* For RDIError_BreakpointReached. */
86 #include "gdb/callback.h"
87 extern host_callback
*sim_callback
;
89 extern unsigned ARMul_OSInit (ARMul_State
*);
90 extern void ARMul_OSExit (ARMul_State
*);
91 extern unsigned ARMul_OSHandleSWI (ARMul_State
*, ARMword
);
92 extern unsigned ARMul_OSException (ARMul_State
*, ARMword
, ARMword
);
93 extern ARMword
ARMul_OSLastErrorP (ARMul_State
*);
94 extern ARMword
ARMul_Debug (ARMul_State
*, ARMword
, ARMword
);
96 #define BUFFERSIZE 4096
100 #define UNIQUETEMPS 256
102 /* OS private Information. */
109 FILE *FileTable
[FOPEN_MAX
];
110 char FileFlags
[FOPEN_MAX
];
111 char *tempnames
[UNIQUETEMPS
];
120 #define FIXCRLF(t,c) ((t & BINARY) ? \
122 ((c == '\n' || c == '\r' ) ? (c ^ 7) : c) \
125 #define FIXCRLF(t,c) c
128 /* Bit mask of enabled SWI implementations. */
129 unsigned int swi_mask
= -1;
132 static ARMword softvectorcode
[] =
134 /* Installed instructions:
135 swi tidyexception + event;
138 swi generateexception + event. */
139 0xef000090, 0xe1a0e00f, 0xe89b8800, 0xef000080, /* Reset */
140 0xef000091, 0xe1a0e00f, 0xe89b8800, 0xef000081, /* Undef */
141 0xef000092, 0xe1a0e00f, 0xe89b8800, 0xef000082, /* SWI */
142 0xef000093, 0xe1a0e00f, 0xe89b8800, 0xef000083, /* Prefetch abort */
143 0xef000094, 0xe1a0e00f, 0xe89b8800, 0xef000084, /* Data abort */
144 0xef000095, 0xe1a0e00f, 0xe89b8800, 0xef000085, /* Address exception */
145 0xef000096, 0xe1a0e00f, 0xe89b8800, 0xef000086, /* IRQ */
146 0xef000097, 0xe1a0e00f, 0xe89b8800, 0xef000087, /* FIQ */
147 0xef000098, 0xe1a0e00f, 0xe89b8800, 0xef000088, /* Error */
148 0xe1a0f00e /* Default handler */
151 /* Time for the Operating System to initialise itself. */
154 ARMul_OSInit (ARMul_State
* state
)
159 struct OSblock
*OSptr
= (struct OSblock
*) state
->OSptr
;
161 if (state
->OSptr
== NULL
)
163 state
->OSptr
= (unsigned char *) malloc (sizeof (struct OSblock
));
164 if (state
->OSptr
== NULL
)
166 perror ("OS Memory");
171 OSptr
= (struct OSblock
*) state
->OSptr
;
173 state
->Reg
[13] = ADDRSUPERSTACK
; /* Set up a stack for the current mode... */
174 ARMul_SetReg (state
, SVC32MODE
, 13, ADDRSUPERSTACK
);/* ...and for supervisor mode... */
175 ARMul_SetReg (state
, ABORT32MODE
, 13, ADDRSUPERSTACK
);/* ...and for abort 32 mode... */
176 ARMul_SetReg (state
, UNDEF32MODE
, 13, ADDRSUPERSTACK
);/* ...and for undef 32 mode... */
177 ARMul_SetReg (state
, SYSTEMMODE
, 13, ADDRSUPERSTACK
);/* ...and for system mode. */
178 instr
= 0xe59ff000 | (ADDRSOFTVECTORS
- 8); /* Load pc from soft vector */
180 for (i
= ARMul_ResetV
; i
<= ARMFIQV
; i
+= 4)
181 /* Write hardware vectors. */
182 ARMul_WriteWord (state
, i
, instr
);
184 SWI_vector_installed
= 0;
186 for (i
= ARMul_ResetV
; i
<= ARMFIQV
+ 4; i
+= 4)
188 ARMul_WriteWord (state
, ADDRSOFTVECTORS
+ i
, SOFTVECTORCODE
+ i
* 4);
189 ARMul_WriteWord (state
, ADDRSOFHANDLERS
+ 2 * i
+ 4L,
190 SOFTVECTORCODE
+ sizeof (softvectorcode
) - 4L);
193 for (i
= 0; i
< sizeof (softvectorcode
); i
+= 4)
194 ARMul_WriteWord (state
, SOFTVECTORCODE
+ i
, softvectorcode
[i
/ 4]);
196 for (i
= 0; i
< FOPEN_MAX
; i
++)
197 OSptr
->FileTable
[i
] = NULL
;
199 for (i
= 0; i
< UNIQUETEMPS
; i
++)
200 OSptr
->tempnames
[i
] = NULL
;
202 ARMul_ConsolePrint (state
, ", Demon 1.01");
207 for (i
= 0; i
< fpesize
; i
+= 4)
209 ARMul_WriteWord (state
, FPESTART
+ i
, fpecode
[i
>> 2]);
211 /* Scan backwards from the end of the code. */
212 for (i
= FPESTART
+ fpesize
;; i
-= 4)
214 /* When we reach the marker value, break out of
215 the loop, leaving i pointing at the maker. */
216 if ((j
= ARMul_ReadWord (state
, i
)) == 0xffffffff)
219 /* If necessary, reverse the error strings. */
220 if (state
->bigendSig
&& j
< 0x80000000)
222 /* It's part of the string so swap it. */
223 j
= ((j
>> 0x18) & 0x000000ff) |
224 ((j
>> 0x08) & 0x0000ff00) |
225 ((j
<< 0x08) & 0x00ff0000) | ((j
<< 0x18) & 0xff000000);
226 ARMul_WriteWord (state
, i
, j
);
230 /* Copy old illegal instr vector. */
231 ARMul_WriteWord (state
, FPEOLDVECT
, ARMul_ReadWord (state
, ARMUndefinedInstrV
));
232 /* Install new vector. */
233 ARMul_WriteWord (state
, ARMUndefinedInstrV
, FPENEWVECT (ARMul_ReadWord (state
, i
- 4)));
234 ARMul_ConsolePrint (state
, ", FPE");
237 #endif /* VALIDATE */
240 /* Intel do not want DEMON SWI support. */
241 if (state
->is_XScale
)
242 swi_mask
= SWI_MASK_ANGEL
;
248 ARMul_OSExit (ARMul_State
* state
)
250 free ((char *) state
->OSptr
);
254 /* Return the last Operating System Error. */
256 ARMword
ARMul_OSLastErrorP (ARMul_State
* state
)
258 return ((struct OSblock
*) state
->OSptr
)->ErrorP
;
261 static int translate_open_mode
[] =
264 O_RDONLY
+ O_BINARY
, /* "rb" */
266 O_RDWR
+ O_BINARY
, /* "r+b" */
267 O_WRONLY
+ O_CREAT
+ O_TRUNC
, /* "w" */
268 O_WRONLY
+ O_BINARY
+ O_CREAT
+ O_TRUNC
, /* "wb" */
269 O_RDWR
+ O_CREAT
+ O_TRUNC
, /* "w+" */
270 O_RDWR
+ O_BINARY
+ O_CREAT
+ O_TRUNC
, /* "w+b" */
271 O_WRONLY
+ O_APPEND
+ O_CREAT
, /* "a" */
272 O_WRONLY
+ O_BINARY
+ O_APPEND
+ O_CREAT
, /* "ab" */
273 O_RDWR
+ O_APPEND
+ O_CREAT
, /* "a+" */
274 O_RDWR
+ O_BINARY
+ O_APPEND
+ O_CREAT
/* "a+b" */
278 SWIWrite0 (ARMul_State
* state
, ARMword addr
)
281 struct OSblock
*OSptr
= (struct OSblock
*) state
->OSptr
;
283 while ((temp
= ARMul_SafeReadByte (state
, addr
++)) != 0)
286 /* Note - we cannot just cast 'temp' to a (char *) here,
287 since on a big-endian host the byte value will end
288 up in the wrong place and a nul character will be printed. */
289 (void) sim_callback
->write_stdout (sim_callback
, & buffer
, 1);
292 OSptr
->ErrorNo
= sim_callback
->get_errno (sim_callback
);
296 WriteCommandLineTo (ARMul_State
* state
, ARMword addr
)
299 char *cptr
= state
->CommandLine
;
305 temp
= (ARMword
) * cptr
++;
306 ARMul_SafeWriteByte (state
, addr
++, temp
);
312 SWIopen (ARMul_State
* state
, ARMword name
, ARMword SWIflags
)
314 struct OSblock
*OSptr
= (struct OSblock
*) state
->OSptr
;
319 for (i
= 0; (dummy
[i
] = ARMul_SafeReadByte (state
, name
+ i
)); i
++)
322 /* Now we need to decode the Demon open mode. */
323 flags
= translate_open_mode
[SWIflags
];
325 /* Filename ":tt" is special: it denotes stdin/out. */
326 if (strcmp (dummy
, ":tt") == 0)
328 if (flags
== O_RDONLY
) /* opening tty "r" */
329 state
->Reg
[0] = 0; /* stdin */
331 state
->Reg
[0] = 1; /* stdout */
335 state
->Reg
[0] = sim_callback
->open (sim_callback
, dummy
, flags
);
336 OSptr
->ErrorNo
= sim_callback
->get_errno (sim_callback
);
341 SWIread (ARMul_State
* state
, ARMword f
, ARMword ptr
, ARMword len
)
343 struct OSblock
*OSptr
= (struct OSblock
*) state
->OSptr
;
346 char *local
= malloc (len
);
350 sim_callback
->printf_filtered
352 "sim: Unable to read 0x%ulx bytes - out of memory\n",
357 res
= sim_callback
->read (sim_callback
, f
, local
, len
);
359 for (i
= 0; i
< res
; i
++)
360 ARMul_SafeWriteByte (state
, ptr
+ i
, local
[i
]);
363 state
->Reg
[0] = res
== -1 ? -1 : len
- res
;
364 OSptr
->ErrorNo
= sim_callback
->get_errno (sim_callback
);
368 SWIwrite (ARMul_State
* state
, ARMword f
, ARMword ptr
, ARMword len
)
370 struct OSblock
*OSptr
= (struct OSblock
*) state
->OSptr
;
373 char *local
= malloc (len
);
377 sim_callback
->printf_filtered
379 "sim: Unable to write 0x%lx bytes - out of memory\n",
384 for (i
= 0; i
< len
; i
++)
385 local
[i
] = ARMul_SafeReadByte (state
, ptr
+ i
);
387 res
= sim_callback
->write (sim_callback
, f
, local
, len
);
388 state
->Reg
[0] = res
== -1 ? -1 : len
- res
;
391 OSptr
->ErrorNo
= sim_callback
->get_errno (sim_callback
);
395 SWIflen (ARMul_State
* state
, ARMword fh
)
397 struct OSblock
*OSptr
= (struct OSblock
*) state
->OSptr
;
400 if (fh
== 0 || fh
> FOPEN_MAX
)
402 OSptr
->ErrorNo
= EBADF
;
407 addr
= sim_callback
->lseek (sim_callback
, fh
, 0, SEEK_CUR
);
409 state
->Reg
[0] = sim_callback
->lseek (sim_callback
, fh
, 0L, SEEK_END
);
410 (void) sim_callback
->lseek (sim_callback
, fh
, addr
, SEEK_SET
);
412 OSptr
->ErrorNo
= sim_callback
->get_errno (sim_callback
);
415 /* The emulator calls this routine when a SWI instruction is encuntered.
416 The parameter passed is the SWI number (lower 24 bits of the instruction). */
419 ARMul_OSHandleSWI (ARMul_State
* state
, ARMword number
)
421 struct OSblock
* OSptr
= (struct OSblock
*) state
->OSptr
;
422 int unhandled
= FALSE
;
427 if (swi_mask
& SWI_MASK_DEMON
)
428 SWIread (state
, state
->Reg
[0], state
->Reg
[1], state
->Reg
[2]);
434 if (swi_mask
& SWI_MASK_DEMON
)
435 SWIwrite (state
, state
->Reg
[0], state
->Reg
[1], state
->Reg
[2]);
441 if (swi_mask
& SWI_MASK_DEMON
)
442 SWIopen (state
, state
->Reg
[0], state
->Reg
[1]);
448 if (swi_mask
& SWI_MASK_DEMON
)
450 /* Return number of centi-seconds. */
452 #ifdef CLOCKS_PER_SEC
453 (CLOCKS_PER_SEC
>= 100)
454 ? (ARMword
) (clock () / (CLOCKS_PER_SEC
/ 100))
455 : (ARMword
) ((clock () * 100) / CLOCKS_PER_SEC
);
457 /* Presume unix... clock() returns microseconds. */
458 (ARMword
) (clock () / 10000);
460 OSptr
->ErrorNo
= errno
;
467 if (swi_mask
& SWI_MASK_DEMON
)
469 state
->Reg
[0] = (ARMword
) sim_callback
->time (sim_callback
, NULL
);
470 OSptr
->ErrorNo
= sim_callback
->get_errno (sim_callback
);
477 if (swi_mask
& SWI_MASK_DEMON
)
479 state
->Reg
[0] = sim_callback
->close (sim_callback
, state
->Reg
[0]);
480 OSptr
->ErrorNo
= sim_callback
->get_errno (sim_callback
);
487 if (swi_mask
& SWI_MASK_DEMON
)
488 SWIflen (state
, state
->Reg
[0]);
494 if (swi_mask
& SWI_MASK_DEMON
)
495 state
->Emulate
= FALSE
;
501 if (swi_mask
& SWI_MASK_DEMON
)
503 /* We must return non-zero for failure. */
504 state
->Reg
[0] = -1 >= sim_callback
->lseek (sim_callback
, state
->Reg
[0], state
->Reg
[1], SEEK_SET
);
505 OSptr
->ErrorNo
= sim_callback
->get_errno (sim_callback
);
512 if (swi_mask
& SWI_MASK_DEMON
)
514 char tmp
= state
->Reg
[0];
515 (void) sim_callback
->write_stdout (sim_callback
, &tmp
, 1);
516 OSptr
->ErrorNo
= sim_callback
->get_errno (sim_callback
);
523 if (swi_mask
& SWI_MASK_DEMON
)
524 SWIWrite0 (state
, state
->Reg
[0]);
530 if (swi_mask
& SWI_MASK_DEMON
)
531 state
->Reg
[0] = OSptr
->ErrorNo
;
537 if (swi_mask
& SWI_MASK_DEMON
)
539 state
->Reg
[0] = ADDRCMDLINE
;
541 state
->Reg
[1] = state
->MemSize
;
543 state
->Reg
[1] = ADDRUSERSTACK
;
545 WriteCommandLineTo (state
, state
->Reg
[0]);
552 state
->EndCondition
= RDIError_BreakpointReached
;
553 state
->Emulate
= FALSE
;
556 /* Handle Angel SWIs as well as Demon ones. */
559 if (swi_mask
& SWI_MASK_ANGEL
)
564 /* R1 is almost always a parameter block. */
565 addr
= state
->Reg
[1];
566 /* R0 is a reason code. */
567 switch (state
->Reg
[0])
570 /* This can happen when a SWI is interrupted (eg receiving a
571 ctrl-C whilst processing SWIRead()). The SWI will complete
572 returning -1 in r0 to the caller. If GDB is then used to
573 resume the system call the reason code will now be -1. */
576 /* Unimplemented reason codes. */
577 case AngelSWI_Reason_ReadC
:
578 case AngelSWI_Reason_IsTTY
:
579 case AngelSWI_Reason_TmpNam
:
580 case AngelSWI_Reason_Remove
:
581 case AngelSWI_Reason_Rename
:
582 case AngelSWI_Reason_System
:
583 case AngelSWI_Reason_EnterSVC
:
585 state
->Emulate
= FALSE
;
588 case AngelSWI_Reason_Clock
:
589 /* Return number of centi-seconds. */
591 #ifdef CLOCKS_PER_SEC
592 (CLOCKS_PER_SEC
>= 100)
593 ? (ARMword
) (clock () / (CLOCKS_PER_SEC
/ 100))
594 : (ARMword
) ((clock () * 100) / CLOCKS_PER_SEC
);
596 /* Presume unix... clock() returns microseconds. */
597 (ARMword
) (clock () / 10000);
599 OSptr
->ErrorNo
= errno
;
602 case AngelSWI_Reason_Time
:
603 state
->Reg
[0] = (ARMword
) sim_callback
->time (sim_callback
, NULL
);
604 OSptr
->ErrorNo
= sim_callback
->get_errno (sim_callback
);
607 case AngelSWI_Reason_WriteC
:
609 char tmp
= ARMul_SafeReadByte (state
, addr
);
610 (void) sim_callback
->write_stdout (sim_callback
, &tmp
, 1);
611 OSptr
->ErrorNo
= sim_callback
->get_errno (sim_callback
);
615 case AngelSWI_Reason_Write0
:
616 SWIWrite0 (state
, addr
);
619 case AngelSWI_Reason_Close
:
620 state
->Reg
[0] = sim_callback
->close (sim_callback
, ARMul_ReadWord (state
, addr
));
621 OSptr
->ErrorNo
= sim_callback
->get_errno (sim_callback
);
624 case AngelSWI_Reason_Seek
:
625 state
->Reg
[0] = -1 >= sim_callback
->lseek (sim_callback
, ARMul_ReadWord (state
, addr
),
626 ARMul_ReadWord (state
, addr
+ 4),
628 OSptr
->ErrorNo
= sim_callback
->get_errno (sim_callback
);
631 case AngelSWI_Reason_FLen
:
632 SWIflen (state
, ARMul_ReadWord (state
, addr
));
635 case AngelSWI_Reason_GetCmdLine
:
636 WriteCommandLineTo (state
, ARMul_ReadWord (state
, addr
));
639 case AngelSWI_Reason_HeapInfo
:
640 /* R1 is a pointer to a pointer. */
641 addr
= ARMul_ReadWord (state
, addr
);
643 /* Pick up the right memory limit. */
645 temp
= state
->MemSize
;
647 temp
= ADDRUSERSTACK
;
649 ARMul_WriteWord (state
, addr
, 0); /* Heap base. */
650 ARMul_WriteWord (state
, addr
+ 4, temp
); /* Heap limit. */
651 ARMul_WriteWord (state
, addr
+ 8, temp
); /* Stack base. */
652 ARMul_WriteWord (state
, addr
+ 12, temp
); /* Stack limit. */
655 case AngelSWI_Reason_ReportException
:
656 if (state
->Reg
[1] == ADP_Stopped_ApplicationExit
)
660 state
->Emulate
= FALSE
;
663 case ADP_Stopped_ApplicationExit
:
665 state
->Emulate
= FALSE
;
668 case ADP_Stopped_RunTimeError
:
670 state
->Emulate
= FALSE
;
673 case AngelSWI_Reason_Errno
:
674 state
->Reg
[0] = OSptr
->ErrorNo
;
677 case AngelSWI_Reason_Open
:
679 ARMul_ReadWord (state
, addr
),
680 ARMul_ReadWord (state
, addr
+ 4));
683 case AngelSWI_Reason_Read
:
685 ARMul_ReadWord (state
, addr
),
686 ARMul_ReadWord (state
, addr
+ 4),
687 ARMul_ReadWord (state
, addr
+ 8));
690 case AngelSWI_Reason_Write
:
692 ARMul_ReadWord (state
, addr
),
693 ARMul_ReadWord (state
, addr
+ 4),
694 ARMul_ReadWord (state
, addr
+ 8));
702 /* The following SWIs are generated by the softvectorcode[]
703 installed by default by the simulator. */
704 case 0x91: /* Undefined Instruction. */
706 ARMword addr
= state
->RegBank
[UNDEFBANK
][14] - 4;
708 sim_callback
->printf_filtered
709 (sim_callback
, "sim: exception: Unhandled Instruction '0x%08x' at 0x%08x. Stopping.\n",
710 ARMul_ReadWord (state
, addr
), addr
);
711 state
->EndCondition
= RDIError_SoftwareInterrupt
;
712 state
->Emulate
= FALSE
;
716 case 0x90: /* Reset. */
717 case 0x92: /* SWI. */
718 /* These two can be safely ignored. */
721 case 0x93: /* Prefetch Abort. */
722 case 0x94: /* Data Abort. */
723 case 0x95: /* Address Exception. */
724 case 0x96: /* IRQ. */
725 case 0x97: /* FIQ. */
726 case 0x98: /* Error. */
731 /* This can happen when a SWI is interrupted (eg receiving a
732 ctrl-C whilst processing SWIRead()). The SWI will complete
733 returning -1 in r0 to the caller. If GDB is then used to
734 resume the system call the reason code will now be -1. */
737 case 0x180001: /* RedBoot's Syscall SWI in ARM mode. */
738 if (swi_mask
& SWI_MASK_REDBOOT
)
740 switch (state
->Reg
[0])
742 /* These numbers are defined in libgloss/syscall.h
743 but the simulator should not be dependend upon
744 libgloss being installed. */
746 state
->Emulate
= FALSE
;
747 /* Copy exit code into r0. */
748 state
->Reg
[0] = state
->Reg
[1];
752 SWIopen (state
, state
->Reg
[1], state
->Reg
[2]);
756 state
->Reg
[0] = sim_callback
->close (sim_callback
, state
->Reg
[1]);
757 OSptr
->ErrorNo
= sim_callback
->get_errno (sim_callback
);
761 SWIread (state
, state
->Reg
[1], state
->Reg
[2], state
->Reg
[3]);
765 SWIwrite (state
, state
->Reg
[1], state
->Reg
[2], state
->Reg
[3]);
769 state
->Reg
[0] = sim_callback
->lseek (sim_callback
,
773 OSptr
->ErrorNo
= sim_callback
->get_errno (sim_callback
);
776 case 17: /* Utime. */
777 state
->Reg
[0] = (ARMword
) sim_callback
->time (sim_callback
,
778 (long *) state
->Reg
[1]);
779 OSptr
->ErrorNo
= sim_callback
->get_errno (sim_callback
);
782 case 7: /* Unlink. */
783 case 8: /* Getpid. */
785 case 10: /* Fstat. */
787 case 12: /* Argvlen. */
789 case 14: /* ChDir. */
791 case 16: /* Chmod. */
793 sim_callback
->printf_filtered
795 "sim: unhandled RedBoot syscall '%d' encountered - ignoring\n",
800 sim_callback
->printf_filtered
802 "sim: unknown RedBoot syscall '%d' encountered - ignoring\n",
815 if (SWI_vector_installed
)
820 cpsr
= ARMul_GetCPSR (state
);
823 ARMul_SetSPSR (state
, SVC32MODE
, cpsr
);
826 cpsr
|= SVC32MODE
| 0x80;
827 ARMul_SetCPSR (state
, cpsr
);
829 state
->RegBank
[SVCBANK
][14] = state
->Reg
[14] = state
->Reg
[15] - i_size
;
830 state
->NextInstr
= RESUME
;
831 state
->Reg
[15] = state
->pc
= ARMSWIV
;
836 sim_callback
->printf_filtered
838 "sim: unknown SWI encountered - %x - ignoring\n",
850 /* The emulator calls this routine when an Exception occurs. The second
851 parameter is the address of the relevant exception vector. Returning
852 FALSE from this routine causes the trap to be taken, TRUE causes it to
853 be ignored (so set state->Emulate to FALSE!). */
856 ARMul_OSException (ARMul_State
* state ATTRIBUTE_UNUSED
,
857 ARMword vector ATTRIBUTE_UNUSED
,
858 ARMword pc ATTRIBUTE_UNUSED
)