Revision 0d1a29f9 target-i386/helper.c

b/target-i386/helper.c
109 109
{
110 110
    /* NOTE: the register at this point must be saved by hand because
111 111
       longjmp restore them */
112
#ifdef reg_EAX
113
    env->regs[R_EAX] = EAX;
114
#endif
115
#ifdef reg_ECX
116
    env->regs[R_ECX] = ECX;
117
#endif
118
#ifdef reg_EDX
119
    env->regs[R_EDX] = EDX;
120
#endif
121
#ifdef reg_EBX
122
    env->regs[R_EBX] = EBX;
123
#endif
124
#ifdef reg_ESP
125
    env->regs[R_ESP] = ESP;
126
#endif
127
#ifdef reg_EBP
128
    env->regs[R_EBP] = EBP;
129
#endif
130
#ifdef reg_ESI
131
    env->regs[R_ESI] = ESI;
132
#endif
133
#ifdef reg_EDI
134
    env->regs[R_EDI] = EDI;
135
#endif
112
    regs_to_env();
136 113
    longjmp(env->jmp_env, 1);
137 114
}
138 115

  
......
384 361
        /* 32 bit */
385 362
        stl_kernel(env->tr.base + 0x20, next_eip);
386 363
        stl_kernel(env->tr.base + 0x24, old_eflags);
387
        for(i = 0; i < 8; i++)
388
            stl_kernel(env->tr.base + (0x28 + i * 4), env->regs[i]);
364
        stl_kernel(env->tr.base + (0x28 + 0 * 4), EAX);
365
        stl_kernel(env->tr.base + (0x28 + 1 * 4), ECX);
366
        stl_kernel(env->tr.base + (0x28 + 2 * 4), EDX);
367
        stl_kernel(env->tr.base + (0x28 + 3 * 4), EBX);
368
        stl_kernel(env->tr.base + (0x28 + 4 * 4), ESP);
369
        stl_kernel(env->tr.base + (0x28 + 5 * 4), EBP);
370
        stl_kernel(env->tr.base + (0x28 + 6 * 4), ESI);
371
        stl_kernel(env->tr.base + (0x28 + 7 * 4), EDI);
389 372
        for(i = 0; i < 6; i++)
390 373
            stw_kernel(env->tr.base + (0x48 + i * 4), env->segs[i].selector);
391 374
    } else {
392 375
        /* 16 bit */
393 376
        stw_kernel(env->tr.base + 0x0e, next_eip);
394 377
        stw_kernel(env->tr.base + 0x10, old_eflags);
395
        for(i = 0; i < 8; i++)
396
            stw_kernel(env->tr.base + (0x12 + i * 2), env->regs[i]);
378
        stw_kernel(env->tr.base + (0x12 + 0 * 2), EAX);
379
        stw_kernel(env->tr.base + (0x12 + 1 * 2), ECX);
380
        stw_kernel(env->tr.base + (0x12 + 2 * 2), EDX);
381
        stw_kernel(env->tr.base + (0x12 + 3 * 2), EBX);
382
        stw_kernel(env->tr.base + (0x12 + 4 * 2), ESP);
383
        stw_kernel(env->tr.base + (0x12 + 5 * 2), EBP);
384
        stw_kernel(env->tr.base + (0x12 + 6 * 2), ESI);
385
        stw_kernel(env->tr.base + (0x12 + 7 * 2), EDI);
397 386
        for(i = 0; i < 4; i++)
398 387
            stw_kernel(env->tr.base + (0x22 + i * 4), env->segs[i].selector);
399 388
    }
......
437 426
    if (!(type & 8))
438 427
        eflags_mask &= 0xffff;
439 428
    load_eflags(new_eflags, eflags_mask);
440
    for(i = 0; i < 8; i++)
441
        env->regs[i] = new_regs[i];
429
    /* XXX: what to do in 16 bit case ? */
430
    EAX = new_regs[0];
431
    ECX = new_regs[1];
432
    EDX = new_regs[2];
433
    EBX = new_regs[3];
434
    ESP = new_regs[4];
435
    EBP = new_regs[5];
436
    ESI = new_regs[6];
437
    EDI = new_regs[7];
442 438
    if (new_eflags & VM_MASK) {
443 439
        for(i = 0; i < 6; i++) 
444 440
            load_seg_vm(i, new_segs[i]);
......
633 629
                mask = 0xffffffff;
634 630
            else
635 631
                mask = 0xffff;
636
            esp = (env->regs[R_ESP] - (2 << shift)) & mask;
632
            esp = (ESP - (2 << shift)) & mask;
637 633
            ssp = env->segs[R_SS].base + esp;
638 634
            if (shift)
639 635
                stl_kernel(ssp, error_code);
640 636
            else
641 637
                stw_kernel(ssp, error_code);
642
            env->regs[R_ESP] = (esp & mask) | (env->regs[R_ESP] & ~mask);
638
            ESP = (esp & mask) | (ESP & ~mask);
643 639
        }
644 640
        return;
645 641
    case 6: /* 286 interrupt gate */
......
868 864
            if (intno == 0x0e) {
869 865
                fprintf(logfile, " CR2=%08x", env->cr[2]);
870 866
            } else {
871
                fprintf(logfile, " EAX=%08x", env->regs[R_EAX]);
867
                fprintf(logfile, " EAX=%08x", EAX);
872 868
            }
873 869
            fprintf(logfile, "\n");
874 870
#if 0
......
911 907
    cpu_loop_exit();
912 908
}
913 909

  
910
/* same as raise_exception_err, but do not restore global registers */
911
static void raise_exception_err_norestore(int exception_index, int error_code)
912
{
913
    env->exception_index = exception_index;
914
    env->error_code = error_code;
915
    env->exception_is_int = 0;
916
    env->exception_next_eip = 0;
917
    longjmp(env->jmp_env, 1);
918
}
919

  
914 920
/* shortcuts to generate exceptions */
915 921

  
916 922
void (raise_exception_err)(int exception_index, int error_code)
......
2584 2590
                cpu_restore_state(tb, env, pc, NULL);
2585 2591
            }
2586 2592
        }
2587
        raise_exception_err(EXCP0E_PAGE, env->error_code);
2593
        if (retaddr)
2594
            raise_exception_err(EXCP0E_PAGE, env->error_code);
2595
        else
2596
            raise_exception_err_norestore(EXCP0E_PAGE, env->error_code);
2588 2597
    }
2589 2598
    env = saved_env;
2590 2599
}

Also available in: Unified diff