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

Colin Ian King colin.king at canonical.com
Thu Nov 7 08:05:26 UTC 2019


On 07/11/2019 07:46, Ivan Hu wrote:
> 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..02b16da 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;
> +	static 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;
> +
> +}
> 
Acked-by: Colin Ian King <colin.king at canonical.com>



More information about the fwts-devel mailing list