mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-02 15:23:53 -06:00
semihosting: split console_out into string and char versions
This is ostensibly to avoid the weirdness of len looking like it might come from a guest and sometimes being used. While we are at it fix up the error checking for the arm-linux-user implementation of the API which got flagged up by Coverity (CID 1401700). Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
This commit is contained in:
parent
3ace9be6d2
commit
78e24848f6
4 changed files with 74 additions and 20 deletions
|
@ -15,10 +15,35 @@
|
|||
#include "hw/semihosting/console.h"
|
||||
#include "qemu.h"
|
||||
|
||||
int qemu_semihosting_console_out(CPUArchState *env, target_ulong addr, int len)
|
||||
int qemu_semihosting_console_outs(CPUArchState *env, target_ulong addr)
|
||||
{
|
||||
void *s = lock_user_string(addr);
|
||||
len = write(STDERR_FILENO, s, len ? len : strlen(s));
|
||||
int len = target_strlen(addr);
|
||||
void *s;
|
||||
if (len < 0){
|
||||
qemu_log_mask(LOG_GUEST_ERROR,
|
||||
"%s: passed inaccessible address " TARGET_FMT_lx,
|
||||
__func__, addr);
|
||||
return 0;
|
||||
}
|
||||
s = lock_user(VERIFY_READ, addr, (long)(len + 1), 1);
|
||||
g_assert(s); /* target_strlen has already verified this will work */
|
||||
len = write(STDERR_FILENO, s, len);
|
||||
unlock_user(s, addr, 0);
|
||||
return len;
|
||||
}
|
||||
|
||||
void qemu_semihosting_console_outc(CPUArchState *env, target_ulong addr)
|
||||
{
|
||||
char c;
|
||||
|
||||
if (get_user_u8(c, addr)) {
|
||||
qemu_log_mask(LOG_GUEST_ERROR,
|
||||
"%s: passed inaccessible address " TARGET_FMT_lx,
|
||||
__func__, addr);
|
||||
} else {
|
||||
if (write(STDERR_FILENO, &c, 1) != 1) {
|
||||
qemu_log_mask(LOG_UNIMP, "%s: unexpected write to stdout failure",
|
||||
__func__);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue