From mboxrd@z Thu Jan 1 00:00:00 1970 From: AKASHI Takahiro Date: Thu, 13 Jun 2019 16:06:14 +0900 Subject: [U-Boot] [RFC 2/6] efi: add RuntimeServicesSupported variable In-Reply-To: <68c416d1-6bbf-83fe-979e-cb654e669ef6@gmx.de> References: <20190605042142.15113-1-takahiro.akashi@linaro.org> <20190605042142.15113-3-takahiro.akashi@linaro.org> <68c416d1-6bbf-83fe-979e-cb654e669ef6@gmx.de> Message-ID: <20190613070613.GC15190@linaro.org> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de On Thu, Jun 13, 2019 at 07:56:19AM +0200, Heinrich Schuchardt wrote: > > > On 6/5/19 6:21 AM, AKASHI Takahiro wrote: > > This variable is defined in UEFI specification 2.8, section 8.1. > > Its value should be updated whenever we add any usable runtime services > > function. > > It is also required by the EBBR specification. > > > > > Signed-off-by: AKASHI Takahiro > > --- > > include/efi_api.h | 15 +++++++++++++++ > > include/efi_loader.h | 3 +++ > > lib/efi_loader/efi_runtime.c | 28 ++++++++++++++++++++++++++++ > > lib/efi_loader/efi_setup.c | 5 +++++ > > 4 files changed, 51 insertions(+) > > > > diff --git a/include/efi_api.h b/include/efi_api.h > > index 65584dd2d82a..d7d95edd4dfc 100644 > > --- a/include/efi_api.h > > +++ b/include/efi_api.h > > @@ -213,6 +213,21 @@ struct efi_capsule_header { > > u32 capsule_image_size; > > }; > > > > +#define EFI_RT_SUPPORTED_GET_TIME 0x0001 > > +#define EFI_RT_SUPPORTED_SET_TIME 0x0002 > > +#define EFI_RT_SUPPORTED_GET_WAKEUP_TIME 0x0004 > > +#define EFI_RT_SUPPORTED_SET_WAKEUP_TIME 0x0008 > > +#define EFI_RT_SUPPORTED_GET_VARIABLE 0x0010 > > +#define EFI_RT_SUPPORTED_GET_NEXT_VARIABLE_NAME 0x0020 > > +#define EFI_RT_SUPPORTED_SET_VARIABLE 0x0040 > > +#define EFI_RT_SUPPORTED_SET_VIRTUAL_ADDRESS_MAP 0x0080 > > +#define EFI_RT_SUPPORTED_CONVERT_POINTER 0x0100 > > +#define EFI_RT_SUPPORTED_GET_NEXT_HIGH_MONOTONIC_COUNT 0x0200 > > +#define EFI_RT_SUPPORTED_RESET_SYSTEM 0x0400 > > +#define EFI_RT_SUPPORTED_UPDATE_CAPSULE 0x0800 > > +#define EFI_RT_SUPPORTED_QUERY_CAPSULE_CAPABILITIES 0x1000 > > +#define EFI_RT_SUPPORTED_QUERY_VARIABLE_INFO 0x2000 > > + > > struct efi_runtime_services { > > struct efi_table_hdr hdr; > > efi_status_t (EFIAPI *get_time)(struct efi_time *time, > > diff --git a/include/efi_loader.h b/include/efi_loader.h > > index 23ce73226762..7bd8002e303e 100644 > > --- a/include/efi_loader.h > > +++ b/include/efi_loader.h > > @@ -573,6 +573,9 @@ static inline int guidcmp(const efi_guid_t *g1, const efi_guid_t *g2) > > #define __efi_runtime_data __attribute__ ((section (".data.efi_runtime"))) > > #define __efi_runtime __attribute__ ((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); > > > > diff --git a/lib/efi_loader/efi_runtime.c b/lib/efi_loader/efi_runtime.c > > index 60442cb21d37..cf202bb9ec07 100644 > > --- a/lib/efi_loader/efi_runtime.c > > +++ b/lib/efi_loader/efi_runtime.c > > @@ -89,6 +89,34 @@ struct elf_rela { > > * handle a good number of runtime callbacks > > */ > > > > +efi_status_t efi_init_runtime_supported(void) > > +{ > > + u16 efi_runtime_services_supported; > > + > > + /* > > + * This value must be synced with efi_runtime_detach_list > > + * as well as efi_runtime_services. > > + */ > > + efi_runtime_services_supported = EFI_RT_SUPPORTED_RESET_SYSTEM; > > This support is system dependent, e.g. on RK3288 systems it does not exist. efi_reset_system() is defined as a weak function and so there is no easy way to determine whether this API is supported or not. > > +#ifdef CONFIG_EFI_GET_TIME > > + efi_runtime_services_supported |= EFI_RT_SUPPORTED_GET_TIME; > > We do not support this at runtime. Okay, I will drop it. > > +#endif > > +#ifdef CONFIG_EFI_SET_TIME > > + efi_runtime_services_supported |= EFI_RT_SUPPORTED_SET_TIME; > > We do not support this at runtime. ditto > > +#endif > > +#ifdef CONFIG_EFI_RUNTIME_SET_VIRTUAL_ADDRESS_MAP > > + efi_runtime_services_supported |= > > + EFI_RT_SUPPORTED_SET_VIRTUAL_ADDRESS_MAP; > > Our support is incomplete as we have not implemented ConvertPointer(). Incomplete? My patch#3 adds ConvertPointer(). -Takahiro Akashi > For unsupported services we will have to change the return value to > EFI_UNSUPPORTED. But that will be a separate patch. > > Best regards > > Heinrich > > > +#endif > > + > > + return EFI_CALL(efi_set_variable(L"RuntimeServicesSupported", > > + &efi_global_variable_guid, > > + EFI_VARIABLE_BOOTSERVICE_ACCESS | > > + EFI_VARIABLE_RUNTIME_ACCESS, > > + sizeof(efi_runtime_services_supported), > > + &efi_runtime_services_supported)); > > +} > > + > > /** > > * efi_update_table_header_crc32() - Update crc32 in table header > > * > > diff --git a/lib/efi_loader/efi_setup.c b/lib/efi_loader/efi_setup.c > > index 45d6aca051f3..75fa344060d5 100644 > > --- a/lib/efi_loader/efi_setup.c > > +++ b/lib/efi_loader/efi_setup.c > > @@ -123,6 +123,11 @@ efi_status_t efi_init_obj_list(void) > > if (ret != EFI_SUCCESS) > > goto out; > > > > + /* Indicate supported runtime services */ > > + ret = efi_init_runtime_supported(); > > + if (ret != EFI_SUCCESS) > > + goto out; > > + > > /* Initialize system table */ > > ret = efi_initialize_system_table(); > > if (ret != EFI_SUCCESS) > >