Revision 53a5960a linux-user/vm86.c

b/linux-user/vm86.c
62 62
void save_v86_state(CPUX86State *env)
63 63
{
64 64
    TaskState *ts = env->opaque;
65
    struct target_vm86plus_struct * target_v86;
65 66

  
67
    lock_user_struct(target_v86, ts->target_v86, 0);
66 68
    /* put the VM86 registers in the userspace register structure */
67
    ts->target_v86->regs.eax = tswap32(env->regs[R_EAX]);
68
    ts->target_v86->regs.ebx = tswap32(env->regs[R_EBX]);
69
    ts->target_v86->regs.ecx = tswap32(env->regs[R_ECX]);
70
    ts->target_v86->regs.edx = tswap32(env->regs[R_EDX]);
71
    ts->target_v86->regs.esi = tswap32(env->regs[R_ESI]);
72
    ts->target_v86->regs.edi = tswap32(env->regs[R_EDI]);
73
    ts->target_v86->regs.ebp = tswap32(env->regs[R_EBP]);
74
    ts->target_v86->regs.esp = tswap32(env->regs[R_ESP]);
75
    ts->target_v86->regs.eip = tswap32(env->eip);
76
    ts->target_v86->regs.cs = tswap16(env->segs[R_CS].selector);
77
    ts->target_v86->regs.ss = tswap16(env->segs[R_SS].selector);
78
    ts->target_v86->regs.ds = tswap16(env->segs[R_DS].selector);
79
    ts->target_v86->regs.es = tswap16(env->segs[R_ES].selector);
80
    ts->target_v86->regs.fs = tswap16(env->segs[R_FS].selector);
81
    ts->target_v86->regs.gs = tswap16(env->segs[R_GS].selector);
69
    target_v86->regs.eax = tswap32(env->regs[R_EAX]);
70
    target_v86->regs.ebx = tswap32(env->regs[R_EBX]);
71
    target_v86->regs.ecx = tswap32(env->regs[R_ECX]);
72
    target_v86->regs.edx = tswap32(env->regs[R_EDX]);
73
    target_v86->regs.esi = tswap32(env->regs[R_ESI]);
74
    target_v86->regs.edi = tswap32(env->regs[R_EDI]);
75
    target_v86->regs.ebp = tswap32(env->regs[R_EBP]);
76
    target_v86->regs.esp = tswap32(env->regs[R_ESP]);
77
    target_v86->regs.eip = tswap32(env->eip);
78
    target_v86->regs.cs = tswap16(env->segs[R_CS].selector);
79
    target_v86->regs.ss = tswap16(env->segs[R_SS].selector);
80
    target_v86->regs.ds = tswap16(env->segs[R_DS].selector);
81
    target_v86->regs.es = tswap16(env->segs[R_ES].selector);
82
    target_v86->regs.fs = tswap16(env->segs[R_FS].selector);
83
    target_v86->regs.gs = tswap16(env->segs[R_GS].selector);
82 84
    set_flags(env->eflags, ts->v86flags, VIF_MASK | ts->v86mask);
83
    ts->target_v86->regs.eflags = tswap32(env->eflags);
85
    target_v86->regs.eflags = tswap32(env->eflags);
86
    unlock_user_struct(target_v86, ts->target_v86, 1);
84 87
#ifdef DEBUG_VM86
85 88
    fprintf(logfile, "save_v86_state: eflags=%08x cs:ip=%04x:%04x\n", 
86 89
            env->eflags, env->segs[R_CS].selector, env->eip);
......
378 381
    }
379 382
}
380 383

  
381
int do_vm86(CPUX86State *env, long subfunction, 
382
            struct target_vm86plus_struct * target_v86)
384
int do_vm86(CPUX86State *env, long subfunction, target_ulong vm86_addr)
383 385
{
384 386
    TaskState *ts = env->opaque;
387
    struct target_vm86plus_struct * target_v86;
385 388
    int ret;
386 389
    
387 390
    switch (subfunction) {
......
402 405
        goto out;
403 406
    }
404 407

  
405
    ts->target_v86 = target_v86;
406 408
    /* save current CPU regs */
407 409
    ts->vm86_saved_regs.eax = 0; /* default vm86 syscall return code */
408 410
    ts->vm86_saved_regs.ebx = env->regs[R_EBX];
......
421 423
    ts->vm86_saved_regs.fs = env->segs[R_FS].selector;
422 424
    ts->vm86_saved_regs.gs = env->segs[R_GS].selector;
423 425

  
426
    ts->target_v86 = vm86_addr;
427
    lock_user_struct(target_v86, vm86_addr, 1);
424 428
    /* build vm86 CPU state */
425 429
    ts->v86flags = tswap32(target_v86->regs.eflags);
426 430
    env->eflags = (env->eflags & ~SAFE_MASK) | 
......
465 469
    ts->vm86plus.vm86plus.flags = tswapl(target_v86->vm86plus.flags);
466 470
    memcpy(&ts->vm86plus.vm86plus.vm86dbg_intxxtab, 
467 471
           target_v86->vm86plus.vm86dbg_intxxtab, 32);
472
    unlock_user_struct(target_v86, vm86_addr, 0);
468 473
    
469 474
#ifdef DEBUG_VM86
470 475
    fprintf(logfile, "do_vm86: cs:ip=%04x:%04x\n", 

Also available in: Unified diff