cris/traps.c (TARGET_O_RDONLY, TARGET_O_WRONLY): Define.
authorHans-Peter Nilsson <hp@axis.com>
Sun, 20 Nov 2005 14:52:36 +0000 (14:52 +0000)
committerHans-Peter Nilsson <hp@axis.com>
Sun, 20 Nov 2005 14:52:36 +0000 (14:52 +0000)
(open_map): Use TARGET_O_ACCMODE, TARGET_O_RDONLY and
TARGET_O_WRONLY.
(cris_break_13_handler) <case TARGET_SYS_fcntl>: Add support for
F_GETFL on fd 0, 1 and 2.

sim/ChangeLog
sim/cris/traps.c

index e552e10aaaff80dfd79dd6c0e1866aa2df89587c..4ebe61efcc0684fc7df9a6ceec6495123b9c53f2 100644 (file)
@@ -1,3 +1,11 @@
+2005-11-20  Hans-Peter Nilsson  <hp@axis.com>
+
+       cris/traps.c (TARGET_O_RDONLY, TARGET_O_WRONLY): Define.
+       (open_map): Use TARGET_O_ACCMODE, TARGET_O_RDONLY and
+       TARGET_O_WRONLY.
+       (cris_break_13_handler) <case TARGET_SYS_fcntl>: Add support for
+       F_GETFL on fd 0, 1 and 2.
+
 2005-11-17  Hans-Peter Nilsson  <hp@axis.com>
 
        * cris/sim-main.h (struct _sim_cpu): New members last_syscall,
index 607f72c6345c830b6c0190e5e72420eaf2b92823..48fe6c541b9c039230ecd53b74a356d19ce5aa00 100644 (file)
@@ -664,18 +664,22 @@ static const CB_TARGET_DEFS_MAP errno_map[] =
    installation and removing synonyms and unnecessary items.  Don't
    forget the end-marker.  */
 
-/* This one we treat specially, as it's used in the fcntl syscall.  */
-#define TARGET_O_ACCMODE 3
+/* These we treat specially, as they're used in the fcntl F_GETFL
+   syscall.  For consistency, open_map is also manually edited to use
+   these macros.  */
+#define TARGET_O_ACCMODE 0x3
+#define TARGET_O_RDONLY 0x0
+#define TARGET_O_WRONLY 0x1
 
 static const CB_TARGET_DEFS_MAP open_map[] = {
 #ifdef O_ACCMODE
-  { O_ACCMODE, 0x3 },
+  { O_ACCMODE, TARGET_O_ACCMODE },
 #endif
 #ifdef O_RDONLY
-  { O_RDONLY, 0x0 },
+  { O_RDONLY, TARGET_O_RDONLY },
 #endif
 #ifdef O_WRONLY
-  { O_WRONLY, 0x1 },
+  { O_WRONLY, TARGET_O_WRONLY },
 #endif
 #ifdef O_RDWR
   { O_RDWR, 0x2 },
@@ -1429,9 +1433,24 @@ cris_break_13_handler (SIM_CPU *current_cpu, USI callnum, USI arg1,
                  retval = current_cpu->last_open_flags & TARGET_O_ACCMODE;
                  break;
                }
+             else if (arg1 == 0)
+               {
+                 /* Because we can't freopen fd:s 0, 1, 2 to mean
+                    something else than stdin, stdout and stderr
+                    (sim/common/syscall.c:cb_syscall special cases fd
+                    0, 1 and 2), we know what flags that we can
+                    sanely return for these fd:s.  */
+                 retval = TARGET_O_RDONLY;
+                 break;
+               }
+             else if (arg1 == 1 || arg1 == 2)
+               {
+                 retval = TARGET_O_WRONLY;
+                 break;
+               }
              /* FALLTHROUGH */
-             /* Abort for all other cases.  */
            default:
+             /* Abort for all other cases.  */
              sim_io_eprintf (sd, "Unimplemented %s syscall "
                              "(fd: 0x%lx: cmd: 0x%lx arg: 0x%lx)\n",
                              callnum == TARGET_SYS_fcntl