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

source code of linux/tools/testing/selftests/x86/thunks_32.S