From 10726d52ac3a7b34a6e2d9c40532037ca1108485 Mon Sep 17 00:00:00 2001 From: Robert Jarzmik <robert.jarzmik@intel.com> Date: Wed, 15 Jul 2015 15:26:43 +0200 Subject: [PATCH] libc: arch-x86: implement kernel vdso time functions This patch give the possibility of time vdso support on 32bit kernel. If the 32bit x86 kernel provides gettimeofday() and clock_gettime() primitives in vdso. In this case make bionic use them. If the kernel doesn't provide them, fallback to the legacy system call versions. Change-Id: I87b772a9486fa356903e1f98f486ab9eb0b6f6f7 Signed-off-by: Robert Jarzmik <robert.jarzmik@intel.com> Signed-off-by: Mingwei Shi <mingwei.shi@intel.com> --- libc/SYSCALLS.TXT | 8 ++++---- .../syscalls/{clock_gettime.S => __clock_gettime.S} | 4 ++-- .../syscalls/{gettimeofday.S => __gettimeofday.S} | 4 ++-- libc/bionic/vdso.cpp | 5 ++--- 4 files changed, 10 insertions(+), 11 deletions(-) rename libc/arch-x86/syscalls/{clock_gettime.S => __clock_gettime.S} (92%) rename libc/arch-x86/syscalls/{gettimeofday.S => __gettimeofday.S} (92%) diff --git a/libc/SYSCALLS.TXT b/libc/SYSCALLS.TXT index 151749b22..f81b89f82 100644 --- a/libc/SYSCALLS.TXT +++ b/libc/SYSCALLS.TXT @@ -333,7 +333,7 @@ int __set_tls:set_thread_area(void*) mips,mips64 int __set_thread_area:set_thread_area(void*) x86 # vdso stuff. -int clock_gettime(clockid_t, timespec*) arm,mips,mips64,x86 -int __clock_gettime:clock_gettime(clockid_t, timespec*) arm64,x86_64 -int gettimeofday(timeval*, timezone*) arm,mips,mips64,x86 -int __gettimeofday:gettimeofday(timeval*, timezone*) arm64,x86_64 +int clock_gettime(clockid_t, timespec*) arm,mips,mips64 +int __clock_gettime:clock_gettime(clockid_t, timespec*) arm64,x86,x86_64 +int gettimeofday(timeval*, timezone*) arm,mips,mips64 +int __gettimeofday:gettimeofday(timeval*, timezone*) arm64,x86,x86_64 diff --git a/libc/arch-x86/syscalls/clock_gettime.S b/libc/arch-x86/syscalls/__clock_gettime.S similarity index 92% rename from libc/arch-x86/syscalls/clock_gettime.S rename to libc/arch-x86/syscalls/__clock_gettime.S index 0875cfbd9..61eadc86e 100644 --- a/libc/arch-x86/syscalls/clock_gettime.S +++ b/libc/arch-x86/syscalls/__clock_gettime.S @@ -2,7 +2,7 @@ #include <private/bionic_asm.h> -ENTRY(clock_gettime) +ENTRY(__clock_gettime) pushl %ebx .cfi_def_cfa_offset 8 .cfi_rel_offset ebx, 0 @@ -23,4 +23,4 @@ ENTRY(clock_gettime) popl %ecx popl %ebx ret -END(clock_gettime) +END(__clock_gettime) diff --git a/libc/arch-x86/syscalls/gettimeofday.S b/libc/arch-x86/syscalls/__gettimeofday.S similarity index 92% rename from libc/arch-x86/syscalls/gettimeofday.S rename to libc/arch-x86/syscalls/__gettimeofday.S index a508c14a4..90f3f91ae 100644 --- a/libc/arch-x86/syscalls/gettimeofday.S +++ b/libc/arch-x86/syscalls/__gettimeofday.S @@ -2,7 +2,7 @@ #include <private/bionic_asm.h> -ENTRY(gettimeofday) +ENTRY(__gettimeofday) pushl %ebx .cfi_def_cfa_offset 8 .cfi_rel_offset ebx, 0 @@ -23,4 +23,4 @@ ENTRY(gettimeofday) popl %ecx popl %ebx ret -END(gettimeofday) +END(__gettimeofday) diff --git a/libc/bionic/vdso.cpp b/libc/bionic/vdso.cpp index b55c57ff5..9eae3d555 100644 --- a/libc/bionic/vdso.cpp +++ b/libc/bionic/vdso.cpp @@ -19,13 +19,12 @@ #include <sys/auxv.h> #include <unistd.h> -// x86 has a vdso, but there's nothing useful to us in it. -#if defined(__aarch64__) || defined(__x86_64__) +#if defined(__aarch64__) || defined(__x86_64__) || defined (__i386__) #if defined(__aarch64__) #define VDSO_CLOCK_GETTIME_SYMBOL "__kernel_clock_gettime" #define VDSO_GETTIMEOFDAY_SYMBOL "__kernel_gettimeofday" -#elif defined(__x86_64__) +#elif defined(__x86_64__) || defined(__i386__) #define VDSO_CLOCK_GETTIME_SYMBOL "__vdso_clock_gettime" #define VDSO_GETTIMEOFDAY_SYMBOL "__vdso_gettimeofday" #endif