xref: /openbmc/linux/arch/x86/include/asm/vsyscall.h (revision af170c5061dd78512c469e6e2d211980cdb2c193)
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