788 |
sc->limit = 0xffff; |
sc->limit = 0xffff; |
789 |
} |
} |
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 |
|
|
822 |
/* protected mode iret */ |
/* protected mode iret */ |
823 |
void helper_iret_protected(int shift) |
void helper_iret_protected(int shift) |
824 |
{ |
{ |