Patrick Rudolph | 7a35949 | 2020-11-30 15:56:59 +0100 | [diff] [blame] | 1 | /* SPDX-License-Identifier: GPL-2.0-only */ |
| 2 | |
Patrick Rudolph | b4283a4 | 2023-12-28 07:44:26 +0100 | [diff] [blame^] | 3 | /* Calls a x86_32 function from x86_64 context */ |
Patrick Rudolph | 7a35949 | 2020-11-30 15:56:59 +0100 | [diff] [blame] | 4 | .text |
| 5 | .code64 |
| 6 | .section ".text.protected_mode_call", "ax", @progbits |
Patrick Rudolph | b4283a4 | 2023-12-28 07:44:26 +0100 | [diff] [blame^] | 7 | .globl protected_mode_call_3arg |
| 8 | protected_mode_call_3arg: |
Patrick Rudolph | 7a35949 | 2020-11-30 15:56:59 +0100 | [diff] [blame] | 9 | /* Preserve registers */ |
Patrick Rudolph | b4283a4 | 2023-12-28 07:44:26 +0100 | [diff] [blame^] | 10 | push %rbp |
Patrick Rudolph | 7a35949 | 2020-11-30 15:56:59 +0100 | [diff] [blame] | 11 | push %rbx |
| 12 | push %r12 |
| 13 | push %r13 |
| 14 | push %r14 |
| 15 | push %r15 |
| 16 | |
Patrick Rudolph | 5b334b8 | 2021-11-30 18:34:32 +0100 | [diff] [blame] | 17 | /* Backup gs to stack */ |
| 18 | movl %gs, %eax |
| 19 | push %rax |
| 20 | |
Patrick Rudolph | b4283a4 | 2023-12-28 07:44:26 +0100 | [diff] [blame^] | 21 | /* Store stack pointer */ |
| 22 | mov %rsp, %rbp |
Patrick Rudolph | 7a35949 | 2020-11-30 15:56:59 +0100 | [diff] [blame] | 23 | |
Patrick Rudolph | b4283a4 | 2023-12-28 07:44:26 +0100 | [diff] [blame^] | 24 | /* 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 Rudolph | 7a35949 | 2020-11-30 15:56:59 +0100 | [diff] [blame] | 36 | #include <cpu/x86/64bit/exit32.inc> |
| 37 | |
Patrick Rudolph | b4283a4 | 2023-12-28 07:44:26 +0100 | [diff] [blame^] | 38 | /* Fetch function to call */ |
| 39 | movl 12(%esp), %ebx |
Patrick Rudolph | 7a35949 | 2020-11-30 15:56:59 +0100 | [diff] [blame] | 40 | |
Patrick Rudolph | b4283a4 | 2023-12-28 07:44:26 +0100 | [diff] [blame^] | 41 | /* Call function */ |
Patrick Rudolph | 7a35949 | 2020-11-30 15:56:59 +0100 | [diff] [blame] | 42 | call *%ebx |
| 43 | movl %eax, %ebx |
| 44 | |
Patrick Rudolph | b4283a4 | 2023-12-28 07:44:26 +0100 | [diff] [blame^] | 45 | /* Jump to long mode. Preserves ebx */ |
Patrick Rudolph | 7a35949 | 2020-11-30 15:56:59 +0100 | [diff] [blame] | 46 | #include <cpu/x86/64bit/entry64.inc> |
| 47 | |
| 48 | /* Place return value in rax */ |
| 49 | movl %ebx, %eax |
| 50 | |
Patrick Rudolph | 7a35949 | 2020-11-30 15:56:59 +0100 | [diff] [blame] | 51 | /* Restore stack pointer */ |
| 52 | mov %rbp, %rsp |
Patrick Rudolph | b4283a4 | 2023-12-28 07:44:26 +0100 | [diff] [blame^] | 53 | |
| 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 Rudolph | 7a35949 | 2020-11-30 15:56:59 +0100 | [diff] [blame] | 62 | pop %rbp |
| 63 | |
| 64 | ret |