1/* SPDX-License-Identifier: GPL-2.0-only */ 2/* 3 * thunks_32.S - assembly helpers for mixed-bitness code 4 * Copyright (c) 2015 Denys Vlasenko 5 * 6 * These are little helpers that make it easier to switch bitness on 7 * the fly. 8 */ 9 10 .text 11 .code32 12 13 .global call64_from_32 14 .type call32_from_64, @function 15 16 // 4(%esp): function to call 17call64_from_32: 18 // Fetch function address 19 mov 4(%esp), %eax 20 21 // Save registers which are callee-clobbered by 64-bit ABI 22 push %ecx 23 push %edx 24 push %esi 25 push %edi 26 27 // Switch to long mode 28 jmp $0x33,$1f 291: .code64 30 31 // Call the function 32 call *%rax 33 34 // Switch to compatibility mode 35 push $0x23 /* USER32_CS */ 36 .code32; push $1f; .code64 /* hack: can't have X86_64_32S relocation in 32-bit ELF */ 37 lretq 381: .code32 39 40 pop %edi 41 pop %esi 42 pop %edx 43 pop %ecx 44 45 ret 46 47.size call64_from_32, .-call64_from_32 48 49.section .note.GNU-stack,"",%progbits 50