[5/5,V2] uefirtmisc: add unsupported checking with RuntimeServicesSupported variable
diff mbox series

Message ID 1573112794-4284-4-git-send-email-ivan.hu@canonical.com
State Accepted
Headers show
Series
  • Untitled series #141278
Related show

Commit Message

ivanhu Nov. 7, 2019, 7:46 a.m. UTC
UEFI spec 2.8 introduced the variable RuntimeServicesSupported, which is
Bitmask of which calls are implemented by the firmware during runtime services.
Add tests for checking GetNextHighMonotonicCount services with
RuntimeServicesSupported variable. Currently, won't test with
QueryCapsuleCapabilities becasue QueryCapsuleCapabilities may return
unsupported due to the update flag of firmware behavior unsupported, not
runtime service unsupported.

Signed-off-by: Ivan Hu <ivan.hu@canonical.com>
---
 src/uefi/uefirtmisc/uefirtmisc.c | 78 ++++++++++++++++++++++++++++++++++++++++
 1 file changed, 78 insertions(+)

Comments

Colin King Nov. 7, 2019, 8:08 a.m. UTC | #1
On 07/11/2019 07:46, Ivan Hu wrote:
> UEFI spec 2.8 introduced the variable RuntimeServicesSupported, which is
> Bitmask of which calls are implemented by the firmware during runtime services.
> Add tests for checking GetNextHighMonotonicCount services with
> RuntimeServicesSupported variable. Currently, won't test with
> QueryCapsuleCapabilities becasue QueryCapsuleCapabilities may return
> unsupported due to the update flag of firmware behavior unsupported, not
> runtime service unsupported.
> 
> Signed-off-by: Ivan Hu <ivan.hu@canonical.com>
> ---
>  src/uefi/uefirtmisc/uefirtmisc.c | 78 ++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 78 insertions(+)
> 
> diff --git a/src/uefi/uefirtmisc/uefirtmisc.c b/src/uefi/uefirtmisc/uefirtmisc.c
> index 2270ca5..a0a4c4c 100644
> --- a/src/uefi/uefirtmisc/uefirtmisc.c
> +++ b/src/uefi/uefirtmisc/uefirtmisc.c
> @@ -254,11 +254,89 @@ static int uefirtmisc_test3(fwts_framework *fw)
>  	return FWTS_ERROR;
>  }
>  
> +static int uefirtmisc_test4(fwts_framework *fw)
> +{
> +	long ioret;
> +	uint64_t status;
> +	bool getvar_supported;
> +	uint32_t var_runtimeservicessupported;
> +
> +	struct efi_getnexthighmonotoniccount getnexthighmonotoniccount;
> +	uint32_t highcount;
> +
> +	fwts_uefi_rt_support_status_get(fd, &getvar_supported,
> +			&var_runtimeservicessupported);
> +	if (!getvar_supported || (var_runtimeservicessupported == 0xFFFF)) {
> +		fwts_skipped(fw, "Cannot get the RuntimeServicesSupported "
> +				"variable, maybe the runtime service "
> +				"GetVariable is not supported or "
> +				"RuntimeServicesSupported not provided by "
> +				"firmware.");
> +		return FWTS_SKIP;
> +	}
> +
> +	getnexthighmonotoniccount.HighCount = &highcount;
> +	getnexthighmonotoniccount.status = &status;
> +	status = ~0ULL;
> +	ioret = ioctl(fd, EFI_RUNTIME_GET_NEXTHIGHMONOTONICCOUNT, &getnexthighmonotoniccount);
> +	if (ioret == -1) {
> +		if (status == EFI_UNSUPPORTED) {
> +			if ((var_runtimeservicessupported & EFI_RT_SUPPORTED_GET_NEXT_HIGH_MONOTONIC_COUNT)
> +				|| (var_runtimeservicessupported == 0)) {
> +				fwts_failed(fw, LOG_LEVEL_HIGH,
> +					"UEFIRuntimeGetNextHighMonotonicCount",
> +					"Get the GetNextHighMonotonicCount runtime "
> +					"service supported via RuntimeServicesSupported "
> +					"variable. But actually is not supported by "
> +					"firmware.");
> +			} else {
> +				fwts_passed(fw, "UEFI GetNextHighMonotonicCount runtime "
> +					"service supported status test passed.");
> +			}
> +		} else {
> +			if (status == ~0ULL) {
> +				fwts_skipped(fw, "Unknown error occurred, skip test.");
> +				return FWTS_SKIP;
> +			}
> +			if ((var_runtimeservicessupported & EFI_RT_SUPPORTED_GET_NEXT_HIGH_MONOTONIC_COUNT)
> +				|| (var_runtimeservicessupported == 0)) {
> +				fwts_passed(fw, "UEFI GetNextHighMonotonicCount runtime "
> +					"service supported status test passed.");
> +			} else {
> +				fwts_failed(fw, LOG_LEVEL_HIGH,
> +					"UEFIRuntimeGetNextHighMonotonicCount",
> +					"Get the GetNextHighMonotonicCount runtime "
> +					"service unsupported via RuntimeServicesSupported "
> +					"variable. But actually is supported by firmware.");
> +			}
> +		}
> +	} else {
> +		if (status != EFI_SUCCESS ) {
> +			fwts_skipped(fw, "Unknown error occurred, skip test.");
> +			return FWTS_SKIP;
> +		}
> +		if ((var_runtimeservicessupported & EFI_RT_SUPPORTED_GET_NEXT_HIGH_MONOTONIC_COUNT)
> +			|| (var_runtimeservicessupported == 0)) {
> +			fwts_passed(fw, "UEFI GetNextHighMonotonicCount runtime "
> +				"service supported status test passed.");
> +		} else {
> +			fwts_failed(fw, LOG_LEVEL_HIGH,
> +				"UEFIRuntimeGetNextHighMonotonicCount",
> +				"Get the GetNextHighMonotonicCount runtime "
> +				"service unsupported via RuntimeServicesSupported "
> +				"variable. But actually is supported by firmware.");
> +		}
> +	}
> +
> +	return FWTS_OK;
> +}
> +
>  
>  static fwts_framework_minor_test uefirtmisc_tests[] = {
>  	{ uefirtmisc_test1, "Test for UEFI miscellaneous runtime service interfaces." },
>  	{ uefirtmisc_test2, "Stress test for UEFI miscellaneous runtime service interfaces." },
>  	{ uefirtmisc_test3, "Test GetNextHighMonotonicCount with invalid NULL parameter." },
> +	{ uefirtmisc_test4, "Test UEFI miscellaneous runtime services supported status." },
>  	{ NULL, NULL }
>  };
>  
> 
Acked-by: Colin Ian King <colin.king@canonical.com>
Alex Hung Nov. 7, 2019, 4:38 p.m. UTC | #2
On 2019-11-07 12:46 a.m., Ivan Hu wrote:
> UEFI spec 2.8 introduced the variable RuntimeServicesSupported, which is
> Bitmask of which calls are implemented by the firmware during runtime services.
> Add tests for checking GetNextHighMonotonicCount services with
> RuntimeServicesSupported variable. Currently, won't test with
> QueryCapsuleCapabilities becasue QueryCapsuleCapabilities may return
> unsupported due to the update flag of firmware behavior unsupported, not
> runtime service unsupported.
> 
> Signed-off-by: Ivan Hu <ivan.hu@canonical.com>
> ---
>  src/uefi/uefirtmisc/uefirtmisc.c | 78 ++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 78 insertions(+)
> 
> diff --git a/src/uefi/uefirtmisc/uefirtmisc.c b/src/uefi/uefirtmisc/uefirtmisc.c
> index 2270ca5..a0a4c4c 100644
> --- a/src/uefi/uefirtmisc/uefirtmisc.c
> +++ b/src/uefi/uefirtmisc/uefirtmisc.c
> @@ -254,11 +254,89 @@ static int uefirtmisc_test3(fwts_framework *fw)
>  	return FWTS_ERROR;
>  }
>  
> +static int uefirtmisc_test4(fwts_framework *fw)
> +{
> +	long ioret;
> +	uint64_t status;
> +	bool getvar_supported;
> +	uint32_t var_runtimeservicessupported;
> +
> +	struct efi_getnexthighmonotoniccount getnexthighmonotoniccount;
> +	uint32_t highcount;
> +
> +	fwts_uefi_rt_support_status_get(fd, &getvar_supported,
> +			&var_runtimeservicessupported);
> +	if (!getvar_supported || (var_runtimeservicessupported == 0xFFFF)) {
> +		fwts_skipped(fw, "Cannot get the RuntimeServicesSupported "
> +				"variable, maybe the runtime service "
> +				"GetVariable is not supported or "
> +				"RuntimeServicesSupported not provided by "
> +				"firmware.");
> +		return FWTS_SKIP;
> +	}
> +
> +	getnexthighmonotoniccount.HighCount = &highcount;
> +	getnexthighmonotoniccount.status = &status;
> +	status = ~0ULL;
> +	ioret = ioctl(fd, EFI_RUNTIME_GET_NEXTHIGHMONOTONICCOUNT, &getnexthighmonotoniccount);
> +	if (ioret == -1) {
> +		if (status == EFI_UNSUPPORTED) {
> +			if ((var_runtimeservicessupported & EFI_RT_SUPPORTED_GET_NEXT_HIGH_MONOTONIC_COUNT)
> +				|| (var_runtimeservicessupported == 0)) {
> +				fwts_failed(fw, LOG_LEVEL_HIGH,
> +					"UEFIRuntimeGetNextHighMonotonicCount",
> +					"Get the GetNextHighMonotonicCount runtime "
> +					"service supported via RuntimeServicesSupported "
> +					"variable. But actually is not supported by "
> +					"firmware.");
> +			} else {
> +				fwts_passed(fw, "UEFI GetNextHighMonotonicCount runtime "
> +					"service supported status test passed.");
> +			}
> +		} else {
> +			if (status == ~0ULL) {
> +				fwts_skipped(fw, "Unknown error occurred, skip test.");
> +				return FWTS_SKIP;
> +			}
> +			if ((var_runtimeservicessupported & EFI_RT_SUPPORTED_GET_NEXT_HIGH_MONOTONIC_COUNT)
> +				|| (var_runtimeservicessupported == 0)) {
> +				fwts_passed(fw, "UEFI GetNextHighMonotonicCount runtime "
> +					"service supported status test passed.");
> +			} else {
> +				fwts_failed(fw, LOG_LEVEL_HIGH,
> +					"UEFIRuntimeGetNextHighMonotonicCount",
> +					"Get the GetNextHighMonotonicCount runtime "
> +					"service unsupported via RuntimeServicesSupported "
> +					"variable. But actually is supported by firmware.");
> +			}
> +		}
> +	} else {
> +		if (status != EFI_SUCCESS ) {
> +			fwts_skipped(fw, "Unknown error occurred, skip test.");
> +			return FWTS_SKIP;
> +		}
> +		if ((var_runtimeservicessupported & EFI_RT_SUPPORTED_GET_NEXT_HIGH_MONOTONIC_COUNT)
> +			|| (var_runtimeservicessupported == 0)) {
> +			fwts_passed(fw, "UEFI GetNextHighMonotonicCount runtime "
> +				"service supported status test passed.");
> +		} else {
> +			fwts_failed(fw, LOG_LEVEL_HIGH,
> +				"UEFIRuntimeGetNextHighMonotonicCount",
> +				"Get the GetNextHighMonotonicCount runtime "
> +				"service unsupported via RuntimeServicesSupported "
> +				"variable. But actually is supported by firmware.");
> +		}
> +	}
> +
> +	return FWTS_OK;
> +}
> +
>  
>  static fwts_framework_minor_test uefirtmisc_tests[] = {
>  	{ uefirtmisc_test1, "Test for UEFI miscellaneous runtime service interfaces." },
>  	{ uefirtmisc_test2, "Stress test for UEFI miscellaneous runtime service interfaces." },
>  	{ uefirtmisc_test3, "Test GetNextHighMonotonicCount with invalid NULL parameter." },
> +	{ uefirtmisc_test4, "Test UEFI miscellaneous runtime services supported status." },
>  	{ NULL, NULL }
>  };
>  
> 

Acked-by: Alex Hung <alex.hung@canonical.com>

Patch
diff mbox series

diff --git a/src/uefi/uefirtmisc/uefirtmisc.c b/src/uefi/uefirtmisc/uefirtmisc.c
index 2270ca5..a0a4c4c 100644
--- a/src/uefi/uefirtmisc/uefirtmisc.c
+++ b/src/uefi/uefirtmisc/uefirtmisc.c
@@ -254,11 +254,89 @@  static int uefirtmisc_test3(fwts_framework *fw)
 	return FWTS_ERROR;
 }
 
+static int uefirtmisc_test4(fwts_framework *fw)
+{
+	long ioret;
+	uint64_t status;
+	bool getvar_supported;
+	uint32_t var_runtimeservicessupported;
+
+	struct efi_getnexthighmonotoniccount getnexthighmonotoniccount;
+	uint32_t highcount;
+
+	fwts_uefi_rt_support_status_get(fd, &getvar_supported,
+			&var_runtimeservicessupported);
+	if (!getvar_supported || (var_runtimeservicessupported == 0xFFFF)) {
+		fwts_skipped(fw, "Cannot get the RuntimeServicesSupported "
+				"variable, maybe the runtime service "
+				"GetVariable is not supported or "
+				"RuntimeServicesSupported not provided by "
+				"firmware.");
+		return FWTS_SKIP;
+	}
+
+	getnexthighmonotoniccount.HighCount = &highcount;
+	getnexthighmonotoniccount.status = &status;
+	status = ~0ULL;
+	ioret = ioctl(fd, EFI_RUNTIME_GET_NEXTHIGHMONOTONICCOUNT, &getnexthighmonotoniccount);
+	if (ioret == -1) {
+		if (status == EFI_UNSUPPORTED) {
+			if ((var_runtimeservicessupported & EFI_RT_SUPPORTED_GET_NEXT_HIGH_MONOTONIC_COUNT)
+				|| (var_runtimeservicessupported == 0)) {
+				fwts_failed(fw, LOG_LEVEL_HIGH,
+					"UEFIRuntimeGetNextHighMonotonicCount",
+					"Get the GetNextHighMonotonicCount runtime "
+					"service supported via RuntimeServicesSupported "
+					"variable. But actually is not supported by "
+					"firmware.");
+			} else {
+				fwts_passed(fw, "UEFI GetNextHighMonotonicCount runtime "
+					"service supported status test passed.");
+			}
+		} else {
+			if (status == ~0ULL) {
+				fwts_skipped(fw, "Unknown error occurred, skip test.");
+				return FWTS_SKIP;
+			}
+			if ((var_runtimeservicessupported & EFI_RT_SUPPORTED_GET_NEXT_HIGH_MONOTONIC_COUNT)
+				|| (var_runtimeservicessupported == 0)) {
+				fwts_passed(fw, "UEFI GetNextHighMonotonicCount runtime "
+					"service supported status test passed.");
+			} else {
+				fwts_failed(fw, LOG_LEVEL_HIGH,
+					"UEFIRuntimeGetNextHighMonotonicCount",
+					"Get the GetNextHighMonotonicCount runtime "
+					"service unsupported via RuntimeServicesSupported "
+					"variable. But actually is supported by firmware.");
+			}
+		}
+	} else {
+		if (status != EFI_SUCCESS ) {
+			fwts_skipped(fw, "Unknown error occurred, skip test.");
+			return FWTS_SKIP;
+		}
+		if ((var_runtimeservicessupported & EFI_RT_SUPPORTED_GET_NEXT_HIGH_MONOTONIC_COUNT)
+			|| (var_runtimeservicessupported == 0)) {
+			fwts_passed(fw, "UEFI GetNextHighMonotonicCount runtime "
+				"service supported status test passed.");
+		} else {
+			fwts_failed(fw, LOG_LEVEL_HIGH,
+				"UEFIRuntimeGetNextHighMonotonicCount",
+				"Get the GetNextHighMonotonicCount runtime "
+				"service unsupported via RuntimeServicesSupported "
+				"variable. But actually is supported by firmware.");
+		}
+	}
+
+	return FWTS_OK;
+}
+
 
 static fwts_framework_minor_test uefirtmisc_tests[] = {
 	{ uefirtmisc_test1, "Test for UEFI miscellaneous runtime service interfaces." },
 	{ uefirtmisc_test2, "Stress test for UEFI miscellaneous runtime service interfaces." },
 	{ uefirtmisc_test3, "Test GetNextHighMonotonicCount with invalid NULL parameter." },
+	{ uefirtmisc_test4, "Test UEFI miscellaneous runtime services supported status." },
 	{ NULL, NULL }
 };