Commit Graph

857 Commits

Author SHA1 Message Date
Oliver Kowalke
bd493f77d8
Merge pull request #122 from janisozaur/patch-1
Fix compilation with MSVC for ARM
2019-10-23 11:34:13 +02:00
Oliver Kowalke
70fd9b6b62
Merge pull request #123 from kernigh/kernigh-ppc32-3
Fix ppc32 on Linux musl, NetBSD, OpenBSD; fixes #120
2019-10-23 11:19:54 +02:00
George Koehler
df8fb6b528 Fix ppc32 on Linux musl, NetBSD, OpenBSD; fixes #120
This fixes fcontext on my PowerBook G4 running Void Linux
ppc-musl-20190901, NetBSD/macppc 8.1, or OpenBSD/macppc 6.6-current,
all with g++.  These systems use fcontext for *ppc32_sysv_elf*
(PowerPC 32-bit System V ELF).  The assembly code was wrong for BSD
and crashing on Linux musl.

Linux returns a transfer_t in memory (through a hidden pointer in R3),
but other systems (at least NetBSD and OpenBSD) return a transfer_t in
registers R3:R4.  jump_fcontext() and ontop_fcontext() were always
using the hidden pointer.  Add checks for `#ifdef__linux__`; start
using R3:R4 on other systems.

make_fcontext() was calling _exit(0) through the insecure BSS PLT.
Set R30 to use the secure PLT.  This prevents a crash when musl's
ld.so loads the executable; musl seems to require the secure PLT.

Fix ontop_fcontext() to restore the hidden pointer on Linux.  It was
passing the wrong context's hidden pointer to the ontop-function fn(),
so fn() returned a transfer_t to the wrong stack.  When fn() was
context_exit() in <boost/context/continuation_fcontext.hpp>, it freed
the old stack, then returned `transfer_t{ nullptr, nullptr }` to free
memory.  This crashed on Linux musl.

Now that ontop_fcontext() restores the hidden pointer, it must stop
abusing the same pointer to pass a transfer_t argument to fn().  Add a
new ontop_fcontext_tail() in C++, which takes arguments in registers
and allocates a transfer_t.  The code is in C++ so it can free the
transfer_t argument if fn() throws a C++ exception.

Rearrange the context frame to shrink it from 244 to 240 bytes.  This
fixes the stack alignment: the ABI requires R1 % 16 == 0, and
make_fcontext() respects this, but jump_fcontext() was adding 244 to
R1, so the new context ran with a misaligned stack (244 % 16 == 4).

Remove R13 from the context frame, so new contexts stop loading R13
with garbage.  The ABI uses R13 to point to the executable's small
data, so R13 should have the same value in every context.

Add the backchain to the context frame; make room by moving LR to the
caller's frame.  Order CR, R14 to R31, F14 to F31 at the frame's end,
as is typical for this ABI.  Provide 8-byte alignment for FPSCR and
F14 to F31, to avoid a misalignment penalty.
2019-10-19 14:06:24 -04:00
Michał Janiszewski
0386f0e6fd
Fix compilation with MSVC for ARM
Much like https://github.com/boostorg/type_traits/pull/106, only allow
x86-specific intrinsics when targetting x86-like architectures.
2019-10-16 22:45:12 +02:00
Oliver Kowalke
a4bdc60ed3
Merge pull request #121 from kernigh/kernigh-openbsd
Use mmap(2) MAP_STACK to allocate stacks on OpenBSD
2019-10-04 06:28:04 +02:00
George Koehler
7e14ab9e45 Use mmap(2) MAP_STACK to allocate stacks on OpenBSD
Since OpenBSD 6.4 (https://www.openbsd.org/64.html), the stack pointer
must point to MAP_STACK memory, or the kernel may kill the process
with a signal.  All stack allocators must pass MAP_STACK to mmap(2).

Define BOOST_CONTEXT_USE_MAP_STACK on OpenBSD, and don't define it on
other systems.  This doesn't check for old versions of OpenBSD without
MAP_STACK; but OpenBSD has stopped maintaining versions before 6.4.

If BOOST_CONTEXT_USE_MAP_STACK is defined, then cause the stack
allocators to pass MAP_STACK to mmap(2):

 - fixedsize_stack uses mmap/munmap instead of malloc/free.  This
   comes from a patch in OpenBSD Ports.

 - protected_fixedsize_stack adds MAP_STACK to the mmap flags (as it
   does in OpenBSD Ports).  Assume that systems with MAP_STACK also
   have MAP_ANON; this is true on OpenBSD.  Delete POSIX comment,
   because I can't find MAP_ANON nor MAP_ANONYMOUS in POSIX, so these
   mmap calls don't conform to POSIX.

 - pooled_fixedsize_stack can't call munmap, because the pool's free
   doesn't know the allocation's size.  Instead use posix_memalign to
   allocate memory, then mmap to replace the pages with MAP_STACK
   pages, so the pool's free may call std::free.

OpenBSD has no <ucontext.h>, so edit test/Jamfile.v2 to skip ucontext
tests on OpenBSD.

This commit and https://github.com/boostorg/test/pull/231 causes
libs/context/test `b2 full` to pass on OpenBSD 6.5 for 64-bit x86.
`b2 fc` fails because the allocator in test_fcontext.cpp does not use
MAP_STACK.  The tests seem not to cover pooled_fixedsize_stack nor
protected_fixedsize_stack, but they still pass when I temporarily hack
callcc to use those allocators instead of fixedsize_stack.
2019-10-03 20:47:36 -04:00
Oliver Kowalke
14b4f45187 docu: sanitizer support 2019-10-02 08:17:24 +02:00
Oliver Kowalke
ff08ccbbfa
Merge pull request #119 from nealef/s390x
Optimize s390x instructions
2019-09-21 08:57:21 +02:00
Neale Ferguson
b90917eaed Optimize s390x instructions 2019-09-20 13:23:19 -04:00
Oliver Kowalke
36a81359f0 docu: update architectures 2019-09-12 17:38:19 +02:00
Oliver Kowalke
ecb4e398a7
Merge pull request #117 from Naveenaidu/add-support-s390x
S390x: Add Support for s390x arch
2019-09-06 19:20:12 +02:00
Naveenaidu
adecfdc88c S390x: Add Support for s390x arch 2019-09-06 20:08:10 +05:30
Oliver Kowalke
0c754f90c5 execution_context removed 2019-08-29 13:42:03 +02:00
Oliver Kowalke
227fbd01f2 documentation updated 2019-08-11 20:04:40 +02:00
Oliver Kowalke
cba547ba5d
Merge pull request #112 from boostorg/revert-111-s390x-debug
Revert "S390x Implementation: WIP"
2019-08-03 08:33:36 +02:00
Oliver Kowalke
9c772a7830
Revert "S390x Implementation: WIP" 2019-08-03 08:33:17 +02:00
Oliver Kowalke
26aee14910
Merge pull request #111 from Naveenaidu/s390x-debug
S390x Implementation: WIP
2019-08-03 08:25:57 +02:00
Naveenaidu
cc71b90db6 Jamfile.v2: Fix binary format s390x 2019-08-03 09:27:55 +05:30
Naveenaidu
4d0cd2a6ce jump_s390x_sys_elf: Add jump_context for s390x 2019-07-31 18:51:49 +05:30
Naveenaidu
99a29956f3 s390x_make_context: Fix stack frame 2019-07-31 18:50:38 +05:30
Naveenaidu
81e26a1618 make_context: Add s390x arch 2019-07-22 22:53:43 +05:30
Naveenaidu
e7c5977119 architecture.jam: Add s390x arch 2019-07-22 22:53:43 +05:30
Naveenaidu
2d56804025 Jamfile.v2: Add s390x arch 2019-07-22 22:53:43 +05:30
Oliver Kowalke
d4608a4e8b
Merge pull request #106 from shawnanastasio/ppc64_elfv2_fix
Fix ABI violation on ppc64 ELFv2, fixes #72
2019-05-04 10:43:00 +02:00
Shawn Anastasio
2354eca9b7 Fix ABI violation on ppc64 ELFv2, fixes #72
The existing ontop_fcontext implementation for ppc64 ELFv2
violates the ABI by not storing the callback entry address
in %r12 before branching. This results in crashes on this
platform.

This commit addresses this and allows the context library
to function as expected on ppc64 platforms using the ELFv2 ABI.
2019-05-03 20:18:11 -05:00
Oliver Kowalke
9b25cc4bda
Merge pull request #104 from andreas-schwab/develop
Add support for RISC-V LP64D
2019-04-09 15:09:08 +02:00
Andreas Schwab
c8fb4a42f3 Add support for RISC-V LP64D 2019-04-09 14:15:31 +02:00
Oliver Kowalke
fa50eb9d33 abi::__forced_unwind is only part of gnu's libstc++ 2019-03-17 15:49:35 +01:00
Oliver Kowalke
42ac510319 do not define BOOST_CONTEXT_HAS_CXXABI_H for MacOS 2019-03-15 10:38:11 +01:00
Oliver Kowalke
26e6ea0325 Don't crash on pthread_cancel
Justinas V. Daugmaudis: This patch prevents abi::__forced_unwind from being eaten<Paste>
2019-03-14 15:43:53 +01:00
Oliver Kowalke
f62fbbe318 test for CXXABI 2019-03-14 15:00:19 +01:00
Oliver Kowalke
0cd376c71a cleanup of stack if creating ucontext fails
- in context of #99
2019-02-22 09:28:40 +01:00
Oliver Kowalke
a8889e0b59
Merge pull request #98 from tux3/fix_ios_i386_jump
Fix jump_i386_sysv_macho writing garbage to the x87 control word
2019-02-18 19:31:40 +01:00
Oliver Kowalke
2741e7b771
Update jump_i386_sysv_macho_gas.S 2019-02-18 19:30:00 +01:00
tux3
8e0047654d Fix jump_i386_sysv_macho writing garbage to the x87 control word
It seems the macho code may have been modeled after the elf version,
which writes the returned transport_t through a pointer in eax,
however macho is expected to return its transport_t result in eax:edx.

The macho code mistakenly wrote its "data" return value through eax.
This happens to overwrite the saved fc_x87_cw before it is loaded,
resulting in floating-point exceptions and crashes in unrelated code.
2019-02-18 17:44:54 +01:00
Oliver Kowalke
b35a0dba0e
Update README.md 2019-02-02 12:59:32 +01:00
Oliver Kowalke
9f8a21a623
Merge pull request #97 from djarek/fix_dll_warning
Add missing BOST_CONTEXT_DECL in stack_context
2019-02-02 09:33:31 +01:00
Damian Jarek
a7d6914380 Add missing BOST_CONTEXT_DECL in stack_context
Fixes a dll-interface warning in MSVC.

Signed-off-by: Damian Jarek <damian.jarek93@gmail.com>
2019-02-01 22:54:52 +01:00
Oliver Kowalke
ed0e1bd58d
Merge pull request #95 from djarek/fix_bad_cast
Fix bad static_cast in resume_with:
2018-12-16 14:46:26 +01:00
Damian Jarek
e547c725a9
Fix bad static_cast in resume_with:
- fix a cast from void* to the wrong dynamic type. The code cast from
  tuple<decay_t<Fn>>* -> void* -> tuple<Fn>, which worked when an rvalue
  was passed to resume_with(), but broke if the function was passed
  by lvalue-reference, because it resulted in a cast from Fn to Fn&.
- remove use of std::tuple - no need to instantiate it for every callable.

Signed-off-by: Damian Jarek <damian.jarek93@gmail.com>
2018-12-16 04:07:20 +01:00
Oliver Kowalke
11a5126526
Merge pull request #94 from the78mole/develop
Fixed a bug for armv7 by adding .syntax unifed to assembly sources
2018-12-02 17:26:17 +01:00
Daniel Glaser
b1ec752540 Fixed a bug for armv7 by adding .syntax unifed to assembly sources 2018-12-02 12:56:51 +01:00
Oliver Kowalke
7601e2a975
Merge pull request #92 from FlyGoat/mips-n64
Implement mips64 n64 elf
2018-11-28 10:23:40 +01:00
Jiaxun Yang
e3f744a186 Implement mips64 n64 elf
n64 ABI is very different from o32 ABI
2018-11-28 15:13:56 +08:00
Oliver Kowalke
bcc3ed785b Reproducibility: Set .file section for all *_elf_gas.S
- in context of #91

Add a .file directive to all *_elf_gas.S files to prevent the linker
adding a host build-system path as a FILE symbol to the object file.
Without this, the gnu linker adds a symbol like this:

thanks to Douglas Royds <douglas.royds@taitradio.com>
openembedded/openembedded-core
2018-11-24 19:36:27 +01:00
Oliver Kowalke
0ff78f749b
Merge pull request #90 from theodelrieu/build/remove_useless_lines
Build/remove useless lines
2018-11-09 14:15:02 +01:00
Théo DELRIEU
d8830fedff
remove useless lines in Jamfile.v2
The gcc toolset is responsible of building assembly files.
This patch removes what seems to be old remnants.
2018-11-09 13:43:12 +01:00
Oliver Kowalke
d047170a15
Merge pull request #87 from boostorg/pr/clang-win-masm
The clang-win toolset (clang-cl.exe) uses masm from the underlying msvc
2018-10-28 10:26:40 +01:00
Oliver Kowalke
f43ac1ad19 Merge branch 'develop' 2018-10-28 10:22:16 +01:00
Peter Dimov
554ed190ae The clang-win toolset (clang-cl.exe) uses masm from the underlying msvc 2018-10-27 15:56:32 +03:00