162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
262306a36Sopenharmony_ci#ifndef _UAPI_ASM_X86_VM86_H
362306a36Sopenharmony_ci#define _UAPI_ASM_X86_VM86_H
462306a36Sopenharmony_ci
562306a36Sopenharmony_ci/*
662306a36Sopenharmony_ci * I'm guessing at the VIF/VIP flag usage, but hope that this is how
762306a36Sopenharmony_ci * the Pentium uses them. Linux will return from vm86 mode when both
862306a36Sopenharmony_ci * VIF and VIP is set.
962306a36Sopenharmony_ci *
1062306a36Sopenharmony_ci * On a Pentium, we could probably optimize the virtual flags directly
1162306a36Sopenharmony_ci * in the eflags register instead of doing it "by hand" in vflags...
1262306a36Sopenharmony_ci *
1362306a36Sopenharmony_ci * Linus
1462306a36Sopenharmony_ci */
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_ci#include <asm/processor-flags.h>
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_ci#define BIOSSEG		0x0f000
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ci#define CPU_086		0
2162306a36Sopenharmony_ci#define CPU_186		1
2262306a36Sopenharmony_ci#define CPU_286		2
2362306a36Sopenharmony_ci#define CPU_386		3
2462306a36Sopenharmony_ci#define CPU_486		4
2562306a36Sopenharmony_ci#define CPU_586		5
2662306a36Sopenharmony_ci
2762306a36Sopenharmony_ci/*
2862306a36Sopenharmony_ci * Return values for the 'vm86()' system call
2962306a36Sopenharmony_ci */
3062306a36Sopenharmony_ci#define VM86_TYPE(retval)	((retval) & 0xff)
3162306a36Sopenharmony_ci#define VM86_ARG(retval)	((retval) >> 8)
3262306a36Sopenharmony_ci
3362306a36Sopenharmony_ci#define VM86_SIGNAL	0	/* return due to signal */
3462306a36Sopenharmony_ci#define VM86_UNKNOWN	1	/* unhandled GP fault
3562306a36Sopenharmony_ci				   - IO-instruction or similar */
3662306a36Sopenharmony_ci#define VM86_INTx	2	/* int3/int x instruction (ARG = x) */
3762306a36Sopenharmony_ci#define VM86_STI	3	/* sti/popf/iret instruction enabled
3862306a36Sopenharmony_ci				   virtual interrupts */
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_ci/*
4162306a36Sopenharmony_ci * Additional return values when invoking new vm86()
4262306a36Sopenharmony_ci */
4362306a36Sopenharmony_ci#define VM86_PICRETURN	4	/* return due to pending PIC request */
4462306a36Sopenharmony_ci#define VM86_TRAP	6	/* return due to DOS-debugger request */
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_ci/*
4762306a36Sopenharmony_ci * function codes when invoking new vm86()
4862306a36Sopenharmony_ci */
4962306a36Sopenharmony_ci#define VM86_PLUS_INSTALL_CHECK	0
5062306a36Sopenharmony_ci#define VM86_ENTER		1
5162306a36Sopenharmony_ci#define VM86_ENTER_NO_BYPASS	2
5262306a36Sopenharmony_ci#define	VM86_REQUEST_IRQ	3
5362306a36Sopenharmony_ci#define VM86_FREE_IRQ		4
5462306a36Sopenharmony_ci#define VM86_GET_IRQ_BITS	5
5562306a36Sopenharmony_ci#define VM86_GET_AND_RESET_IRQ	6
5662306a36Sopenharmony_ci
5762306a36Sopenharmony_ci/*
5862306a36Sopenharmony_ci * This is the stack-layout seen by the user space program when we have
5962306a36Sopenharmony_ci * done a translation of "SAVE_ALL" from vm86 mode. The real kernel layout
6062306a36Sopenharmony_ci * is 'kernel_vm86_regs' (see below).
6162306a36Sopenharmony_ci */
6262306a36Sopenharmony_ci
6362306a36Sopenharmony_cistruct vm86_regs {
6462306a36Sopenharmony_ci/*
6562306a36Sopenharmony_ci * normal regs, with special meaning for the segment descriptors..
6662306a36Sopenharmony_ci */
6762306a36Sopenharmony_ci	long ebx;
6862306a36Sopenharmony_ci	long ecx;
6962306a36Sopenharmony_ci	long edx;
7062306a36Sopenharmony_ci	long esi;
7162306a36Sopenharmony_ci	long edi;
7262306a36Sopenharmony_ci	long ebp;
7362306a36Sopenharmony_ci	long eax;
7462306a36Sopenharmony_ci	long __null_ds;
7562306a36Sopenharmony_ci	long __null_es;
7662306a36Sopenharmony_ci	long __null_fs;
7762306a36Sopenharmony_ci	long __null_gs;
7862306a36Sopenharmony_ci	long orig_eax;
7962306a36Sopenharmony_ci	long eip;
8062306a36Sopenharmony_ci	unsigned short cs, __csh;
8162306a36Sopenharmony_ci	long eflags;
8262306a36Sopenharmony_ci	long esp;
8362306a36Sopenharmony_ci	unsigned short ss, __ssh;
8462306a36Sopenharmony_ci/*
8562306a36Sopenharmony_ci * these are specific to v86 mode:
8662306a36Sopenharmony_ci */
8762306a36Sopenharmony_ci	unsigned short es, __esh;
8862306a36Sopenharmony_ci	unsigned short ds, __dsh;
8962306a36Sopenharmony_ci	unsigned short fs, __fsh;
9062306a36Sopenharmony_ci	unsigned short gs, __gsh;
9162306a36Sopenharmony_ci};
9262306a36Sopenharmony_ci
9362306a36Sopenharmony_cistruct revectored_struct {
9462306a36Sopenharmony_ci	unsigned long __map[8];			/* 256 bits */
9562306a36Sopenharmony_ci};
9662306a36Sopenharmony_ci
9762306a36Sopenharmony_cistruct vm86_struct {
9862306a36Sopenharmony_ci	struct vm86_regs regs;
9962306a36Sopenharmony_ci	unsigned long flags;
10062306a36Sopenharmony_ci	unsigned long screen_bitmap;		/* unused, preserved by vm86() */
10162306a36Sopenharmony_ci	unsigned long cpu_type;
10262306a36Sopenharmony_ci	struct revectored_struct int_revectored;
10362306a36Sopenharmony_ci	struct revectored_struct int21_revectored;
10462306a36Sopenharmony_ci};
10562306a36Sopenharmony_ci
10662306a36Sopenharmony_ci/*
10762306a36Sopenharmony_ci * flags masks
10862306a36Sopenharmony_ci */
10962306a36Sopenharmony_ci#define VM86_SCREEN_BITMAP	0x0001        /* no longer supported */
11062306a36Sopenharmony_ci
11162306a36Sopenharmony_cistruct vm86plus_info_struct {
11262306a36Sopenharmony_ci	unsigned long force_return_for_pic:1;
11362306a36Sopenharmony_ci	unsigned long vm86dbg_active:1;       /* for debugger */
11462306a36Sopenharmony_ci	unsigned long vm86dbg_TFpendig:1;     /* for debugger */
11562306a36Sopenharmony_ci	unsigned long unused:28;
11662306a36Sopenharmony_ci	unsigned long is_vm86pus:1;	      /* for vm86 internal use */
11762306a36Sopenharmony_ci	unsigned char vm86dbg_intxxtab[32];   /* for debugger */
11862306a36Sopenharmony_ci};
11962306a36Sopenharmony_cistruct vm86plus_struct {
12062306a36Sopenharmony_ci	struct vm86_regs regs;
12162306a36Sopenharmony_ci	unsigned long flags;
12262306a36Sopenharmony_ci	unsigned long screen_bitmap;
12362306a36Sopenharmony_ci	unsigned long cpu_type;
12462306a36Sopenharmony_ci	struct revectored_struct int_revectored;
12562306a36Sopenharmony_ci	struct revectored_struct int21_revectored;
12662306a36Sopenharmony_ci	struct vm86plus_info_struct vm86plus;
12762306a36Sopenharmony_ci};
12862306a36Sopenharmony_ci
12962306a36Sopenharmony_ci
13062306a36Sopenharmony_ci#endif /* _UAPI_ASM_X86_VM86_H */
131