diff options
author | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2020-06-06 20:21:22 +0200 |
---|---|---|
committer | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2020-06-06 20:24:30 +0200 |
commit | 02937d825a71636c13b3f4229e5d6c9e54e327d5 (patch) | |
tree | 822a53b962bde8520f69daf62d8a0d62967a16a1 /sysdeps/mach/hurd/i386/__longjmp.S | |
parent | 8fcc772da8381476e914979fc887fdc54e62b15f (diff) | |
download | glibc-02937d825a71636c13b3f4229e5d6c9e54e327d5.tar.gz glibc-02937d825a71636c13b3f4229e5d6c9e54e327d5.tar.xz glibc-02937d825a71636c13b3f4229e5d6c9e54e327d5.zip |
hurd: fix clearing SS_ONSTACK when longjmp-ing from sighandler
* sysdeps/i386/htl/Makefile: New file. * sysdeps/i386/htl/tcb-offsets.sym: New file. * sysdeps/mach/hurd/i386/Makefile [setjmp] (gen-as-const-headers): Add signal-defines.sym. * sysdeps/mach/hurd/i386/____longjmp_chk.S: Include tcb-offsets.h. (____longjmp_chk): Harmonize with i386's __longjmp. Clear SS_ONSTACK when jumping off the alternate stack. * sysdeps/mach/hurd/i386/__longjmp.S: New file.
Diffstat (limited to 'sysdeps/mach/hurd/i386/__longjmp.S')
-rw-r--r-- | sysdeps/mach/hurd/i386/__longjmp.S | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/sysdeps/mach/hurd/i386/__longjmp.S b/sysdeps/mach/hurd/i386/__longjmp.S new file mode 100644 index 0000000000..d123c214c9 --- /dev/null +++ b/sysdeps/mach/hurd/i386/__longjmp.S @@ -0,0 +1,84 @@ +/* Copyright (C) 2001-2020 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <https://www.gnu.org/licenses/>. */ + +#include <sysdep.h> +#include <jmpbuf-offsets.h> +#include <tcb-offsets.h> +#include <asm-syntax.h> + +#include <signal-defines.h> +/* #include <signal.h> */ +#define SS_ONSTACK 1 + + .text +ENTRY (__longjmp) + movl 4(%esp), %eax /* User's jmp_buf in %eax. */ + + /* Save the return address now. */ + movl (JB_PC*4)(%eax), %edx + /* Get the stack pointer. */ + movl (JB_SP*4)(%eax), %ecx + cfi_undefined(%ecx) +#ifdef PTR_DEMANGLE + PTR_DEMANGLE (%edx) + PTR_DEMANGLE (%ecx) +#endif + + movl %gs:SIGSTATE_OFFSET,%edi + + testl $SS_ONSTACK, (HURD_SIGSTATE__SIGALTSTACK__OFFSET + SIGALTSTACK__SS_FLAGS__OFFSET)(%edi) + jz .Lok + + /* We were on the alternate stack. */ + + cmpl (HURD_SIGSTATE__SIGALTSTACK__OFFSET + SIGALTSTACK__SS_SP__OFFSET)(%edi), %ecx + jb .Loks /* We jump below the alternate stack, switch. */ + + movl (HURD_SIGSTATE__SIGALTSTACK__OFFSET + SIGALTSTACK__SS_SP__OFFSET)(%edi), %ebx + addl (HURD_SIGSTATE__SIGALTSTACK__OFFSET + SIGALTSTACK__SS_SIZE__OFFSET)(%edi), %ebx + cmpl %ebx, %ecx + jb .Lok /* We jump inside the alternate stack, do not switch. */ + + /* We jump above the alternate stack, switch. */ + +.Loks: /* We jump out of the alternate stack, clear SS_ONSTACK flag. */ + andl $~(SS_ONSTACK), (HURD_SIGSTATE__SIGALTSTACK__OFFSET + SIGALTSTACK__SS_FLAGS__OFFSET)(%edi) + +.Lok: /* We add unwind information for the target here. */ + cfi_def_cfa(%eax, 0) + cfi_register(%eip, %edx) + cfi_register(%esp, %ecx) + cfi_offset(%ebx, JB_BX*4) + cfi_offset(%esi, JB_SI*4) + cfi_offset(%edi, JB_DI*4) + cfi_offset(%ebp, JB_BP*4) + /* Restore registers. */ + movl (JB_BX*4)(%eax), %ebx + movl (JB_SI*4)(%eax), %esi + movl (JB_DI*4)(%eax), %edi + movl (JB_BP*4)(%eax), %ebp + cfi_restore(%ebx) + cfi_restore(%esi) + cfi_restore(%edi) + cfi_restore(%ebp) + + movl 8(%esp), %eax /* Second argument is return value. */ + movl %ecx, %esp + + /* Jump to saved PC. */ + jmp *%edx +END (__longjmp) |