Annotation of Gnu-Mach/linux/src/include/asm-i386/vm86.h, revision 1.1.1.1

1.1       root        1: #ifndef _LINUX_VM86_H
                      2: #define _LINUX_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: #define TF_MASK                0x00000100
                     16: #define IF_MASK                0x00000200
                     17: #define IOPL_MASK      0x00003000
                     18: #define NT_MASK                0x00004000
                     19: #define VM_MASK                0x00020000
                     20: #define AC_MASK                0x00040000
                     21: #define VIF_MASK       0x00080000      /* virtual interrupt flag */
                     22: #define VIP_MASK       0x00100000      /* virtual interrupt pending */
                     23: #define ID_MASK                0x00200000
                     24: 
                     25: #define BIOSSEG                0x0f000
                     26: 
                     27: #define CPU_086                0
                     28: #define CPU_186                1
                     29: #define CPU_286                2
                     30: #define CPU_386                3
                     31: #define CPU_486                4
                     32: #define CPU_586                5
                     33: 
                     34: /*
                     35:  * Return values for the 'vm86()' system call
                     36:  */
                     37: #define VM86_TYPE(retval)      ((retval) & 0xff)
                     38: #define VM86_ARG(retval)       ((retval) >> 8)
                     39: 
                     40: #define VM86_SIGNAL    0       /* return due to signal */
                     41: #define VM86_UNKNOWN   1       /* unhandled GP fault - IO-instruction or similar */
                     42: #define VM86_INTx      2       /* int3/int x instruction (ARG = x) */
                     43: #define VM86_STI       3       /* sti/popf/iret instruction enabled virtual interrupts */
                     44: 
                     45: /*
                     46:  * Additional return values when invoking new vm86()
                     47:  */
                     48: #define VM86_PICRETURN 4       /* return due to pending PIC request */
                     49: #define VM86_TRAP      6       /* return due to DOS-debugger request */
                     50: 
                     51: /*
                     52:  * function codes when invoking new vm86()
                     53:  */
                     54: #define VM86_PLUS_INSTALL_CHECK        0
                     55: #define VM86_ENTER             1
                     56: #define VM86_ENTER_NO_BYPASS   2
                     57: #define        VM86_REQUEST_IRQ        3
                     58: #define VM86_FREE_IRQ          4
                     59: #define VM86_GET_IRQ_BITS      5
                     60: #define VM86_GET_AND_RESET_IRQ 6
                     61: 
                     62: /*
                     63:  * This is the stack-layout when we have done a "SAVE_ALL" from vm86
                     64:  * mode - the main change is that the old segment descriptors aren't
                     65:  * useful any more and are forced to be zero by the kernel (and the
                     66:  * hardware when a trap occurs), and the real segment descriptors are
                     67:  * at the end of the structure. Look at ptrace.h to see the "normal"
                     68:  * setup.
                     69:  */
                     70: 
                     71: struct vm86_regs {
                     72: /*
                     73:  * normal regs, with special meaning for the segment descriptors..
                     74:  */
                     75:        long ebx;
                     76:        long ecx;
                     77:        long edx;
                     78:        long esi;
                     79:        long edi;
                     80:        long ebp;
                     81:        long eax;
                     82:        long __null_ds;
                     83:        long __null_es;
                     84:        long __null_fs;
                     85:        long __null_gs;
                     86:        long orig_eax;
                     87:        long eip;
                     88:        unsigned short cs, __csh;
                     89:        long eflags;
                     90:        long esp;
                     91:        unsigned short ss, __ssh;
                     92: /*
                     93:  * these are specific to v86 mode:
                     94:  */
                     95:        unsigned short es, __esh;
                     96:        unsigned short ds, __dsh;
                     97:        unsigned short fs, __fsh;
                     98:        unsigned short gs, __gsh;
                     99: };
                    100: 
                    101: struct revectored_struct {
                    102:        unsigned long __map[8];                 /* 256 bits */
                    103: };
                    104: 
                    105: struct vm86_struct {
                    106:        struct vm86_regs regs;
                    107:        unsigned long flags;
                    108:        unsigned long screen_bitmap;
                    109:        unsigned long cpu_type;
                    110:        struct revectored_struct int_revectored;
                    111:        struct revectored_struct int21_revectored;
                    112: };
                    113: 
                    114: /*
                    115:  * flags masks
                    116:  */
                    117: #define VM86_SCREEN_BITMAP     0x0001
                    118: 
                    119: struct vm86plus_info_struct {
                    120:        unsigned long force_return_for_pic:1;
                    121:        unsigned long vm86dbg_active:1;       /* for debugger */
                    122:        unsigned long vm86dbg_TFpendig:1;     /* for debugger */
                    123:        unsigned long unused:28;
                    124:        unsigned long is_vm86pus:1;           /* for vm86 internal use */
                    125:        unsigned char vm86dbg_intxxtab[32];   /* for debugger */
                    126: };
                    127: 
                    128: struct vm86plus_struct {
                    129:        struct vm86_regs regs;
                    130:        unsigned long flags;
                    131:        unsigned long screen_bitmap;
                    132:        unsigned long cpu_type;
                    133:        struct revectored_struct int_revectored;
                    134:        struct revectored_struct int21_revectored;
                    135:        struct vm86plus_info_struct vm86plus;
                    136: };
                    137: 
                    138: #ifdef __KERNEL__
                    139: 
                    140: struct kernel_vm86_struct {
                    141:        struct vm86_regs regs;
                    142: /*
                    143:  * the below part remains on the kernel stack while we are in VM86 mode.
                    144:  * 'tss.esp0' then contains the address of VM86_TSS_ESP0 below, and when we
                    145:  * get forced back from VM86, the CPU and "SAVE_ALL" will restore the above
                    146:  * 'struct kernel_vm86_regs' with the then actual values.
                    147:  * Therefore, pt_regs in fact points to a complete 'kernel_vm86_struct'
                    148:  * in kernelspace, hence we need not reget the data from userspace.
                    149:  */
                    150: #define VM86_TSS_ESP0 flags
                    151:        unsigned long flags;
                    152:        unsigned long screen_bitmap;
                    153:        unsigned long cpu_type;
                    154:        struct revectored_struct int_revectored;
                    155:        struct revectored_struct int21_revectored;
                    156:        struct vm86plus_info_struct vm86plus;
                    157:        struct pt_regs *regs32;   /* here we save the pointer to the old regs */
                    158: /*
                    159:  * The below is not part of the structure, but the stack layout continues
                    160:  * this way. In front of 'return-eip' may be some data, depending on
                    161:  * compilation, so we don't rely on this and save the pointer to 'oldregs'
                    162:  * in 'regs32' above.
                    163:  * However, with GCC-2.7.2 and the current CFLAGS you see exactly this:
                    164: 
                    165:        long return-eip;        from call to vm86()
                    166:        struct pt_regs oldregs;  user space registers as saved by syscall
                    167:  */
                    168: };
                    169: 
                    170: void handle_vm86_fault(struct vm86_regs *, long);
                    171: int handle_vm86_trap(struct vm86_regs *, long, int);
                    172: 
                    173: #endif /* __KERNEL__ */
                    174: 
                    175: #endif

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.