cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

um_vdso.c (1576B)


      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
     16int __vdso_clock_gettime(clockid_t clock, struct __kernel_old_timespec *ts)
     17{
     18	long ret;
     19
     20	asm("syscall" : "=a" (ret) :
     21		"0" (__NR_clock_gettime), "D" (clock), "S" (ts) : "memory");
     22
     23	return ret;
     24}
     25int clock_gettime(clockid_t, struct __kernel_old_timespec *)
     26	__attribute__((weak, alias("__vdso_clock_gettime")));
     27
     28int __vdso_gettimeofday(struct __kernel_old_timeval *tv, struct timezone *tz)
     29{
     30	long ret;
     31
     32	asm("syscall" : "=a" (ret) :
     33		"0" (__NR_gettimeofday), "D" (tv), "S" (tz) : "memory");
     34
     35	return ret;
     36}
     37int gettimeofday(struct __kernel_old_timeval *, struct timezone *)
     38	__attribute__((weak, alias("__vdso_gettimeofday")));
     39
     40__kernel_old_time_t __vdso_time(__kernel_old_time_t *t)
     41{
     42	long secs;
     43
     44	asm volatile("syscall"
     45		: "=a" (secs)
     46		: "0" (__NR_time), "D" (t) : "cc", "r11", "cx", "memory");
     47
     48	return secs;
     49}
     50__kernel_old_time_t time(__kernel_old_time_t *t) __attribute__((weak, alias("__vdso_time")));
     51
     52long
     53__vdso_getcpu(unsigned *cpu, unsigned *node, struct getcpu_cache *unused)
     54{
     55	/*
     56	 * UML does not support SMP, we can cheat here. :)
     57	 */
     58
     59	if (cpu)
     60		*cpu = 0;
     61	if (node)
     62		*node = 0;
     63
     64	return 0;
     65}
     66
     67long getcpu(unsigned *cpu, unsigned *node, struct getcpu_cache *tcache)
     68	__attribute__((weak, alias("__vdso_getcpu")));