From: Joelle van Dyne <j@getutm.app>
To: qemu-devel@nongnu.org
Cc: Kevin Wolf <kwolf@redhat.com>, Joelle van Dyne <j@getutm.app>,
Stefan Hajnoczi <stefanha@redhat.com>
Subject: [PATCH v2 4/9] coroutine: add libucontext as external library
Date: Sun, 18 Oct 2020 18:39:23 -0700 [thread overview]
Message-ID: <20201019013928.72770-5-j@getutm.app> (raw)
In-Reply-To: <20201019013928.72770-1-j@getutm.app>
From: osy <osy86@users.noreply.github.com>
iOS does not support ucontext natively for aarch64 and the sigaltstack is
also unsupported (even worse, it fails silently, see:
https://openradar.appspot.com/13002712 )
As a workaround we include a library implementation of ucontext and add it
as a build option.
Signed-off-by: Joelle van Dyne <j@getutm.app>
---
configure | 23 ++++++++++++++++++++---
meson.build | 29 ++++++++++++++++++++++++++++-
util/coroutine-ucontext.c | 9 +++++++++
.gitmodules | 3 +++
libucontext | 1 +
meson_options.txt | 2 ++
6 files changed, 63 insertions(+), 4 deletions(-)
create mode 160000 libucontext
diff --git a/configure b/configure
index c474d7c221..0b7e25e7a5 100755
--- a/configure
+++ b/configure
@@ -1756,7 +1756,7 @@ Advanced options (experts only):
--oss-lib path to OSS library
--cpu=CPU Build for host CPU [$cpu]
--with-coroutine=BACKEND coroutine backend. Supported options:
- ucontext, sigaltstack, windows
+ ucontext, libucontext, sigaltstack, windows
--enable-gcov enable test coverage analysis with gcov
--disable-blobs disable installing provided firmware blobs
--with-vss-sdk=SDK-path enable Windows VSS support in QEMU Guest Agent
@@ -5058,6 +5058,8 @@ if test "$coroutine" = ""; then
coroutine=win32
elif test "$ucontext_works" = "yes"; then
coroutine=ucontext
+ elif test "$ios" = "yes"; then
+ coroutine=libucontext
else
coroutine=sigaltstack
fi
@@ -5081,12 +5083,27 @@ else
error_exit "only the 'windows' coroutine backend is valid for Windows"
fi
;;
+ libucontext)
+ ;;
*)
error_exit "unknown coroutine backend $coroutine"
;;
esac
fi
+case $coroutine in
+libucontext)
+ git_submodules="${git_submodules} libucontext"
+ mkdir -p libucontext
+ coroutine_impl=ucontext
+ libucontext="enabled"
+ ;;
+*)
+ coroutine_impl=$coroutine
+ libucontext="disabled"
+ ;;
+esac
+
if test "$coroutine_pool" = ""; then
coroutine_pool=yes
fi
@@ -6676,7 +6693,7 @@ if test "$rbd" = "yes" ; then
echo "RBD_LIBS=$rbd_libs" >> $config_host_mak
fi
-echo "CONFIG_COROUTINE_BACKEND=$coroutine" >> $config_host_mak
+echo "CONFIG_COROUTINE_BACKEND=$coroutine_impl" >> $config_host_mak
if test "$coroutine_pool" = "yes" ; then
echo "CONFIG_COROUTINE_POOL=1" >> $config_host_mak
else
@@ -7273,7 +7290,7 @@ NINJA=${ninja:-$PWD/ninjatool} $meson setup \
-Dcocoa=$cocoa -Dmpath=$mpath -Dsdl=$sdl -Dsdl_image=$sdl_image \
-Dvnc=$vnc -Dvnc_sasl=$vnc_sasl -Dvnc_jpeg=$vnc_jpeg -Dvnc_png=$vnc_png \
-Dgettext=$gettext -Dxkbcommon=$xkbcommon -Du2f=$u2f \
- -Dcapstone=$capstone -Dslirp=$slirp -Dfdt=$fdt \
+ -Dcapstone=$capstone -Dslirp=$slirp -Dfdt=$fdt -Ducontext=$libucontext \
$cross_arg \
"$PWD" "$source_path"
diff --git a/meson.build b/meson.build
index 69a3c00cce..e3ff35f46b 100644
--- a/meson.build
+++ b/meson.build
@@ -1099,9 +1099,35 @@ if not fdt.found() and fdt_required.length() > 0
error('fdt not available but required by targets ' + ', '.join(fdt_required))
endif
+ucontext = not_found
+slirp_opt = 'disabled'
+if get_option('ucontext').enabled()
+ if not fs.is_dir(meson.current_source_dir() / 'libucontext/arch' / cpu)
+ error('libucontext is wanted but not implemented for host ' + cpu)
+ endif
+ arch = host_machine.cpu()
+ ucontext_cargs = ['-DG_LOG_DOMAIN="ucontext"', '-DCUSTOM_IMPL']
+ ucontext_files = [
+ 'libucontext/arch' / arch / 'getcontext.S',
+ 'libucontext/arch' / arch / 'setcontext.S',
+ 'libucontext/arch' / arch / 'makecontext.c',
+ 'libucontext/arch' / arch / 'startcontext.S',
+ 'libucontext/arch' / arch / 'swapcontext.S',
+ ]
+
+ ucontext_inc = include_directories('libucontext/include')
+ libucontext = static_library('ucontext',
+ sources: ucontext_files,
+ c_args: ucontext_cargs,
+ include_directories: ucontext_inc)
+ ucontext = declare_dependency(link_with: libucontext,
+ include_directories: ucontext_inc)
+endif
+
config_host_data.set('CONFIG_CAPSTONE', capstone.found())
config_host_data.set('CONFIG_FDT', fdt.found())
config_host_data.set('CONFIG_SLIRP', slirp.found())
+config_host_data.set('CONFIG_LIBUCONTEXT', ucontext.found())
genh += configure_file(output: 'config-host.h', configuration: config_host_data)
@@ -1321,7 +1347,7 @@ util_ss.add_all(trace_ss)
util_ss = util_ss.apply(config_all, strict: false)
libqemuutil = static_library('qemuutil',
sources: util_ss.sources() + stub_ss.sources() + genh,
- dependencies: [util_ss.dependencies(), m, glib, socket, malloc])
+ dependencies: [util_ss.dependencies(), m, glib, socket, malloc, ucontext])
qemuutil = declare_dependency(link_with: libqemuutil,
sources: genh + version_res)
@@ -1916,6 +1942,7 @@ if targetos == 'windows'
summary_info += {'QGA MSI support': config_host.has_key('CONFIG_QGA_MSI')}
endif
summary_info += {'seccomp support': config_host.has_key('CONFIG_SECCOMP')}
+summary_info += {'libucontext support': ucontext.found()}
summary_info += {'coroutine backend': config_host['CONFIG_COROUTINE_BACKEND']}
summary_info += {'coroutine pool': config_host['CONFIG_COROUTINE_POOL'] == '1'}
summary_info += {'debug stack usage': config_host.has_key('CONFIG_DEBUG_STACK_USAGE')}
diff --git a/util/coroutine-ucontext.c b/util/coroutine-ucontext.c
index 904b375192..1e1dd43512 100644
--- a/util/coroutine-ucontext.c
+++ b/util/coroutine-ucontext.c
@@ -23,7 +23,16 @@
#undef _FORTIFY_SOURCE
#endif
#include "qemu/osdep.h"
+#if defined(CONFIG_LIBUCONTEXT)
+#include <libucontext.h>
+#define ucontext_t libucontext_ucontext_t
+#define getcontext libucontext_getcontext
+#define setcontext libucontext_setcontext
+#define swapcontext libucontext_swapcontext
+#define makecontext libucontext_makecontext
+#else
#include <ucontext.h>
+#endif
#include "qemu/coroutine_int.h"
#ifdef CONFIG_VALGRIND_H
diff --git a/.gitmodules b/.gitmodules
index 2bdeeacef8..065b52867f 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -64,3 +64,6 @@
[submodule "roms/vbootrom"]
path = roms/vbootrom
url = https://git.qemu.org/git/vbootrom.git
+[submodule "libucontext"]
+ path = libucontext
+ url = https://github.com/utmapp/libucontext.git
diff --git a/libucontext b/libucontext
new file mode 160000
index 0000000000..7094e4c427
--- /dev/null
+++ b/libucontext
@@ -0,0 +1 @@
+Subproject commit 7094e4c42723b6178a4e2b60d4631d8a88f40719
diff --git a/meson_options.txt b/meson_options.txt
index 1d3c94840a..a04a00649c 100644
--- a/meson_options.txt
+++ b/meson_options.txt
@@ -48,6 +48,8 @@ option('vnc_sasl', type : 'feature', value : 'auto',
description: 'SASL authentication for VNC server')
option('xkbcommon', type : 'feature', value : 'auto',
description: 'xkbcommon support')
+option('ucontext', type : 'feature', value : 'disabled',
+ description: 'libucontext support')
option('capstone', type: 'combo', value: 'auto',
choices: ['disabled', 'enabled', 'auto', 'system', 'internal'],
--
2.24.3 (Apple Git-128)
next prev parent reply other threads:[~2020-10-19 1:42 UTC|newest]
Thread overview: 44+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-10-19 1:39 [PATCH v2 0/9] iOS and Apple Silicon host support Joelle van Dyne
2020-10-19 1:39 ` [PATCH v2 1/9] configure: option to disable host block devices Joelle van Dyne
2020-10-19 1:39 ` [PATCH v2 2/9] configure: cross-compiling without cross_prefix Joelle van Dyne
2020-10-19 8:07 ` Thomas Huth
2020-10-19 8:09 ` Thomas Huth
2020-10-19 11:24 ` BALATON Zoltan via
2020-10-19 22:24 ` Joelle van Dyne
2020-10-20 5:15 ` Thomas Huth
2020-10-20 8:34 ` Paolo Bonzini
2020-10-25 19:24 ` Joelle van Dyne
2020-10-26 7:54 ` Paolo Bonzini
2020-10-26 15:33 ` Joelle van Dyne
2020-10-26 16:15 ` Paolo Bonzini
2020-10-26 18:51 ` Thomas Huth
2020-10-19 1:39 ` [PATCH v2 3/9] qemu: add support for iOS host Joelle van Dyne
2020-10-19 1:39 ` Joelle van Dyne [this message]
2020-10-19 1:39 ` [PATCH v2 5/9] tcg: add const hints for code pointers Joelle van Dyne
2020-10-19 1:39 ` Joelle van Dyne
2020-10-19 23:19 ` Richard Henderson
2020-10-19 23:19 ` Richard Henderson
2020-10-19 23:26 ` Joelle van Dyne
2020-10-19 23:27 ` Richard Henderson
2020-10-19 23:27 ` Richard Henderson
2020-10-19 23:36 ` Joelle van Dyne
2020-10-19 23:41 ` Richard Henderson
2020-10-19 1:39 ` [PATCH v2 6/9] tcg: implement mirror mapped JIT for iOS Joelle van Dyne
2020-10-19 1:39 ` Joelle van Dyne
2020-10-19 11:48 ` BALATON Zoltan via
2020-10-19 11:48 ` BALATON Zoltan
2020-10-19 22:39 ` Joelle van Dyne
2020-10-19 23:45 ` BALATON Zoltan via
2020-10-20 0:19 ` Richard Henderson
2020-10-25 19:46 ` Joelle van Dyne
2020-10-25 20:51 ` Joelle van Dyne
2020-10-25 23:43 ` Alexander Bulekov
2020-10-19 1:39 ` [PATCH v2 7/9] tcg: mirror mapping RWX pages for iOS optional Joelle van Dyne
2020-10-20 1:27 ` Richard Henderson
2020-10-19 1:39 ` [PATCH v2 8/9] tcg: support JIT on Apple Silicon Joelle van Dyne
2020-10-19 1:39 ` [PATCH v2 9/9] block: check availablity for preadv/pwritev on mac Joelle van Dyne
2020-10-19 8:27 ` Thomas Huth
2020-10-19 22:20 ` Joelle van Dyne
2020-10-20 5:19 ` Thomas Huth
2020-10-19 8:29 ` [PATCH v2 0/9] iOS and Apple Silicon host support Thomas Huth
2020-10-26 15:30 ` Joelle van Dyne
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20201019013928.72770-5-j@getutm.app \
--to=j@getutm.app \
--cc=kwolf@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=stefanha@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.