Commit Graph

7 Commits (4c2cfc54aca992ee095a542d30afcfa2fe3849f1)

Author SHA1 Message Date
Daniel Kolesa efa6464e41 ppc, ppc64: do not use ALIAS for libucontext_swapcontext 2021-01-08 15:17:11 +01:00
Ariadne Conill 39a2958561 add previous ABI symbols 2021-01-08 02:30:50 -07:00
Daniel Kolesa cf05112306 ppc, ppc64: use common ALIAS/FUNC/END macros 2021-01-08 04:52:46 +01:00
Daniel Kolesa 6026980cac ppc, ppc64: tag global symbols as functions
it is necessary to tag these symbols as functions otherwise the
linker gets confused; this previously manifested as the internal
functions (pre-rename) like __getcontext leaking into the symbol
table of things linked against libucontext that used the ucontext
POSIX API through the weak aliases

it also had another bad effect and that is if you tried to use
libucontext's API (post-rename), the linker would warn you during
compile time that the type is unknown, and the resulting program
would crash at runtime

after properly tagging everything, I no longer notice any leakage,
i.e. there don't seem to be any references to the aliased symbols
in the resulting symbol table when using the aliases, and using
the libucontext prefixed symbols directly also works
2021-01-08 04:27:27 +01:00
Ariadne Conill c10cde83da ppc: fix build with libucontext_ namespacing changes 2020-12-06 14:04:22 +00:00
Ariadne Conill e65e485630 everywhere: rename __swapcontext to libucontext_swapcontext 2020-12-06 03:04:22 -06:00
Bobby Bingham 2610c7faa7 ppc32/64: rewrite get/set/swapcontext in assembly
getcontext cannot be correctly implemented in C.

If this calls another function, as it does to call syscall, it needs to
first spill its return address to the stack.  If, after getcontext returns,
its caller then calls other functions, this saved return address can be
clobbered.  When the context saved by getcontext is later restored, the
(now clobbered) return address will be reloaded from the stack, and the
second return from getcontext will return to the wrong location.

Because the powerpc swapcontext syscall allows either the old context or
new context pointers to be null, it is usable for implementing all of
get/set/swapcontext.

We therefore rewrite swapcontext in assembly, and get/setcontext as simple
assembly function wrappers around swapcontext.

The one piece we keep in C is the code to check the return value of the
system call and to set errno.  This code was actually unnecessary before --
libc does this within syscall.  However, now that the system call is made
directly in assembly, bypassing libc, it is truly necessary.  Because errno
is thread-local and the details of how to set it can vary by libc, this
code remains written in C.
2019-04-05 14:44:54 -05:00