18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * Copyright (C) 2011 Richard Weinberger <richrd@nod.at> 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * This vDSO turns all calls into a syscall so that UML can trap them. 68c2ecf20Sopenharmony_ci */ 78c2ecf20Sopenharmony_ci 88c2ecf20Sopenharmony_ci 98c2ecf20Sopenharmony_ci/* Disable profiling for userspace code */ 108c2ecf20Sopenharmony_ci#define DISABLE_BRANCH_PROFILING 118c2ecf20Sopenharmony_ci 128c2ecf20Sopenharmony_ci#include <linux/time.h> 138c2ecf20Sopenharmony_ci#include <linux/getcpu.h> 148c2ecf20Sopenharmony_ci#include <asm/unistd.h> 158c2ecf20Sopenharmony_ci 168c2ecf20Sopenharmony_ciint __vdso_clock_gettime(clockid_t clock, struct __kernel_old_timespec *ts) 178c2ecf20Sopenharmony_ci{ 188c2ecf20Sopenharmony_ci long ret; 198c2ecf20Sopenharmony_ci 208c2ecf20Sopenharmony_ci asm("syscall" 218c2ecf20Sopenharmony_ci : "=a" (ret) 228c2ecf20Sopenharmony_ci : "0" (__NR_clock_gettime), "D" (clock), "S" (ts) 238c2ecf20Sopenharmony_ci : "rcx", "r11", "memory"); 248c2ecf20Sopenharmony_ci 258c2ecf20Sopenharmony_ci return ret; 268c2ecf20Sopenharmony_ci} 278c2ecf20Sopenharmony_ciint clock_gettime(clockid_t, struct __kernel_old_timespec *) 288c2ecf20Sopenharmony_ci __attribute__((weak, alias("__vdso_clock_gettime"))); 298c2ecf20Sopenharmony_ci 308c2ecf20Sopenharmony_ciint __vdso_gettimeofday(struct __kernel_old_timeval *tv, struct timezone *tz) 318c2ecf20Sopenharmony_ci{ 328c2ecf20Sopenharmony_ci long ret; 338c2ecf20Sopenharmony_ci 348c2ecf20Sopenharmony_ci asm("syscall" 358c2ecf20Sopenharmony_ci : "=a" (ret) 368c2ecf20Sopenharmony_ci : "0" (__NR_gettimeofday), "D" (tv), "S" (tz) 378c2ecf20Sopenharmony_ci : "rcx", "r11", "memory"); 388c2ecf20Sopenharmony_ci 398c2ecf20Sopenharmony_ci return ret; 408c2ecf20Sopenharmony_ci} 418c2ecf20Sopenharmony_ciint gettimeofday(struct __kernel_old_timeval *, struct timezone *) 428c2ecf20Sopenharmony_ci __attribute__((weak, alias("__vdso_gettimeofday"))); 438c2ecf20Sopenharmony_ci 448c2ecf20Sopenharmony_ci__kernel_old_time_t __vdso_time(__kernel_old_time_t *t) 458c2ecf20Sopenharmony_ci{ 468c2ecf20Sopenharmony_ci long secs; 478c2ecf20Sopenharmony_ci 488c2ecf20Sopenharmony_ci asm volatile("syscall" 498c2ecf20Sopenharmony_ci : "=a" (secs) 508c2ecf20Sopenharmony_ci : "0" (__NR_time), "D" (t) : "cc", "r11", "cx", "memory"); 518c2ecf20Sopenharmony_ci 528c2ecf20Sopenharmony_ci return secs; 538c2ecf20Sopenharmony_ci} 548c2ecf20Sopenharmony_ci__kernel_old_time_t time(__kernel_old_time_t *t) __attribute__((weak, alias("__vdso_time"))); 558c2ecf20Sopenharmony_ci 568c2ecf20Sopenharmony_cilong 578c2ecf20Sopenharmony_ci__vdso_getcpu(unsigned *cpu, unsigned *node, struct getcpu_cache *unused) 588c2ecf20Sopenharmony_ci{ 598c2ecf20Sopenharmony_ci /* 608c2ecf20Sopenharmony_ci * UML does not support SMP, we can cheat here. :) 618c2ecf20Sopenharmony_ci */ 628c2ecf20Sopenharmony_ci 638c2ecf20Sopenharmony_ci if (cpu) 648c2ecf20Sopenharmony_ci *cpu = 0; 658c2ecf20Sopenharmony_ci if (node) 668c2ecf20Sopenharmony_ci *node = 0; 678c2ecf20Sopenharmony_ci 688c2ecf20Sopenharmony_ci return 0; 698c2ecf20Sopenharmony_ci} 708c2ecf20Sopenharmony_ci 718c2ecf20Sopenharmony_cilong getcpu(unsigned *cpu, unsigned *node, struct getcpu_cache *tcache) 728c2ecf20Sopenharmony_ci __attribute__((weak, alias("__vdso_getcpu"))); 73