On function entry, stack alignment is 4 mod 16, and there are function calls without realigning the stack. 00000000 <__GI___nanosleep>: 0: 65 83 3d 0c 00 00 00 cmpl $0x0,%gs:0xc 7: 00 8: 75 20 jne 2a <__nanosleep_nocancel+0x20> 0000000a <__nanosleep_nocancel>: a: 89 da mov %ebx,%edx c: 8b 4c 24 08 mov 0x8(%esp),%ecx 10: 8b 5c 24 04 mov 0x4(%esp),%ebx 14: b8 a2 00 00 00 mov $0xa2,%eax 19: 65 ff 15 10 00 00 00 call *%gs:0x10 20: 89 d3 mov %edx,%ebx 22: 3d 01 f0 ff ff cmp $0xfffff001,%eax 27: 73 30 jae 59 <__nanosleep_nocancel+0x4f> 29: c3 ret 2a: e8 fc ff ff ff call 2b <__nanosleep_nocancel+0x21> 2b: R_386_PC32 __libc_enable_asynccancel This is dormant on master, since there are no longer any cancelable syscalls that are implemented using the stubs.
(In reply to Andreas Schwab from comment #0) > > This is dormant on master, since there are no longer any cancelable syscalls > that are implemented using the stubs. What do you mean by dormant on master? Under what conditions, will it come back?
Whenever a cancelable syscall is implemented using this stub.
(In reply to Andreas Schwab from comment #2) > Whenever a cancelable syscall is implemented using this stub. Where is this stub defined on master branch?
Do you have a testcase? I tried diff --git a/nptl/cancellation.c b/nptl/cancellation.c index 2bd31686fd..ca0b14abc3 100644 --- a/nptl/cancellation.c +++ b/nptl/cancellation.c @@ -22,6 +22,14 @@ #include <futex-internal.h> +static void +check (void) +{ + char *sp = CURRENT_STACK_FRAME; + if ((((uintptr_t) sp) + sizeof (char *)) & (sizeof (char *) - 1)) + asm ("hlt"); +} + /* The next two functions are similar to pthread_setcanceltype() but more specialized for the use in the cancelable functions like write(). They do not need to check parameters etc. */ @@ -29,6 +37,7 @@ int attribute_hidden __pthread_enable_asynccancel (void) { + check (); struct pthread *self = THREAD_SELF; int oldval = THREAD_GETMEM (self, cancelhandling); on release/2.22/master branch. "hlt" was never triggered.
Sorry, I missed that the arch-dependent <sysdep-cancel.h> no longer exists on master.
(In reply to Andreas Schwab from comment #5) > Sorry, I missed that the arch-dependent <sysdep-cancel.h> no longer exists > on master. Cancellable entrypoints are implemented solely with C from now on. Is this really an issue?
Yes, this issue has ceased to exist in 2.27.
This problem only exists prior to 2.27, which is no longer maintained.