semihosting/guestfd: compile once for system/user
We move relevant code to semihosting/arm-compat-semi.c, and add functions to query CONFIG_ARM_COMPATIBLE_SEMIHOSTING at runtime. Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Signed-off-by: Pierrick Bouvier <pierrick.bouvier@linaro.org> Message-ID: <20250822150058.18692-4-pierrick.bouvier@linaro.org> Signed-off-by: Alex Bennée <alex.bennee@linaro.org> Message-ID: <20250922093711.2768983-7-alex.bennee@linaro.org>
This commit is contained in:
parent
664172404a
commit
d8028d4ede
6 changed files with 58 additions and 33 deletions
19
semihosting/arm-compat-semi-stub.c
Normal file
19
semihosting/arm-compat-semi-stub.c
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
/*
|
||||
* Stubs for platforms different from ARM
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0-or-later
|
||||
*/
|
||||
|
||||
#include "qemu/osdep.h"
|
||||
#include "semihosting/semihost.h"
|
||||
#include <glib.h>
|
||||
|
||||
bool semihosting_arm_compatible(void)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
void semihosting_arm_compatible_init(void)
|
||||
{
|
||||
g_assert_not_reached();
|
||||
}
|
||||
|
|
@ -101,6 +101,13 @@ static int gdb_open_modeflags[12] = {
|
|||
GDB_O_RDWR | GDB_O_CREAT | GDB_O_APPEND,
|
||||
};
|
||||
|
||||
/*
|
||||
* For ARM semihosting, we have a separate structure for routing
|
||||
* data for the console which is outside the guest fd address space.
|
||||
*/
|
||||
static GuestFD console_in_gf;
|
||||
static GuestFD console_out_gf;
|
||||
|
||||
#ifndef CONFIG_USER_ONLY
|
||||
|
||||
/**
|
||||
|
|
@ -353,6 +360,25 @@ static const uint8_t featurefile_data[] = {
|
|||
SH_EXT_EXIT_EXTENDED | SH_EXT_STDOUT_STDERR, /* Feature byte 0 */
|
||||
};
|
||||
|
||||
bool semihosting_arm_compatible(void)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
void semihosting_arm_compatible_init(void)
|
||||
{
|
||||
/* For ARM-compat, the console is in a separate namespace. */
|
||||
if (use_gdb_syscalls()) {
|
||||
console_in_gf.type = GuestFDGDB;
|
||||
console_in_gf.hostfd = 0;
|
||||
console_out_gf.type = GuestFDGDB;
|
||||
console_out_gf.hostfd = 2;
|
||||
} else {
|
||||
console_in_gf.type = GuestFDConsole;
|
||||
console_out_gf.type = GuestFDConsole;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Do a semihosting call.
|
||||
*
|
||||
|
|
|
|||
|
|
@ -12,35 +12,20 @@
|
|||
#include "gdbstub/syscalls.h"
|
||||
#include "semihosting/semihost.h"
|
||||
#include "semihosting/guestfd.h"
|
||||
#ifndef CONFIG_USER_ONLY
|
||||
#include CONFIG_DEVICES
|
||||
#endif
|
||||
|
||||
static GArray *guestfd_array;
|
||||
|
||||
#ifdef CONFIG_ARM_COMPATIBLE_SEMIHOSTING
|
||||
GuestFD console_in_gf;
|
||||
GuestFD console_out_gf;
|
||||
#endif
|
||||
|
||||
void qemu_semihosting_guestfd_init(void)
|
||||
{
|
||||
/* New entries zero-initialized, i.e. type GuestFDUnused */
|
||||
guestfd_array = g_array_new(FALSE, TRUE, sizeof(GuestFD));
|
||||
|
||||
#ifdef CONFIG_ARM_COMPATIBLE_SEMIHOSTING
|
||||
/* For ARM-compat, the console is in a separate namespace. */
|
||||
if (use_gdb_syscalls()) {
|
||||
console_in_gf.type = GuestFDGDB;
|
||||
console_in_gf.hostfd = 0;
|
||||
console_out_gf.type = GuestFDGDB;
|
||||
console_out_gf.hostfd = 2;
|
||||
} else {
|
||||
console_in_gf.type = GuestFDConsole;
|
||||
console_out_gf.type = GuestFDConsole;
|
||||
if (semihosting_arm_compatible()) {
|
||||
semihosting_arm_compatible_init();
|
||||
return;
|
||||
}
|
||||
#else
|
||||
/* Otherwise, the stdio file descriptors apply. */
|
||||
|
||||
/* Out of ARM, the stdio file descriptors apply. */
|
||||
guestfd_array = g_array_set_size(guestfd_array, 3);
|
||||
#ifndef CONFIG_USER_ONLY
|
||||
if (!use_gdb_syscalls()) {
|
||||
|
|
@ -54,7 +39,6 @@ void qemu_semihosting_guestfd_init(void)
|
|||
associate_guestfd(0, 0);
|
||||
associate_guestfd(1, 1);
|
||||
associate_guestfd(2, 2);
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -1,17 +1,18 @@
|
|||
specific_ss.add(when: 'CONFIG_SEMIHOSTING', if_true: files(
|
||||
'guestfd.c',
|
||||
))
|
||||
|
||||
common_ss.add(when: 'CONFIG_SEMIHOSTING', if_false: files('stubs-all.c'))
|
||||
user_ss.add(when: 'CONFIG_SEMIHOSTING', if_true: files('user.c'))
|
||||
user_ss.add(when: 'CONFIG_SEMIHOSTING', if_true: files(
|
||||
'user.c',
|
||||
'guestfd.c'))
|
||||
system_ss.add(when: 'CONFIG_SEMIHOSTING', if_true: files(
|
||||
'config.c',
|
||||
'console.c',
|
||||
'guestfd.c',
|
||||
'uaccess.c',
|
||||
'syscalls.c',
|
||||
), if_false: files(
|
||||
'stubs-system.c',
|
||||
))
|
||||
system_ss.add(when: 'CONFIG_ARM_COMPATIBLE_SEMIHOSTING',
|
||||
if_false: files('arm-compat-semi-stub.c'))
|
||||
|
||||
specific_ss.add(when: ['CONFIG_SEMIHOSTING', 'CONFIG_USER_ONLY'],
|
||||
if_true: files('syscalls.c'))
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue