about summary refs log tree commit diff
path: root/src/thread/x86_64/syscall_cp.s
Commit message (Collapse)AuthorAgeFilesLines
* use explicit __cp_cancel label in cancellable syscall asm for all archsRich Felker2015-11-021-1/+3
| | | | | | | | | | | | | previously, only archs that needed to do stack cleanup defined a __cp_cancel label for acting on cancellation in their syscall asm, and a default definition was provided by a weak alias to __cancel, the C function. this resulted in wrong codegen for arm on gcc versions affected by pr 68178 and possibly similar issues (like pr 66609) on other archs, and also created an inconsistency where the __cp_begin and __cp_end labels were treated as const data but __cp_cancel was treated as a function. this in turn caused incorrect code generation on archs where function pointers point to function descriptors rather than code (for now, only sh/fdpic).
* consistently use hidden visibility for cancellable syscall internalsRich Felker2015-04-141-2/+8
| | | | | | | | | | in a few places, non-hidden symbols were referenced from asm in ways that assumed ld-time binding. while these is no semantic reason these symbols need to be hidden, fixing the references without making them hidden was going to be ugly, and hidden reduces some bloat anyway. in the asm files, .global/.hidden directives have been moved to the top to unclutter the actual code.
* fix issue with longjmp out of signal handlers and cancellationRich Felker2012-05-231-10/+8
| | | | | | | | | | | | | | | | | | | stale state information indicating that a thread was possibly blocked at a cancellation point could get left behind if longjmp was used to exit a signal handler that interrupted a cancellation point. to fix the issue, we throw away the state information entirely and simply compare the saved instruction pointer to a range of code addresses in the __syscall_cp_asm function. all the ugly PIC work (which becomes minimal anyway with this approach) is defered to cancellation time instead of happening at every syscall, which should improve performance too. this commit also fixes cancellation on arm, which was mildly broken (race condition, not checking cancellation flag once inside the cancellation point zone). apparently i forgot to implement that. the new arm code is untested, but appears correct; i'll test and fix it later if there are problems.
* restore use of .type in asm, but use modern @function (vs %function)Rich Felker2011-06-141-0/+1
| | | | | | | | this seems to be necessary to make the linker accept the functions in a shared library (perhaps to generate PLT entries?) strictly speaking libc-internal asm should not need it. i might clean that up later.
* remove all .size and .type directives for functions from the asmRich Felker2011-06-131-1/+0
| | | | | these are useless and have caused problems for users trying to build with non-gnu tools like tcc's assembler.
* fix typo in x86_64 cancellable syscall asmRich Felker2011-04-171-1/+1
|
* fix bugs in cancellable syscall asmRich Felker2011-04-171-5/+6
| | | | | | | | | | | | | | | | x86_64 was just plain wrong in the cancel-flag-already-set path, and crashing. the more subtle error was not clearing the saved stack pointer before returning to c code. this could result in the signal handler misidentifying c code as the pre-syscall part of the asm, and acting on cancellation at the wrong time, and thus resource leak race conditions. also, now __cancel (in the c code) is responsible for clearing the saved sp in the already-cancelled branch. this means we have to use call rather than jmp to ensure the stack pointer in the c will never match what the asm saved.
* fix some minor issues in cancellation handling patchRich Felker2011-04-171-1/+1
| | | | | signals were wrongly left masked, and cancellability state was not switched to disabled, during the execution of cleanup handlers.
* overhaul pthread cancellationRich Felker2011-04-171-0/+24
this patch improves the correctness, simplicity, and size of cancellation-related code. modulo any small errors, it should now be completely conformant, safe, and resource-leak free. the notion of entering and exiting cancellation-point context has been completely eliminated and replaced with alternative syscall assembly code for cancellable syscalls. the assembly is responsible for setting up execution context information (stack pointer and address of the syscall instruction) which the cancellation signal handler can use to determine whether the interrupted code was in a cancellable state. these changes eliminate race conditions in the previous generation of cancellation handling code (whereby a cancellation request received just prior to the syscall would not be processed, leaving the syscall to block, potentially indefinitely), and remedy an issue where non-cancellable syscalls made from signal handlers became cancellable if the signal handler interrupted a cancellation point. x86_64 asm is untested and may need a second try to get it right.