[PATCH 5/7] Allow efi_loader header to be included always

Heinrich Schuchardt xypron.glpk at gmx.de
Mon Jun 28 13:02:25 CEST 2021


On 6/28/21 3:48 AM, Simon Glass wrote:
> It is bad practice to put function declarations behind an #ifdef since
> it makes it impossible to use IS_ENABLED() in the C code.
>
> This header provides two different versions of various functions. Collect
> them together in one place for clarity. Allow all the rest of the header
> to be included, regardless of the setting of EFI_LOADER.
>
> Signed-off-by: Simon Glass <sjg at chromium.org>
> ---
>
>   include/efi_loader.h | 186 ++++++++++++++++++++++---------------------
>   1 file changed, 95 insertions(+), 91 deletions(-)
>
> diff --git a/include/efi_loader.h b/include/efi_loader.h
> index 0a9c82a257e..2d532c5ccbb 100644
> --- a/include/efi_loader.h
> +++ b/include/efi_loader.h
> @@ -28,12 +28,104 @@ static inline void *guidcpy(void *dst, const void *src)
>   	return memcpy(dst src, sizeof(efi_guid_t));
>   }
>
> -/* No need for efi loader support in SPL */
> -#if CONFIG_IS_ENABLED(EFI_LOADER)
> -
>   #include <linux/list.h>
>   #include <linux/oid_registry.h>

Why are these includes not listed with the other includes? Please, move
them up.

Why should we have both "#include <blk.h>" and "struct blk_desc;"? I
assume "struct blk_desc;" can be eliminated. Cf. e6f6f9e64882 ("common:
Drop part.h from common header")

Hiding "efi_status_t efi_add_runtime_mmio()" through "efi_status_t
efi_launch_capsules()" behind "#if CONFIG_IS_ENABLED(EFI_LOADER)"
contradicts the commit message.

+CC Alex, reviewer EFI PAYLOAD

Best regards

Heinrich

>
> +#if CONFIG_IS_ENABLED(EFI_LOADER)
> +
> +/**
> + * __efi_runtime_data - declares a non-const variable for EFI runtime section
> + *
> + * This macro indicates that a variable is non-const and should go into the
> + * EFI runtime section, and thus still be available when the OS is running.
> + *
> + * Only use on variables not declared const.
> + *
> + * Example:
> + *
> + * ::
> + *
> + *   static __efi_runtime_data my_computed_table[256];
> + */
> +#define __efi_runtime_data __section(".data.efi_runtime")
> +
> +/**
> + * __efi_runtime_rodata - declares a read-only variable for EFI runtime section
> + *
> + * This macro indicates that a variable is read-only (const) and should go into
> + * the EFI runtime section, and thus still be available when the OS is running.
> + *
> + * Only use on variables also declared const.
> + *
> + * Example:
> + *
> + * ::
> + *
> + *   static const __efi_runtime_rodata my_const_table[] = { 1, 2, 3 };
> + */
> +#define __efi_runtime_rodata __section(".rodata.efi_runtime")
> +
> +/**
> + * __efi_runtime - declares a function for EFI runtime section
> + *
> + * This macro indicates that a function should go into the EFI runtime section,
> + * and thus still be available when the OS is running.
> + *
> + * Example:
> + *
> + * ::
> + *
> + *   static __efi_runtime compute_my_table(void);
> + */
> +#define __efi_runtime __section(".text.efi_runtime")
> +
> +/*
> + * Call this with mmio_ptr as the _pointer_ to a pointer to an MMIO region
> + * to make it available at runtime
> + */
> +efi_status_t efi_add_runtime_mmio(void *mmio_ptr, u64 len);
> +
> +/*
> + * Special case handler for error/abort that just tries to dtrt to get
> + * back to u-boot world
> + */
> +void efi_restore_gd(void);
> +/* Call this to set the current device name */
> +void efi_set_bootdev(const char *dev, const char *devnr, const char *path,
> +		     void *buffer, size_t buffer_size);
> +/* Called by networking code to memorize the dhcp ack package */
> +void efi_net_set_dhcp_ack(void *pkt, int len);
> +/* Print information about all loaded images */
> +void efi_print_image_infos(void *pc);
> +
> +/* Hook at initialization */
> +efi_status_t efi_launch_capsules(void);
> +
> +#else /* CONFIG_IS_ENABLED(EFI_LOADER) */
> +
> +/* Without CONFIG_EFI_LOADER we don't have a runtime section, stub it out */
> +#define __efi_runtime_data
> +#define __efi_runtime_rodata
> +#define __efi_runtime
> +static inline efi_status_t efi_add_runtime_mmio(void *mmio_ptr, u64 len)
> +{
> +	return EFI_SUCCESS;
> +}
> +
> +/* No loader configured, stub out EFI_ENTRY */
> +static inline void efi_restore_gd(void) { }
> +static inline void efi_set_bootdev(const char *dev, const char *devnr,
> +				   const char *path, void *buffer,
> +				   size_t buffer_size) { }
> +static inline void efi_net_set_dhcp_ack(void *pkt, int len) { }
> +static inline void efi_print_image_infos(void *pc) { }
> +static inline efi_status_t efi_launch_capsules(void)
> +{
> +	return EFI_SUCCESS;
> +}
> +
> +#endif /* CONFIG_IS_ENABLED(EFI_LOADER) */
> +
>   /* Maximum number of configuration tables */
>   #define EFI_MAX_CONFIGURATION_TABLES 16
>
> @@ -465,8 +557,6 @@ efi_status_t efi_smbios_register(void);
>   struct efi_simple_file_system_protocol *
>   efi_fs_from_path(struct efi_device_path *fp);
>
> -/* Called by networking code to memorize the dhcp ack package */
> -void efi_net_set_dhcp_ack(void *pkt, int len);
>   /* Called by efi_set_watchdog_timer to reset the timer */
>   efi_status_t efi_set_watchdog(unsigned long timeout);
>
> @@ -480,14 +570,8 @@ efi_status_t efi_load_pe(struct efi_loaded_image_obj *handle,
>   			 struct efi_loaded_image *loaded_image_info);
>   /* Called once to store the pristine gd pointer */
>   void efi_save_gd(void);
> -/* Special case handler for error/abort that just tries to dtrt to get
> - * back to u-boot world */
> -void efi_restore_gd(void);
>   /* Call this to relocate the runtime section to an address space */
>   void efi_runtime_relocate(ulong offset, struct efi_mem_desc *map);
> -/* Call this to set the current device name */
> -void efi_set_bootdev(const char *dev, const char *devnr, const char *path,
> -		     void *buffer, size_t buffer_size);
>   /* Add a new object to the object list. */
>   void efi_add_handle(efi_handle_t obj);
>   /* Create handle */
> @@ -619,8 +703,6 @@ efi_status_t efi_setup_loaded_image(struct efi_device_path *device_path,
>   				    struct efi_device_path *file_path,
>   				    struct efi_loaded_image_obj **handle_ptr,
>   				    struct efi_loaded_image **info_ptr);
> -/* Print information about all loaded images */
> -void efi_print_image_infos(void *pc);
>
>   #ifdef CONFIG_EFI_LOADER_BOUNCE_BUFFER
>   extern void *efi_bounce_buffer;
> @@ -682,62 +764,12 @@ ssize_t efi_dp_check_length(const struct efi_device_path *dp,
>   	(((_dp)->type == DEVICE_PATH_TYPE_##_type) && \
>   	 ((_dp)->sub_type == DEVICE_PATH_SUB_TYPE_##_subtype))
>
> -/**
> - * __efi_runtime_data - declares a non-const variable for EFI runtime section
> - *
> - * This macro indicates that a variable is non-const and should go into the
> - * EFI runtime section, and thus still be available when the OS is running.
> - *
> - * Only use on variables not declared const.
> - *
> - * Example:
> - *
> - * ::
> - *
> - *   static __efi_runtime_data my_computed_table[256];
> - */
> -#define __efi_runtime_data __section(".data.efi_runtime")
> -
> -/**
> - * __efi_runtime_rodata - declares a read-only variable for EFI runtime section
> - *
> - * This macro indicates that a variable is read-only (const) and should go into
> - * the EFI runtime section, and thus still be available when the OS is running.
> - *
> - * Only use on variables also declared const.
> - *
> - * Example:
> - *
> - * ::
> - *
> - *   static const __efi_runtime_rodata my_const_table[] = { 1, 2, 3 };
> - */
> -#define __efi_runtime_rodata __section(".rodata.efi_runtime")
> -
> -/**
> - * __efi_runtime - declares a function for EFI runtime section
> - *
> - * This macro indicates that a function should go into the EFI runtime section,
> - * and thus still be available when the OS is running.
> - *
> - * Example:
> - *
> - * ::
> - *
> - *   static __efi_runtime compute_my_table(void);
> - */
> -#define __efi_runtime __section(".text.efi_runtime")
> -
>   /* Indicate supported runtime services */
>   efi_status_t efi_init_runtime_supported(void);
>
>   /* Update CRC32 in table header */
>   void __efi_runtime efi_update_table_header_crc32(struct efi_table_hdr *table);
>
> -/* Call this with mmio_ptr as the _pointer_ to a pointer to an MMIO region
> - * to make it available at runtime */
> -efi_status_t efi_add_runtime_mmio(void *mmio_ptr, u64 len);
> -
>   /* Boards may provide the functions below to implement RTS functionality */
>
>   void __efi_runtime EFIAPI efi_reset_system(
> @@ -926,34 +958,6 @@ efi_status_t efi_capsule_authenticate(const void *capsule,
>
>   #define EFI_CAPSULE_DIR L"\\EFI\\UpdateCapsule\\"
>
> -/* Hook at initialization */
> -efi_status_t efi_launch_capsules(void);
> -
> -#else /* CONFIG_IS_ENABLED(EFI_LOADER) */
> -
> -/* Without CONFIG_EFI_LOADER we don't have a runtime section, stub it out */
> -#define __efi_runtime_data
> -#define __efi_runtime_rodata
> -#define __efi_runtime
> -static inline efi_status_t efi_add_runtime_mmio(void *mmio_ptr, u64 len)
> -{
> -	return EFI_SUCCESS;
> -}
> -
> -/* No loader configured, stub out EFI_ENTRY */
> -static inline void efi_restore_gd(void) { }
> -static inline void efi_set_bootdev(const char *dev, const char *devnr,
> -				   const char *path, void *buffer,
> -				   size_t buffer_size) { }
> -static inline void efi_net_set_dhcp_ack(void *pkt, int len) { }
> -static inline void efi_print_image_infos(void *pc) { }
> -static inline efi_status_t efi_launch_capsules(void)
> -{
> -	return EFI_SUCCESS;
> -}
> -
> -#endif /* CONFIG_IS_ENABLED(EFI_LOADER) */
> -
>   /**
>    * Install the ESRT system table.
>    *
>



More information about the U-Boot mailing list