WIP FPC-III support
[linux/fpc-iii.git] / tools / testing / selftests / x86 / thunks.S
bloba2d47d8344d40a02f3ebdbaf7281019b8b197de8
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 /*
3  * thunks.S - assembly helpers for mixed-bitness code
4  * Copyright (c) 2015 Andrew Lutomirski
5  *
6  * These are little helpers that make it easier to switch bitness on
7  * the fly.
8  */
10         .text
12         .global call32_from_64
13         .type call32_from_64, @function
14 call32_from_64:
15         // rdi: stack to use
16         // esi: function to call
18         // Save registers
19         pushq %rbx
20         pushq %rbp
21         pushq %r12
22         pushq %r13
23         pushq %r14
24         pushq %r15
25         pushfq
27         // Switch stacks
28         mov %rsp,(%rdi)
29         mov %rdi,%rsp
31         // Switch to compatibility mode
32         pushq $0x23  /* USER32_CS */
33         pushq $1f
34         lretq
37         .code32
38         // Call the function
39         call *%esi
40         // Switch back to long mode
41         jmp $0x33,$1f
42         .code64
45         // Restore the stack
46         mov (%rsp),%rsp
48         // Restore registers
49         popfq
50         popq %r15
51         popq %r14
52         popq %r13
53         popq %r12
54         popq %rbp
55         popq %rbx
57         ret
59 .size call32_from_64, .-call32_from_64
61 .section .note.GNU-stack,"",%progbits