1/*++
2
3Copyright (c)  1999 - 2003 Intel Corporation. All rights reserved
4This software and associated documentation (if any) is furnished
5under a license and may only be used or copied in accordance
6with the terms of the license. Except as permitted by such
7license, no part of this software or documentation may be
8reproduced, stored in a retrieval system, or transmitted in any
9form or by any means without the express written consent of
10Intel Corporation.
11
12Module Name:
13
14    efefind.h
15
16Abstract:
17
18    EFI to compile bindings
19
20
21
22
23Revision History
24
25--*/
26
27#pragma pack()
28
29//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
30// BugBug: Code to debug
31//
32#define BIT63   0x8000000000000000
33
34#define PLATFORM_IOBASE_ADDRESS   (0xffffc000000 | BIT63)
35#define PORT_TO_MEMD(_Port) (PLATFORM_IOBASE_ADDRESS | ( ( ( (_Port) & 0xfffc) << 10 ) | ( (_Port) & 0x0fff) ) )
36
37//
38// Macro's with casts make this much easier to use and read.
39//
40#define PORT_TO_MEM8D(_Port)  (*(UINT8  *)(PORT_TO_MEMD(_Port)))
41#define POST_CODE(_Data)  (PORT_TO_MEM8D(0x80) = (_Data))
42//
43// BugBug: End Debug Code!!!
44//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
45
46#define EFIERR(a)           (0x8000000000000000 | a)
47#define EFI_ERROR_MASK      0x8000000000000000
48#define EFIERR_OEM(a)       (0xc000000000000000 | a)
49
50#define BAD_POINTER         0xFBFBFBFBFBFBFBFB
51#define MAX_ADDRESS         0xFFFFFFFFFFFFFFFF
52
53#define BREAKPOINT()  __break(0)
54
55//
56// Pointers must be aligned to these address to function
57//  you will get an alignment fault if this value is less than 8
58//
59#define MIN_ALIGNMENT_SIZE  8
60
61#define ALIGN_VARIABLE(Value , Adjustment) \
62            (UINTN) Adjustment = 0; \
63            if((UINTN)Value % MIN_ALIGNMENT_SIZE) \
64                (UINTN)Adjustment = MIN_ALIGNMENT_SIZE - ((UINTN)Value % MIN_ALIGNMENT_SIZE); \
65            Value = (UINTN)Value + (UINTN)Adjustment
66
67//
68// Define macros to create data structure signatures.
69//
70
71#define EFI_SIGNATURE_16(A,B)             ((A) | (B<<8))
72#define EFI_SIGNATURE_32(A,B,C,D)         (EFI_SIGNATURE_16(A,B)     | (EFI_SIGNATURE_16(C,D)     << 16))
73#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))
74
75//
76// EFIAPI - prototype calling convention for EFI function pointers
77// BOOTSERVICE - prototype for implementation of a boot service interface
78// RUNTIMESERVICE - prototype for implementation of a runtime service interface
79// RUNTIMEFUNCTION - prototype for implementation of a runtime function that is not a service
80// RUNTIME_CODE - pragma macro for declaring runtime code
81//
82
83#ifndef EFIAPI                  // Forces EFI calling conventions reguardless of compiler options
84    #ifdef _MSC_EXTENSIONS
85        #define EFIAPI __cdecl  // Force C calling convention for Microsoft C compiler
86    #else
87        #define EFIAPI          // Substitute expresion to force C calling convention
88    #endif
89#endif
90
91#define BOOTSERVICE
92#define RUNTIMESERVICE
93#define RUNTIMEFUNCTION
94
95#define RUNTIME_CODE(a)         alloc_text("rtcode", a)
96#define BEGIN_RUNTIME_DATA()    data_seg("rtdata")
97#define END_RUNTIME_DATA()      data_seg()
98
99#define VOLATILE    volatile
100
101//
102// BugBug: Need to find out if this is portable across compilers.
103//
104void __mfa (void);
105#define MEMORY_FENCE()    __mfa()
106
107#ifdef EFI_NO_INTERFACE_DECL
108  #define EFI_FORWARD_DECLARATION(x)
109  #define EFI_INTERFACE_DECL(x)
110#else
111  #define EFI_FORWARD_DECLARATION(x) typedef struct _##x x
112  #define EFI_INTERFACE_DECL(x) typedef struct x
113#endif
114
115//
116// When build similar to FW, then link everything together as
117// one big module.
118//
119
120#define EFI_DRIVER_ENTRY_POINT(InitFunction)
121
122#define LOAD_INTERNAL_DRIVER(_if, type, name, entry)    \
123            (_if)->LoadInternal(type, name, entry)
124//        entry(NULL, ST)
125
126#ifdef __FreeBSD__
127#define INTERFACE_DECL(x) struct x
128#else
129//
130// Some compilers don't support the forward reference construct:
131//  typedef struct XXXXX
132//
133// The following macro provide a workaround for such cases.
134//
135#ifdef NO_INTERFACE_DECL
136#define INTERFACE_DECL(x)
137#else
138#define INTERFACE_DECL(x) typedef struct x
139#endif
140#endif
141