semihosting: use open mode flags from GDB, not from sys/stat.h

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 (Manjaro 21.2.1 x86_64), 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.kirienko@gmail.com>
Reviewed-on: https://review.openocd.org/c/openocd/+/6804
Tested-by: jenkins
Reviewed-by: Antonio Borneo <borneo.antonio@gmail.com>
This commit is contained in:
Pavel Kirienko 2022-01-09 23:18:13 +02:00 committed by Antonio Borneo
parent 6541233aa7
commit dbbac5f11d
1 changed files with 28 additions and 12 deletions

View File

@ -52,19 +52,35 @@
#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=0x800 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,