aboutsummaryrefslogtreecommitdiff
path: root/linux-user/arm/semihost.c
diff options
context:
space:
mode:
authorPeter Maydell <peter.maydell@linaro.org>2019-06-13 10:00:18 +0100
committerPeter Maydell <peter.maydell@linaro.org>2019-06-13 10:00:18 +0100
commitfe18911af739d292ad2e62c6699a705a08302fca (patch)
treec4f58c4ec8f7328a175a6b99dac5e82c2716227a /linux-user/arm/semihost.c
parenta050901d4b40092dc356b59912c6df39e389c7b9 (diff)
parentab4752ec8d9b0b19ab80915016b739350418a078 (diff)
Merge remote-tracking branch 'remotes/stsquad/tags/pull-testing-gdbstub-cputlb-120619-3' into staging
Various fixes and updates: - editor config tweak for shell scripts - iotest updates (still not default for make check) - various docker updates - gcc/ubsan updates for travis - some clean-ups for tests/vm (no serial autoinstall) - semihosting fix for Coverity - fixes for cputlb in 64-on-32 cases - gdbstub re-factor + maintainership update # gpg: Signature made Wed 12 Jun 2019 17:55:04 BST # gpg: using RSA key 6685AE99E75167BCAFC8DF35FBD0DB095A9E2A44 # gpg: Good signature from "Alex Bennée (Master Work Key) <alex.bennee@linaro.org>" [full] # Primary key fingerprint: 6685 AE99 E751 67BC AFC8 DF35 FBD0 DB09 5A9E 2A44 * remotes/stsquad/tags/pull-testing-gdbstub-cputlb-120619-3: (40 commits) gdbstub: Implement qemu physical memory mode gdbstub: Clear unused variables in gdb_handle_packet gdbstub: Implement target halted (? pkt) with new infra gdbstub: Implement generic set/query (Q/q pkt) with new infra gdbstub: Implement v commands with new infra gdbstub: Implement step (s pkt) with new infra gdbstub: Implement file io (F pkt) with new infra gdbstub: Implement read all registers (g pkt) with new infra gdbstub: Implement write all registers (G pkt) with new infra gdbstub: Implement read memory (m pkt) with new infra gdbstub: Implement write memory (M pkt) with new infra gdbstub: Implement get register (p pkt) with new infra gdbstub: Implement set register (P pkt) with new infra gdbstub: Implement breakpoint commands (Z/z pkt) with new infra gdbstub: Implement set_thread (H pkt) with new infra gdbstub: Implement continue with signal (C pkt) with new infra gdbstub: Implement continue (c pkt) with new infra gdbstub: Implement thread_alive (T pkt) with new infra gdbstub: Implement deatch (D pkt) with new infra gdbstub: Add infrastructure to parse cmd packets ... Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Diffstat (limited to 'linux-user/arm/semihost.c')
-rw-r--r--linux-user/arm/semihost.c31
1 files changed, 28 insertions, 3 deletions
diff --git a/linux-user/arm/semihost.c b/linux-user/arm/semihost.c
index 9554102a85..a16b525eec 100644
--- a/linux-user/arm/semihost.c
+++ b/linux-user/arm/semihost.c
@@ -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__);
+ }
+ }
+}