diff options
author | Flavio Cruz <flaviocruz@gmail.com> | 2024-02-17 15:25:35 -0500 |
---|---|---|
committer | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2024-02-17 21:45:35 +0100 |
commit | 88b771ab5e1169e746dbf4a990d90cffc5fa54ea (patch) | |
tree | 2d9e3e40e136e7e18318b47b3aadb21ffbf15a94 /sysdeps/mach/hurd/x86_64/__start_context.S | |
parent | e3da8f9badf95dff63547c9a7886cdfed284aa3f (diff) | |
download | glibc-88b771ab5e1169e746dbf4a990d90cffc5fa54ea.tar glibc-88b771ab5e1169e746dbf4a990d90cffc5fa54ea.tar.gz glibc-88b771ab5e1169e746dbf4a990d90cffc5fa54ea.tar.bz2 glibc-88b771ab5e1169e746dbf4a990d90cffc5fa54ea.zip |
Implement setcontext/getcontext/makecontext/swapcontext for Hurd x86_64
Tested with the tests provided by glibc plus some other toy examples.
Message-ID: <20240217202535.1860803-1-flaviocruz@gmail.com>
Diffstat (limited to 'sysdeps/mach/hurd/x86_64/__start_context.S')
-rw-r--r-- | sysdeps/mach/hurd/x86_64/__start_context.S | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/sysdeps/mach/hurd/x86_64/__start_context.S b/sysdeps/mach/hurd/x86_64/__start_context.S new file mode 100644 index 0000000000..3cb4c6b5a9 --- /dev/null +++ b/sysdeps/mach/hurd/x86_64/__start_context.S @@ -0,0 +1,49 @@ +/* Copyright (C) 2024 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> + +/* This is the helper code which gets called if a function which is + registered with 'makecontext' returns. In this case we have to + install the context listed in the uc_link element of the context + 'makecontext' manipulated at the time of the 'makecontext' call. + If the pointer is NULL the process must terminate. */ + + +ENTRY(__start_context) + /* This removes the parameters passed to the function given to + 'makecontext' from the stack. RBX contains the address + on the stack pointer for the next context. */ + movq %rbx, %rsp + + /* Don't use pop here so that stack is aligned to 16 bytes. */ + movq (%rsp), %rdi /* This is the next context. */ + testq %rdi, %rdi + je 2f /* If it is zero exit. */ + + call __setcontext + /* If this returns (which can happen if __sigprocmask fails) we'll + exit the program with the return error value (-1). */ + movq %rax,%rdi + +2: + call HIDDEN_JUMPTARGET(exit) + /* The 'exit' call should never return. In case it does cause + the process to terminate. */ +L(hlt): + hlt +END(__start_context) |