|
@@ -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;
|
|
|
}
|