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