mirror of https://github.com/xemu-project/xemu.git
linux-user: Pass CPUState to MAX_RESERVED_VA
Turn the scalar macro into a functional macro. Move the creation of the cpu up a bit within main() so that we can pass it to the invocation of MAX_RESERVED_VA. Delay the validation of the -R parameter until MAX_RESERVED_VA is computed. So far no changes to any of the MAX_RESERVED_VA macros to actually use the cpu in any way, but ARM will need it. Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Message-Id: <20190822185929.16891-2-richard.henderson@linaro.org> Signed-off-by: Laurent Vivier <laurent@vivier.eu>
This commit is contained in:
parent
9bdfa4d23f
commit
8f67b9c694
|
@ -21,7 +21,7 @@
|
||||||
|
|
||||||
/* We need to be able to map the commpage.
|
/* We need to be able to map the commpage.
|
||||||
See validate_guest_space in linux-user/elfload.c. */
|
See validate_guest_space in linux-user/elfload.c. */
|
||||||
#define MAX_RESERVED_VA 0xffff0000ul
|
#define MAX_RESERVED_VA(CPU) 0xffff0000ul
|
||||||
|
|
||||||
static inline void cpu_clone_regs(CPUARMState *env, target_ulong newsp)
|
static inline void cpu_clone_regs(CPUARMState *env, target_ulong newsp)
|
||||||
{
|
{
|
||||||
|
|
|
@ -77,12 +77,12 @@ int have_guest_base;
|
||||||
(TARGET_LONG_BITS == 32 || defined(TARGET_ABI32))
|
(TARGET_LONG_BITS == 32 || defined(TARGET_ABI32))
|
||||||
/* There are a number of places where we assign reserved_va to a variable
|
/* There are a number of places where we assign reserved_va to a variable
|
||||||
of type abi_ulong and expect it to fit. Avoid the last page. */
|
of type abi_ulong and expect it to fit. Avoid the last page. */
|
||||||
# define MAX_RESERVED_VA (0xfffffffful & TARGET_PAGE_MASK)
|
# define MAX_RESERVED_VA(CPU) (0xfffffffful & TARGET_PAGE_MASK)
|
||||||
# else
|
# else
|
||||||
# define MAX_RESERVED_VA (1ul << TARGET_VIRT_ADDR_SPACE_BITS)
|
# define MAX_RESERVED_VA(CPU) (1ul << TARGET_VIRT_ADDR_SPACE_BITS)
|
||||||
# endif
|
# endif
|
||||||
# else
|
# else
|
||||||
# define MAX_RESERVED_VA 0
|
# define MAX_RESERVED_VA(CPU) 0
|
||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -356,8 +356,7 @@ static void handle_arg_reserved_va(const char *arg)
|
||||||
unsigned long unshifted = reserved_va;
|
unsigned long unshifted = reserved_va;
|
||||||
p++;
|
p++;
|
||||||
reserved_va <<= shift;
|
reserved_va <<= shift;
|
||||||
if (reserved_va >> shift != unshifted
|
if (reserved_va >> shift != unshifted) {
|
||||||
|| (MAX_RESERVED_VA && reserved_va > MAX_RESERVED_VA)) {
|
|
||||||
fprintf(stderr, "Reserved virtual address too big\n");
|
fprintf(stderr, "Reserved virtual address too big\n");
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
@ -605,6 +604,7 @@ int main(int argc, char **argv, char **envp)
|
||||||
int i;
|
int i;
|
||||||
int ret;
|
int ret;
|
||||||
int execfd;
|
int execfd;
|
||||||
|
unsigned long max_reserved_va;
|
||||||
|
|
||||||
error_init(argv[0]);
|
error_init(argv[0]);
|
||||||
module_call_init(MODULE_INIT_TRACE);
|
module_call_init(MODULE_INIT_TRACE);
|
||||||
|
@ -670,24 +670,31 @@ int main(int argc, char **argv, char **envp)
|
||||||
/* init tcg before creating CPUs and to get qemu_host_page_size */
|
/* init tcg before creating CPUs and to get qemu_host_page_size */
|
||||||
tcg_exec_init(0);
|
tcg_exec_init(0);
|
||||||
|
|
||||||
/* Reserving *too* much vm space via mmap can run into problems
|
|
||||||
with rlimits, oom due to page table creation, etc. We will still try it,
|
|
||||||
if directed by the command-line option, but not by default. */
|
|
||||||
if (HOST_LONG_BITS == 64 &&
|
|
||||||
TARGET_VIRT_ADDR_SPACE_BITS <= 32 &&
|
|
||||||
reserved_va == 0) {
|
|
||||||
/* reserved_va must be aligned with the host page size
|
|
||||||
* as it is used with mmap()
|
|
||||||
*/
|
|
||||||
reserved_va = MAX_RESERVED_VA & qemu_host_page_mask;
|
|
||||||
}
|
|
||||||
|
|
||||||
cpu = cpu_create(cpu_type);
|
cpu = cpu_create(cpu_type);
|
||||||
env = cpu->env_ptr;
|
env = cpu->env_ptr;
|
||||||
cpu_reset(cpu);
|
cpu_reset(cpu);
|
||||||
|
|
||||||
thread_cpu = cpu;
|
thread_cpu = cpu;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Reserving too much vm space via mmap can run into problems
|
||||||
|
* with rlimits, oom due to page table creation, etc. We will
|
||||||
|
* still try it, if directed by the command-line option, but
|
||||||
|
* not by default.
|
||||||
|
*/
|
||||||
|
max_reserved_va = MAX_RESERVED_VA(cpu);
|
||||||
|
if (reserved_va != 0) {
|
||||||
|
if (max_reserved_va && reserved_va > max_reserved_va) {
|
||||||
|
fprintf(stderr, "Reserved virtual address too big\n");
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
} else if (HOST_LONG_BITS == 64 && TARGET_VIRT_ADDR_SPACE_BITS <= 32) {
|
||||||
|
/*
|
||||||
|
* reserved_va must be aligned with the host page size
|
||||||
|
* as it is used with mmap()
|
||||||
|
*/
|
||||||
|
reserved_va = max_reserved_va & qemu_host_page_mask;
|
||||||
|
}
|
||||||
|
|
||||||
if (getenv("QEMU_STRACE")) {
|
if (getenv("QEMU_STRACE")) {
|
||||||
do_strace = 1;
|
do_strace = 1;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue