[1/2] efi: libstub: Fix the retriving of supported rutime services

Message ID 20230131040355.3116-2-justin.he@arm.com
State New
Headers
Series Fix boot hang issue on Ampere Emag server |

Commit Message

Justin He Jan. 31, 2023, 4:03 a.m. UTC
  If retrieving UEFI configuration table is failed, the supported runtime
services mask should be regarded as 0 instead of EFI_RT_SUPPORTED_ALL.
Otherwise efi_novamap might be incorrectly assigned to "false" on the
Ampere Emag server.

Signed-off-by: Jia He <justin.he@arm.com>
---
 drivers/firmware/efi/libstub/efi-stub.c | 2 ++
 1 file changed, 2 insertions(+)
  

Comments

Ard Biesheuvel Jan. 31, 2023, 7:04 a.m. UTC | #1
On Tue, 31 Jan 2023 at 05:04, Jia He <justin.he@arm.com> wrote:
>
> If retrieving UEFI configuration table is failed, the supported runtime
> services mask should be regarded as 0 instead of EFI_RT_SUPPORTED_ALL.
> Otherwise efi_novamap might be incorrectly assigned to "false" on the
> Ampere Emag server.
>
> Signed-off-by: Jia He <justin.he@arm.com>
> ---
>  drivers/firmware/efi/libstub/efi-stub.c | 2 ++
>  1 file changed, 2 insertions(+)
>
> diff --git a/drivers/firmware/efi/libstub/efi-stub.c b/drivers/firmware/efi/libstub/efi-stub.c
> index 2955c1ac6a36..f24b5436729c 100644
> --- a/drivers/firmware/efi/libstub/efi-stub.c
> +++ b/drivers/firmware/efi/libstub/efi-stub.c
> @@ -111,6 +111,8 @@ static u32 get_supported_rt_services(void)
>         rt_prop_table = get_efi_config_table(EFI_RT_PROPERTIES_TABLE_GUID);
>         if (rt_prop_table)
>                 supported &= rt_prop_table->runtime_services_supported;
> +       else
> +               supported = 0;
>
>         return supported;
>  }

Hello Justin,

This is not how things are supposed to work. On systems that do not
implement the RT properties table, all runtime services are assumed to
be implemented.

Note that this table is informational only - the runtime services
themselves must be callable and return EFI_UNSUPPORTED if they are
marked as unavailable in the RT properties table.
  

Patch

diff --git a/drivers/firmware/efi/libstub/efi-stub.c b/drivers/firmware/efi/libstub/efi-stub.c
index 2955c1ac6a36..f24b5436729c 100644
--- a/drivers/firmware/efi/libstub/efi-stub.c
+++ b/drivers/firmware/efi/libstub/efi-stub.c
@@ -111,6 +111,8 @@  static u32 get_supported_rt_services(void)
 	rt_prop_table = get_efi_config_table(EFI_RT_PROPERTIES_TABLE_GUID);
 	if (rt_prop_table)
 		supported &= rt_prop_table->runtime_services_supported;
+	else
+		supported = 0;
 
 	return supported;
 }