72 lines
		
	
	
	
		
			1.6 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			72 lines
		
	
	
	
		
			1.6 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
|   | /*
 | ||
|  |  * 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"))); |