Revision 8f186479 helper-i386.c

b/helper-i386.c
788 788
    sc->limit = 0xffff;
789 789
}
790 790

  
791
/* real mode iret */
792
void helper_iret_real(int shift)
793
{
794
    uint32_t sp, new_cs, new_eip, new_eflags, new_esp;
795
    uint8_t *ssp;
796
    int eflags_mask;
797
    
798
    sp = env->regs[R_ESP] & 0xffff;
799
    ssp = env->segs[R_SS].base + sp;
800
    if (shift == 1) {
801
        /* 32 bits */
802
        new_eflags = ldl(ssp + 8);
803
        new_cs = ldl(ssp + 4) & 0xffff;
804
        new_eip = ldl(ssp) & 0xffff;
805
    } else {
806
        /* 16 bits */
807
        new_eflags = lduw(ssp + 4);
808
        new_cs = lduw(ssp + 2);
809
        new_eip = lduw(ssp);
810
    }
811
    new_esp = sp + (6 << shift);
812
    env->regs[R_ESP] = (env->regs[R_ESP] & 0xffff0000) | 
813
        (new_esp & 0xffff);
814
    load_seg_vm(R_CS, new_cs);
815
    env->eip = new_eip;
816
    eflags_mask = FL_UPDATE_CPL0_MASK;
817
    if (shift == 0)
818
        eflags_mask &= 0xffff;
819
    load_eflags(new_eflags, eflags_mask);
820
}
821

  
791 822
/* protected mode iret */
792 823
void helper_iret_protected(int shift)
793 824
{

Also available in: Unified diff