vm86
struct vm86;
struct vm86 *vm86;
if (__t->vm86 != NULL) { \
kfree(__t->vm86); \
__t->vm86 = NULL; \
dst->thread.vm86 = NULL;
struct vm86 *vm86 = current->thread.vm86;
BUG_ON(!vm86);
set_flags(regs->pt.flags, VEFLAGS, X86_EFLAGS_VIF | vm86->veflags_mask);
user = vm86->user_vm86;
if (!user_access_begin(user, vm86->vm86plus.is_vm86pus ?
tsk->thread.sp0 = vm86->saved_sp0;
vm86->saved_sp0 = 0;
memcpy(®s->pt, &vm86->regs32, sizeof(struct pt_regs));
loadsegment(gs, vm86->regs32.gs);
SYSCALL_DEFINE2(vm86, unsigned long, cmd, unsigned long, arg)
struct vm86 *vm86 = tsk->thread.vm86;
if (!vm86) {
if (!(vm86 = kzalloc_obj(*vm86)))
tsk->thread.vm86 = vm86;
if (vm86->saved_sp0)
vm86->flags = v.flags;
vm86->cpu_type = v.cpu_type;
if (copy_from_user(&vm86->int_revectored,
if (copy_from_user(&vm86->int21_revectored,
if (copy_from_user(&vm86->vm86plus, &user_vm86->vm86plus,
vm86->vm86plus.is_vm86pus = 1;
memset(&vm86->vm86plus, 0,
memcpy(&vm86->regs32, regs, sizeof(struct pt_regs));
vm86->user_vm86 = user_vm86;
switch (vm86->cpu_type) {
vm86->veflags_mask = 0;
vm86->veflags_mask = X86_EFLAGS_NT | X86_EFLAGS_IOPL;
vm86->veflags_mask = X86_EFLAGS_AC | X86_EFLAGS_NT | X86_EFLAGS_IOPL;
vm86->veflags_mask = X86_EFLAGS_ID | X86_EFLAGS_AC | X86_EFLAGS_NT | X86_EFLAGS_IOPL;
vm86->saved_sp0 = tsk->thread.sp0;
savesegment(gs, vm86->regs32.gs);
set_flags(VEFLAGS, flags, current->thread.vm86->veflags_mask);
set_flags(VFLAGS, flags, current->thread.vm86->veflags_mask);
return flags | (VEFLAGS & current->thread.vm86->veflags_mask);
struct vm86 *vm86 = current->thread.vm86;
if (is_revectored(i, &vm86->int_revectored))
if (i == 0x21 && is_revectored(AH(regs), &vm86->int21_revectored))
struct vm86 *vm86 = current->thread.vm86;
if (vm86->vm86plus.is_vm86pus) {
struct vm86plus_info_struct *vmpi = ¤t->thread.vm86->vm86plus;
#define VFLAGS (*(unsigned short *)&(current->thread.vm86->veflags))
#define VEFLAGS (current->thread.vm86->veflags)
COND_SYSCALL(vm86);
ret = vm86(VM86_ENTER, v86);
void do_umip_tests(struct vm86plus_struct *vm86, unsigned char *test_mem)
do_test(vm86, vmcode_umip - vmcode, VM86_TRAP, 3, "UMIP tests");
do_test(vm86, vmcode_umip_str - vmcode, VM86_SIGNAL, 0,
do_test(vm86, vmcode_umip_sldt - vmcode, VM86_SIGNAL, 0,