Shuffle headers
More preparing for UEFI.
This commit is contained in:
parent
87acb5463b
commit
272d98f42e
|
@ -1,161 +0,0 @@
|
||||||
#pragma once
|
|
||||||
#include <stddef.h>
|
|
||||||
#include <stdint.h>
|
|
||||||
|
|
||||||
void gdt_set_gate(int, uint32_t, uint32_t, uint8_t, uint8_t);
|
|
||||||
void gdt_install();
|
|
||||||
|
|
||||||
struct gdt_item {
|
|
||||||
uint16_t low_limit;
|
|
||||||
uint16_t low_base;
|
|
||||||
uint8_t middle_base;
|
|
||||||
uint8_t access;
|
|
||||||
uint8_t granular;
|
|
||||||
uint8_t high_base;
|
|
||||||
} __attribute__((packed)); //Prevent compiler optimisation by packing
|
|
||||||
|
|
||||||
struct gdt_ptr {
|
|
||||||
uint16_t limit;
|
|
||||||
unsigned int base;
|
|
||||||
} __attribute__((packed));
|
|
||||||
|
|
||||||
struct gdt_item gdt[3]; //3-entry gdt
|
|
||||||
struct gdt_ptr gp;
|
|
||||||
|
|
||||||
extern void load_gdt();
|
|
||||||
|
|
||||||
void idt_set_gate(unsigned char, unsigned long, unsigned short, unsigned char);
|
|
||||||
void idt_install();
|
|
||||||
|
|
||||||
struct idt_entry {
|
|
||||||
unsigned short base_low;
|
|
||||||
unsigned short selector;
|
|
||||||
unsigned char always0;
|
|
||||||
unsigned char flags;
|
|
||||||
unsigned short base_high;
|
|
||||||
} __attribute__((packed));
|
|
||||||
|
|
||||||
struct idt_ptr {
|
|
||||||
unsigned short limit;
|
|
||||||
unsigned int base;
|
|
||||||
}__attribute__((packed));
|
|
||||||
|
|
||||||
struct idt_entry idt[256]; //interrupt table of 256 entries
|
|
||||||
struct idt_ptr idtp; //pointer to idt table
|
|
||||||
|
|
||||||
struct int_frame {
|
|
||||||
void (*eip) (void);
|
|
||||||
uint16_t cs, :16;
|
|
||||||
uint32_t eflags;
|
|
||||||
void* esp;
|
|
||||||
uint16_t ss, :16;
|
|
||||||
} __attribute__((packed));
|
|
||||||
|
|
||||||
void isr_common(struct int_frame*, size_t);
|
|
||||||
|
|
||||||
void isr_error_common(struct int_frame*, size_t, size_t);
|
|
||||||
|
|
||||||
void irq_common(struct int_frame*, size_t);
|
|
||||||
|
|
||||||
extern void idt_load();
|
|
||||||
|
|
||||||
//These are all reserved by Intel, and need to be here.
|
|
||||||
extern void isr0();
|
|
||||||
extern void isr1();
|
|
||||||
extern void isr2();
|
|
||||||
extern void isr3();
|
|
||||||
extern void isr4();
|
|
||||||
extern void isr5();
|
|
||||||
extern void isr6();
|
|
||||||
extern void isr7();
|
|
||||||
extern void isr8();
|
|
||||||
extern void isr9();
|
|
||||||
extern void isr10();
|
|
||||||
extern void isr11();
|
|
||||||
extern void isr12();
|
|
||||||
extern void isr13();
|
|
||||||
extern void isr14();
|
|
||||||
extern void isr15();
|
|
||||||
extern void isr16();
|
|
||||||
extern void isr17();
|
|
||||||
extern void isr18();
|
|
||||||
extern void isr19();
|
|
||||||
extern void isr20();
|
|
||||||
extern void isr21();
|
|
||||||
extern void isr22();
|
|
||||||
extern void isr23();
|
|
||||||
extern void isr24();
|
|
||||||
extern void isr25();
|
|
||||||
extern void isr26();
|
|
||||||
extern void isr27();
|
|
||||||
extern void isr28();
|
|
||||||
extern void isr29();
|
|
||||||
extern void isr30();
|
|
||||||
extern void isr31();
|
|
||||||
|
|
||||||
extern void irq0();
|
|
||||||
extern void irq1();
|
|
||||||
extern void irq2();
|
|
||||||
extern void irq3();
|
|
||||||
extern void irq4();
|
|
||||||
extern void irq5();
|
|
||||||
extern void irq6();
|
|
||||||
extern void irq7();
|
|
||||||
extern void irq8();
|
|
||||||
extern void irq9();
|
|
||||||
extern void irq10();
|
|
||||||
extern void irq11();
|
|
||||||
extern void irq12();
|
|
||||||
extern void irq13();
|
|
||||||
extern void irq14();
|
|
||||||
extern void irq15();
|
|
||||||
|
|
||||||
static void* irq_routines[16] = {
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0
|
|
||||||
};
|
|
||||||
|
|
||||||
void irq_install_handler(int irq, void (*handler)(struct int_frame* r));
|
|
||||||
|
|
||||||
void irq_uninstall_handler(int);
|
|
||||||
|
|
||||||
void irq_install();
|
|
||||||
|
|
||||||
void irq_remap();
|
|
||||||
|
|
||||||
void timer_install();
|
|
||||||
|
|
||||||
static const char* exception_messages[] = {
|
|
||||||
"Division by Zero",
|
|
||||||
"Debug",
|
|
||||||
"Non Maskable Interrupt",
|
|
||||||
"Breakpoint",
|
|
||||||
"Into Detected Overflow",
|
|
||||||
"Out of Bounds",
|
|
||||||
"Invalid Opcode",
|
|
||||||
"No Coprocessor",
|
|
||||||
"Double Fault",
|
|
||||||
"Coprocessor Segment Overrun",
|
|
||||||
"Bad TSS",
|
|
||||||
"Segment Not Present",
|
|
||||||
"Stack Fault",
|
|
||||||
"General Protection Fault",
|
|
||||||
"Page Fault",
|
|
||||||
"Unknown Interrupt",
|
|
||||||
"Coprocessor Fault",
|
|
||||||
"Alignment Check",
|
|
||||||
"Machine Check",
|
|
||||||
"Reserved",
|
|
||||||
"Reserved",
|
|
||||||
"Reserved",
|
|
||||||
"Reserved",
|
|
||||||
"Reserved",
|
|
||||||
"Reserved",
|
|
||||||
"Reserved",
|
|
||||||
"Reserved",
|
|
||||||
"Reserved",
|
|
||||||
"Reserved",
|
|
||||||
"Reserved",
|
|
||||||
"Reserved",
|
|
||||||
"Reserved"
|
|
||||||
};
|
|
390
include/reqs/efibind.h
Normal file
390
include/reqs/efibind.h
Normal file
|
@ -0,0 +1,390 @@
|
||||||
|
/*++
|
||||||
|
|
||||||
|
Copyright (c) 1998 Intel Corporation
|
||||||
|
|
||||||
|
Module Name:
|
||||||
|
|
||||||
|
efefind.h
|
||||||
|
|
||||||
|
Abstract:
|
||||||
|
|
||||||
|
EFI to compile bindings
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Revision History
|
||||||
|
|
||||||
|
--*/
|
||||||
|
#ifndef X86_64_EFI_BIND
|
||||||
|
#define X86_64_EFI_BIND
|
||||||
|
#ifndef __GNUC__
|
||||||
|
#pragma pack()
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(GNU_EFI_USE_MS_ABI)
|
||||||
|
#if (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 7)))||(defined(__clang__) && (__clang_major__ > 3 || (__clang_major__ == 3 && __clang_minor__ >= 2)))
|
||||||
|
#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
|
||||||
|
//
|
||||||
|
|
||||||
|
#if !defined(__STDC_VERSION__) || (__STDC_VERSION__ < 199901L )
|
||||||
|
|
||||||
|
// No ANSI C 1999/2000 stdint.h integer width declarations
|
||||||
|
|
||||||
|
#if defined(_MSC_EXTENSIONS)
|
||||||
|
|
||||||
|
// Use Microsoft C compiler integer width declarations
|
||||||
|
|
||||||
|
typedef unsigned __int64 uint64_t;
|
||||||
|
typedef __int64 int64_t;
|
||||||
|
typedef unsigned __int32 uint32_t;
|
||||||
|
typedef __int32 int32_t;
|
||||||
|
typedef unsigned short uint16_t;
|
||||||
|
typedef short int16_t;
|
||||||
|
typedef unsigned char uint8_t;
|
||||||
|
typedef char int8_t;
|
||||||
|
#elif defined(__GNUC__)
|
||||||
|
typedef int __attribute__((__mode__(__DI__))) int64_t;
|
||||||
|
typedef unsigned int __attribute__((__mode__(__DI__))) uint64_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 signed char int8_t;
|
||||||
|
#elif defined(UNIX_LP64)
|
||||||
|
|
||||||
|
/* Use LP64 programming model from C_FLAGS for integer width declarations */
|
||||||
|
|
||||||
|
typedef unsigned long uint64_t;
|
||||||
|
typedef 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;
|
||||||
|
#else
|
||||||
|
|
||||||
|
/* Assume P64 programming model from C_FLAGS for integer width declarations */
|
||||||
|
|
||||||
|
typedef unsigned long long uint64_t __attribute__((aligned (8)));
|
||||||
|
typedef long long int64_t __attribute__((aligned (8)));
|
||||||
|
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;
|
||||||
|
#endif
|
||||||
|
#elif defined(__GNUC__)
|
||||||
|
#include <stdint.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//
|
||||||
|
// Basic EFI types of various widths
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef __WCHAR_TYPE__
|
||||||
|
# define __WCHAR_TYPE__ short
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef uint64_t UINT64;
|
||||||
|
typedef int64_t INT64;
|
||||||
|
|
||||||
|
#ifndef _BASETSD_H_
|
||||||
|
typedef uint32_t UINT32;
|
||||||
|
typedef int32_t INT32;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef uint16_t UINT16;
|
||||||
|
typedef int16_t INT16;
|
||||||
|
typedef uint8_t UINT8;
|
||||||
|
typedef int8_t INT8;
|
||||||
|
typedef __WCHAR_TYPE__ WCHAR;
|
||||||
|
|
||||||
|
#undef VOID
|
||||||
|
#define VOID void
|
||||||
|
|
||||||
|
|
||||||
|
typedef int64_t INTN;
|
||||||
|
typedef uint64_t UINTN;
|
||||||
|
|
||||||
|
#ifdef EFI_NT_EMULATOR
|
||||||
|
#define POST_CODE(_Data)
|
||||||
|
#else
|
||||||
|
#ifdef EFI_DEBUG
|
||||||
|
#define POST_CODE(_Data) __asm mov eax,(_Data) __asm out 0x80,al
|
||||||
|
#else
|
||||||
|
#define POST_CODE(_Data)
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define EFIERR(a) (0x8000000000000000 | a)
|
||||||
|
#define EFI_ERROR_MASK 0x8000000000000000
|
||||||
|
#define EFIERR_OEM(a) (0xc000000000000000 | a)
|
||||||
|
|
||||||
|
|
||||||
|
#define BAD_POINTER 0xFBFBFBFBFBFBFBFB
|
||||||
|
#define MAX_ADDRESS 0xFFFFFFFFFFFFFFFF
|
||||||
|
|
||||||
|
#ifdef EFI_NT_EMULATOR
|
||||||
|
#define BREAKPOINT() __asm { int 3 }
|
||||||
|
#else
|
||||||
|
#define BREAKPOINT() while (TRUE); // Make it hang on Bios[Dbg]32
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//
|
||||||
|
// Pointers must be aligned to these address to function
|
||||||
|
//
|
||||||
|
|
||||||
|
#define MIN_ALIGNMENT_SIZE 4
|
||||||
|
|
||||||
|
#define ALIGN_VARIABLE(Value ,Adjustment) \
|
||||||
|
(UINTN)Adjustment = 0; \
|
||||||
|
if((UINTN)Value % MIN_ALIGNMENT_SIZE) \
|
||||||
|
(UINTN)Adjustment = MIN_ALIGNMENT_SIZE - ((UINTN)Value % MIN_ALIGNMENT_SIZE); \
|
||||||
|
Value = (UINTN)Value + (UINTN)Adjustment
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// Define macros to build data structure signatures from characters.
|
||||||
|
//
|
||||||
|
|
||||||
|
#define EFI_SIGNATURE_16(A,B) ((A) | (B<<8))
|
||||||
|
#define EFI_SIGNATURE_32(A,B,C,D) (EFI_SIGNATURE_16(A,B) | (EFI_SIGNATURE_16(C,D) << 16))
|
||||||
|
#define EFI_SIGNATURE_64(A,B,C,D,E,F,G,H) (EFI_SIGNATURE_32(A,B,C,D) | ((UINT64)(EFI_SIGNATURE_32(E,F,G,H)) << 32))
|
||||||
|
//
|
||||||
|
// To export & import functions in the EFI emulator environment
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifdef EFI_NT_EMULATOR
|
||||||
|
#define EXPORTAPI __declspec( dllexport )
|
||||||
|
#else
|
||||||
|
#define EXPORTAPI
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// EFIAPI - prototype calling convention for EFI function pointers
|
||||||
|
// BOOTSERVICE - prototype for implementation of a boot service interface
|
||||||
|
// RUNTIMESERVICE - prototype for implementation of a runtime service interface
|
||||||
|
// RUNTIMEFUNCTION - prototype for implementation of a runtime function that is not a service
|
||||||
|
// RUNTIME_CODE - pragma macro for declaring runtime code
|
||||||
|
//
|
||||||
|
|
||||||
|
#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
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define BOOTSERVICE
|
||||||
|
//#define RUNTIMESERVICE(proto,a) alloc_text("rtcode",a); proto a
|
||||||
|
//#define RUNTIMEFUNCTION(proto,a) alloc_text("rtcode",a); proto a
|
||||||
|
#define RUNTIMESERVICE
|
||||||
|
#define RUNTIMEFUNCTION
|
||||||
|
|
||||||
|
|
||||||
|
#define RUNTIME_CODE(a) alloc_text("rtcode", a)
|
||||||
|
#define BEGIN_RUNTIME_DATA() data_seg("rtdata")
|
||||||
|
#define END_RUNTIME_DATA() data_seg("")
|
||||||
|
|
||||||
|
#define VOLATILE volatile
|
||||||
|
|
||||||
|
#define MEMORY_FENCE()
|
||||||
|
|
||||||
|
#ifdef EFI_NT_EMULATOR
|
||||||
|
|
||||||
|
//
|
||||||
|
// To help ensure proper coding of integrated drivers, they are
|
||||||
|
// compiled as DLLs. In NT they require a dll init entry pointer.
|
||||||
|
// The macro puts a stub entry point into the DLL so it will load.
|
||||||
|
//
|
||||||
|
|
||||||
|
#define EFI_DRIVER_ENTRY_POINT(InitFunction) \
|
||||||
|
UINTN \
|
||||||
|
__stdcall \
|
||||||
|
_DllMainCRTStartup ( \
|
||||||
|
UINTN Inst, \
|
||||||
|
UINTN reason_for_call, \
|
||||||
|
VOID *rserved \
|
||||||
|
) \
|
||||||
|
{ \
|
||||||
|
return 1; \
|
||||||
|
} \
|
||||||
|
\
|
||||||
|
int \
|
||||||
|
EXPORTAPI \
|
||||||
|
__cdecl \
|
||||||
|
InitializeDriver ( \
|
||||||
|
void *ImageHandle, \
|
||||||
|
void *SystemTable \
|
||||||
|
) \
|
||||||
|
{ \
|
||||||
|
return InitFunction(ImageHandle, SystemTable); \
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#define LOAD_INTERNAL_DRIVER(_if, type, name, entry) \
|
||||||
|
(_if)->LoadInternal(type, name, NULL)
|
||||||
|
|
||||||
|
#else // EFI_NT_EMULATOR
|
||||||
|
|
||||||
|
//
|
||||||
|
// When build similiar to FW, then link everything together as
|
||||||
|
// one big module. For the MSVC toolchain, we simply tell the
|
||||||
|
// linker what our driver init function is using /ENTRY.
|
||||||
|
//
|
||||||
|
#if defined(_MSC_EXTENSIONS)
|
||||||
|
#define EFI_DRIVER_ENTRY_POINT(InitFunction) \
|
||||||
|
__pragma(comment(linker, "/ENTRY:" # InitFunction))
|
||||||
|
#else
|
||||||
|
#define EFI_DRIVER_ENTRY_POINT(InitFunction) \
|
||||||
|
UINTN \
|
||||||
|
InitializeDriver ( \
|
||||||
|
VOID *ImageHandle, \
|
||||||
|
VOID *SystemTable \
|
||||||
|
) \
|
||||||
|
{ \
|
||||||
|
return InitFunction(ImageHandle, \
|
||||||
|
SystemTable); \
|
||||||
|
} \
|
||||||
|
\
|
||||||
|
EFI_STATUS efi_main( \
|
||||||
|
EFI_HANDLE image, \
|
||||||
|
EFI_SYSTEM_TABLE *systab \
|
||||||
|
) __attribute__((weak, \
|
||||||
|
alias ("InitializeDriver")));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define LOAD_INTERNAL_DRIVER(_if, type, name, entry) \
|
||||||
|
(_if)->LoadInternal(type, name, entry)
|
||||||
|
|
||||||
|
#endif // EFI_NT_EMULATOR
|
||||||
|
|
||||||
|
//
|
||||||
|
// Some compilers don't support the forward reference construct:
|
||||||
|
// typedef struct XXXXX
|
||||||
|
//
|
||||||
|
// The following macro provide a workaround for such cases.
|
||||||
|
//
|
||||||
|
#ifdef NO_INTERFACE_DECL
|
||||||
|
#define INTERFACE_DECL(x)
|
||||||
|
#else
|
||||||
|
#if defined(__GNUC__) || defined(_MSC_EXTENSIONS)
|
||||||
|
#define INTERFACE_DECL(x) struct x
|
||||||
|
#else
|
||||||
|
#define INTERFACE_DECL(x) typedef struct x
|
||||||
|
#endif
|
||||||
|
#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
|
||||||
|
/*
|
||||||
|
Credits for macro-magic:
|
||||||
|
https://groups.google.com/forum/?fromgroups#!topic/comp.std.c/d-6Mj5Lko_s
|
||||||
|
http://efesx.com/2010/08/31/overloading-macros/
|
||||||
|
*/
|
||||||
|
#define __VA_NARG__(...) \
|
||||||
|
__VA_NARG_(_0, ## __VA_ARGS__, __RSEQ_N())
|
||||||
|
#define __VA_NARG_(...) \
|
||||||
|
__VA_ARG_N(__VA_ARGS__)
|
||||||
|
#define __VA_ARG_N( \
|
||||||
|
_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,N,...) N
|
||||||
|
#define __RSEQ_N() \
|
||||||
|
10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0
|
||||||
|
|
||||||
|
#define __VA_ARG_NSUFFIX__(prefix,...) \
|
||||||
|
__VA_ARG_NSUFFIX_N(prefix, __VA_NARG__(__VA_ARGS__))
|
||||||
|
#define __VA_ARG_NSUFFIX_N(prefix,nargs) \
|
||||||
|
__VA_ARG_NSUFFIX_N_(prefix, nargs)
|
||||||
|
#define __VA_ARG_NSUFFIX_N_(prefix,nargs) \
|
||||||
|
prefix ## nargs
|
||||||
|
|
||||||
|
/* Prototypes of EFI cdecl -> stdcall trampolines */
|
||||||
|
UINT64 efi_call0(void *func);
|
||||||
|
UINT64 efi_call1(void *func, UINT64 arg1);
|
||||||
|
UINT64 efi_call2(void *func, UINT64 arg1, UINT64 arg2);
|
||||||
|
UINT64 efi_call3(void *func, UINT64 arg1, UINT64 arg2, UINT64 arg3);
|
||||||
|
UINT64 efi_call4(void *func, UINT64 arg1, UINT64 arg2, UINT64 arg3,
|
||||||
|
UINT64 arg4);
|
||||||
|
UINT64 efi_call5(void *func, UINT64 arg1, UINT64 arg2, UINT64 arg3,
|
||||||
|
UINT64 arg4, UINT64 arg5);
|
||||||
|
UINT64 efi_call6(void *func, UINT64 arg1, UINT64 arg2, UINT64 arg3,
|
||||||
|
UINT64 arg4, UINT64 arg5, UINT64 arg6);
|
||||||
|
UINT64 efi_call7(void *func, UINT64 arg1, UINT64 arg2, UINT64 arg3,
|
||||||
|
UINT64 arg4, UINT64 arg5, UINT64 arg6, UINT64 arg7);
|
||||||
|
UINT64 efi_call8(void *func, UINT64 arg1, UINT64 arg2, UINT64 arg3,
|
||||||
|
UINT64 arg4, UINT64 arg5, UINT64 arg6, UINT64 arg7,
|
||||||
|
UINT64 arg8);
|
||||||
|
UINT64 efi_call9(void *func, UINT64 arg1, UINT64 arg2, UINT64 arg3,
|
||||||
|
UINT64 arg4, UINT64 arg5, UINT64 arg6, UINT64 arg7,
|
||||||
|
UINT64 arg8, UINT64 arg9);
|
||||||
|
UINT64 efi_call10(void *func, UINT64 arg1, UINT64 arg2, UINT64 arg3,
|
||||||
|
UINT64 arg4, UINT64 arg5, UINT64 arg6, UINT64 arg7,
|
||||||
|
UINT64 arg8, UINT64 arg9, UINT64 arg10);
|
||||||
|
|
||||||
|
/* Front-ends to efi_callX to avoid compiler warnings */
|
||||||
|
#define _cast64_efi_call0(f) \
|
||||||
|
efi_call0(f)
|
||||||
|
#define _cast64_efi_call1(f,a1) \
|
||||||
|
efi_call1(f, (UINT64)(a1))
|
||||||
|
#define _cast64_efi_call2(f,a1,a2) \
|
||||||
|
efi_call2(f, (UINT64)(a1), (UINT64)(a2))
|
||||||
|
#define _cast64_efi_call3(f,a1,a2,a3) \
|
||||||
|
efi_call3(f, (UINT64)(a1), (UINT64)(a2), (UINT64)(a3))
|
||||||
|
#define _cast64_efi_call4(f,a1,a2,a3,a4) \
|
||||||
|
efi_call4(f, (UINT64)(a1), (UINT64)(a2), (UINT64)(a3), (UINT64)(a4))
|
||||||
|
#define _cast64_efi_call5(f,a1,a2,a3,a4,a5) \
|
||||||
|
efi_call5(f, (UINT64)(a1), (UINT64)(a2), (UINT64)(a3), (UINT64)(a4), \
|
||||||
|
(UINT64)(a5))
|
||||||
|
#define _cast64_efi_call6(f,a1,a2,a3,a4,a5,a6) \
|
||||||
|
efi_call6(f, (UINT64)(a1), (UINT64)(a2), (UINT64)(a3), (UINT64)(a4), \
|
||||||
|
(UINT64)(a5), (UINT64)(a6))
|
||||||
|
#define _cast64_efi_call7(f,a1,a2,a3,a4,a5,a6,a7) \
|
||||||
|
efi_call7(f, (UINT64)(a1), (UINT64)(a2), (UINT64)(a3), (UINT64)(a4), \
|
||||||
|
(UINT64)(a5), (UINT64)(a6), (UINT64)(a7))
|
||||||
|
#define _cast64_efi_call8(f,a1,a2,a3,a4,a5,a6,a7,a8) \
|
||||||
|
efi_call8(f, (UINT64)(a1), (UINT64)(a2), (UINT64)(a3), (UINT64)(a4), \
|
||||||
|
(UINT64)(a5), (UINT64)(a6), (UINT64)(a7), (UINT64)(a8))
|
||||||
|
#define _cast64_efi_call9(f,a1,a2,a3,a4,a5,a6,a7,a8,a9) \
|
||||||
|
efi_call9(f, (UINT64)(a1), (UINT64)(a2), (UINT64)(a3), (UINT64)(a4), \
|
||||||
|
(UINT64)(a5), (UINT64)(a6), (UINT64)(a7), (UINT64)(a8), \
|
||||||
|
(UINT64)(a9))
|
||||||
|
#define _cast64_efi_call10(f,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10) \
|
||||||
|
efi_call10(f, (UINT64)(a1), (UINT64)(a2), (UINT64)(a3), (UINT64)(a4), \
|
||||||
|
(UINT64)(a5), (UINT64)(a6), (UINT64)(a7), (UINT64)(a8), \
|
||||||
|
(UINT64)(a9), (UINT64)(a10))
|
||||||
|
|
||||||
|
/* main wrapper (va_num ignored) */
|
||||||
|
#define uefi_call_wrapper(func,va_num,...) \
|
||||||
|
__VA_ARG_NSUFFIX__(_cast64_efi_call, __VA_ARGS__) (func , ##__VA_ARGS__)
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(HAVE_USE_MS_ABI) && !defined(_MSC_EXTENSIONS)
|
||||||
|
#define EFI_FUNCTION __attribute__((ms_abi))
|
||||||
|
#else
|
||||||
|
#define EFI_FUNCTION
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef _MSC_EXTENSIONS
|
||||||
|
#pragma warning ( disable : 4731 ) // Suppress warnings about modification of EBP
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
67
include/reqs/efierr.h
Normal file
67
include/reqs/efierr.h
Normal file
|
@ -0,0 +1,67 @@
|
||||||
|
#ifndef _EFI_ERR_H
|
||||||
|
#define _EFI_ERR_H
|
||||||
|
|
||||||
|
/*++
|
||||||
|
|
||||||
|
Copyright (c) 1998 Intel Corporation
|
||||||
|
|
||||||
|
Module Name:
|
||||||
|
|
||||||
|
efierr.h
|
||||||
|
|
||||||
|
Abstract:
|
||||||
|
|
||||||
|
EFI error codes
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Revision History
|
||||||
|
|
||||||
|
--*/
|
||||||
|
|
||||||
|
|
||||||
|
#define EFIWARN(a) (a)
|
||||||
|
#define EFI_ERROR(a) (((INTN) a) < 0)
|
||||||
|
|
||||||
|
|
||||||
|
#define EFI_SUCCESS 0
|
||||||
|
#define EFI_LOAD_ERROR EFIERR(1)
|
||||||
|
#define EFI_INVALID_PARAMETER EFIERR(2)
|
||||||
|
#define EFI_UNSUPPORTED EFIERR(3)
|
||||||
|
#define EFI_BAD_BUFFER_SIZE EFIERR(4)
|
||||||
|
#define EFI_BUFFER_TOO_SMALL EFIERR(5)
|
||||||
|
#define EFI_NOT_READY EFIERR(6)
|
||||||
|
#define EFI_DEVICE_ERROR EFIERR(7)
|
||||||
|
#define EFI_WRITE_PROTECTED EFIERR(8)
|
||||||
|
#define EFI_OUT_OF_RESOURCES EFIERR(9)
|
||||||
|
#define EFI_VOLUME_CORRUPTED EFIERR(10)
|
||||||
|
#define EFI_VOLUME_FULL EFIERR(11)
|
||||||
|
#define EFI_NO_MEDIA EFIERR(12)
|
||||||
|
#define EFI_MEDIA_CHANGED EFIERR(13)
|
||||||
|
#define EFI_NOT_FOUND EFIERR(14)
|
||||||
|
#define EFI_ACCESS_DENIED EFIERR(15)
|
||||||
|
#define EFI_NO_RESPONSE EFIERR(16)
|
||||||
|
#define EFI_NO_MAPPING EFIERR(17)
|
||||||
|
#define EFI_TIMEOUT EFIERR(18)
|
||||||
|
#define EFI_NOT_STARTED EFIERR(19)
|
||||||
|
#define EFI_ALREADY_STARTED EFIERR(20)
|
||||||
|
#define EFI_ABORTED EFIERR(21)
|
||||||
|
#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)
|
||||||
|
#define EFI_WARN_WRITE_FAILURE EFIWARN(3)
|
||||||
|
#define EFI_WARN_BUFFER_TOO_SMALL EFIWARN(4)
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
298
include/reqs/efitypes.h
Normal file
298
include/reqs/efitypes.h
Normal file
|
@ -0,0 +1,298 @@
|
||||||
|
/*++
|
||||||
|
|
||||||
|
Copyright (c) 2004 - 2015, Intel Corporation. All rights reserved.<BR>
|
||||||
|
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:
|
||||||
|
|
||||||
|
EfiTypes.h
|
||||||
|
|
||||||
|
Abstract:
|
||||||
|
|
||||||
|
EFI defined types. Use these types when ever possible!
|
||||||
|
|
||||||
|
--*/
|
||||||
|
|
||||||
|
#ifndef _EFI_TYPES_H_
|
||||||
|
#define _EFI_TYPES_H_
|
||||||
|
|
||||||
|
//
|
||||||
|
// EFI Data Types based on ANSI C integer types in EfiBind.h
|
||||||
|
//
|
||||||
|
typedef uint8_t BOOLEAN;
|
||||||
|
typedef int64_t INTN;
|
||||||
|
typedef uint64_t UINTN;
|
||||||
|
typedef int8_t INT8;
|
||||||
|
typedef uint8_t UINT8;
|
||||||
|
typedef int16_t INT16;
|
||||||
|
typedef uint16_t UINT16;
|
||||||
|
typedef int32_t INT32;
|
||||||
|
typedef uint32_t UINT32;
|
||||||
|
typedef int64_t INT64;
|
||||||
|
typedef uint64_t UINT64;
|
||||||
|
typedef char CHAR8;
|
||||||
|
typedef uint16_t CHAR16;
|
||||||
|
typedef UINT64 EFI_LBA;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Modifiers for EFI Data Types used to self document code.
|
||||||
|
// Please see EFI coding convention for proper usage.
|
||||||
|
//
|
||||||
|
#ifndef IN
|
||||||
|
//
|
||||||
|
// Some other envirnments use this construct, so #ifndef to prevent
|
||||||
|
// mulitple definition.
|
||||||
|
//
|
||||||
|
#define IN
|
||||||
|
#define OUT
|
||||||
|
#define OPTIONAL
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef UNALIGNED
|
||||||
|
#define UNALIGNED
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//
|
||||||
|
// Modifiers for EFI Runtime and Boot Services
|
||||||
|
//
|
||||||
|
#define EFI_RUNTIMESERVICE
|
||||||
|
#define EFI_BOOTSERVICE
|
||||||
|
|
||||||
|
//
|
||||||
|
// Boot Service add in EFI 1.1
|
||||||
|
//
|
||||||
|
#define EFI_BOOTSERVICE11
|
||||||
|
|
||||||
|
//
|
||||||
|
// Modifiers to absract standard types to aid in debug of problems
|
||||||
|
//
|
||||||
|
#define CONST const
|
||||||
|
#define STATIC static
|
||||||
|
#define VOID void
|
||||||
|
#define VOLATILE volatile
|
||||||
|
|
||||||
|
//
|
||||||
|
// Modifier to ensure that all protocol member functions and EFI intrinsics
|
||||||
|
// use the correct C calling convention. All protocol member functions and
|
||||||
|
// EFI intrinsics are required to modify thier member functions with EFIAPI.
|
||||||
|
//
|
||||||
|
#ifndef EFIAPI
|
||||||
|
#define EFIAPI _EFIAPI
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//
|
||||||
|
// EFI Constants. They may exist in other build structures, so #ifndef them.
|
||||||
|
//
|
||||||
|
#ifndef TRUE
|
||||||
|
#define TRUE ((BOOLEAN) (1 == 1))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef FALSE
|
||||||
|
#define FALSE ((BOOLEAN) (0 == 1))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef NULL
|
||||||
|
#define NULL ((VOID *) 0)
|
||||||
|
#endif
|
||||||
|
//
|
||||||
|
// EFI Data Types derived from other EFI data types.
|
||||||
|
//
|
||||||
|
typedef UINTN EFI_STATUS;
|
||||||
|
|
||||||
|
typedef VOID *EFI_HANDLE;
|
||||||
|
#define NULL_HANDLE ((VOID *) 0)
|
||||||
|
|
||||||
|
typedef VOID *EFI_EVENT;
|
||||||
|
typedef UINTN EFI_TPL;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
UINT32 Data1;
|
||||||
|
UINT16 Data2;
|
||||||
|
UINT16 Data3;
|
||||||
|
UINT8 Data4[8];
|
||||||
|
} EFI_GUID;
|
||||||
|
|
||||||
|
typedef union {
|
||||||
|
EFI_GUID Guid;
|
||||||
|
UINT8 Raw[16];
|
||||||
|
} EFI_GUID_UNION;
|
||||||
|
|
||||||
|
//
|
||||||
|
// EFI Time Abstraction:
|
||||||
|
// Year: 2000 - 20XX
|
||||||
|
// Month: 1 - 12
|
||||||
|
// Day: 1 - 31
|
||||||
|
// Hour: 0 - 23
|
||||||
|
// Minute: 0 - 59
|
||||||
|
// Second: 0 - 59
|
||||||
|
// Nanosecond: 0 - 999,999,999
|
||||||
|
// TimeZone: -1440 to 1440 or 2047
|
||||||
|
//
|
||||||
|
typedef struct {
|
||||||
|
UINT16 Year;
|
||||||
|
UINT8 Month;
|
||||||
|
UINT8 Day;
|
||||||
|
UINT8 Hour;
|
||||||
|
UINT8 Minute;
|
||||||
|
UINT8 Second;
|
||||||
|
UINT8 Pad1;
|
||||||
|
UINT32 Nanosecond;
|
||||||
|
INT16 TimeZone;
|
||||||
|
UINT8 Daylight;
|
||||||
|
UINT8 Pad2;
|
||||||
|
} EFI_TIME;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Bit definitions for EFI_TIME.Daylight
|
||||||
|
//
|
||||||
|
#define EFI_TIME_ADJUST_DAYLIGHT 0x01
|
||||||
|
#define EFI_TIME_IN_DAYLIGHT 0x02
|
||||||
|
|
||||||
|
//
|
||||||
|
// Value definition for EFI_TIME.TimeZone
|
||||||
|
//
|
||||||
|
#define EFI_UNSPECIFIED_TIMEZONE 0x07FF
|
||||||
|
|
||||||
|
//
|
||||||
|
// Networking
|
||||||
|
//
|
||||||
|
typedef struct {
|
||||||
|
UINT8 Addr[4];
|
||||||
|
} EFI_IPv4_ADDRESS;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
UINT8 Addr[16];
|
||||||
|
} EFI_IPv6_ADDRESS;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
UINT8 Addr[32];
|
||||||
|
} EFI_MAC_ADDRESS;
|
||||||
|
|
||||||
|
typedef union {
|
||||||
|
UINT32 Addr[4];
|
||||||
|
EFI_IPv4_ADDRESS v4;
|
||||||
|
EFI_IPv6_ADDRESS v6;
|
||||||
|
} EFI_IP_ADDRESS;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
EfiReservedMemoryType,
|
||||||
|
EfiLoaderCode,
|
||||||
|
EfiLoaderData,
|
||||||
|
EfiBootServicesCode,
|
||||||
|
EfiBootServicesData,
|
||||||
|
EfiRuntimeServicesCode,
|
||||||
|
EfiRuntimeServicesData,
|
||||||
|
EfiConventionalMemory,
|
||||||
|
EfiUnusableMemory,
|
||||||
|
EfiACPIReclaimMemory,
|
||||||
|
EfiACPIMemoryNVS,
|
||||||
|
EfiMemoryMappedIO,
|
||||||
|
EfiMemoryMappedIOPortSpace,
|
||||||
|
EfiPalCode,
|
||||||
|
EfiPersistentMemory,
|
||||||
|
EfiMaxMemoryType
|
||||||
|
} EFI_MEMORY_TYPE;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
AllocateAnyPages,
|
||||||
|
AllocateMaxAddress,
|
||||||
|
AllocateAddress,
|
||||||
|
MaxAllocateType
|
||||||
|
} EFI_ALLOCATE_TYPE;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
UINT64 Signature;
|
||||||
|
UINT32 Revision;
|
||||||
|
UINT32 HeaderSize;
|
||||||
|
UINT32 CRC32;
|
||||||
|
UINT32 Reserved;
|
||||||
|
} EFI_TABLE_HEADER;
|
||||||
|
|
||||||
|
//
|
||||||
|
// possible caching types for the memory range
|
||||||
|
//
|
||||||
|
#define EFI_MEMORY_UC 0x0000000000000001
|
||||||
|
#define EFI_MEMORY_WC 0x0000000000000002
|
||||||
|
#define EFI_MEMORY_WT 0x0000000000000004
|
||||||
|
#define EFI_MEMORY_WB 0x0000000000000008
|
||||||
|
#define EFI_MEMORY_UCE 0x0000000000000010
|
||||||
|
|
||||||
|
//
|
||||||
|
// physical memory protection on range
|
||||||
|
//
|
||||||
|
#define EFI_MEMORY_WP 0x0000000000001000
|
||||||
|
#define EFI_MEMORY_RP 0x0000000000002000
|
||||||
|
#define EFI_MEMORY_XP 0x0000000000004000
|
||||||
|
|
||||||
|
//
|
||||||
|
// range requires a runtime mapping
|
||||||
|
//
|
||||||
|
#define EFI_MEMORY_RUNTIME 0x8000000000000000ULL
|
||||||
|
|
||||||
|
typedef UINT64 EFI_PHYSICAL_ADDRESS;
|
||||||
|
typedef UINT64 EFI_VIRTUAL_ADDRESS;
|
||||||
|
|
||||||
|
#define EFI_MEMORY_DESCRIPTOR_VERSION 1
|
||||||
|
typedef struct {
|
||||||
|
UINT32 Type;
|
||||||
|
UINT32 Pad;
|
||||||
|
EFI_PHYSICAL_ADDRESS PhysicalStart;
|
||||||
|
EFI_VIRTUAL_ADDRESS VirtualStart;
|
||||||
|
UINT64 NumberOfPages;
|
||||||
|
UINT64 Attribute;
|
||||||
|
} EFI_MEMORY_DESCRIPTOR;
|
||||||
|
|
||||||
|
//
|
||||||
|
// The EFI memory allocation functions work in units of EFI_PAGEs that are
|
||||||
|
// 4K. This should in no way be confused with the page size of the processor.
|
||||||
|
// An EFI_PAGE is just the quanta of memory in EFI.
|
||||||
|
//
|
||||||
|
#define EFI_PAGE_SIZE 4096
|
||||||
|
#define EFI_PAGE_MASK 0xFFF
|
||||||
|
#define EFI_PAGE_SHIFT 12
|
||||||
|
|
||||||
|
#define EFI_SIZE_TO_PAGES(a) (((a) >> EFI_PAGE_SHIFT) + (((a) & EFI_PAGE_MASK) ? 1 : 0))
|
||||||
|
|
||||||
|
#define EFI_PAGES_TO_SIZE(a) ( (a) << EFI_PAGE_SHIFT)
|
||||||
|
|
||||||
|
//
|
||||||
|
// ALIGN_POINTER - aligns a pointer to the lowest boundary
|
||||||
|
//
|
||||||
|
#define ALIGN_POINTER(p, s) ((VOID *) (p + ((s - ((UINTN) p)) & (s - 1))))
|
||||||
|
|
||||||
|
//
|
||||||
|
// ALIGN_VARIABLE - aligns a variable up to the next natural boundary for int size of a processor
|
||||||
|
//
|
||||||
|
#define ALIGN_VARIABLE(Value, Adjustment) \
|
||||||
|
(UINTN) Adjustment = 0; \
|
||||||
|
if ((UINTN) Value % sizeof (UINTN)) { \
|
||||||
|
(UINTN) Adjustment = sizeof (UINTN) - ((UINTN) Value % sizeof (UINTN)); \
|
||||||
|
} \
|
||||||
|
Value = (UINTN) Value + (UINTN) Adjustment
|
||||||
|
|
||||||
|
//
|
||||||
|
// EFI_FIELD_OFFSET - returns the byte offset to a field within a structure
|
||||||
|
//
|
||||||
|
#define EFI_FIELD_OFFSET(TYPE,Field) ((UINTN)(&(((TYPE *) 0)->Field)))
|
||||||
|
|
||||||
|
//
|
||||||
|
// CONTAINING_RECORD - returns a pointer to the structure
|
||||||
|
// from one of it's elements.
|
||||||
|
//
|
||||||
|
#define _CR(Record, TYPE, Field) ((TYPE *) ((CHAR8 *) (Record) - (CHAR8 *) &(((TYPE *) 0)->Field)))
|
||||||
|
|
||||||
|
//
|
||||||
|
// Define macros to build data structure signatures from characters.
|
||||||
|
//
|
||||||
|
#define EFI_SIGNATURE_16(A, B) ((A) | (B << 8))
|
||||||
|
#define EFI_SIGNATURE_32(A, B, C, D) (EFI_SIGNATURE_16 (A, B) | (EFI_SIGNATURE_16 (C, D) << 16))
|
||||||
|
#define EFI_SIGNATURE_64(A, B, C, D, E, F, G, H) \
|
||||||
|
(EFI_SIGNATURE_32 (A, B, C, D) | ((UINT64) (EFI_SIGNATURE_32 (E, F, G, H)) << 32))
|
||||||
|
|
||||||
|
#endif
|
Loading…
Reference in New Issue
Block a user