diff mbox series

[v8,11/25] efi: Share struct efi_priv between the app and stub code

Message ID 20211229185759.1432518-11-sjg@chromium.org
State Accepted, archived
Delegated to: Heinrich Schuchardt
Headers show
Series efi: Improvements to U-Boot running on top of UEFI | expand

Commit Message

Simon Glass Dec. 29, 2021, 6:57 p.m. UTC
At present each of these has its own static variable and helper functions.
Move them into a shared file.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

(no changes since v1)

 include/efi.h      | 21 +++++++++++++++++++++
 lib/efi/efi.c      | 29 +++++++++++++++++++++++++++++
 lib/efi/efi_app.c  | 21 ++-------------------
 lib/efi/efi_stub.c |  7 ++++---
 4 files changed, 56 insertions(+), 22 deletions(-)

Comments

Heinrich Schuchardt Dec. 31, 2021, 5:11 a.m. UTC | #1
On 12/29/21 19:57, Simon Glass wrote:
> At present each of these has its own static variable and helper functions.
> Move them into a shared file.
>
> Signed-off-by: Simon Glass <sjg@chromium.org>
> ---
>
> (no changes since v1)
>
>   include/efi.h      | 21 +++++++++++++++++++++
>   lib/efi/efi.c      | 29 +++++++++++++++++++++++++++++
>   lib/efi/efi_app.c  | 21 ++-------------------
>   lib/efi/efi_stub.c |  7 ++++---
>   4 files changed, 56 insertions(+), 22 deletions(-)
>
> diff --git a/include/efi.h b/include/efi.h
> index 57ca2f424ab..d4785478585 100644
> --- a/include/efi.h
> +++ b/include/efi.h
> @@ -474,6 +474,27 @@ extern char _binary_u_boot_bin_start[], _binary_u_boot_bin_end[];
>   				EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS | \
>   				EFI_VARIABLE_APPEND_WRITE)
>
> +/**
> + * efi_get_priv() - Get access to the EFI-private information
> + *
> + * This struct it used by both the stub and the app to record things about the
> + * EFI environment. It is not available in U-Boot proper after the stub has
> + * jumped there. Use efi_info_get() to obtain info in that case.
> + *
> + * @return pointer to private info

%s/@return/Return:/

See
https://www.kernel.org/doc/html/latest/doc-guide/kernel-doc.html#function-documentation

I will correct this when merging.

Best regards

Heinrich

> + */
> +struct efi_priv *efi_get_priv(void);
> +
> +/**
> + * efi_set_priv() - Set up a pointer to the EFI-private information
> + *
> + * This is called in the stub and app to record the location of this
> + * information.
> + *
> + * @priv: New location of private data
> + */
> +void efi_set_priv(struct efi_priv *priv);
> +
>   /**
>    * efi_get_sys_table() - Get access to the main EFI system table
>    *
> diff --git a/lib/efi/efi.c b/lib/efi/efi.c
> index 69e52e45748..cd6bf47b180 100644
> --- a/lib/efi/efi.c
> +++ b/lib/efi/efi.c
> @@ -1,5 +1,7 @@
>   // SPDX-License-Identifier: GPL-2.0+
>   /*
> + * Functions shared by the app and stub
> + *
>    * Copyright (c) 2015 Google, Inc
>    *
>    * EFI information obtained here:
> @@ -17,6 +19,33 @@
>   #include <efi.h>
>   #include <efi_api.h>
>
> +static struct efi_priv *global_priv;
> +
> +struct efi_priv *efi_get_priv(void)
> +{
> +	return global_priv;
> +}
> +
> +void efi_set_priv(struct efi_priv *priv)
> +{
> +	global_priv = priv;
> +}
> +
> +struct efi_system_table *efi_get_sys_table(void)
> +{
> +	return global_priv->sys_table;
> +}
> +
> +struct efi_boot_services *efi_get_boot(void)
> +{
> +	return global_priv->boot;
> +}
> +
> +unsigned long efi_get_ram_base(void)
> +{
> +	return global_priv->ram_base;
> +}
> +
>   /*
>    * Global declaration of gd.
>    *
> diff --git a/lib/efi/efi_app.c b/lib/efi/efi_app.c
> index 852cf3679d6..2f1feda1b1e 100644
> --- a/lib/efi/efi_app.c
> +++ b/lib/efi/efi_app.c
> @@ -27,23 +27,6 @@
>
>   DECLARE_GLOBAL_DATA_PTR;
>
> -static struct efi_priv *global_priv;
> -
> -struct efi_system_table *efi_get_sys_table(void)
> -{
> -	return global_priv->sys_table;
> -}
> -
> -struct efi_boot_services *efi_get_boot(void)
> -{
> -	return global_priv->boot;
> -}
> -
> -unsigned long efi_get_ram_base(void)
> -{
> -	return global_priv->ram_base;
> -}
> -
>   int efi_info_get(enum efi_entry_t type, void **datap, int *sizep)
>   {
>   	return -ENOSYS;
> @@ -318,7 +301,7 @@ efi_status_t EFIAPI efi_main(efi_handle_t image,
>   	/* Set up access to EFI data structures */
>   	efi_init(priv, "App", image, sys_table);
>
> -	global_priv = priv;
> +	efi_set_priv(priv);
>
>   	/*
>   	 * Set up the EFI debug UART so that printf() works. This is
> @@ -344,7 +327,7 @@ efi_status_t EFIAPI efi_main(efi_handle_t image,
>
>   static void efi_exit(void)
>   {
> -	struct efi_priv *priv = global_priv;
> +	struct efi_priv *priv = efi_get_priv();
>
>   	free_memory(priv);
>   	printf("U-Boot EFI exiting\n");
> diff --git a/lib/efi/efi_stub.c b/lib/efi/efi_stub.c
> index 31f1e1a72a1..c89ae7c9072 100644
> --- a/lib/efi/efi_stub.c
> +++ b/lib/efi/efi_stub.c
> @@ -31,7 +31,6 @@
>   #error "This file needs to be ported for use on architectures"
>   #endif
>
> -static struct efi_priv *global_priv;
>   static bool use_uart;
>
>   struct __packed desctab_info {
> @@ -63,6 +62,8 @@ void _debug_uart_init(void)
>
>   void putc(const char ch)
>   {
> +	struct efi_priv *priv = efi_get_priv();
> +
>   	if (ch == '\n')
>   		putc('\r');
>
> @@ -73,7 +74,7 @@ void putc(const char ch)
>   			;
>   		outb(ch, (ulong)&com_port->thr);
>   	} else {
> -		efi_putc(global_priv, ch);
> +		efi_putc(priv, ch);
>   	}
>   }
>
> @@ -320,7 +321,7 @@ efi_status_t EFIAPI efi_main(efi_handle_t image,
>   		puts(" efi_init() failed\n");
>   		return ret;
>   	}
> -	global_priv = priv;
> +	efi_set_priv(priv);
>
>   	cs32 = get_codeseg32();
>   	if (cs32 < 0)
diff mbox series

Patch

diff --git a/include/efi.h b/include/efi.h
index 57ca2f424ab..d4785478585 100644
--- a/include/efi.h
+++ b/include/efi.h
@@ -474,6 +474,27 @@  extern char _binary_u_boot_bin_start[], _binary_u_boot_bin_end[];
 				EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS | \
 				EFI_VARIABLE_APPEND_WRITE)
 
+/**
+ * efi_get_priv() - Get access to the EFI-private information
+ *
+ * This struct it used by both the stub and the app to record things about the
+ * EFI environment. It is not available in U-Boot proper after the stub has
+ * jumped there. Use efi_info_get() to obtain info in that case.
+ *
+ * @return pointer to private info
+ */
+struct efi_priv *efi_get_priv(void);
+
+/**
+ * efi_set_priv() - Set up a pointer to the EFI-private information
+ *
+ * This is called in the stub and app to record the location of this
+ * information.
+ *
+ * @priv: New location of private data
+ */
+void efi_set_priv(struct efi_priv *priv);
+
 /**
  * efi_get_sys_table() - Get access to the main EFI system table
  *
diff --git a/lib/efi/efi.c b/lib/efi/efi.c
index 69e52e45748..cd6bf47b180 100644
--- a/lib/efi/efi.c
+++ b/lib/efi/efi.c
@@ -1,5 +1,7 @@ 
 // SPDX-License-Identifier: GPL-2.0+
 /*
+ * Functions shared by the app and stub
+ *
  * Copyright (c) 2015 Google, Inc
  *
  * EFI information obtained here:
@@ -17,6 +19,33 @@ 
 #include <efi.h>
 #include <efi_api.h>
 
+static struct efi_priv *global_priv;
+
+struct efi_priv *efi_get_priv(void)
+{
+	return global_priv;
+}
+
+void efi_set_priv(struct efi_priv *priv)
+{
+	global_priv = priv;
+}
+
+struct efi_system_table *efi_get_sys_table(void)
+{
+	return global_priv->sys_table;
+}
+
+struct efi_boot_services *efi_get_boot(void)
+{
+	return global_priv->boot;
+}
+
+unsigned long efi_get_ram_base(void)
+{
+	return global_priv->ram_base;
+}
+
 /*
  * Global declaration of gd.
  *
diff --git a/lib/efi/efi_app.c b/lib/efi/efi_app.c
index 852cf3679d6..2f1feda1b1e 100644
--- a/lib/efi/efi_app.c
+++ b/lib/efi/efi_app.c
@@ -27,23 +27,6 @@ 
 
 DECLARE_GLOBAL_DATA_PTR;
 
-static struct efi_priv *global_priv;
-
-struct efi_system_table *efi_get_sys_table(void)
-{
-	return global_priv->sys_table;
-}
-
-struct efi_boot_services *efi_get_boot(void)
-{
-	return global_priv->boot;
-}
-
-unsigned long efi_get_ram_base(void)
-{
-	return global_priv->ram_base;
-}
-
 int efi_info_get(enum efi_entry_t type, void **datap, int *sizep)
 {
 	return -ENOSYS;
@@ -318,7 +301,7 @@  efi_status_t EFIAPI efi_main(efi_handle_t image,
 	/* Set up access to EFI data structures */
 	efi_init(priv, "App", image, sys_table);
 
-	global_priv = priv;
+	efi_set_priv(priv);
 
 	/*
 	 * Set up the EFI debug UART so that printf() works. This is
@@ -344,7 +327,7 @@  efi_status_t EFIAPI efi_main(efi_handle_t image,
 
 static void efi_exit(void)
 {
-	struct efi_priv *priv = global_priv;
+	struct efi_priv *priv = efi_get_priv();
 
 	free_memory(priv);
 	printf("U-Boot EFI exiting\n");
diff --git a/lib/efi/efi_stub.c b/lib/efi/efi_stub.c
index 31f1e1a72a1..c89ae7c9072 100644
--- a/lib/efi/efi_stub.c
+++ b/lib/efi/efi_stub.c
@@ -31,7 +31,6 @@ 
 #error "This file needs to be ported for use on architectures"
 #endif
 
-static struct efi_priv *global_priv;
 static bool use_uart;
 
 struct __packed desctab_info {
@@ -63,6 +62,8 @@  void _debug_uart_init(void)
 
 void putc(const char ch)
 {
+	struct efi_priv *priv = efi_get_priv();
+
 	if (ch == '\n')
 		putc('\r');
 
@@ -73,7 +74,7 @@  void putc(const char ch)
 			;
 		outb(ch, (ulong)&com_port->thr);
 	} else {
-		efi_putc(global_priv, ch);
+		efi_putc(priv, ch);
 	}
 }
 
@@ -320,7 +321,7 @@  efi_status_t EFIAPI efi_main(efi_handle_t image,
 		puts(" efi_init() failed\n");
 		return ret;
 	}
-	global_priv = priv;
+	efi_set_priv(priv);
 
 	cs32 = get_codeseg32();
 	if (cs32 < 0)