These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / tools / testing / selftests / x86 / thunks_32.S
1 /*
2  * thunks_32.S - assembly helpers for mixed-bitness code
3  * Copyright (c) 2015 Denys Vlasenko
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms and conditions of the GNU General Public License,
7  * version 2, as published by the Free Software Foundation.
8  *
9  * This program is distributed in the hope it will be useful, but
10  * WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * General Public License for more details.
13  *
14  * These are little helpers that make it easier to switch bitness on
15  * the fly.
16  */
17
18         .text
19         .code32
20
21         .global call64_from_32
22         .type call32_from_64, @function
23
24         // 4(%esp): function to call
25 call64_from_32:
26         // Fetch function address
27         mov     4(%esp), %eax
28
29         // Save registers which are callee-clobbered by 64-bit ABI
30         push    %ecx
31         push    %edx
32         push    %esi
33         push    %edi
34
35         // Switch to long mode
36         jmp     $0x33,$1f
37 1:      .code64
38
39         // Call the function
40         call    *%rax
41
42         // Switch to compatibility mode
43         push    $0x23  /* USER32_CS */
44         .code32; push $1f; .code64 /* hack: can't have X86_64_32S relocation in 32-bit ELF */
45         lretq
46 1:      .code32
47
48         pop     %edi
49         pop     %esi
50         pop     %edx
51         pop     %ecx
52
53         ret
54
55 .size call64_from_32, .-call64_from_32