aboutsummaryrefslogtreecommitdiff
path: root/src/target/semihosting_common.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/target/semihosting_common.c')
-rw-r--r--src/target/semihosting_common.c24
1 files changed, 19 insertions, 5 deletions
diff --git a/src/target/semihosting_common.c b/src/target/semihosting_common.c
index 7ef1810e..59207897 100644
--- a/src/target/semihosting_common.c
+++ b/src/target/semihosting_common.c
@@ -225,6 +225,10 @@ int semihosting_common(struct target *target)
else {
int fd = semihosting_get_field(target, 0, fields);
if (semihosting->is_fileio) {
+ if (fd == 0 || fd == 1 || fd == 2) {
+ semihosting->result = 0;
+ break;
+ }
semihosting->hit_fileio = true;
fileio_info->identifier = "close";
fileio_info->param_1 = fd;
@@ -445,8 +449,8 @@ int semihosting_common(struct target *target)
* - –1 if an error occurs.
*/
if (semihosting->is_fileio) {
- LOG_ERROR("SYS_FLEN not supported by semihosting fileio");
- return ERROR_FAIL;
+ semihosting->result = -1;
+ semihosting->sys_errno = EINVAL;
}
retval = semihosting_read_fields(target, 1, fields);
if (retval != ERROR_OK)
@@ -690,9 +694,19 @@ int semihosting_common(struct target *target)
/* TODO: implement the :semihosting-features special file.
* */
if (semihosting->is_fileio) {
- if (strcmp((char *)fn, ":tt") == 0)
- semihosting->result = 0;
- else {
+ if (strcmp((char *)fn, ":semihosting-features") == 0) {
+ semihosting->result = -1;
+ semihosting->sys_errno = EINVAL;
+ } else if (strcmp((char *)fn, ":tt") == 0) {
+ if (mode == 0)
+ semihosting->result = 0;
+ else if (mode == 4)
+ semihosting->result = 1;
+ else if (mode == 8)
+ semihosting->result = 2;
+ else
+ semihosting->result = -1;
+ } else {
semihosting->hit_fileio = true;
fileio_info->identifier = "open";
fileio_info->param_1 = addr;