blob: f9f784e8c4e973524036556f7d06321dfcf0a00c [file] [log] [blame]
Patrick Rudolph7a359492020-11-30 15:56:59 +01001/* SPDX-License-Identifier: GPL-2.0-only */
2
Patrick Rudolphb4283a42023-12-28 07:44:26 +01003/* Calls a x86_32 function from x86_64 context */
Patrick Rudolph7a359492020-11-30 15:56:59 +01004.text
5.code64
6 .section ".text.protected_mode_call", "ax", @progbits
Patrick Rudolphb4283a42023-12-28 07:44:26 +01007 .globl protected_mode_call_3arg
8protected_mode_call_3arg:
Patrick Rudolph7a359492020-11-30 15:56:59 +01009 /* Preserve registers */
Patrick Rudolphb4283a42023-12-28 07:44:26 +010010 push %rbp
Patrick Rudolph7a359492020-11-30 15:56:59 +010011 push %rbx
12 push %r12
13 push %r13
14 push %r14
15 push %r15
16
Patrick Rudolph5b334b82021-11-30 18:34:32 +010017 /* Backup gs to stack */
18 movl %gs, %eax
19 push %rax
20
Patrick Rudolphb4283a42023-12-28 07:44:26 +010021 /* Store stack pointer */
22 mov %rsp, %rbp
Patrick Rudolph7a359492020-11-30 15:56:59 +010023
Patrick Rudolphb4283a42023-12-28 07:44:26 +010024 /* Align stack and make space for arguments */
25 movabs $0xfffffffffffffff0, %rax
26 andq %rax, %rsp
27 sub $16, %rsp
28
29 /* Arguments to stack */
30 movl %edi, 12(%rsp)
31 movl %esi, 0(%rsp)
32 movl %edx, 4(%rsp)
33 movl %ecx, 8(%rsp)
34
35 /* Drop to protected mode */
Patrick Rudolph7a359492020-11-30 15:56:59 +010036 #include <cpu/x86/64bit/exit32.inc>
37
Patrick Rudolphb4283a42023-12-28 07:44:26 +010038 /* Fetch function to call */
39 movl 12(%esp), %ebx
Patrick Rudolph7a359492020-11-30 15:56:59 +010040
Patrick Rudolphb4283a42023-12-28 07:44:26 +010041 /* Call function */
Patrick Rudolph7a359492020-11-30 15:56:59 +010042 call *%ebx
43 movl %eax, %ebx
44
Patrick Rudolphb4283a42023-12-28 07:44:26 +010045 /* Jump to long mode. Preserves ebx */
Patrick Rudolph7a359492020-11-30 15:56:59 +010046 #include <cpu/x86/64bit/entry64.inc>
47
48 /* Place return value in rax */
49 movl %ebx, %eax
50
Patrick Rudolph7a359492020-11-30 15:56:59 +010051 /* Restore stack pointer */
52 mov %rbp, %rsp
Patrick Rudolphb4283a42023-12-28 07:44:26 +010053
54 /* Restore registers */
55 pop %rbx
56 movl %ebx, %gs
57 pop %r15
58 pop %r14
59 pop %r13
60 pop %r12
61 pop %rbx
Patrick Rudolph7a359492020-11-30 15:56:59 +010062 pop %rbp
63
64 ret