diff options
author | Juan Castillo <juan.castillo@arm.com> | 2015-07-07 15:36:33 +0100 |
---|---|---|
committer | Achin Gupta <achin.gupta@arm.com> | 2015-07-16 20:36:41 +0100 |
commit | 31833aff6802a4b5bdc3b7007ce8b1871991e796 (patch) | |
tree | e22833169bc109d295291d10aed20c184ea5b7cd /lib | |
parent | 7bcbb962fda8468c16544d4118220fdca2cf455f (diff) |
Fix bug in semihosting write function
The return value from the SYS_WRITE semihosting operation is 0 if
the call is successful or the number of bytes not written, if there
is an error. The implementation of the write function in the
semihosting driver treats the return value as the number of bytes
written, which is wrong. This patch fixes it.
Change-Id: Id39dac3d17b5eac557408b8995abe90924c85b85
Diffstat (limited to 'lib')
-rw-r--r-- | lib/semihosting/semihosting.c | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/lib/semihosting/semihosting.c b/lib/semihosting/semihosting.c index 849ec120..b4f53d25 100644 --- a/lib/semihosting/semihosting.c +++ b/lib/semihosting/semihosting.c @@ -125,6 +125,7 @@ long semihosting_file_write(long file_handle, const uintptr_t buffer) { smh_file_read_write_block_t write_block; + long result = -EINVAL; if ((length == NULL) || (buffer == (uintptr_t)NULL)) return -EINVAL; @@ -133,10 +134,12 @@ long semihosting_file_write(long file_handle, write_block.buffer = (uintptr_t)buffer; /* cast away const */ write_block.length = *length; - *length = semihosting_call(SEMIHOSTING_SYS_WRITE, + result = semihosting_call(SEMIHOSTING_SYS_WRITE, (void *) &write_block); - return *length; + *length = result; + + return (result == 0) ? 0 : -EINVAL; } long semihosting_file_close(long file_handle) |