[PATCH] lib: utils/serial: Fix semihosting_getc

Xiang W wxjstz at 126.com
Wed Nov 9 20:38:35 PST 2022


在 2022-11-09星期三的 11:54 +0800,Xiang W写道:
> semihosting_read returns buffer_length - bytes_read, so a successful
> read should return 0. This patch fixes this issue.
> 
> Signed-off-by: Xiang W <wxjstz at 126.com>
sorry, please revoke this patch.

I ignored repackaged semihosting_read, returned len - ret.

Regards,
Xiang W

> ---
>  lib/utils/serial/semihosting.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> Below is the code comment from openocd about SYS_READ
> 
>                 case SEMIHOSTING_SYS_READ:      /* 0x06 */
>                         /*
>                          * Reads the contents of a file into a buffer. The file position
>                          * is specified either:
>                          * - Explicitly by a SYS_SEEK.
>                          * - Implicitly one byte beyond the previous SYS_READ or
>                          * SYS_WRITE request.
>                          *
>                          * The file position is at the start of the file when it is
>                          * opened, and is lost when the file is closed. Perform the
>                          * file operation as a single action whenever possible. For
>                          * example, do not split a read of 16KB into four 4KB chunks
>                          * unless there is no alternative.
>                          *
>                          * Entry
>                          * On entry, the PARAMETER REGISTER contains a pointer to a
>                          * three-field data block:
>                          * - field 1 Contains a handle for a file previously opened
>                          * with SYS_OPEN.
>                          * - field 2 Points to a buffer.
>                          * - field 3 Contains the number of bytes to read to the buffer
>                          * from the file.
>                          *
>                          * Return
>                          * On exit, the RETURN REGISTER contains the number of bytes not
>                          * filled in the buffer (buffer_length - bytes_read) as follows:
>                          * - If the RETURN REGISTER is 0, the entire buffer was
>                          * successfully filled.
>                          * - If the RETURN REGISTER is the same as field 3, no bytes
>                          * were read (EOF can be assumed).
>                          * - If the RETURN REGISTER contains a value smaller than
>                          * field 3, the read succeeded but the buffer was only partly
>                          * filled. For interactive devices, this is the most common
>                          * return value.
>                          */
> 
> diff --git a/lib/utils/serial/semihosting.c b/lib/utils/serial/semihosting.c
> index 5012fa1..79eb583 100644
> --- a/lib/utils/serial/semihosting.c
> +++ b/lib/utils/serial/semihosting.c
> @@ -157,7 +157,7 @@ static int semihosting_getc(void)
>                 ch = semihosting_trap(SYSREADC, NULL);
>                 ret = ch > -1 ? ch : -1;
>         } else
> -               ret = semihosting_read(semihosting_infd, &ch, 1) > 0 ? ch : -1;
> +               ret = semihosting_read(semihosting_infd, &ch, 1) == 0 ? ch : -1;
>  
>         return ret;
>  }
> -- 
> 2.30.2
> 
> 





More information about the opensbi mailing list