mb/google/brya/var/orisa: Update Type C DisplayPort HPD Configuration
[coreboot2.git] / src / cpu / x86 / 64bit / mode_switch2.S
blob18c6425d7f32f3b18997a6d2614cb630fb3dce1e
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 /*
3  * Calls a x86_64 function from x86_32 context.
4  * Must not be directly invoked from C code!
5  */
7 #include <cpu/x86/64bit/entry64.inc>
9 .text
10 .code32
11         .section ".text.long_mode_call_3arg", "ax", @progbits
12         .global long_mode_call_3arg
13 long_mode_call_3arg:
15         /* Function to call is passed in EAX. */
17         /* Backup registers */
18         pushal
20         /* Backup stack pointer */
21         mov     %esp, %ebp
23         /* Enter long mode, preserves ebx */
24         setup_longmode $PM4LE
26         /* Align stack */
27         movabs  $0xfffffffffffffff0, %rax
28         andq    %rax, %rsp
30         movl    28(%rbp), %ebx  /* Function to call */
31         movl    36(%rbp), %edi  /* 1st arg */
32         movl    40(%rbp), %esi  /* 2nd arg */
33         movl    44(%rbp), %edx  /* 3rd arg */
35         call    *%rbx
37         /* Store return value on stack. popal will fetch it. */
38         mov     %eax, 28(%rbp)
39         shr     $32, %rax
40         movl    %eax, 24(%rbp)
42         #include <cpu/x86/64bit/exit32.inc>
44         /* Restore stack pointer */
45         mov     %ebp, %esp
47         /* Restore registers */
48         popal
50         ret