mirror of
https://github.com/qemu/qemu.git
synced 2024-12-12 05:03:42 +08:00
bsd-user: Baby Steps towards eliminating qemu_host_page_size, et al
First baby-steps towards eliminating qemu_host_page_size: tackle the reserve_va calculation (which is easier to copy from linux-user than to fix). -----BEGIN PGP SIGNATURE----- Comment: GPGTools - https://gpgtools.org iQIzBAABCgAdFiEEIDX4lLAKo898zeG3bBzRKH2wEQAFAmZl3pgACgkQbBzRKH2w EQBfpg//U4YdJAA0H4okwPtowP1wIK1gpWvVd5FIN17pCXLKT4FR4efhWeEnQh8U +dXvkCpX/MnhBkStYoGZBmYe1rNKkEAn8BPCsQqX4y3af5RzKyKWo0gZXOjN3L9e ixmeFcg/7BTwnSbcO02xd9BOPPaRiFBDSidh28gr/1sxpXRxlbQHzIUpTBncDaN6 4w5DnF+b1RFHCz05ytrP517cj7E32Ig9S/cVMmBd1pGJiLnHiOp/peMprCL6tnI+ YNBzttCbRPNH2z0zVd9En/hDnVirGPYX+LXg0Djkw3I+stJj4jwbJTuDG+5Lzghp YrYfiU6x7OG9ywjFJgY1/pExVT1cwkNjuGCXL+F4R49R5LfIEHq5/MlQp+tjpYYO g5WmpiLnFpFosmXIPJmxr16zqm2sLD+P0Jr/kdIz58fTWmIQeKwi/Vu/73h4kxST vjBbhC3eg56lQDaospc4h8+RehmI6LdSWYx0kxv2JKpXH3lQPqsDSrOcm9hEbWYS DeV++vkyQcXrbCnwomfxG1U+dVYBlJ1L1wClxc/1WD9KxXXJIwlvGmIu3o3c2+xj BM6eRe3evWioqdqhc2lY+XxATwbIUxiect6ml+F6E0KJxlm3Ajqy6qw49G+uhZxa XWUEIYGDd6/xHMlBeo6FKUpe/Ez/i3eCFXr4AD4iO7AtTuukrO4= =3EaH -----END PGP SIGNATURE----- Merge tag 'bsd-user-misc-2024q2-pull-request' of gitlab.com:bsdimp/qemu into staging bsd-user: Baby Steps towards eliminating qemu_host_page_size, et al First baby-steps towards eliminating qemu_host_page_size: tackle the reserve_va calculation (which is easier to copy from linux-user than to fix). # -----BEGIN PGP SIGNATURE----- # Comment: GPGTools - https://gpgtools.org # # iQIzBAABCgAdFiEEIDX4lLAKo898zeG3bBzRKH2wEQAFAmZl3pgACgkQbBzRKH2w # EQBfpg//U4YdJAA0H4okwPtowP1wIK1gpWvVd5FIN17pCXLKT4FR4efhWeEnQh8U # +dXvkCpX/MnhBkStYoGZBmYe1rNKkEAn8BPCsQqX4y3af5RzKyKWo0gZXOjN3L9e # ixmeFcg/7BTwnSbcO02xd9BOPPaRiFBDSidh28gr/1sxpXRxlbQHzIUpTBncDaN6 # 4w5DnF+b1RFHCz05ytrP517cj7E32Ig9S/cVMmBd1pGJiLnHiOp/peMprCL6tnI+ # YNBzttCbRPNH2z0zVd9En/hDnVirGPYX+LXg0Djkw3I+stJj4jwbJTuDG+5Lzghp # YrYfiU6x7OG9ywjFJgY1/pExVT1cwkNjuGCXL+F4R49R5LfIEHq5/MlQp+tjpYYO # g5WmpiLnFpFosmXIPJmxr16zqm2sLD+P0Jr/kdIz58fTWmIQeKwi/Vu/73h4kxST # vjBbhC3eg56lQDaospc4h8+RehmI6LdSWYx0kxv2JKpXH3lQPqsDSrOcm9hEbWYS # DeV++vkyQcXrbCnwomfxG1U+dVYBlJ1L1wClxc/1WD9KxXXJIwlvGmIu3o3c2+xj # BM6eRe3evWioqdqhc2lY+XxATwbIUxiect6ml+F6E0KJxlm3Ajqy6qw49G+uhZxa # XWUEIYGDd6/xHMlBeo6FKUpe/Ez/i3eCFXr4AD4iO7AtTuukrO4= # =3EaH # -----END PGP SIGNATURE----- # gpg: Signature made Sun 09 Jun 2024 09:55:52 AM PDT # gpg: using RSA key 2035F894B00AA3CF7CCDE1B76C1CD1287DB01100 # gpg: Good signature from "Warner Losh <wlosh@netflix.com>" [unknown] # gpg: aka "Warner Losh <imp@bsdimp.com>" [unknown] # gpg: aka "Warner Losh <imp@freebsd.org>" [unknown] # gpg: aka "Warner Losh <imp@village.org>" [unknown] # gpg: aka "Warner Losh <wlosh@bsdimp.com>" [unknown] # gpg: WARNING: This key is not certified with a trusted signature! # gpg: There is no indication that the signature belongs to the owner. # Primary key fingerprint: 2035 F894 B00A A3CF 7CCD E1B7 6C1C D128 7DB0 1100 * tag 'bsd-user-misc-2024q2-pull-request' of gitlab.com:bsdimp/qemu: bsd-user: Catch up to run-time reserved_va math bsd-user: port linux-user:ff8a8bbc2ad1 for variable page sizes linux-user: Adjust comment to reflect the code. Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
commit
80e8f06021
@ -46,6 +46,7 @@
|
||||
#include "crypto/init.h"
|
||||
#include "qemu/guest-random.h"
|
||||
#include "gdbstub/user.h"
|
||||
#include "exec/page-vary.h"
|
||||
|
||||
#include "host-os.h"
|
||||
#include "target_arch_cpu.h"
|
||||
@ -76,25 +77,16 @@ bool have_guest_base;
|
||||
# if HOST_LONG_BITS > TARGET_VIRT_ADDR_SPACE_BITS
|
||||
# if TARGET_VIRT_ADDR_SPACE_BITS == 32 && \
|
||||
(TARGET_LONG_BITS == 32 || defined(TARGET_ABI32))
|
||||
# define MAX_RESERVED_VA 0xfffffffful
|
||||
# define MAX_RESERVED_VA(CPU) 0xfffffffful
|
||||
# else
|
||||
# define MAX_RESERVED_VA ((1ul << TARGET_VIRT_ADDR_SPACE_BITS) - 1)
|
||||
# define MAX_RESERVED_VA(CPU) ((1ul << TARGET_VIRT_ADDR_SPACE_BITS) - 1)
|
||||
# endif
|
||||
# else
|
||||
# define MAX_RESERVED_VA 0
|
||||
# define MAX_RESERVED_VA(CPU) 0
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/*
|
||||
* That said, 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
|
||||
unsigned long reserved_va = MAX_RESERVED_VA;
|
||||
#else
|
||||
unsigned long reserved_va;
|
||||
#endif
|
||||
|
||||
const char *interp_prefix = CONFIG_QEMU_INTERP_PREFIX;
|
||||
const char *qemu_uname_release;
|
||||
@ -291,6 +283,8 @@ int main(int argc, char **argv)
|
||||
char **target_environ, **wrk;
|
||||
envlist_t *envlist = NULL;
|
||||
char *argv0 = NULL;
|
||||
int host_page_size;
|
||||
unsigned long max_reserved_va;
|
||||
|
||||
adjust_ssize();
|
||||
|
||||
@ -476,11 +470,44 @@ int main(int argc, char **argv)
|
||||
opt_one_insn_per_tb, &error_abort);
|
||||
ac->init_machine(NULL);
|
||||
}
|
||||
|
||||
/*
|
||||
* Finalize page size before creating CPUs.
|
||||
* This will do nothing if !TARGET_PAGE_BITS_VARY.
|
||||
* The most efficient setting is to match the host.
|
||||
*/
|
||||
host_page_size = qemu_real_host_page_size();
|
||||
set_preferred_target_page_bits(ctz32(host_page_size));
|
||||
finalize_target_page_bits();
|
||||
|
||||
cpu = cpu_create(cpu_type);
|
||||
env = cpu_env(cpu);
|
||||
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. Unless we're running a
|
||||
* target address space of 32 or fewer bits on a host with 64 bits.
|
||||
*/
|
||||
max_reserved_va = MAX_RESERVED_VA(cpu);
|
||||
if (reserved_va != 0) {
|
||||
if ((reserved_va + 1) % host_page_size) {
|
||||
char *s = size_to_str(host_page_size);
|
||||
fprintf(stderr, "Reserved virtual address not aligned mod %s\n", s);
|
||||
g_free(s);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
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) {
|
||||
/* MAX_RESERVED_VA + 1 is a large power of 2, so is aligned. */
|
||||
reserved_va = max_reserved_va;
|
||||
}
|
||||
|
||||
if (getenv("QEMU_STRACE")) {
|
||||
do_strace = 1;
|
||||
}
|
||||
|
@ -814,10 +814,10 @@ int main(int argc, char **argv, char **envp)
|
||||
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.
|
||||
* 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. Unless we're running a
|
||||
* target address space of 32 or fewer bits on a host with 64 bits.
|
||||
*/
|
||||
max_reserved_va = MAX_RESERVED_VA(cpu);
|
||||
if (reserved_va != 0) {
|
||||
|
Loading…
Reference in New Issue
Block a user