Merge branch 'x86/srbds' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
[linux-2.6-microblaze.git] / tools / testing / selftests / x86 / thunks_32.S
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
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