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.
|
||||
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)
|
||||
{
|
||||
|
@ -77,12 +77,12 @@ int have_guest_base;
|
||||
(TARGET_LONG_BITS == 32 || defined(TARGET_ABI32))
|
||||
/* 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. */
|
||||
# define MAX_RESERVED_VA (0xfffffffful & TARGET_PAGE_MASK)
|
||||
# define MAX_RESERVED_VA(CPU) (0xfffffffful & TARGET_PAGE_MASK)
|
||||
# else
|
||||
# define MAX_RESERVED_VA (1ul << TARGET_VIRT_ADDR_SPACE_BITS)
|
||||
# define MAX_RESERVED_VA(CPU) (1ul << TARGET_VIRT_ADDR_SPACE_BITS)
|
||||
# endif
|
||||
# else
|
||||
# define MAX_RESERVED_VA 0
|
||||
# define MAX_RESERVED_VA(CPU) 0
|
||||
# endif
|
||||
#endif
|
||||
|
||||
@ -356,8 +356,7 @@ static void handle_arg_reserved_va(const char *arg)
|
||||
unsigned long unshifted = reserved_va;
|
||||
p++;
|
||||
reserved_va <<= shift;
|
||||
if (reserved_va >> shift != unshifted
|
||||
|| (MAX_RESERVED_VA && reserved_va > MAX_RESERVED_VA)) {
|
||||
if (reserved_va >> shift != unshifted) {
|
||||
fprintf(stderr, "Reserved virtual address too big\n");
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
@ -605,6 +604,7 @@ int main(int argc, char **argv, char **envp)
|
||||
int i;
|
||||
int ret;
|
||||
int execfd;
|
||||
unsigned long max_reserved_va;
|
||||
|
||||
error_init(argv[0]);
|
||||
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 */
|
||||
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);
|
||||
env = cpu->env_ptr;
|
||||
cpu_reset(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")) {
|
||||
do_strace = 1;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user