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