1 /** @file
2   Runtime Architectural Protocol as defined in PI Specification VOLUME 2 DXE
3 
4   Allows the runtime functionality of the DXE Foundation to be contained
5   in a separate driver. It also provides hooks for the DXE Foundation to
6   export information that is needed at runtime. As such, this protocol allows
7   services to the DXE Foundation to manage runtime drivers and events.
8   This protocol also implies that the runtime services required to transition
9   to virtual mode, SetVirtualAddressMap() and ConvertPointer(), have been
10   registered into the UEFI Runtime Table in the UEFI System Table. This protocol
11   must be produced by a runtime DXE driver and may only be consumed by the DXE Foundation.
12 
13   Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
14   SPDX-License-Identifier: BSD-2-Clause-Patent
15 
16 **/
17 
18 #ifndef __ARCH_PROTOCOL_RUNTIME_H__
19 #define __ARCH_PROTOCOL_RUNTIME_H__
20 
21 ///
22 /// Global ID for the Runtime Architectural Protocol
23 ///
24 #define EFI_RUNTIME_ARCH_PROTOCOL_GUID \
25   { 0xb7dfb4e1, 0x52f, 0x449f, {0x87, 0xbe, 0x98, 0x18, 0xfc, 0x91, 0xb7, 0x33 } }
26 
27 typedef struct _EFI_RUNTIME_ARCH_PROTOCOL EFI_RUNTIME_ARCH_PROTOCOL;
28 
29 ///
30 /// LIST_ENTRY from BaseType
31 ///
32 typedef LIST_ENTRY EFI_LIST_ENTRY;
33 
34 typedef struct _EFI_RUNTIME_IMAGE_ENTRY EFI_RUNTIME_IMAGE_ENTRY;
35 
36 ///
37 /// EFI_RUNTIME_IMAGE_ENTRY
38 ///
39 struct _EFI_RUNTIME_IMAGE_ENTRY {
40   ///
41   /// Start of image that has been loaded in memory. It is a pointer
42   /// to either the DOS header or PE header of the image.
43   ///
44   VOID              *ImageBase;
45   ///
46   /// Size in bytes of the image represented by ImageBase.
47   ///
48   UINT64            ImageSize;
49   ///
50   /// Information about the fix-ups that were performed on ImageBase when it was
51   /// loaded into memory.
52   ///
53   VOID              *RelocationData;
54   ///
55   /// The ImageHandle passed into ImageBase when it was loaded.
56   ///
57   EFI_HANDLE        Handle;
58   ///
59   /// Entry for this node in the EFI_RUNTIME_ARCHITECTURE_PROTOCOL.ImageHead list.
60   ///
61   EFI_LIST_ENTRY    Link;
62 };
63 
64 typedef struct _EFI_RUNTIME_EVENT_ENTRY EFI_RUNTIME_EVENT_ENTRY;
65 
66 ///
67 /// EFI_RUNTIME_EVENT_ENTRY
68 ///
69 struct _EFI_RUNTIME_EVENT_ENTRY {
70   ///
71   /// The same as Type passed into CreateEvent().
72   ///
73   UINT32              Type;
74   ///
75   /// The same as NotifyTpl passed into CreateEvent().
76   ///
77   EFI_TPL             NotifyTpl;
78   ///
79   /// The same as NotifyFunction passed into CreateEvent().
80   ///
81   EFI_EVENT_NOTIFY    NotifyFunction;
82   ///
83   /// The same as NotifyContext passed into CreateEvent().
84   ///
85   VOID                *NotifyContext;
86   ///
87   /// The EFI_EVENT returned by CreateEvent(). Event must be in runtime memory.
88   ///
89   EFI_EVENT           *Event;
90   ///
91   /// Entry for this node in the
92   /// EFI_RUNTIME_ARCHITECTURE_PROTOCOL.EventHead list.
93   ///
94   EFI_LIST_ENTRY      Link;
95 };
96 
97 ///
98 /// Allows the runtime functionality of the DXE Foundation to be contained in a
99 /// separate driver. It also provides hooks for the DXE Foundation to export
100 /// information that is needed at runtime. As such, this protocol allows the DXE
101 /// Foundation to manage runtime drivers and events. This protocol also implies
102 /// that the runtime services required to transition to virtual mode,
103 /// SetVirtualAddressMap() and ConvertPointer(), have been registered into the
104 /// EFI Runtime Table in the EFI System Partition.  This protocol must be produced
105 /// by a runtime DXE driver and may only be consumed by the DXE Foundation.
106 ///
107 struct _EFI_RUNTIME_ARCH_PROTOCOL {
108   EFI_LIST_ENTRY           ImageHead;              ///< A list of type EFI_RUNTIME_IMAGE_ENTRY.
109   EFI_LIST_ENTRY           EventHead;              ///< A list of type EFI_RUNTIME_EVENT_ENTRY.
110   UINTN                    MemoryDescriptorSize;   ///< Size of a memory descriptor that is returned by GetMemoryMap().
111   UINT32                   MemoryDesciptorVersion; ///< Version of a memory descriptor that is returned by GetMemoryMap().
112   UINTN                    MemoryMapSize;          ///< Size of the memory map in bytes contained in MemoryMapPhysical and MemoryMapVirtual.
113   EFI_MEMORY_DESCRIPTOR    *MemoryMapPhysical;     ///< Pointer to a runtime buffer that contains a copy of
114                                                    ///< the memory map returned via GetMemoryMap().
115   EFI_MEMORY_DESCRIPTOR    *MemoryMapVirtual;      ///< Pointer to MemoryMapPhysical that is updated to virtual mode after SetVirtualAddressMap().
116   BOOLEAN                  VirtualMode;            ///< Boolean that is TRUE if SetVirtualAddressMap() has been called.
117   BOOLEAN                  AtRuntime;              ///< Boolean that is TRUE if ExitBootServices () has been called.
118 };
119 
120 extern EFI_GUID  gEfiRuntimeArchProtocolGuid;
121 
122 #endif
123