Skip to content

Commit 2e9a972

Browse files
broonieshuahkh
authored andcommitted
selftests: vdso: Add a selftest for vDSO getcpu()
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 <[email protected]> Signed-off-by: Shuah Khan <[email protected]>
1 parent cd76ca4 commit 2e9a972

File tree

3 files changed

+57
-1
lines changed

3 files changed

+57
-1
lines changed
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
# SPDX-License-Identifier: GPL-2.0-only
22
vdso_test
33
vdso_test_gettimeofday
4+
vdso_test_getcpu
45
vdso_standalone_test_x86

tools/testing/selftests/vDSO/Makefile

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ include ../lib.mk
44
uname_M := $(shell uname -m 2>/dev/null || echo not)
55
ARCH ?= $(shell echo $(uname_M) | sed -e s/i.86/x86/ -e s/x86_64/x86/)
66

7-
TEST_GEN_PROGS := $(OUTPUT)/vdso_test_gettimeofday
7+
TEST_GEN_PROGS := $(OUTPUT)/vdso_test_gettimeofday $(OUTPUT)/vdso_test_getcpu
88
ifeq ($(ARCH),x86)
99
TEST_GEN_PROGS += $(OUTPUT)/vdso_standalone_test_x86
1010
endif
@@ -18,6 +18,7 @@ endif
1818

1919
all: $(TEST_GEN_PROGS)
2020
$(OUTPUT)/vdso_test_gettimeofday: parse_vdso.c vdso_test_gettimeofday.c
21+
$(OUTPUT)/vdso_test_getcpu: parse_vdso.c vdso_test_getcpu.c
2122
$(OUTPUT)/vdso_standalone_test_x86: vdso_standalone_test_x86.c parse_vdso.c
2223
$(CC) $(CFLAGS) $(CFLAGS_vdso_standalone_test_x86) \
2324
vdso_standalone_test_x86.c parse_vdso.c \
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
// SPDX-License-Identifier: GPL-2.0-only
2+
/*
3+
* vdso_test_getcpu.c: Sample code to test parse_vdso.c and vDSO getcpu()
4+
*
5+
* Copyright (c) 2020 Arm Ltd
6+
*/
7+
8+
#include <stdint.h>
9+
#include <elf.h>
10+
#include <stdio.h>
11+
#include <sys/auxv.h>
12+
#include <sys/time.h>
13+
14+
#include "../kselftest.h"
15+
#include "parse_vdso.h"
16+
17+
const char *version = "LINUX_2.6";
18+
const char *name = "__vdso_getcpu";
19+
20+
struct getcpu_cache;
21+
typedef long (*getcpu_t)(unsigned int *, unsigned int *,
22+
struct getcpu_cache *);
23+
24+
int main(int argc, char **argv)
25+
{
26+
unsigned long sysinfo_ehdr;
27+
unsigned int cpu, node;
28+
getcpu_t get_cpu;
29+
long ret;
30+
31+
sysinfo_ehdr = getauxval(AT_SYSINFO_EHDR);
32+
if (!sysinfo_ehdr) {
33+
printf("AT_SYSINFO_EHDR is not present!\n");
34+
return KSFT_SKIP;
35+
}
36+
37+
vdso_init_from_sysinfo_ehdr(getauxval(AT_SYSINFO_EHDR));
38+
39+
get_cpu = (getcpu_t)vdso_sym(version, name);
40+
if (!get_cpu) {
41+
printf("Could not find %s\n", name);
42+
return KSFT_SKIP;
43+
}
44+
45+
ret = get_cpu(&cpu, &node, 0);
46+
if (ret == 0) {
47+
printf("Running on CPU %u node %u\n", cpu, node);
48+
} else {
49+
printf("%s failed\n", name);
50+
return KSFT_FAIL;
51+
}
52+
53+
return 0;
54+
}

0 commit comments

Comments
 (0)