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:
parent
b7125c369c
commit
5e96b012af
|
@ -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 */
|
||||
|
|
Loading…
Reference in New Issue