diff options
author | Jan Matyas <matyas@codasip.com> | 2021-06-04 10:44:44 +0200 |
---|---|---|
committer | Antonio Borneo <borneo.antonio@gmail.com> | 2021-07-10 15:29:58 +0100 |
commit | 6f439e203289c517360fdc061ca9497fc4c530b8 (patch) | |
tree | 1d15c296d3d47276fc11f5aae4714204fa33e943 /src | |
parent | 4487270ea434782f25f790892c5f7d03b7cbe243 (diff) | |
download | riscv-openocd-6f439e203289c517360fdc061ca9497fc4c530b8.zip riscv-openocd-6f439e203289c517360fdc061ca9497fc4c530b8.tar.gz riscv-openocd-6f439e203289c517360fdc061ca9497fc4c530b8.tar.bz2 |
target/semihosting: Fix of close(): Never close standard streams
This change fixes behavior of the SEMIHOSTING_SYS_CLOSE operation.
It ensures that OpenOCD's own stdin/stdout/stderr streams are never
closed, not even if the target requests it via semihosting.
Change-Id: Ia85af5963d1a3516284fd834f7197369a8fb268c
Signed-off-by: Jan Matyas <matyas@codasip.com>
Reviewed-on: http://openocd.zylin.com/6291
Tested-by: jenkins
Reviewed-by: Tim Newsome <tim@sifive.com>
Reviewed-by: Antonio Borneo <borneo.antonio@gmail.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/target/semihosting_common.c | 18 |
1 files changed, 14 insertions, 4 deletions
diff --git a/src/target/semihosting_common.c b/src/target/semihosting_common.c index bfb1eca..ffed735 100644 --- a/src/target/semihosting_common.c +++ b/src/target/semihosting_common.c @@ -226,18 +226,28 @@ int semihosting_common(struct target *target) return retval; else { int fd = semihosting_get_field(target, 0, fields); - if (semihosting->is_fileio) { - if (fd == 0 || fd == 1 || fd == 2) { + /* Do not allow to close OpenOCD's own standard streams */ + if (fd == 0 || fd == 1 || fd == 2) { + LOG_DEBUG("ignoring semihosting attempt to close %s", + (fd == 0) ? "stdin" : + (fd == 1) ? "stdout" : "stderr"); + /* Just pretend success */ + if (semihosting->is_fileio) { semihosting->result = 0; - break; + } else { + semihosting->result = 0; + semihosting->sys_errno = 0; } + break; + } + /* Close the descriptor */ + if (semihosting->is_fileio) { semihosting->hit_fileio = true; fileio_info->identifier = "close"; fileio_info->param_1 = fd; } else { semihosting->result = close(fd); semihosting->sys_errno = errno; - LOG_DEBUG("close(%d)=%d", fd, (int)semihosting->result); } } |