|
|
| version 1.24, 2011/12/29 13:32:12 | version 1.27, 2012/06/18 14:30:27 |
|---|---|
| Line 646 CALLfar_pm_call_gate_more_privilege(cons | Line 646 CALLfar_pm_call_gate_more_privilege(cons |
| } else { | } else { |
| stacksize += param_count * 2; | stacksize += param_count * 2; |
| } | } |
| cpu_stack_push_check(ss_sel.idx, &ss_sel.desc, new_esp, stacksize); | cpu_stack_push_check(ss_sel.idx, &ss_sel.desc, new_esp, stacksize, ss_sel.desc.d); |
| if (callgate_sel->desc.type == CPU_SYSDESC_TYPE_CALL_32) { | if (callgate_sel->desc.type == CPU_SYSDESC_TYPE_CALL_32) { |
| /* dump param */ | /* dump param */ |
| Line 973 RETfar_pm(UINT nbytes) | Line 973 RETfar_pm(UINT nbytes) |
| && (CPU_STAT_CPL > sdp->dpl)) { | && (CPU_STAT_CPL > sdp->dpl)) { |
| /* current segment descriptor is invalid */ | /* current segment descriptor is invalid */ |
| CPU_REGS_SREG(i) = 0; | CPU_REGS_SREG(i) = 0; |
| segdesc_clear(sdp); | memset(sdp, 0, sizeof(*sdp)); |
| continue; | continue; |
| } | } |
| Line 982 RETfar_pm(UINT nbytes) | Line 982 RETfar_pm(UINT nbytes) |
| if (rv < 0) { | if (rv < 0) { |
| /* segment register is invalid */ | /* segment register is invalid */ |
| CPU_REGS_SREG(i) = 0; | CPU_REGS_SREG(i) = 0; |
| segdesc_clear(sdp); | memset(sdp, 0, sizeof(*sdp)); |
| continue; | continue; |
| } | } |
| Line 999 RETfar_pm(UINT nbytes) | Line 999 RETfar_pm(UINT nbytes) |
| && (CPU_STAT_CPL > temp_sel.desc.dpl))) { | && (CPU_STAT_CPL > temp_sel.desc.dpl))) { |
| /* segment descriptor is invalid */ | /* segment descriptor is invalid */ |
| CPU_REGS_SREG(i) = 0; | CPU_REGS_SREG(i) = 0; |
| segdesc_clear(sdp); | memset(sdp, 0, sizeof(*sdp)); |
| } | } |
| } | } |
| } | } |
| Line 1334 IRET_pm_protected_mode_return_outer_priv | Line 1334 IRET_pm_protected_mode_return_outer_priv |
| && (sdp->dpl < CPU_STAT_CPL)) { | && (sdp->dpl < CPU_STAT_CPL)) { |
| /* segment register is invalid */ | /* segment register is invalid */ |
| CPU_REGS_SREG(i) = 0; | CPU_REGS_SREG(i) = 0; |
| segdesc_clear(sdp); | memset(sdp, 0, sizeof(*sdp)); |
| } | } |
| } | } |
| } | } |
| Line 1364 IRET_pm_return_to_vm86(UINT16 new_cs, UI | Line 1364 IRET_pm_return_to_vm86(UINT16 new_cs, UI |
| } | } |
| SS_POP_CHECK(sp, 36); | SS_POP_CHECK(sp, 36); |
| if (new_ip > 0xffff) { | |
| EXCEPTION(GP_EXCEPTION, 0); | |
| } | |
| new_sp = cpu_vmemoryread_d(CPU_SS_INDEX, sp + 12); | new_sp = cpu_vmemoryread_d(CPU_SS_INDEX, sp + 12); |
| segsel[CPU_SS_INDEX] = cpu_vmemoryread_w(CPU_SS_INDEX, sp + 16); | segsel[CPU_SS_INDEX] = cpu_vmemoryread_w(CPU_SS_INDEX, sp + 16); |
| segsel[CPU_ES_INDEX] = cpu_vmemoryread_w(CPU_SS_INDEX, sp + 20); | segsel[CPU_ES_INDEX] = cpu_vmemoryread_w(CPU_SS_INDEX, sp + 20); |
| Line 1381 IRET_pm_return_to_vm86(UINT16 new_cs, UI | Line 1377 IRET_pm_return_to_vm86(UINT16 new_cs, UI |
| } | } |
| CPU_ESP = new_sp; | CPU_ESP = new_sp; |
| CPU_EIP = new_ip; | CPU_EIP = new_ip & 0xffff; |
| /* to VM86 mode */ | /* to VM86 mode */ |
| set_eflags(new_flags, IOPL_FLAG|I_FLAG|VM_FLAG|RF_FLAG); | set_eflags(new_flags, IOPL_FLAG|I_FLAG|VM_FLAG|RF_FLAG); |