@@ -18,6 +18,7 @@
#include <sys/auxv.h>
#include "../../kselftest.h"
+#include "../../kselftest_operators.h"
#include "defines.h"
#include "../../../../../arch/x86/kernel/cpu/sgx/arch.h"
@@ -26,6 +27,41 @@
#define PAGE_SIZE 4096
+#define EXPECT_FAILED(_assert, fmt, ...) \
+do { \
+ if (_assert) \
+ ksft_exit_fail_msg(fmt, ##__VA_ARGS__); \
+ else \
+ ksft_test_result_fail(fmt, ##__VA_ARGS__); \
+} while (0)
+
+#define __EXPECT(_expected, _expected_str, _seen, _seen_str, _t, _assert) \
+do { \
+ /* Avoid multiple evaluation of the cases */ \
+ __typeof__(_expected) __exp = (_expected); \
+ __typeof__(_seen) __seen = (_seen); \
+ if (passed && !(__exp _t __seen)) { \
+ unsigned long long __exp_print = (uintptr_t)__exp; \
+ unsigned long long __seen_print = (uintptr_t)__seen; \
+ EXPECT_FAILED(_assert, \
+ "Expected '%s (%llu) %s %s (%llu)' at %s:%u\n", \
+ _expected_str, __exp_print, #_t, _seen_str, \
+ __seen_print, __FILE__, __LINE__); \
+ passed = false; \
+ } \
+} while (0)
+
+#define RUN_TEST(test_name) \
+({ \
+ passed = true; \
+ \
+ test_name(&secs); \
+ if (passed) \
+ ksft_test_result_pass("%s: Passed\n", #test_name); \
+})
+
+static bool passed = true;
+
static const uint64_t MAGIC = 0x1122334455667788ULL;
void *eenter;
@@ -339,11 +375,7 @@ static void test_sgx_basic(struct sgx_secs *secs)
uint64_t result = 0;
sgx_call_eenter((void *)&MAGIC, &result, (void *)secs->base);
- if (result != MAGIC) {
- ksft_test_result_error("0x%lx != 0x%lx\n", result, MAGIC);
- return;
- }
- ksft_test_result_pass("%s: Passed\n", __func__);
+ EXPECT_EQ(result, MAGIC);
}
static void test_sgx_vdso(struct sgx_secs *secs)
@@ -355,11 +387,7 @@ static void test_sgx_vdso(struct sgx_secs *secs)
sgx_call_vdso((void *)&MAGIC, &result, NULL, NULL, NULL, NULL,
(void *)secs->base, &exception, NULL);
- if (result != MAGIC) {
- ksft_test_result_error("0x%lx != 0x%lx\n", result, MAGIC);
- return;
- }
- ksft_test_result_pass("%s: Passed\n", __func__);
+ EXPECT_EQ(result, MAGIC);
}
int main(int argc, char *argv[], char *envp[])
@@ -381,12 +409,12 @@ int main(int argc, char *argv[], char *envp[])
if (!encl_build(&secs, bin, bin_size, &sigstruct))
exit(1);
- test_sgx_basic(&secs);
+ RUN_TEST(test_sgx_basic);
if (!setup_vdso())
exit(1);
- test_sgx_vdso(&secs);
+ RUN_TEST(test_sgx_vdso);
return ksft_exit_pass();
}
Use kselftest's operators, e.g. ASSERT_EQ, EXPECT_EQ, etc... to check test results. Implement a custom __EXPECT() macro instead of using the framework defined in kselftest_harness.h. The harness framework is designed for tests that are short and sweet, e.g. true unit tests, and don't work well with SGX's need for a large, run-once setup. The harness code will also be problematic when tests for the vDSO's callback code are added in the future. Signed-off-by: Sean Christopherson <sean.j.christopherson@intel.com> --- tools/testing/selftests/x86/sgx/main.c | 52 ++++++++++++++++++++------ 1 file changed, 40 insertions(+), 12 deletions(-)