qemu/linux-user/arm/semihost.c
Alex Bennée 78e24848f6 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>
2019-06-12 17:53:22 +01:00

50 lines
1.4 KiB
C

/*
* ARM Semihosting Console Support
*
* Copyright (c) 2019 Linaro Ltd
*
* Currently ARM is unique in having support for semihosting support
* in linux-user. So for now we implement the common console API but
* just for arm linux-user.
*
* SPDX-License-Identifier: GPL-2.0-or-later
*/
#include "qemu/osdep.h"
#include "cpu.h"
#include "hw/semihosting/console.h"
#include "qemu.h"
int qemu_semihosting_console_outs(CPUArchState *env, target_ulong addr)
{
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__);
}
}
}