Commit 8f67b9c6 authored by Richard Henderson's avatar Richard Henderson Committed by Laurent Vivier
Browse files

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: default avatarRichard Henderson <richard.henderson@linaro.org>
Reviewed-by: default avatarPeter Maydell <peter.maydell@linaro.org>
Message-Id: <20190822185929.16891-2-richard.henderson@linaro.org>
Signed-off-by: default avatarLaurent Vivier <laurent@vivier.eu>
parent 9bdfa4d2
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -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)
{
+25 −18
Original line number Diff line number Diff line
@@ -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;
    }