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