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>
This commit is contained in:
Pavel Kirienko 2022-01-09 21:05:01 +02:00 committed by Antonio Borneo
parent b7125c369c
commit 5e96b012af
1 changed files with 4 additions and 10 deletions

View File

@ -1641,17 +1641,11 @@ static int semihosting_common_fileio_end(struct target *target, int result,
*/
switch (semihosting->op) {
case SEMIHOSTING_SYS_WRITE: /* 0x05 */
if (result < 0)
semihosting->result = fileio_info->param_3;
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;
if (result < 0)
semihosting->result = fileio_info->param_3; /* Zero bytes read/written. */
else
semihosting->result = (int64_t)fileio_info->param_3 - result;
break;
case SEMIHOSTING_SYS_SEEK: /* 0x0a */