since
https://sourceware.org/ml/libc-alpha/2014-04/msg00006.html
setcontext etc is no longer tied to the kernel use of ucontext.
in that patch the ucontext reserved space is not used consistently
with the kernel abi: the d8,d9 pair is saved in the slot of q8.
this is ok (*context functions work together), but probably not
desirable (ucontexts created by the kernel and getcontext are
subtly different).
the fix just replaces dN with qN in the save/restore code, which
does a bit more than needed (saves/restores the top half of qN that
is not callee saved), but this should not be an issue (and avoids
having to deal with endianness).
(kernel fpsimd context layout: the first 64bit contains 0x210 the fpsimd
context size and 0x46508001 the FPSIMD_MAGIC, the second 64bit is for
fpsr and fpcr, and the rest is the 128bit q0..q31 registers).
given d8=8.1, d9=9.1,... d15=15.1, the context created by getcontext is
current:
(gdb) x/40xg ctx.uc_mcontext.__reserved
0x410df0 <ctx+464>: 0x0000021046508001 0x0000000000000000
0x410e00 <ctx+480>: 0x0000000000000000 0x0000000000000000
0x410e10 <ctx+496>: 0x0000000000000000 0x0000000000000000
0x410e20 <ctx+512>: 0x0000000000000000 0x0000000000000000
0x410e30 <ctx+528>: 0x0000000000000000 0x0000000000000000
0x410e40 <ctx+544>: 0x0000000000000000 0x0000000000000000
0x410e50 <ctx+560>: 0x0000000000000000 0x0000000000000000
0x410e60 <ctx+576>: 0x0000000000000000 0x0000000000000000
0x410e70 <ctx+592>: 0x0000000000000000 0x0000000000000000
0x410e80 <ctx+608>: 0x4020333333333333 0x4022333333333333
0x410e90 <ctx+624>: 0x0000000000000000 0x0000000000000000
0x410ea0 <ctx+640>: 0x4024333333333333 0x4026333333333333
0x410eb0 <ctx+656>: 0x0000000000000000 0x0000000000000000
0x410ec0 <ctx+672>: 0x4028333333333333 0x402a333333333333
0x410ed0 <ctx+688>: 0x0000000000000000 0x0000000000000000
0x410ee0 <ctx+704>: 0x402c333333333333 0x402e333333333333
0x410ef0 <ctx+720>: 0x0000000000000000 0x0000000000000000
0x410f00 <ctx+736>: 0x0000000000000000 0x0000000000000000
0x410f10 <ctx+752>: 0x0000000000000000 0x0000000000000000
0x410f20 <ctx+768>: 0x0000000000000000 0x0000000000000000
fixed:
(gdb) x/40xg ctx.uc_mcontext.__reserved
0x410d70 <ctx+464>: 0x0000021046508001 0x0000000000000000
0x410d80 <ctx+480>: 0x0000000000000000 0x0000000000000000
0x410d90 <ctx+496>: 0x0000000000000000 0x0000000000000000
0x410da0 <ctx+512>: 0x0000000000000000 0x0000000000000000
0x410db0 <ctx+528>: 0x0000000000000000 0x0000000000000000
0x410dc0 <ctx+544>: 0x0000000000000000 0x0000000000000000
0x410dd0 <ctx+560>: 0x0000000000000000 0x0000000000000000
0x410de0 <ctx+576>: 0x0000000000000000 0x0000000000000000
0x410df0 <ctx+592>: 0x0000000000000000 0x0000000000000000
0x410e00 <ctx+608>: 0x4020333333333333 0x0000000000000000
0x410e10 <ctx+624>: 0x4022333333333333 0x0000000000000000
0x410e20 <ctx+640>: 0x4024333333333333 0x0000000000000000
0x410e30 <ctx+656>: 0x4026333333333333 0x0000000000000000
0x410e40 <ctx+672>: 0x4028333333333333 0x0000000000000000
0x410e50 <ctx+688>: 0x402a333333333333 0x0000000000000000
0x410e60 <ctx+704>: 0x402c333333333333 0x0000000000000000
0x410e70 <ctx+720>: 0x402e333333333333 0x0000000000000000
0x410e80 <ctx+736>: 0x0000000000000000 0x0000000000000000
0x410e90 <ctx+752>: 0x0000000000000000 0x0000000000000000
0x410ea0 <ctx+768>: 0x0000000000000000 0x0000000000000000
2015-07-06 Szabolcs Nagy <szabolcs.nagy@arm.com>
* sysdeps/unix/sysv/linux/aarch64/getcontext.S (__getcontext): Use q
registers instead of d ones so the layout is kernel abi compatible.
* sysdeps/unix/sysv/linux/aarch64/setcontext.S (__setcontext): Likewise.
* sysdeps/unix/sysv/linux/aarch64/swapcontext.S (__swapcontext):
Likewise.# Please enter the commit message for your changes. Lines starting
There appears to be a discrepancy among the implementations
of setcontext with regards to the function called once the last
linked-to context has finished executing via setcontext.
The POSIX standard says:
~~~
If the uc_link member of the ucontext_t structure pointed to by
the ucp argument is equal to 0, then this context is the main
context, and the thread will exit when this context returns.
~~~
It says "exit" not "exit immediately" nor "exit without running
functions registered with atexit or on_exit."
Therefore the AArch64, ARM, hppa and NIOS II implementations are
wrong and no test detects it.
It is questionable if this should even be fixed or just documented
that the above 4 targets are wrong. The functions are deprecated
and nobody should be using them, but at the same time it silly to
have cross-target differences that make it hard to port old
applications from say x86_64 to AArch64.
Therefore I will ix the 4 arches, and checkin a regression
test to prevent it from changing again.
https://sourceware.org/ml/libc-alpha/2015-03/msg00720.html
The current implementation of setcontext uses rt_sigreturn to restore
the contents of registers. This contrasts with the way most other
architectures implement setcontext:
powerpc64, mips, tile:
Call rt_sigreturn if context was created by a call to a signal handler,
otherwise restore in user code.
powerpc32:
Call swapcontext system call and don't call sigreturn or rt_sigreturn.
x86_64, sparc, hppa, sh, ia64, m68k, s390, arm:
Only support restoring "synchronous" contexts, that is contexts
created by getcontext, and restoring in user code and don't call
sigreturn or rt_sigreturn.
alpha:
Call sigreturn (but not rt_sigreturn) in all cases to do the restore.
The text of the setcontext manpage suggests that the requirement to be
able to restore a signal handler created context has been dropped from
SUSv2:
If the context was obtained by a call to a signal handler, then old
standard text says that "program execution continues with the program
instruction following the instruction interrupted by the signal".
However, this sentence was removed in SUSv2, and the present verdict
is "the result is unspecified".
Implementing setcontext by calling rt_sigreturn unconditionally causes
problems when used with sigaltstack as in BZ #16629. On this basis it
seems that aarch64 is broken and that new ports should only support
restoring contexts created with getcontext and do not need to call
rt_sigreturn at all.
This patch re-implements the aarch64 setcontext function to restore
the context in user code in a similar manner to x86_64 and other ports.
ChangeLog:
2014-04-17 Will Newton <will.newton@linaro.org>
[BZ #16629]
* sysdeps/unix/sysv/linux/aarch64/setcontext.S (__setcontext):
Re-implement to restore registers in user code and avoid
rt_sigreturn system call.
This patch moves the AArch64 port to the main sysdeps hierarchy. The
move is essentially:
git mv ports/sysdeps/aarch64 sysdeps/aarch64
git mv ports/sysdeps/unix/sysv/linux/aarch64 sysdeps/unix/sysv/linux/aarch64
The README is updated and I've updated ChangeLog.aarch64 along the
lines of the ARM move. The AArch64 build has been tested to confirm
that there were no changes in objdump -dr output or the shared
objects.