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