| version 1.18, 2005/03/12 12:32:54 | version 1.19, 2008/01/25 17:49:46 | 
| Line 1149  IRET_pm_protected_mode_return_same_privi | Line 1149  IRET_pm_protected_mode_return_same_privi | 
 | { | { | 
 | UINT32 mask; | UINT32 mask; | 
 | UINT stacksize; | UINT stacksize; | 
 | #if defined(IA32_DONT_USE_SET_EFLAGS_FUNCTION) |  | 
 | UINT32 old_flags = CPU_EFLAG; |  | 
 | #endif |  | 
 |  |  | 
 | VERBOSE(("IRET_pm: RETURN-TO-SAME-PRIVILEGE-LEVEL")); | VERBOSE(("IRET_pm: RETURN-TO-SAME-PRIVILEGE-LEVEL")); | 
 |  |  | 
| Line 1161  IRET_pm_protected_mode_return_same_privi | Line 1158  IRET_pm_protected_mode_return_same_privi | 
 | EXCEPTION(GP_EXCEPTION, 0); | EXCEPTION(GP_EXCEPTION, 0); | 
 | } | } | 
 |  |  | 
 | #if defined(IA32_DONT_USE_SET_EFLAGS_FUNCTION) |  | 
 | mask = ALL_EFLAG; |  | 
 | if (CPU_STAT_CPL > CPU_STAT_IOPL) |  | 
 | mask &= ~I_FLAG; |  | 
 | if (CPU_STAT_CPL > 0) { |  | 
 | mask &= ~IOPL_FLAG; |  | 
 | if (CPU_INST_OP32) { |  | 
 | mask &= ~(VM_FLAG|VIF_FLAG|VIP_FLAG); |  | 
 | } |  | 
 | } |  | 
 | #else |  | 
 | mask = 0; | mask = 0; | 
 | if (CPU_INST_OP32) | if (CPU_INST_OP32) | 
 | mask |= RF_FLAG; | mask |= RF_FLAG; | 
| Line 1183  IRET_pm_protected_mode_return_same_privi | Line 1169  IRET_pm_protected_mode_return_same_privi | 
 | mask |= VM_FLAG|VIF_FLAG|VIP_FLAG; | mask |= VM_FLAG|VIF_FLAG|VIP_FLAG; | 
 | } | } | 
 | } | } | 
 | #endif |  | 
 |  |  | 
 | if (CPU_INST_OP32) { | if (CPU_INST_OP32) { | 
 | stacksize = 12; | stacksize = 12; | 
| Line 1195  IRET_pm_protected_mode_return_same_privi | Line 1180  IRET_pm_protected_mode_return_same_privi | 
 | load_cs(cs_sel->selector, &cs_sel->desc, CPU_STAT_CPL); | load_cs(cs_sel->selector, &cs_sel->desc, CPU_STAT_CPL); | 
 | SET_EIP(new_ip); | SET_EIP(new_ip); | 
 |  |  | 
 | #if defined(IA32_DONT_USE_SET_EFLAGS_FUNCTION) |  | 
 | CPU_EFLAG = (new_flags & mask) | (CPU_EFLAG & ~mask); |  | 
 | CPU_OV = CPU_FLAG & O_FLAG; |  | 
 | CPU_TRAP = (CPU_FLAG & (I_FLAG|T_FLAG)) == (I_FLAG|T_FLAG); |  | 
 | if ((old_flags ^ CPU_EFLAG) & VM_FLAG) { |  | 
 | if (CPU_EFLAG & VM_FLAG) { |  | 
 | change_vm(1); |  | 
 | } else { |  | 
 | change_vm(0); |  | 
 | } |  | 
 | } |  | 
 | #else |  | 
 | set_eflags(new_flags, mask); | set_eflags(new_flags, mask); | 
 | #endif |  | 
 |  |  | 
 | if (CPU_STAT_SS32) { | if (CPU_STAT_SS32) { | 
 | CPU_ESP += stacksize; | CPU_ESP += stacksize; | 
| Line 1231  IRET_pm_protected_mode_return_outer_priv | Line 1203  IRET_pm_protected_mode_return_outer_priv | 
 | UINT16 new_ss; | UINT16 new_ss; | 
 | int rv; | int rv; | 
 | int i; | int i; | 
 | #if defined(IA32_DONT_USE_SET_EFLAGS_FUNCTION) |  | 
 | UINT32 old_flags = CPU_EFLAG; |  | 
 | #endif |  | 
 |  |  | 
 | VERBOSE(("IRET_pm: RETURN-OUTER-PRIVILEGE-LEVEL")); | VERBOSE(("IRET_pm: RETURN-OUTER-PRIVILEGE-LEVEL")); | 
 |  |  | 
| Line 1295  IRET_pm_protected_mode_return_outer_priv | Line 1264  IRET_pm_protected_mode_return_outer_priv | 
 | EXCEPTION(GP_EXCEPTION, 0); | EXCEPTION(GP_EXCEPTION, 0); | 
 | } | } | 
 |  |  | 
 | #if defined(IA32_DONT_USE_SET_EFLAGS_FUNCTION) |  | 
 | mask = ALL_EFLAG; |  | 
 | if (CPU_STAT_CPL > CPU_STAT_IOPL) |  | 
 | mask &= ~I_FLAG; |  | 
 | if (CPU_STAT_CPL > 0) { |  | 
 | mask &= ~IOPL_FLAG; |  | 
 | if (CPU_INST_OP32) { |  | 
 | mask &= ~(VM_FLAG|VIF_FLAG|VIP_FLAG); |  | 
 | } |  | 
 | } |  | 
 | #else |  | 
 | mask = 0; | mask = 0; | 
 | if (CPU_INST_OP32) | if (CPU_INST_OP32) | 
 | mask |= RF_FLAG; | mask |= RF_FLAG; | 
| Line 1317  IRET_pm_protected_mode_return_outer_priv | Line 1275  IRET_pm_protected_mode_return_outer_priv | 
 | mask |= VM_FLAG|VIF_FLAG|VIP_FLAG; | mask |= VM_FLAG|VIF_FLAG|VIP_FLAG; | 
 | } | } | 
 | } | } | 
 | #endif |  | 
 |  |  | 
 | /* set new register */ | /* set new register */ | 
 | load_cs(cs_sel->selector, &cs_sel->desc, cs_sel->rpl); | load_cs(cs_sel->selector, &cs_sel->desc, cs_sel->rpl); | 
 | SET_EIP(new_ip); | SET_EIP(new_ip); | 
 |  |  | 
 | #if defined(IA32_DONT_USE_SET_EFLAGS_FUNCTION) |  | 
 | CPU_EFLAG = (new_flags & mask) | (CPU_EFLAG & ~mask); |  | 
 | CPU_OV = CPU_FLAG & O_FLAG; |  | 
 | CPU_TRAP = (CPU_FLAG & (I_FLAG|T_FLAG)) == (I_FLAG|T_FLAG); |  | 
 | if ((old_flags ^ CPU_EFLAG) & VM_FLAG) { |  | 
 | if (CPU_EFLAG & VM_FLAG) { |  | 
 | change_vm(1); |  | 
 | } else { |  | 
 | change_vm(0); |  | 
 | } |  | 
 | } |  | 
 | #else |  | 
 | set_eflags(new_flags, mask); | set_eflags(new_flags, mask); | 
 | #endif |  | 
 |  |  | 
 | load_ss(ss_sel.selector, &ss_sel.desc, cs_sel->rpl); | load_ss(ss_sel.selector, &ss_sel.desc, cs_sel->rpl); | 
 | if (CPU_STAT_SS32) { | if (CPU_STAT_SS32) { | 
| Line 1369  IRET_pm_return_to_vm86(UINT16 new_cs, UI | Line 1313  IRET_pm_return_to_vm86(UINT16 new_cs, UI | 
 | UINT32 sp; | UINT32 sp; | 
 | UINT32 new_sp; | UINT32 new_sp; | 
 | int i; | int i; | 
 | #if defined(IA32_DONT_USE_SET_EFLAGS_FUNCTION) |  | 
 | UINT32 old_flags = CPU_EFLAG; |  | 
 | #endif |  | 
 |  |  | 
 | VERBOSE(("IRET_pm: Interrupt procedure was in virtual-8086 mode: PE=1, VM=1 in flags image")); | VERBOSE(("IRET_pm: Interrupt procedure was in virtual-8086 mode: PE=1, VM=1 in flags image")); | 
 |  |  | 
| Line 1403  IRET_pm_return_to_vm86(UINT16 new_cs, UI | Line 1344  IRET_pm_return_to_vm86(UINT16 new_cs, UI | 
 | } | } | 
 |  |  | 
 | /* to VM86 mode */ | /* to VM86 mode */ | 
 | #if defined(IA32_DONT_USE_SET_EFLAGS_FUNCTION) |  | 
 | CPU_EFLAG = new_flags; |  | 
 | CPU_OV = CPU_FLAG & O_FLAG; |  | 
 | CPU_TRAP = (CPU_FLAG & (I_FLAG|T_FLAG)) == (I_FLAG|T_FLAG); |  | 
 | if ((old_flags ^ CPU_EFLAG) & VM_FLAG) { |  | 
 | if (CPU_EFLAG & VM_FLAG) { |  | 
 | change_vm(1); |  | 
 | } else { |  | 
 | change_vm(0); |  | 
 | } |  | 
 | } |  | 
 | #else |  | 
 | set_eflags(new_flags, IOPL_FLAG|I_FLAG|VM_FLAG|RF_FLAG); | set_eflags(new_flags, IOPL_FLAG|I_FLAG|VM_FLAG|RF_FLAG); | 
 | #endif |  | 
 |  |  | 
 | new_sp &= 0xffff; | new_sp &= 0xffff; | 
 | new_ip &= 0xffff; | new_ip &= 0xffff; | 
| Line 1448  IRET_pm_return_from_vm86(UINT16 new_cs, | Line 1376  IRET_pm_return_from_vm86(UINT16 new_cs, | 
 | CPU_SP += (UINT16)stacksize; | CPU_SP += (UINT16)stacksize; | 
 | } | } | 
 |  |  | 
 | #if defined(IA32_DONT_USE_SET_EFLAGS_FUNCTION) |  | 
 | CPU_EFLAG = (new_flags & ~(IOPL_FLAG|VM_FLAG|VIF_FLAG|VIP_FLAG)) | (CPU_EFLAG & (IOPL_FLAG|VM_FLAG|VIF_FLAG|VIP_FLAG)); |  | 
 | CPU_OV = CPU_FLAG & O_FLAG; |  | 
 | CPU_TRAP = (CPU_FLAG & (I_FLAG|T_FLAG)) == (I_FLAG|T_FLAG); |  | 
 | #else |  | 
 | set_eflags(new_flags, I_FLAG|RF_FLAG); | set_eflags(new_flags, I_FLAG|RF_FLAG); | 
 | #endif |  | 
 |  |  | 
 | CPU_SET_SEGREG(CPU_CS_INDEX, new_cs); | CPU_SET_SEGREG(CPU_CS_INDEX, new_cs); | 
 | SET_EIP(new_ip); | SET_EIP(new_ip); |