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:
parent
6541233aa7
commit
dbbac5f11d
|
@ -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,
|
||||
|
|
Loading…
Reference in New Issue