This is the mail archive of the
gdb-patches@sources.redhat.com
mailing list for the GDB project.
PATCH: Fix ARM "open" simulation
- From: Mark Mitchell <mark at codesourcery dot com>
- To: gdb-patches at sources dot redhat dot com
- Cc: nickc at redhat dot com
- Date: Mon, 29 Dec 2003 11:56:31 -0800
- Subject: PATCH: Fix ARM "open" simulation
- Reply-to: mark at codesourcery dot com
This obvious patch fixes a bug in the ARM simulator. The
translate_open_mode table mapped ARM SWI open modes into UNIX-style
open modes -- but for the *host* operating system rather than for the
*target* operating system. The generic simulation code will translate
from the target system to the host system, so it is wrong to do that
in armos.c. Without this patch, the wrong value was used for things
like O_TRUNC when building a GNU/Linux-hosted simulator targeting ARM,
resulting in some very weird failure modes.
Tested on i686-pc-linux-gnu by running the SIM testsuite and the
libstdc++-v3 testsuite.
I've applied this patch.
--
Mark Mitchell
CodeSourcery, LLC
mark@codesourcery.com
2003-12-29 Mark Mitchell <mark@codesourcery.com>
* armos.c (fcntl.h): Do not include it.
(O_RDONLY): Do not define.
(O_WRONLY): Likewise.
(O_RDWR): Likewise.
(targ-vals.h): Include it.
(translate_open_mode): Use TARGET_O_* instead of O_*.
(SWIopen): Likewise.
* Makefile.in (armos.o): Depend on targ-vals.h.
Index: sim/arm/Makefile.in
===================================================================
RCS file: /cvs/src/src/sim/arm/Makefile.in,v
retrieving revision 1.8
diff -c -5 -p -r1.8 Makefile.in
*** sim/arm/Makefile.in 30 Mar 2003 10:39:22 -0000 1.8
--- sim/arm/Makefile.in 29 Dec 2003 19:49:57 -0000
*************** SIM_OBJS = armemu26.o armemu32.o arminit
*** 26,36 ****
armvirt.o bag.o thumbemu.o wrapper.o sim-load.o $(COPRO)
## COMMON_POST_CONFIG_FRAG
! armos.o: armos.c armdefs.h armos.h armfpe.h
armcopro.o: armcopro.c armdefs.h
maverick.o: maverick.c armdefs.h
iwmmxt.o: iwmmxt.c iwmmxt.h armdefs.h
--- 26,36 ----
armvirt.o bag.o thumbemu.o wrapper.o sim-load.o $(COPRO)
## COMMON_POST_CONFIG_FRAG
! armos.o: armos.c armdefs.h armos.h armfpe.h targ-vals.h
armcopro.o: armcopro.c armdefs.h
maverick.o: maverick.c armdefs.h
iwmmxt.o: iwmmxt.c iwmmxt.h armdefs.h
Index: sim/arm/armos.c
===================================================================
RCS file: /cvs/src/src/sim/arm/armos.c,v
retrieving revision 1.20
diff -c -5 -p -r1.20 armos.c
*** sim/arm/armos.c 27 Mar 2003 17:13:33 -0000 1.20
--- sim/arm/armos.c 29 Dec 2003 19:49:57 -0000
***************
*** 26,48 ****
#include "ansidecl.h"
#include <time.h>
#include <errno.h>
#include <string.h>
! #include <fcntl.h>
! #ifndef O_RDONLY
! #define O_RDONLY 0
! #endif
! #ifndef O_WRONLY
! #define O_WRONLY 1
! #endif
! #ifndef O_RDWR
! #define O_RDWR 2
! #endif
! #ifndef O_BINARY
! #define O_BINARY 0
#endif
#ifdef __STDC__
#define unlink(s) remove(s)
#endif
--- 26,39 ----
#include "ansidecl.h"
#include <time.h>
#include <errno.h>
#include <string.h>
! #include "targ-vals.h"
! #ifndef TARGET_O_BINARY
! #define TARGET_O_BINARY 0
#endif
#ifdef __STDC__
#define unlink(s) remove(s)
#endif
*************** ARMword ARMul_OSLastErrorP (ARMul_State
*** 258,279 ****
return ((struct OSblock *) state->OSptr)->ErrorP;
}
static int translate_open_mode[] =
{
! O_RDONLY, /* "r" */
! O_RDONLY + O_BINARY, /* "rb" */
! O_RDWR, /* "r+" */
! O_RDWR + O_BINARY, /* "r+b" */
! O_WRONLY + O_CREAT + O_TRUNC, /* "w" */
! O_WRONLY + O_BINARY + O_CREAT + O_TRUNC, /* "wb" */
! O_RDWR + O_CREAT + O_TRUNC, /* "w+" */
! O_RDWR + O_BINARY + O_CREAT + O_TRUNC, /* "w+b" */
! O_WRONLY + O_APPEND + O_CREAT, /* "a" */
! O_WRONLY + O_BINARY + O_APPEND + O_CREAT, /* "ab" */
! O_RDWR + O_APPEND + O_CREAT, /* "a+" */
! O_RDWR + O_BINARY + O_APPEND + O_CREAT /* "a+b" */
};
static void
SWIWrite0 (ARMul_State * state, ARMword addr)
{
--- 249,270 ----
return ((struct OSblock *) state->OSptr)->ErrorP;
}
static int translate_open_mode[] =
{
! TARGET_O_RDONLY, /* "r" */
! TARGET_O_RDONLY + TARGET_O_BINARY, /* "rb" */
! TARGET_O_RDWR, /* "r+" */
! TARGET_O_RDWR + TARGET_O_BINARY, /* "r+b" */
! TARGET_O_WRONLY + TARGET_O_CREAT + TARGET_O_TRUNC, /* "w" */
! TARGET_O_WRONLY + TARGET_O_BINARY + TARGET_O_CREAT + TARGET_O_TRUNC, /* "wb" */
! TARGET_O_RDWR + TARGET_O_CREAT + TARGET_O_TRUNC, /* "w+" */
! TARGET_O_RDWR + TARGET_O_BINARY + TARGET_O_CREAT + TARGET_O_TRUNC, /* "w+b" */
! TARGET_O_WRONLY + TARGET_O_APPEND + TARGET_O_CREAT, /* "a" */
! TARGET_O_WRONLY + TARGET_O_BINARY + TARGET_O_APPEND + TARGET_O_CREAT, /* "ab" */
! TARGET_O_RDWR + TARGET_O_APPEND + TARGET_O_CREAT, /* "a+" */
! TARGET_O_RDWR + TARGET_O_BINARY + TARGET_O_APPEND + TARGET_O_CREAT /* "a+b" */
};
static void
SWIWrite0 (ARMul_State * state, ARMword addr)
{
*************** SWIopen (ARMul_State * state, ARMword na
*** 323,333 ****
flags = translate_open_mode[SWIflags];
/* Filename ":tt" is special: it denotes stdin/out. */
if (strcmp (dummy, ":tt") == 0)
{
! if (flags == O_RDONLY) /* opening tty "r" */
state->Reg[0] = 0; /* stdin */
else
state->Reg[0] = 1; /* stdout */
}
else
--- 314,324 ----
flags = translate_open_mode[SWIflags];
/* Filename ":tt" is special: it denotes stdin/out. */
if (strcmp (dummy, ":tt") == 0)
{
! if (flags == TARGET_O_RDONLY) /* opening tty "r" */
state->Reg[0] = 0; /* stdin */
else
state->Reg[0] = 1; /* stdout */
}
else