semihosting: fix mode flags for local host open()

Commit dbbac5f11d ("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: dbbac5f11d ("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
This commit is contained in:
Antonio Borneo 2022-03-04 09:26:19 +01:00
parent 92c4e634d7
commit 2cafa8be73
1 changed files with 18 additions and 3 deletions

View File

@ -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,