version T

This commit is contained in:
noxorc 2013-02-21 10:44:23 -05:00
parent 46bd1f50de
commit 1d931b46c0
19 changed files with 210 additions and 181 deletions

View File

@ -1,3 +1,60 @@
2013-02-21 Nigel Croxon <nigel.croxon@hp.com>
* Change from Peter Jones <pjones@redhat.com>
- Previously we were incorrectly passing 3 functions with
the System V ABI to UEFI functions as EFI ABI functions.
Mark them as EFIAPI so the compiler will (in our new
GNU_EFI_USE_MS_ABI world) use the correct ABI.
- These need to be EFIAPI functions because in some cases
they call ST->ConOut->OutputString(), which is an EFIAPI
function. (Which means that previously in cases that
needed "cdecl", these didn't work right.)
- If the compiler version is new enough, and GNU_EFI_USE_MS_ABI
is defined, use the function attribute ms_abi on everything
defined with "EFIAPI". Such calls will no longer go through
efi_call*, and as such will be properly type-checked.
- Honor PREFIX and LIBDIR correctly when passed in during the build.
- Add machine type defines for i386, arm/thumb, ia64, ebc, x86_64.
- __STDC_VERSION__ never actually gets defined unless there's a
--std=... line. So we were accidentally defining lots of c99
types ourself. Since it's 2012, use --std=c11 where appropriate,
and if it's defined and we're using gcc, actually include gcc's
stdint definitions.
- New test application added: route80h. This is a test program
for PciIo. It routes ioport 80h on ICH10 to PCI. This is also
useful on a very limited set of hardware to enable use of
a port 80h debug card.
- New test applcation added: modelist. This lists video modes
the GOP driver is showing us.
* Change from Finnbarr Murphy
- https://sourceforge.net/p/gnu-efi/feature-requests/2/
Please add the following status codes to <efierr.h>
EFI_INCOMPATIBLE_VERSION 25
EFI_SECURITY_VIOLATION 26
EFI_CRC_ERROR 27
EFI_END_OF_MEDIA 28
EFI_END_OF_FILE 31
EFI_INVALID_LANGUAGE 32
EFI_COMPROMISED_DATA 33
* Change from SourceForge.net Bug report
- https://sourceforge.net/p/gnu-efi/bugs/5/
BufferSize is a UINT64 *. The file shipped with GNU EFI is from
1998 whereas the latest one is from 2004. I suspect Intel changed
the API in order handle 64-bit systems.
* Change from Felipe Contreras <felipe.contreras@gmail.com>
- The current code seems to screw the stack at certain points.
Multiple people have complained that gummiboot hangs right away,
which is in part the fault of gummiboot, but happens only
because the stack gets screwed. x86_64 EFI already aligns the
stack, so there's no need for so much code to find a proper
alignment, we always need to shift by 8 anyway.
* Change from A. Steinmetz
- https://sourceforge.net/p/gnu-efi/patches/1/
The patch prepares for elilo to support uefi pxe over ipv6
See uefi spec 2.3.1 errata c page 963 as reference.
Verfied on an ASUS Sabertooth X79 BIOS Rev. 2104 system which
is able to do an IPv6 UEFI PXE boot.
* Release 3.0t
2012-09-21 Nigel Croxon <nigel.croxon@hp.com>
* Change from Peter Jones <pjones@redhat.com>
- EFI Block I/O protocol versions 2 and 3 provide more information

View File

@ -38,8 +38,9 @@
# Where to install the package. GNU-EFI will create and access
# lib and include under the root
#
INSTALLROOT=/usr/local
LIBDIR=lib
INSTALLROOT := /
PREFIX := /usr/local
LIBDIR := ${PREFIX}/lib
TOPDIR := $(shell if [ "$$PWD" != "" ]; then echo $$PWD; else pwd; fi)
@ -47,7 +48,14 @@ HOSTARCH = $(shell uname -m | sed s,i[3456789]86,ia32,)
ARCH := $(shell uname -m | sed s,i[3456789]86,ia32,)
OS = $(shell uname -s)
INCDIR = -I$(SRCDIR) -I$(TOPDIR)/inc -I$(TOPDIR)/inc/$(ARCH) -I$(TOPDIR)/inc/protocol
GCCVERSION := $(shell gcc -dumpversion | cut -f1 -d.)
GCCMINOR := $(shell gcc -dumpversion | cut -f2 -d.)
GCCNEWENOUGH := $(shell ([ $(GCCVERSION) -gt "4" ] || ([ $(GCCVERSION) -eq "4" ] && [ $(GCCMINOR) -ge "7" ])) && echo 1)
CPPFLAGS = -DCONFIG_$(ARCH)
ifeq ($(GCCNEWENOUGH),1)
CPPFLAGS += -DGNU_EFI_USE_MS_ABI -maccumulate-outgoing-args --std=c11
endif
CFLAGS = $(ARCH3264) -O2 -fpic -Wall -fshort-wchar -fno-strict-aliasing -fno-merge-constants
ASFLAGS = $(ARCH3264)
LDFLAGS = -nostdlib
@ -73,7 +81,6 @@ endif
ifeq ($(ARCH), x86_64)
CFLAGS += -mno-red-zone
LIBDIR = lib
ifeq ($(HOSTARCH), ia32)
ARCH3264 = -m64
endif

View File

@ -44,3 +44,8 @@
%.o: %.c
$(CC) $(INCDIR) $(CFLAGS) $(CPPFLAGS) -c $< -o $@
%.S: %.c
$(CC) $(INCDIR) $(CFLAGS) $(CPPFLAGS) -S $< -o $@
%.E: %.c
$(CC) $(INCDIR) $(CFLAGS) $(CPPFLAGS) -E $< -o $@

View File

@ -58,7 +58,7 @@ LDFLAGS += -T $(LDSCRIPT) -shared -Bsymbolic -L../lib -L../gnuefi $(CRTOBJS)
LOADLIBES = -lefi -lgnuefi $(shell $(CC) $(ARCH3264) -print-libgcc-file-name)
FORMAT = efi-app-$(ARCH)
TARGETS = t.efi t2.efi t3.efi t4.efi t5.efi t6.efi printenv.efi t7.efi tcc.efi
TARGETS = t.efi t2.efi t3.efi t4.efi t5.efi t6.efi printenv.efi t7.efi tcc.efi modelist.efi route80h.efi
all: $(TARGETS)

View File

@ -337,7 +337,7 @@ efi_main (EFI_HANDLE *image, EFI_SYSTEM_TABLE *systab)
return EFI_UNSUPPORTED;
#endif
asm volatile("out %0,%1" : : "a" ((uint8_t)0x14), "dN" (0x80));
__asm__ volatile("out %0,%1" : : "a" ((uint8_t)0x14), "dN" (0x80));
Print(L"Hello\r\n");
rc = test_failure();

View File

@ -13,15 +13,15 @@ all:
clean:
install:
mkdir -p $(INSTALLROOT)/include/efi
mkdir -p $(INSTALLROOT)/include/efi/protocol
mkdir -p $(INSTALLROOT)/include/efi/$(ARCH)
$(INSTALL) -m 644 *.h $(INSTALLROOT)/include/efi
$(INSTALL) -m 644 protocol/*.h $(INSTALLROOT)/include/efi/protocol
$(INSTALL) -m 644 $(ARCH)/*.h $(INSTALLROOT)/include/efi/$(ARCH)
mkdir -p $(INSTALLROOT)$(PREFIX)/include/efi
mkdir -p $(INSTALLROOT)$(PREFIX)/include/efi/protocol
mkdir -p $(INSTALLROOT)$(PREFIX)/include/efi/$(ARCH)
$(INSTALL) -m 644 *.h $(INSTALLROOT)$(PREFIX)/include/efi
$(INSTALL) -m 644 protocol/*.h $(INSTALLROOT)$(PREFIX)/include/efi/protocol
$(INSTALL) -m 644 $(ARCH)/*.h $(INSTALLROOT)$(PREFIX)/include/efi/$(ARCH)
ifeq ($(ARCH),ia64)
mkdir -p $(INSTALLROOT)/include/efi/protocol/ia64
$(INSTALL) -m 644 protocol/ia64/*.h $(INSTALLROOT)/include/efi/protocol/ia64
mkdir -p $(INSTALLROOT)$(PREFIX)/include/efi/protocol/ia64
$(INSTALL) -m 644 protocol/ia64/*.h $(INSTALLROOT)$(PREFIX)/include/efi/protocol/ia64
endif
include $(SRCDIR)/../Make.rules

View File

@ -50,6 +50,13 @@ Revision History
#define EFI_ICMP_ERROR EFIERR(22)
#define EFI_TFTP_ERROR EFIERR(23)
#define EFI_PROTOCOL_ERROR EFIERR(24)
#define EFI_INCOMPATIBLE_VERSION EFIERR(25)
#define EFI_SECURITY_VIOLATION EFIERR(26)
#define EFI_CRC_ERROR EFIERR(27)
#define EFI_END_OF_MEDIA EFIERR(28)
#define EFI_END_OF_FILE EFIERR(31)
#define EFI_INVALID_LANGUAGE EFIERR(32)
#define EFI_COMPROMISED_DATA EFIERR(33)
#define EFI_WARN_UNKOWN_GLYPH EFIWARN(1)
#define EFI_WARN_DELETE_FAILURE EFIWARN(2)

View File

@ -65,15 +65,16 @@ typedef struct {
UINT8 DhcpOptions[56];
} EFI_PXE_BASE_CODE_DHCPV4_PACKET;
// TBD in EFI v1.1
//typedef struct {
// UINT8 reserved;
//} EFI_PXE_BASE_CODE_DHCPV6_PACKET;
typedef struct {
UINT32 MessageType:8;
UINT32 TransactionId:24;
UINT8 DhcpOptions[1024];
} EFI_PXE_BASE_CODE_DHCPV6_PACKET;
typedef union {
UINT8 Raw[1472];
EFI_PXE_BASE_CODE_DHCPV4_PACKET Dhcpv4;
// EFI_PXE_BASE_CODE_DHCPV6_PACKET Dhcpv6;
EFI_PXE_BASE_CODE_DHCPV6_PACKET Dhcpv6;
} EFI_PXE_BASE_CODE_PACKET;
typedef struct {
@ -297,7 +298,7 @@ EFI_STATUS
IN EFI_PXE_BASE_CODE_TFTP_OPCODE Operation,
IN OUT VOID *BufferPtr OPTIONAL,
IN BOOLEAN Overwrite,
IN OUT UINTN *BufferSize,
IN OUT UINT64 *BufferSize,
IN UINTN *BlockSize OPTIONAL,
IN EFI_IP_ADDRESS *ServerIp,
IN UINT8 *Filename,

View File

@ -75,6 +75,8 @@ Revision History
typedef unsigned char uint8_t;
typedef char int8_t;
#endif
#elif defined(__GNUC__)
#include <stdint-gcc.h>
#endif
//

View File

@ -98,8 +98,12 @@ typedef struct _IMAGE_FILE_HEADER {
#define IMAGE_FILE_MACHINE_R3000 0x162 // MIPS little-endian, 0540 big-endian
#define IMAGE_FILE_MACHINE_R4000 0x166 // MIPS little-endian
#define IMAGE_FILE_MACHINE_ALPHA 0x184 // Alpha_AXP
#define IMAGE_FILE_MACHINE_ARMTHUMB_MIXED 0x1c2 // Arm/Thumb
#define IMAGE_FILE_MACHINE_POWERPC 0x1F0 // IBM PowerPC Little-Endian
#define IMAGE_FILE_MACHINE_IA64 0x200 // IA-64
#define IMAGE_FILE_MACHINE_TAHOE 0x7cc // Intel EM machine
#define IMAGE_FILE_MACHINE_EBC 0xebc // EFI Byte Code
#define IMAGE_FILE_MACHINE_X64 0x8664 // x86_64
//
// Directory format.
//

View File

@ -62,6 +62,8 @@ Revision History
typedef unsigned char uint8_t;
typedef char int8_t;
#endif
#elif defined(__GNUC__)
#include <stdint-gcc.h>
#endif
//

View File

@ -113,8 +113,12 @@ typedef struct _IMAGE_FILE_HEADER {
#define IMAGE_FILE_MACHINE_R3000 0x162 // MIPS little-endian, 0540 big-endian
#define IMAGE_FILE_MACHINE_R4000 0x166 // MIPS little-endian
#define IMAGE_FILE_MACHINE_ALPHA 0x184 // Alpha_AXP
#define IMAGE_FILE_MACHINE_ARMTHUMB_MIXED 0x1c2 // Arm/Thumb
#define IMAGE_FILE_MACHINE_POWERPC 0x1F0 // IBM PowerPC Little-Endian
#define IMAGE_FILE_MACHINE_IA64 0x200 // IA-64
#define IMAGE_FILE_MACHINE_TAHOE 0x7cc // Intel EM machine
#define IMAGE_FILE_MACHINE_EBC 0xebc // EFI Byte Code
#define IMAGE_FILE_MACHINE_X64 0x8664 // x86_64
//
// Directory format.
//

View File

@ -22,6 +22,14 @@ Revision History
#pragma pack()
#endif
#if defined(GNU_EFI_USE_MS_ABI)
#if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 7))
#define HAVE_USE_MS_ABI 1
#else
#error Compiler is too old for GNU_EFI_USE_MS_ABI
#endif
#endif
//
// Basic int types of various widths
//
@ -76,6 +84,8 @@ Revision History
typedef unsigned char uint8_t;
typedef char int8_t;
#endif
#elif defined(__GNUC__)
#include <stdint-gcc.h>
#endif
//
@ -173,6 +183,9 @@ typedef uint64_t UINTN;
#ifndef EFIAPI // Forces EFI calling conventions reguardless of compiler options
#ifdef _MSC_EXTENSIONS
#define EFIAPI __cdecl // Force C calling convention for Microsoft C compiler
#elif defined(HAVE_USE_MS_ABI)
// Force amd64/ms calling conventions.
#define EFIAPI __attribute__((ms_abi))
#else
#define EFIAPI // Substitute expresion to force C calling convention
#endif
@ -274,7 +287,11 @@ typedef uint64_t UINTN;
#endif
/* for x86_64, EFI_FUNCTION_WRAPPER must be defined */
#if defined(HAVE_USE_MS_ABI)
#define uefi_call_wrapper(func, va_num, ...) func(__VA_ARGS__)
#else
UINTN uefi_call_wrapper(void *func, unsigned long va_num, ...);
#endif
#define EFI_FUNCTION __attribute__((ms_abi))
#ifdef _MSC_EXTENSIONS

View File

@ -98,8 +98,12 @@ typedef struct _IMAGE_FILE_HEADER {
#define IMAGE_FILE_MACHINE_R3000 0x162 // MIPS little-endian, 0540 big-endian
#define IMAGE_FILE_MACHINE_R4000 0x166 // MIPS little-endian
#define IMAGE_FILE_MACHINE_ALPHA 0x184 // Alpha_AXP
#define IMAGE_FILE_MACHINE_ARMTHUMB_MIXED 0x1c2 // Arm/Thumb
#define IMAGE_FILE_MACHINE_POWERPC 0x1F0 // IBM PowerPC Little-Endian
#define IMAGE_FILE_MACHINE_IA64 0x200 // IA-64
#define IMAGE_FILE_MACHINE_TAHOE 0x7cc // Intel EM machine
#define IMAGE_FILE_MACHINE_EBC 0xebc // EFI Byte Code
#define IMAGE_FILE_MACHINE_X64 0x8664 // x86_64
//
// Directory format.
//

View File

@ -44,21 +44,21 @@ InitializeGuid (
VOID
);
INTN
INTN EFIAPI
LibStubStriCmp (
IN EFI_UNICODE_COLLATION_INTERFACE *This,
IN CHAR16 *S1,
IN CHAR16 *S2
);
BOOLEAN
BOOLEAN EFIAPI
LibStubMetaiMatch (
IN EFI_UNICODE_COLLATION_INTERFACE *This,
IN CHAR16 *String,
IN CHAR16 *Pattern
);
VOID
VOID EFIAPI
LibStubStrLwrUpr (
IN EFI_UNICODE_COLLATION_INTERFACE *This,
IN CHAR16 *Str

View File

@ -95,8 +95,8 @@ typedef struct _pstate {
UINTN AttrHighlight;
UINTN AttrError;
INTN (*Output)(VOID *context, CHAR16 *str);
INTN (*SetAttr)(VOID *context, UINTN attr);
INTN EFIAPI (*Output)(VOID *context, CHAR16 *str);
INTN EFIAPI (*SetAttr)(VOID *context, UINTN attr);
VOID *Context;
// Current item being formatted
@ -125,7 +125,7 @@ _IPrint (
);
STATIC
INTN
INTN EFIAPI
_DbgOut (
IN VOID *Context,
IN CHAR16 *Buffer
@ -167,13 +167,13 @@ PSETATTR (
//
//
INTN
INTN EFIAPI
_SPrint (
IN VOID *Context,
IN CHAR16 *Buffer
);
INTN
INTN EFIAPI
_PoolPrint (
IN VOID *Context,
IN CHAR16 *Buffer
@ -235,7 +235,7 @@ Returns:
if (DbgOut) {
ps.Attr = DbgOut->Mode->Attribute;
ps.Context = DbgOut;
ps.SetAttr = (INTN (*)(VOID *, UINTN)) DbgOut->SetAttribute;
ps.SetAttr = (INTN EFIAPI (*)(VOID *, UINTN)) DbgOut->SetAttribute;
}
SavedAttribute = ps.Attr;
@ -276,7 +276,9 @@ Returns:
return 0;
}
STATIC IsLocalPrint(void *func)
STATIC
INTN
IsLocalPrint(void *func)
{
if (func == _DbgOut || func == _SPrint || func == _PoolPrint)
return 1;
@ -284,7 +286,7 @@ STATIC IsLocalPrint(void *func)
}
STATIC
INTN
INTN EFIAPI
_DbgOut (
IN VOID *Context,
IN CHAR16 *Buffer
@ -308,7 +310,7 @@ _DbgOut (
return 0;
}
INTN
INTN EFIAPI
_SPrint (
IN VOID *Context,
IN CHAR16 *Buffer
@ -350,7 +352,7 @@ _SPrint (
}
INTN
INTN EFIAPI
_PoolPrint (
IN VOID *Context,
IN CHAR16 *Buffer
@ -401,7 +403,7 @@ _PoolCatPrint (
IN CHAR16 *fmt,
IN va_list args,
IN OUT POOL_PRINT *spc,
IN INTN (*Output)(VOID *context, CHAR16 *str)
IN INTN EFIAPI (*Output)(VOID *context, CHAR16 *str)
)
// Dispath function for SPrint, PoolPrint, and CatPrint
{
@ -715,8 +717,8 @@ _IPrint (
ZeroMem (&ps, sizeof(ps));
ps.Context = Out;
ps.Output = (INTN (*)(VOID *, CHAR16 *)) Out->OutputString;
ps.SetAttr = (INTN (*)(VOID *, UINTN)) Out->SetAttribute;
ps.Output = (INTN EFIAPI (*)(VOID *, CHAR16 *)) Out->OutputString;
ps.SetAttr = (INTN EFIAPI (*)(VOID *, UINTN)) Out->SetAttribute;
ps.Attr = Out->Mode->Attribute;
back = (ps.Attr >> 4) & 0xF;

View File

@ -50,7 +50,7 @@ StrnCmp (
}
INTN
INTN EFIAPI
LibStubStriCmp (
IN EFI_UNICODE_COLLATION_INTERFACE *This,
IN CHAR16 *s1,
@ -60,7 +60,7 @@ LibStubStriCmp (
return StrCmp (s1, s2);
}
VOID
VOID EFIAPI
LibStubStrLwrUpr (
IN EFI_UNICODE_COLLATION_INTERFACE *This,
IN CHAR16 *Str
@ -356,7 +356,7 @@ MetaMatch (
}
BOOLEAN
BOOLEAN EFIAPI
LibStubMetaiMatch (
IN EFI_UNICODE_COLLATION_INTERFACE *This,
IN CHAR16 *String,

View File

@ -40,6 +40,7 @@
#include "efi.h"
#include "efistdarg.h"
#if !defined(HAVE_USE_MS_ABI)
UINT64 efi_call0(void *func);
UINT64 efi_call1(void *func, UINT64 arg1);
UINT64 efi_call2(void *func, UINT64 arg1, UINT64 arg2);
@ -123,3 +124,4 @@ EFI_STATUS uefi_call_wrapper(void *fp, unsigned long va_num, ...)
return EFI_LOAD_ERROR;
}
}
#endif

View File

@ -4,8 +4,10 @@
* Copyright (C) 2007 Intel Corp
* Bibo Mao <bibo.mao@intel.com>
* Huang Ying <ying.huang@intel.com>
* Copyright (C) 2012 Felipe Contreras <felipe.contreras@gmail.com>
*/
#if !defined(HAVE_USE_MS_ABI)
/*
* EFI calling conventions are documented at:
* http://msdn.microsoft.com/en-us/library/ms235286%28v=vs.80%29.aspx
@ -14,152 +16,94 @@
*
* Basically here are the conversion rules:
* a) our function pointer is in %rdi
* b) ELF gives us 8-byte aligned %rsp, so we need to pad out to 16-byte
* alignment.
* c) inside each call thunker, we can only adjust the stack by
* multiples of 16 bytes. "offset" below refers to however much
* we allocate inside a thunker.
* d) rsi through r8 (elf) aka rcx through r9 (ms) require stack space
* b) rsi through r8 (elf) aka rcx through r9 (ms) require stack space
* on the MS side even though it's not getting used at all.
* e) arguments are as follows: (elf -> ms)
* c) 8(%rsp) is always aligned to 16 in ELF, so %rsp is shifted 8 bytes extra
* d) arguments are as follows: (elf -> ms)
* 1) rdi -> rcx (32 saved)
* 2) rsi -> rdx (32 saved)
* 3) rdx -> r8 ( 32 saved)
* 3) rdx -> r8 (32 saved)
* 4) rcx -> r9 (32 saved)
* 5) r8 -> 32(%rsp) (48 saved)
* 5) r8 -> 32(%rsp) (32 saved)
* 6) r9 -> 40(%rsp) (48 saved)
* 7) pad+offset+0(%rsp) -> 48(%rsp) (64 saved)
* 8) pad+offset+8(%rsp) -> 56(%rsp) (64 saved)
* 9) pad+offset+16(%rsp) -> 64(%rsp) (80 saved)
* 10) pad+offset+24(%rsp) -> 72(%rsp) (80 saved)
* 11) pad+offset+32(%rsp) -> 80(%rsp) (96 saved)
* 12) pad+offset+40(%rsp) -> 88(%rsp) (96 saved)
* f) because the first argument we recieve in a thunker is actually the
* 7) 8(%rsp) -> 48(%rsp) (48 saved)
* 8) 16(%rsp) -> 56(%rsp) (64 saved)
* 9) 24(%rsp) -> 64(%rsp) (64 saved)
* 10) 32(%rsp) -> 72(%rsp) (80 saved)
* e) because the first argument we recieve in a thunker is actually the
* function to be called, arguments are offset as such:
* 0) rdi -> caller
* 1) rsi -> rcx (32 saved)
* 2) rdx -> rdx (32 saved)
* 3) rcx -> r8 (32 saved)
* 4) r8 -> r9 (32 saved)
* 5) r9 -> 32(%rsp) (48 saved)
* 6) pad+offset+0(%rsp) -> 40(%rsp) (48 saved)
* 7) pad+offset+8(%rsp) -> 48(%rsp) (64 saved)
* 8) pad+offset+16(%rsp) -> 56(%rsp) (64 saved)
* 9) pad+offset+24(%rsp) -> 64(%rsp) (80 saved)
* 10) pad+offset+32(%rsp) -> 72(%rsp) (80 saved)
* 11) pad+offset+40(%rsp) -> 80(%rsp) (96 saved)
* 12) pad+offset+48(%rsp) -> 88(%rsp) (96 saved)
* e) arguments need to be moved in opposite order to avoid clobbering
* f) pad_stack leaves the amount of padding it added in %r11 for functions
* to use
* g) efi -> elf calls don't need to pad the stack, because the 16-byte
* alignment is also always 8-byte aligned.
* 5) r9 -> 32(%rsp) (32 saved)
* 6) 8(%rsp) -> 40(%rsp) (48 saved)
* 7) 16(%rsp) -> 48(%rsp) (48 saved)
* 8) 24(%rsp) -> 56(%rsp) (64 saved)
* 9) 32(%rsp) -> 64(%rsp) (64 saved)
* 10) 40(%rsp) -> 72(%rsp) (80 saved)
* f) arguments need to be moved in opposite order to avoid clobbering
*/
#define ENTRY(name) \
.globl name; \
name:
#define out(val) \
push %rax ; \
mov val, %rax ; \
out %al, $128 ; \
pop %rax
#define pad_stack \
subq $8, %rsp ; /* must be a multiple of 16 - sizeof(%rip) */ \
/* stash some handy integers */ \
mov $0x8, %rax ; \
mov $0x10, %r10 ; \
/* see if we need padding */ \
and %rsp, %rax ; \
/* store the pad amount in %r11 */ \
cmovnz %rax, %r11 ; \
cmovz %r10, %r11 ; \
/* insert the padding */ \
subq %r11, %rsp ; \
/* add the $8 we saved above in %r11 */ \
addq $8, %r11 ; \
/* store the pad amount */ \
mov %r11, (%rsp) ; \
/* compensate for %rip being stored on the stack by call */ \
addq $8, %r11
#define unpad_stack \
/* fetch the pad amount we saved (%r11 has been clobbered) */ \
mov (%rsp), %r11 ; \
/* remove the padding */ \
addq %r11, %rsp
ENTRY(efi_call0)
pad_stack
subq $32, %rsp
subq $40, %rsp
call *%rdi
addq $32, %rsp
unpad_stack
addq $40, %rsp
ret
ENTRY(efi_call1)
pad_stack
subq $32, %rsp
subq $40, %rsp
mov %rsi, %rcx
call *%rdi
addq $32, %rsp
unpad_stack
addq $40, %rsp
ret
ENTRY(efi_call2)
pad_stack
subq $32, %rsp
subq $40, %rsp
/* mov %rdx, %rdx */
mov %rsi, %rcx
call *%rdi
addq $32, %rsp
unpad_stack
addq $40, %rsp
ret
ENTRY(efi_call3)
pad_stack
subq $32, %rsp
subq $40, %rsp
mov %rcx, %r8
/* mov %rdx, %rdx */
mov %rsi, %rcx
call *%rdi
addq $32, %rsp
unpad_stack
addq $40, %rsp
ret
ENTRY(efi_call4)
pad_stack
subq $32, %rsp
subq $40, %rsp
mov %r8, %r9
mov %rcx, %r8
/* mov %rdx, %rdx */
mov %rsi, %rcx
call *%rdi
addq $32, %rsp
unpad_stack
addq $40, %rsp
ret
ENTRY(efi_call5)
pad_stack
subq $48, %rsp
subq $40, %rsp
mov %r9, 32(%rsp)
mov %r8, %r9
mov %rcx, %r8
/* mov %rdx, %rdx */
mov %rsi, %rcx
call *%rdi
addq $48, %rsp
unpad_stack
addq $40, %rsp
ret
ENTRY(efi_call6)
pad_stack
subq $48, %rsp
addq $48, %r11
addq %rsp, %r11
mov (%r11), %rax
subq $56, %rsp
mov 56+8(%rsp), %rax
mov %rax, 40(%rsp)
mov %r9, 32(%rsp)
mov %r8, %r9
@ -167,20 +111,14 @@ ENTRY(efi_call6)
/* mov %rdx, %rdx */
mov %rsi, %rcx
call *%rdi
addq $48, %rsp
unpad_stack
addq $56, %rsp
ret
ENTRY(efi_call7)
pad_stack
subq $64, %rsp
addq $64, %r11
addq $8, %r11
addq %rsp, %r11
mov (%r11), %rax
subq $56, %rsp
mov 56+16(%rsp), %rax
mov %rax, 48(%rsp)
subq $8, %r11
mov (%r11), %rax
mov 56+8(%rsp), %rax
mov %rax, 40(%rsp)
mov %r9, 32(%rsp)
mov %r8, %r9
@ -188,23 +126,16 @@ ENTRY(efi_call7)
/* mov %rdx, %rdx */
mov %rsi, %rcx
call *%rdi
addq $64, %rsp
unpad_stack
addq $56, %rsp
ret
ENTRY(efi_call8)
pad_stack
subq $64, %rsp
addq $64, %r11
addq $16, %r11
addq %rsp, %r11
mov (%r11), %rax
subq $72, %rsp
mov 72+24(%rsp), %rax
mov %rax, 56(%rsp)
subq $8, %r11
mov (%r11), %rax
mov 72+16(%rsp), %rax
mov %rax, 48(%rsp)
subq $8, %r11
mov (%r11), %rax
mov 72+8(%rsp), %rax
mov %rax, 40(%rsp)
mov %r9, 32(%rsp)
mov %r8, %r9
@ -212,26 +143,18 @@ ENTRY(efi_call8)
/* mov %rdx, %rdx */
mov %rsi, %rcx
call *%rdi
addq $64, %rsp
unpad_stack
addq $72, %rsp
ret
ENTRY(efi_call9)
pad_stack
subq $80, %rsp
addq $80, %r11
addq $24, %r11
addq %rsp, %r11
mov (%r11), %rax
subq $72, %rsp
mov 72+32(%rsp), %rax
mov %rax, 64(%rsp)
subq $8, %r11
mov (%r11), %rax
mov 72+24(%rsp), %rax
mov %rax, 56(%rsp)
subq $8, %r11
mov (%r11), %rax
mov 72+16(%rsp), %rax
mov %rax, 48(%rsp)
subq $8, %r11
mov (%r11), %rax
mov 72+8(%rsp), %rax
mov %rax, 40(%rsp)
mov %r9, 32(%rsp)
mov %r8, %r9
@ -239,29 +162,20 @@ ENTRY(efi_call9)
/* mov %rdx, %rdx */
mov %rsi, %rcx
call *%rdi
addq $80, %rsp
unpad_stack
addq $72, %rsp
ret
ENTRY(efi_call10)
pad_stack
subq $80, %rsp
addq $80, %r11
addq $32, %r11
addq %rsp, %r11
mov (%r11), %rax
subq $88, %rsp
mov 88+40(%rsp), %rax
mov %rax, 72(%rsp)
subq $8, %r11
mov (%r11), %rax
mov 88+32(%rsp), %rax
mov %rax, 64(%rsp)
subq $8, %r11
mov (%r11), %rax
mov 88+24(%rsp), %rax
mov %rax, 56(%rsp)
subq $8, %r11
mov (%r11), %rax
mov 88+16(%rsp), %rax
mov %rax, 48(%rsp)
subq $8, %r11
mov (%r11), %rax
mov 88+8(%rsp), %rax
mov %rax, 40(%rsp)
mov %r9, 32(%rsp)
mov %r8, %r9
@ -269,6 +183,7 @@ ENTRY(efi_call10)
/* mov %rdx, %rdx */
mov %rsi, %rcx
call *%rdi
addq $80, %rsp
unpad_stack
addq $88, %rsp
ret
#endif