11965aae3SH. Peter Anvin #ifndef _ASM_X86_VSYSCALL_H 21965aae3SH. Peter Anvin #define _ASM_X86_VSYSCALL_H 3bb898558SAl Viro 4bb898558SAl Viro #include <linux/seqlock.h> 5*af170c50SDavid Howells #include <uapi/asm/vsyscall.h> 6bb898558SAl Viro 7bb898558SAl Viro #define VGETCPU_RDTSCP 1 8bb898558SAl Viro #define VGETCPU_LSL 2 9bb898558SAl Viro 10bb898558SAl Viro /* kernel space (writeable) */ 11bb898558SAl Viro extern int vgetcpu_mode; 12bb898558SAl Viro extern struct timezone sys_tz; 13bb898558SAl Viro 148c49d9a7SAndy Lutomirski #include <asm/vvar.h> 158c49d9a7SAndy Lutomirski 16bb898558SAl Viro extern void map_vsyscall(void); 17bb898558SAl Viro 183ae36655SAndy Lutomirski /* 193ae36655SAndy Lutomirski * Called on instruction fetch fault in vsyscall page. 203ae36655SAndy Lutomirski * Returns true if handled. 213ae36655SAndy Lutomirski */ 223ae36655SAndy Lutomirski extern bool emulate_vsyscall(struct pt_regs *regs, unsigned long address); 233ae36655SAndy Lutomirski 2451c19b4fSMarcelo Tosatti #ifdef CONFIG_X86_64 2551c19b4fSMarcelo Tosatti 2651c19b4fSMarcelo Tosatti #define VGETCPU_CPU_MASK 0xfff 2751c19b4fSMarcelo Tosatti 2851c19b4fSMarcelo Tosatti static inline unsigned int __getcpu(void) 2951c19b4fSMarcelo Tosatti { 3051c19b4fSMarcelo Tosatti unsigned int p; 3151c19b4fSMarcelo Tosatti 3251c19b4fSMarcelo Tosatti if (VVAR(vgetcpu_mode) == VGETCPU_RDTSCP) { 3351c19b4fSMarcelo Tosatti /* Load per CPU data from RDTSCP */ 3451c19b4fSMarcelo Tosatti native_read_tscp(&p); 3551c19b4fSMarcelo Tosatti } else { 3651c19b4fSMarcelo Tosatti /* Load per CPU data from GDT */ 3751c19b4fSMarcelo Tosatti asm("lsl %1,%0" : "=r" (p) : "r" (__PER_CPU_SEG)); 3851c19b4fSMarcelo Tosatti } 3951c19b4fSMarcelo Tosatti 4051c19b4fSMarcelo Tosatti return p; 4151c19b4fSMarcelo Tosatti } 4251c19b4fSMarcelo Tosatti #endif /* CONFIG_X86_64 */ 4351c19b4fSMarcelo Tosatti 441965aae3SH. Peter Anvin #endif /* _ASM_X86_VSYSCALL_H */ 45