mirror of
https://github.com/izzy2lost/xemu.git
synced 2026-07-06 00:20:22 -07:00
Merge tag 'for-upstream' of https://gitlab.com/bonzini/qemu into staging
* ci: enable RISC-V cross jobs * rust: bump minimum supported version to 1.77 * rust: enable uninlined_format_args lint * initial Emscripten support * small fixes # -----BEGIN PGP SIGNATURE----- # # iQFIBAABCgAyFiEE8TM4V0tmI4mGbHaCv/vSX3jHroMFAmgaFq8UHHBib256aW5p # QHJlZGhhdC5jb20ACgkQv/vSX3jHroOxAAf/YPKw5KAoE5SwUqJ0oSOMHrU0w4jc # A2Qiw1uziA6kDmUMUXwWR7Qbd8V7jtihGrgTrIPopeavgWWQeNsBHjN4WxHRI7aq # +429rjzFo9V9tSfgp6UcLQSk/9kC4ygEwPnesHpKd27fS6z9Wg4AQkj1iFipR179 # wC3fqwOqqWZSjfUd7wjo7McFYZgL5j/cxmFXePh8+fdT+6PUKdG9nRW86KUPDZ+A # 8HxcuOW7GZd+LhnYUhi7vlLFo/RgVsGQWj0Q4BDJvUkKa13t9UUCGff7uQP2AC3v # ny0gWDcmbWY1L/QXyNzhgd44X4LAjCmpnonlYnrdZizEmhv3aByd+fANgw== # =uIJK # -----END PGP SIGNATURE----- # gpg: Signature made Tue 06 May 2025 10:03:27 EDT # gpg: using RSA key F13338574B662389866C7682BFFBD25F78C7AE83 # gpg: issuer "pbonzini@redhat.com" # gpg: Good signature from "Paolo Bonzini <bonzini@gnu.org>" [full] # gpg: aka "Paolo Bonzini <pbonzini@redhat.com>" [full] # Primary key fingerprint: 46F5 9FBD 57D6 12E7 BFD4 E2F7 7E15 100C CD36 69B1 # Subkey fingerprint: F133 3857 4B66 2389 866C 7682 BFFB D25F 78C7 AE83 * tag 'for-upstream' of https://gitlab.com/bonzini/qemu: (30 commits) gitlab: Enable CI for wasm build tests: Add Dockerfile containing dependencies for Emscripten build meson: Add wasm build in build scripts util: Add coroutine backend for emscripten util: exclude mmap-alloc.c from compilation target on Emscripten Disable options unsupported on Emscripten include/qemu/osdep.h: Add Emscripten-specific OS dependencies block: Fix type conflict of the copy_file_range stub block: Add including of ioctl header for Emscripten build util/cacheflush.c: Update cache flushing mechanism for Emscripten include/glib-compat.h: Poison g_list_sort and g_slist_sort target/s390x: Fix type conflict of GLib function pointers target/ppc: Fix type conflict of GLib function pointers target/i386/cpu.c: Fix type conflict of GLib function pointers target/arm/helper.c: Fix type conflict of GLib function pointers docs: build-system: fix typo ci: run RISC-V cross jobs by default rust: clippy: enable uninlined_format_args lint target/i386/emulate: fix target_ulong format strings docs: rust: update for newer minimum supported version ... Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
@@ -115,3 +115,30 @@
|
||||
- du -chs ${CI_PROJECT_DIR}/*-cache
|
||||
variables:
|
||||
QEMU_JOB_FUNCTIONAL: 1
|
||||
|
||||
.wasm_build_job_template:
|
||||
extends: .base_job_template
|
||||
stage: build
|
||||
image: $CI_REGISTRY_IMAGE/qemu/$IMAGE:$QEMU_CI_CONTAINER_TAG
|
||||
before_script:
|
||||
- source scripts/ci/gitlab-ci-section
|
||||
- section_start setup "Pre-script setup"
|
||||
- JOBS=$(expr $(nproc) + 1)
|
||||
- section_end setup
|
||||
script:
|
||||
- du -sh .git
|
||||
- mkdir build
|
||||
- cd build
|
||||
- section_start configure "Running configure"
|
||||
- emconfigure ../configure --disable-docs
|
||||
${TARGETS:+--target-list="$TARGETS"}
|
||||
$CONFIGURE_ARGS ||
|
||||
{ cat config.log meson-logs/meson-log.txt && exit 1; }
|
||||
- if test -n "$LD_JOBS";
|
||||
then
|
||||
pyvenv/bin/meson configure . -Dbackend_max_links="$LD_JOBS" ;
|
||||
fi || exit 1;
|
||||
- section_end configure
|
||||
- section_start build "Building QEMU"
|
||||
- emmake make -j"$JOBS"
|
||||
- section_end build
|
||||
|
||||
@@ -792,3 +792,12 @@ coverity:
|
||||
when: never
|
||||
# Always manual on forks even if $QEMU_CI == "2"
|
||||
- when: manual
|
||||
|
||||
build-wasm:
|
||||
extends: .wasm_build_job_template
|
||||
timeout: 2h
|
||||
needs:
|
||||
job: wasm-emsdk-cross-container
|
||||
variables:
|
||||
IMAGE: emsdk-wasm32-cross
|
||||
CONFIGURE_ARGS: --static --disable-tools --enable-debug --enable-tcg-interpreter
|
||||
|
||||
@@ -67,11 +67,8 @@ ppc64el-debian-cross-container:
|
||||
riscv64-debian-cross-container:
|
||||
extends: .container_job_template
|
||||
stage: containers
|
||||
# as we are currently based on 'sid/unstable' we may break so...
|
||||
allow_failure: true
|
||||
variables:
|
||||
NAME: debian-riscv64-cross
|
||||
QEMU_JOB_OPTIONAL: 1
|
||||
|
||||
s390x-debian-cross-container:
|
||||
extends: .container_job_template
|
||||
@@ -94,3 +91,8 @@ win64-fedora-cross-container:
|
||||
extends: .container_job_template
|
||||
variables:
|
||||
NAME: fedora-win64-cross
|
||||
|
||||
wasm-emsdk-cross-container:
|
||||
extends: .container_job_template
|
||||
variables:
|
||||
NAME: emsdk-wasm32-cross
|
||||
|
||||
@@ -118,12 +118,8 @@ cross-ppc64el-kvm-only:
|
||||
IMAGE: debian-ppc64el-cross
|
||||
EXTRA_CONFIGURE_OPTS: --disable-tcg --without-default-devices
|
||||
|
||||
# The riscv64 cross-builds currently use a 'sid' container to get
|
||||
# compilers and libraries. Until something more stable is found we
|
||||
# allow_failure so as not to block CI.
|
||||
cross-riscv64-system:
|
||||
extends: .cross_system_build_job
|
||||
allow_failure: true
|
||||
needs:
|
||||
job: riscv64-debian-cross-container
|
||||
variables:
|
||||
@@ -131,7 +127,6 @@ cross-riscv64-system:
|
||||
|
||||
cross-riscv64-user:
|
||||
extends: .cross_user_build_job
|
||||
allow_failure: true
|
||||
needs:
|
||||
job: riscv64-debian-cross-container
|
||||
variables:
|
||||
|
||||
@@ -627,6 +627,15 @@ F: .gitlab-ci.d/cirrus/macos-*
|
||||
F: */*.m
|
||||
F: scripts/entitlement.sh
|
||||
|
||||
WebAssembly
|
||||
M: Kohei Tokunaga <ktokunaga.mail@gmail.com>
|
||||
S: Maintained
|
||||
F: include/system/os-wasm.h
|
||||
F: os-wasm.c
|
||||
F: util/coroutine-wasm.c
|
||||
F: configs/meson/emscripten.txt
|
||||
F: tests/docker/dockerfiles/emsdk-wasm32-cross.docker
|
||||
|
||||
Alpha Machines
|
||||
--------------
|
||||
M: Richard Henderson <richard.henderson@linaro.org>
|
||||
|
||||
@@ -12,8 +12,10 @@ system_ss.add([files(
|
||||
|
||||
if host_os != 'windows'
|
||||
system_ss.add(files('rng-random.c'))
|
||||
system_ss.add(files('hostmem-file.c'))
|
||||
system_ss.add([files('hostmem-shm.c'), rt])
|
||||
if host_os != 'emscripten'
|
||||
system_ss.add(files('hostmem-file.c'))
|
||||
system_ss.add([files('hostmem-shm.c'), rt])
|
||||
endif
|
||||
endif
|
||||
if host_os == 'linux'
|
||||
system_ss.add(files('hostmem-memfd.c'))
|
||||
|
||||
+9
-2
@@ -110,6 +110,10 @@
|
||||
#include <sys/diskslice.h>
|
||||
#endif
|
||||
|
||||
#ifdef EMSCRIPTEN
|
||||
#include <sys/ioctl.h>
|
||||
#endif
|
||||
|
||||
/* OS X does not have O_DSYNC */
|
||||
#ifndef O_DSYNC
|
||||
#ifdef O_SYNC
|
||||
@@ -2076,8 +2080,11 @@ static int handle_aiocb_write_zeroes_unmap(void *opaque)
|
||||
}
|
||||
|
||||
#ifndef HAVE_COPY_FILE_RANGE
|
||||
static off_t copy_file_range(int in_fd, off_t *in_off, int out_fd,
|
||||
off_t *out_off, size_t len, unsigned int flags)
|
||||
#ifndef EMSCRIPTEN
|
||||
static
|
||||
#endif
|
||||
ssize_t copy_file_range(int in_fd, off_t *in_off, int out_fd,
|
||||
off_t *out_off, size_t len, unsigned int flags)
|
||||
{
|
||||
#ifdef __NR_copy_file_range
|
||||
return syscall(__NR_copy_file_range, in_fd, in_off, out_fd,
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
[built-in options]
|
||||
c_args = ['-pthread']
|
||||
cpp_args = ['-pthread']
|
||||
objc_args = ['-pthread']
|
||||
# -sPROXY_TO_PTHREAD link time flag always requires -pthread even during
|
||||
# configuration so explicitly add the flag here.
|
||||
c_link_args = ['-pthread','-sASYNCIFY=1','-sPROXY_TO_PTHREAD=1','-sFORCE_FILESYSTEM','-sALLOW_TABLE_GROWTH','-sTOTAL_MEMORY=2GB','-sWASM_BIGINT','-sEXPORT_ES6=1','-sASYNCIFY_IMPORTS=ffi_call_js','-sEXPORTED_RUNTIME_METHODS=addFunction,removeFunction,TTY,FS']
|
||||
cpp_link_args = ['-pthread','-sASYNCIFY=1','-sPROXY_TO_PTHREAD=1','-sFORCE_FILESYSTEM','-sALLOW_TABLE_GROWTH','-sTOTAL_MEMORY=2GB','-sWASM_BIGINT','-sEXPORT_ES6=1','-sASYNCIFY_IMPORTS=ffi_call_js','-sEXPORTED_RUNTIME_METHODS=addFunction,removeFunction,TTY,FS']
|
||||
@@ -360,6 +360,10 @@ elif check_define __NetBSD__; then
|
||||
host_os=netbsd
|
||||
elif check_define __APPLE__; then
|
||||
host_os=darwin
|
||||
elif check_define EMSCRIPTEN ; then
|
||||
host_os=emscripten
|
||||
cpu=wasm32
|
||||
cross_compile="yes"
|
||||
else
|
||||
# This is a fatal error, but don't report it yet, because we
|
||||
# might be going to just print the --help text, or it might
|
||||
@@ -526,6 +530,9 @@ case "$cpu" in
|
||||
linux_arch=x86
|
||||
CPU_CFLAGS="-m64"
|
||||
;;
|
||||
wasm32)
|
||||
CPU_CFLAGS="-m32"
|
||||
;;
|
||||
esac
|
||||
|
||||
if test -n "$host_arch" && {
|
||||
|
||||
@@ -118,9 +118,14 @@ Rust build dependencies
|
||||
include bindgen or have an older version, it is recommended to install
|
||||
a newer version using ``cargo install bindgen-cli``.
|
||||
|
||||
Developers may want to use Cargo-based tools in the QEMU source tree;
|
||||
this requires Cargo 1.74.0. Note that Cargo is not required in order
|
||||
to build QEMU.
|
||||
QEMU requires Rust 1.77.0. This is available on all supported platforms
|
||||
with one exception, namely the ``mips64el`` architecture on Debian bookworm.
|
||||
For all other architectures, Debian bookworm provides a new-enough Rust
|
||||
compiler in the ``rustc-web`` package.
|
||||
|
||||
Also, on Ubuntu 22.04 or 24.04 this requires the ``rustc-1.77``
|
||||
(or newer) package. The path to ``rustc`` and ``rustdoc`` must be
|
||||
provided manually to the configure script.
|
||||
|
||||
Optional build dependencies
|
||||
Build components whose absence does not affect the ability to build QEMU
|
||||
|
||||
@@ -168,7 +168,7 @@ The required versions of the packages are stored in a configuration file
|
||||
``pythondeps.toml``. The format is custom to QEMU, but it is documented
|
||||
at the top of the file itself and it should be easy to understand. The
|
||||
requirements should make it possible to use the version that is packaged
|
||||
that is provided by supported distros.
|
||||
by QEMU's supported distros.
|
||||
|
||||
When dependencies are downloaded, instead, ``configure`` uses a "known
|
||||
good" version that is also listed in ``pythondeps.toml``. In this
|
||||
|
||||
+2
-36
@@ -71,36 +71,9 @@ Building Rust code with ``--enable-modules`` is not supported yet.
|
||||
Supported tools
|
||||
'''''''''''''''
|
||||
|
||||
QEMU supports rustc version 1.63.0 and newer. Notably, the following features
|
||||
QEMU supports rustc version 1.77.0 and newer. Notably, the following features
|
||||
are missing:
|
||||
|
||||
* ``core::ffi`` (1.64.0). Use ``std::os::raw`` and ``std::ffi`` instead.
|
||||
|
||||
* ``cast_mut()``/``cast_const()`` (1.65.0). Use ``as`` instead.
|
||||
|
||||
* "let ... else" (1.65.0). Use ``if let`` instead. This is currently patched
|
||||
in QEMU's vendored copy of the bilge crate.
|
||||
|
||||
* Generic Associated Types (1.65.0)
|
||||
|
||||
* ``CStr::from_bytes_with_nul()`` as a ``const`` function (1.72.0).
|
||||
|
||||
* "Return position ``impl Trait`` in Traits" (1.75.0, blocker for including
|
||||
the pinned-init create).
|
||||
|
||||
* ``MaybeUninit::zeroed()`` as a ``const`` function (1.75.0). QEMU's
|
||||
``Zeroable`` trait can be implemented without ``MaybeUninit::zeroed()``,
|
||||
so this would be just a cleanup.
|
||||
|
||||
* ``c"" literals`` (stable in 1.77.0). QEMU provides a ``c_str!()`` macro
|
||||
to define ``CStr`` constants easily
|
||||
|
||||
* ``offset_of!`` (stable in 1.77.0). QEMU uses ``offset_of!()`` heavily; it
|
||||
provides a replacement in the ``qemu_api`` crate, but it does not support
|
||||
lifetime parameters and therefore ``&'a Something`` fields in the struct
|
||||
may have to be replaced by ``NonNull<Something>``. *Nested* ``offset_of!``
|
||||
was only stabilized in Rust 1.82.0, but it is not used.
|
||||
|
||||
* inline const expression (stable in 1.79.0), currently worked around with
|
||||
associated constants in the ``FnCall`` trait.
|
||||
|
||||
@@ -125,12 +98,6 @@ are missing:
|
||||
|
||||
__ https://github.com/rust-lang/rust/pull/125258
|
||||
|
||||
It is expected that QEMU will advance its minimum supported version of
|
||||
rustc to 1.77.0 as soon as possible; as of January 2025, blockers
|
||||
for that right now are Debian bookworm and 32-bit MIPS processors.
|
||||
This unfortunately means that references to statics in constants will
|
||||
remain an issue.
|
||||
|
||||
QEMU also supports version 0.60.x of bindgen, which is missing option
|
||||
``--generate-cstr``. This option requires version 0.66.x and will
|
||||
be adopted as soon as supporting these older versions is not necessary
|
||||
@@ -183,7 +150,6 @@ module status
|
||||
``bitops`` complete
|
||||
``callbacks`` complete
|
||||
``cell`` stable
|
||||
``c_str`` complete
|
||||
``errno`` complete
|
||||
``irq`` complete
|
||||
``memory`` stable
|
||||
@@ -440,7 +406,7 @@ Adding dependencies
|
||||
Generally, the set of dependent crates is kept small. Think twice before
|
||||
adding a new external crate, especially if it comes with a large set of
|
||||
dependencies itself. Sometimes QEMU only needs a small subset of the
|
||||
functionality; see for example QEMU's ``assertions`` or ``c_str`` modules.
|
||||
functionality; see for example QEMU's ``assertions`` module.
|
||||
|
||||
On top of this recommendation, adding external crates to QEMU is a
|
||||
slightly complicated process, mostly due to the need to teach Meson how
|
||||
|
||||
@@ -36,6 +36,13 @@
|
||||
#include <pwd.h>
|
||||
#endif
|
||||
|
||||
/*
|
||||
* These functions perform function pointer casts which can cause function call
|
||||
* failure on Emscripten. Use g_slist_sort_with_data and g_list_sort_with_data
|
||||
* instead of these functions.
|
||||
*/
|
||||
#pragma GCC poison g_slist_sort g_list_sort
|
||||
|
||||
/*
|
||||
* Note that because of the GLIB_VERSION_MAX_ALLOWED constant above, allowing
|
||||
* use of functions from newer GLib via this compat header needs a little
|
||||
|
||||
@@ -26,6 +26,13 @@ static inline void flush_idcache_range(uintptr_t rx, uintptr_t rw, size_t len)
|
||||
/* icache is coherent and does not require flushing. */
|
||||
}
|
||||
|
||||
#elif defined(EMSCRIPTEN)
|
||||
|
||||
static inline void flush_idcache_range(uintptr_t rx, uintptr_t rw, size_t len)
|
||||
{
|
||||
/* Wasm doesn't have executable region of memory. */
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
void flush_idcache_range(uintptr_t rx, uintptr_t rw, size_t len);
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
* To avoid getting into possible circular include dependencies, this
|
||||
* file should not include any other QEMU headers, with the exceptions
|
||||
* of config-host.h, config-target.h, qemu/compiler.h,
|
||||
* system/os-posix.h, system/os-win32.h, glib-compat.h and
|
||||
* system/os-posix.h, system/os-win32.h, system/os-wasm.h, glib-compat.h and
|
||||
* qemu/typedefs.h, all of which are doing a similar job to this file
|
||||
* and are under similar constraints.
|
||||
*
|
||||
@@ -164,10 +164,14 @@ QEMU_EXTERN_C int daemon(int, int);
|
||||
#include "system/os-win32.h"
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_POSIX
|
||||
#if defined(CONFIG_POSIX) && !defined(EMSCRIPTEN)
|
||||
#include "system/os-posix.h"
|
||||
#endif
|
||||
|
||||
#if defined(EMSCRIPTEN)
|
||||
#include "system/os-wasm.h"
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
@@ -0,0 +1,104 @@
|
||||
/* SPDX-License-Identifier: MIT */
|
||||
/*
|
||||
* posix specific declarations forked from os-posix.h, removing functions not
|
||||
* working on Emscripten
|
||||
*
|
||||
* Copyright (c) 2003-2008 Fabrice Bellard
|
||||
* Copyright (c) 2010 Jes Sorensen <Jes.Sorensen@redhat.com>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef QEMU_OS_WASM_H
|
||||
#define QEMU_OS_WASM_H
|
||||
|
||||
#include <sys/mman.h>
|
||||
#include <sys/socket.h>
|
||||
#include <netinet/in.h>
|
||||
#include <netinet/tcp.h>
|
||||
#include <arpa/inet.h>
|
||||
#include <netdb.h>
|
||||
#include <sys/un.h>
|
||||
|
||||
#ifdef CONFIG_SYSMACROS
|
||||
#include <sys/sysmacros.h>
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
void os_set_line_buffering(void);
|
||||
void os_setup_early_signal_handling(void);
|
||||
void os_set_proc_name(const char *s);
|
||||
void os_setup_signal_handling(void);
|
||||
void os_setup_limits(void);
|
||||
void os_setup_post(void);
|
||||
int os_mlock(bool on_fault);
|
||||
static inline int os_set_daemonize(bool d)
|
||||
{
|
||||
return -1;
|
||||
};
|
||||
bool is_daemonized(void);
|
||||
static inline void os_daemonize(void) {}
|
||||
|
||||
/**
|
||||
* qemu_alloc_stack:
|
||||
* @sz: pointer to a size_t holding the requested usable stack size
|
||||
*
|
||||
* Allocate memory that can be used as a stack, for instance for
|
||||
* coroutines. If the memory cannot be allocated, this function
|
||||
* will abort (like g_malloc()). This function also inserts an
|
||||
* additional guard page to catch a potential stack overflow.
|
||||
* Note that the memory required for the guard page and alignment
|
||||
* and minimal stack size restrictions will increase the value of sz.
|
||||
*
|
||||
* The allocated stack must be freed with qemu_free_stack().
|
||||
*
|
||||
* Returns: pointer to (the lowest address of) the stack memory.
|
||||
*/
|
||||
void *qemu_alloc_stack(size_t *sz);
|
||||
|
||||
/**
|
||||
* qemu_free_stack:
|
||||
* @stack: stack to free
|
||||
* @sz: size of stack in bytes
|
||||
*
|
||||
* Free a stack allocated via qemu_alloc_stack(). Note that sz must
|
||||
* be exactly the adjusted stack size returned by qemu_alloc_stack.
|
||||
*/
|
||||
void qemu_free_stack(void *stack, size_t sz);
|
||||
|
||||
/* POSIX and Mingw32 differ in the name of the stdio lock functions. */
|
||||
|
||||
static inline void qemu_flockfile(FILE *f)
|
||||
{
|
||||
flockfile(f);
|
||||
}
|
||||
|
||||
static inline void qemu_funlockfile(FILE *f)
|
||||
{
|
||||
funlockfile(f);
|
||||
}
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
+27
-8
@@ -50,9 +50,9 @@ genh = []
|
||||
qapi_trace_events = []
|
||||
|
||||
bsd_oses = ['gnu/kfreebsd', 'freebsd', 'netbsd', 'openbsd', 'dragonfly', 'darwin']
|
||||
supported_oses = ['windows', 'freebsd', 'netbsd', 'openbsd', 'darwin', 'sunos', 'linux']
|
||||
supported_oses = ['windows', 'freebsd', 'netbsd', 'openbsd', 'darwin', 'sunos', 'linux', 'emscripten']
|
||||
supported_cpus = ['ppc', 'ppc64', 's390x', 'riscv32', 'riscv64', 'x86', 'x86_64',
|
||||
'arm', 'aarch64', 'loongarch64', 'mips', 'mips64', 'sparc64']
|
||||
'arm', 'aarch64', 'loongarch64', 'mips', 'mips64', 'sparc64', 'wasm32']
|
||||
|
||||
cpu = host_machine.cpu_family()
|
||||
|
||||
@@ -94,12 +94,12 @@ have_rust = have_rust and add_languages('rust', native: true,
|
||||
required: get_option('rust').disable_auto_if(not have_system))
|
||||
if have_rust
|
||||
rustc = meson.get_compiler('rust')
|
||||
if rustc.version().version_compare('<1.63.0')
|
||||
if rustc.version().version_compare('<1.77.0')
|
||||
if get_option('rust').enabled()
|
||||
error('rustc version ' + rustc.version() + ' is unsupported. Please upgrade to at least 1.63.0')
|
||||
error('rustc version ' + rustc.version() + ' is unsupported. Please upgrade to at least 1.77.0')
|
||||
else
|
||||
warning('rustc version ' + rustc.version() + ' is unsupported, disabling Rust compilation.')
|
||||
message('Please upgrade to at least 1.63.0 to use Rust.')
|
||||
message('Please upgrade to at least 1.77.0 to use Rust.')
|
||||
have_rust = false
|
||||
endif
|
||||
endif
|
||||
@@ -353,6 +353,8 @@ foreach lang : all_languages
|
||||
# endif
|
||||
#endif''')
|
||||
# ok
|
||||
elif compiler.get_id() == 'emscripten'
|
||||
# ok
|
||||
else
|
||||
error('You either need GCC v7.4 or Clang v10.0 (or XCode Clang v15.0) to compile QEMU')
|
||||
endif
|
||||
@@ -470,7 +472,10 @@ endif
|
||||
# instead, we can't add -no-pie because it overrides -shared: the linker then
|
||||
# tries to build an executable instead of a shared library and fails. So
|
||||
# don't add -no-pie anywhere and cross fingers. :(
|
||||
if not get_option('b_pie')
|
||||
#
|
||||
# Emscripten doesn't support -no-pie but meson can't catch the compiler
|
||||
# warning. So explicitly omit the flag for Emscripten.
|
||||
if not get_option('b_pie') and host_os != 'emscripten'
|
||||
qemu_common_flags += cc.get_supported_arguments('-fno-pie', '-no-pie')
|
||||
endif
|
||||
|
||||
@@ -514,6 +519,8 @@ ucontext_probe = '''
|
||||
supported_backends = []
|
||||
if host_os == 'windows'
|
||||
supported_backends += ['windows']
|
||||
elif host_os == 'emscripten'
|
||||
supported_backends += ['wasm']
|
||||
else
|
||||
if host_os != 'darwin' and cc.links(ucontext_probe)
|
||||
supported_backends += ['ucontext']
|
||||
@@ -902,6 +909,10 @@ if get_option('tcg').allowed()
|
||||
if not get_option('tcg_interpreter')
|
||||
error('Unsupported CPU @0@, try --enable-tcg-interpreter'.format(cpu))
|
||||
endif
|
||||
elif host_arch == 'wasm32'
|
||||
if not get_option('tcg_interpreter')
|
||||
error('WebAssembly host requires --enable-tcg-interpreter')
|
||||
endif
|
||||
elif get_option('tcg_interpreter')
|
||||
warning('Use of the TCG interpreter is not recommended on this host')
|
||||
warning('architecture. There is a native TCG execution backend available')
|
||||
@@ -2962,7 +2973,9 @@ config_host_data.set('CONFIG_ATOMIC64', cc.links('''
|
||||
return 0;
|
||||
}''', args: qemu_isa_flags))
|
||||
|
||||
has_int128_type = cc.compiles('''
|
||||
# has_int128_type is set to false on Emscripten to avoid errors by libffi
|
||||
# during runtime.
|
||||
has_int128_type = host_os != 'emscripten' and cc.compiles('''
|
||||
__int128_t a;
|
||||
__uint128_t b;
|
||||
int main(void) { b = a; }''')
|
||||
@@ -3775,6 +3788,8 @@ if have_block
|
||||
# os-win32.c does not
|
||||
if host_os == 'windows'
|
||||
system_ss.add(files('os-win32.c'))
|
||||
elif host_os == 'emscripten'
|
||||
blockdev_ss.add(files('os-wasm.c'))
|
||||
else
|
||||
blockdev_ss.add(files('os-posix.c'))
|
||||
endif
|
||||
@@ -4516,7 +4531,11 @@ subdir('scripts')
|
||||
subdir('tools')
|
||||
subdir('pc-bios')
|
||||
subdir('docs')
|
||||
subdir('tests')
|
||||
# Tests are disabled on emscripten because they rely on host features that aren't
|
||||
# supported by emscripten (e.g. fork and unix socket).
|
||||
if host_os != 'emscripten'
|
||||
subdir('tests')
|
||||
endif
|
||||
if gtk.found()
|
||||
subdir('po')
|
||||
endif
|
||||
|
||||
+1
-1
@@ -34,7 +34,7 @@ option('fuzzing_engine', type : 'string', value : '',
|
||||
option('trace_file', type: 'string', value: 'trace',
|
||||
description: 'Trace file prefix for simple backend')
|
||||
option('coroutine_backend', type: 'combo',
|
||||
choices: ['ucontext', 'sigaltstack', 'windows', 'auto'],
|
||||
choices: ['ucontext', 'sigaltstack', 'windows', 'wasm', 'auto'],
|
||||
value: 'auto', description: 'coroutine backend to use')
|
||||
|
||||
# Everything else can be set via --enable/--disable-* option
|
||||
|
||||
@@ -0,0 +1,119 @@
|
||||
/* SPDX-License-Identifier: MIT */
|
||||
/*
|
||||
* os-wasm.c
|
||||
* Forked from os-posix.c, removing functions not working on Emscripten
|
||||
*
|
||||
* Copyright (c) 2003-2008 Fabrice Bellard
|
||||
* Copyright (c) 2010 Red Hat, Inc.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#include "qemu/osdep.h"
|
||||
#include <sys/resource.h>
|
||||
#include <sys/wait.h>
|
||||
#include <pwd.h>
|
||||
#include <grp.h>
|
||||
#include <libgen.h>
|
||||
|
||||
#include "qemu/error-report.h"
|
||||
#include "qemu/log.h"
|
||||
#include "system/runstate.h"
|
||||
#include "qemu/cutils.h"
|
||||
|
||||
void os_setup_post(void){}
|
||||
void os_set_line_buffering(void)
|
||||
{
|
||||
setvbuf(stdout, NULL, _IOLBF, 0);
|
||||
}
|
||||
void os_setup_early_signal_handling(void)
|
||||
{
|
||||
struct sigaction act;
|
||||
sigfillset(&act.sa_mask);
|
||||
act.sa_flags = 0;
|
||||
act.sa_handler = SIG_IGN;
|
||||
sigaction(SIGPIPE, &act, NULL);
|
||||
}
|
||||
void os_set_proc_name(const char *s)
|
||||
{
|
||||
error_report("Change of process name not supported by your OS");
|
||||
exit(1);
|
||||
}
|
||||
static void termsig_handler(int signal, siginfo_t *info, void *c)
|
||||
{
|
||||
qemu_system_killed(info->si_signo, info->si_pid);
|
||||
}
|
||||
|
||||
void os_setup_signal_handling(void)
|
||||
{
|
||||
struct sigaction act;
|
||||
|
||||
memset(&act, 0, sizeof(act));
|
||||
act.sa_sigaction = termsig_handler;
|
||||
act.sa_flags = SA_SIGINFO;
|
||||
sigaction(SIGINT, &act, NULL);
|
||||
sigaction(SIGHUP, &act, NULL);
|
||||
sigaction(SIGTERM, &act, NULL);
|
||||
}
|
||||
void os_setup_limits(void)
|
||||
{
|
||||
struct rlimit nofile;
|
||||
|
||||
if (getrlimit(RLIMIT_NOFILE, &nofile) < 0) {
|
||||
warn_report("unable to query NOFILE limit: %s", strerror(errno));
|
||||
return;
|
||||
}
|
||||
|
||||
if (nofile.rlim_cur == nofile.rlim_max) {
|
||||
return;
|
||||
}
|
||||
|
||||
nofile.rlim_cur = nofile.rlim_max;
|
||||
|
||||
if (setrlimit(RLIMIT_NOFILE, &nofile) < 0) {
|
||||
warn_report("unable to set NOFILE limit: %s", strerror(errno));
|
||||
return;
|
||||
}
|
||||
}
|
||||
int os_mlock(bool on_fault)
|
||||
{
|
||||
#ifdef HAVE_MLOCKALL
|
||||
int ret = 0;
|
||||
int flags = MCL_CURRENT | MCL_FUTURE;
|
||||
|
||||
if (on_fault) {
|
||||
#ifdef HAVE_MLOCK_ONFAULT
|
||||
flags |= MCL_ONFAULT;
|
||||
#else
|
||||
error_report("mlockall: on_fault not supported");
|
||||
return -EINVAL;
|
||||
#endif
|
||||
}
|
||||
|
||||
ret = mlockall(flags);
|
||||
if (ret < 0) {
|
||||
error_report("mlockall: %s", strerror(errno));
|
||||
}
|
||||
|
||||
return ret;
|
||||
#else
|
||||
(void)on_fault;
|
||||
return -ENOSYS;
|
||||
#endif
|
||||
}
|
||||
+2
-2
@@ -4862,7 +4862,7 @@ SRST
|
||||
Start right away with a saved state (``loadvm`` in monitor)
|
||||
ERST
|
||||
|
||||
#ifndef _WIN32
|
||||
#if !defined(_WIN32) && !defined(EMSCRIPTEN)
|
||||
DEF("daemonize", 0, QEMU_OPTION_daemonize, \
|
||||
"-daemonize daemonize QEMU after initializing\n", QEMU_ARCH_ALL)
|
||||
#endif
|
||||
@@ -5249,7 +5249,7 @@ HXCOMM Internal use
|
||||
DEF("qtest", HAS_ARG, QEMU_OPTION_qtest, "", QEMU_ARCH_ALL)
|
||||
DEF("qtest-log", HAS_ARG, QEMU_OPTION_qtest_log, "", QEMU_ARCH_ALL)
|
||||
|
||||
#ifdef CONFIG_POSIX
|
||||
#if defined(CONFIG_POSIX) && !defined(EMSCRIPTEN)
|
||||
DEF("run-with", HAS_ARG, QEMU_OPTION_run_with,
|
||||
"-run-with [async-teardown=on|off][,chroot=dir][user=username|uid:gid]\n"
|
||||
" Set miscellaneous QEMU process lifecycle options:\n"
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user