123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172 |
- /*
- * Copyright (C) 2011 Richard Weinberger <richrd@nod.at>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * This vDSO turns all calls into a syscall so that UML can trap them.
- */
- /* Disable profiling for userspace code */
- #define DISABLE_BRANCH_PROFILING
- #include <linux/time.h>
- #include <linux/getcpu.h>
- #include <asm/unistd.h>
- int __vdso_clock_gettime(clockid_t clock, struct timespec *ts)
- {
- long ret;
- asm("syscall" : "=a" (ret) :
- "0" (__NR_clock_gettime), "D" (clock), "S" (ts) : "memory");
- return ret;
- }
- int clock_gettime(clockid_t, struct timespec *)
- __attribute__((weak, alias("__vdso_clock_gettime")));
- int __vdso_gettimeofday(struct timeval *tv, struct timezone *tz)
- {
- long ret;
- asm("syscall" : "=a" (ret) :
- "0" (__NR_gettimeofday), "D" (tv), "S" (tz) : "memory");
- return ret;
- }
- int gettimeofday(struct timeval *, struct timezone *)
- __attribute__((weak, alias("__vdso_gettimeofday")));
- time_t __vdso_time(time_t *t)
- {
- long secs;
- asm volatile("syscall"
- : "=a" (secs)
- : "0" (__NR_time), "D" (t) : "cc", "r11", "cx", "memory");
- return secs;
- }
- int time(time_t *t) __attribute__((weak, alias("__vdso_time")));
- long
- __vdso_getcpu(unsigned *cpu, unsigned *node, struct getcpu_cache *unused)
- {
- /*
- * UML does not support SMP, we can cheat here. :)
- */
- if (cpu)
- *cpu = 0;
- if (node)
- *node = 0;
- return 0;
- }
- long getcpu(unsigned *cpu, unsigned *node, struct getcpu_cache *tcache)
- __attribute__((weak, alias("__vdso_getcpu")));
|