--- np2/i386c/ia32/cpu_mem.c 2003/12/08 00:55:31 1.1 +++ np2/i386c/ia32/cpu_mem.c 2004/01/13 16:32:16 1.5 @@ -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.5 2004/01/13 16:32:16 monaka Exp $ */ /* * Copyright (c) 2002-2003 NONAKA Kimihiro @@ -31,13 +31,11 @@ #include "cpu.h" #include "memory.h" -// ¤¢¤È¤Ç¡Ä -extern DWORD cpumem_addrmask; - BYTE *cpumem = 0; DWORD extmem_size = 0; BYTE protectmem_size = 0; + /* * initialize 1MB-16MB memory */ @@ -56,23 +54,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 +79,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 +118,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 +160,7 @@ cpu_memorywrite_check(descriptor_t* sd, break; } } -#if 0 /* XXX */ sd->flag |= CPU_DESC_WRITABLE; -#endif } BOOL @@ -287,10 +267,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 +288,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 +498,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 +507,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 +519,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 +528,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 +539,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 +547,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 +554,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 +564,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 +577,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 +587,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 +601,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 +612,6 @@ cpu_memoryread(DWORD address) val = cpumem[adr]; } else { val = (BYTE)-1; - ia32_panic("cpu_memoryread: out of universe."); } } return val;