linux-user: remove --enable-guest-base/--disable-guest-base
All tcg host architectures now support the guest base and as there is no real performance lost, it can be always enabled. Anyway, guest base use can be disabled lively by setting guest base to 0. CONFIG_USE_GUEST_BASE is defined as (USE_GUEST_BASE && USER_ONLY), it should have to be replaced by CONFIG_USER_ONLY in non CONFIG_USER_ONLY parts, but as some other parts are using !CONFIG_SOFTMMU I have chosen to use !CONFIG_SOFTMMU instead. Reviewed-by: Alexander Graf <agraf@suse.de> Signed-off-by: Laurent Vivier <laurent@vivier.eu> Message-Id: <1440373328-9788-2-git-send-email-laurent@vivier.eu> Signed-off-by: Richard Henderson <rth@twiddle.net>
This commit is contained in:
parent
9ee14902bf
commit
4cbea59869
@ -1371,7 +1371,6 @@ int load_elf_binary(struct linux_binprm * bprm, struct target_pt_regs * regs,
|
|||||||
info->mmap = 0;
|
info->mmap = 0;
|
||||||
elf_entry = (abi_ulong) elf_ex.e_entry;
|
elf_entry = (abi_ulong) elf_ex.e_entry;
|
||||||
|
|
||||||
#if defined(CONFIG_USE_GUEST_BASE)
|
|
||||||
/*
|
/*
|
||||||
* In case where user has not explicitly set the guest_base, we
|
* In case where user has not explicitly set the guest_base, we
|
||||||
* probe here that should we set it automatically.
|
* probe here that should we set it automatically.
|
||||||
@ -1392,7 +1391,6 @@ int load_elf_binary(struct linux_binprm * bprm, struct target_pt_regs * regs,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif /* CONFIG_USE_GUEST_BASE */
|
|
||||||
|
|
||||||
/* Do this so that we can load the interpreter, if need be. We will
|
/* Do this so that we can load the interpreter, if need be. We will
|
||||||
change some of these later */
|
change some of these later */
|
||||||
|
@ -35,12 +35,10 @@
|
|||||||
#include "qemu/envlist.h"
|
#include "qemu/envlist.h"
|
||||||
|
|
||||||
int singlestep;
|
int singlestep;
|
||||||
#if defined(CONFIG_USE_GUEST_BASE)
|
|
||||||
unsigned long mmap_min_addr;
|
unsigned long mmap_min_addr;
|
||||||
unsigned long guest_base;
|
unsigned long guest_base;
|
||||||
int have_guest_base;
|
int have_guest_base;
|
||||||
unsigned long reserved_va;
|
unsigned long reserved_va;
|
||||||
#endif
|
|
||||||
|
|
||||||
static const char *interp_prefix = CONFIG_QEMU_INTERP_PREFIX;
|
static const char *interp_prefix = CONFIG_QEMU_INTERP_PREFIX;
|
||||||
const char *qemu_uname_release;
|
const char *qemu_uname_release;
|
||||||
@ -682,9 +680,7 @@ static void usage(void)
|
|||||||
"-drop-ld-preload drop LD_PRELOAD for target process\n"
|
"-drop-ld-preload drop LD_PRELOAD for target process\n"
|
||||||
"-E var=value sets/modifies targets environment variable(s)\n"
|
"-E var=value sets/modifies targets environment variable(s)\n"
|
||||||
"-U var unsets targets environment variable(s)\n"
|
"-U var unsets targets environment variable(s)\n"
|
||||||
#if defined(CONFIG_USE_GUEST_BASE)
|
|
||||||
"-B address set guest_base address to address\n"
|
"-B address set guest_base address to address\n"
|
||||||
#endif
|
|
||||||
"-bsd type select emulated BSD type FreeBSD/NetBSD/OpenBSD (default)\n"
|
"-bsd type select emulated BSD type FreeBSD/NetBSD/OpenBSD (default)\n"
|
||||||
"\n"
|
"\n"
|
||||||
"Debug options:\n"
|
"Debug options:\n"
|
||||||
@ -830,11 +826,9 @@ int main(int argc, char **argv)
|
|||||||
#endif
|
#endif
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
#if defined(CONFIG_USE_GUEST_BASE)
|
|
||||||
} else if (!strcmp(r, "B")) {
|
} else if (!strcmp(r, "B")) {
|
||||||
guest_base = strtol(argv[optind++], NULL, 0);
|
guest_base = strtol(argv[optind++], NULL, 0);
|
||||||
have_guest_base = 1;
|
have_guest_base = 1;
|
||||||
#endif
|
|
||||||
} else if (!strcmp(r, "drop-ld-preload")) {
|
} else if (!strcmp(r, "drop-ld-preload")) {
|
||||||
(void) envlist_unsetenv(envlist, "LD_PRELOAD");
|
(void) envlist_unsetenv(envlist, "LD_PRELOAD");
|
||||||
} else if (!strcmp(r, "bsd")) {
|
} else if (!strcmp(r, "bsd")) {
|
||||||
@ -923,7 +917,6 @@ int main(int argc, char **argv)
|
|||||||
target_environ = envlist_to_environ(envlist, NULL);
|
target_environ = envlist_to_environ(envlist, NULL);
|
||||||
envlist_free(envlist);
|
envlist_free(envlist);
|
||||||
|
|
||||||
#if defined(CONFIG_USE_GUEST_BASE)
|
|
||||||
/*
|
/*
|
||||||
* Now that page sizes are configured in cpu_init() we can do
|
* Now that page sizes are configured in cpu_init() we can do
|
||||||
* proper page alignment for guest_base.
|
* proper page alignment for guest_base.
|
||||||
@ -950,7 +943,6 @@ int main(int argc, char **argv)
|
|||||||
fclose(fp);
|
fclose(fp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif /* CONFIG_USE_GUEST_BASE */
|
|
||||||
|
|
||||||
if (loader_exec(filename, argv+optind, target_environ, regs, info) != 0) {
|
if (loader_exec(filename, argv+optind, target_environ, regs, info) != 0) {
|
||||||
printf("Error loading %s\n", filename);
|
printf("Error loading %s\n", filename);
|
||||||
@ -964,9 +956,7 @@ int main(int argc, char **argv)
|
|||||||
free(target_environ);
|
free(target_environ);
|
||||||
|
|
||||||
if (qemu_log_enabled()) {
|
if (qemu_log_enabled()) {
|
||||||
#if defined(CONFIG_USE_GUEST_BASE)
|
|
||||||
qemu_log("guest_base 0x%lx\n", guest_base);
|
qemu_log("guest_base 0x%lx\n", guest_base);
|
||||||
#endif
|
|
||||||
log_page_dump();
|
log_page_dump();
|
||||||
|
|
||||||
qemu_log("start_brk 0x" TARGET_ABI_FMT_lx "\n", info->start_brk);
|
qemu_log("start_brk 0x" TARGET_ABI_FMT_lx "\n", info->start_brk);
|
||||||
@ -986,12 +976,10 @@ int main(int argc, char **argv)
|
|||||||
syscall_init();
|
syscall_init();
|
||||||
signal_init();
|
signal_init();
|
||||||
|
|
||||||
#if defined(CONFIG_USE_GUEST_BASE)
|
|
||||||
/* Now that we've loaded the binary, GUEST_BASE is fixed. Delay
|
/* Now that we've loaded the binary, GUEST_BASE is fixed. Delay
|
||||||
generating the prologue until now so that the prologue can take
|
generating the prologue until now so that the prologue can take
|
||||||
the real value of GUEST_BASE into account. */
|
the real value of GUEST_BASE into account. */
|
||||||
tcg_prologue_init(&tcg_ctx);
|
tcg_prologue_init(&tcg_ctx);
|
||||||
#endif
|
|
||||||
|
|
||||||
/* build Task State */
|
/* build Task State */
|
||||||
memset(ts, 0, sizeof(TaskState));
|
memset(ts, 0, sizeof(TaskState));
|
||||||
|
@ -101,9 +101,7 @@ typedef struct TaskState {
|
|||||||
|
|
||||||
void init_task_state(TaskState *ts);
|
void init_task_state(TaskState *ts);
|
||||||
extern const char *qemu_uname_release;
|
extern const char *qemu_uname_release;
|
||||||
#if defined(CONFIG_USE_GUEST_BASE)
|
|
||||||
extern unsigned long mmap_min_addr;
|
extern unsigned long mmap_min_addr;
|
||||||
#endif
|
|
||||||
|
|
||||||
/* ??? See if we can avoid exposing so much of the loader internals. */
|
/* ??? See if we can avoid exposing so much of the loader internals. */
|
||||||
/*
|
/*
|
||||||
|
10
configure
vendored
10
configure
vendored
@ -293,7 +293,6 @@ cocoa="no"
|
|||||||
softmmu="yes"
|
softmmu="yes"
|
||||||
linux_user="no"
|
linux_user="no"
|
||||||
bsd_user="no"
|
bsd_user="no"
|
||||||
guest_base="yes"
|
|
||||||
aix="no"
|
aix="no"
|
||||||
blobs="yes"
|
blobs="yes"
|
||||||
pkgversion=""
|
pkgversion=""
|
||||||
@ -975,10 +974,6 @@ for opt do
|
|||||||
;;
|
;;
|
||||||
--enable-bsd-user) bsd_user="yes"
|
--enable-bsd-user) bsd_user="yes"
|
||||||
;;
|
;;
|
||||||
--enable-guest-base) guest_base="yes"
|
|
||||||
;;
|
|
||||||
--disable-guest-base) guest_base="no"
|
|
||||||
;;
|
|
||||||
--enable-pie) pie="yes"
|
--enable-pie) pie="yes"
|
||||||
;;
|
;;
|
||||||
--disable-pie) pie="no"
|
--disable-pie) pie="no"
|
||||||
@ -1314,7 +1309,6 @@ disabled with --disable-FEATURE, default is enabled if available:
|
|||||||
user supported user emulation targets
|
user supported user emulation targets
|
||||||
linux-user all linux usermode emulation targets
|
linux-user all linux usermode emulation targets
|
||||||
bsd-user all BSD usermode emulation targets
|
bsd-user all BSD usermode emulation targets
|
||||||
guest-base GUEST_BASE support for usermode emulation targets
|
|
||||||
docs build documentation
|
docs build documentation
|
||||||
guest-agent build the QEMU Guest Agent
|
guest-agent build the QEMU Guest Agent
|
||||||
guest-agent-msi build guest agent Windows MSI installation package
|
guest-agent-msi build guest agent Windows MSI installation package
|
||||||
@ -4544,7 +4538,6 @@ fi
|
|||||||
echo "brlapi support $brlapi"
|
echo "brlapi support $brlapi"
|
||||||
echo "bluez support $bluez"
|
echo "bluez support $bluez"
|
||||||
echo "Documentation $docs"
|
echo "Documentation $docs"
|
||||||
echo "GUEST_BASE $guest_base"
|
|
||||||
echo "PIE $pie"
|
echo "PIE $pie"
|
||||||
echo "vde support $vde"
|
echo "vde support $vde"
|
||||||
echo "netmap support $netmap"
|
echo "netmap support $netmap"
|
||||||
@ -5481,9 +5474,6 @@ fi
|
|||||||
if test "$target_user_only" = "yes" -a "$bflt" = "yes"; then
|
if test "$target_user_only" = "yes" -a "$bflt" = "yes"; then
|
||||||
echo "TARGET_HAS_BFLT=y" >> $config_target_mak
|
echo "TARGET_HAS_BFLT=y" >> $config_target_mak
|
||||||
fi
|
fi
|
||||||
if test "$target_user_only" = "yes" -a "$guest_base" = "yes"; then
|
|
||||||
echo "CONFIG_USE_GUEST_BASE=y" >> $config_target_mak
|
|
||||||
fi
|
|
||||||
if test "$target_bsd_user" = "yes" ; then
|
if test "$target_bsd_user" = "yes" ; then
|
||||||
echo "CONFIG_BSD_USER=y" >> $config_target_mak
|
echo "CONFIG_BSD_USER=y" >> $config_target_mak
|
||||||
fi
|
fi
|
||||||
|
@ -160,16 +160,11 @@ static inline void tswap64s(uint64_t *s)
|
|||||||
/* On some host systems the guest address space is reserved on the host.
|
/* On some host systems the guest address space is reserved on the host.
|
||||||
* This allows the guest address space to be offset to a convenient location.
|
* This allows the guest address space to be offset to a convenient location.
|
||||||
*/
|
*/
|
||||||
#if defined(CONFIG_USE_GUEST_BASE)
|
|
||||||
extern unsigned long guest_base;
|
extern unsigned long guest_base;
|
||||||
extern int have_guest_base;
|
extern int have_guest_base;
|
||||||
extern unsigned long reserved_va;
|
extern unsigned long reserved_va;
|
||||||
#define GUEST_BASE guest_base
|
#define GUEST_BASE guest_base
|
||||||
#define RESERVED_VA reserved_va
|
#define RESERVED_VA reserved_va
|
||||||
#else
|
|
||||||
#define GUEST_BASE 0ul
|
|
||||||
#define RESERVED_VA 0ul
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define GUEST_ADDR_MAX (RESERVED_VA ? RESERVED_VA : \
|
#define GUEST_ADDR_MAX (RESERVED_VA ? RESERVED_VA : \
|
||||||
(1ul << TARGET_VIRT_ADDR_SPACE_BITS) - 1)
|
(1ul << TARGET_VIRT_ADDR_SPACE_BITS) - 1)
|
||||||
|
@ -1756,7 +1756,6 @@ static void probe_guest_base(const char *image_name,
|
|||||||
* it explicitly, and set guest_base appropriately.
|
* it explicitly, and set guest_base appropriately.
|
||||||
* In case of error we will print a suitable message and exit.
|
* In case of error we will print a suitable message and exit.
|
||||||
*/
|
*/
|
||||||
#if defined(CONFIG_USE_GUEST_BASE)
|
|
||||||
const char *errmsg;
|
const char *errmsg;
|
||||||
if (!have_guest_base && !reserved_va) {
|
if (!have_guest_base && !reserved_va) {
|
||||||
unsigned long host_start, real_start, host_size;
|
unsigned long host_start, real_start, host_size;
|
||||||
@ -1795,7 +1794,6 @@ static void probe_guest_base(const char *image_name,
|
|||||||
exit_errmsg:
|
exit_errmsg:
|
||||||
fprintf(stderr, "%s: %s\n", image_name, errmsg);
|
fprintf(stderr, "%s: %s\n", image_name, errmsg);
|
||||||
exit(-1);
|
exit(-1);
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -43,7 +43,6 @@ int gdbstub_port;
|
|||||||
envlist_t *envlist;
|
envlist_t *envlist;
|
||||||
static const char *cpu_model;
|
static const char *cpu_model;
|
||||||
unsigned long mmap_min_addr;
|
unsigned long mmap_min_addr;
|
||||||
#if defined(CONFIG_USE_GUEST_BASE)
|
|
||||||
unsigned long guest_base;
|
unsigned long guest_base;
|
||||||
int have_guest_base;
|
int have_guest_base;
|
||||||
#if (TARGET_LONG_BITS == 32) && (HOST_LONG_BITS == 64)
|
#if (TARGET_LONG_BITS == 32) && (HOST_LONG_BITS == 64)
|
||||||
@ -63,7 +62,6 @@ unsigned long reserved_va = 0xf7000000;
|
|||||||
#else
|
#else
|
||||||
unsigned long reserved_va;
|
unsigned long reserved_va;
|
||||||
#endif
|
#endif
|
||||||
#endif
|
|
||||||
|
|
||||||
static void usage(void);
|
static void usage(void);
|
||||||
|
|
||||||
@ -3584,7 +3582,6 @@ static void handle_arg_cpu(const char *arg)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(CONFIG_USE_GUEST_BASE)
|
|
||||||
static void handle_arg_guest_base(const char *arg)
|
static void handle_arg_guest_base(const char *arg)
|
||||||
{
|
{
|
||||||
guest_base = strtol(arg, NULL, 0);
|
guest_base = strtol(arg, NULL, 0);
|
||||||
@ -3626,7 +3623,6 @@ static void handle_arg_reserved_va(const char *arg)
|
|||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
static void handle_arg_singlestep(const char *arg)
|
static void handle_arg_singlestep(const char *arg)
|
||||||
{
|
{
|
||||||
@ -3673,12 +3669,10 @@ static const struct qemu_argument arg_table[] = {
|
|||||||
"argv0", "forces target process argv[0] to be 'argv0'"},
|
"argv0", "forces target process argv[0] to be 'argv0'"},
|
||||||
{"r", "QEMU_UNAME", true, handle_arg_uname,
|
{"r", "QEMU_UNAME", true, handle_arg_uname,
|
||||||
"uname", "set qemu uname release string to 'uname'"},
|
"uname", "set qemu uname release string to 'uname'"},
|
||||||
#if defined(CONFIG_USE_GUEST_BASE)
|
|
||||||
{"B", "QEMU_GUEST_BASE", true, handle_arg_guest_base,
|
{"B", "QEMU_GUEST_BASE", true, handle_arg_guest_base,
|
||||||
"address", "set guest_base address to 'address'"},
|
"address", "set guest_base address to 'address'"},
|
||||||
{"R", "QEMU_RESERVED_VA", true, handle_arg_reserved_va,
|
{"R", "QEMU_RESERVED_VA", true, handle_arg_reserved_va,
|
||||||
"size", "reserve 'size' bytes for guest virtual address space"},
|
"size", "reserve 'size' bytes for guest virtual address space"},
|
||||||
#endif
|
|
||||||
{"d", "QEMU_LOG", true, handle_arg_log,
|
{"d", "QEMU_LOG", true, handle_arg_log,
|
||||||
"item[,...]", "enable logging of specified items "
|
"item[,...]", "enable logging of specified items "
|
||||||
"(use '-d help' for a list of items)"},
|
"(use '-d help' for a list of items)"},
|
||||||
@ -3954,7 +3948,6 @@ int main(int argc, char **argv, char **envp)
|
|||||||
target_environ = envlist_to_environ(envlist, NULL);
|
target_environ = envlist_to_environ(envlist, NULL);
|
||||||
envlist_free(envlist);
|
envlist_free(envlist);
|
||||||
|
|
||||||
#if defined(CONFIG_USE_GUEST_BASE)
|
|
||||||
/*
|
/*
|
||||||
* Now that page sizes are configured in cpu_init() we can do
|
* Now that page sizes are configured in cpu_init() we can do
|
||||||
* proper page alignment for guest_base.
|
* proper page alignment for guest_base.
|
||||||
@ -3976,7 +3969,6 @@ int main(int argc, char **argv, char **envp)
|
|||||||
mmap_next_start = reserved_va;
|
mmap_next_start = reserved_va;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif /* CONFIG_USE_GUEST_BASE */
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Read in mmap_min_addr kernel parameter. This value is used
|
* Read in mmap_min_addr kernel parameter. This value is used
|
||||||
@ -4050,9 +4042,7 @@ int main(int argc, char **argv, char **envp)
|
|||||||
free(target_environ);
|
free(target_environ);
|
||||||
|
|
||||||
if (qemu_log_enabled()) {
|
if (qemu_log_enabled()) {
|
||||||
#if defined(CONFIG_USE_GUEST_BASE)
|
|
||||||
qemu_log("guest_base 0x%lx\n", guest_base);
|
qemu_log("guest_base 0x%lx\n", guest_base);
|
||||||
#endif
|
|
||||||
log_page_dump();
|
log_page_dump();
|
||||||
|
|
||||||
qemu_log("start_brk 0x" TARGET_ABI_FMT_lx "\n", info->start_brk);
|
qemu_log("start_brk 0x" TARGET_ABI_FMT_lx "\n", info->start_brk);
|
||||||
@ -4072,12 +4062,10 @@ int main(int argc, char **argv, char **envp)
|
|||||||
syscall_init();
|
syscall_init();
|
||||||
signal_init();
|
signal_init();
|
||||||
|
|
||||||
#if defined(CONFIG_USE_GUEST_BASE)
|
|
||||||
/* Now that we've loaded the binary, GUEST_BASE is fixed. Delay
|
/* Now that we've loaded the binary, GUEST_BASE is fixed. Delay
|
||||||
generating the prologue until now so that the prologue can take
|
generating the prologue until now so that the prologue can take
|
||||||
the real value of GUEST_BASE into account. */
|
the real value of GUEST_BASE into account. */
|
||||||
tcg_prologue_init(&tcg_ctx);
|
tcg_prologue_init(&tcg_ctx);
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(TARGET_I386)
|
#if defined(TARGET_I386)
|
||||||
env->cr[0] = CR0_PG_MASK | CR0_WP_MASK | CR0_PE_MASK;
|
env->cr[0] = CR0_PG_MASK | CR0_WP_MASK | CR0_PE_MASK;
|
||||||
|
@ -206,7 +206,6 @@ abi_ulong mmap_next_start = TASK_UNMAPPED_BASE;
|
|||||||
|
|
||||||
unsigned long last_brk;
|
unsigned long last_brk;
|
||||||
|
|
||||||
#ifdef CONFIG_USE_GUEST_BASE
|
|
||||||
/* Subroutine of mmap_find_vma, used when we have pre-allocated a chunk
|
/* Subroutine of mmap_find_vma, used when we have pre-allocated a chunk
|
||||||
of guest address space. */
|
of guest address space. */
|
||||||
static abi_ulong mmap_find_vma_reserved(abi_ulong start, abi_ulong size)
|
static abi_ulong mmap_find_vma_reserved(abi_ulong start, abi_ulong size)
|
||||||
@ -253,7 +252,6 @@ static abi_ulong mmap_find_vma_reserved(abi_ulong start, abi_ulong size)
|
|||||||
|
|
||||||
return addr;
|
return addr;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Find and reserve a free memory area of size 'size'. The search
|
* Find and reserve a free memory area of size 'size'. The search
|
||||||
@ -276,11 +274,9 @@ abi_ulong mmap_find_vma(abi_ulong start, abi_ulong size)
|
|||||||
|
|
||||||
size = HOST_PAGE_ALIGN(size);
|
size = HOST_PAGE_ALIGN(size);
|
||||||
|
|
||||||
#ifdef CONFIG_USE_GUEST_BASE
|
|
||||||
if (RESERVED_VA) {
|
if (RESERVED_VA) {
|
||||||
return mmap_find_vma_reserved(start, size);
|
return mmap_find_vma_reserved(start, size);
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
addr = start;
|
addr = start;
|
||||||
wrapped = repeat = 0;
|
wrapped = repeat = 0;
|
||||||
|
@ -56,11 +56,7 @@ static const int tcg_target_call_oarg_regs[1] = {
|
|||||||
#define TCG_REG_TMP TCG_REG_X30
|
#define TCG_REG_TMP TCG_REG_X30
|
||||||
|
|
||||||
#ifndef CONFIG_SOFTMMU
|
#ifndef CONFIG_SOFTMMU
|
||||||
# ifdef CONFIG_USE_GUEST_BASE
|
#define TCG_REG_GUEST_BASE TCG_REG_X28
|
||||||
# define TCG_REG_GUEST_BASE TCG_REG_X28
|
|
||||||
# else
|
|
||||||
# define TCG_REG_GUEST_BASE TCG_REG_XZR
|
|
||||||
# endif
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static inline void reloc_pc26(tcg_insn_unit *code_ptr, tcg_insn_unit *target)
|
static inline void reloc_pc26(tcg_insn_unit *code_ptr, tcg_insn_unit *target)
|
||||||
@ -1809,7 +1805,7 @@ static void tcg_target_qemu_prologue(TCGContext *s)
|
|||||||
tcg_set_frame(s, TCG_REG_SP, TCG_STATIC_CALL_ARGS_SIZE,
|
tcg_set_frame(s, TCG_REG_SP, TCG_STATIC_CALL_ARGS_SIZE,
|
||||||
CPU_TEMP_BUF_NLONGS * sizeof(long));
|
CPU_TEMP_BUF_NLONGS * sizeof(long));
|
||||||
|
|
||||||
#if defined(CONFIG_USE_GUEST_BASE)
|
#if !defined(CONFIG_SOFTMMU)
|
||||||
if (GUEST_BASE) {
|
if (GUEST_BASE) {
|
||||||
tcg_out_movi(s, TCG_TYPE_PTR, TCG_REG_GUEST_BASE, GUEST_BASE);
|
tcg_out_movi(s, TCG_TYPE_PTR, TCG_REG_GUEST_BASE, GUEST_BASE);
|
||||||
tcg_regset_set_reg(s->reserved_regs, TCG_REG_GUEST_BASE);
|
tcg_regset_set_reg(s->reserved_regs, TCG_REG_GUEST_BASE);
|
||||||
|
@ -40,10 +40,8 @@ static const char * const tcg_target_reg_names[TCG_TARGET_NB_REGS] = {
|
|||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_USE_GUEST_BASE
|
#ifndef CONFIG_SOFTMMU
|
||||||
#define TCG_GUEST_BASE_REG TCG_REG_R55
|
#define TCG_GUEST_BASE_REG TCG_REG_R55
|
||||||
#else
|
|
||||||
#define TCG_GUEST_BASE_REG TCG_REG_R0
|
|
||||||
#endif
|
#endif
|
||||||
#ifndef GUEST_BASE
|
#ifndef GUEST_BASE
|
||||||
#define GUEST_BASE 0
|
#define GUEST_BASE 0
|
||||||
|
@ -89,10 +89,8 @@ static bool have_isa_2_06;
|
|||||||
#define HAVE_ISA_2_06 have_isa_2_06
|
#define HAVE_ISA_2_06 have_isa_2_06
|
||||||
#define HAVE_ISEL have_isa_2_06
|
#define HAVE_ISEL have_isa_2_06
|
||||||
|
|
||||||
#ifdef CONFIG_USE_GUEST_BASE
|
#ifndef CONFIG_SOFTMMU
|
||||||
#define TCG_GUEST_BASE_REG 30
|
#define TCG_GUEST_BASE_REG 30
|
||||||
#else
|
|
||||||
#define TCG_GUEST_BASE_REG 0
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
@ -1800,7 +1798,7 @@ static void tcg_target_qemu_prologue(TCGContext *s)
|
|||||||
}
|
}
|
||||||
tcg_out_st(s, TCG_TYPE_PTR, TCG_REG_R0, TCG_REG_R1, FRAME_SIZE+LR_OFFSET);
|
tcg_out_st(s, TCG_TYPE_PTR, TCG_REG_R0, TCG_REG_R1, FRAME_SIZE+LR_OFFSET);
|
||||||
|
|
||||||
#ifdef CONFIG_USE_GUEST_BASE
|
#ifndef CONFIG_SOFTMMU
|
||||||
if (GUEST_BASE) {
|
if (GUEST_BASE) {
|
||||||
tcg_out_movi(s, TCG_TYPE_PTR, TCG_GUEST_BASE_REG, GUEST_BASE);
|
tcg_out_movi(s, TCG_TYPE_PTR, TCG_GUEST_BASE_REG, GUEST_BASE);
|
||||||
tcg_regset_set_reg(s->reserved_regs, TCG_GUEST_BASE_REG);
|
tcg_regset_set_reg(s->reserved_regs, TCG_GUEST_BASE_REG);
|
||||||
|
@ -51,7 +51,7 @@
|
|||||||
/* A scratch register that may be be used throughout the backend. */
|
/* A scratch register that may be be used throughout the backend. */
|
||||||
#define TCG_TMP0 TCG_REG_R14
|
#define TCG_TMP0 TCG_REG_R14
|
||||||
|
|
||||||
#ifdef CONFIG_USE_GUEST_BASE
|
#ifndef CONFIG_SOFTMMU
|
||||||
#define TCG_GUEST_BASE_REG TCG_REG_R13
|
#define TCG_GUEST_BASE_REG TCG_REG_R13
|
||||||
#else
|
#else
|
||||||
#define TCG_GUEST_BASE_REG TCG_REG_R0
|
#define TCG_GUEST_BASE_REG TCG_REG_R0
|
||||||
|
@ -83,10 +83,8 @@ static const char * const tcg_target_reg_names[TCG_TARGET_NB_REGS] = {
|
|||||||
#define TCG_REG_T1 TCG_REG_G1
|
#define TCG_REG_T1 TCG_REG_G1
|
||||||
#define TCG_REG_T2 TCG_REG_O7
|
#define TCG_REG_T2 TCG_REG_O7
|
||||||
|
|
||||||
#ifdef CONFIG_USE_GUEST_BASE
|
#ifndef CONFIG_SOFTMMU
|
||||||
# define TCG_GUEST_BASE_REG TCG_REG_I5
|
# define TCG_GUEST_BASE_REG TCG_REG_I5
|
||||||
#else
|
|
||||||
# define TCG_GUEST_BASE_REG TCG_REG_G0
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static const int tcg_target_reg_alloc_order[] = {
|
static const int tcg_target_reg_alloc_order[] = {
|
||||||
@ -955,7 +953,7 @@ static void tcg_target_qemu_prologue(TCGContext *s)
|
|||||||
tcg_out32(s, SAVE | INSN_RD(TCG_REG_O6) | INSN_RS1(TCG_REG_O6) |
|
tcg_out32(s, SAVE | INSN_RD(TCG_REG_O6) | INSN_RS1(TCG_REG_O6) |
|
||||||
INSN_IMM13(-frame_size));
|
INSN_IMM13(-frame_size));
|
||||||
|
|
||||||
#ifdef CONFIG_USE_GUEST_BASE
|
#ifndef CONFIG_SOFTMMU
|
||||||
if (GUEST_BASE != 0) {
|
if (GUEST_BASE != 0) {
|
||||||
tcg_out_movi(s, TCG_TYPE_PTR, TCG_GUEST_BASE_REG, GUEST_BASE);
|
tcg_out_movi(s, TCG_TYPE_PTR, TCG_GUEST_BASE_REG, GUEST_BASE);
|
||||||
tcg_regset_set_reg(s->reserved_regs, TCG_GUEST_BASE_REG);
|
tcg_regset_set_reg(s->reserved_regs, TCG_GUEST_BASE_REG);
|
||||||
|
@ -688,7 +688,7 @@ void tcg_exec_init(unsigned long tb_size)
|
|||||||
tcg_ctx.code_gen_ptr = tcg_ctx.code_gen_buffer;
|
tcg_ctx.code_gen_ptr = tcg_ctx.code_gen_buffer;
|
||||||
tcg_register_jit(tcg_ctx.code_gen_buffer, tcg_ctx.code_gen_buffer_size);
|
tcg_register_jit(tcg_ctx.code_gen_buffer, tcg_ctx.code_gen_buffer_size);
|
||||||
page_init();
|
page_init();
|
||||||
#if !defined(CONFIG_USER_ONLY) || !defined(CONFIG_USE_GUEST_BASE)
|
#if defined(CONFIG_SOFTMMU)
|
||||||
/* There's no guest base to take into account, so go ahead and
|
/* There's no guest base to take into account, so go ahead and
|
||||||
initialize the prologue now. */
|
initialize the prologue now. */
|
||||||
tcg_prologue_init(&tcg_ctx);
|
tcg_prologue_init(&tcg_ctx);
|
||||||
|
Loading…
Reference in New Issue
Block a user