1/* 2 * Copyright 2006 Andi Kleen, SUSE Labs. 3 * Subject to the GNU Public License, v.2 4 * 5 * Fast user context implementation of getcpu() 6 */ 7 8#include <linux/kernel.h> 9#include <linux/getcpu.h> 10#include <linux/jiffies.h> 11#include <linux/time.h> 12#include <asm/vsyscall.h> 13#include <asm/vgtod.h> 14#include "vextern.h" 15 16notrace long 17__vdso_getcpu(unsigned *cpu, unsigned *node, struct getcpu_cache *unused) 18{ 19 unsigned int p; 20 21 if (*vdso_vgetcpu_mode == VGETCPU_RDTSCP) { 22 /* Load per CPU data from RDTSCP */ 23 native_read_tscp(&p); 24 } else { 25 /* Load per CPU data from GDT */ 26 asm("lsl %1,%0" : "=r" (p) : "r" (__PER_CPU_SEG)); 27 } 28 if (cpu) 29 *cpu = p & 0xfff; 30 if (node) 31 *node = p >> 12; 32 return 0; 33} 34 35long getcpu(unsigned *cpu, unsigned *node, struct getcpu_cache *tcache) 36 __attribute__((weak, alias("__vdso_getcpu"))); 37