| /* 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 */ |