Merge remote-tracking branch 'remotes/armbru/tags/pull-build-2019-07-02-v2' into...
[qemu/ar7.git] / linux-user / arm / semihost.c
bloba16b525eec09c3dc705d9e6f67cd37e34e22aae5
1 /*
2 * ARM Semihosting Console Support
4 * Copyright (c) 2019 Linaro Ltd
6 * Currently ARM is unique in having support for semihosting support
7 * in linux-user. So for now we implement the common console API but
8 * just for arm linux-user.
10 * SPDX-License-Identifier: GPL-2.0-or-later
13 #include "qemu/osdep.h"
14 #include "cpu.h"
15 #include "hw/semihosting/console.h"
16 #include "qemu.h"
18 int qemu_semihosting_console_outs(CPUArchState *env, target_ulong addr)
20 int len = target_strlen(addr);
21 void *s;
22 if (len < 0){
23 qemu_log_mask(LOG_GUEST_ERROR,
24 "%s: passed inaccessible address " TARGET_FMT_lx,
25 __func__, addr);
26 return 0;
28 s = lock_user(VERIFY_READ, addr, (long)(len + 1), 1);
29 g_assert(s); /* target_strlen has already verified this will work */
30 len = write(STDERR_FILENO, s, len);
31 unlock_user(s, addr, 0);
32 return len;
35 void qemu_semihosting_console_outc(CPUArchState *env, target_ulong addr)
37 char c;
39 if (get_user_u8(c, addr)) {
40 qemu_log_mask(LOG_GUEST_ERROR,
41 "%s: passed inaccessible address " TARGET_FMT_lx,
42 __func__, addr);
43 } else {
44 if (write(STDERR_FILENO, &c, 1) != 1) {
45 qemu_log_mask(LOG_UNIMP, "%s: unexpected write to stdout failure",
46 __func__);