1 // SPDX-License-Identifier: GPL-2.0-only 2 /* 3 * Copyright (C) 2011 Richard Weinberger <richrd@nod.at> 4 * 5 * This vDSO turns all calls into a syscall so that UML can trap them. 6 */ 7 8 9 /* Disable profiling for userspace code */ 10 #define DISABLE_BRANCH_PROFILING 11 12 #include <linux/time.h> 13 #include <linux/getcpu.h> 14 #include <asm/unistd.h> 15 16 /* workaround for -Wmissing-prototypes warnings */ 17 int __vdso_clock_gettime(clockid_t clock, struct __kernel_old_timespec *ts); 18 int __vdso_gettimeofday(struct __kernel_old_timeval *tv, struct timezone *tz); 19 __kernel_old_time_t __vdso_time(__kernel_old_time_t *t); 20 long __vdso_getcpu(unsigned int *cpu, unsigned int *node, struct getcpu_cache *unused); 21 22 int __vdso_clock_gettime(clockid_t clock, struct __kernel_old_timespec *ts) 23 { 24 long ret; 25 26 asm("syscall" 27 : "=a" (ret) 28 : "0" (__NR_clock_gettime), "D" (clock), "S" (ts) 29 : "rcx", "r11", "memory"); 30 31 return ret; 32 } 33 int clock_gettime(clockid_t, struct __kernel_old_timespec *) 34 __attribute__((weak, alias("__vdso_clock_gettime"))); 35 36 int __vdso_gettimeofday(struct __kernel_old_timeval *tv, struct timezone *tz) 37 { 38 long ret; 39 40 asm("syscall" 41 : "=a" (ret) 42 : "0" (__NR_gettimeofday), "D" (tv), "S" (tz) 43 : "rcx", "r11", "memory"); 44 45 return ret; 46 } 47 int gettimeofday(struct __kernel_old_timeval *, struct timezone *) 48 __attribute__((weak, alias("__vdso_gettimeofday"))); 49 50 __kernel_old_time_t __vdso_time(__kernel_old_time_t *t) 51 { 52 long secs; 53 54 asm volatile("syscall" 55 : "=a" (secs) 56 : "0" (__NR_time), "D" (t) : "cc", "r11", "cx", "memory"); 57 58 return secs; 59 } 60 __kernel_old_time_t time(__kernel_old_time_t *t) __attribute__((weak, alias("__vdso_time"))); 61 62 long 63 __vdso_getcpu(unsigned int *cpu, unsigned int *node, struct getcpu_cache *unused) 64 { 65 /* 66 * UML does not support SMP, we can cheat here. :) 67 */ 68 69 if (cpu) 70 *cpu = 0; 71 if (node) 72 *node = 0; 73 74 return 0; 75 } 76 77 long getcpu(unsigned int *cpu, unsigned int *node, struct getcpu_cache *tcache) 78 __attribute__((weak, alias("__vdso_getcpu"))); 79