/* SPDX-License-Identifier: GPL-2.0-only */ .text .code64 .section ".text.protected_mode_call", "ax", @progbits .globl protected_mode_call_narg protected_mode_call_narg: push %rbp mov %rsp, %rbp /* Preserve registers */ push %rbx push %r12 push %r13 push %r14 push %r15 /* Backup gs to stack */ movl %gs, %eax push %rax /* Arguments to stack */ push %rdi push %rsi push %rdx push %rcx #include movl -56(%ebp), %eax /* Argument count */ movl -72(%ebp), %edx /* Argument 0 */ movl -80(%ebp), %ecx /* Argument 1 */ /* Align the stack */ andl $0xFFFFFFF0, %esp test %eax, %eax je 1f /* Zero arguments */ subl $1, %eax test %eax, %eax je 2f /* One argument */ /* Two arguments */ subl $8, %esp pushl %ecx /* Argument 1 */ pushl %edx /* Argument 0 */ jmp 1f 2: subl $12, %esp pushl %edx /* Argument 0 */ 1: movl -64(%ebp), %ebx /* Function to call */ call *%ebx movl %eax, %ebx /* Preserves ebx */ #include /* Place return value in rax */ movl %ebx, %eax /* Restore registers */ mov -48(%rbp), %rbx movl %ebx, %gs mov -40(%rbp), %r15 mov -32(%rbp), %r14 mov -24(%rbp), %r13 mov -16(%rbp), %r12 mov -8(%rbp), %rbx /* Restore stack pointer */ mov %rbp, %rsp pop %rbp ret