selftests: vdso_test: support ARM64 targets
authorGreg Hackmann <ghackmann@google.com>
Wed, 1 Nov 2017 21:34:26 +0000 (14:34 -0700)
committerShuah Khan <shuahkh@osg.samsung.com>
Wed, 15 Nov 2017 15:01:43 +0000 (08:01 -0700)
ARM64's vDSO exports its gettimeofday() implementation with a different
name (__kernel_gettimeofday) and version (LINUX_2.6.39) from other
architectures.  Add a corresponding special-case to vdso_test.

Signed-off-by: Greg Hackmann <ghackmann@google.com>
Signed-off-by: Shuah Khan <shuahkh@osg.samsung.com>
tools/testing/selftests/vDSO/vdso_test.c

index 8daeb7d..2df26bd 100644 (file)
@@ -19,6 +19,19 @@ extern void *vdso_sym(const char *version, const char *name);
 extern void vdso_init_from_sysinfo_ehdr(uintptr_t base);
 extern void vdso_init_from_auxv(void *auxv);
 
+/*
+ * ARM64's vDSO exports its gettimeofday() implementation with a different
+ * name and version from other architectures, so we need to handle it as
+ * a special case.
+ */
+#if defined(__aarch64__)
+const char *version = "LINUX_2.6.39";
+const char *name = "__kernel_gettimeofday";
+#else
+const char *version = "LINUX_2.6";
+const char *name = "__vdso_gettimeofday";
+#endif
+
 int main(int argc, char **argv)
 {
        unsigned long sysinfo_ehdr = getauxval(AT_SYSINFO_EHDR);
@@ -31,10 +44,10 @@ int main(int argc, char **argv)
 
        /* Find gettimeofday. */
        typedef long (*gtod_t)(struct timeval *tv, struct timezone *tz);
-       gtod_t gtod = (gtod_t)vdso_sym("LINUX_2.6", "__vdso_gettimeofday");
+       gtod_t gtod = (gtod_t)vdso_sym(version, name);
 
        if (!gtod) {
-               printf("Could not find __vdso_gettimeofday\n");
+               printf("Could not find %s\n", name);
                return 1;
        }
 
@@ -45,7 +58,7 @@ int main(int argc, char **argv)
                printf("The time is %lld.%06lld\n",
                       (long long)tv.tv_sec, (long long)tv.tv_usec);
        } else {
-               printf("__vdso_gettimeofday failed\n");
+               printf("%s failed\n", name);
        }
 
        return 0;