aboutsummaryrefslogtreecommitdiff
path: root/src/interface
diff options
context:
space:
mode:
authorMichael Brown <mcb30@ipxe.org>2020-10-01 15:44:05 +0100
committerMichael Brown <mcb30@ipxe.org>2020-10-01 15:44:05 +0100
commit7151fa3ffac09c316e2f7c2d3d384f1417325c0f (patch)
tree91ada3c1f3a01e451da68b59e83347a10f14772d /src/interface
parent8344803c934c71c7eebb6b706d73a8c00d57b713 (diff)
downloadipxe-7151fa3ffac09c316e2f7c2d3d384f1417325c0f.zip
ipxe-7151fa3ffac09c316e2f7c2d3d384f1417325c0f.tar.gz
ipxe-7151fa3ffac09c316e2f7c2d3d384f1417325c0f.tar.bz2
[efi] Allow DEBUG=efi_wrap to be used independently of a loaded image
Allow temporary debugging code to call efi_wrap_systab() to obtain a pointer to the wrapper EFI system table. This can then be used to e.g. forcibly overwrite the boot services table pointer used by an already loaded and running UEFI driver, in order to trace calls made by that driver. Signed-off-by: Michael Brown <mcb30@ipxe.org>
Diffstat (limited to 'src/interface')
-rw-r--r--src/interface/efi/efi_wrap.c59
1 files changed, 34 insertions, 25 deletions
diff --git a/src/interface/efi/efi_wrap.c b/src/interface/efi/efi_wrap.c
index 66d2d29..5c02a7e 100644
--- a/src/interface/efi/efi_wrap.c
+++ b/src/interface/efi/efi_wrap.c
@@ -37,14 +37,8 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
#include <ipxe/efi/Protocol/LoadedImage.h>
#include <ipxe/efi/efi_wrap.h>
-/** EFI system table wrapper */
-static EFI_SYSTEM_TABLE efi_systab_wrapper;
-
-/** EFI boot services table wrapper */
-static EFI_BOOT_SERVICES efi_bs_wrapper;
-
/** Colour for debug messages */
-#define colour &efi_systab_wrapper
+#define colour &efi_systab
/**
* Convert EFI status code to text
@@ -1135,28 +1129,17 @@ efi_create_event_ex_wrapper ( UINT32 type, EFI_TPL notify_tpl,
}
/**
- * Wrap the calls made by a loaded image
+ * Build table wrappers
*
- * @v handle Image handle
+ * @ret systab Wrapped system table
*/
- void efi_wrap ( EFI_HANDLE handle ) {
+EFI_SYSTEM_TABLE * efi_wrap_systab ( void ) {
+ static EFI_SYSTEM_TABLE efi_systab_wrapper;
+ static EFI_BOOT_SERVICES efi_bs_wrapper;
EFI_BOOT_SERVICES *bs = efi_systab->BootServices;
- union {
- EFI_LOADED_IMAGE_PROTOCOL *image;
- void *intf;
- } loaded;
- EFI_STATUS efirc;
- int rc;
- /* Do nothing unless debugging is enabled */
- if ( ! DBG_LOG )
- return;
-
- /* Populate table wrappers */
- memcpy ( &efi_systab_wrapper, efi_systab,
- sizeof ( efi_systab_wrapper ) );
+ /* Build boot services table wrapper */
memcpy ( &efi_bs_wrapper, bs, sizeof ( efi_bs_wrapper ) );
- efi_systab_wrapper.BootServices = &efi_bs_wrapper;
efi_bs_wrapper.RaiseTPL = efi_raise_tpl_wrapper;
efi_bs_wrapper.RestoreTPL = efi_restore_tpl_wrapper;
efi_bs_wrapper.AllocatePages = efi_allocate_pages_wrapper;
@@ -1211,6 +1194,32 @@ efi_create_event_ex_wrapper ( UINT32 type, EFI_TPL notify_tpl,
= efi_uninstall_multiple_protocol_interfaces_wrapper;
efi_bs_wrapper.CreateEventEx = efi_create_event_ex_wrapper;
+ /* Build system table wrapper */
+ memcpy ( &efi_systab_wrapper, efi_systab,
+ sizeof ( efi_systab_wrapper ) );
+ efi_systab_wrapper.BootServices = &efi_bs_wrapper;
+
+ return &efi_systab_wrapper;
+}
+
+/**
+ * Wrap the calls made by a loaded image
+ *
+ * @v handle Image handle
+ */
+void efi_wrap ( EFI_HANDLE handle ) {
+ EFI_BOOT_SERVICES *bs = efi_systab->BootServices;
+ union {
+ EFI_LOADED_IMAGE_PROTOCOL *image;
+ void *intf;
+ } loaded;
+ EFI_STATUS efirc;
+ int rc;
+
+ /* Do nothing unless debugging is enabled */
+ if ( ! DBG_LOG )
+ return;
+
/* Open loaded image protocol */
if ( ( efirc = bs->OpenProtocol ( handle,
&efi_loaded_image_protocol_guid,
@@ -1223,7 +1232,7 @@ efi_create_event_ex_wrapper ( UINT32 type, EFI_TPL notify_tpl,
}
/* Provide system table wrapper to image */
- loaded.image->SystemTable = &efi_systab_wrapper;
+ loaded.image->SystemTable = efi_wrap_systab();
DBGC ( colour, "WRAP %s at base %p has protocols:\n",
efi_handle_name ( handle ), loaded.image->ImageBase );
DBGC_EFI_PROTOCOLS ( colour, handle );