xref: /OK3568_Linux_fs/kernel/arch/x86/include/uapi/asm/vm86.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
2*4882a593Smuzhiyun #ifndef _UAPI_ASM_X86_VM86_H
3*4882a593Smuzhiyun #define _UAPI_ASM_X86_VM86_H
4*4882a593Smuzhiyun 
5*4882a593Smuzhiyun /*
6*4882a593Smuzhiyun  * I'm guessing at the VIF/VIP flag usage, but hope that this is how
7*4882a593Smuzhiyun  * the Pentium uses them. Linux will return from vm86 mode when both
8*4882a593Smuzhiyun  * VIF and VIP is set.
9*4882a593Smuzhiyun  *
10*4882a593Smuzhiyun  * On a Pentium, we could probably optimize the virtual flags directly
11*4882a593Smuzhiyun  * in the eflags register instead of doing it "by hand" in vflags...
12*4882a593Smuzhiyun  *
13*4882a593Smuzhiyun  * Linus
14*4882a593Smuzhiyun  */
15*4882a593Smuzhiyun 
16*4882a593Smuzhiyun #include <asm/processor-flags.h>
17*4882a593Smuzhiyun 
18*4882a593Smuzhiyun #define BIOSSEG		0x0f000
19*4882a593Smuzhiyun 
20*4882a593Smuzhiyun #define CPU_086		0
21*4882a593Smuzhiyun #define CPU_186		1
22*4882a593Smuzhiyun #define CPU_286		2
23*4882a593Smuzhiyun #define CPU_386		3
24*4882a593Smuzhiyun #define CPU_486		4
25*4882a593Smuzhiyun #define CPU_586		5
26*4882a593Smuzhiyun 
27*4882a593Smuzhiyun /*
28*4882a593Smuzhiyun  * Return values for the 'vm86()' system call
29*4882a593Smuzhiyun  */
30*4882a593Smuzhiyun #define VM86_TYPE(retval)	((retval) & 0xff)
31*4882a593Smuzhiyun #define VM86_ARG(retval)	((retval) >> 8)
32*4882a593Smuzhiyun 
33*4882a593Smuzhiyun #define VM86_SIGNAL	0	/* return due to signal */
34*4882a593Smuzhiyun #define VM86_UNKNOWN	1	/* unhandled GP fault
35*4882a593Smuzhiyun 				   - IO-instruction or similar */
36*4882a593Smuzhiyun #define VM86_INTx	2	/* int3/int x instruction (ARG = x) */
37*4882a593Smuzhiyun #define VM86_STI	3	/* sti/popf/iret instruction enabled
38*4882a593Smuzhiyun 				   virtual interrupts */
39*4882a593Smuzhiyun 
40*4882a593Smuzhiyun /*
41*4882a593Smuzhiyun  * Additional return values when invoking new vm86()
42*4882a593Smuzhiyun  */
43*4882a593Smuzhiyun #define VM86_PICRETURN	4	/* return due to pending PIC request */
44*4882a593Smuzhiyun #define VM86_TRAP	6	/* return due to DOS-debugger request */
45*4882a593Smuzhiyun 
46*4882a593Smuzhiyun /*
47*4882a593Smuzhiyun  * function codes when invoking new vm86()
48*4882a593Smuzhiyun  */
49*4882a593Smuzhiyun #define VM86_PLUS_INSTALL_CHECK	0
50*4882a593Smuzhiyun #define VM86_ENTER		1
51*4882a593Smuzhiyun #define VM86_ENTER_NO_BYPASS	2
52*4882a593Smuzhiyun #define	VM86_REQUEST_IRQ	3
53*4882a593Smuzhiyun #define VM86_FREE_IRQ		4
54*4882a593Smuzhiyun #define VM86_GET_IRQ_BITS	5
55*4882a593Smuzhiyun #define VM86_GET_AND_RESET_IRQ	6
56*4882a593Smuzhiyun 
57*4882a593Smuzhiyun /*
58*4882a593Smuzhiyun  * This is the stack-layout seen by the user space program when we have
59*4882a593Smuzhiyun  * done a translation of "SAVE_ALL" from vm86 mode. The real kernel layout
60*4882a593Smuzhiyun  * is 'kernel_vm86_regs' (see below).
61*4882a593Smuzhiyun  */
62*4882a593Smuzhiyun 
63*4882a593Smuzhiyun struct vm86_regs {
64*4882a593Smuzhiyun /*
65*4882a593Smuzhiyun  * normal regs, with special meaning for the segment descriptors..
66*4882a593Smuzhiyun  */
67*4882a593Smuzhiyun 	long ebx;
68*4882a593Smuzhiyun 	long ecx;
69*4882a593Smuzhiyun 	long edx;
70*4882a593Smuzhiyun 	long esi;
71*4882a593Smuzhiyun 	long edi;
72*4882a593Smuzhiyun 	long ebp;
73*4882a593Smuzhiyun 	long eax;
74*4882a593Smuzhiyun 	long __null_ds;
75*4882a593Smuzhiyun 	long __null_es;
76*4882a593Smuzhiyun 	long __null_fs;
77*4882a593Smuzhiyun 	long __null_gs;
78*4882a593Smuzhiyun 	long orig_eax;
79*4882a593Smuzhiyun 	long eip;
80*4882a593Smuzhiyun 	unsigned short cs, __csh;
81*4882a593Smuzhiyun 	long eflags;
82*4882a593Smuzhiyun 	long esp;
83*4882a593Smuzhiyun 	unsigned short ss, __ssh;
84*4882a593Smuzhiyun /*
85*4882a593Smuzhiyun  * these are specific to v86 mode:
86*4882a593Smuzhiyun  */
87*4882a593Smuzhiyun 	unsigned short es, __esh;
88*4882a593Smuzhiyun 	unsigned short ds, __dsh;
89*4882a593Smuzhiyun 	unsigned short fs, __fsh;
90*4882a593Smuzhiyun 	unsigned short gs, __gsh;
91*4882a593Smuzhiyun };
92*4882a593Smuzhiyun 
93*4882a593Smuzhiyun struct revectored_struct {
94*4882a593Smuzhiyun 	unsigned long __map[8];			/* 256 bits */
95*4882a593Smuzhiyun };
96*4882a593Smuzhiyun 
97*4882a593Smuzhiyun struct vm86_struct {
98*4882a593Smuzhiyun 	struct vm86_regs regs;
99*4882a593Smuzhiyun 	unsigned long flags;
100*4882a593Smuzhiyun 	unsigned long screen_bitmap;
101*4882a593Smuzhiyun 	unsigned long cpu_type;
102*4882a593Smuzhiyun 	struct revectored_struct int_revectored;
103*4882a593Smuzhiyun 	struct revectored_struct int21_revectored;
104*4882a593Smuzhiyun };
105*4882a593Smuzhiyun 
106*4882a593Smuzhiyun /*
107*4882a593Smuzhiyun  * flags masks
108*4882a593Smuzhiyun  */
109*4882a593Smuzhiyun #define VM86_SCREEN_BITMAP	0x0001
110*4882a593Smuzhiyun 
111*4882a593Smuzhiyun struct vm86plus_info_struct {
112*4882a593Smuzhiyun 	unsigned long force_return_for_pic:1;
113*4882a593Smuzhiyun 	unsigned long vm86dbg_active:1;       /* for debugger */
114*4882a593Smuzhiyun 	unsigned long vm86dbg_TFpendig:1;     /* for debugger */
115*4882a593Smuzhiyun 	unsigned long unused:28;
116*4882a593Smuzhiyun 	unsigned long is_vm86pus:1;	      /* for vm86 internal use */
117*4882a593Smuzhiyun 	unsigned char vm86dbg_intxxtab[32];   /* for debugger */
118*4882a593Smuzhiyun };
119*4882a593Smuzhiyun struct vm86plus_struct {
120*4882a593Smuzhiyun 	struct vm86_regs regs;
121*4882a593Smuzhiyun 	unsigned long flags;
122*4882a593Smuzhiyun 	unsigned long screen_bitmap;
123*4882a593Smuzhiyun 	unsigned long cpu_type;
124*4882a593Smuzhiyun 	struct revectored_struct int_revectored;
125*4882a593Smuzhiyun 	struct revectored_struct int21_revectored;
126*4882a593Smuzhiyun 	struct vm86plus_info_struct vm86plus;
127*4882a593Smuzhiyun };
128*4882a593Smuzhiyun 
129*4882a593Smuzhiyun 
130*4882a593Smuzhiyun #endif /* _UAPI_ASM_X86_VM86_H */
131