1*71db0c75SAndroid Build Coastguard Worker //===-- Implementation of setjmp ------------------------------------------===// 2*71db0c75SAndroid Build Coastguard Worker // 3*71db0c75SAndroid Build Coastguard Worker // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*71db0c75SAndroid Build Coastguard Worker // See https://llvm.org/LICENSE.txt for license information. 5*71db0c75SAndroid Build Coastguard Worker // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*71db0c75SAndroid Build Coastguard Worker // 7*71db0c75SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===// 8*71db0c75SAndroid Build Coastguard Worker 9*71db0c75SAndroid Build Coastguard Worker #include "include/llvm-libc-macros/offsetof-macro.h" 10*71db0c75SAndroid Build Coastguard Worker #include "src/__support/common.h" 11*71db0c75SAndroid Build Coastguard Worker #include "src/__support/macros/config.h" 12*71db0c75SAndroid Build Coastguard Worker #include "src/setjmp/setjmp_impl.h" 13*71db0c75SAndroid Build Coastguard Worker 14*71db0c75SAndroid Build Coastguard Worker #if !defined(LIBC_TARGET_ARCH_IS_X86) 15*71db0c75SAndroid Build Coastguard Worker #error "Invalid file include" 16*71db0c75SAndroid Build Coastguard Worker #endif 17*71db0c75SAndroid Build Coastguard Worker 18*71db0c75SAndroid Build Coastguard Worker namespace LIBC_NAMESPACE_DECL { 19*71db0c75SAndroid Build Coastguard Worker 20*71db0c75SAndroid Build Coastguard Worker #ifdef __i386__ 21*71db0c75SAndroid Build Coastguard Worker [[gnu::naked]] 22*71db0c75SAndroid Build Coastguard Worker LLVM_LIBC_FUNCTION(int, setjmp, (jmp_buf buf)) { 23*71db0c75SAndroid Build Coastguard Worker asm(R"( 24*71db0c75SAndroid Build Coastguard Worker mov 4(%%esp), %%eax 25*71db0c75SAndroid Build Coastguard Worker 26*71db0c75SAndroid Build Coastguard Worker mov %%ebx, %c[ebx](%%eax) 27*71db0c75SAndroid Build Coastguard Worker mov %%esi, %c[esi](%%eax) 28*71db0c75SAndroid Build Coastguard Worker mov %%edi, %c[edi](%%eax) 29*71db0c75SAndroid Build Coastguard Worker mov %%ebp, %c[ebp](%%eax) 30*71db0c75SAndroid Build Coastguard Worker 31*71db0c75SAndroid Build Coastguard Worker lea 4(%%esp), %%ecx 32*71db0c75SAndroid Build Coastguard Worker mov %%ecx, %c[esp](%%eax) 33*71db0c75SAndroid Build Coastguard Worker 34*71db0c75SAndroid Build Coastguard Worker mov (%%esp), %%ecx 35*71db0c75SAndroid Build Coastguard Worker mov %%ecx, %c[eip](%%eax) 36*71db0c75SAndroid Build Coastguard Worker 37*71db0c75SAndroid Build Coastguard Worker xorl %%eax, %%eax 38*71db0c75SAndroid Build Coastguard Worker retl)" ::[ebx] "i"(offsetof(__jmp_buf, ebx)), 39*71db0c75SAndroid Build Coastguard Worker [esi] "i"(offsetof(__jmp_buf, esi)), [edi] "i"(offsetof(__jmp_buf, edi)), 40*71db0c75SAndroid Build Coastguard Worker [ebp] "i"(offsetof(__jmp_buf, ebp)), [esp] "i"(offsetof(__jmp_buf, esp)), 41*71db0c75SAndroid Build Coastguard Worker [eip] "i"(offsetof(__jmp_buf, eip)) 42*71db0c75SAndroid Build Coastguard Worker : "eax", "ecx"); 43*71db0c75SAndroid Build Coastguard Worker } 44*71db0c75SAndroid Build Coastguard Worker #else 45*71db0c75SAndroid Build Coastguard Worker [[gnu::naked]] 46*71db0c75SAndroid Build Coastguard Worker LLVM_LIBC_FUNCTION(int, setjmp, (jmp_buf buf)) { 47*71db0c75SAndroid Build Coastguard Worker asm(R"( 48*71db0c75SAndroid Build Coastguard Worker mov %%rbx, %c[rbx](%%rdi) 49*71db0c75SAndroid Build Coastguard Worker mov %%rbp, %c[rbp](%%rdi) 50*71db0c75SAndroid Build Coastguard Worker mov %%r12, %c[r12](%%rdi) 51*71db0c75SAndroid Build Coastguard Worker mov %%r13, %c[r13](%%rdi) 52*71db0c75SAndroid Build Coastguard Worker mov %%r14, %c[r14](%%rdi) 53*71db0c75SAndroid Build Coastguard Worker mov %%r15, %c[r15](%%rdi) 54*71db0c75SAndroid Build Coastguard Worker 55*71db0c75SAndroid Build Coastguard Worker lea 8(%%rsp), %%rax 56*71db0c75SAndroid Build Coastguard Worker mov %%rax, %c[rsp](%%rdi) 57*71db0c75SAndroid Build Coastguard Worker 58*71db0c75SAndroid Build Coastguard Worker mov (%%rsp), %%rax 59*71db0c75SAndroid Build Coastguard Worker mov %%rax, %c[rip](%%rdi) 60*71db0c75SAndroid Build Coastguard Worker 61*71db0c75SAndroid Build Coastguard Worker xorl %%eax, %%eax 62*71db0c75SAndroid Build Coastguard Worker retq)" ::[rbx] "i"(offsetof(__jmp_buf, rbx)), 63*71db0c75SAndroid Build Coastguard Worker [rbp] "i"(offsetof(__jmp_buf, rbp)), [r12] "i"(offsetof(__jmp_buf, r12)), 64*71db0c75SAndroid Build Coastguard Worker [r13] "i"(offsetof(__jmp_buf, r13)), [r14] "i"(offsetof(__jmp_buf, r14)), 65*71db0c75SAndroid Build Coastguard Worker [r15] "i"(offsetof(__jmp_buf, r15)), [rsp] "i"(offsetof(__jmp_buf, rsp)), 66*71db0c75SAndroid Build Coastguard Worker [rip] "i"(offsetof(__jmp_buf, rip)) 67*71db0c75SAndroid Build Coastguard Worker : "rax"); 68*71db0c75SAndroid Build Coastguard Worker } 69*71db0c75SAndroid Build Coastguard Worker #endif 70*71db0c75SAndroid Build Coastguard Worker 71*71db0c75SAndroid Build Coastguard Worker } // namespace LIBC_NAMESPACE_DECL 72