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