]>
Commit | Line | Data |
---|---|---|
2025cf9e | 1 | /* SPDX-License-Identifier: GPL-2.0-only */ |
c25be94f DV |
2 | /* |
3 | * thunks_32.S - assembly helpers for mixed-bitness code | |
4 | * Copyright (c) 2015 Denys Vlasenko | |
5 | * | |
c25be94f DV |
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 | |
17 | call64_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 | |
29 | 1: .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 | |
38 | 1: .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 |