aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJan Matyas <matyas@codasip.com>2021-06-04 10:44:44 +0200
committerAntonio Borneo <borneo.antonio@gmail.com>2021-07-10 15:29:58 +0100
commit6f439e203289c517360fdc061ca9497fc4c530b8 (patch)
tree1d15c296d3d47276fc11f5aae4714204fa33e943 /src
parent4487270ea434782f25f790892c5f7d03b7cbe243 (diff)
downloadriscv-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.c18
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);
}
}