This is an automated email from Gerrit.

"Pavel Kirienko <pavel.kirie...@gmail.com>" just uploaded a new patch set to 
Gerrit, which you can find at https://review.openocd.org/c/openocd/+/6804

-- gerrit

commit 63864135c28544e5926aecddb7330530b236cb05
Author: Pavel Kirienko <pavel.kirie...@gmail.com>
Date:   Sun Jan 9 23:18:13 2022 +0200

    semihosting: Replace incorrect semihosting file open mode flags pulled from 
sys/stat.h with correct values defined by the GDB remote protocol
    
    Values defined in sys/stat.h are not guaranteed to match the constants 
defined by the GDB remote protocol,
    which are defined in 
https://sourceware.org/gdb/onlinedocs/gdb/Open-Flags.html#Open-Flags.
    On my local system, for example, O_TRUNC is defined as 0x40, whereas GDB 
requires it to be 0x400,
    causing all "w" file open modes to misbehave.
    
    This patch has been tested with STM32F446.
    
    Change-Id: Ifb2c740fd689e71d6f1a4bde1edaecd76fdca910
    Signed-off-by: Pavel Kirienko <pavel.kirie...@gmail.com>

diff --git a/src/target/semihosting_common.c b/src/target/semihosting_common.c
index ba3223e72..504cc5c7c 100644
--- a/src/target/semihosting_common.c
+++ b/src/target/semihosting_common.c
@@ -52,19 +52,34 @@
 #include <helper/log.h>
 #include <sys/stat.h>
 
+/**
+ * It is not possible to use O_... flags defined in sys/stat.h because they 
are not guaranteed to match the
+ * values defined by the GDB Remote Protocol. See 
https://sourceware.org/gdb/onlinedocs/gdb/Open-Flags.html#Open-Flags
+ */
+enum {
+       TARGET_O_RDONLY = 0x000,
+       TARGET_O_WRONLY = 0x001,
+       TARGET_O_RDWR   = 0x002,
+       TARGET_O_APPEND = 0x008,
+       TARGET_O_CREAT  = 0x200,
+       TARGET_O_TRUNC  = 0x400,
+       /* O_EXCL is not required in this implementation. */
+};
+
+/* GDB remote protocol does not differentiate between text and binary open 
modes. */
 static const int open_modeflags[12] = {
-       O_RDONLY,
-       O_RDONLY | O_BINARY,
-       O_RDWR,
-       O_RDWR | O_BINARY,
-       O_WRONLY | O_CREAT | O_TRUNC,
-       O_WRONLY | O_CREAT | O_TRUNC | O_BINARY,
-       O_RDWR | O_CREAT | O_TRUNC,
-       O_RDWR | O_CREAT | O_TRUNC | O_BINARY,
-       O_WRONLY | O_CREAT | O_APPEND,
-       O_WRONLY | O_CREAT | O_APPEND | O_BINARY,
-       O_RDWR | O_CREAT | O_APPEND,
-       O_RDWR | O_CREAT | O_APPEND | O_BINARY
+       TARGET_O_RDONLY,
+       TARGET_O_RDONLY,
+       TARGET_O_RDWR,
+       TARGET_O_RDWR,
+       TARGET_O_WRONLY | TARGET_O_CREAT | TARGET_O_TRUNC,
+       TARGET_O_WRONLY | TARGET_O_CREAT | TARGET_O_TRUNC,
+       TARGET_O_RDWR   | TARGET_O_CREAT | TARGET_O_TRUNC,
+       TARGET_O_RDWR   | TARGET_O_CREAT | TARGET_O_TRUNC,
+       TARGET_O_WRONLY | TARGET_O_CREAT | TARGET_O_APPEND,
+       TARGET_O_WRONLY | TARGET_O_CREAT | TARGET_O_APPEND,
+       TARGET_O_RDWR   | TARGET_O_CREAT | TARGET_O_APPEND,
+       TARGET_O_RDWR   | TARGET_O_CREAT | TARGET_O_APPEND
 };
 
 static int semihosting_common_fileio_info(struct target *target,

-- 

Reply via email to