diff options
Diffstat (limited to 'vdso')
-rw-r--r-- | vdso/BUILD | 41 | ||||
-rw-r--r-- | vdso/syscalls.h | 33 | ||||
-rw-r--r-- | vdso/vdso.cc | 16 | ||||
-rw-r--r-- | vdso/vdso_amd64.lds | 1 |
4 files changed, 43 insertions, 48 deletions
diff --git a/vdso/BUILD b/vdso/BUILD index 7ceed349e..d37d4266d 100644 --- a/vdso/BUILD +++ b/vdso/BUILD @@ -3,20 +3,10 @@ # normal system VDSO (time, gettimeofday, clock_gettimeofday) but which uses # timekeeping parameters managed by the sandbox kernel. -load("@bazel_tools//tools/cpp:cc_flags_supplier.bzl", "cc_flags_supplier") +load("//tools:defs.bzl", "cc_flags_supplier", "cc_toolchain", "select_arch") package(licenses = ["notice"]) -config_setting( - name = "x86_64", - constraint_values = ["@bazel_tools//platforms:x86_64"], -) - -config_setting( - name = "aarch64", - constraint_values = ["@bazel_tools//platforms:aarch64"], -) - genrule( name = "vdso", srcs = [ @@ -39,14 +29,15 @@ genrule( "-O2 " + "-std=c++11 " + "-fPIC " + + "-fno-sanitize=all " + # Some toolchains enable stack protector by default. Disable it, the # VDSO has no hooks to handle failures. "-fno-stack-protector " + "-fuse-ld=gold " + - select({ - ":x86_64": "-m64 ", - "//conditions:default": "", - }) + + select_arch( + amd64 = "-m64 ", + arm64 = "", + ) + "-shared " + "-nostdlib " + "-Wl,-soname=linux-vdso.so.1 " + @@ -55,12 +46,10 @@ genrule( "-Wl,-Bsymbolic " + "-Wl,-z,max-page-size=4096 " + "-Wl,-z,common-page-size=4096 " + - select( - { - ":x86_64": "-Wl,-T$(location vdso_amd64.lds) ", - ":aarch64": "-Wl,-T$(location vdso_arm64.lds) ", - }, - no_match_error = "Unsupported architecture", + select_arch( + amd64 = "-Wl,-T$(location vdso_amd64.lds) ", + arm64 = "-Wl,-T$(location vdso_arm64.lds) ", + no_match_error = "unsupported architecture", ) + "-o $(location vdso.so) " + "$(location vdso.cc) " + @@ -68,14 +57,14 @@ genrule( "&& $(location :check_vdso) " + "--check-data " + "--vdso $(location vdso.so) ", + exec_tools = [ + ":check_vdso", + ], features = ["-pie"], toolchains = [ - "@bazel_tools//tools/cpp:current_cc_toolchain", + cc_toolchain, ":no_pie_cc_flags", ], - tools = [ - ":check_vdso", - ], visibility = ["//:sandbox"], ) @@ -87,6 +76,6 @@ cc_flags_supplier( py_binary( name = "check_vdso", srcs = ["check_vdso.py"], - python_version = "PY2", + python_version = "PY3", visibility = ["//:sandbox"], ) diff --git a/vdso/syscalls.h b/vdso/syscalls.h index f5865bb72..0c6a922a0 100644 --- a/vdso/syscalls.h +++ b/vdso/syscalls.h @@ -26,6 +26,9 @@ #include <stddef.h> #include <sys/types.h> +#define __stringify_1(x...) #x +#define __stringify(x...) __stringify_1(x) + namespace vdso { #if __x86_64__ @@ -51,22 +54,15 @@ static inline int sys_getcpu(unsigned* cpu, unsigned* node, return num; } -#elif __aarch64__ - -static inline int sys_rt_sigreturn(void) { - int num = __NR_rt_sigreturn; - - asm volatile( - "mov x8, %0\n" - "svc #0 \n" - : "+r"(num) - : - :); - return num; +static inline void sys_rt_sigreturn(void) { + asm volatile("movl $" __stringify(__NR_rt_sigreturn)", %eax \n" + "syscall \n"); } -static inline int sys_clock_gettime(clockid_t _clkid, struct timespec *_ts) { - register struct timespec *ts asm("x1") = _ts; +#elif __aarch64__ + +static inline int sys_clock_gettime(clockid_t _clkid, struct timespec* _ts) { + register struct timespec* ts asm("x1") = _ts; register clockid_t clkid asm("x0") = _clkid; register long ret asm("x0"); register long nr asm("x8") = __NR_clock_gettime; @@ -78,8 +74,8 @@ static inline int sys_clock_gettime(clockid_t _clkid, struct timespec *_ts) { return ret; } -static inline int sys_clock_getres(clockid_t _clkid, struct timespec *_ts) { - register struct timespec *ts asm("x1") = _ts; +static inline int sys_clock_getres(clockid_t _clkid, struct timespec* _ts) { + register struct timespec* ts asm("x1") = _ts; register clockid_t clkid asm("x0") = _clkid; register long ret asm("x0"); register long nr asm("x8") = __NR_clock_getres; @@ -91,6 +87,11 @@ static inline int sys_clock_getres(clockid_t _clkid, struct timespec *_ts) { return ret; } +static inline void sys_rt_sigreturn(void) { + asm volatile("mov x8, #" __stringify(__NR_rt_sigreturn)" \n" + "svc #0 \n"); +} + #else #error "unsupported architecture" #endif diff --git a/vdso/vdso.cc b/vdso/vdso.cc index 8bb80a7a4..3b6653b5d 100644 --- a/vdso/vdso.cc +++ b/vdso/vdso.cc @@ -69,6 +69,12 @@ int __common_gettimeofday(struct timeval* tv, struct timezone* tz) { } } // namespace +// __kernel_rt_sigreturn() implements rt_sigreturn() +extern "C" void __kernel_rt_sigreturn(unsigned long unused) { + // No optimizations yet, just make the real system call. + sys_rt_sigreturn(); +} + #if __x86_64__ // __vdso_clock_gettime() implements clock_gettime() @@ -126,6 +132,10 @@ extern "C" int __kernel_clock_getres(clockid_t clock, struct timespec* res) { case CLOCK_REALTIME: case CLOCK_MONOTONIC: case CLOCK_BOOTTIME: { + if (res == nullptr) { + return 0; + } + res->tv_sec = 0; res->tv_nsec = 1; break; @@ -139,12 +149,6 @@ extern "C" int __kernel_clock_getres(clockid_t clock, struct timespec* res) { return ret; } -// __kernel_rt_sigreturn() implements gettimeofday() -extern "C" int __kernel_rt_sigreturn(unsigned long unused) { - // No optimizations yet, just make the real system call. - return sys_rt_sigreturn(); -} - #else #error "unsupported architecture" #endif diff --git a/vdso/vdso_amd64.lds b/vdso/vdso_amd64.lds index e2615ae9e..d114290da 100644 --- a/vdso/vdso_amd64.lds +++ b/vdso/vdso_amd64.lds @@ -95,6 +95,7 @@ VERSION { __vdso_getcpu; time; __vdso_time; + __kernel_rt_sigreturn; local: *; }; |