diff mbox series

[U-Boot,RFC,2/6] efi: add RuntimeServicesSupported variable

Message ID 20190605042142.15113-3-takahiro.akashi@linaro.org
State RFC
Delegated to: Heinrich Schuchardt
Headers show
Series efi_loader: support runtime variable access via cache | expand

Commit Message

AKASHI Takahiro June 5, 2019, 4:21 a.m. UTC
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.

Signed-off-by: AKASHI Takahiro <takahiro.akashi@linaro.org>
---
 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(+)

Comments

Heinrich Schuchardt June 13, 2019, 5:56 a.m. UTC | #1
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 <takahiro.akashi@linaro.org>
> ---
>  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.

> +#ifdef CONFIG_EFI_GET_TIME
> +	efi_runtime_services_supported |= EFI_RT_SUPPORTED_GET_TIME;

We do not support this at runtime.

> +#endif
> +#ifdef CONFIG_EFI_SET_TIME
> +	efi_runtime_services_supported |= EFI_RT_SUPPORTED_SET_TIME;

We do not support this at runtime.

> +#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().

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)
>
AKASHI Takahiro June 13, 2019, 7:06 a.m. UTC | #2
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 <takahiro.akashi@linaro.org>
> > ---
> >  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)
> >
Heinrich Schuchardt June 13, 2019, 9:17 a.m. UTC | #3
On 6/13/19 9:06 AM, AKASHI Takahiro wrote:
> 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 <takahiro.akashi@linaro.org>
>>> ---
>>>  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().

That is a later patch. So I did not consider it for this patch.
Furthermore the implementation of ConvertPointer depends on
CONFIG_EFI_RUNTIME_CONVERT_POINTER.

Best regards

Heinrich

>
> -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)
>>>
>
Heinrich Schuchardt June 13, 2019, 9:21 a.m. UTC | #4
On 6/13/19 11:17 AM, Heinrich Schuchardt wrote:
>
>
> On 6/13/19 9:06 AM, AKASHI Takahiro wrote:
>> 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 <takahiro.akashi@linaro.org>
>>>> ---
>>>>  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().
>
> That is a later patch. So I did not consider it for this patch.
> Furthermore the implementation of ConvertPointer depends on
> CONFIG_EFI_RUNTIME_CONVERT_POINTER.

EFI_RT_SUPPORTED_SET_VIRTUAL_ADDRESS_MAP and
EFI_RT_SUPPORTED_CONVERT_POINTER are separate values.

You are right in switching EFI_RT_SUPPORTED_SET_VIRTUAL_ADDRESS_MAP on here.

Best regards

Heinrich

>>
>> -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)
>>>>
>>
>
diff mbox series

Patch

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;
+#ifdef CONFIG_EFI_GET_TIME
+	efi_runtime_services_supported |= EFI_RT_SUPPORTED_GET_TIME;
+#endif
+#ifdef CONFIG_EFI_SET_TIME
+	efi_runtime_services_supported |= EFI_RT_SUPPORTED_SET_TIME;
+#endif
+#ifdef CONFIG_EFI_RUNTIME_SET_VIRTUAL_ADDRESS_MAP
+	efi_runtime_services_supported |=
+				EFI_RT_SUPPORTED_SET_VIRTUAL_ADDRESS_MAP;
+#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)