iPXE
Functions | Variables
efi_init.c File Reference
#include <string.h>
#include <errno.h>
#include <endian.h>
#include <ipxe/init.h>
#include <ipxe/rotate.h>
#include <ipxe/efi/efi.h>
#include <ipxe/efi/efi_driver.h>
#include <ipxe/efi/efi_path.h>
#include <ipxe/efi/Protocol/LoadedImage.h>

Go to the source code of this file.

Functions

 FILE_LICENCE (GPL2_OR_LATER)
 
EFI_SYSTEM_TABLE_C2 (PLATFORM, _systab)
 System table passed to entry point. More...
 
static EFI_STATUS EFIAPI efi_unload (EFI_HANDLE image_handle __unused)
 Shut down EFI environment. More...
 
static EFIAPI void efi_shutdown_hook (EFI_EVENT event __unused, void *context __unused)
 Shut down in preparation for booting an OS. More...
 
static void * efi_find_table (EFI_GUID *guid)
 Look up EFI configuration table. More...
 
unsigned long efi_stack_cookie (EFI_HANDLE handle)
 Construct a stack cookie value. More...
 
EFI_STATUS efi_init (EFI_HANDLE image_handle, EFI_SYSTEM_TABLE *systab)
 Initialise EFI environment. More...
 
void __stack_chk_fail (void)
 Abort on stack check failure. More...
 
void efi_raise_tpl (struct efi_saved_tpl *tpl)
 Raise task priority level to internal level. More...
 
void efi_restore_tpl (struct efi_saved_tpl *tpl)
 Restore task priority level. More...
 

Variables

EFI_HANDLE efi_image_handle
 Image handle passed to entry point. More...
 
EFI_LOADED_IMAGE_PROTOCOLefi_loaded_image
 Loaded image protocol for this image. More...
 
EFI_DEVICE_PATH_PROTOCOLefi_loaded_image_path
 Device path for the loaded image's device handle. More...
 
EFI_TPL efi_internal_tpl = TPL_CALLBACK
 Internal task priority level. More...
 
EFI_TPL efi_external_tpl = TPL_APPLICATION
 External task priority level. More...
 
int efi_shutdown_in_progress
 EFI shutdown is in progress. More...
 
static EFI_EVENT efi_shutdown_event
 Event used to signal shutdown. More...
 
unsigned long __stack_chk_guard
 Stack cookie. More...
 
static EFI_EXIT efi_exit
 Exit function. More...
 

Function Documentation

◆ FILE_LICENCE()

FILE_LICENCE ( GPL2_OR_LATER  )

◆ _C2()

EFI_SYSTEM_TABLE* _C2 ( PLATFORM  ,
_systab   
)

System table passed to entry point.

We construct the symbol name efi_systab via the PLATFORM macro. This ensures that the symbol is defined only in EFI builds, and so prevents EFI code from being incorrectly linked in to a non-EFI build.

◆ efi_unload()

static EFI_STATUS EFIAPI efi_unload ( EFI_HANDLE image_handle  __unused)
static

Shut down EFI environment.

Parameters
image_handleImage handle

Definition at line 330 of file efi_init.c.

330  {
332  EFI_SYSTEM_TABLE *systab = efi_systab;
333  struct efi_saved_tpl tpl;
334 
335  DBGC ( systab, "EFI image unloading\n" );
336 
337  /* Raise TPL */
338  efi_raise_tpl ( &tpl );
339 
340  /* Shut down */
341  shutdown_exit();
342 
343  /* Disconnect any remaining devices */
345 
346  /* Uninstall driver binding protocol */
348 
349  /* Uninstall exit boot services event */
351 
352  /* Free copy of loaded image's device handle's device path */
354 
355  DBGC ( systab, "EFI image unloaded\n" );
356 
357  /* Restore TPL */
358  efi_restore_tpl ( &tpl );
359 
360  return 0;
361 }
void efi_driver_uninstall(void)
Uninstall EFI driver.
Definition: efi_driver.c:418
EFI_BOOT_SERVICES * BootServices
A pointer to the EFI Boot Services Table.
Definition: UefiSpec.h:2000
void efi_raise_tpl(struct efi_saved_tpl *tpl)
Raise task priority level to internal level.
Definition: efi_init.c:394
#define DBGC(...)
Definition: compiler.h:505
EFI_CLOSE_EVENT CloseEvent
Definition: UefiSpec.h:1864
EFI_DEVICE_PATH_PROTOCOL * efi_loaded_image_path
Device path for the loaded image's device handle.
Definition: efi_init.c:39
static EFI_EVENT efi_shutdown_event
Event used to signal shutdown.
Definition: efi_init.c:60
static void shutdown_exit(void)
Shut down system for exit back to firmware.
Definition: init.h:84
EFI Boot Services Table.
Definition: UefiSpec.h:1836
void efi_driver_disconnect_all(void)
Disconnect EFI driver from all possible devices.
Definition: efi_driver.c:584
EFI System Table.
Definition: UefiSpec.h:1949
EFI_FREE_POOL FreePool
Definition: UefiSpec.h:1855
An EFI saved task priority level.
Definition: efi.h:67
EFI_SYSTEM_TABLE * efi_systab
void efi_restore_tpl(struct efi_saved_tpl *tpl)
Restore task priority level.
Definition: efi_init.c:410

References EFI_SYSTEM_TABLE::BootServices, EFI_BOOT_SERVICES::CloseEvent, DBGC, efi_driver_disconnect_all(), efi_driver_uninstall(), efi_loaded_image_path, efi_raise_tpl(), efi_restore_tpl(), efi_shutdown_event, efi_systab, EFI_BOOT_SERVICES::FreePool, and shutdown_exit().

Referenced by efi_init().

◆ efi_shutdown_hook()

static EFIAPI void efi_shutdown_hook ( EFI_EVENT event  __unused,
void *context  __unused 
)
static

Shut down in preparation for booting an OS.

This hook gets called at ExitBootServices time in order to make sure that everything is properly shut down before the OS takes over.

Definition at line 82 of file efi_init.c.

83  {
84 
85  /* This callback is invoked at TPL_NOTIFY in order to ensure
86  * that we have an opportunity to shut down cleanly before
87  * other shutdown hooks perform destructive operations such as
88  * disabling the IOMMU.
89  *
90  * Modify the internal task priority level so that no code
91  * attempts to raise from TPL_NOTIFY to TPL_CALLBACK (which
92  * would trigger a fatal exception).
93  */
95 
96  /* Mark shutdown as being in progress, to indicate that large
97  * parts of the system (e.g. timers) are no longer functional.
98  */
100 
101  /* Shut down iPXE */
102  shutdown_boot();
103 }
EFI_TPL efi_internal_tpl
Internal task priority level.
Definition: efi_init.c:51
#define TPL_NOTIFY
Definition: UefiSpec.h:592
static void shutdown_boot(void)
Shut down system for OS boot.
Definition: init.h:76
int efi_shutdown_in_progress
EFI shutdown is in progress.
Definition: efi_init.c:57

References efi_internal_tpl, efi_shutdown_in_progress, shutdown_boot(), and TPL_NOTIFY.

Referenced by efi_init().

◆ efi_find_table()

static void* efi_find_table ( EFI_GUID guid)
static

Look up EFI configuration table.

Parameters
guidConfiguration table GUID
Return values
tableConfiguration table, or NULL

Definition at line 111 of file efi_init.c.

111  {
112  unsigned int i;
113 
114  for ( i = 0 ; i < efi_systab->NumberOfTableEntries ; i++ ) {
116  guid, sizeof ( *guid ) ) == 0 )
118  }
119 
120  return NULL;
121 }
EFI_GUID VendorGuid
The 128-bit GUID value that uniquely identifies the system configuration table.
Definition: UefiSpec.h:1939
uint64_t guid
GUID.
Definition: edd.h:30
UINTN NumberOfTableEntries
The number of system configuration tables in the buffer ConfigurationTable.
Definition: UefiSpec.h:2004
EFI_SYSTEM_TABLE * efi_systab
int memcmp(const void *first, const void *second, size_t len)
Compare memory regions.
Definition: string.c:114
#define NULL
NULL pointer (VOID *)
Definition: Base.h:362
EFI_CONFIGURATION_TABLE * ConfigurationTable
A pointer to the system configuration tables.
Definition: UefiSpec.h:2009
VOID * VendorTable
A pointer to the table associated with VendorGuid.
Definition: UefiSpec.h:1943

References EFI_SYSTEM_TABLE::ConfigurationTable, efi_systab, guid, memcmp(), NULL, EFI_SYSTEM_TABLE::NumberOfTableEntries, EFI_CONFIGURATION_TABLE::VendorGuid, and EFI_CONFIGURATION_TABLE::VendorTable.

Referenced by efi_init().

◆ efi_stack_cookie()

unsigned long efi_stack_cookie ( EFI_HANDLE  handle)

Construct a stack cookie value.

Parameters
handleImage handle
Return values
cookieStack cookie

Definition at line 130 of file efi_init.c.

130  {
131  unsigned long cookie = 0;
132  unsigned int rotation = ( 8 * sizeof ( cookie ) / 4 );
133 
134  /* There is no viable source of entropy available at this
135  * point. Construct a value that is at least likely to vary
136  * between platforms and invocations.
137  */
138  cookie ^= ( ( unsigned long ) handle );
139  cookie = roll ( cookie, rotation );
140  cookie ^= ( ( unsigned long ) &handle );
141  cookie = roll ( cookie, rotation );
142  cookie ^= profile_timestamp();
143  cookie = roll ( cookie, rotation );
144  cookie ^= build_id;
145 
146  /* Ensure that the value contains a NUL byte, to act as a
147  * runaway string terminator. Construct the NUL using a shift
148  * rather than a mask, to avoid losing valuable entropy in the
149  * lower-order bits.
150  */
151  cookie <<= 8;
152 
153  /* Ensure that the NUL byte is placed at the bottom of the
154  * stack cookie, to avoid potential disclosure via an
155  * unterminated string.
156  */
157  if ( __BYTE_ORDER == __BIG_ENDIAN )
158  cookie >>= 8;
159 
160  return cookie;
161 }
#define __BYTE_ORDER
Definition: endian.h:6
unsigned long build_id
Build ID.
Definition: version.c:61
#define __BIG_ENDIAN
Constant representing big-endian byte order.
Definition: endian.h:21
static unsigned int rotation
Definition: rotate.h:22
uint16_t handle
Handle.
Definition: smbios.h:16

References __BIG_ENDIAN, __BYTE_ORDER, build_id, handle, and rotation.

Referenced by efi_init_stack_guard().

◆ efi_init()

EFI_STATUS efi_init ( EFI_HANDLE  image_handle,
EFI_SYSTEM_TABLE systab 
)

Initialise EFI environment.

Parameters
image_handleImage handle
systabSystem table
Return values
efircEFI return status code

Definition at line 170 of file efi_init.c.

171  {
172  EFI_BOOT_SERVICES *bs;
173  struct efi_protocol *prot;
174  struct efi_config_table *tab;
175  void *loaded_image;
176  void *device_path;
177  void *device_path_copy;
178  size_t device_path_len;
179  EFI_STATUS efirc;
180  int rc;
181 
182  /* Store image handle and system table pointer for future use */
183  efi_image_handle = image_handle;
184  efi_systab = systab;
185 
186  /* Sanity checks */
187  if ( ! systab ) {
188  efirc = EFI_NOT_AVAILABLE_YET;
189  goto err_sanity;
190  }
191  if ( ! systab->ConOut ) {
192  efirc = EFI_NOT_AVAILABLE_YET;
193  goto err_sanity;
194  }
195  if ( ! systab->BootServices ) {
196  DBGC ( systab, "EFI provided no BootServices entry point\n" );
197  efirc = EFI_NOT_AVAILABLE_YET;
198  goto err_sanity;
199  }
200  if ( ! systab->RuntimeServices ) {
201  DBGC ( systab, "EFI provided no RuntimeServices entry "
202  "point\n" );
203  efirc = EFI_NOT_AVAILABLE_YET;
204  goto err_sanity;
205  }
206  DBGC ( systab, "EFI handle %p systab %p\n", image_handle, systab );
207  bs = systab->BootServices;
208 
209  /* Store abort function pointer */
210  efi_exit = bs->Exit;
211 
212  /* Look up used protocols */
214  if ( ( efirc = bs->LocateProtocol ( &prot->guid, NULL,
215  prot->protocol ) ) == 0 ) {
216  DBGC ( systab, "EFI protocol %s is at %p\n",
217  efi_guid_ntoa ( &prot->guid ),
218  *(prot->protocol) );
219  } else {
220  DBGC ( systab, "EFI does not provide protocol %s\n",
221  efi_guid_ntoa ( &prot->guid ) );
222  /* Fail if protocol is required */
223  if ( prot->required )
224  goto err_missing_protocol;
225  }
226  }
227 
228  /* Look up used configuration tables */
230  if ( ( *(tab->table) = efi_find_table ( &tab->guid ) ) ) {
231  DBGC ( systab, "EFI configuration table %s is at %p\n",
232  efi_guid_ntoa ( &tab->guid ), *(tab->table) );
233  } else {
234  DBGC ( systab, "EFI does not provide configuration "
235  "table %s\n", efi_guid_ntoa ( &tab->guid ) );
236  if ( tab->required ) {
237  efirc = EFI_NOT_AVAILABLE_YET;
238  goto err_missing_table;
239  }
240  }
241  }
242 
243  /* Get loaded image protocol */
244  if ( ( efirc = bs->OpenProtocol ( image_handle,
246  &loaded_image, image_handle, NULL,
247  EFI_OPEN_PROTOCOL_GET_PROTOCOL ) ) != 0 ) {
248  rc = -EEFI ( efirc );
249  DBGC ( systab, "EFI could not get loaded image protocol: %s",
250  strerror ( rc ) );
251  goto err_no_loaded_image;
252  }
253  efi_loaded_image = loaded_image;
254  DBGC ( systab, "EFI image base address %p\n",
256 
257  /* Get loaded image's device handle's device path */
258  if ( ( efirc = bs->OpenProtocol ( efi_loaded_image->DeviceHandle,
260  &device_path, image_handle, NULL,
261  EFI_OPEN_PROTOCOL_GET_PROTOCOL ) ) != 0 ) {
262  rc = -EEFI ( efirc );
263  DBGC ( systab, "EFI could not get loaded image's device path: "
264  "%s", strerror ( rc ) );
265  goto err_no_device_path;
266  }
267 
268  /* Make a copy of the loaded image's device handle's device
269  * path, since the device handle itself may become invalidated
270  * when we load our own drivers.
271  */
272  device_path_len = ( efi_path_len ( device_path ) +
273  sizeof ( EFI_DEVICE_PATH_PROTOCOL ) );
274  if ( ( efirc = bs->AllocatePool ( EfiBootServicesData, device_path_len,
275  &device_path_copy ) ) != 0 ) {
276  rc = -EEFI ( efirc );
277  goto err_alloc_device_path;
278  }
279  memcpy ( device_path_copy, device_path, device_path_len );
280  efi_loaded_image_path = device_path_copy;
281  DBGC ( systab, "EFI image device path %s\n",
283 
284  /* EFI is perfectly capable of gracefully shutting down any
285  * loaded devices if it decides to fall back to a legacy boot.
286  * For no particularly comprehensible reason, it doesn't
287  * bother doing so when ExitBootServices() is called.
288  */
289  if ( ( efirc = bs->CreateEvent ( EVT_SIGNAL_EXIT_BOOT_SERVICES,
291  NULL, &efi_shutdown_event ) ) != 0 ) {
292  rc = -EEFI ( efirc );
293  DBGC ( systab, "EFI could not create ExitBootServices event: "
294  "%s\n", strerror ( rc ) );
295  goto err_create_event;
296  }
297 
298  /* Install driver binding protocol */
299  if ( ( rc = efi_driver_install() ) != 0 ) {
300  DBGC ( systab, "EFI could not install driver: %s\n",
301  strerror ( rc ) );
302  efirc = EFIRC ( rc );
303  goto err_driver_install;
304  }
305 
306  /* Install image unload method */
308 
309  return 0;
310 
312  err_driver_install:
314  err_create_event:
316  err_alloc_device_path:
317  err_no_device_path:
318  err_no_loaded_image:
319  err_missing_table:
320  err_missing_protocol:
321  err_sanity:
322  return efirc;
323 }
void efi_driver_uninstall(void)
Uninstall EFI driver.
Definition: efi_driver.c:418
union edd_device_path device_path
Device path.
Definition: edd.h:24
EFI_BOOT_SERVICES * BootServices
A pointer to the EFI Boot Services Table.
Definition: UefiSpec.h:2000
void ** protocol
Variable containing pointer to protocol structure.
Definition: efi.h:79
EFI_LOADED_IMAGE_PROTOCOL * efi_loaded_image
Loaded image protocol for this image.
Definition: efi_init.c:36
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
#define EEFI(efirc)
Convert an EFI status code to an iPXE status code.
Definition: efi.h:162
EFI_LOCATE_PROTOCOL LocateProtocol
Definition: UefiSpec.h:1914
EFI_GUID guid
GUID.
Definition: efi.h:77
#define DBGC(...)
Definition: compiler.h:505
EFI_GUID efi_loaded_image_protocol_guid
Loaded image protocol GUID.
Definition: efi_guid.c:184
size_t efi_path_len(EFI_DEVICE_PATH_PROTOCOL *path)
Find length of device path (excluding terminator)
Definition: efi_path.c:67
EFI_CLOSE_EVENT CloseEvent
Definition: UefiSpec.h:1864
VOID * ImageBase
The base address at which the image was loaded.
Definition: LoadedImage.h:75
This protocol can be used on any device handle to obtain generic path/location information concerning...
Definition: DevicePath.h:51
#define TPL_NOTIFY
Definition: UefiSpec.h:592
#define EFI_PROTOCOLS
EFI protocol table.
Definition: efi.h:85
#define EVT_SIGNAL_EXIT_BOOT_SERVICES
Definition: UefiSpec.h:396
#define EFI_CONFIG_TABLES
EFI configuration table table.
Definition: efi.h:129
An EFI configuration table used by iPXE.
Definition: efi.h:119
EFI_DEVICE_PATH_PROTOCOL * efi_loaded_image_path
Device path for the loaded image's device handle.
Definition: efi_init.c:39
void * memcpy(void *dest, const void *src, size_t len) __nonnull
#define EFI_NOT_AVAILABLE_YET
If this value is returned by an API, it means the capability is not yet installed/available/ready to ...
Definition: PiMultiPhase.h:55
EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL * ConOut
A pointer to the EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL interface that is associated with ConsoleOutHandle.
Definition: UefiSpec.h:1982
static EFI_EVENT efi_shutdown_event
Event used to signal shutdown.
Definition: efi_init.c:60
static EFIAPI void efi_shutdown_hook(EFI_EVENT event __unused, void *context __unused)
Shut down in preparation for booting an OS.
Definition: efi_init.c:82
EFI_CREATE_EVENT CreateEvent
Definition: UefiSpec.h:1860
static void * efi_find_table(EFI_GUID *guid)
Look up EFI configuration table.
Definition: efi_init.c:111
const char * efi_devpath_text(EFI_DEVICE_PATH_PROTOCOL *path)
Get textual representation of device path.
Definition: efi_debug.c:375
#define EFI_OPEN_PROTOCOL_GET_PROTOCOL
Definition: UefiSpec.h:1271
An EFI protocol used by iPXE.
Definition: efi.h:75
const char * efi_guid_ntoa(CONST EFI_GUID *guid)
Convert GUID to a printable string.
Definition: efi_debug.c:192
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:78
EFI Boot Services Table.
Definition: UefiSpec.h:1836
EFI_HANDLE efi_image_handle
Image handle passed to entry point.
Definition: efi_init.c:33
EFI_IMAGE_UNLOAD Unload
Definition: LoadedImage.h:79
#define for_each_table_entry(pointer, table)
Iterate through all entries within a linker table.
Definition: tables.h:385
EFI_GUID efi_device_path_protocol_guid
Device path protocol GUID.
Definition: efi_guid.c:132
EFI_FREE_POOL FreePool
Definition: UefiSpec.h:1855
void ** table
Variable containing pointer to configuration table.
Definition: efi.h:123
int required
Protocol is required.
Definition: efi.h:81
EFI_RUNTIME_SERVICES * RuntimeServices
A pointer to the EFI Runtime Services Table.
Definition: UefiSpec.h:1996
EFI_GUID guid
GUID.
Definition: efi.h:121
RETURN_STATUS EFI_STATUS
Function return status for EFI API.
Definition: UefiBaseType.h:35
static EFI_EXIT efi_exit
Exit function.
Definition: efi_init.c:70
EFI_SYSTEM_TABLE * efi_systab
EFI_OPEN_PROTOCOL OpenProtocol
Definition: UefiSpec.h:1905
The data portions of a loaded Boot Serves Driver, and the default data allocation type used by a Boot...
int required
Table is required for operation.
Definition: efi.h:125
static EFI_STATUS EFIAPI efi_unload(EFI_HANDLE image_handle)
Shut down EFI environment.
Definition: efi_init.c:330
#define NULL
NULL pointer (VOID *)
Definition: Base.h:362
int efi_driver_install(void)
Install EFI driver.
Definition: efi_driver.c:385
#define EFIRC(rc)
Convert an iPXE status code to an EFI status code.
Definition: efi.h:154
EFI_HANDLE DeviceHandle
The device handle that the EFI Image was loaded from.
Definition: LoadedImage.h:61
EFI_ALLOCATE_POOL AllocatePool
Definition: UefiSpec.h:1854

References EFI_BOOT_SERVICES::AllocatePool, EFI_SYSTEM_TABLE::BootServices, EFI_BOOT_SERVICES::CloseEvent, EFI_SYSTEM_TABLE::ConOut, EFI_BOOT_SERVICES::CreateEvent, DBGC, device_path, EFI_LOADED_IMAGE_PROTOCOL::DeviceHandle, EEFI, EFI_CONFIG_TABLES, efi_device_path_protocol_guid, efi_devpath_text(), efi_driver_install(), efi_driver_uninstall(), efi_exit, efi_find_table(), efi_guid_ntoa(), efi_image_handle, efi_loaded_image, efi_loaded_image_path, efi_loaded_image_protocol_guid, EFI_NOT_AVAILABLE_YET, EFI_OPEN_PROTOCOL_GET_PROTOCOL, efi_path_len(), EFI_PROTOCOLS, efi_shutdown_event, efi_shutdown_hook(), efi_systab, efi_unload(), EfiBootServicesData, EFIRC, EVT_SIGNAL_EXIT_BOOT_SERVICES, EFI_BOOT_SERVICES::Exit, for_each_table_entry, EFI_BOOT_SERVICES::FreePool, efi_protocol::guid, efi_config_table::guid, EFI_LOADED_IMAGE_PROTOCOL::ImageBase, EFI_BOOT_SERVICES::LocateProtocol, memcpy(), NULL, EFI_BOOT_SERVICES::OpenProtocol, efi_protocol::protocol, rc, efi_protocol::required, efi_config_table::required, EFI_SYSTEM_TABLE::RuntimeServices, strerror(), efi_config_table::table, TPL_NOTIFY, and EFI_LOADED_IMAGE_PROTOCOL::Unload.

Referenced by _efi_start(), and _efidrv_start().

◆ __stack_chk_fail()

void __stack_chk_fail ( void  )

Abort on stack check failure.

Definition at line 367 of file efi_init.c.

367  {
368  EFI_STATUS efirc;
369  int rc;
370 
371  /* Report failure (when debugging) */
372  DBGC ( efi_systab, "EFI stack check failed (cookie %#lx); aborting\n",
374 
375  /* Attempt to exit cleanly with an error status */
376  if ( efi_exit ) {
378  0, NULL );
379  rc = -EEFI ( efirc );
380  DBGC ( efi_systab, "EFI stack check exit failed: %s\n",
381  strerror ( rc ) );
382  }
383 
384  /* If the exit fails for any reason, lock the system */
385  while ( 1 ) {}
386 
387 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
#define EEFI(efirc)
Convert an EFI status code to an iPXE status code.
Definition: efi.h:162
#define DBGC(...)
Definition: compiler.h:505
#define EFI_COMPROMISED_DATA
Enumeration of EFI_STATUS.
Definition: UefiBaseType.h:151
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:78
EFI_HANDLE efi_image_handle
Image handle passed to entry point.
Definition: efi_init.c:33
unsigned long __stack_chk_guard
Stack cookie.
Definition: efi_init.c:63
RETURN_STATUS EFI_STATUS
Function return status for EFI API.
Definition: UefiBaseType.h:35
static EFI_EXIT efi_exit
Exit function.
Definition: efi_init.c:70
EFI_SYSTEM_TABLE * efi_systab
#define NULL
NULL pointer (VOID *)
Definition: Base.h:362

References __stack_chk_guard, DBGC, EEFI, EFI_COMPROMISED_DATA, efi_exit, efi_image_handle, efi_systab, NULL, rc, and strerror().

◆ efi_raise_tpl()

void efi_raise_tpl ( struct efi_saved_tpl tpl)

Raise task priority level to internal level.

Parameters
tplSaved TPL

Definition at line 394 of file efi_init.c.

394  {
396 
397  /* Record current external TPL */
398  tpl->previous = efi_external_tpl;
399 
400  /* Raise TPL and record previous TPL as new external TPL */
401  tpl->current = bs->RaiseTPL ( efi_internal_tpl );
402  efi_external_tpl = tpl->current;
403 }
EFI_BOOT_SERVICES * BootServices
A pointer to the EFI Boot Services Table.
Definition: UefiSpec.h:2000
EFI_RAISE_TPL RaiseTPL
Definition: UefiSpec.h:1845
EFI_TPL efi_internal_tpl
Internal task priority level.
Definition: efi_init.c:51
EFI_TPL current
Current external TPL.
Definition: efi.h:69
EFI Boot Services Table.
Definition: UefiSpec.h:1836
EFI_TPL previous
Previous external TPL.
Definition: efi.h:71
EFI_SYSTEM_TABLE * efi_systab
EFI_TPL efi_external_tpl
External task priority level.
Definition: efi_init.c:54

References EFI_SYSTEM_TABLE::BootServices, efi_saved_tpl::current, efi_external_tpl, efi_internal_tpl, efi_systab, efi_saved_tpl::previous, and EFI_BOOT_SERVICES::RaiseTPL.

Referenced by _efidrv_start(), efi_driver_start(), efi_driver_stop(), efi_snp_add_claim(), efi_snp_get_status(), efi_snp_initialize(), efi_snp_receive(), efi_snp_reset(), efi_snp_shutdown(), efi_snp_transmit(), efi_snp_wait_for_packet(), efi_unload(), efi_usb_async_interrupt_transfer(), efi_usb_bulk_transfer(), efi_usb_control_transfer(), efi_usb_get_string_descriptor(), and efi_usb_sync_interrupt_transfer().

◆ efi_restore_tpl()

void efi_restore_tpl ( struct efi_saved_tpl tpl)

Restore task priority level.

Parameters
tplSaved TPL

Definition at line 410 of file efi_init.c.

410  {
412 
413  /* Restore external TPL */
414  efi_external_tpl = tpl->previous;
415 
416  /* Restore TPL */
417  bs->RestoreTPL ( tpl->current );
418 }
EFI_BOOT_SERVICES * BootServices
A pointer to the EFI Boot Services Table.
Definition: UefiSpec.h:2000
EFI_TPL current
Current external TPL.
Definition: efi.h:69
EFI Boot Services Table.
Definition: UefiSpec.h:1836
EFI_TPL previous
Previous external TPL.
Definition: efi.h:71
EFI_SYSTEM_TABLE * efi_systab
EFI_RESTORE_TPL RestoreTPL
Definition: UefiSpec.h:1846
EFI_TPL efi_external_tpl
External task priority level.
Definition: efi_init.c:54

References EFI_SYSTEM_TABLE::BootServices, efi_saved_tpl::current, efi_external_tpl, efi_systab, efi_saved_tpl::previous, and EFI_BOOT_SERVICES::RestoreTPL.

Referenced by _efidrv_start(), efi_driver_start(), efi_driver_stop(), efi_snp_add_claim(), efi_snp_get_status(), efi_snp_initialize(), efi_snp_receive(), efi_snp_reset(), efi_snp_shutdown(), efi_snp_transmit(), efi_snp_wait_for_packet(), efi_unload(), efi_usb_async_interrupt_transfer(), efi_usb_bulk_transfer(), efi_usb_control_transfer(), efi_usb_get_string_descriptor(), and efi_usb_sync_interrupt_transfer().

Variable Documentation

◆ efi_image_handle

EFI_HANDLE efi_image_handle

◆ efi_loaded_image

EFI_LOADED_IMAGE_PROTOCOL* efi_loaded_image

Loaded image protocol for this image.

Definition at line 36 of file efi_init.c.

Referenced by _efi_start(), chained_locate(), efi_autoexec_startup(), efi_init(), efi_init_application(), and efi_local_open_path().

◆ efi_loaded_image_path

EFI_DEVICE_PATH_PROTOCOL* efi_loaded_image_path

Device path for the loaded image's device handle.

Definition at line 39 of file efi_init.c.

Referenced by efi_init(), efi_local_open_volume(), and efi_unload().

◆ efi_internal_tpl

EFI_TPL efi_internal_tpl = TPL_CALLBACK

Internal task priority level.

Definition at line 51 of file efi_init.c.

Referenced by efi_currticks(), efi_entropy_disable(), efi_raise_tpl(), efi_shutdown_hook(), and nii_issue_cpb_db().

◆ efi_external_tpl

EFI_TPL efi_external_tpl = TPL_APPLICATION

External task priority level.

Definition at line 54 of file efi_init.c.

Referenced by efi_currticks(), efi_entropy_enable(), efi_raise_tpl(), and efi_restore_tpl().

◆ efi_shutdown_in_progress

int efi_shutdown_in_progress

◆ efi_shutdown_event

EFI_EVENT efi_shutdown_event
static

Event used to signal shutdown.

Definition at line 60 of file efi_init.c.

Referenced by efi_init(), and efi_unload().

◆ __stack_chk_guard

unsigned long __stack_chk_guard

Stack cookie.

Definition at line 63 of file efi_init.c.

Referenced by __stack_chk_fail(), and efi_init_stack_guard().

◆ efi_exit

EFI_EXIT efi_exit
static

Exit function.

Cached to minimise external dependencies when a stack check failure is triggered.

Definition at line 70 of file efi_init.c.

Referenced by __stack_chk_fail(), and efi_init().