aboutsummaryrefslogtreecommitdiff
path: root/sim/arm
diff options
context:
space:
mode:
Diffstat (limited to 'sim/arm')
-rw-r--r--sim/arm/ChangeLog6
-rw-r--r--sim/arm/armos.c174
2 files changed, 109 insertions, 71 deletions
diff --git a/sim/arm/ChangeLog b/sim/arm/ChangeLog
index 2c893e0..ed472d4 100644
--- a/sim/arm/ChangeLog
+++ b/sim/arm/ChangeLog
@@ -1,3 +1,9 @@
+2000-12-03 Nick Clifton <nickc@redhat.com>
+
+ * armos.c: Fix formatting.
+ (ARMul_OSHandleSWI): Suppress support of DEMON SWIs when in xscale
+ mode.
+
2000-11-29 Nick Clifton <nickc@redhat.com>
* armdefs.h (State): Add 'v5e' and 'xscale' fields.
diff --git a/sim/arm/armos.c b/sim/arm/armos.c
index 62b3ff5..47ceb8b 100644
--- a/sim/arm/armos.c
+++ b/sim/arm/armos.c
@@ -16,11 +16,11 @@
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
/* This file contains a model of Demon, ARM Ltd's Debug Monitor,
-including all the SWI's required to support the C library. The code in
-it is not really for the faint-hearted (especially the abort handling
-code), but it is a complete example. Defining NOOS will disable all the
-fun, and definign VAILDATE will define SWI 1 to enter SVC mode, and SWI
-0x11 to halt the emulator. */
+ including all the SWI's required to support the C library. The code in
+ it is not really for the faint-hearted (especially the abort handling
+ code), but it is a complete example. Defining NOOS will disable all the
+ fun, and definign VAILDATE will define SWI 1 to enter SVC mode, and SWI
+ 0x11 to halt the emulator. */
#include "config.h"
#include "ansidecl.h"
@@ -97,9 +97,7 @@ extern ARMword ARMul_Debug (ARMul_State * state, ARMword pc, ARMword instr);
#endif
#define UNIQUETEMPS 256
-/***************************************************************************\
-* OS private Information *
-\***************************************************************************/
+/* OS private Information. */
struct OSblock
{
@@ -126,23 +124,22 @@ struct OSblock
#endif
static ARMword softvectorcode[] =
-{ /* basic: swi tidyexception + event; mov pc, lr;
- ldmia r11,{r11,pc}; swi generateexception + event. */
- 0xef000090, 0xe1a0e00f, 0xe89b8800, 0xef000080, /*Reset */
- 0xef000091, 0xe1a0e00f, 0xe89b8800, 0xef000081, /*Undef */
- 0xef000092, 0xe1a0e00f, 0xe89b8800, 0xef000082, /*SWI */
- 0xef000093, 0xe1a0e00f, 0xe89b8800, 0xef000083, /*Prefetch abort */
- 0xef000094, 0xe1a0e00f, 0xe89b8800, 0xef000084, /*Data abort */
- 0xef000095, 0xe1a0e00f, 0xe89b8800, 0xef000085, /*Address exception */
- 0xef000096, 0xe1a0e00f, 0xe89b8800, 0xef000086, /*IRQ*/
- 0xef000097, 0xe1a0e00f, 0xe89b8800, 0xef000087, /*FIQ*/
- 0xef000098, 0xe1a0e00f, 0xe89b8800, 0xef000088, /*Error */
- 0xe1a0f00e /* default handler */
+{
+ /* Basic: swi tidyexception + event; mov pc, lr;
+ ldmia r11,{r11,pc}; swi generateexception + event. */
+ 0xef000090, 0xe1a0e00f, 0xe89b8800, 0xef000080, /* Reset */
+ 0xef000091, 0xe1a0e00f, 0xe89b8800, 0xef000081, /* Undef */
+ 0xef000092, 0xe1a0e00f, 0xe89b8800, 0xef000082, /* SWI */
+ 0xef000093, 0xe1a0e00f, 0xe89b8800, 0xef000083, /* Prefetch abort */
+ 0xef000094, 0xe1a0e00f, 0xe89b8800, 0xef000084, /* Data abort */
+ 0xef000095, 0xe1a0e00f, 0xe89b8800, 0xef000085, /* Address exception */
+ 0xef000096, 0xe1a0e00f, 0xe89b8800, 0xef000086, /* IRQ */
+ 0xef000097, 0xe1a0e00f, 0xe89b8800, 0xef000087, /* FIQ */
+ 0xef000098, 0xe1a0e00f, 0xe89b8800, 0xef000088, /* Error */
+ 0xe1a0f00e /* Default handler */
};
-/***************************************************************************\
-* Time for the Operating System to initialise itself. *
-\***************************************************************************/
+/* Time for the Operating System to initialise itself. */
unsigned
ARMul_OSInit (ARMul_State * state)
@@ -161,6 +158,7 @@ ARMul_OSInit (ARMul_State * state)
exit (15);
}
}
+
OSptr = (struct OSblock *) state->OSptr;
OSptr->ErrorP = 0;
state->Reg[13] = ADDRSUPERSTACK; /* set up a stack for the current mode */
@@ -169,20 +167,26 @@ ARMul_OSInit (ARMul_State * state)
ARMul_SetReg (state, UNDEF32MODE, 13, ADDRSUPERSTACK); /* and for undef 32 mode */
ARMul_SetReg (state, SYSTEMMODE, 13, ADDRSUPERSTACK); /* and for system mode */
instr = 0xe59ff000 | (ADDRSOFTVECTORS - 8); /* load pc from soft vector */
+
for (i = ARMul_ResetV; i <= ARMFIQV; i += 4)
ARMul_WriteWord (state, i, instr); /* write hardware vectors */
+
for (i = ARMul_ResetV; i <= ARMFIQV + 4; i += 4)
{
ARMul_WriteWord (state, ADDRSOFTVECTORS + i, SOFTVECTORCODE + i * 4);
ARMul_WriteWord (state, ADDRSOFHANDLERS + 2 * i + 4L,
SOFTVECTORCODE + sizeof (softvectorcode) - 4L);
}
+
for (i = 0; i < sizeof (softvectorcode); i += 4)
ARMul_WriteWord (state, SOFTVECTORCODE + i, softvectorcode[i / 4]);
+
for (i = 0; i < FOPEN_MAX; i++)
OSptr->FileTable[i] = NULL;
+
for (i = 0; i < UNIQUETEMPS; i++)
OSptr->tempnames[i] = NULL;
+
ARMul_ConsolePrint (state, ", Demon 1.01");
/* #ifndef ASIM */
@@ -190,6 +194,7 @@ ARMul_OSInit (ARMul_State * state)
/* install fpe */
for (i = 0; i < fpesize; i += 4) /* copy the code */
ARMul_WriteWord (state, FPESTART + i, fpecode[i >> 2]);
+
for (i = FPESTART + fpesize;; i -= 4)
{ /* reverse the error strings */
if ((j = ARMul_ReadWord (state, i)) == 0xffffffff)
@@ -202,6 +207,7 @@ ARMul_OSInit (ARMul_State * state)
ARMul_WriteWord (state, i, j);
}
}
+
ARMul_WriteWord (state, FPEOLDVECT, ARMul_ReadWord (state, 4)); /* copy old illegal instr vector */
ARMul_WriteWord (state, 4, FPENEWVECT (ARMul_ReadWord (state, i - 4))); /* install new vector */
ARMul_ConsolePrint (state, ", FPE");
@@ -210,7 +216,7 @@ ARMul_OSInit (ARMul_State * state)
#endif /* VALIDATE */
#endif /* NOOS */
- return (TRUE);
+ return TRUE;
}
void
@@ -220,16 +226,15 @@ ARMul_OSExit (ARMul_State * state)
}
-/***************************************************************************\
-* Return the last Operating System Error. *
-\***************************************************************************/
+/* Return the last Operating System Error. */
ARMword ARMul_OSLastErrorP (ARMul_State * state)
{
return ((struct OSblock *) state->OSptr)->ErrorP;
}
-static int translate_open_mode[] = {
+static int translate_open_mode[] =
+{
O_RDONLY, /* "r" */
O_RDONLY + O_BINARY, /* "rb" */
O_RDWR, /* "r+" */
@@ -261,6 +266,7 @@ WriteCommandLineTo (ARMul_State * state, ARMword addr)
{
ARMword temp;
char *cptr = state->CommandLine;
+
if (cptr == NULL)
cptr = "\0";
do
@@ -282,10 +288,10 @@ SWIopen (ARMul_State * state, ARMword name, ARMword SWIflags)
for (i = 0; (dummy[i] = ARMul_ReadByte (state, name + i)); i++)
;
- /* Now we need to decode the Demon open mode */
+ /* Now we need to decode the Demon open mode. */
flags = translate_open_mode[SWIflags];
- /* Filename ":tt" is special: it denotes stdin/out */
+ /* Filename ":tt" is special: it denotes stdin/out. */
if (strcmp (dummy, ":tt") == 0)
{
if (flags == O_RDONLY) /* opening tty "r" */
@@ -319,6 +325,7 @@ SWIread (ARMul_State * state, ARMword f, ARMword ptr, ARMword len)
if (res > 0)
for (i = 0; i < res; i++)
ARMul_WriteByte (state, ptr + i, local[i]);
+
free (local);
state->Reg[0] = res == -1 ? -1 : len - res;
OSptr->ErrorNo = errno;
@@ -345,6 +352,7 @@ SWIwrite (ARMul_State * state, ARMword f, ARMword ptr, ARMword len)
res = write (f, local, len);
state->Reg[0] = res == -1 ? -1 : len - res;
free (local);
+
OSptr->ErrorNo = errno;
}
@@ -369,17 +377,39 @@ SWIflen (ARMul_State * state, ARMword fh)
OSptr->ErrorNo = errno;
}
-/***************************************************************************\
-* The emulator calls this routine when a SWI instruction is encuntered. The *
-* parameter passed is the SWI number (lower 24 bits of the instruction). *
-\***************************************************************************/
+/* The emulator calls this routine when a SWI instruction is encuntered.
+ The parameter passed is the SWI number (lower 24 bits of the instruction). */
unsigned
ARMul_OSHandleSWI (ARMul_State * state, ARMword number)
{
ARMword addr, temp;
struct OSblock *OSptr = (struct OSblock *) state->OSptr;
-
+ ARMword saved_number = 0;
+
+ /* Intel do not want DEMON SWI support. */
+ if (state->is_XScale)
+ switch (number)
+ {
+ case SWI_Read:
+ case SWI_Write:
+ case SWI_Open:
+ case SWI_Clock:
+ case SWI_Time:
+ case SWI_Close:
+ case SWI_Flen:
+ case SWI_Exit:
+ case SWI_Seek:
+ case SWI_WriteC:
+ case SWI_Write0:
+ case SWI_GetErrno:
+ case SWI_GetEnv:
+ saved_number = number;
+ number = -1;
+ default:
+ break;
+ }
+
switch (number)
{
case SWI_Read:
@@ -395,23 +425,23 @@ ARMul_OSHandleSWI (ARMul_State * state, ARMword number)
return TRUE;
case SWI_Clock:
- /* return number of centi-seconds... */
+ /* Return number of centi-seconds. */
state->Reg[0] =
#ifdef CLOCKS_PER_SEC
(CLOCKS_PER_SEC >= 100)
? (ARMword) (clock () / (CLOCKS_PER_SEC / 100))
: (ARMword) ((clock () * 100) / CLOCKS_PER_SEC);
#else
- /* presume unix... clock() returns microseconds */
+ /* Presume unix... clock() returns microseconds. */
(ARMword) (clock () / 10000);
#endif
OSptr->ErrorNo = errno;
- return (TRUE);
+ return TRUE;
case SWI_Time:
state->Reg[0] = (ARMword) time (NULL);
OSptr->ErrorNo = errno;
- return (TRUE);
+ return TRUE;
case SWI_Close:
state->Reg[0] = close (state->Reg[0]);
@@ -420,7 +450,7 @@ ARMul_OSHandleSWI (ARMul_State * state, ARMword number)
case SWI_Flen:
SWIflen (state, state->Reg[0]);
- return (TRUE);
+ return TRUE;
case SWI_Exit:
state->Emulate = FALSE;
@@ -428,7 +458,7 @@ ARMul_OSHandleSWI (ARMul_State * state, ARMword number)
case SWI_Seek:
{
- /* We must return non-zero for failure */
+ /* We must return non-zero for failure. */
state->Reg[0] = -1 >= lseek (state->Reg[0], state->Reg[1], SEEK_SET);
OSptr->ErrorNo = errno;
return TRUE;
@@ -437,15 +467,15 @@ ARMul_OSHandleSWI (ARMul_State * state, ARMword number)
case SWI_WriteC:
(void) fputc ((int) state->Reg[0], stdout);
OSptr->ErrorNo = errno;
- return (TRUE);
+ return TRUE;
case SWI_Write0:
SWIWrite0 (state, state->Reg[0]);
- return (TRUE);
+ return TRUE;
case SWI_GetErrno:
state->Reg[0] = OSptr->ErrorNo;
- return (TRUE);
+ return TRUE;
case SWI_GetEnv:
state->Reg[0] = ADDRCMDLINE;
@@ -455,22 +485,22 @@ ARMul_OSHandleSWI (ARMul_State * state, ARMword number)
state->Reg[1] = ADDRUSERSTACK;
WriteCommandLineTo (state, state->Reg[0]);
- return (TRUE);
-
+ return TRUE;
+
case SWI_Breakpoint:
state->EndCondition = RDIError_BreakpointReached;
state->Emulate = FALSE;
- return (TRUE);
+ return TRUE;
- /* Handle Angel SWIs as well as Demon ones */
+ /* Handle Angel SWIs as well as Demon ones. */
case AngelSWI_ARM:
case AngelSWI_Thumb:
- /* R1 is almost always a parameter block */
+ /* R1 is almost always a parameter block. */
addr = state->Reg[1];
- /* R0 is a reason code */
+ /* R0 is a reason code. */
switch (state->Reg[0])
{
- /* Unimplemented reason codes */
+ /* Unimplemented reason codes. */
case AngelSWI_Reason_ReadC:
case AngelSWI_Reason_IsTTY:
case AngelSWI_Reason_TmpNam:
@@ -480,61 +510,61 @@ ARMul_OSHandleSWI (ARMul_State * state, ARMword number)
case AngelSWI_Reason_EnterSVC:
default:
state->Emulate = FALSE;
- return (FALSE);
+ return FALSE;
case AngelSWI_Reason_Clock:
- /* return number of centi-seconds... */
+ /* Return number of centi-seconds. */
state->Reg[0] =
#ifdef CLOCKS_PER_SEC
(CLOCKS_PER_SEC >= 100)
? (ARMword) (clock () / (CLOCKS_PER_SEC / 100))
: (ARMword) ((clock () * 100) / CLOCKS_PER_SEC);
#else
- /* presume unix... clock() returns microseconds */
+ /* Presume unix... clock() returns microseconds. */
(ARMword) (clock () / 10000);
#endif
OSptr->ErrorNo = errno;
- return (TRUE);
+ return TRUE;
case AngelSWI_Reason_Time:
state->Reg[0] = (ARMword) time (NULL);
OSptr->ErrorNo = errno;
- return (TRUE);
+ return TRUE;
case AngelSWI_Reason_WriteC:
(void) fputc ((int) ARMul_ReadByte (state, addr), stdout);
OSptr->ErrorNo = errno;
- return (TRUE);
+ return TRUE;
case AngelSWI_Reason_Write0:
SWIWrite0 (state, addr);
- return (TRUE);
+ return TRUE;
case AngelSWI_Reason_Close:
state->Reg[0] = close (ARMul_ReadWord (state, addr));
OSptr->ErrorNo = errno;
- return (TRUE);
+ return TRUE;
case AngelSWI_Reason_Seek:
state->Reg[0] = -1 >= lseek (ARMul_ReadWord (state, addr),
ARMul_ReadWord (state, addr + 4),
SEEK_SET);
OSptr->ErrorNo = errno;
- return (TRUE);
+ return TRUE;
case AngelSWI_Reason_FLen:
SWIflen (state, ARMul_ReadWord (state, addr));
- return (TRUE);
+ return TRUE;
case AngelSWI_Reason_GetCmdLine:
WriteCommandLineTo (state, ARMul_ReadWord (state, addr));
- return (TRUE);
+ return TRUE;
case AngelSWI_Reason_HeapInfo:
- /* R1 is a pointer to a pointer */
+ /* R1 is a pointer to a pointer. */
addr = ARMul_ReadWord (state, addr);
- /* Pick up the right memory limit */
+ /* Pick up the right memory limit. */
if (state->MemSize)
temp = state->MemSize;
else
@@ -544,7 +574,7 @@ ARMul_OSHandleSWI (ARMul_State * state, ARMword number)
ARMul_WriteWord (state, addr + 4, temp); /* Heap limit */
ARMul_WriteWord (state, addr + 8, temp); /* Stack base */
ARMul_WriteWord (state, addr + 12, temp); /* Stack limit */
- return (TRUE);
+ return TRUE;
case AngelSWI_Reason_ReportException:
if (state->Reg[1] == ADP_Stopped_ApplicationExit)
@@ -557,16 +587,16 @@ ARMul_OSHandleSWI (ARMul_State * state, ARMword number)
case ADP_Stopped_ApplicationExit:
state->Reg[0] = 0;
state->Emulate = FALSE;
- return (TRUE);
+ return TRUE;
case ADP_Stopped_RunTimeError:
state->Reg[0] = -1;
state->Emulate = FALSE;
- return (TRUE);
+ return TRUE;
case AngelSWI_Reason_Errno:
state->Reg[0] = OSptr->ErrorNo;
- return (TRUE);
+ return TRUE;
case AngelSWI_Reason_Open:
SWIopen (state,
@@ -598,7 +628,10 @@ ARMul_OSHandleSWI (ARMul_State * state, ARMword number)
{
/* If there is a SWI vector installed use it. */
extern int SWI_vector_installed;
-
+
+ if (state->is_XScale && saved_number != -1)
+ number = saved_number;
+
if (SWI_vector_installed && number != SWI_Breakpoint)
{
ARMword cpsr;
@@ -634,8 +667,7 @@ ARMul_OSHandleSWI (ARMul_State * state, ARMword number)
be ignored (so set state->Emulate to FALSE!). */
unsigned
-ARMul_OSException (
- ARMul_State * state ATTRIBUTE_UNUSED,
+ARMul_OSException (ARMul_State * state ATTRIBUTE_UNUSED,
ARMword vector ATTRIBUTE_UNUSED,
ARMword pc ATTRIBUTE_UNUSED)
{