mirror of
https://git.savannah.gnu.org/git/grub.git
synced 2026-10-21 14:59:34 +00:00
efi: Remove x86_64 call wrappers
The call wrappers are no longer needed now that GCC can generate function calls using MS calling convention, so let's get rid of them. Signed-off-by: Ard Biesheuvel <ardb@kernel.org> Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
This commit is contained in:
1 parent
bb4aa6e06e
commit
df16fe97b2
3 files changed
-203
No files matched your search
@@ -236,7 +236,6 @@ kernel = {
|
|||||||
|
|
||||||
x86_64 = kern/x86_64/dl.c;
|
x86_64 = kern/x86_64/dl.c;
|
||||||
x86_64_xen = kern/x86_64/dl.c;
|
x86_64_xen = kern/x86_64/dl.c;
|
||||||
x86_64_efi = kern/x86_64/efi/callwrap.S;
|
|
||||||
x86_64_efi = kern/i386/efi/init.c;
|
x86_64_efi = kern/i386/efi/init.c;
|
||||||
x86_64_efi = bus/pci.c;
|
x86_64_efi = bus/pci.c;
|
||||||
|
|
||||||
|
|||||||
@@ -1,129 +0,0 @@
|
|||||||
/* callwrap.S - wrapper for x86_64 efi calls */
|
|
||||||
/*
|
|
||||||
* GRUB -- GRand Unified Bootloader
|
|
||||||
* Copyright (C) 2006,2007,2009 Free Software Foundation, Inc.
|
|
||||||
*
|
|
||||||
* GRUB is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* GRUB is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with GRUB. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <config.h>
|
|
||||||
#include <grub/symbol.h>
|
|
||||||
|
|
||||||
/*
|
|
||||||
* x86_64 uses registry to pass parameters. Unfortunately, gcc and efi use
|
|
||||||
* different call conversion, so we need to do some conversion.
|
|
||||||
*
|
|
||||||
* gcc:
|
|
||||||
* %rdi, %rsi, %rdx, %rcx, %r8, %r9, 8(%rsp), 16(%rsp), ...
|
|
||||||
*
|
|
||||||
* efi:
|
|
||||||
* %rcx, %rdx, %r8, %r9, 32(%rsp), 40(%rsp), 48(%rsp), ...
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
.file "callwrap.S"
|
|
||||||
.text
|
|
||||||
|
|
||||||
FUNCTION(efi_wrap_0)
|
|
||||||
subq $40, %rsp
|
|
||||||
call *%rdi
|
|
||||||
addq $40, %rsp
|
|
||||||
ret
|
|
||||||
|
|
||||||
FUNCTION(efi_wrap_1)
|
|
||||||
subq $40, %rsp
|
|
||||||
mov %rsi, %rcx
|
|
||||||
call *%rdi
|
|
||||||
addq $40, %rsp
|
|
||||||
ret
|
|
||||||
|
|
||||||
FUNCTION(efi_wrap_2)
|
|
||||||
subq $40, %rsp
|
|
||||||
mov %rsi, %rcx
|
|
||||||
call *%rdi
|
|
||||||
addq $40, %rsp
|
|
||||||
ret
|
|
||||||
|
|
||||||
FUNCTION(efi_wrap_3)
|
|
||||||
subq $40, %rsp
|
|
||||||
mov %rcx, %r8
|
|
||||||
mov %rsi, %rcx
|
|
||||||
call *%rdi
|
|
||||||
addq $40, %rsp
|
|
||||||
ret
|
|
||||||
|
|
||||||
FUNCTION(efi_wrap_4)
|
|
||||||
subq $40, %rsp
|
|
||||||
mov %r8, %r9
|
|
||||||
mov %rcx, %r8
|
|
||||||
mov %rsi, %rcx
|
|
||||||
call *%rdi
|
|
||||||
addq $40, %rsp
|
|
||||||
ret
|
|
||||||
|
|
||||||
FUNCTION(efi_wrap_5)
|
|
||||||
subq $40, %rsp
|
|
||||||
mov %r9, 32(%rsp)
|
|
||||||
mov %r8, %r9
|
|
||||||
mov %rcx, %r8
|
|
||||||
mov %rsi, %rcx
|
|
||||||
call *%rdi
|
|
||||||
addq $40, %rsp
|
|
||||||
ret
|
|
||||||
|
|
||||||
FUNCTION(efi_wrap_6)
|
|
||||||
subq $56, %rsp
|
|
||||||
mov 56+8(%rsp), %rax
|
|
||||||
mov %rax, 40(%rsp)
|
|
||||||
mov %r9, 32(%rsp)
|
|
||||||
mov %r8, %r9
|
|
||||||
mov %rcx, %r8
|
|
||||||
mov %rsi, %rcx
|
|
||||||
call *%rdi
|
|
||||||
addq $56, %rsp
|
|
||||||
ret
|
|
||||||
|
|
||||||
FUNCTION(efi_wrap_7)
|
|
||||||
subq $88, %rsp
|
|
||||||
mov 88+16(%rsp), %rax
|
|
||||||
mov %rax, 48(%rsp)
|
|
||||||
mov 88+8(%rsp), %rax
|
|
||||||
mov %rax, 40(%rsp)
|
|
||||||
mov %r9, 32(%rsp)
|
|
||||||
mov %r8, %r9
|
|
||||||
mov %rcx, %r8
|
|
||||||
mov %rsi, %rcx
|
|
||||||
call *%rdi
|
|
||||||
addq $88, %rsp
|
|
||||||
ret
|
|
||||||
|
|
||||||
FUNCTION(efi_wrap_10)
|
|
||||||
subq $88, %rsp
|
|
||||||
mov 88+40(%rsp), %rax
|
|
||||||
mov %rax, 72(%rsp)
|
|
||||||
mov 88+32(%rsp), %rax
|
|
||||||
mov %rax, 64(%rsp)
|
|
||||||
mov 88+24(%rsp), %rax
|
|
||||||
mov %rax, 56(%rsp)
|
|
||||||
mov 88+16(%rsp), %rax
|
|
||||||
mov %rax, 48(%rsp)
|
|
||||||
mov 88+8(%rsp), %rax
|
|
||||||
mov %rax, 40(%rsp)
|
|
||||||
mov %r9, 32(%rsp)
|
|
||||||
mov %r8, %r9
|
|
||||||
mov %rcx, %r8
|
|
||||||
mov %rsi, %rcx
|
|
||||||
call *%rdi
|
|
||||||
addq $88, %rsp
|
|
||||||
ret
|
|
||||||
@@ -1824,77 +1824,4 @@ struct initrd_media_device_path {
|
|||||||
} GRUB_PACKED;
|
} GRUB_PACKED;
|
||||||
typedef struct initrd_media_device_path initrd_media_device_path_t;
|
typedef struct initrd_media_device_path initrd_media_device_path_t;
|
||||||
|
|
||||||
#if (GRUB_TARGET_SIZEOF_VOID_P == 4) || defined (__ia64__) \
|
|
||||||
|| defined (__aarch64__) || defined (__MINGW64__) || defined (__CYGWIN__) \
|
|
||||||
|| defined(__riscv) || defined (__loongarch__)
|
|
||||||
|
|
||||||
#define efi_call_0(func) (func)()
|
|
||||||
#define efi_call_1(func, a) (func)(a)
|
|
||||||
#define efi_call_2(func, a, b) (func)(a, b)
|
|
||||||
#define efi_call_3(func, a, b, c) (func)(a, b, c)
|
|
||||||
#define efi_call_4(func, a, b, c, d) (func)(a, b, c, d)
|
|
||||||
#define efi_call_5(func, a, b, c, d, e) (func)(a, b, c, d, e)
|
|
||||||
#define efi_call_6(func, a, b, c, d, e, f) (func)(a, b, c, d, e, f)
|
|
||||||
#define efi_call_7(func, a, b, c, d, e, f, g) (func)(a, b, c, d, e, f, g)
|
|
||||||
#define efi_call_10(func, a, b, c, d, e, f, g, h, i, j) (func)(a, b, c, d, e, f, g, h, i, j)
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
#define efi_call_0(func) \
|
|
||||||
efi_wrap_0(func)
|
|
||||||
#define efi_call_1(func, a) \
|
|
||||||
efi_wrap_1(func, (grub_uint64_t) (a))
|
|
||||||
#define efi_call_2(func, a, b) \
|
|
||||||
efi_wrap_2(func, (grub_uint64_t) (a), (grub_uint64_t) (b))
|
|
||||||
#define efi_call_3(func, a, b, c) \
|
|
||||||
efi_wrap_3(func, (grub_uint64_t) (a), (grub_uint64_t) (b), \
|
|
||||||
(grub_uint64_t) (c))
|
|
||||||
#define efi_call_4(func, a, b, c, d) \
|
|
||||||
efi_wrap_4(func, (grub_uint64_t) (a), (grub_uint64_t) (b), \
|
|
||||||
(grub_uint64_t) (c), (grub_uint64_t) (d))
|
|
||||||
#define efi_call_5(func, a, b, c, d, e) \
|
|
||||||
efi_wrap_5(func, (grub_uint64_t) (a), (grub_uint64_t) (b), \
|
|
||||||
(grub_uint64_t) (c), (grub_uint64_t) (d), (grub_uint64_t) (e))
|
|
||||||
#define efi_call_6(func, a, b, c, d, e, f) \
|
|
||||||
efi_wrap_6(func, (grub_uint64_t) (a), (grub_uint64_t) (b), \
|
|
||||||
(grub_uint64_t) (c), (grub_uint64_t) (d), (grub_uint64_t) (e), \
|
|
||||||
(grub_uint64_t) (f))
|
|
||||||
#define efi_call_7(func, a, b, c, d, e, f, g) \
|
|
||||||
efi_wrap_7(func, (grub_uint64_t) (a), (grub_uint64_t) (b), \
|
|
||||||
(grub_uint64_t) (c), (grub_uint64_t) (d), (grub_uint64_t) (e), \
|
|
||||||
(grub_uint64_t) (f), (grub_uint64_t) (g))
|
|
||||||
#define efi_call_10(func, a, b, c, d, e, f, g, h, i, j) \
|
|
||||||
efi_wrap_10(func, (grub_uint64_t) (a), (grub_uint64_t) (b), \
|
|
||||||
(grub_uint64_t) (c), (grub_uint64_t) (d), (grub_uint64_t) (e), \
|
|
||||||
(grub_uint64_t) (f), (grub_uint64_t) (g), (grub_uint64_t) (h), \
|
|
||||||
(grub_uint64_t) (i), (grub_uint64_t) (j))
|
|
||||||
|
|
||||||
grub_uint64_t EXPORT_FUNC(efi_wrap_0) (void *func);
|
|
||||||
grub_uint64_t EXPORT_FUNC(efi_wrap_1) (void *func, grub_uint64_t arg1);
|
|
||||||
grub_uint64_t EXPORT_FUNC(efi_wrap_2) (void *func, grub_uint64_t arg1,
|
|
||||||
grub_uint64_t arg2);
|
|
||||||
grub_uint64_t EXPORT_FUNC(efi_wrap_3) (void *func, grub_uint64_t arg1,
|
|
||||||
grub_uint64_t arg2, grub_uint64_t arg3);
|
|
||||||
grub_uint64_t EXPORT_FUNC(efi_wrap_4) (void *func, grub_uint64_t arg1,
|
|
||||||
grub_uint64_t arg2, grub_uint64_t arg3,
|
|
||||||
grub_uint64_t arg4);
|
|
||||||
grub_uint64_t EXPORT_FUNC(efi_wrap_5) (void *func, grub_uint64_t arg1,
|
|
||||||
grub_uint64_t arg2, grub_uint64_t arg3,
|
|
||||||
grub_uint64_t arg4, grub_uint64_t arg5);
|
|
||||||
grub_uint64_t EXPORT_FUNC(efi_wrap_6) (void *func, grub_uint64_t arg1,
|
|
||||||
grub_uint64_t arg2, grub_uint64_t arg3,
|
|
||||||
grub_uint64_t arg4, grub_uint64_t arg5,
|
|
||||||
grub_uint64_t arg6);
|
|
||||||
grub_uint64_t EXPORT_FUNC(efi_wrap_7) (void *func, grub_uint64_t arg1,
|
|
||||||
grub_uint64_t arg2, grub_uint64_t arg3,
|
|
||||||
grub_uint64_t arg4, grub_uint64_t arg5,
|
|
||||||
grub_uint64_t arg6, grub_uint64_t arg7);
|
|
||||||
grub_uint64_t EXPORT_FUNC(efi_wrap_10) (void *func, grub_uint64_t arg1,
|
|
||||||
grub_uint64_t arg2, grub_uint64_t arg3,
|
|
||||||
grub_uint64_t arg4, grub_uint64_t arg5,
|
|
||||||
grub_uint64_t arg6, grub_uint64_t arg7,
|
|
||||||
grub_uint64_t arg8, grub_uint64_t arg9,
|
|
||||||
grub_uint64_t arg10);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* ! GRUB_EFI_API_HEADER */
|
#endif /* ! GRUB_EFI_API_HEADER */
|
||||||
Reference in new issue
Block a user