blob: ce8a995bbb17b4ce2ee87fc22bf3cdea99b9d549 [file] [log] [blame]
Andy Lutomirskie22438f2015-04-24 15:09:19 -07001/*
2 * thunks.S - assembly helpers for mixed-bitness code
3 * Copyright (c) 2015 Andrew Lutomirski
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
20 .global call32_from_64
21 .type call32_from_64, @function
22call32_from_64:
23 // rdi: stack to use
24 // esi: function to call
25
26 // Save registers
27 pushq %rbx
28 pushq %rbp
29 pushq %r12
30 pushq %r13
31 pushq %r14
32 pushq %r15
33 pushfq
34
35 // Switch stacks
36 mov %rsp,(%rdi)
37 mov %rdi,%rsp
38
39 // Switch to compatibility mode
40 pushq $0x23 /* USER32_CS */
41 pushq $1f
42 lretq
43
441:
45 .code32
46 // Call the function
47 call *%esi
48 // Switch back to long mode
49 jmp $0x33,$1f
50 .code64
51
521:
53 // Restore the stack
54 mov (%rsp),%rsp
55
56 // Restore registers
57 popfq
58 popq %r15
59 popq %r14
60 popq %r13
61 popq %r12
62 popq %rbp
63 popq %rbx
64
65 ret
66
67.size call32_from_64, .-call32_from_64