linux/arch/x86/vdso/vgetcpu.c
<<
>>
Prefs
   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