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