162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright (C) 2011 Richard Weinberger <richrd@nod.at> 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * This vDSO turns all calls into a syscall so that UML can trap them. 662306a36Sopenharmony_ci */ 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci/* Disable profiling for userspace code */ 1062306a36Sopenharmony_ci#define DISABLE_BRANCH_PROFILING 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_ci#include <linux/time.h> 1362306a36Sopenharmony_ci#include <linux/getcpu.h> 1462306a36Sopenharmony_ci#include <asm/unistd.h> 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ciint __vdso_clock_gettime(clockid_t clock, struct __kernel_old_timespec *ts) 1762306a36Sopenharmony_ci{ 1862306a36Sopenharmony_ci long ret; 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_ci asm("syscall" 2162306a36Sopenharmony_ci : "=a" (ret) 2262306a36Sopenharmony_ci : "0" (__NR_clock_gettime), "D" (clock), "S" (ts) 2362306a36Sopenharmony_ci : "rcx", "r11", "memory"); 2462306a36Sopenharmony_ci 2562306a36Sopenharmony_ci return ret; 2662306a36Sopenharmony_ci} 2762306a36Sopenharmony_ciint clock_gettime(clockid_t, struct __kernel_old_timespec *) 2862306a36Sopenharmony_ci __attribute__((weak, alias("__vdso_clock_gettime"))); 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_ciint __vdso_gettimeofday(struct __kernel_old_timeval *tv, struct timezone *tz) 3162306a36Sopenharmony_ci{ 3262306a36Sopenharmony_ci long ret; 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_ci asm("syscall" 3562306a36Sopenharmony_ci : "=a" (ret) 3662306a36Sopenharmony_ci : "0" (__NR_gettimeofday), "D" (tv), "S" (tz) 3762306a36Sopenharmony_ci : "rcx", "r11", "memory"); 3862306a36Sopenharmony_ci 3962306a36Sopenharmony_ci return ret; 4062306a36Sopenharmony_ci} 4162306a36Sopenharmony_ciint gettimeofday(struct __kernel_old_timeval *, struct timezone *) 4262306a36Sopenharmony_ci __attribute__((weak, alias("__vdso_gettimeofday"))); 4362306a36Sopenharmony_ci 4462306a36Sopenharmony_ci__kernel_old_time_t __vdso_time(__kernel_old_time_t *t) 4562306a36Sopenharmony_ci{ 4662306a36Sopenharmony_ci long secs; 4762306a36Sopenharmony_ci 4862306a36Sopenharmony_ci asm volatile("syscall" 4962306a36Sopenharmony_ci : "=a" (secs) 5062306a36Sopenharmony_ci : "0" (__NR_time), "D" (t) : "cc", "r11", "cx", "memory"); 5162306a36Sopenharmony_ci 5262306a36Sopenharmony_ci return secs; 5362306a36Sopenharmony_ci} 5462306a36Sopenharmony_ci__kernel_old_time_t time(__kernel_old_time_t *t) __attribute__((weak, alias("__vdso_time"))); 5562306a36Sopenharmony_ci 5662306a36Sopenharmony_cilong 5762306a36Sopenharmony_ci__vdso_getcpu(unsigned *cpu, unsigned *node, struct getcpu_cache *unused) 5862306a36Sopenharmony_ci{ 5962306a36Sopenharmony_ci /* 6062306a36Sopenharmony_ci * UML does not support SMP, we can cheat here. :) 6162306a36Sopenharmony_ci */ 6262306a36Sopenharmony_ci 6362306a36Sopenharmony_ci if (cpu) 6462306a36Sopenharmony_ci *cpu = 0; 6562306a36Sopenharmony_ci if (node) 6662306a36Sopenharmony_ci *node = 0; 6762306a36Sopenharmony_ci 6862306a36Sopenharmony_ci return 0; 6962306a36Sopenharmony_ci} 7062306a36Sopenharmony_ci 7162306a36Sopenharmony_cilong getcpu(unsigned *cpu, unsigned *node, struct getcpu_cache *tcache) 7262306a36Sopenharmony_ci __attribute__((weak, alias("__vdso_getcpu"))); 73