diff --git a/tools/testing/selftests/x86/amx.c b/tools/testing/selftests/x86/amx.c index 40769c16de1b..58bbeac3a023 100644 --- a/tools/testing/selftests/x86/amx.c +++ b/tools/testing/selftests/x86/amx.c @@ -5,6 +5,7 @@ #include #include #include +#include #include #include #include @@ -30,6 +31,9 @@ #define XFEATURE_MASK_XTILEDATA (1 << XFEATURE_XTILEDATA) #define XFEATURE_MASK_XTILE (XFEATURE_MASK_XTILECFG | XFEATURE_MASK_XTILEDATA) +#define EXEC_TEST_ARG "--exec-test" +#define EXEC_TEST_CHILD_ARG "--exec-test-child" + struct xstate_info xtiledata; /* The helpers for managing XSAVE buffer and tile states: */ @@ -478,11 +482,44 @@ static void test_fork(void) _exit(0); } -int main(void) +static int test_exec(int argc, char **argv) +{ + int i, times = atoi(argv[2]); + + req_xtiledata_perm(); + + for (i = 0; i < times; i++) { + pid_t child; + int status; + + child = fork(); + if (child < 0) + fatal_error("fork"); + if (!child) { + char *args[] = {argv[0], EXEC_TEST_CHILD_ARG, NULL}; + + if (!load_rand_tiledata(stashed_xsave)) + fatal_error("failed to load tiledata"); + + execv(args[0], args); + fatal_error("exec"); + } + + if (waitpid(child, &status, 0) != child) + fatal_error("waitpid"); + } + + return 0; +} + +int main(int argc, char **argv) { unsigned long features; long rc; + if (argc == 2 && !strcmp(argv[1], EXEC_TEST_CHILD_ARG)) + return 0; + rc = syscall(SYS_arch_prctl, ARCH_GET_XCOMP_SUPP, &features); if (rc || (features & XFEATURE_MASK_XTILE) != XFEATURE_MASK_XTILE) { ksft_print_msg("no AMX support\n"); @@ -496,6 +533,10 @@ int main(void) } init_stashed_xsave(); + + if (argc == 3 && !strcmp(argv[1], EXEC_TEST_ARG)) + return test_exec(argc, argv); + sethandler(SIGILL, handle_noperm, 0); test_dynamic_state();