aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAntonio Borneo <borneo.antonio@gmail.com>2022-03-04 09:26:19 +0100
committerAntonio Borneo <borneo.antonio@gmail.com>2022-03-26 13:21:19 +0000
commit2cafa8be7320266756dd92a40d174cbc01487c15 (patch)
tree2af3beccdf5d9b07b4b598eeaa4e17ddeca4a2f4
parent92c4e634d7bb9d3fb27d9a0ca332925c7318a574 (diff)
downloadriscv-openocd-2cafa8be7320266756dd92a40d174cbc01487c15.zip
riscv-openocd-2cafa8be7320266756dd92a40d174cbc01487c15.tar.gz
riscv-openocd-2cafa8be7320266756dd92a40d174cbc01487c15.tar.bz2
semihosting: fix mode flags for local host open()
Commit dbbac5f11d66 ("semihosting: use open mode flags from GDB, not from sys/stat.h") fixes the conversion of the mode flags from ARM semihosting encoding for SEMIHOSTING_SYS_OPEN to GDB mapping for open(). Doing this, it breaks the conversion to local host's OS mapping for open(). Split the conversion array to one for GDB and one for local host. The local host conversion array is taken directly from the old code. Change-Id: I385321ddd32c3ac5cf6da3f1ce9eff76b05dd527 Fixes: dbbac5f11d66 ("semihosting: use open mode flags from GDB, not from sys/stat.h") Signed-off-by: Antonio Borneo <borneo.antonio@gmail.com> Reported-by: Erhan Kurubas <erhan.kurubas@espressif.com> Reviewed-on: https://review.openocd.org/c/openocd/+/6870 Tested-by: jenkins
-rw-r--r--src/target/semihosting_common.c21
1 files changed, 18 insertions, 3 deletions
diff --git a/src/target/semihosting_common.c b/src/target/semihosting_common.c
index 38035e4..bc1f417 100644
--- a/src/target/semihosting_common.c
+++ b/src/target/semihosting_common.c
@@ -68,7 +68,7 @@ enum {
};
/* GDB remote protocol does not differentiate between text and binary open modes. */
-static const int open_modeflags[12] = {
+static const int open_gdb_modeflags[12] = {
TARGET_O_RDONLY,
TARGET_O_RDONLY,
TARGET_O_RDWR,
@@ -83,6 +83,21 @@ static const int open_modeflags[12] = {
TARGET_O_RDWR | TARGET_O_CREAT | TARGET_O_APPEND
};
+static const int open_host_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
+};
+
static int semihosting_common_fileio_info(struct target *target,
struct gdb_fileio_info *fileio_info);
static int semihosting_common_fileio_end(struct target *target, int result,
@@ -886,7 +901,7 @@ int semihosting_common(struct target *target)
fileio_info->identifier = "open";
fileio_info->param_1 = addr;
fileio_info->param_2 = len;
- fileio_info->param_3 = open_modeflags[mode];
+ fileio_info->param_3 = open_gdb_modeflags[mode];
fileio_info->param_4 = 0644;
}
} else {
@@ -922,7 +937,7 @@ int semihosting_common(struct target *target)
* otherwise it will fail to reopen a previously
* written file */
semihosting->result = open((char *)fn,
- open_modeflags[mode],
+ open_host_modeflags[mode],
0644);
semihosting->sys_errno = errno;
LOG_DEBUG("open('%s')=%d", fn,