--- np2/i386c/ia32/ia32.c 2003/12/25 19:21:17 1.4 +++ np2/i386c/ia32/ia32.c 2004/03/12 13:34:08 1.13 @@ -1,4 +1,4 @@ -/* $Id: ia32.c,v 1.4 2003/12/25 19:21:17 yui Exp $ */ +/* $Id: ia32.c,v 1.13 2004/03/12 13:34:08 monaka Exp $ */ /* * Copyright (c) 2002-2003 NONAKA Kimihiro @@ -34,47 +34,12 @@ I386CORE i386core; -BYTE iflags[] = { - 0x44, 0x00, 0x00, 0x04, 0x00, 0x04, 0x04, 0x00, - 0x00, 0x04, 0x04, 0x00, 0x04, 0x00, 0x00, 0x04, - 0x00, 0x04, 0x04, 0x00, 0x04, 0x00, 0x00, 0x04, - 0x04, 0x00, 0x00, 0x04, 0x00, 0x04, 0x04, 0x00, - 0x00, 0x04, 0x04, 0x00, 0x04, 0x00, 0x00, 0x04, - 0x04, 0x00, 0x00, 0x04, 0x00, 0x04, 0x04, 0x00, - 0x04, 0x00, 0x00, 0x04, 0x00, 0x04, 0x04, 0x00, - 0x00, 0x04, 0x04, 0x00, 0x04, 0x00, 0x00, 0x04, - 0x00, 0x04, 0x04, 0x00, 0x04, 0x00, 0x00, 0x04, - 0x04, 0x00, 0x00, 0x04, 0x00, 0x04, 0x04, 0x00, - 0x04, 0x00, 0x00, 0x04, 0x00, 0x04, 0x04, 0x00, - 0x00, 0x04, 0x04, 0x00, 0x04, 0x00, 0x00, 0x04, - 0x04, 0x00, 0x00, 0x04, 0x00, 0x04, 0x04, 0x00, - 0x00, 0x04, 0x04, 0x00, 0x04, 0x00, 0x00, 0x04, - 0x00, 0x04, 0x04, 0x00, 0x04, 0x00, 0x00, 0x04, - 0x04, 0x00, 0x00, 0x04, 0x00, 0x04, 0x04, 0x00, - 0x80, 0x84, 0x84, 0x80, 0x84, 0x80, 0x80, 0x84, - 0x84, 0x80, 0x80, 0x84, 0x80, 0x84, 0x84, 0x80, - 0x84, 0x80, 0x80, 0x84, 0x80, 0x84, 0x84, 0x80, - 0x80, 0x84, 0x84, 0x80, 0x84, 0x80, 0x80, 0x84, - 0x84, 0x80, 0x80, 0x84, 0x80, 0x84, 0x84, 0x80, - 0x80, 0x84, 0x84, 0x80, 0x84, 0x80, 0x80, 0x84, - 0x80, 0x84, 0x84, 0x80, 0x84, 0x80, 0x80, 0x84, - 0x84, 0x80, 0x80, 0x84, 0x80, 0x84, 0x84, 0x80, - 0x84, 0x80, 0x80, 0x84, 0x80, 0x84, 0x84, 0x80, - 0x80, 0x84, 0x84, 0x80, 0x84, 0x80, 0x80, 0x84, - 0x80, 0x84, 0x84, 0x80, 0x84, 0x80, 0x80, 0x84, - 0x84, 0x80, 0x80, 0x84, 0x80, 0x84, 0x84, 0x80, - 0x80, 0x84, 0x84, 0x80, 0x84, 0x80, 0x80, 0x84, - 0x84, 0x80, 0x80, 0x84, 0x80, 0x84, 0x84, 0x80, - 0x84, 0x80, 0x80, 0x84, 0x80, 0x84, 0x84, 0x80, - 0x80, 0x84, 0x84, 0x80, 0x84, 0x80, 0x80, 0x84, -}; - -BYTE *reg8_b20[0x100]; -BYTE *reg8_b53[0x100]; -WORD *reg16_b20[0x100]; -WORD *reg16_b53[0x100]; -DWORD *reg32_b20[0x100]; -DWORD *reg32_b53[0x100]; +UINT8 *reg8_b20[0x100]; +UINT8 *reg8_b53[0x100]; +UINT16 *reg16_b20[0x100]; +UINT16 *reg16_b53[0x100]; +UINT32 *reg32_b20[0x100]; +UINT32 *reg32_b53[0x100]; void @@ -83,20 +48,7 @@ ia32_init(void) int i; memset(&i386core.s, 0, sizeof(i386core.s)); - CPU_STATSAVE.cpu_inst_default.seg_base = (DWORD)-1; - - CPU_EDX = (CPU_FAMILY << 8) | (CPU_MODEL << 4) | CPU_STEPPING; - CPU_EFLAG = 2; - CPU_CR0 = CPU_CR0_CD | CPU_CR0_NW | CPU_CR0_ET; - CPU_MXCSR = 0x1f80; - CPU_GDTR_LIMIT = 0xffff; - CPU_IDTR_LIMIT = 0xffff; - - for (i = 0; i < CPU_SEGREG_NUM; ++i) { - CPU_STAT_SREG_INIT(i); - } - CPU_LDTR_LIMIT = 0xffff; - CPU_TR_LIMIT = 0xffff; + ia32_initreg(); for (i = 0; i < 0x100; ++i) { /* 8bit */ @@ -126,14 +78,31 @@ ia32_init(void) } resolve_init(); -#if defined(SUPPORT_TLB) - tlb_init(); -#endif #ifdef USE_FPU fpu_init(); #endif } +void +ia32_setextsize(UINT32 size) +{ + + if (CPU_EXTMEMSIZE != size) { + if (CPU_EXTMEM) { + _MFREE(CPU_EXTMEM); + CPU_EXTMEM = NULL; + } + if (size) { + CPU_EXTMEM = (BYTE *)_MALLOC(size + 16, "EXTMEM"); + if (CPU_EXTMEM == NULL) { + size = 0; + } + ZeroMemory(CPU_EXTMEM, size + 16); + } + CPU_EXTMEMSIZE = size; + } +} + /* * ¥â¡¼¥ÉÁ«°Ü */ @@ -144,15 +113,22 @@ change_pm(BOOL onoff) if (onoff) { for (i = 0; i < CPU_SEGREG_NUM; i++) { - CPU_STAT_SREG(i).valid = TRUE; + CPU_STAT_SREG(i).valid = 1; CPU_STAT_SREG(i).dpl = 0; } VERBOSE(("Entering to Protected-Mode...")); } else { VERBOSE(("Leaveing from Protected-Mode...")); } - CPU_STAT_CPL = 0; + + CPU_INST_OP32 = CPU_INST_AS32 = + CPU_STATSAVE.cpu_inst_default.op_32 = + CPU_STATSAVE.cpu_inst_default.as_32 = 0; + CPU_STAT_SS32 = 0; + CPU_SET_CPL(0); CPU_STAT_PM = onoff; + + tlb_flush(TRUE); } void FASTCALL @@ -162,56 +138,62 @@ change_pg(BOOL onoff) if (onoff) { VERBOSE(("Entering to Paging-Mode...")); } else { - VERBOSE(("Leaveing from Pagin-Mode...")); + VERBOSE(("Leaveing from Paging-Mode...")); } CPU_STAT_PAGING = onoff; + + tlb_flush(TRUE); } void FASTCALL change_vm(BOOL onoff) { - descriptor_t sd; int i; + CPU_STAT_VM86 = onoff; if (onoff) { for (i = 0; i < CPU_SEGREG_NUM; i++) { - sd.u.seg.limit = 0xffff; - CPU_SET_SEGDESC_DEFAULT(&sd, i, CPU_REGS_SREG(i)); - sd.dpl = 3; - CPU_STAT_SREG(i) = sd; + CPU_SET_SEGREG(i, CPU_REGS_SREG(i)); } + CPU_INST_OP32 = CPU_INST_AS32 = + CPU_STATSAVE.cpu_inst_default.op_32 = + CPU_STATSAVE.cpu_inst_default.as_32 = 0; + CPU_STAT_SS32 = 0; + CPU_SET_CPL(3); VERBOSE(("Entering to Virtual-8086-Mode...")); } else { VERBOSE(("Leaveing from Virtual-8086-Mode...")); } - CPU_STAT_VM86 = onoff; } /* * flags */ static void -modify_eflags(DWORD new_flags, DWORD mask) +modify_eflags(UINT32 new_flags, UINT32 mask) { - DWORD orig = CPU_EFLAG; + UINT32 orig = CPU_EFLAG; new_flags &= ALL_EFLAG; mask &= ALL_EFLAG; - CPU_EFLAG = (REAL_EFLAGREG & ~mask) | (new_flags & mask) | 0x2; + CPU_EFLAG = (REAL_EFLAGREG & ~mask) | (new_flags & mask); CPU_OV = CPU_FLAG & O_FLAG; CPU_TRAP = (CPU_FLAG & (I_FLAG|T_FLAG)) == (I_FLAG|T_FLAG); - if ((orig ^ CPU_EFLAG) & VM_FLAG) { - if (CPU_EFLAG & VM_FLAG) { - change_vm(1); - } else { - change_vm(0); + if (CPU_STAT_PM) { + if ((orig ^ CPU_EFLAG) & VM_FLAG) { + if (CPU_EFLAG & VM_FLAG) { + change_vm(1); + } else { + change_vm(0); + } } } } +#if !defined(IA32_DONT_USE_SET_EFLAGS_FUNCTION) void -set_flags(WORD new_flags, WORD mask) +set_flags(UINT16 new_flags, UINT16 mask) { mask &= I_FLAG|IOPL_FLAG; @@ -220,7 +202,7 @@ set_flags(WORD new_flags, WORD mask) } void -set_eflags(DWORD new_flags, DWORD mask) +set_eflags(UINT32 new_flags, UINT32 mask) { mask &= I_FLAG|IOPL_FLAG|RF_FLAG|VM_FLAG|VIF_FLAG|VIP_FLAG; @@ -228,3 +210,4 @@ set_eflags(DWORD new_flags, DWORD mask) mask |= AC_FLAG|ID_FLAG; modify_eflags(new_flags, mask); } +#endif /* !IA32_DONT_USE_SET_EFLAGS_FUNCTION */