Skip to content
Snippets Groups Projects
0016-Make-test-cases-link-against-libefi.a.patch 7.73 KiB
Newer Older
From f1ef8dffd374048fbf8dd584923c42e5a784bbf2 Mon Sep 17 00:00:00 2001
From: Peter Jones <pjones@redhat.com>
Date: Thu, 15 Jul 2021 10:07:14 -0400
Subject: [PATCH 16/26] Make test cases link against libefi.a

This allows us to use library functions from libefi.a in our test
programs.

Signed-off-by: Peter Jones <pjones@redhat.com>
---
 include/test.mk | 20 +++++++++++++++++---
 lib/variables.c | 48 ++++++++++++++++++++++++++----------------------
 test.c          | 37 ++++++-------------------------------
 3 files changed, 49 insertions(+), 56 deletions(-)

diff --git a/include/test.mk b/include/test.mk
index 62cf983..c66b46d 100644
--- a/include/test.mk
+++ b/include/test.mk
@@ -5,6 +5,8 @@
 
 .SUFFIXES:
 
+include Make.defaults
+
 CC = gcc
 VALGRIND ?=
 DEBUG_PRINTS ?= 0
@@ -28,6 +30,15 @@ CFLAGS = -O2 -ggdb -std=gnu11 \
 	 -DSHIM_UNIT_TEST \
 	 "-DDEFAULT_DEBUG_PRINT_STATE=$(DEBUG_PRINTS)"
 
+libefi-test.a :
+	$(MAKE) -C gnu-efi ARCH=$(ARCH_GNUEFI) TOPDIR=$(TOPDIR)/gnu-efi \
+		-f $(TOPDIR)/gnu-efi/Makefile \
+		clean lib
+	mv gnu-efi/$(ARCH)/lib/libefi.a $@
+	$(MAKE) -C gnu-efi ARCH=$(ARCH_GNUEFI) TOPDIR=$(TOPDIR)/gnu-efi \
+		-f $(TOPDIR)/gnu-efi/Makefile \
+		clean
+
 $(wildcard test-*.c) :: %.c : test-random.h
 $(patsubst %.c,%,$(wildcard test-*.c)) :: | test-random.h
 $(patsubst %.c,%.o,$(wildcard test-*.c)) : | test-random.h
@@ -36,19 +47,22 @@ test-random.h:
 	dd if=/dev/urandom bs=512 count=17 of=random.bin
 	xxd -i random.bin test-random.h
 
-test-sbat_FILES = csv.c
+test-sbat_FILES = csv.c lib/variables.c lib/guid.c
+test-sbat :: CFLAGS+=-DHAVE_GET_VARIABLE -DHAVE_GET_VARIABLE_ATTR -DHAVE_SHIM_LOCK_GUID
+
 test-str_FILES = lib/string.c
 
 tests := $(patsubst %.c,%,$(wildcard test-*.c))
 
+$(tests) :: test-% : | libefi-test.a
 $(tests) :: test-% : test.c test-%.c $(test-%_FILES)
-	$(CC) $(CFLAGS) -o $@ $^ $(wildcard $*.c) $(test-$*_FILES)
+	$(CC) $(CFLAGS) -o $@ $^ $(wildcard $*.c) $(test-$*_FILES) libefi-test.a
 	$(VALGRIND) ./$@
 
 test : $(tests)
 
 clean :
-	@rm -vf test-random.h random.bin
+	@rm -vf test-random.h random.bin libefi-test.a
 
 all : clean test
 
diff --git a/lib/variables.c b/lib/variables.c
index f606e24..ff61d0e 100644
--- a/lib/variables.c
+++ b/lib/variables.c
@@ -12,6 +12,10 @@
  */
 #include "shim.h"
 
+extern EFI_SYSTEM_TABLE *ST;
+extern EFI_BOOT_SERVICES *BS;
+extern EFI_RUNTIME_SERVICES *RT;
+
 EFI_STATUS
 fill_esl(const EFI_SIGNATURE_DATA *first_sig, const size_t howmany,
 	 const EFI_GUID *type, const UINT32 sig_size,
@@ -154,7 +158,7 @@ CreateTimeBasedPayload(IN OUT UINTN * DataSize, IN OUT UINT8 ** Data)
 	DescriptorData = (EFI_VARIABLE_AUTHENTICATION_2 *) (NewData);
 
 	ZeroMem(&Time, sizeof(EFI_TIME));
-	efi_status = gRT->GetTime(&Time, NULL);
+	efi_status = RT->GetTime(&Time, NULL);
 	if (EFI_ERROR(efi_status)) {
 		FreePool(NewData);
 		return efi_status;
@@ -225,7 +229,7 @@ SetSecureVariable(const CHAR16 * const var, UINT8 *Data, UINTN len,
 		return efi_status;
 	}
 
-	efi_status = gRT->SetVariable((CHAR16 *)var, &owner,
+	efi_status = RT->SetVariable((CHAR16 *)var, &owner,
 			EFI_VARIABLE_NON_VOLATILE |
 			EFI_VARIABLE_RUNTIME_ACCESS |
 			EFI_VARIABLE_BOOTSERVICE_ACCESS |
@@ -241,8 +245,8 @@ GetOSIndications(void)
 	UINTN DataSize = sizeof(indications);
 	EFI_STATUS efi_status;
 
-	efi_status = gRT->GetVariable(L"OsIndicationsSupported", &GV_GUID,
-				      NULL, &DataSize, &indications);
+	efi_status = RT->GetVariable(L"OsIndicationsSupported", &GV_GUID,
+				     NULL, &DataSize, &indications);
 	if (EFI_ERROR(efi_status))
 		return 0;
 
@@ -255,15 +259,15 @@ SETOSIndicationsAndReboot(UINT64 indications)
 	UINTN DataSize = sizeof(indications);
 	EFI_STATUS efi_status;
 
-	efi_status = gRT->SetVariable(L"OsIndications", &GV_GUID,
-				      EFI_VARIABLE_NON_VOLATILE |
-				      EFI_VARIABLE_RUNTIME_ACCESS |
-				      EFI_VARIABLE_BOOTSERVICE_ACCESS,
-				      DataSize, &indications);
+	efi_status = RT->SetVariable(L"OsIndications", &GV_GUID,
+				     EFI_VARIABLE_NON_VOLATILE |
+				     EFI_VARIABLE_RUNTIME_ACCESS |
+				     EFI_VARIABLE_BOOTSERVICE_ACCESS,
+				     DataSize, &indications);
 	if (EFI_ERROR(efi_status))
 		return efi_status;
 
-	gRT->ResetSystem(EfiResetWarm, EFI_SUCCESS, 0, NULL);
+	RT->ResetSystem(EfiResetWarm, EFI_SUCCESS, 0, NULL);
 	/* does not return */
 
 	return EFI_SUCCESS;
@@ -280,7 +284,7 @@ get_variable_attr(const CHAR16 * const var, UINT8 **data, UINTN *len,
 
 	*len = 0;
 
-	efi_status = gRT->GetVariable((CHAR16 *)var, &owner, NULL, len, NULL);
+	efi_status = RT->GetVariable((CHAR16 *)var, &owner, NULL, len, NULL);
 	if (efi_status != EFI_BUFFER_TOO_SMALL) {
 		if (!EFI_ERROR(efi_status)) /* this should never happen */
 			return EFI_PROTOCOL_ERROR;
@@ -298,7 +302,7 @@ get_variable_attr(const CHAR16 * const var, UINT8 **data, UINTN *len,
 	if (!*data)
 		return EFI_OUT_OF_RESOURCES;
 
-	efi_status = gRT->GetVariable((CHAR16 *)var, &owner, attributes, len, *data);
+	efi_status = RT->GetVariable((CHAR16 *)var, &owner, attributes, len, *data);
 	if (EFI_ERROR(efi_status)) {
 		FreePool(*data);
 		*data = NULL;
@@ -341,7 +345,7 @@ EFI_STATUS
 set_variable(CHAR16 *var, EFI_GUID owner, UINT32 attributes,
 	     UINTN datasize, void *data)
 {
-	return gRT->SetVariable(var, &owner, attributes, datasize, data);
+	return RT->SetVariable(var, &owner, attributes, datasize, data);
 }
 
 EFI_STATUS
@@ -394,8 +398,8 @@ variable_is_setupmode(int default_return)
 	UINTN DataSize = sizeof(SetupMode);
 	EFI_STATUS efi_status;
 
-	efi_status = gRT->GetVariable(L"SetupMode", &GV_GUID, NULL,
-				      &DataSize, &SetupMode);
+	efi_status = RT->GetVariable(L"SetupMode", &GV_GUID, NULL,
+				     &DataSize, &SetupMode);
 	if (EFI_ERROR(efi_status))
 		return default_return;
 
@@ -411,8 +415,8 @@ variable_is_secureboot(void)
 	EFI_STATUS efi_status;
 
 	DataSize = sizeof(SecureBoot);
-	efi_status = gRT->GetVariable(L"SecureBoot", &GV_GUID, NULL,
-				      &DataSize, &SecureBoot);
+	efi_status = RT->GetVariable(L"SecureBoot", &GV_GUID, NULL,
+				     &DataSize, &SecureBoot);
 	if (EFI_ERROR(efi_status))
 		return 0;
 
@@ -445,10 +449,10 @@ variable_enroll_hash(const CHAR16 * const var, EFI_GUID owner,
 		efi_status = SetSecureVariable(var, sig, sizeof(sig), owner,
 					       EFI_VARIABLE_APPEND_WRITE, 0);
 	else
-		efi_status = gRT->SetVariable((CHAR16 *)var, &owner,
-					      EFI_VARIABLE_NON_VOLATILE |
-					      EFI_VARIABLE_BOOTSERVICE_ACCESS |
-					      EFI_VARIABLE_APPEND_WRITE,
-					      sizeof(sig), sig);
+		efi_status = RT->SetVariable((CHAR16 *)var, &owner,
+					     EFI_VARIABLE_NON_VOLATILE |
+					     EFI_VARIABLE_BOOTSERVICE_ACCESS |
+					     EFI_VARIABLE_APPEND_WRITE,
+					     sizeof(sig), sig);
 	return efi_status;
 }
diff --git a/test.c b/test.c
index 9da5cf5..11e0c64 100644
--- a/test.c
+++ b/test.c
@@ -22,37 +22,6 @@ LogError_(const char *file, int line, const char *func, const CHAR16 *fmt, ...)
 	return EFI_SUCCESS;
 }
 
-#ifndef HAVE_STRCMP
-INTN
-StrCmp(CONST CHAR16 *s1, CONST CHAR16 *s2) {
-	assert(s1 != NULL);
-	assert(s2 != NULL);
-
-	int i;
-	for (i = 0; s1[i] && s2[i]; i++) {
-		if (s1[i] != s2[i])
-			return s2[i] - s1[i];
-	}
-	return 0;
-}
-#endif
-
-#ifndef HAVE_STRNCMP
-INTN
-StrnCmp(CONST CHAR16 *s1, CONST CHAR16 *s2, UINTN len) {
-	assert(s1 != NULL);
-	assert(s2 != NULL);
-
-	UINTN i;
-	for (i = 0; i < len && s1[i] && s2[i]; i++) {
-		if (s1[i] != s2[i])
-			return s2[i] - s1[i];
-
-	}
-	return 0;
-}
-#endif
-
 #ifndef HAVE_GET_VARIABLE_ATTR
 EFI_STATUS
 get_variable_attr(const CHAR16 * const var, UINT8 **data, UINTN *len,
@@ -74,4 +43,10 @@ get_variable(const CHAR16 * const var, UINT8 **data, UINTN *len, EFI_GUID owner)
 EFI_GUID SHIM_LOCK_GUID = {0x605dab50, 0xe046, 0x4300, {0xab, 0xb6, 0x3d, 0xd8, 0x10, 0xdd, 0x8b, 0x23 } };
 #endif
 
+UINTN EFIAPI
+console_print(const CHAR16 *fmt, ...)
+{
+	return 0;
+}
+
 // vim:fenc=utf-8:tw=75:noet
-- 
2.32.0