--- np2/i386c/ia32/ctrlxfer.c 2004/03/12 13:34:08 1.16 +++ np2/i386c/ia32/ctrlxfer.c 2008/01/25 17:49:46 1.19 @@ -1,4 +1,4 @@ -/* $Id: ctrlxfer.c,v 1.16 2004/03/12 13:34:08 monaka Exp $ */ +/* $Id: ctrlxfer.c,v 1.19 2008/01/25 17:49:46 monaka Exp $ */ /* * Copyright (c) 2003 NONAKA Kimihiro @@ -12,8 +12,6 @@ * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES @@ -37,8 +35,8 @@ /*------------------------------------------------------------------------------ * JMPfar_pm */ -static void JMPfar_pm_code_segment(selector_t *cs_sel, UINT32 new_ip); -static void JMPfar_pm_call_gate(selector_t *callgate_sel); +static void JMPfar_pm_code_segment(const selector_t *cs_sel, UINT32 new_ip); +static void JMPfar_pm_call_gate(const selector_t *callgate_sel); static void JMPfar_pm_task_gate(selector_t *taskgate_sel); static void JMPfar_pm_tss(selector_t *tss_sel); @@ -106,7 +104,7 @@ JMPfar_pm(UINT16 selector, UINT32 new_ip * JMPfar: code segment */ static void -JMPfar_pm_code_segment(selector_t *cs_sel, UINT32 new_ip) +JMPfar_pm_code_segment(const selector_t *cs_sel, UINT32 new_ip) { VERBOSE(("JMPfar_pm: CODE-SEGMENT")); @@ -152,7 +150,7 @@ JMPfar_pm_code_segment(selector_t *cs_se * JMPfar: call gate */ static void -JMPfar_pm_call_gate(selector_t *callgate_sel) +JMPfar_pm_call_gate(const selector_t *callgate_sel) { selector_t cs_sel; int rv; @@ -318,8 +316,8 @@ JMPfar_pm_tss(selector_t *tss_sel) /*------------------------------------------------------------------------------ * CALLfar_pm */ -static void CALLfar_pm_code_segment(selector_t *cs_sel, UINT32 new_ip); -static void CALLfar_pm_call_gate(selector_t *callgate_sel); +static void CALLfar_pm_code_segment(const selector_t *cs_sel, UINT32 new_ip); +static void CALLfar_pm_call_gate(const selector_t *callgate_sel); static void CALLfar_pm_task_gate(selector_t *taskgate_sel); static void CALLfar_pm_tss(selector_t *tss_sel); @@ -387,7 +385,7 @@ CALLfar_pm(UINT16 selector, UINT32 new_i * CALLfar_pm: code segment */ static void -CALLfar_pm_code_segment(selector_t *cs_sel, UINT32 new_ip) +CALLfar_pm_code_segment(const selector_t *cs_sel, UINT32 new_ip) { UINT32 sp; @@ -456,11 +454,11 @@ CALLfar_pm_code_segment(selector_t *cs_s /*--- * CALLfar_pm: call gate */ -static void CALLfar_pm_call_gate_same_privilege(selector_t *call_sel, selector_t *cs_sel); -static void CALLfar_pm_call_gate_more_privilege(selector_t *call_sel, selector_t *cs_sel); +static void CALLfar_pm_call_gate_same_privilege(const selector_t *call_sel, selector_t *cs_sel); +static void CALLfar_pm_call_gate_more_privilege(const selector_t *call_sel, selector_t *cs_sel); static void -CALLfar_pm_call_gate(selector_t *callgate_sel) +CALLfar_pm_call_gate(const selector_t *callgate_sel) { selector_t cs_sel; int rv; @@ -529,7 +527,7 @@ CALLfar_pm_call_gate(selector_t *callgat * CALLfar_pm: call gate (SAME-PRIVILEGE) */ static void -CALLfar_pm_call_gate_same_privilege(selector_t *callgate_sel, selector_t *cs_sel) +CALLfar_pm_call_gate_same_privilege(const selector_t *callgate_sel, selector_t *cs_sel) { UINT32 sp; @@ -564,7 +562,7 @@ CALLfar_pm_call_gate_same_privilege(sele * CALLfar_pm: call gate (MORE-PRIVILEGE) */ static void -CALLfar_pm_call_gate_more_privilege(selector_t *callgate_sel, selector_t *cs_sel) +CALLfar_pm_call_gate_more_privilege(const selector_t *callgate_sel, selector_t *cs_sel) { UINT32 param[32]; /* copy param */ selector_t ss_sel; @@ -990,8 +988,8 @@ RETfar_pm(UINT nbytes) */ static void IRET_pm_nested_task(void); static void IRET_pm_protected_mode_return(UINT16 new_cs, UINT32 new_ip, UINT32 new_flags); -static void IRET_pm_protected_mode_return_same_privilege(selector_t *cs_sel, UINT32 new_ip, UINT32 new_flags); -static void IRET_pm_protected_mode_return_outer_privilege(selector_t *cs_sel, UINT32 new_ip, UINT32 new_flags); +static void IRET_pm_protected_mode_return_same_privilege(const selector_t *cs_sel, UINT32 new_ip, UINT32 new_flags); +static void IRET_pm_protected_mode_return_outer_privilege(const selector_t *cs_sel, UINT32 new_ip, UINT32 new_flags); static void IRET_pm_return_to_vm86(UINT16 new_cs, UINT32 new_ip, UINT32 new_flags); static void IRET_pm_return_from_vm86(UINT16 new_cs, UINT32 new_ip, UINT32 new_flags); @@ -1147,13 +1145,10 @@ IRET_pm_protected_mode_return(UINT16 new * IRET_pm: SAME-PRIVILEGE */ static void -IRET_pm_protected_mode_return_same_privilege(selector_t *cs_sel, UINT32 new_ip, UINT32 new_flags) +IRET_pm_protected_mode_return_same_privilege(const selector_t *cs_sel, UINT32 new_ip, UINT32 new_flags) { UINT32 mask; UINT stacksize; -#if defined(IA32_DONT_USE_SET_EFLAGS_FUNCTION) - UINT32 old_flags = CPU_EFLAG; -#endif VERBOSE(("IRET_pm: RETURN-TO-SAME-PRIVILEGE-LEVEL")); @@ -1163,17 +1158,6 @@ IRET_pm_protected_mode_return_same_privi 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; if (CPU_INST_OP32) mask |= RF_FLAG; @@ -1185,7 +1169,6 @@ IRET_pm_protected_mode_return_same_privi mask |= VM_FLAG|VIF_FLAG|VIP_FLAG; } } -#endif if (CPU_INST_OP32) { stacksize = 12; @@ -1197,20 +1180,7 @@ IRET_pm_protected_mode_return_same_privi load_cs(cs_sel->selector, &cs_sel->desc, CPU_STAT_CPL); 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); -#endif if (CPU_STAT_SS32) { CPU_ESP += stacksize; @@ -1223,7 +1193,7 @@ IRET_pm_protected_mode_return_same_privi * IRET_pm: OUTER-PRIVILEGE */ static void -IRET_pm_protected_mode_return_outer_privilege(selector_t *cs_sel, UINT32 new_ip, UINT32 new_flags) +IRET_pm_protected_mode_return_outer_privilege(const selector_t *cs_sel, UINT32 new_ip, UINT32 new_flags) { descriptor_t *dp; selector_t ss_sel; @@ -1233,9 +1203,6 @@ IRET_pm_protected_mode_return_outer_priv UINT16 new_ss; int rv; int i; -#if defined(IA32_DONT_USE_SET_EFLAGS_FUNCTION) - UINT32 old_flags = CPU_EFLAG; -#endif VERBOSE(("IRET_pm: RETURN-OUTER-PRIVILEGE-LEVEL")); @@ -1297,17 +1264,6 @@ IRET_pm_protected_mode_return_outer_priv 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; if (CPU_INST_OP32) mask |= RF_FLAG; @@ -1319,26 +1275,12 @@ IRET_pm_protected_mode_return_outer_priv mask |= VM_FLAG|VIF_FLAG|VIP_FLAG; } } -#endif /* set new register */ load_cs(cs_sel->selector, &cs_sel->desc, cs_sel->rpl); 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); -#endif load_ss(ss_sel.selector, &ss_sel.desc, cs_sel->rpl); if (CPU_STAT_SS32) { @@ -1371,9 +1313,6 @@ IRET_pm_return_to_vm86(UINT16 new_cs, UI UINT32 sp; UINT32 new_sp; 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")); @@ -1405,20 +1344,7 @@ IRET_pm_return_to_vm86(UINT16 new_cs, UI } /* 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); -#endif new_sp &= 0xffff; new_ip &= 0xffff; @@ -1450,13 +1376,7 @@ IRET_pm_return_from_vm86(UINT16 new_cs, 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); -#endif CPU_SET_SEGREG(CPU_CS_INDEX, new_cs); SET_EIP(new_ip);