[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH v4 4/7] coroutine: add libucontext as external library
From: |
Joelle van Dyne |
Subject: |
Re: [PATCH v4 4/7] coroutine: add libucontext as external library |
Date: |
Sun, 8 Nov 2020 14:51:53 -0800 |
Thanks, it built on my 18.04 machine but it seems that newer versions
of GCC had different behavior on the underscore assembly functions. I
will fix it and test on 20.04.
-j
On Sun, Nov 8, 2020 at 7:46 AM Philippe Mathieu-Daudé <f4bug@amsat.org> wrote:
>
> Hi Joelle,
>
> On 11/8/20 6:26 AM, Joelle van Dyne wrote:
> > 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 | 28 +++++++++++++++++++++++++++-
> > util/coroutine-ucontext.c | 9 +++++++++
> > .gitmodules | 3 +++
> > libucontext | 1 +
> > meson_options.txt | 2 ++
> > 6 files changed, 62 insertions(+), 4 deletions(-)
> > create mode 160000 libucontext
> ...
>
> > diff --git a/meson.build b/meson.build
> > index 8894171bd1..e62324d5ac 100644
> > --- a/meson.build
> > +++ b/meson.build
> > @@ -1259,9 +1259,34 @@ if not fdt.found() and fdt_required.length() > 0
> > error('fdt not available but required by targets ' + ',
> > '.join(fdt_required))
> > endif
> >
> > +ucontext = not_found
> > +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())
> >
> > #####################
> > # Generated sources #
> > @@ -1477,7 +1502,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)
> >
> > @@ -2135,6 +2160,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"
>
> Trying on Ubuntu 20.04 I'm getting:
>
> /usr/bin/ld: libqemuutil.a(util_coroutine-ucontext.c.o): in function
> `qemu_coroutine_new':
> util/coroutine-ucontext.c:203: undefined reference to
> `libucontext_getcontext'
> /usr/bin/ld: util/coroutine-ucontext.c:254: undefined reference to
> `libucontext_swapcontext'
> /usr/bin/ld: libucontext.a(libucontext_arch_x86_64_makecontext.c.o): in
> function `libucontext_makecontext':
> libucontext/arch/x86_64/makecontext.c:54: undefined reference to
> `_start_context'
> collect2: error: ld returned 1 exit status
>
> Regards,
>
> Phil.
- [PATCH v4 0/7] iOS and Apple Silicon host support, Joelle van Dyne, 2020/11/08
- [PATCH v4 1/7] configure: option to disable host block devices, Joelle van Dyne, 2020/11/08
- [PATCH v4 2/7] configure: cross-compiling with empty cross_prefix, Joelle van Dyne, 2020/11/08
- [PATCH v4 3/7] qemu: add support for iOS host, Joelle van Dyne, 2020/11/08
- [PATCH v4 4/7] coroutine: add libucontext as external library, Joelle van Dyne, 2020/11/08
- [PATCH v4 5/7] slirp: update build flags for iOS resolv fix, Joelle van Dyne, 2020/11/08
- [PATCH v4 6/7] tcg: implement JIT for iOS and Apple Silicon, Joelle van Dyne, 2020/11/08
- [PATCH v4 7/7] block: check availablity for preadv/pwritev on mac, Joelle van Dyne, 2020/11/08