selftests: vdso: Add a selftest for vDSO getcpu()
authorMark Brown <broonie@kernel.org>
Fri, 22 May 2020 16:21:39 +0000 (17:21 +0100)
committerShuah Khan <skhan@linuxfoundation.org>
Fri, 22 May 2020 17:05:07 +0000 (11:05 -0600)
Provide a very basic selftest for getcpu() which similarly to our existing
test for gettimeofday() looks up the function in the vDSO and prints the
results it gets if the function exists and succeeds.

Signed-off-by: Mark Brown <broonie@kernel.org>
Signed-off-by: Shuah Khan <skhan@linuxfoundation.org>
tools/testing/selftests/vDSO/.gitignore
tools/testing/selftests/vDSO/Makefile
tools/testing/selftests/vDSO/vdso_test_getcpu.c [new file with mode: 0644]

index 74f49bd5f6dd89bf29657f9f1d846d487f8d6813..5eb64d41e54199b47c0b05a1db9f5a37979c17ca 100644 (file)
@@ -1,4 +1,5 @@
 # SPDX-License-Identifier: GPL-2.0-only
 vdso_test
 vdso_test_gettimeofday
+vdso_test_getcpu
 vdso_standalone_test_x86
index ae15d700b62ee6d05804f2d4ae1907a09d83721b..0069f2f83f865fc64765a721011dd27e3f30b9ba 100644 (file)
@@ -4,7 +4,7 @@ include ../lib.mk
 uname_M := $(shell uname -m 2>/dev/null || echo not)
 ARCH ?= $(shell echo $(uname_M) | sed -e s/i.86/x86/ -e s/x86_64/x86/)
 
-TEST_GEN_PROGS := $(OUTPUT)/vdso_test_gettimeofday
+TEST_GEN_PROGS := $(OUTPUT)/vdso_test_gettimeofday $(OUTPUT)/vdso_test_getcpu
 ifeq ($(ARCH),x86)
 TEST_GEN_PROGS += $(OUTPUT)/vdso_standalone_test_x86
 endif
@@ -18,6 +18,7 @@ endif
 
 all: $(TEST_GEN_PROGS)
 $(OUTPUT)/vdso_test_gettimeofday: parse_vdso.c vdso_test_gettimeofday.c
+$(OUTPUT)/vdso_test_getcpu: parse_vdso.c vdso_test_getcpu.c
 $(OUTPUT)/vdso_standalone_test_x86: vdso_standalone_test_x86.c parse_vdso.c
        $(CC) $(CFLAGS) $(CFLAGS_vdso_standalone_test_x86) \
                vdso_standalone_test_x86.c parse_vdso.c \
diff --git a/tools/testing/selftests/vDSO/vdso_test_getcpu.c b/tools/testing/selftests/vDSO/vdso_test_getcpu.c
new file mode 100644 (file)
index 0000000..fc25ede
--- /dev/null
@@ -0,0 +1,54 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * vdso_test_getcpu.c: Sample code to test parse_vdso.c and vDSO getcpu()
+ *
+ * Copyright (c) 2020 Arm Ltd
+ */
+
+#include <stdint.h>
+#include <elf.h>
+#include <stdio.h>
+#include <sys/auxv.h>
+#include <sys/time.h>
+
+#include "../kselftest.h"
+#include "parse_vdso.h"
+
+const char *version = "LINUX_2.6";
+const char *name = "__vdso_getcpu";
+
+struct getcpu_cache;
+typedef long (*getcpu_t)(unsigned int *, unsigned int *,
+                        struct getcpu_cache *);
+
+int main(int argc, char **argv)
+{
+       unsigned long sysinfo_ehdr;
+       unsigned int cpu, node;
+       getcpu_t get_cpu;
+       long ret;
+
+       sysinfo_ehdr = getauxval(AT_SYSINFO_EHDR);
+       if (!sysinfo_ehdr) {
+               printf("AT_SYSINFO_EHDR is not present!\n");
+               return KSFT_SKIP;
+       }
+
+       vdso_init_from_sysinfo_ehdr(getauxval(AT_SYSINFO_EHDR));
+
+       get_cpu = (getcpu_t)vdso_sym(version, name);
+       if (!get_cpu) {
+               printf("Could not find %s\n", name);
+               return KSFT_SKIP;
+       }
+
+       ret = get_cpu(&cpu, &node, 0);
+       if (ret == 0) {
+               printf("Running on CPU %u node %u\n", cpu, node);
+       } else {
+               printf("%s failed\n", name);
+               return KSFT_FAIL;
+       }
+
+       return 0;
+}