Apple silicon M1 uses arm64 architecture, this commit will add arm and
arm64 architecture into combined asm code in order to support newer
apple's machine in combined asm codes.
We set the LSB of the magic symbol @feat.00 to 1.
This is used to communicate from the compiler to the linker, and specifically to express that the object file has opted into "safeseh"; any SEH handlers used in this file must be listed in the .sxdata section.
Since we don't have any SEH handlers in these files, this is trivially satisfied.
Reference: the PE-COFF specification, https://docs.microsoft.com/en-us/windows/win32/debug/pe-format#the-sxdata-section
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.
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.
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.
- 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
- Don't bother allocating any extra stack space. We can reuse the 16
bytes at the top of the stack originally used for the gp and transfer_t.
- Don't bother saving the return address which we never read back.
- Use la to load the address of _exit (purely style).
- Move the "move $a0, $zero" instruction so the assembly can put it in
the delay slot.
- Use "jr" instead of "jalr" because we don't expect _exit to ever
return.
The MIPS ABI requires that 16 bytes of unused stack space is allocated by
the caller when calling functions. Some comments refer to "shadow space"
which might be talking about this, but since the captured_context code
was added, the assembly has not actually allocated any extra space.
Therefore, allocate an extra 16 bytes between the fcontext_t data and
the saved GP which the initial function will use.
Also fix the address of the returned transfer_t which was incorrect
(although fairly harmless since this data is never read).
For functions which return structures indirectly, the MIPS abi requires
the pointer to the returned structure to be in v0 (so in most cases v0
will contain the value passed to the function in a0).