diff --git a/arch/common/common-trampoline.c b/arch/common/common-trampoline.c new file mode 100644 index 0000000..f182f99 --- /dev/null +++ b/arch/common/common-trampoline.c @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2020 Ariadne Conill + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * This software is provided 'as is' and without any warranty, express or + * implied. In no event shall the authors be liable for any damages arising + * from the use of this software. + */ + +#include +#include +#include + +void +libucontext_trampoline(void) +{ + libucontext_ucontext_t *uc_link; + + FETCH_LINKPTR(uc_link); + + if (uc_link == NULL) + exit(0); + + libucontext_setcontext(uc_link); +} diff --git a/arch/x86_64/defs.h b/arch/x86_64/defs.h index 9bcc6fd..4a53f96 100644 --- a/arch/x86_64/defs.h +++ b/arch/x86_64/defs.h @@ -31,6 +31,9 @@ #define REG_SZ (8) +#define FETCH_LINKPTR(dest) \ + asm("movq (%%rbx), %0" : "=rm" ((dest))); + #include "common-defs.h" #endif diff --git a/arch/x86_64/startcontext.S b/arch/x86_64/startcontext.S deleted file mode 100644 index bcc3ece..0000000 --- a/arch/x86_64/startcontext.S +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright (c) 2018, 2020 Ariadne Conill - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * This software is provided 'as is' and without any warranty, express or - * implied. In no event shall the authors be liable for any damages arising - * from the use of this software. - */ - -#include "defs.h" - -FUNC(libucontext_trampoline) - /* get the proper context into position and test for NULL */ - movq %rbx, %rsp - movq (%rsp), %rdi - testq %rdi, %rdi - - /* if we have no linked context, lets get out of here */ - je no_linked_context - - /* call setcontext to switch to the linked context */ - call libucontext_setcontext@plt - movq %rax, %rdi - -no_linked_context: - /* we are returning into a null context, it seems, so maybe we should exit */ - call exit@plt - - /* something is really hosed, call hlt to force termination */ - hlt -END(libucontext_trampoline) diff --git a/arch/x86_64/trampoline.c b/arch/x86_64/trampoline.c new file mode 100644 index 0000000..83eb453 --- /dev/null +++ b/arch/x86_64/trampoline.c @@ -0,0 +1,2 @@ +#include "defs.h" +#include "common-trampoline.c"