efi_loader: add RuntimeServicesSupported variable
authorAKASHI Takahiro <takahiro.akashi@linaro.org>
Wed, 5 Jun 2019 04:21:38 +0000 (13:21 +0900)
committerHeinrich Schuchardt <xypron.glpk@gmx.de>
Fri, 14 Jun 2019 17:18:40 +0000 (19:18 +0200)
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.

Currently we only support SetVirtualAddress() for all systems and
ResetSystem() for some.

Signed-off-by: AKASHI Takahiro <takahiro.akashi@linaro.org>
Reviewed-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
include/efi_api.h
include/efi_loader.h
lib/efi_loader/efi_runtime.c
lib/efi_loader/efi_setup.c

index 65584dd2d82a235612221b2e3c03f41a1a9f459a..d7d95edd4dfcb0eddded55f269cb65c8b355f82f 100644 (file)
@@ -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,
index f0e1313f9345025b86d74ed7a06cd2f4c4df29d8..b07155cecb7cab8ed91d276cc7381fd55a15cf5c 100644 (file)
@@ -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);
 
index 432551d0c8ca6a4ee64984324a0b6f4ffe43377c..0c57d0abd76126ca4406fcb736893bc75214ea49 100644 (file)
@@ -89,6 +89,30 @@ struct elf_rela {
  * handle a good number of runtime callbacks
  */
 
+efi_status_t efi_init_runtime_supported(void)
+{
+       u16 efi_runtime_services_supported = 0;
+
+       /*
+        * This value must be synced with efi_runtime_detach_list
+        * as well as efi_runtime_services.
+        */
+#if CONFIG_IS_ENABLED(ARCH_BCM283X) || \
+    CONFIG_IS_ENABLED(FSL_LAYERSCAPE) || \
+    CONFIG_IS_ENABLED(SYSRESET_X86) || \
+    CONFIG_IS_ENABLED(PSCI_RESET)
+       efi_runtime_services_supported |= EFI_RT_SUPPORTED_RESET_SYSTEM;
+#endif
+       efi_runtime_services_supported |=
+                               EFI_RT_SUPPORTED_SET_VIRTUAL_ADDRESS_MAP;
+       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
  *
index 8691d686d29d02150c50a8ce10c4474498300de8..bfb57836fa9fa22f8183c5330570288abad239f7 100644 (file)
@@ -117,6 +117,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)