On 5/14/19 5:52 PM, Alex Bennée wrote: > The documentation says the write should return the number of bytes not > written on an error (0 means everything was written). Read provides a > buffer length and the return value should be the buffer length - bytes > actually read. Remove the incorrect FIXME's and return the correct > values. > > Signed-off-by: Alex Bennée <alex.ben...@linaro.org>
Reviewed-by: Philippe Mathieu-Daudé <phi...@redhat.com> > --- > target/arm/arm-semi.c | 20 ++++++++++++-------- > 1 file changed, 12 insertions(+), 8 deletions(-) > > diff --git a/target/arm/arm-semi.c b/target/arm/arm-semi.c > index a3bbef18ef7..3ae8f05d51b 100644 > --- a/target/arm/arm-semi.c > +++ b/target/arm/arm-semi.c > @@ -334,13 +334,15 @@ target_ulong do_arm_semihosting(CPUARMState *env) > } else { > s = lock_user(VERIFY_READ, arg1, len, 1); > if (!s) { > - /* FIXME - should this error code be -TARGET_EFAULT ? */ > - return (uint32_t)-1; > + /* Return bytes not written on error */ > + return len; > } > ret = set_swi_errno(ts, write(arg0, s, len)); > unlock_user(s, arg1, 0); > - if (ret == (uint32_t)-1) > - return -1; > + if (ret == (uint32_t)-1) { > + ret = 0; > + } > + /* Return bytes not written */ > return len - ret; > } > case TARGET_SYS_READ: > @@ -355,15 +357,17 @@ target_ulong do_arm_semihosting(CPUARMState *env) > } else { > s = lock_user(VERIFY_WRITE, arg1, len, 0); > if (!s) { > - /* FIXME - should this error code be -TARGET_EFAULT ? */ > - return (uint32_t)-1; > + /* return bytes not read */ > + return len; > } > do { > ret = set_swi_errno(ts, read(arg0, s, len)); > } while (ret == -1 && errno == EINTR); > unlock_user(s, arg1, len); > - if (ret == (uint32_t)-1) > - return -1; > + if (ret == (uint32_t)-1) { > + ret = 0; > + } > + /* Return bytes not read */ > return len - ret; > } > case TARGET_SYS_READC: >