|
|
| version 1.18, 2005/03/12 12:32:54 | version 1.21, 2008/03/22 04:03:07 |
|---|---|
| Line 81 ia32_setextsize(UINT32 size) | Line 81 ia32_setextsize(UINT32 size) |
| { | { |
| if (CPU_EXTMEMSIZE != size) { | if (CPU_EXTMEMSIZE != size) { |
| if (CPU_EXTMEM) { | UINT8 *extmem; |
| _MFREE(CPU_EXTMEM); | extmem = CPU_EXTMEM; |
| CPU_EXTMEM = NULL; | if (extmem != NULL) { |
| _MFREE(extmem); | |
| extmem = NULL; | |
| } | } |
| if (size) { | if (size != 0) { |
| CPU_EXTMEM = (BYTE *)_MALLOC(size + 16, "EXTMEM"); | extmem = (UINT8 *)_MALLOC(size + 16, "EXTMEM"); |
| if (CPU_EXTMEM == NULL) { | } |
| size = 0; | if (extmem != NULL) { |
| } | ZeroMemory(extmem, size + 16); |
| ZeroMemory(CPU_EXTMEM, size + 16); | CPU_EXTMEM = extmem; |
| CPU_EXTMEMSIZE = size; | |
| CPU_EXTMEMBASE = CPU_EXTMEM - 0x100000; | |
| CPU_EXTLIMIT16 = min(size + 0x100000, 0xf00000); | |
| CPU_EXTLIMIT = size + 0x100000; | |
| } | |
| else { | |
| CPU_EXTMEM = NULL; | |
| CPU_EXTMEMSIZE = 0; | |
| CPU_EXTMEMBASE = NULL; | |
| CPU_EXTLIMIT16 = 0; | |
| CPU_EXTLIMIT = 0; | |
| } | } |
| CPU_EXTMEMSIZE = size; | |
| } | } |
| CPU_EMSPTR[0] = mem + 0xc0000; | CPU_EMSPTR[0] = mem + 0xc0000; |
| CPU_EMSPTR[1] = mem + 0xc4000; | CPU_EMSPTR[1] = mem + 0xc4000; |
| Line 125 ia32_setemm(UINT frame, UINT32 addr) { | Line 137 ia32_setemm(UINT frame, UINT32 addr) { |
| void FASTCALL | void FASTCALL |
| change_pm(BOOL onoff) | change_pm(BOOL onoff) |
| { | { |
| #if 0 | |
| int i; | int i; |
| #endif | |
| if (onoff) { | if (onoff) { |
| #if 0 | |
| for (i = 0; i < CPU_SEGREG_NUM; i++) { | for (i = 0; i < CPU_SEGREG_NUM; i++) { |
| CPU_STAT_SREG(i).valid = 1; | CPU_STAT_SREG(i).valid = 1; |
| CPU_STAT_SREG(i).dpl = 0; | CPU_STAT_SREG(i).dpl = 0; |
| } | } |
| #endif | |
| VERBOSE(("Entering to Protected-Mode...")); | VERBOSE(("Entering to Protected-Mode...")); |
| } else { | } else { |
| VERBOSE(("Leaveing from Protected-Mode...")); | VERBOSE(("Leaveing from Protected-Mode...")); |
| Line 141 change_pm(BOOL onoff) | Line 157 change_pm(BOOL onoff) |
| CPU_STATSAVE.cpu_inst_default.op_32 = | CPU_STATSAVE.cpu_inst_default.op_32 = |
| CPU_STATSAVE.cpu_inst_default.as_32 = 0; | CPU_STATSAVE.cpu_inst_default.as_32 = 0; |
| CPU_STAT_SS32 = 0; | CPU_STAT_SS32 = 0; |
| CPU_SET_CPL(0); | set_cpl(0); |
| CPU_STAT_PM = onoff; | CPU_STAT_PM = onoff; |
| } | } |
| Line 154 change_pg(BOOL onoff) | Line 170 change_pg(BOOL onoff) |
| } else { | } else { |
| VERBOSE(("Leaveing from Paging-Mode...")); | VERBOSE(("Leaveing from Paging-Mode...")); |
| } | } |
| CPU_STAT_PAGING = onoff; | CPU_STAT_PAGING = onoff; |
| } | } |
| Line 164 change_vm(BOOL onoff) | Line 181 change_vm(BOOL onoff) |
| CPU_STAT_VM86 = onoff; | CPU_STAT_VM86 = onoff; |
| if (onoff) { | if (onoff) { |
| VERBOSE(("Entering to Virtual-8086-Mode...")); | |
| for (i = 0; i < CPU_SEGREG_NUM; i++) { | for (i = 0; i < CPU_SEGREG_NUM; i++) { |
| CPU_STAT_SREGLIMIT(i) = 0xffff; | CPU_STAT_SREGLIMIT(i) = 0xffff; |
| CPU_SET_SEGREG(i, CPU_REGS_SREG(i)); | LOAD_SEGREG(i, CPU_REGS_SREG(i)); |
| } | } |
| CPU_INST_OP32 = CPU_INST_AS32 = | CPU_INST_OP32 = CPU_INST_AS32 = |
| CPU_STATSAVE.cpu_inst_default.op_32 = | CPU_STATSAVE.cpu_inst_default.op_32 = |
| CPU_STATSAVE.cpu_inst_default.as_32 = 0; | CPU_STATSAVE.cpu_inst_default.as_32 = 0; |
| CPU_STAT_SS32 = 0; | CPU_STAT_SS32 = 0; |
| CPU_SET_CPL(3); | set_cpl(3); |
| VERBOSE(("Entering to Virtual-8086-Mode...")); | |
| } else { | } else { |
| VERBOSE(("Leaveing from Virtual-8086-Mode...")); | VERBOSE(("Leaveing from Virtual-8086-Mode...")); |
| } | } |
| } | } |
| #if !defined(IA32_DONT_USE_SET_EFLAGS_FUNCTION) | |
| /* | /* |
| * flags | * flags |
| */ | */ |
| static void | static void FASTCALL |
| modify_eflags(UINT32 new_flags, UINT32 mask) | modify_eflags(UINT32 new_flags, UINT32 mask) |
| { | { |
| UINT32 orig = CPU_EFLAG; | UINT32 orig = CPU_EFLAG; |
| Line 205 modify_eflags(UINT32 new_flags, UINT32 m | Line 221 modify_eflags(UINT32 new_flags, UINT32 m |
| } | } |
| } | } |
| void | void FASTCALL |
| set_flags(UINT16 new_flags, UINT16 mask) | set_flags(UINT16 new_flags, UINT16 mask) |
| { | { |
| Line 214 set_flags(UINT16 new_flags, UINT16 mask) | Line 230 set_flags(UINT16 new_flags, UINT16 mask) |
| modify_eflags(new_flags, mask); | modify_eflags(new_flags, mask); |
| } | } |
| void | void FASTCALL |
| set_eflags(UINT32 new_flags, UINT32 mask) | set_eflags(UINT32 new_flags, UINT32 mask) |
| { | { |
| Line 223 set_eflags(UINT32 new_flags, UINT32 mask | Line 239 set_eflags(UINT32 new_flags, UINT32 mask |
| mask |= AC_FLAG|ID_FLAG; | mask |= AC_FLAG|ID_FLAG; |
| modify_eflags(new_flags, mask); | modify_eflags(new_flags, mask); |
| } | } |
| #endif /* !IA32_DONT_USE_SET_EFLAGS_FUNCTION */ | |
| /* | |
| * CR3 (Page Directory Entry base physical address) | |
| */ | |
| void FASTCALL | |
| set_cr3(UINT32 new_cr3) | |
| { | |
| VERBOSE(("set_CR3: old = %08x, new = 0x%08x", CPU_CR3, new_cr3)); | |
| CPU_CR3 = new_cr3 & CPU_CR3_MASK; | |
| CPU_STAT_PDE_BASE = CPU_CR3 & CPU_CR3_PD_MASK; | |
| tlb_flush(0); | |
| } | |
| /* | |
| * CPL (Current Privilege Level) | |
| */ | |
| void FASTCALL | |
| set_cpl(int new_cpl) | |
| { | |
| int cpl = new_cpl & 3; | |
| CPU_STAT_CPL = (UINT8)cpl; | |
| CPU_STAT_USER_MODE = (cpl == 3) ? CPU_MODE_USER : CPU_MODE_SUPERVISER; | |
| } |