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*aeaaf005SAndy Lutomirski
61*aeaaf005SAndy Lutomirski.section .note.GNU-stack,"",%progbits
62