From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 14789 invoked by alias); 29 Dec 2003 19:57:30 -0000 Mailing-List: contact gdb-patches-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sources.redhat.com Received: (qmail 14781 invoked from network); 29 Dec 2003 19:57:29 -0000 Received: from unknown (HELO sirius.codesourcery.com) (65.73.237.139) by sources.redhat.com with SMTP; 29 Dec 2003 19:57:29 -0000 Received: from sirius.codesourcery.com (localhost.localdomain [127.0.0.1]) by sirius.codesourcery.com (8.12.8/8.12.5) with ESMTP id hBTJuVlI026726; Mon, 29 Dec 2003 11:56:32 -0800 Received: (from mitchell@localhost) by sirius.codesourcery.com (8.12.8/8.12.8/Submit) id hBTJuVbA026722; Mon, 29 Dec 2003 11:56:31 -0800 Date: Mon, 29 Dec 2003 19:57:00 -0000 Message-Id: <200312291956.hBTJuVbA026722@sirius.codesourcery.com> From: Mark Mitchell To: gdb-patches@sources.redhat.com Cc: nickc@redhat.com Subject: PATCH: Fix ARM "open" simulation Reply-to: mark@codesourcery.com X-SW-Source: 2003-12/txt/msg00510.txt.bz2 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 * 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 #include #include ! #include ! #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 #include #include ! #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