1 /******************************************************************************
2  *
3  * Name: acefiex.h - Extra OS specific defines, etc. for EFI
4  *
5  *****************************************************************************/
6 
7 /*
8  * Copyright (C) 2000 - 2016, Intel Corp.
9  * All rights reserved.
10  *
11  * Redistribution and use in source and binary forms, with or without
12  * modification, are permitted provided that the following conditions
13  * are met:
14  * 1. Redistributions of source code must retain the above copyright
15  *    notice, this list of conditions, and the following disclaimer,
16  *    without modification.
17  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18  *    substantially similar to the "NO WARRANTY" disclaimer below
19  *    ("Disclaimer") and any redistribution must be conditioned upon
20  *    including a substantially similar Disclaimer requirement for further
21  *    binary redistribution.
22  * 3. Neither the names of the above-listed copyright holders nor the names
23  *    of any contributors may be used to endorse or promote products derived
24  *    from this software without specific prior written permission.
25  *
26  * Alternatively, this software may be distributed under the terms of the
27  * GNU General Public License ("GPL") version 2 as published by the Free
28  * Software Foundation.
29  *
30  * NO WARRANTY
31  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41  * POSSIBILITY OF SUCH DAMAGES.
42  */
43 
44 #ifndef __ACEFIEX_H__
45 #define __ACEFIEX_H__
46 
47 
48 #define EFI_ERROR(a)              (((INTN) a) < 0)
49 #define EFI_SUCCESS                             0
50 #define EFI_LOAD_ERROR                  EFIERR(1)
51 #define EFI_INVALID_PARAMETER           EFIERR(2)
52 #define EFI_UNSUPPORTED                 EFIERR(3)
53 #define EFI_BAD_BUFFER_SIZE             EFIERR(4)
54 #define EFI_BUFFER_TOO_SMALL            EFIERR(5)
55 #define EFI_NOT_READY                   EFIERR(6)
56 #define EFI_DEVICE_ERROR                EFIERR(7)
57 #define EFI_WRITE_PROTECTED             EFIERR(8)
58 #define EFI_OUT_OF_RESOURCES            EFIERR(9)
59 #define EFI_VOLUME_CORRUPTED            EFIERR(10)
60 #define EFI_VOLUME_FULL                 EFIERR(11)
61 #define EFI_NO_MEDIA                    EFIERR(12)
62 #define EFI_MEDIA_CHANGED               EFIERR(13)
63 #define EFI_NOT_FOUND                   EFIERR(14)
64 #define EFI_ACCESS_DENIED               EFIERR(15)
65 #define EFI_NO_RESPONSE                 EFIERR(16)
66 #define EFI_NO_MAPPING                  EFIERR(17)
67 #define EFI_TIMEOUT                     EFIERR(18)
68 #define EFI_NOT_STARTED                 EFIERR(19)
69 #define EFI_ALREADY_STARTED             EFIERR(20)
70 #define EFI_ABORTED                     EFIERR(21)
71 #define EFI_PROTOCOL_ERROR              EFIERR(24)
72 
73 
74 typedef UINTN EFI_STATUS;
75 typedef VOID *EFI_HANDLE;
76 typedef VOID *EFI_EVENT;
77 
78 typedef struct {
79     UINT32  Data1;
80     UINT16  Data2;
81     UINT16  Data3;
82     UINT8   Data4[8];
83 } EFI_GUID;
84 
85 typedef struct _EFI_DEVICE_PATH {
86         UINT8                           Type;
87         UINT8                           SubType;
88         UINT8                           Length[2];
89 } EFI_DEVICE_PATH;
90 
91 typedef UINT64          EFI_PHYSICAL_ADDRESS;
92 typedef UINT64          EFI_VIRTUAL_ADDRESS;
93 
94 typedef enum {
95     AllocateAnyPages,
96     AllocateMaxAddress,
97     AllocateAddress,
98     MaxAllocateType
99 } EFI_ALLOCATE_TYPE;
100 
101 typedef enum {
102     EfiReservedMemoryType,
103     EfiLoaderCode,
104     EfiLoaderData,
105     EfiBootServicesCode,
106     EfiBootServicesData,
107     EfiRuntimeServicesCode,
108     EfiRuntimeServicesData,
109     EfiConventionalMemory,
110     EfiUnusableMemory,
111     EfiACPIReclaimMemory,
112     EfiACPIMemoryNVS,
113     EfiMemoryMappedIO,
114     EfiMemoryMappedIOPortSpace,
115     EfiPalCode,
116     EfiMaxMemoryType
117 } EFI_MEMORY_TYPE;
118 
119 /* possible caching types for the memory range */
120 #define EFI_MEMORY_UC           0x0000000000000001
121 #define EFI_MEMORY_WC           0x0000000000000002
122 #define EFI_MEMORY_WT           0x0000000000000004
123 #define EFI_MEMORY_WB           0x0000000000000008
124 #define EFI_MEMORY_UCE          0x0000000000000010
125 
126 /* physical memory protection on range */
127 #define EFI_MEMORY_WP           0x0000000000001000
128 #define EFI_MEMORY_RP           0x0000000000002000
129 #define EFI_MEMORY_XP           0x0000000000004000
130 
131 /* range requires a runtime mapping */
132 #define EFI_MEMORY_RUNTIME      0x8000000000000000
133 
134 #define EFI_MEMORY_DESCRIPTOR_VERSION  1
135 typedef struct {
136     UINT32                          Type;
137     UINT32                          Pad;
138     EFI_PHYSICAL_ADDRESS            PhysicalStart;
139     EFI_VIRTUAL_ADDRESS             VirtualStart;
140     UINT64                          NumberOfPages;
141     UINT64                          Attribute;
142 } EFI_MEMORY_DESCRIPTOR;
143 
144 typedef struct _EFI_TABLE_HEARDER {
145     UINT64                      Signature;
146     UINT32                      Revision;
147     UINT32                      HeaderSize;
148     UINT32                      CRC32;
149     UINT32                      Reserved;
150 } EFI_TABLE_HEADER;
151 
152 typedef
153 EFI_STATUS
154 (EFIAPI *EFI_UNKNOWN_INTERFACE) (
155     void);
156 
157 
158 /*
159  * Text output protocol
160  */
161 #define SIMPLE_TEXT_OUTPUT_PROTOCOL \
162     { 0x387477c2, 0x69c7, 0x11d2, {0x8e, 0x39, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b} }
163 
164 typedef
165 EFI_STATUS
166 (EFIAPI *EFI_TEXT_RESET) (
167     struct _SIMPLE_TEXT_OUTPUT_INTERFACE    *This,
168     BOOLEAN                                 ExtendedVerification);
169 
170 typedef
171 EFI_STATUS
172 (EFIAPI *EFI_TEXT_OUTPUT_STRING) (
173     struct _SIMPLE_TEXT_OUTPUT_INTERFACE    *This,
174     CHAR16                                  *String);
175 
176 typedef
177 EFI_STATUS
178 (EFIAPI *EFI_TEXT_TEST_STRING) (
179     struct _SIMPLE_TEXT_OUTPUT_INTERFACE    *This,
180     CHAR16                                  *String);
181 
182 typedef
183 EFI_STATUS
184 (EFIAPI *EFI_TEXT_QUERY_MODE) (
185     struct _SIMPLE_TEXT_OUTPUT_INTERFACE    *This,
186     UINTN                                   ModeNumber,
187     UINTN                                   *Columns,
188     UINTN                                   *Rows);
189 
190 typedef
191 EFI_STATUS
192 (EFIAPI *EFI_TEXT_SET_MODE) (
193     struct _SIMPLE_TEXT_OUTPUT_INTERFACE    *This,
194     UINTN                                   ModeNumber);
195 
196 typedef
197 EFI_STATUS
198 (EFIAPI *EFI_TEXT_SET_ATTRIBUTE) (
199     struct _SIMPLE_TEXT_OUTPUT_INTERFACE    *This,
200     UINTN                                   Attribute);
201 
202 typedef
203 EFI_STATUS
204 (EFIAPI *EFI_TEXT_CLEAR_SCREEN) (
205     struct _SIMPLE_TEXT_OUTPUT_INTERFACE    *This);
206 
207 typedef
208 EFI_STATUS
209 (EFIAPI *EFI_TEXT_SET_CURSOR_POSITION) (
210     struct _SIMPLE_TEXT_OUTPUT_INTERFACE    *This,
211     UINTN                                   Column,
212     UINTN                                   Row);
213 
214 typedef
215 EFI_STATUS
216 (EFIAPI *EFI_TEXT_ENABLE_CURSOR) (
217     struct _SIMPLE_TEXT_OUTPUT_INTERFACE    *This,
218     BOOLEAN                                 Enable);
219 
220 typedef struct {
221     INT32                           MaxMode;
222     INT32                           Mode;
223     INT32                           Attribute;
224     INT32                           CursorColumn;
225     INT32                           CursorRow;
226     BOOLEAN                         CursorVisible;
227 } SIMPLE_TEXT_OUTPUT_MODE;
228 
229 typedef struct _SIMPLE_TEXT_OUTPUT_INTERFACE {
230     EFI_TEXT_RESET                  Reset;
231 
232     EFI_TEXT_OUTPUT_STRING          OutputString;
233     EFI_TEXT_TEST_STRING            TestString;
234 
235     EFI_TEXT_QUERY_MODE             QueryMode;
236     EFI_TEXT_SET_MODE               SetMode;
237     EFI_TEXT_SET_ATTRIBUTE          SetAttribute;
238 
239     EFI_TEXT_CLEAR_SCREEN           ClearScreen;
240     EFI_TEXT_SET_CURSOR_POSITION    SetCursorPosition;
241     EFI_TEXT_ENABLE_CURSOR          EnableCursor;
242 
243     SIMPLE_TEXT_OUTPUT_MODE         *Mode;
244 } SIMPLE_TEXT_OUTPUT_INTERFACE;
245 
246 /*
247  * Text input protocol
248  */
249 #define SIMPLE_TEXT_INPUT_PROTOCOL  \
250     { 0x387477c1, 0x69c7, 0x11d2, {0x8e, 0x39, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b} }
251 
252 typedef struct {
253     UINT16                              ScanCode;
254     CHAR16                              UnicodeChar;
255 } EFI_INPUT_KEY;
256 
257 /*
258  * Baseline unicode control chars
259  */
260 #define CHAR_NULL                       0x0000
261 #define CHAR_BACKSPACE                  0x0008
262 #define CHAR_TAB                        0x0009
263 #define CHAR_LINEFEED                   0x000A
264 #define CHAR_CARRIAGE_RETURN            0x000D
265 
266 typedef
267 EFI_STATUS
268 (EFIAPI *EFI_INPUT_RESET) (
269     struct _SIMPLE_INPUT_INTERFACE              *This,
270     BOOLEAN                                     ExtendedVerification);
271 
272 typedef
273 EFI_STATUS
274 (EFIAPI *EFI_INPUT_READ_KEY) (
275     struct _SIMPLE_INPUT_INTERFACE              *This,
276     EFI_INPUT_KEY                               *Key);
277 
278 typedef struct _SIMPLE_INPUT_INTERFACE {
279     EFI_INPUT_RESET                     Reset;
280     EFI_INPUT_READ_KEY                  ReadKeyStroke;
281     EFI_EVENT                           WaitForKey;
282 } SIMPLE_INPUT_INTERFACE;
283 
284 
285 /*
286  * Simple file system protocol
287  */
288 #define SIMPLE_FILE_SYSTEM_PROTOCOL \
289     { 0x964e5b22, 0x6459, 0x11d2, {0x8e, 0x39, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b} }
290 
291 typedef
292 EFI_STATUS
293 (EFIAPI *EFI_VOLUME_OPEN) (
294     struct _EFI_FILE_IO_INTERFACE               *This,
295     struct _EFI_FILE_HANDLE                     **Root);
296 
297 #define EFI_FILE_IO_INTERFACE_REVISION   0x00010000
298 
299 typedef struct _EFI_FILE_IO_INTERFACE {
300     UINT64                  Revision;
301     EFI_VOLUME_OPEN         OpenVolume;
302 } EFI_FILE_IO_INTERFACE;
303 
304 typedef
305 EFI_STATUS
306 (EFIAPI *EFI_FILE_OPEN) (
307     struct _EFI_FILE_HANDLE                     *File,
308     struct _EFI_FILE_HANDLE                     **NewHandle,
309     CHAR16                                      *FileName,
310     UINT64                                      OpenMode,
311     UINT64                                      Attributes);
312 
313 /* Values for OpenMode used above */
314 
315 #define EFI_FILE_MODE_READ      0x0000000000000001
316 #define EFI_FILE_MODE_WRITE     0x0000000000000002
317 #define EFI_FILE_MODE_CREATE    0x8000000000000000
318 
319 /* Values for Attribute used above */
320 
321 #define EFI_FILE_READ_ONLY      0x0000000000000001
322 #define EFI_FILE_HIDDEN         0x0000000000000002
323 #define EFI_FILE_SYSTEM         0x0000000000000004
324 #define EFI_FILE_RESERVIED      0x0000000000000008
325 #define EFI_FILE_DIRECTORY      0x0000000000000010
326 #define EFI_FILE_ARCHIVE        0x0000000000000020
327 #define EFI_FILE_VALID_ATTR     0x0000000000000037
328 
329 typedef
330 EFI_STATUS
331 (EFIAPI *EFI_FILE_CLOSE) (
332     struct _EFI_FILE_HANDLE                     *File);
333 
334 typedef
335 EFI_STATUS
336 (EFIAPI *EFI_FILE_DELETE) (
337     struct _EFI_FILE_HANDLE                     *File);
338 
339 typedef
340 EFI_STATUS
341 (EFIAPI *EFI_FILE_READ) (
342     struct _EFI_FILE_HANDLE                     *File,
343     UINTN                                       *BufferSize,
344     VOID                                        *Buffer);
345 
346 typedef
347 EFI_STATUS
348 (EFIAPI *EFI_FILE_WRITE) (
349     struct _EFI_FILE_HANDLE                     *File,
350     UINTN                                       *BufferSize,
351     VOID                                        *Buffer);
352 
353 typedef
354 EFI_STATUS
355 (EFIAPI *EFI_FILE_SET_POSITION) (
356     struct _EFI_FILE_HANDLE                     *File,
357     UINT64                                      Position);
358 
359 typedef
360 EFI_STATUS
361 (EFIAPI *EFI_FILE_GET_POSITION) (
362     struct _EFI_FILE_HANDLE                     *File,
363     UINT64                                      *Position);
364 
365 typedef
366 EFI_STATUS
367 (EFIAPI *EFI_FILE_GET_INFO) (
368     struct _EFI_FILE_HANDLE                     *File,
369     EFI_GUID                                    *InformationType,
370     UINTN                                       *BufferSize,
371     VOID                                        *Buffer);
372 
373 typedef
374 EFI_STATUS
375 (EFIAPI *EFI_FILE_SET_INFO) (
376     struct _EFI_FILE_HANDLE                     *File,
377     EFI_GUID                                    *InformationType,
378     UINTN                                       BufferSize,
379     VOID                                        *Buffer);
380 
381 typedef
382 EFI_STATUS
383 (EFIAPI *EFI_FILE_FLUSH) (
384     struct _EFI_FILE_HANDLE                     *File);
385 
386 
387 #define EFI_FILE_HANDLE_REVISION         0x00010000
388 
389 typedef struct _EFI_FILE_HANDLE {
390     UINT64                  Revision;
391     EFI_FILE_OPEN           Open;
392     EFI_FILE_CLOSE          Close;
393     EFI_FILE_DELETE         Delete;
394     EFI_FILE_READ           Read;
395     EFI_FILE_WRITE          Write;
396     EFI_FILE_GET_POSITION   GetPosition;
397     EFI_FILE_SET_POSITION   SetPosition;
398     EFI_FILE_GET_INFO       GetInfo;
399     EFI_FILE_SET_INFO       SetInfo;
400     EFI_FILE_FLUSH          Flush;
401 } EFI_FILE, *EFI_FILE_HANDLE;
402 
403 
404 /*
405  * Loaded image protocol
406  */
407 #define LOADED_IMAGE_PROTOCOL      \
408     { 0x5B1B31A1, 0x9562, 0x11d2, {0x8E, 0x3F, 0x00, 0xA0, 0xC9, 0x69, 0x72, 0x3B} }
409 
410 typedef
411 EFI_STATUS
412 (EFIAPI *EFI_IMAGE_ENTRY_POINT) (
413     EFI_HANDLE                              ImageHandle,
414     struct _EFI_SYSTEM_TABLE                *SystemTable);
415 
416 typedef
417 EFI_STATUS
418 (EFIAPI *EFI_IMAGE_LOAD) (
419     BOOLEAN                         BootPolicy,
420     EFI_HANDLE                      ParentImageHandle,
421     EFI_DEVICE_PATH                 *FilePath,
422     VOID                            *SourceBuffer,
423     UINTN                           SourceSize,
424     EFI_HANDLE                      *ImageHandle);
425 
426 typedef
427 EFI_STATUS
428 (EFIAPI *EFI_IMAGE_START) (
429     EFI_HANDLE                      ImageHandle,
430     UINTN                           *ExitDataSize,
431     CHAR16                          **ExitData);
432 
433 typedef
434 EFI_STATUS
435 (EFIAPI *EFI_EXIT) (
436     EFI_HANDLE                      ImageHandle,
437     EFI_STATUS                      ExitStatus,
438     UINTN                           ExitDataSize,
439     CHAR16                          *ExitData);
440 
441 typedef
442 EFI_STATUS
443 (EFIAPI *EFI_IMAGE_UNLOAD) (
444     EFI_HANDLE                      ImageHandle);
445 
446 
447 #define EFI_IMAGE_INFORMATION_REVISION      0x1000
448 typedef struct {
449     UINT32                          Revision;
450     EFI_HANDLE                      ParentHandle;
451     struct _EFI_SYSTEM_TABLE        *SystemTable;
452     EFI_HANDLE                      DeviceHandle;
453     EFI_DEVICE_PATH                 *FilePath;
454     VOID                            *Reserved;
455     UINT32                          LoadOptionsSize;
456     VOID                            *LoadOptions;
457     VOID                            *ImageBase;
458     UINT64                          ImageSize;
459     EFI_MEMORY_TYPE                 ImageCodeType;
460     EFI_MEMORY_TYPE                 ImageDataType;
461     EFI_IMAGE_UNLOAD                Unload;
462 
463 } EFI_LOADED_IMAGE;
464 
465 
466 /*
467  * EFI Memory
468  */
469 typedef
470 EFI_STATUS
471 (EFIAPI *EFI_ALLOCATE_PAGES) (
472     EFI_ALLOCATE_TYPE               Type,
473     EFI_MEMORY_TYPE                 MemoryType,
474     UINTN                           NoPages,
475     EFI_PHYSICAL_ADDRESS            *Memory);
476 
477 typedef
478 EFI_STATUS
479 (EFIAPI *EFI_FREE_PAGES) (
480     EFI_PHYSICAL_ADDRESS            Memory,
481     UINTN                           NoPages);
482 
483 typedef
484 EFI_STATUS
485 (EFIAPI *EFI_GET_MEMORY_MAP) (
486     UINTN                           *MemoryMapSize,
487     EFI_MEMORY_DESCRIPTOR           *MemoryMap,
488     UINTN                           *MapKey,
489     UINTN                           *DescriptorSize,
490     UINT32                          *DescriptorVersion);
491 
492 #define NextMemoryDescriptor(Ptr,Size)  ((EFI_MEMORY_DESCRIPTOR *) (((UINT8 *) Ptr) + Size))
493 
494 typedef
495 EFI_STATUS
496 (EFIAPI *EFI_ALLOCATE_POOL) (
497     EFI_MEMORY_TYPE                 PoolType,
498     UINTN                           Size,
499     VOID                            **Buffer);
500 
501 typedef
502 EFI_STATUS
503 (EFIAPI *EFI_FREE_POOL) (
504     VOID                            *Buffer);
505 
506 
507 /*
508  * Protocol handler functions
509  */
510 typedef enum {
511     EFI_NATIVE_INTERFACE,
512     EFI_PCODE_INTERFACE
513 } EFI_INTERFACE_TYPE;
514 
515 typedef enum {
516     AllHandles,
517     ByRegisterNotify,
518     ByProtocol
519 } EFI_LOCATE_SEARCH_TYPE;
520 
521 typedef
522 EFI_STATUS
523 (EFIAPI *EFI_INSTALL_PROTOCOL_INTERFACE) (
524     EFI_HANDLE                      *Handle,
525     EFI_GUID                        *Protocol,
526     EFI_INTERFACE_TYPE              InterfaceType,
527     VOID                            *Interface);
528 
529 typedef
530 EFI_STATUS
531 (EFIAPI *EFI_REINSTALL_PROTOCOL_INTERFACE) (
532     EFI_HANDLE                      Handle,
533     EFI_GUID                        *Protocol,
534     VOID                            *OldInterface,
535     VOID                            *NewInterface);
536 
537 typedef
538 EFI_STATUS
539 (EFIAPI *EFI_UNINSTALL_PROTOCOL_INTERFACE) (
540     EFI_HANDLE                      Handle,
541     EFI_GUID                        *Protocol,
542     VOID                            *Interface);
543 
544 typedef
545 EFI_STATUS
546 (EFIAPI *EFI_HANDLE_PROTOCOL) (
547     EFI_HANDLE                      Handle,
548     EFI_GUID                        *Protocol,
549     VOID                            **Interface);
550 
551 typedef
552 EFI_STATUS
553 (EFIAPI *EFI_REGISTER_PROTOCOL_NOTIFY) (
554     EFI_GUID                        *Protocol,
555     EFI_EVENT                       Event,
556     VOID                            **Registration);
557 
558 typedef
559 EFI_STATUS
560 (EFIAPI *EFI_LOCATE_HANDLE) (
561     EFI_LOCATE_SEARCH_TYPE          SearchType,
562     EFI_GUID                        *Protocol,
563     VOID                            *SearchKey,
564     UINTN                           *BufferSize,
565     EFI_HANDLE                      *Buffer);
566 
567 typedef
568 EFI_STATUS
569 (EFIAPI *EFI_LOCATE_DEVICE_PATH) (
570     EFI_GUID                        *Protocol,
571     EFI_DEVICE_PATH                 **DevicePath,
572     EFI_HANDLE                      *Device);
573 
574 typedef
575 EFI_STATUS
576 (EFIAPI *EFI_INSTALL_CONFIGURATION_TABLE) (
577     EFI_GUID                        *Guid,
578     VOID                            *Table);
579 
580 #define EFI_OPEN_PROTOCOL_BY_HANDLE_PROTOCOL  0x00000001
581 #define EFI_OPEN_PROTOCOL_GET_PROTOCOL        0x00000002
582 #define EFI_OPEN_PROTOCOL_TEST_PROTOCOL       0x00000004
583 #define EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER 0x00000008
584 #define EFI_OPEN_PROTOCOL_BY_DRIVER           0x00000010
585 #define EFI_OPEN_PROTOCOL_EXCLUSIVE           0x00000020
586 
587 typedef
588 EFI_STATUS
589 (EFIAPI *EFI_OPEN_PROTOCOL) (
590     EFI_HANDLE                      Handle,
591     EFI_GUID                        *Protocol,
592     VOID                            **Interface,
593     EFI_HANDLE                      AgentHandle,
594     EFI_HANDLE                      ControllerHandle,
595     UINT32                          Attributes);
596 
597 typedef
598 EFI_STATUS
599 (EFIAPI *EFI_CLOSE_PROTOCOL) (
600     EFI_HANDLE                      Handle,
601     EFI_GUID                        *Protocol,
602     EFI_HANDLE                      AgentHandle,
603     EFI_HANDLE                      ControllerHandle);
604 
605 typedef struct {
606     EFI_HANDLE                  AgentHandle;
607     EFI_HANDLE                  ControllerHandle;
608     UINT32                      Attributes;
609     UINT32                      OpenCount;
610 } EFI_OPEN_PROTOCOL_INFORMATION_ENTRY;
611 
612 typedef
613 EFI_STATUS
614 (EFIAPI *EFI_OPEN_PROTOCOL_INFORMATION) (
615     EFI_HANDLE                      Handle,
616     EFI_GUID                        *Protocol,
617     EFI_OPEN_PROTOCOL_INFORMATION_ENTRY **EntryBuffer,
618     UINTN                           *EntryCount);
619 
620 typedef
621 EFI_STATUS
622 (EFIAPI *EFI_PROTOCOLS_PER_HANDLE) (
623     EFI_HANDLE                      Handle,
624     EFI_GUID                        ***ProtocolBuffer,
625     UINTN                           *ProtocolBufferCount);
626 
627 typedef
628 EFI_STATUS
629 (EFIAPI *EFI_LOCATE_HANDLE_BUFFER) (
630     EFI_LOCATE_SEARCH_TYPE          SearchType,
631     EFI_GUID                        *Protocol,
632     VOID                            *SearchKey,
633     UINTN                           *NoHandles,
634     EFI_HANDLE                      **Buffer);
635 
636 typedef
637 EFI_STATUS
638 (EFIAPI *EFI_LOCATE_PROTOCOL) (
639     EFI_GUID                        *Protocol,
640     VOID                            *Registration,
641     VOID                            **Interface);
642 
643 typedef
644 EFI_STATUS
645 (EFIAPI *EFI_INSTALL_MULTIPLE_PROTOCOL_INTERFACES) (
646     EFI_HANDLE                      *Handle,
647     ...);
648 
649 typedef
650 EFI_STATUS
651 (EFIAPI *EFI_UNINSTALL_MULTIPLE_PROTOCOL_INTERFACES) (
652     EFI_HANDLE                      Handle,
653     ...);
654 
655 typedef
656 EFI_STATUS
657 (EFIAPI *EFI_CALCULATE_CRC32) (
658     VOID                            *Data,
659     UINTN                           DataSize,
660     UINT32                          *Crc32);
661 
662 typedef
663 VOID
664 (EFIAPI *EFI_COPY_MEM) (
665     VOID                            *Destination,
666     VOID                            *Source,
667     UINTN                           Length);
668 
669 typedef
670 VOID
671 (EFIAPI *EFI_SET_MEM) (
672     VOID                            *Buffer,
673     UINTN                           Size,
674     UINT8                           Value);
675 
676 /*
677  * EFI Boot Services Table
678  */
679 #define EFI_BOOT_SERVICES_SIGNATURE     0x56524553544f4f42
680 #define EFI_BOOT_SERVICES_REVISION      (EFI_SPECIFICATION_MAJOR_REVISION<<16) | (EFI_SPECIFICATION_MINOR_REVISION)
681 
682 typedef struct _EFI_BOOT_SERVICES {
683     EFI_TABLE_HEADER                Hdr;
684 
685 #if 0
686     EFI_RAISE_TPL                   RaiseTPL;
687     EFI_RESTORE_TPL                 RestoreTPL;
688 #else
689     EFI_UNKNOWN_INTERFACE           RaiseTPL;
690     EFI_UNKNOWN_INTERFACE           RestoreTPL;
691 #endif
692 
693     EFI_ALLOCATE_PAGES              AllocatePages;
694     EFI_FREE_PAGES                  FreePages;
695     EFI_GET_MEMORY_MAP              GetMemoryMap;
696     EFI_ALLOCATE_POOL               AllocatePool;
697     EFI_FREE_POOL                   FreePool;
698 
699 #if 0
700     EFI_CREATE_EVENT                CreateEvent;
701     EFI_SET_TIMER                   SetTimer;
702     EFI_WAIT_FOR_EVENT              WaitForEvent;
703     EFI_SIGNAL_EVENT                SignalEvent;
704     EFI_CLOSE_EVENT                 CloseEvent;
705     EFI_CHECK_EVENT                 CheckEvent;
706 #else
707     EFI_UNKNOWN_INTERFACE           CreateEvent;
708     EFI_UNKNOWN_INTERFACE           SetTimer;
709     EFI_UNKNOWN_INTERFACE           WaitForEvent;
710     EFI_UNKNOWN_INTERFACE           SignalEvent;
711     EFI_UNKNOWN_INTERFACE           CloseEvent;
712     EFI_UNKNOWN_INTERFACE           CheckEvent;
713 #endif
714 
715     EFI_INSTALL_PROTOCOL_INTERFACE  InstallProtocolInterface;
716     EFI_REINSTALL_PROTOCOL_INTERFACE ReinstallProtocolInterface;
717     EFI_UNINSTALL_PROTOCOL_INTERFACE UninstallProtocolInterface;
718     EFI_HANDLE_PROTOCOL             HandleProtocol;
719     EFI_HANDLE_PROTOCOL             PCHandleProtocol;
720     EFI_REGISTER_PROTOCOL_NOTIFY    RegisterProtocolNotify;
721     EFI_LOCATE_HANDLE               LocateHandle;
722     EFI_LOCATE_DEVICE_PATH          LocateDevicePath;
723     EFI_INSTALL_CONFIGURATION_TABLE InstallConfigurationTable;
724 
725     EFI_IMAGE_LOAD                  LoadImage;
726     EFI_IMAGE_START                 StartImage;
727     EFI_EXIT                        Exit;
728     EFI_IMAGE_UNLOAD                UnloadImage;
729 
730 #if 0
731     EFI_EXIT_BOOT_SERVICES          ExitBootServices;
732     EFI_GET_NEXT_MONOTONIC_COUNT    GetNextMonotonicCount;
733     EFI_STALL                       Stall;
734     EFI_SET_WATCHDOG_TIMER          SetWatchdogTimer;
735 #else
736     EFI_UNKNOWN_INTERFACE           ExitBootServices;
737     EFI_UNKNOWN_INTERFACE           GetNextMonotonicCount;
738     EFI_UNKNOWN_INTERFACE           Stall;
739     EFI_UNKNOWN_INTERFACE           SetWatchdogTimer;
740 #endif
741 
742 #if 0
743     EFI_CONNECT_CONTROLLER          ConnectController;
744     EFI_DISCONNECT_CONTROLLER       DisconnectController;
745 #else
746     EFI_UNKNOWN_INTERFACE           ConnectController;
747     EFI_UNKNOWN_INTERFACE           DisconnectController;
748 #endif
749 
750     EFI_OPEN_PROTOCOL               OpenProtocol;
751     EFI_CLOSE_PROTOCOL              CloseProtocol;
752     EFI_OPEN_PROTOCOL_INFORMATION   OpenProtocolInformation;
753     EFI_PROTOCOLS_PER_HANDLE        ProtocolsPerHandle;
754     EFI_LOCATE_HANDLE_BUFFER        LocateHandleBuffer;
755     EFI_LOCATE_PROTOCOL             LocateProtocol;
756     EFI_INSTALL_MULTIPLE_PROTOCOL_INTERFACES InstallMultipleProtocolInterfaces;
757     EFI_UNINSTALL_MULTIPLE_PROTOCOL_INTERFACES UninstallMultipleProtocolInterfaces;
758 
759     EFI_CALCULATE_CRC32             CalculateCrc32;
760 
761     EFI_COPY_MEM                    CopyMem;
762     EFI_SET_MEM                     SetMem;
763 
764 #if 0
765     EFI_CREATE_EVENT_EX             CreateEventEx;
766 #else
767     EFI_UNKNOWN_INTERFACE           CreateEventEx;
768 #endif
769 } EFI_BOOT_SERVICES;
770 
771 
772 /*
773  * EFI System Table
774  */
775 
776 /*
777  * EFI Configuration Table and GUID definitions
778  */
779 #define ACPI_TABLE_GUID    \
780     { 0xeb9d2d30, 0x2d88, 0x11d3, {0x9a, 0x16, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d} }
781 #define ACPI_20_TABLE_GUID  \
782     { 0x8868e871, 0xe4f1, 0x11d3, {0xbc, 0x22, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81} }
783 
784 typedef struct _EFI_CONFIGURATION_TABLE {
785     EFI_GUID                VendorGuid;
786     VOID                    *VendorTable;
787 } EFI_CONFIGURATION_TABLE;
788 
789 
790 #define EFI_SYSTEM_TABLE_SIGNATURE      0x5453595320494249
791 #define EFI_SYSTEM_TABLE_REVISION      (EFI_SPECIFICATION_MAJOR_REVISION<<16) | (EFI_SPECIFICATION_MINOR_REVISION)
792 
793 typedef struct _EFI_SYSTEM_TABLE {
794     EFI_TABLE_HEADER                Hdr;
795 
796     CHAR16                          *FirmwareVendor;
797     UINT32                          FirmwareRevision;
798 
799     EFI_HANDLE                      ConsoleInHandle;
800     SIMPLE_INPUT_INTERFACE          *ConIn;
801 
802     EFI_HANDLE                      ConsoleOutHandle;
803     SIMPLE_TEXT_OUTPUT_INTERFACE    *ConOut;
804 
805     EFI_HANDLE                      StandardErrorHandle;
806     SIMPLE_TEXT_OUTPUT_INTERFACE    *StdErr;
807 
808 #if 0
809     EFI_RUNTIME_SERVICES            *RuntimeServices;
810 #else
811     EFI_HANDLE                      *RuntimeServices;
812 #endif
813     EFI_BOOT_SERVICES               *BootServices;
814 
815     UINTN                           NumberOfTableEntries;
816     EFI_CONFIGURATION_TABLE         *ConfigurationTable;
817 
818 } EFI_SYSTEM_TABLE;
819 
820 
821 /* GNU EFI definitions */
822 
823 #if defined(_GNU_EFI)
824 
825 /*
826  * This is needed to hide platform specific code from ACPICA
827  */
828 UINT64
829 DivU64x32 (
830     UINT64                  Dividend,
831     UINTN                   Divisor,
832     UINTN                   *Remainder);
833 
834 /*
835  * EFI specific prototypes
836  */
837 EFI_STATUS
838 efi_main (
839     EFI_HANDLE              Image,
840     EFI_SYSTEM_TABLE        *SystemTab);
841 
842 int
843 acpi_main (
844     int                     argc,
845     char                    *argv[]);
846 
847 
848 #endif
849 
850 extern EFI_GUID AcpiGbl_LoadedImageProtocol;
851 extern EFI_GUID AcpiGbl_TextInProtocol;
852 extern EFI_GUID AcpiGbl_TextOutProtocol;
853 extern EFI_GUID AcpiGbl_FileSystemProtocol;
854 
855 #endif /* __ACEFIEX_H__ */
856