libucontext: expand README
parent
c10cde83da
commit
22bd490272
41
README.md
41
README.md
|
@ -10,10 +10,11 @@ Since version 0.13, for some architectures, you can deploy to bare metal using n
|
||||||
`FREESTANDING=yes` make option. Systems which use a syscall cannot work this way. The table
|
`FREESTANDING=yes` make option. Systems which use a syscall cannot work this way. The table
|
||||||
below shows which architecture ports have been adapted to build with `FREESTANDING=yes`.
|
below shows which architecture ports have been adapted to build with `FREESTANDING=yes`.
|
||||||
|
|
||||||
|
Adding support for new architectures is easy, but you need to know assembly language for the
|
||||||
|
target to do it.
|
||||||
|
|
||||||
## supported architectures
|
|
||||||
|
|
||||||
Adding support for new architectures is easy, but you need to know assembly language to do it.
|
## supported features
|
||||||
|
|
||||||
| Architecture | Works on musl | Syscall | Supports FREESTANDING |
|
| Architecture | Works on musl | Syscall | Supports FREESTANDING |
|
||||||
|--------------|---------------|---------|-----------------------|
|
|--------------|---------------|---------|-----------------------|
|
||||||
|
@ -40,3 +41,39 @@ $ make ARCH=x86_64
|
||||||
$ make ARCH=x86_64 check
|
$ make ARCH=x86_64 check
|
||||||
$ make ARCH=x86_64 DESTDIR=out install
|
$ make ARCH=x86_64 DESTDIR=out install
|
||||||
```
|
```
|
||||||
|
|
||||||
|
There are a few options:
|
||||||
|
|
||||||
|
* `ARCH`: The architecture libucontext is being built for. Must be set to one of the architectures
|
||||||
|
listed in the feature support table. If unset, the build system will attempt to guess based on what
|
||||||
|
architecture the host is running. Setting this option explicitly is highly recommended.
|
||||||
|
|
||||||
|
* `FREESTANDING`: If this is set to `yes`, the system ucontext.h headers will not be used. Instead,
|
||||||
|
the headers in `arch/${ARCH}/freestanding` will be used for definitions where appropriate.
|
||||||
|
Default is `no`.
|
||||||
|
|
||||||
|
* `EXPORT_UNPREFIXED`: If this is set to `yes`, the POSIX 2004 names `getcontext`, `setcontext`,
|
||||||
|
`swapcontext` and `makecontext` will be provided as weak symbols aliased against their `libucontext_`
|
||||||
|
namespaced equivalents. This is necessary for libucontext to provide these functions on musl
|
||||||
|
systems, but you may wish to disable this when using `FREESTANDING` mode to avoid conflicts with
|
||||||
|
the target's libc. Default is `yes`.
|
||||||
|
|
||||||
|
|
||||||
|
## caveats
|
||||||
|
|
||||||
|
`libucontext`, while largely functionally equivalent does have some differences over traditional POSIX
|
||||||
|
ucontext functions:
|
||||||
|
|
||||||
|
* Saving and restoring the signal mask is not implemented. This is largely a non-issue because most
|
||||||
|
uses of these functions did not modify the signal mask anyway, but saving/restoring the signal mask
|
||||||
|
(even though it is unmodified in basically all cases in practice) induces a significant performance
|
||||||
|
penalty due to having to make kernel syscalls.
|
||||||
|
|
||||||
|
* Only basic GPR registers are saved and restored when context swapping. The glibc implementation uses
|
||||||
|
hardware capability detection to save/restore other register groups, such as the FPU registers or
|
||||||
|
vector processing (AltiVec/AVX/NEON) registers. Adding this capability detection would significantly
|
||||||
|
increase the complexity of the project and thus is not implemented. Support for compiling in code to
|
||||||
|
save/restore FPU registers or vector registers may be added in a later release as a build-time
|
||||||
|
setting -- for now, we assume a soft-float ABI with no optional processor features. In practice, this
|
||||||
|
does not really matter, code using these functions are unlikely to be impacted by this design
|
||||||
|
assumption.
|
||||||
|
|
Loading…
Reference in New Issue