On Tue, Jun 25, 2024 at 05:54:05PM +0530, Dev Jain wrote:
--- /dev/null +++ b/tools/testing/selftests/arm64/abi/ptrace.h @@ -0,0 +1,135 @@ +// SPDX-License-Identifier: GPL-2.0-only +/*
- Copyright (C) 2024 ARM Limited.
- */
+#include "../../kselftest.h"
+static void run_tests(pid_t child);
+static int do_child(void);
+#ifdef __aarch64__ +static bool have_sme(void) +{
- return getauxval(AT_HWCAP2) & HWCAP2_SME;
+}
+static void test_hw_debug(pid_t child, int type, const char *type_name) +{
- struct user_hwdebug_state state;
- struct iovec iov;
- int slots, arch, ret;
- iov.iov_len = sizeof(state);
- iov.iov_base = &state;
- /* Should be able to read the values */
- ret = ptrace(PTRACE_GETREGSET, child, type, &iov);
- ksft_test_result(ret == 0, "read_%s\n", type_name);
This feels like it's pulling way too much stuff out into the header. I think some of this needs to be a C file that gets built for both architectures with some mechanism they can use to run tests, and a library of any shared tests.
- if (ret == 0) {
/* Low 8 bits is the number of slots, next 4 bits the arch */slots = state.dbg_info & 0xff;arch = (state.dbg_info >> 8) & 0xf;ksft_print_msg("%s version %d with %d slots\n", type_name,arch, slots);/* Zero is not currently architecturally valid */ksft_test_result(arch, "%s_arch_set\n", type_name);- } else {
ksft_test_result_skip("%s_arch_set\n", type_name);- }
+} +#endif
+static int do_parent(pid_t child) +{
- int ret = EXIT_FAILURE;
- pid_t pid;
- int status;
- siginfo_t si;
- /* Attach to the child */
- while (1) {
int sig;pid = wait(&status);if (pid == -1) {perror("wait");goto error;}/** This should never happen but it's hard to flag in* the framework.*/if (pid != child)continue;if (WIFEXITED(status) || WIFSIGNALED(status))ksft_exit_fail_msg("Child died unexpectedly\n");if (!WIFSTOPPED(status))goto error;sig = WSTOPSIG(status);if (sig == SIGTRAP)ksft_print_msg("Child received SIGTRAP\n");if (ptrace(PTRACE_GETSIGINFO, pid, NULL, &si)) {if (errno == ESRCH)goto disappeared;if (errno == EINVAL)goto cont;ksft_test_result_fail("PTRACE_GETSIGINFO: %s\n",strerror(errno));goto error;}if (sig == SIGSTOP && si.si_code == SI_TKILL &&si.si_pid == pid)break;+cont:
/* bust group-stop */if (ptrace(PTRACE_CONT, pid, NULL, 0)) {if (errno == ESRCH)goto disappeared;ksft_test_result_fail("PTRACE_CONT: %s\n",strerror(errno));goto error;}- }
- ksft_print_msg("Parent is %d, child is %d\n", getpid(), child);
- ret = EXIT_SUCCESS;
- run_tests(child);
+error:
- kill(child, SIGKILL);
+disappeared:
- return ret;
+}
2.39.2