1 /* SPDX-License-Identifier: GPL-2.0-only */ 1 /* SPDX-License-Identifier: GPL-2.0-only */ 2 /* 2 /* 3 * thunks.S - assembly helpers for mixed-bitne 3 * thunks.S - assembly helpers for mixed-bitness code 4 * Copyright (c) 2015 Andrew Lutomirski 4 * Copyright (c) 2015 Andrew Lutomirski 5 * 5 * 6 * These are little helpers that make it easie 6 * These are little helpers that make it easier to switch bitness on 7 * the fly. 7 * the fly. 8 */ 8 */ 9 9 10 .text 10 .text 11 11 12 .global call32_from_64 12 .global call32_from_64 13 .type call32_from_64, @function 13 .type call32_from_64, @function 14 call32_from_64: 14 call32_from_64: 15 // rdi: stack to use 15 // rdi: stack to use 16 // esi: function to call 16 // esi: function to call 17 17 18 // Save registers 18 // Save registers 19 pushq %rbx 19 pushq %rbx 20 pushq %rbp 20 pushq %rbp 21 pushq %r12 21 pushq %r12 22 pushq %r13 22 pushq %r13 23 pushq %r14 23 pushq %r14 24 pushq %r15 24 pushq %r15 25 pushfq 25 pushfq 26 26 27 // Switch stacks 27 // Switch stacks 28 mov %rsp,(%rdi) 28 mov %rsp,(%rdi) 29 mov %rdi,%rsp 29 mov %rdi,%rsp 30 30 31 // Switch to compatibility mode 31 // Switch to compatibility mode 32 pushq $0x23 /* USER32_CS */ 32 pushq $0x23 /* USER32_CS */ 33 pushq $1f 33 pushq $1f 34 lretq 34 lretq 35 35 36 1: 36 1: 37 .code32 37 .code32 38 // Call the function 38 // Call the function 39 call *%esi 39 call *%esi 40 // Switch back to long mode 40 // Switch back to long mode 41 jmp $0x33,$1f 41 jmp $0x33,$1f 42 .code64 42 .code64 43 43 44 1: 44 1: 45 // Restore the stack 45 // Restore the stack 46 mov (%rsp),%rsp 46 mov (%rsp),%rsp 47 47 48 // Restore registers 48 // Restore registers 49 popfq 49 popfq 50 popq %r15 50 popq %r15 51 popq %r14 51 popq %r14 52 popq %r13 52 popq %r13 53 popq %r12 53 popq %r12 54 popq %rbp 54 popq %rbp 55 popq %rbx 55 popq %rbx 56 56 57 ret 57 ret 58 58 59 .size call32_from_64, .-call32_from_64 59 .size call32_from_64, .-call32_from_64 60 60 61 .section .note.GNU-stack,"",%progbits 61 .section .note.GNU-stack,"",%progbits
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.