diff options
author | Rich Felker <dalias@aerifal.cx> | 2012-05-23 15:45:41 -0400 |
---|---|---|
committer | Rich Felker <dalias@aerifal.cx> | 2012-05-23 15:45:41 -0400 |
commit | 4da268f74b90696563db4f5d9d2b8e1c1351bdc6 (patch) | |
tree | 6248d447902f2a011c70e2b207e600718bed77a4 /src/thread/x86_64 | |
parent | cfd892fde9454e014d9b291a56ce5740d8bc4a78 (diff) | |
download | musl-4da268f74b90696563db4f5d9d2b8e1c1351bdc6.tar.gz musl-4da268f74b90696563db4f5d9d2b8e1c1351bdc6.tar.xz musl-4da268f74b90696563db4f5d9d2b8e1c1351bdc6.zip |
fix issue with longjmp out of signal handlers and cancellation
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.
Diffstat (limited to 'src/thread/x86_64')
-rw-r--r-- | src/thread/x86_64/syscall_cp.s | 18 |
1 files changed, 8 insertions, 10 deletions
diff --git a/src/thread/x86_64/syscall_cp.s b/src/thread/x86_64/syscall_cp.s index b0363547..788c53cc 100644 --- a/src/thread/x86_64/syscall_cp.s +++ b/src/thread/x86_64/syscall_cp.s @@ -2,12 +2,12 @@ .global __syscall_cp_asm .type __syscall_cp_asm,@function __syscall_cp_asm: - lea 1f(%rip),%rax - mov %rax,8(%rdi) - mov %rsp,(%rdi) - mov 16(%rdi),%eax + +.global __cp_begin +__cp_begin: + mov (%rdi),%eax test %eax,%eax - jnz 2f + jnz __cancel mov %rdi,%r11 mov %rsi,%rax mov %rdx,%rdi @@ -17,9 +17,7 @@ __syscall_cp_asm: mov 8(%rsp),%r8 mov 16(%rsp),%r9 mov %r11,8(%rsp) -1: syscall - xor %ecx,%ecx - mov 8(%rsp),%rdi - mov %rcx,(%rdi) + syscall +.global __cp_end +__cp_end: ret -2: call __cancel |