From patchwork Thu Dec 27 08:06:51 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: [2/2] uefirtvariable: add stress test for UEFI runtime interface GetNextVariableName Date: Wed, 26 Dec 2012 22:06:51 -0000 From: IvanHu X-Patchwork-Id: 208279 Message-Id: <1356595611-24199-1-git-send-email-ivan.hu@canonical.com> To: fwts-devel@lists.ubuntu.com This stress test tests the UEFI runtime interface GetNextVariableName by calling multiple times. Signed-off-by: Ivan Hu Acked-by: Colin Ian King Acked-by: Alex Hung --- src/uefi/uefirtvariable/uefirtvariable.c | 84 ++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) diff --git a/src/uefi/uefirtvariable/uefirtvariable.c b/src/uefi/uefirtvariable/uefirtvariable.c index a8b9326..73d1049 100644 --- a/src/uefi/uefirtvariable/uefirtvariable.c +++ b/src/uefi/uefirtvariable/uefirtvariable.c @@ -718,6 +718,85 @@ static int do_queryvariableinfo(uint64_t *status, uint64_t *remvarstoragesize, u return FWTS_OK; } +static int getnextvariable_multitest(fwts_framework *fw, uint32_t multitesttime) +{ + long ioret; + uint64_t status; + uint32_t i; + + struct efi_setvariable setvariable; + + uint64_t dataindex, datasize = 10; + uint8_t data[MAX_DATA_LENGTH]; + + struct efi_getnextvariablename getnextvariablename; + uint64_t variablenamesize = MAX_DATA_LENGTH; + uint16_t variablename[MAX_DATA_LENGTH]; + EFI_GUID vendorguid; + + for (dataindex = 0; dataindex < datasize; dataindex++) + data[dataindex] = (uint8_t)dataindex; + data[dataindex] = '\0'; + + setvariable.VariableName = variablenametest; + setvariable.VendorGuid = >estguid1; + setvariable.Attributes = attributes; + setvariable.DataSize = datasize; + setvariable.Data = data; + setvariable.status = &status; + + ioret = ioctl(fd, EFI_RUNTIME_SET_VARIABLE, &setvariable); + + if (ioret == -1) { + fwts_failed(fw, LOG_LEVEL_HIGH, "UEFIRuntimeSetVariable", + "Failed to set variable with UEFI runtime service."); + return FWTS_ERROR; + } + + getnextvariablename.VariableNameSize = &variablenamesize; + getnextvariablename.VariableName = variablename; + getnextvariablename.VendorGuid = &vendorguid; + getnextvariablename.status = &status; + + for (i = 0; i < multitesttime; i++) { + variablename[0] = '\0'; + variablenamesize = MAX_DATA_LENGTH; + ioret = ioctl(fd, EFI_RUNTIME_GET_NEXTVARIABLENAME, &getnextvariablename); + + if (ioret == -1) { + fwts_failed(fw, LOG_LEVEL_HIGH, "UEFIRuntimeGetNextVariableName", + "Failed to get next variable name with UEFI runtime service."); + goto err_restore_env; + } + }; + + setvariable.DataSize = 0; + + ioret = ioctl(fd, EFI_RUNTIME_SET_VARIABLE, &setvariable); + + if (ioret == -1) { + fwts_failed(fw, LOG_LEVEL_HIGH, "UEFIRuntimeSetVariable", + "Failed to set variable with UEFI runtime service."); + return FWTS_ERROR; + } + + return FWTS_OK; + +err_restore_env: + + setvariable.DataSize = 0; + + ioret = ioctl(fd, EFI_RUNTIME_SET_VARIABLE, &setvariable); + + if (ioret == -1) { + fwts_failed(fw, LOG_LEVEL_HIGH, "UEFIRuntimeSetVariable", + "Failed to delete variable with UEFI runtime service."); + } + + return FWTS_ERROR; +} + + static int uefirtvariable_test1(fwts_framework *fw) { uint64_t datasize = 10; @@ -813,6 +892,11 @@ static int uefirtvariable_test5(fwts_framework *fw) return FWTS_ERROR; fwts_passed(fw, "GetVariable on getting the variable multiple times passed."); + fwts_log_info(fw, "Testing GetNextVariableName on getting the variable multiple times."); + if (getnextvariable_multitest(fw, multitesttime) == FWTS_ERROR) + return FWTS_ERROR; + fwts_passed(fw, "GetNextVariableName on getting the next variable name multiple times passed."); + return FWTS_OK; }