[PATCH 2/5] lib: add function for check the RuntimeServicesSupported variable

Ivan Hu ivan.hu at canonical.com
Wed Nov 6 09:45:13 UTC 2019


First check the getvariable runtime service supported or not

Signed-off-by: Ivan Hu <ivan.hu at canonical.com>
---
 src/lib/include/fwts_uefi.h | 17 ++++++++++++++++
 src/lib/src/fwts_uefi.c     | 47 +++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 64 insertions(+)

diff --git a/src/lib/include/fwts_uefi.h b/src/lib/include/fwts_uefi.h
index 418b881..dd8799d 100644
--- a/src/lib/include/fwts_uefi.h
+++ b/src/lib/include/fwts_uefi.h
@@ -122,6 +122,21 @@ enum {
 #define LAST_ATTEMPT_STATUS_ERR_PWR_EVT_AC		0x00000006
 #define LAST_ATTEMPT_STATUS_ERR_PWR_EVT_BATT		0x00000007
 
+#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
+
 #define EFI_CERT_SHA256_GUID \
 { 0xc1c41626, 0x504c, 0x4092, { 0xac, 0xa9, 0x41, 0xf9, 0x36, 0x93, 0x43, 0x28 }}
 
@@ -665,6 +680,8 @@ char *fwts_uefi_attribute_info(uint32_t attr);
 
 bool fwts_uefi_efivars_iface_exist(void);
 
+void fwts_uefi_rt_support_status_get(int fd, bool *getvar_supported, uint32_t *var_rtsupported);
+
 PRAGMA_POP
 
 #endif
diff --git a/src/lib/src/fwts_uefi.c b/src/lib/src/fwts_uefi.c
index 80285f1..f133cc1 100644
--- a/src/lib/src/fwts_uefi.c
+++ b/src/lib/src/fwts_uefi.c
@@ -29,9 +29,11 @@
 #include <inttypes.h>
 #include <errno.h>
 #include <string.h>
+#include <sys/ioctl.h>
 
 #include "fwts.h"
 #include "fwts_uefi.h"
+#include "fwts_efi_runtime.h"
 
 /* Old sysfs uefi packed binary blob variables */
 typedef struct {
@@ -536,3 +538,48 @@ bool fwts_uefi_efivars_iface_exist(void)
 	return (fwts_uefi_get_interface(&path) == UEFI_IFACE_EFIVARS);
 
 }
+
+/*
+ *  fwts_uefi_rt_support_status_get()
+ *	get the status of runtime service support and the value of
+ *	the RuntimeServicesSupported variable
+ */
+void fwts_uefi_rt_support_status_get(int fd, bool *getvar_supported, uint32_t *var_rtsupported)
+{
+	long ioret;
+	struct efi_getvariable getvariable;
+	uint64_t status = ~0ULL;
+	uint8_t data[512];
+	uint64_t getdatasize = sizeof(data);
+	*var_rtsupported = 0xFFFF;
+
+	uint32_t attributes = FWTS_UEFI_VAR_NON_VOLATILE |
+				FWTS_UEFI_VAR_BOOTSERVICE_ACCESS |
+				FWTS_UEFI_VAR_RUNTIME_ACCESS;
+	uint16_t varname[] = {'R', 'u', 'n', 't', 'i', 'm', 'e', 'S', 'e',
+				'r', 'v', 'i', 'c', 'e', 's', 'S', 'u', 'p',
+				'p', 'o', 'r', 't', 'e', 'd', '\0'};
+	EFI_GUID global_var_guid = EFI_GLOBAL_VARIABLE;
+	getvariable.VariableName = varname;
+	getvariable.VendorGuid = &global_var_guid;
+	getvariable.Attributes = &attributes;
+	getvariable.DataSize = &getdatasize;
+	getvariable.Data = data;
+	getvariable.status = &status;
+
+	ioret = ioctl(fd, EFI_RUNTIME_GET_VARIABLE, &getvariable);
+	if (ioret == -1) {
+		if (status == EFI_NOT_FOUND) {
+			*getvar_supported = true;
+		} else {
+			*getvar_supported = false;
+		}
+		return;
+	}
+
+	*getvar_supported = true;
+	*var_rtsupported = data[0] | data[1] << 8;
+
+	return;
+
+}
-- 
2.7.4




More information about the fwts-devel mailing list