target/arm: use the common interface for WRITE0/WRITEC in arm-semi
Now we have a common semihosting console interface use that for our string output. However ARM is currently unique in also supporting semihosting for linux-user so we need to replicate the API in linux-user. If other architectures gain this support we can move the file later. Signed-off-by: Alex Bennée <alex.bennee@linaro.org> Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
parent
4cb28db99b
commit
0dc077212f
@ -6,4 +6,6 @@ obj-y = main.o syscall.o strace.o mmap.o signal.o \
|
|||||||
obj-$(TARGET_HAS_BFLT) += flatload.o
|
obj-$(TARGET_HAS_BFLT) += flatload.o
|
||||||
obj-$(TARGET_I386) += vm86.o
|
obj-$(TARGET_I386) += vm86.o
|
||||||
obj-$(TARGET_ARM) += arm/nwfpe/
|
obj-$(TARGET_ARM) += arm/nwfpe/
|
||||||
|
obj-$(TARGET_ARM) += arm/semihost.o
|
||||||
|
obj-$(TARGET_AARCH64) += arm/semihost.o
|
||||||
obj-$(TARGET_M68K) += m68k-sim.o
|
obj-$(TARGET_M68K) += m68k-sim.o
|
||||||
|
24
linux-user/arm/semihost.c
Normal file
24
linux-user/arm/semihost.c
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
/*
|
||||||
|
* 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_out(CPUArchState *env, target_ulong addr, int len)
|
||||||
|
{
|
||||||
|
void *s = lock_user_string(addr);
|
||||||
|
len = write(STDERR_FILENO, s, len ? len : strlen(s));
|
||||||
|
unlock_user(s, addr, 0);
|
||||||
|
return len;
|
||||||
|
}
|
@ -27,6 +27,7 @@
|
|||||||
|
|
||||||
#include "cpu.h"
|
#include "cpu.h"
|
||||||
#include "hw/semihosting/semihost.h"
|
#include "hw/semihosting/semihost.h"
|
||||||
|
#include "hw/semihosting/console.h"
|
||||||
#ifdef CONFIG_USER_ONLY
|
#ifdef CONFIG_USER_ONLY
|
||||||
#include "qemu.h"
|
#include "qemu.h"
|
||||||
|
|
||||||
@ -313,32 +314,10 @@ target_ulong do_arm_semihosting(CPUARMState *env)
|
|||||||
return set_swi_errno(ts, close(arg0));
|
return set_swi_errno(ts, close(arg0));
|
||||||
}
|
}
|
||||||
case TARGET_SYS_WRITEC:
|
case TARGET_SYS_WRITEC:
|
||||||
{
|
qemu_semihosting_console_out(env, args, 1);
|
||||||
char c;
|
return 0xdeadbeef;
|
||||||
|
|
||||||
if (get_user_u8(c, args))
|
|
||||||
/* FIXME - should this error code be -TARGET_EFAULT ? */
|
|
||||||
return (uint32_t)-1;
|
|
||||||
/* Write to debug console. stderr is near enough. */
|
|
||||||
if (use_gdb_syscalls()) {
|
|
||||||
return arm_gdb_syscall(cpu, arm_semi_cb, "write,2,%x,1", args);
|
|
||||||
} else {
|
|
||||||
return write(STDERR_FILENO, &c, 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
case TARGET_SYS_WRITE0:
|
case TARGET_SYS_WRITE0:
|
||||||
if (!(s = lock_user_string(args)))
|
return qemu_semihosting_console_out(env, args, 0);
|
||||||
/* FIXME - should this error code be -TARGET_EFAULT ? */
|
|
||||||
return (uint32_t)-1;
|
|
||||||
len = strlen(s);
|
|
||||||
if (use_gdb_syscalls()) {
|
|
||||||
return arm_gdb_syscall(cpu, arm_semi_cb, "write,2,%x,%x",
|
|
||||||
args, len);
|
|
||||||
} else {
|
|
||||||
ret = write(STDERR_FILENO, s, len);
|
|
||||||
}
|
|
||||||
unlock_user(s, args, 0);
|
|
||||||
return ret;
|
|
||||||
case TARGET_SYS_WRITE:
|
case TARGET_SYS_WRITE:
|
||||||
GET_ARG(0);
|
GET_ARG(0);
|
||||||
GET_ARG(1);
|
GET_ARG(1);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user