11965aae3SH. Peter Anvin #ifndef _ASM_X86_VM86_H 21965aae3SH. Peter Anvin #define _ASM_X86_VM86_H 3bb898558SAl Viro 4bb898558SAl Viro #include <asm/ptrace.h> 5af170c50SDavid Howells #include <uapi/asm/vm86.h> 6bb898558SAl Viro 7bb898558SAl Viro /* 8bb898558SAl Viro * This is the (kernel) stack-layout when we have done a "SAVE_ALL" from vm86 9bb898558SAl Viro * mode - the main change is that the old segment descriptors aren't 10bb898558SAl Viro * useful any more and are forced to be zero by the kernel (and the 11bb898558SAl Viro * hardware when a trap occurs), and the real segment descriptors are 12bb898558SAl Viro * at the end of the structure. Look at ptrace.h to see the "normal" 13bb898558SAl Viro * setup. For user space layout see 'struct vm86_regs' above. 14bb898558SAl Viro */ 15bb898558SAl Viro 16bb898558SAl Viro struct kernel_vm86_regs { 17bb898558SAl Viro /* 18bb898558SAl Viro * normal regs, with special meaning for the segment descriptors.. 19bb898558SAl Viro */ 20bb898558SAl Viro struct pt_regs pt; 21bb898558SAl Viro /* 22bb898558SAl Viro * these are specific to v86 mode: 23bb898558SAl Viro */ 24bb898558SAl Viro unsigned short es, __esh; 25bb898558SAl Viro unsigned short ds, __dsh; 26bb898558SAl Viro unsigned short fs, __fsh; 27bb898558SAl Viro unsigned short gs, __gsh; 28bb898558SAl Viro }; 29bb898558SAl Viro 309fda6a06SBrian Gerst struct vm86 { 319fda6a06SBrian Gerst struct vm86plus_struct __user *vm86_info; 32*5ed92a8aSBrian Gerst struct pt_regs regs32; 339fda6a06SBrian Gerst unsigned long v86flags; 349fda6a06SBrian Gerst unsigned long v86mask; 359fda6a06SBrian Gerst unsigned long saved_sp0; 36d4ce0f26SBrian Gerst 37d4ce0f26SBrian Gerst unsigned long flags; 38d4ce0f26SBrian Gerst unsigned long screen_bitmap; 39d4ce0f26SBrian Gerst unsigned long cpu_type; 40d4ce0f26SBrian Gerst struct revectored_struct int_revectored; 41d4ce0f26SBrian Gerst struct revectored_struct int21_revectored; 42d4ce0f26SBrian Gerst struct vm86plus_info_struct vm86plus; 439fda6a06SBrian Gerst }; 449fda6a06SBrian Gerst 45bb898558SAl Viro #ifdef CONFIG_VM86 46bb898558SAl Viro 47bb898558SAl Viro void handle_vm86_fault(struct kernel_vm86_regs *, long); 48bb898558SAl Viro int handle_vm86_trap(struct kernel_vm86_regs *, long, int); 49*5ed92a8aSBrian Gerst void save_v86_state(struct kernel_vm86_regs *, int); 50bb898558SAl Viro 51bb898558SAl Viro struct task_struct; 52bb898558SAl Viro void release_vm86_irqs(struct task_struct *); 53bb898558SAl Viro 549fda6a06SBrian Gerst #define free_vm86(t) do { \ 559fda6a06SBrian Gerst struct thread_struct *__t = (t); \ 569fda6a06SBrian Gerst if (__t->vm86 != NULL) { \ 579fda6a06SBrian Gerst kfree(__t->vm86); \ 589fda6a06SBrian Gerst __t->vm86 = NULL; \ 599fda6a06SBrian Gerst } \ 609fda6a06SBrian Gerst } while (0) 619fda6a06SBrian Gerst 62bb898558SAl Viro #else 63bb898558SAl Viro 64bb898558SAl Viro #define handle_vm86_fault(a, b) 65bb898558SAl Viro #define release_vm86_irqs(a) 66bb898558SAl Viro 67bb898558SAl Viro static inline int handle_vm86_trap(struct kernel_vm86_regs *a, long b, int c) 68bb898558SAl Viro { 69bb898558SAl Viro return 0; 70bb898558SAl Viro } 71bb898558SAl Viro 72*5ed92a8aSBrian Gerst static inline void save_v86_state(struct kernel_vm86_regs *a, int b) { } 73*5ed92a8aSBrian Gerst 749fda6a06SBrian Gerst #define free_vm86(t) do { } while(0) 759fda6a06SBrian Gerst 76bb898558SAl Viro #endif /* CONFIG_VM86 */ 77bb898558SAl Viro 781965aae3SH. Peter Anvin #endif /* _ASM_X86_VM86_H */ 79