mirror of https://github.com/acidanthera/audk.git
Fixes for ARM build in the EdkCompatibilityPkg and a couple of Xcode fixes for MdePkg.
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@9520 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
parent
7ee3b61338
commit
1afe0401f4
|
@ -48,6 +48,8 @@ Abstract:
|
|||
#define EFI_IMAGE_MACHINE_IA32 0x014c
|
||||
#define EFI_IMAGE_MACHINE_IA64 0x0200
|
||||
#define EFI_IMAGE_MACHINE_X64 0x8664
|
||||
#define EFI_IMAGE_MACHINE_ARMTHUMB_MIXED 0x01c2
|
||||
|
||||
//
|
||||
// #define EFI_IMAGE_MACHINE_FCODE 0xfc0d
|
||||
//
|
||||
|
|
|
@ -0,0 +1,142 @@
|
|||
/*++
|
||||
|
||||
Copyright (c) 2004 - 2008, Intel Corporation
|
||||
All rights reserved. This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
http://opensource.org/licenses/bsd-license.php
|
||||
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
||||
Module Name:
|
||||
|
||||
EfiBind.h
|
||||
|
||||
Abstract:
|
||||
|
||||
Processor or Compiler specific defines and types for IA-32.
|
||||
We are using the ANSI C 2000 _t type definitions for basic types.
|
||||
This it technically a violation of the coding standard, but they
|
||||
are used to make EfiTypes.h portable. Code other than EfiTypes.h
|
||||
should never use any ANSI C 2000 _t integer types.
|
||||
|
||||
--*/
|
||||
|
||||
#ifndef _EFI_BIND_H_
|
||||
#define _EFI_BIND_H_
|
||||
|
||||
|
||||
#define EFI_DRIVER_ENTRY_POINT(InitFunction)
|
||||
#define EFI_APPLICATION_ENTRY_POINT EFI_DRIVER_ENTRY_POINT
|
||||
|
||||
|
||||
//
|
||||
// Make sure we are useing the correct packing rules per EFI specification
|
||||
//
|
||||
#ifndef __GNUC__
|
||||
#pragma pack()
|
||||
#endif
|
||||
|
||||
|
||||
//
|
||||
// Assume standard IA-32 alignment.
|
||||
// BugBug: Need to check portability of long long
|
||||
//
|
||||
typedef unsigned long long uint64_t;
|
||||
typedef long long int64_t;
|
||||
typedef unsigned int uint32_t;
|
||||
typedef int int32_t;
|
||||
typedef unsigned short uint16_t;
|
||||
typedef short int16_t;
|
||||
typedef unsigned char uint8_t;
|
||||
typedef char int8_t;
|
||||
|
||||
//
|
||||
// Native integer size in stdint.h
|
||||
//
|
||||
typedef uint32_t uintn_t;
|
||||
typedef int32_t intn_t;
|
||||
|
||||
//
|
||||
// Processor specific defines
|
||||
//
|
||||
#define EFI_MAX_BIT 0x80000000
|
||||
#define MAX_2_BITS 0xC0000000
|
||||
|
||||
//
|
||||
// Maximum legal IA-32 address
|
||||
//
|
||||
#define EFI_MAX_ADDRESS 0xFFFFFFFF
|
||||
|
||||
//
|
||||
// Bad pointer value to use in check builds.
|
||||
// if you see this value you are using uninitialized or free'ed data
|
||||
//
|
||||
#define EFI_BAD_POINTER 0xAFAFAFAF
|
||||
#define EFI_BAD_POINTER_AS_BYTE 0xAF
|
||||
|
||||
#define EFI_DEADLOOP() { volatile UINTN __iii; __iii = 1; while (__iii); }
|
||||
|
||||
//
|
||||
// Inject a break point in the code to assist debugging for NT Emulation Environment
|
||||
// For real hardware, just put in a halt loop. Don't do a while(1) because the
|
||||
// compiler will optimize away the rest of the function following, so that you run out in
|
||||
// the weeds if you skip over it with a debugger.
|
||||
//
|
||||
#define EFI_BREAKPOINT EFI_DEADLOOP()
|
||||
|
||||
|
||||
//
|
||||
// Memory Fence forces serialization, and is needed to support out of order
|
||||
// memory transactions. The Memory Fence is mainly used to make sure IO
|
||||
// transactions complete in a deterministic sequence, and to syncronize locks
|
||||
// an other MP code. Currently no memory fencing is required.
|
||||
//
|
||||
#define MEMORY_FENCE()
|
||||
|
||||
//
|
||||
// Some compilers don't support the forward reference construct:
|
||||
// typedef struct XXXXX. The forward reference is required for
|
||||
// ANSI compatibility.
|
||||
//
|
||||
// The following macro provide a workaround for such cases.
|
||||
//
|
||||
|
||||
|
||||
#ifdef EFI_NO_INTERFACE_DECL
|
||||
#define EFI_FORWARD_DECLARATION(x)
|
||||
#else
|
||||
#define EFI_FORWARD_DECLARATION(x) typedef struct _##x x
|
||||
#endif
|
||||
|
||||
|
||||
//
|
||||
// Some C compilers optimize the calling conventions to increase performance.
|
||||
// _EFIAPI is used to make all public APIs follow the standard C calling
|
||||
// convention.
|
||||
//
|
||||
#define _EFIAPI
|
||||
|
||||
|
||||
|
||||
//
|
||||
// For symbol name in GNU assembly code, an extra "_" is necessary
|
||||
//
|
||||
#if defined(__GNUC__)
|
||||
///
|
||||
/// Private worker functions for ASM_PFX()
|
||||
///
|
||||
#define _CONCATENATE(a, b) __CONCATENATE(a, b)
|
||||
#define __CONCATENATE(a, b) a ## b
|
||||
|
||||
///
|
||||
/// The __USER_LABEL_PREFIX__ macro predefined by GNUC represents the prefix
|
||||
/// on symbols in assembly language.
|
||||
///
|
||||
#define ASM_PFX(name) _CONCATENATE (__USER_LABEL_PREFIX__, name)
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
|
@ -0,0 +1,38 @@
|
|||
/*++
|
||||
|
||||
Copyright (c) 2004 - 2006, Intel Corporation
|
||||
All rights reserved. This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
http://opensource.org/licenses/bsd-license.php
|
||||
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
||||
Module Name:
|
||||
|
||||
EfiPeOptionalHeader.h
|
||||
|
||||
Abstract:
|
||||
Defines the optional header in the PE image per the PE specification. This
|
||||
file must be included only from within EfiImage.h since
|
||||
EFI_IMAGE_DATA_DIRECTORY and EFI_IMAGE_NUMBER_OF_DIRECTORY_ENTRIES are defined
|
||||
there.
|
||||
|
||||
--*/
|
||||
|
||||
#ifndef _EFI_PE_OPTIONAL_HEADER_H_
|
||||
#define _EFI_PE_OPTIONAL_HEADER_H_
|
||||
|
||||
#define EFI_IMAGE_MACHINE_TYPE (EFI_IMAGE_MACHINE_ARMTHUMB_MIXED)
|
||||
|
||||
#define EFI_IMAGE_MACHINE_TYPE_SUPPORTED(Machine) \
|
||||
(((Machine) == EFI_IMAGE_MACHINE_ARMTHUMB_MIXED) || ((Machine) == EFI_IMAGE_MACHINE_EBC))
|
||||
|
||||
#define EFI_IMAGE_MACHINE_CROSS_TYPE_SUPPORTED(Machine) (FALSE)
|
||||
|
||||
#define EFI_IMAGE_NT_OPTIONAL_HDR_MAGIC EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC
|
||||
typedef EFI_IMAGE_OPTIONAL_HEADER32 EFI_IMAGE_OPTIONAL_HEADER;
|
||||
typedef EFI_IMAGE_NT_HEADERS32 EFI_IMAGE_NT_HEADERS;
|
||||
|
||||
#endif
|
|
@ -0,0 +1,31 @@
|
|||
/*++
|
||||
|
||||
Copyright (c) 2004 - 2006, Intel Corporation
|
||||
All rights reserved. This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
http://opensource.org/licenses/bsd-license.php
|
||||
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
||||
Module Name:
|
||||
|
||||
TianoBind.h
|
||||
|
||||
Abstract:
|
||||
|
||||
Tiano's Processor or Compiler specific defines and types for IA-32
|
||||
besides EfiBind.h.
|
||||
|
||||
--*/
|
||||
|
||||
#ifndef _TIANO_BIND_H_
|
||||
#define _TIANO_BIND_H_
|
||||
|
||||
#include <EfiBind.h>
|
||||
|
||||
#define EFI_DXE_ENTRY_POINT(InitFunction)
|
||||
#define EFI_SMI_HANDLER_ENTRY_POINT(InitFunction)
|
||||
|
||||
#endif
|
|
@ -60,7 +60,32 @@ Abstract:
|
|||
|
||||
#define _EFI_INT_SIZE_OF(n) ((sizeof (n) + sizeof (UINTN) - 1) &~(sizeof (UINTN) - 1))
|
||||
|
||||
#if defined(__GNUC__)
|
||||
#if defined(__CC_ARM)
|
||||
//
|
||||
// RVCT ARM variable argument list support.
|
||||
//
|
||||
|
||||
///
|
||||
/// Variable used to traverse the list of arguments. This type can vary by
|
||||
/// implementation and could be an array or structure.
|
||||
///
|
||||
#ifdef __APCS_ADSABI
|
||||
typedef int *va_list[1];
|
||||
#define VA_LIST va_list
|
||||
#else
|
||||
typedef struct __va_list { void *__ap; } va_list;
|
||||
#define VA_LIST va_list
|
||||
#endif
|
||||
|
||||
#define VA_START(Marker, Parameter) __va_start(Marker, Parameter)
|
||||
|
||||
#define VA_ARG(Marker, TYPE) __va_arg(Marker, TYPE)
|
||||
|
||||
#define VA_END(Marker) ((void)0)
|
||||
|
||||
#define VA_COPY(Dest, Start) __va_copy (Dest, Start)
|
||||
|
||||
#elif defined(__GNUC__)
|
||||
//
|
||||
// Use GCC built-in macros for variable argument lists.
|
||||
//
|
||||
|
@ -77,6 +102,8 @@ typedef __builtin_va_list VA_LIST;
|
|||
|
||||
#define VA_END(Marker) __builtin_va_end (Marker)
|
||||
|
||||
#define VA_COPY(Dest, Start) __builtin_va_copy (Dest, Start)
|
||||
|
||||
#else
|
||||
|
||||
//
|
||||
|
@ -88,6 +115,7 @@ typedef CHAR8 *VA_LIST;
|
|||
#define VA_START(ap, v) (ap = (VA_LIST) & (v) + _EFI_INT_SIZE_OF (v))
|
||||
#define VA_ARG(ap, t) (*(t *) ((ap += _EFI_INT_SIZE_OF (t)) - _EFI_INT_SIZE_OF (t)))
|
||||
#define VA_END(ap) (ap = (VA_LIST) 0)
|
||||
#define VA_COPY(dest, src) ((void)((dest) = (src)))
|
||||
|
||||
#endif
|
||||
|
||||
|
|
|
@ -30,7 +30,7 @@ Abstract:
|
|||
VOID *
|
||||
memset (
|
||||
OUT VOID *Dest,
|
||||
IN UINTN Char,
|
||||
IN int Char,
|
||||
IN UINTN Count
|
||||
)
|
||||
{
|
||||
|
|
|
@ -123,6 +123,6 @@ typedef INT32 INTN;
|
|||
@return The pointer to the first instruction of a function given a function pointer.
|
||||
|
||||
**/
|
||||
#define FUNCTION_ENTRY_POINT(FunctionPointer) (FunctionPointer)
|
||||
#define FUNCTION_ENTRY_POINT(FunctionPointer) (VOID *)(UINTN)(FunctionPointer)
|
||||
|
||||
#endif
|
||||
|
|
|
@ -34,5 +34,5 @@ ASM_GLOBAL ASM_PFX(AsmMwait)
|
|||
ASM_PFX(AsmMwait):
|
||||
mov %ecx,%eax
|
||||
mov %edx,%ecx
|
||||
mwait %rax,%rcx
|
||||
mwait %eax,%ecx
|
||||
ret
|
||||
|
|
|
@ -30,23 +30,23 @@ ASM_GLOBAL ASM_PFX(mTransition)
|
|||
ASM_GLOBAL ASM_PFX(InternalAsmThunk16)
|
||||
|
||||
# define the structure of IA32_REGS
|
||||
.equ _EDI, 0 #size 4
|
||||
.equ _ESI, 4 #size 4
|
||||
.equ _EBP, 8 #size 4
|
||||
.equ _ESP, 12 #size 4
|
||||
.equ _EBX, 16 #size 4
|
||||
.equ _EDX, 20 #size 4
|
||||
.equ _ECX, 24 #size 4
|
||||
.equ _EAX, 28 #size 4
|
||||
.equ _DS, 32 #size 2
|
||||
.equ _ES, 34 #size 2
|
||||
.equ _FS, 36 #size 2
|
||||
.equ _GS, 38 #size 2
|
||||
.equ _EFLAGS, 40 #size 8
|
||||
.equ _EIP, 48 #size 4
|
||||
.equ _CS, 52 #size 2
|
||||
.equ _SS, 54 #size 2
|
||||
.equ IA32_REGS_SIZE, 56
|
||||
.set _EDI, 0 #size 4
|
||||
.set _ESI, 4 #size 4
|
||||
.set _EBP, 8 #size 4
|
||||
.set _ESP, 12 #size 4
|
||||
.set _EBX, 16 #size 4
|
||||
.set _EDX, 20 #size 4
|
||||
.set _ECX, 24 #size 4
|
||||
.set _EAX, 28 #size 4
|
||||
.set _DS, 32 #size 2
|
||||
.set _ES, 34 #size 2
|
||||
.set _FS, 36 #size 2
|
||||
.set _GS, 38 #size 2
|
||||
.set _EFLAGS, 40 #size 8
|
||||
.set _EIP, 48 #size 4
|
||||
.set _CS, 52 #size 2
|
||||
.set _SS, 54 #size 2
|
||||
.set IA32_REGS_SIZE, 56
|
||||
|
||||
.data
|
||||
|
||||
|
@ -167,7 +167,7 @@ ASM_PFX(ToUserCode):
|
|||
movl $0xc0000080,%ecx
|
||||
movq %rax, %cr0
|
||||
rdmsr
|
||||
andb $0b11111110, %ah
|
||||
andb $0xfe, %ah # $0b11111110
|
||||
wrmsr
|
||||
movq %rbp, %cr4
|
||||
movl %esi,%ss # set up 16-bit stack segment
|
||||
|
@ -193,9 +193,9 @@ L_RealMode:
|
|||
.byte 0x66 # make the following retf 32-bit
|
||||
lret # transfer control to user code
|
||||
|
||||
.equ CODE16, ASM_PFX(_16Code) - .
|
||||
.equ DATA16, ASM_PFX(_16Data) - .
|
||||
.equ DATA32, ASM_PFX(_32Data) - .
|
||||
.set CODE16, ASM_PFX(_16Code) - .
|
||||
.set DATA16, ASM_PFX(_16Data) - .
|
||||
.set DATA32, ASM_PFX(_32Data) - .
|
||||
|
||||
ASM_PFX(NullSeg): .quad 0
|
||||
ASM_PFX(_16Code):
|
||||
|
@ -220,7 +220,7 @@ ASM_PFX(_32Data):
|
|||
.byte 0xcf # 16-bit segment, 4GB limit
|
||||
.byte 0
|
||||
|
||||
.equ GDT_SIZE, . - ASM_PFX(NullSeg)
|
||||
.set GDT_SIZE, . - ASM_PFX(NullSeg)
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# IA32_REGISTER_SET *
|
||||
|
@ -238,11 +238,11 @@ ASM_PFX(InternalAsmThunk16):
|
|||
pushq %rsi
|
||||
pushq %rdi
|
||||
|
||||
movq %ds, %rbx
|
||||
movl %ds, %ebx
|
||||
pushq %rbx # Save ds segment register on the stack
|
||||
movq %es, %rbx
|
||||
movl %es, %ebx
|
||||
pushq %rbx # Save es segment register on the stack
|
||||
movq %ss, %rbx
|
||||
movl %ss, %ebx
|
||||
pushq %rbx # Save ss segment register on the stack
|
||||
|
||||
.byte 0x0f, 0xa0 #push fs
|
||||
|
@ -267,7 +267,7 @@ ASM_PFX(InternalAsmThunk16):
|
|||
sgdt 0x60(%rsp) # save GDT stack in argument space
|
||||
movzwq 0x60(%rsp), %r10 # r10 <- GDT limit
|
||||
lea ((ASM_PFX(InternalAsmThunk16) - SavedCr4) + 0xf)(%rcx), %r11
|
||||
andq $0xfffffff0, %r11 # r11 <- 16-byte aligned shadowed GDT table in real mode buffer
|
||||
andq $0xfffffffffffffff0, %r11 # r11 <- 16-byte aligned shadowed GDT table in real mode buffer
|
||||
|
||||
movw %r10w, (SavedGdt - SavedCr4)(%rcx) # save the limit of shadowed GDT table
|
||||
movq %r11, (SavedGdt - SavedCr4 + 0x2)(%rcx) # save the base address of shadowed GDT table
|
||||
|
@ -311,11 +311,11 @@ L_RetFromRealMode:
|
|||
.byte 0x0f, 0xa1 # pop fs
|
||||
|
||||
popq %rbx
|
||||
movq %rbx, %ss
|
||||
movl %ebx, %ss
|
||||
popq %rbx
|
||||
movq %rbx, %es
|
||||
movl %ebx, %es
|
||||
popq %rbx
|
||||
movq %rbx, %ds
|
||||
movl %ebx, %ds
|
||||
|
||||
popq %rdi
|
||||
popq %rsi
|
||||
|
|
Loading…
Reference in New Issue