Forgot x86_64 GNU-EFI. Oops.
This commit is contained in:
parent
10e2112faf
commit
be9044e79f
3
.gitignore
vendored
3
.gitignore
vendored
|
@ -8,9 +8,6 @@
|
|||
*.fd
|
||||
*.db*
|
||||
*.*db*
|
||||
arm
|
||||
aa64
|
||||
x86_64
|
||||
x86_32
|
||||
image
|
||||
x64
|
||||
|
|
40
gnu-efi/lib/x86_64/callwrap.c
Normal file
40
gnu-efi/lib/x86_64/callwrap.c
Normal file
|
@ -0,0 +1,40 @@
|
|||
/*
|
||||
* Convert SysV calling convention to EFI x86_64 calling convention
|
||||
*
|
||||
* Copyright (C) 2007-2010 Intel Corp
|
||||
* Bibo Mao <bibo.mao@intel.com>
|
||||
* Chandramouli Narayanan<mouli@linux.intel.com>
|
||||
* Huang Ying <ying.huang@intel.com>
|
||||
*
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* - Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* - Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following
|
||||
* disclaimer in the documentation and/or other materials
|
||||
* provided with the distribution.
|
||||
* - Neither the name of Hewlett-Packard Co. nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
|
||||
* BE LIABLE FOR ANYDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
|
||||
* OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
|
||||
* TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
|
||||
* THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
/* uefi_call_wrapper() is a macro in efibind.h */
|
189
gnu-efi/lib/x86_64/efi_stub.S
Normal file
189
gnu-efi/lib/x86_64/efi_stub.S
Normal file
|
@ -0,0 +1,189 @@
|
|||
/*
|
||||
* Function calling ABI conversion from Linux to EFI for x86_64
|
||||
*
|
||||
* 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
|
||||
* ELF calling conventions are documented at:
|
||||
* http://www.x86-64.org/documentation/abi.pdf
|
||||
*
|
||||
* Basically here are the conversion rules:
|
||||
* a) our function pointer is in %rdi
|
||||
* 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.
|
||||
* 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)
|
||||
* 4) rcx -> r9 (32 saved)
|
||||
* 5) r8 -> 32(%rsp) (32 saved)
|
||||
* 6) r9 -> 40(%rsp) (48 saved)
|
||||
* 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) (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:
|
||||
|
||||
ENTRY(efi_call0)
|
||||
subq $40, %rsp
|
||||
call *%rdi
|
||||
addq $40, %rsp
|
||||
ret
|
||||
|
||||
ENTRY(efi_call1)
|
||||
subq $40, %rsp
|
||||
mov %rsi, %rcx
|
||||
call *%rdi
|
||||
addq $40, %rsp
|
||||
ret
|
||||
|
||||
ENTRY(efi_call2)
|
||||
subq $40, %rsp
|
||||
/* mov %rdx, %rdx */
|
||||
mov %rsi, %rcx
|
||||
call *%rdi
|
||||
addq $40, %rsp
|
||||
ret
|
||||
|
||||
ENTRY(efi_call3)
|
||||
subq $40, %rsp
|
||||
mov %rcx, %r8
|
||||
/* mov %rdx, %rdx */
|
||||
mov %rsi, %rcx
|
||||
call *%rdi
|
||||
addq $40, %rsp
|
||||
ret
|
||||
|
||||
ENTRY(efi_call4)
|
||||
subq $40, %rsp
|
||||
mov %r8, %r9
|
||||
mov %rcx, %r8
|
||||
/* mov %rdx, %rdx */
|
||||
mov %rsi, %rcx
|
||||
call *%rdi
|
||||
addq $40, %rsp
|
||||
ret
|
||||
|
||||
ENTRY(efi_call5)
|
||||
subq $40, %rsp
|
||||
mov %r9, 32(%rsp)
|
||||
mov %r8, %r9
|
||||
mov %rcx, %r8
|
||||
/* mov %rdx, %rdx */
|
||||
mov %rsi, %rcx
|
||||
call *%rdi
|
||||
addq $40, %rsp
|
||||
ret
|
||||
|
||||
ENTRY(efi_call6)
|
||||
subq $56, %rsp
|
||||
mov 56+8(%rsp), %rax
|
||||
mov %rax, 40(%rsp)
|
||||
mov %r9, 32(%rsp)
|
||||
mov %r8, %r9
|
||||
mov %rcx, %r8
|
||||
/* mov %rdx, %rdx */
|
||||
mov %rsi, %rcx
|
||||
call *%rdi
|
||||
addq $56, %rsp
|
||||
ret
|
||||
|
||||
ENTRY(efi_call7)
|
||||
subq $56, %rsp
|
||||
mov 56+16(%rsp), %rax
|
||||
mov %rax, 48(%rsp)
|
||||
mov 56+8(%rsp), %rax
|
||||
mov %rax, 40(%rsp)
|
||||
mov %r9, 32(%rsp)
|
||||
mov %r8, %r9
|
||||
mov %rcx, %r8
|
||||
/* mov %rdx, %rdx */
|
||||
mov %rsi, %rcx
|
||||
call *%rdi
|
||||
addq $56, %rsp
|
||||
ret
|
||||
|
||||
ENTRY(efi_call8)
|
||||
subq $72, %rsp
|
||||
mov 72+24(%rsp), %rax
|
||||
mov %rax, 56(%rsp)
|
||||
mov 72+16(%rsp), %rax
|
||||
mov %rax, 48(%rsp)
|
||||
mov 72+8(%rsp), %rax
|
||||
mov %rax, 40(%rsp)
|
||||
mov %r9, 32(%rsp)
|
||||
mov %r8, %r9
|
||||
mov %rcx, %r8
|
||||
/* mov %rdx, %rdx */
|
||||
mov %rsi, %rcx
|
||||
call *%rdi
|
||||
addq $72, %rsp
|
||||
ret
|
||||
|
||||
ENTRY(efi_call9)
|
||||
subq $72, %rsp
|
||||
mov 72+32(%rsp), %rax
|
||||
mov %rax, 64(%rsp)
|
||||
mov 72+24(%rsp), %rax
|
||||
mov %rax, 56(%rsp)
|
||||
mov 72+16(%rsp), %rax
|
||||
mov %rax, 48(%rsp)
|
||||
mov 72+8(%rsp), %rax
|
||||
mov %rax, 40(%rsp)
|
||||
mov %r9, 32(%rsp)
|
||||
mov %r8, %r9
|
||||
mov %rcx, %r8
|
||||
/* mov %rdx, %rdx */
|
||||
mov %rsi, %rcx
|
||||
call *%rdi
|
||||
addq $72, %rsp
|
||||
ret
|
||||
|
||||
ENTRY(efi_call10)
|
||||
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 %rdx, %rdx */
|
||||
mov %rsi, %rcx
|
||||
call *%rdi
|
||||
addq $88, %rsp
|
||||
ret
|
||||
|
||||
#endif
|
27
gnu-efi/lib/x86_64/initplat.c
Normal file
27
gnu-efi/lib/x86_64/initplat.c
Normal file
|
@ -0,0 +1,27 @@
|
|||
/*++
|
||||
|
||||
Copyright (c) 1998 Intel Corporation
|
||||
|
||||
Module Name:
|
||||
|
||||
initplat.c
|
||||
|
||||
Abstract:
|
||||
|
||||
|
||||
|
||||
|
||||
Revision History
|
||||
|
||||
--*/
|
||||
|
||||
#include "lib.h"
|
||||
|
||||
VOID
|
||||
InitializeLibPlatform (
|
||||
IN EFI_HANDLE ImageHandle EFI_UNUSED,
|
||||
IN EFI_SYSTEM_TABLE *SystemTable EFI_UNUSED
|
||||
)
|
||||
{
|
||||
}
|
||||
|
181
gnu-efi/lib/x86_64/math.c
Normal file
181
gnu-efi/lib/x86_64/math.c
Normal file
|
@ -0,0 +1,181 @@
|
|||
/*++
|
||||
|
||||
Copyright (c) 1998 Intel Corporation
|
||||
|
||||
Module Name:
|
||||
|
||||
math.c
|
||||
|
||||
Abstract:
|
||||
|
||||
|
||||
|
||||
|
||||
Revision History
|
||||
|
||||
--*/
|
||||
|
||||
#include "lib.h"
|
||||
|
||||
|
||||
//
|
||||
// Declare runtime functions
|
||||
//
|
||||
|
||||
#ifdef RUNTIME_CODE
|
||||
#ifndef __GNUC__
|
||||
#pragma RUNTIME_CODE(LShiftU64)
|
||||
#pragma RUNTIME_CODE(RShiftU64)
|
||||
#pragma RUNTIME_CODE(MultU64x32)
|
||||
#pragma RUNTIME_CODE(DivU64x32)
|
||||
#endif
|
||||
#endif
|
||||
|
||||
//
|
||||
//
|
||||
//
|
||||
|
||||
UINT64
|
||||
LShiftU64 (
|
||||
IN UINT64 Operand,
|
||||
IN UINTN Count
|
||||
)
|
||||
// Left shift 64bit by 32bit and get a 64bit result
|
||||
{
|
||||
#if defined(__GNUC__) || defined(_MSC_EXTENSIONS)
|
||||
return Operand << Count;
|
||||
#else
|
||||
UINT64 Result;
|
||||
_asm {
|
||||
mov eax, dword ptr Operand[0]
|
||||
mov edx, dword ptr Operand[4]
|
||||
mov ecx, Count
|
||||
and ecx, 63
|
||||
|
||||
shld edx, eax, cl
|
||||
shl eax, cl
|
||||
|
||||
cmp ecx, 32
|
||||
jc short ls10
|
||||
|
||||
mov edx, eax
|
||||
xor eax, eax
|
||||
|
||||
ls10:
|
||||
mov dword ptr Result[0], eax
|
||||
mov dword ptr Result[4], edx
|
||||
}
|
||||
|
||||
return Result;
|
||||
#endif
|
||||
}
|
||||
|
||||
UINT64
|
||||
RShiftU64 (
|
||||
IN UINT64 Operand,
|
||||
IN UINTN Count
|
||||
)
|
||||
// Right shift 64bit by 32bit and get a 64bit result
|
||||
{
|
||||
#if defined(__GNUC__) || defined(_MSC_EXTENSIONS)
|
||||
return Operand >> Count;
|
||||
#else
|
||||
UINT64 Result;
|
||||
_asm {
|
||||
mov eax, dword ptr Operand[0]
|
||||
mov edx, dword ptr Operand[4]
|
||||
mov ecx, Count
|
||||
and ecx, 63
|
||||
|
||||
shrd eax, edx, cl
|
||||
shr edx, cl
|
||||
|
||||
cmp ecx, 32
|
||||
jc short rs10
|
||||
|
||||
mov eax, edx
|
||||
xor edx, edx
|
||||
|
||||
rs10:
|
||||
mov dword ptr Result[0], eax
|
||||
mov dword ptr Result[4], edx
|
||||
}
|
||||
|
||||
return Result;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
UINT64
|
||||
MultU64x32 (
|
||||
IN UINT64 Multiplicand,
|
||||
IN UINTN Multiplier
|
||||
)
|
||||
// Multiple 64bit by 32bit and get a 64bit result
|
||||
{
|
||||
#if defined(__GNUC__) || defined(_MSC_EXTENSIONS)
|
||||
return Multiplicand * Multiplier;
|
||||
#else
|
||||
UINT64 Result;
|
||||
_asm {
|
||||
mov eax, dword ptr Multiplicand[0]
|
||||
mul Multiplier
|
||||
mov dword ptr Result[0], eax
|
||||
mov dword ptr Result[4], edx
|
||||
mov eax, dword ptr Multiplicand[4]
|
||||
mul Multiplier
|
||||
add dword ptr Result[4], eax
|
||||
}
|
||||
|
||||
return Result;
|
||||
#endif
|
||||
}
|
||||
|
||||
UINT64
|
||||
DivU64x32 (
|
||||
IN UINT64 Dividend,
|
||||
IN UINTN Divisor,
|
||||
OUT UINTN *Remainder OPTIONAL
|
||||
)
|
||||
// divide 64bit by 32bit and get a 64bit result
|
||||
// N.B. only works for 31bit divisors!!
|
||||
{
|
||||
#if defined(__GNUC__) || defined(_MSC_EXTENSIONS)
|
||||
if (Remainder)
|
||||
*Remainder = Dividend % Divisor;
|
||||
return Dividend / Divisor;
|
||||
#else
|
||||
UINT32 Rem;
|
||||
UINT32 bit;
|
||||
|
||||
ASSERT (Divisor != 0);
|
||||
ASSERT ((Divisor >> 31) == 0);
|
||||
|
||||
//
|
||||
// For each bit in the dividend
|
||||
//
|
||||
|
||||
Rem = 0;
|
||||
for (bit=0; bit < 64; bit++) {
|
||||
_asm {
|
||||
shl dword ptr Dividend[0], 1 ; shift rem:dividend left one
|
||||
rcl dword ptr Dividend[4], 1
|
||||
rcl dword ptr Rem, 1
|
||||
|
||||
mov eax, Rem
|
||||
cmp eax, Divisor ; Is Rem >= Divisor?
|
||||
cmc ; No - do nothing
|
||||
sbb eax, eax ; Else,
|
||||
sub dword ptr Dividend[0], eax ; set low bit in dividen
|
||||
and eax, Divisor ; and
|
||||
sub Rem, eax ; subtract divisor
|
||||
}
|
||||
}
|
||||
|
||||
if (Remainder) {
|
||||
*Remainder = Rem;
|
||||
}
|
||||
|
||||
return Dividend;
|
||||
#endif
|
||||
}
|
41
gnu-efi/lib/x86_64/setjmp.S
Normal file
41
gnu-efi/lib/x86_64/setjmp.S
Normal file
|
@ -0,0 +1,41 @@
|
|||
.text
|
||||
.globl setjmp
|
||||
#ifndef __MINGW32__
|
||||
.type setjmp, @function
|
||||
#else
|
||||
.def setjmp; .scl 2; .type 32; .endef
|
||||
#endif
|
||||
setjmp:
|
||||
pop %rsi
|
||||
movq %rbx,0x00(%rdi)
|
||||
movq %rsp,0x08(%rdi)
|
||||
push %rsi
|
||||
movq %rbp,0x10(%rdi)
|
||||
movq %r12,0x18(%rdi)
|
||||
movq %r13,0x20(%rdi)
|
||||
movq %r14,0x28(%rdi)
|
||||
movq %r15,0x30(%rdi)
|
||||
movq %rsi,0x38(%rdi)
|
||||
xor %rax,%rax
|
||||
ret
|
||||
|
||||
.globl longjmp
|
||||
#ifndef __MINGW32__
|
||||
.type longjmp, @function
|
||||
#else
|
||||
.def longjmp; .scl 2; .type 32; .endef
|
||||
#endif
|
||||
longjmp:
|
||||
movl %esi, %eax
|
||||
movq 0x00(%rdi), %rbx
|
||||
movq 0x08(%rdi), %rsp
|
||||
movq 0x10(%rdi), %rbp
|
||||
movq 0x18(%rdi), %r12
|
||||
movq 0x20(%rdi), %r13
|
||||
movq 0x28(%rdi), %r14
|
||||
movq 0x30(%rdi), %r15
|
||||
xor %rdx,%rdx
|
||||
mov $1,%rcx
|
||||
cmp %rax,%rdx
|
||||
cmove %rcx,%rax
|
||||
jmp *0x38(%rdi)
|
Loading…
Reference in New Issue
Block a user