aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPavel Kirienko <pavel.kirienko@gmail.com>2022-01-09 21:05:01 +0200
committerAntonio Borneo <borneo.antonio@gmail.com>2022-07-02 08:28:30 +0000
commit5e96b012af91c4dc6eae680b67a594e9a22b3ead (patch)
tree3ec671c3bbf76c6a06b463355ed8a35ab43f9511 /src
parentb7125c369c4e5bde86d6688cbd1b7a87384d3d24 (diff)
downloadriscv-openocd-5e96b012af91c4dc6eae680b67a594e9a22b3ead.zip
riscv-openocd-5e96b012af91c4dc6eae680b67a594e9a22b3ead.tar.gz
riscv-openocd-5e96b012af91c4dc6eae680b67a594e9a22b3ead.tar.bz2
semihosting: fix return value of SYS_READ and SYS_WRITE
ARM/RISC-V semihosting calls SYS_READ/SYS_WRITE require inversion of the result value as described in "Semihosting for AArch32 and AArch64". Prior to this patch, this was done correctly only if (semihosting->is_fileio==false). This patch has been tested with STM32F446. Change-Id: I1b34c8d8393f7dfa66ee6539904a2eaf8f9154b0 Signed-off-by: Pavel Kirienko <pavel.kirienko@gmail.com> Fixes: https://sourceforge.net/p/openocd/tickets/232/ Reviewed-on: https://review.openocd.org/c/openocd/+/6803 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.c12
1 files changed, 3 insertions, 9 deletions
diff --git a/src/target/semihosting_common.c b/src/target/semihosting_common.c
index 2c7f4a1..cae6afb 100644
--- a/src/target/semihosting_common.c
+++ b/src/target/semihosting_common.c
@@ -1641,17 +1641,11 @@ static int semihosting_common_fileio_end(struct target *target, int result,
*/
switch (semihosting->op) {
case SEMIHOSTING_SYS_WRITE: /* 0x05 */
+ case SEMIHOSTING_SYS_READ: /* 0x06 */
if (result < 0)
- semihosting->result = fileio_info->param_3;
+ semihosting->result = fileio_info->param_3; /* Zero bytes read/written. */
else
- semihosting->result = 0;
- break;
-
- case SEMIHOSTING_SYS_READ: /* 0x06 */
- if (result == (int)fileio_info->param_3)
- semihosting->result = 0;
- if (result <= 0)
- semihosting->result = fileio_info->param_3;
+ semihosting->result = (int64_t)fileio_info->param_3 - result;
break;
case SEMIHOSTING_SYS_SEEK: /* 0x0a */