/* SPDX-License-Identifier: GPL-2.0 */ #ifndef _ASM_X86_VM86_H #define _ASM_X86_VM86_H #include <asm/ptrace.h> #include <uapi/asm/vm86.h> /* * This is the (kernel) stack-layout when we have done a "SAVE_ALL" from vm86 * mode - the main change is that the old segment descriptors aren't * useful any more and are forced to be zero by the kernel (and the * hardware when a trap occurs), and the real segment descriptors are * at the end of the structure. Look at ptrace.h to see the "normal" * setup. For user space layout see 'struct vm86_regs' above. */ struct kernel_vm86_regs { /* * normal regs, with special meaning for the segment descriptors.. */ struct pt_regs pt; /* * these are specific to v86 mode: */ unsigned short es, __esh; unsigned short ds, __dsh; unsigned short fs, __fsh; unsigned short gs, __gsh; }; struct vm86 { struct vm86plus_struct __user *user_vm86; struct pt_regs regs32; unsigned long veflags; unsigned long veflags_mask; unsigned long saved_sp0; unsigned long flags; unsigned long screen_bitmap; unsigned long cpu_type; struct revectored_struct int_revectored; struct revectored_struct int21_revectored; struct vm86plus_info_struct vm86plus; }; #ifdef CONFIG_VM86 void handle_vm86_fault(struct kernel_vm86_regs *, long); int handle_vm86_trap(struct kernel_vm86_regs *, long, int); void save_v86_state(struct kernel_vm86_regs *, int); struct task_struct; #define free_vm86(t) do { \ struct thread_struct *__t = (t); \ if (__t->vm86 != NULL) { \ kfree(__t->vm86); \ __t->vm86 = NULL; \ } \ } while (0) /* * Support for VM86 programs to request interrupts for * real mode hardware drivers: */ #define FIRST_VM86_IRQ 3 #define LAST_VM86_IRQ 15 static inline int invalid_vm86_irq(int irq) { return irq < FIRST_VM86_IRQ || irq > LAST_VM86_IRQ; } void release_vm86_irqs(struct task_struct *); #else #define handle_vm86_fault(a, b) #define release_vm86_irqs(a) static inline int handle_vm86_trap(struct kernel_vm86_regs *a, long b, int c) { return 0; } static inline void save_v86_state(struct kernel_vm86_regs *a, int b) { } #define free_vm86(t) do { } while(0) #endif /* CONFIG_VM86 */ #endif /* _ASM_X86_VM86_H */