--- np2/i386c/ia32/cpu_mem.c 2003/12/08 00:55:31 1.1 +++ np2/i386c/ia32/cpu_mem.c 2004/01/07 14:49:10 1.4 @@ -1,4 +1,4 @@ -/* $Id: cpu_mem.c,v 1.1 2003/12/08 00:55:31 yui Exp $ */ +/* $Id: cpu_mem.c,v 1.4 2004/01/07 14:49:10 monaka Exp $ */ /* * Copyright (c) 2002-2003 NONAKA Kimihiro @@ -32,7 +32,7 @@ #include "memory.h" // ¤¢¤È¤Ç¡Ä -extern DWORD cpumem_addrmask; +// extern DWORD cpumem_addrmask; // -> CPU_STAT_ADRSMASK BYTE *cpumem = 0; DWORD extmem_size = 0; @@ -56,23 +56,19 @@ init_cpumem(BYTE usemem) free(cpumem); cpumem = 0; } - if (size <= LOWMEM - 0x100000) { extmem_size = 0; cpumem = 0; } else { extmem_size = size - (LOWMEM - 0x100000); - cpumem = (BYTE*)malloc(extmem_size); + cpumem = (BYTE *)malloc(extmem_size); if (cpumem == NULL) { protectmem_size = 0; return FAILURE; } + memset(cpumem, 0, extmem_size); } } - - if (cpumem) - memset(cpumem, 0, extmem_size); - protectmem_size = usemem; return SUCCESS; } @@ -85,12 +81,7 @@ void cpu_memoryread_check(descriptor_t* sd, DWORD madr, DWORD length, int e) { - if (!CPU_STAT_PM) { - if ((madr > sd->u.seg.segend - length + 1) - || (length - 1 > sd->u.seg.limit)) { - EXCEPTION(e, 0); - } - } else { + if (CPU_STAT_PM) { /* invalid */ if (!sd->valid) { EXCEPTION(GP_EXCEPTION, 0); @@ -129,21 +120,14 @@ cpu_memoryread_check(descriptor_t* sd, D break; } } -#if 0 /* XXX */ sd->flag |= CPU_DESC_READABLE; -#endif } void cpu_memorywrite_check(descriptor_t* sd, DWORD madr, DWORD length, int e) { - if (!CPU_STAT_PM) { - if ((madr > sd->u.seg.segend - length + 1) - || (length - 1 > sd->u.seg.limit)) { - EXCEPTION(e, 0); - } - } else { + if (CPU_STAT_PM) { /* invalid */ if (!sd->valid) { EXCEPTION(GP_EXCEPTION, 0); @@ -178,9 +162,7 @@ cpu_memorywrite_check(descriptor_t* sd, break; } } -#if 0 /* XXX */ sd->flag |= CPU_DESC_WRITABLE; -#endif } BOOL @@ -287,10 +269,9 @@ cpu_codefetch_w(DWORD madr) DWORD addr; sd = &CPU_STAT_SREG(CPU_CS_INDEX); - if (!CPU_INST_AS32) madr &= 0xffff; - if (madr <= sd->u.seg.segend) { + if (madr <= sd->u.seg.segend - 1) { addr = CPU_STAT_SREGBASE(CPU_CS_INDEX) + madr; if (!CPU_STAT_PM) return cpu_memoryread_w(addr); @@ -309,7 +290,7 @@ cpu_codefetch_d(DWORD madr) sd = &CPU_STAT_SREG(CPU_CS_INDEX); if (!CPU_INST_AS32) madr &= 0xffff; - if (madr <= sd->u.seg.segend) { + if (madr <= sd->u.seg.segend - 3) { addr = CPU_STAT_SREGBASE(CPU_CS_INDEX) + madr; if (!CPU_STAT_PM) return cpu_memoryread_d(addr); @@ -519,7 +500,7 @@ cpu_vmemorywrite_d(int idx, DWORD madr, void MEMCALL cpu_memorywrite_d(DWORD address, DWORD value) { - DWORD adr = address & cpumem_addrmask; + DWORD adr = address & CPU_STAT_ADRSMASK; if (adr < LOWMEM - 3) { __i286_memorywrite_d(adr, value); @@ -528,10 +509,11 @@ cpu_memorywrite_d(DWORD address, DWORD v cpu_memorywrite_w(adr + 2, (value >> 16) & 0xffff); } else { adr -= LOWMEM; - if (adr < extmem_size) { - SETDWORD(cpumem + adr, value); - } else { - ia32_panic("cpu_memorywrite_d: out of universe."); + if (adr < extmem_size - 3) { + STOREINTELDWORD(cpumem + adr, value); + } else if (adr < extmem_size) { + cpu_memorywrite_w(adr, value & 0xffff); + cpu_memorywrite_w(adr + 2, (value >> 16) & 0xffff); } } } @@ -539,7 +521,7 @@ cpu_memorywrite_d(DWORD address, DWORD v void MEMCALL cpu_memorywrite_w(DWORD address, WORD value) { - DWORD adr = address & cpumem_addrmask; + DWORD adr = address & CPU_STAT_ADRSMASK; if (adr < LOWMEM - 1) { __i286_memorywrite_w(adr, value); @@ -548,10 +530,10 @@ cpu_memorywrite_w(DWORD address, WORD va cpumem[adr - (LOWMEM - 1)] = (value >> 8) & 0xff; } else { adr -= LOWMEM; - if (adr < extmem_size) { - SETWORD(cpumem + adr, value); - } else { - ia32_panic("cpu_memorywrite_w: out of universe."); + if (adr < extmem_size - 1) { + STOREINTELWORD(cpumem + adr, value); + } else if (adr == extmem_size - 1) { + cpumem[adr] = value & 0xff; } } } @@ -559,7 +541,7 @@ cpu_memorywrite_w(DWORD address, WORD va void MEMCALL cpu_memorywrite(DWORD address, BYTE value) { - DWORD adr = address & cpumem_addrmask; + DWORD adr = address & CPU_STAT_ADRSMASK; if (adr < LOWMEM) { __i286_memorywrite(adr, value); @@ -567,8 +549,6 @@ cpu_memorywrite(DWORD address, BYTE valu adr -= LOWMEM; if (adr < extmem_size) { cpumem[adr] = value; - } else { - ia32_panic("cpu_memorywrite: out of universe."); } } } @@ -576,7 +556,7 @@ cpu_memorywrite(DWORD address, BYTE valu DWORD MEMCALL cpu_memoryread_d(DWORD address) { - DWORD adr = address & cpumem_addrmask; + DWORD adr = address & CPU_STAT_ADRSMASK; DWORD val; if (adr < LOWMEM - 3) { @@ -586,11 +566,11 @@ cpu_memoryread_d(DWORD address) val |= (DWORD)cpu_memoryread_w(adr + 2) << 16; } else { adr -= LOWMEM; - if (adr < extmem_size) { - val = GETDWORD(cpumem + adr); + if (adr < extmem_size - 3) { + val = LOADINTELDWORD(cpumem + adr); } else { - val = (DWORD)-1; - ia32_panic("cpu_memoryread_d: out of universe."); + val = cpu_memoryread_w(adr); + val |= (DWORD)cpu_memoryread_w(adr + 2) << 16; } } return val; @@ -599,7 +579,7 @@ cpu_memoryread_d(DWORD address) WORD MEMCALL cpu_memoryread_w(DWORD address) { - DWORD adr = address & cpumem_addrmask; + DWORD adr = address & CPU_STAT_ADRSMASK; WORD val; if (adr < LOWMEM - 1) { @@ -609,11 +589,12 @@ cpu_memoryread_w(DWORD address) val |= (WORD)cpumem[adr - (LOWMEM - 1)] << 8; } else { adr -= LOWMEM; - if (adr < extmem_size) { - val = GETWORD(cpumem + adr); + if (adr < extmem_size - 1) { + val = LOADINTELWORD(cpumem + adr); + } else if (adr == extmem_size - 1) { + val = 0xff00 | cpumem[adr]; } else { val = (WORD)-1; - ia32_panic("cpu_memoryread_w: out of universe."); } } return val; @@ -622,7 +603,7 @@ cpu_memoryread_w(DWORD address) BYTE MEMCALL cpu_memoryread(DWORD address) { - DWORD adr = address & cpumem_addrmask; + DWORD adr = address & CPU_STAT_ADRSMASK; BYTE val; if (adr < LOWMEM) { @@ -633,7 +614,6 @@ cpu_memoryread(DWORD address) val = cpumem[adr]; } else { val = (BYTE)-1; - ia32_panic("cpu_memoryread: out of universe."); } } return val;