Message ID | 20221109035427.120086-1-wxjstz@126.com |
---|---|
State | Not Applicable |
Headers | show |
Series | lib: utils/serial: Fix semihosting_getc | expand |
在 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@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 > >
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; }
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@126.com> --- 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. */