vsyscall.h 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. #ifndef _ASM_X86_VSYSCALL_H
  2. #define _ASM_X86_VSYSCALL_H
  3. enum vsyscall_num {
  4. __NR_vgettimeofday,
  5. __NR_vtime,
  6. __NR_vgetcpu,
  7. };
  8. #define VSYSCALL_START (-10UL << 20)
  9. #define VSYSCALL_SIZE 1024
  10. #define VSYSCALL_END (-2UL << 20)
  11. #define VSYSCALL_MAPPED_PAGES 1
  12. #define VSYSCALL_ADDR(vsyscall_nr) (VSYSCALL_START+VSYSCALL_SIZE*(vsyscall_nr))
  13. #ifdef __KERNEL__
  14. #include <linux/seqlock.h>
  15. #define VGETCPU_RDTSCP 1
  16. #define VGETCPU_LSL 2
  17. /* kernel space (writeable) */
  18. extern int vgetcpu_mode;
  19. extern struct timezone sys_tz;
  20. #include <asm/vvar.h>
  21. extern void map_vsyscall(void);
  22. /*
  23. * Called on instruction fetch fault in vsyscall page.
  24. * Returns true if handled.
  25. */
  26. extern bool emulate_vsyscall(struct pt_regs *regs, unsigned long address);
  27. #ifdef CONFIG_X86_64
  28. #define VGETCPU_CPU_MASK 0xfff
  29. static inline unsigned int __getcpu(void)
  30. {
  31. unsigned int p;
  32. if (VVAR(vgetcpu_mode) == VGETCPU_RDTSCP) {
  33. /* Load per CPU data from RDTSCP */
  34. native_read_tscp(&p);
  35. } else {
  36. /* Load per CPU data from GDT */
  37. asm("lsl %1,%0" : "=r" (p) : "r" (__PER_CPU_SEG));
  38. }
  39. return p;
  40. }
  41. #endif /* CONFIG_X86_64 */
  42. #endif /* __KERNEL__ */
  43. #endif /* _ASM_X86_VSYSCALL_H */