|
|
| version 1.1, 2003/12/08 00:55:31 | version 1.2, 2003/12/11 15:03:16 |
|---|---|
| Line 56 init_cpumem(BYTE usemem) | Line 56 init_cpumem(BYTE usemem) |
| free(cpumem); | free(cpumem); |
| cpumem = 0; | cpumem = 0; |
| } | } |
| if (size <= LOWMEM - 0x100000) { | if (size <= LOWMEM - 0x100000) { |
| extmem_size = 0; | extmem_size = 0; |
| cpumem = 0; | cpumem = 0; |
| } else { | } else { |
| extmem_size = size - (LOWMEM - 0x100000); | extmem_size = size - (LOWMEM - 0x100000); |
| cpumem = (BYTE*)malloc(extmem_size); | cpumem = (BYTE *)malloc(extmem_size); |
| if (cpumem == NULL) { | if (cpumem == NULL) { |
| protectmem_size = 0; | protectmem_size = 0; |
| return FAILURE; | return FAILURE; |
| } | } |
| memset(cpumem, 0, extmem_size); | |
| } | } |
| } | } |
| if (cpumem) | |
| memset(cpumem, 0, extmem_size); | |
| protectmem_size = usemem; | protectmem_size = usemem; |
| return SUCCESS; | return SUCCESS; |
| } | } |
| Line 85 void | Line 81 void |
| cpu_memoryread_check(descriptor_t* sd, DWORD madr, DWORD length, int e) | cpu_memoryread_check(descriptor_t* sd, DWORD madr, DWORD length, int e) |
| { | { |
| if (!CPU_STAT_PM) { | if (CPU_STAT_PM) { |
| if ((madr > sd->u.seg.segend - length + 1) | |
| || (length - 1 > sd->u.seg.limit)) { | |
| EXCEPTION(e, 0); | |
| } | |
| } else { | |
| /* invalid */ | /* invalid */ |
| if (!sd->valid) { | if (!sd->valid) { |
| EXCEPTION(GP_EXCEPTION, 0); | EXCEPTION(GP_EXCEPTION, 0); |
| Line 129 cpu_memoryread_check(descriptor_t* sd, D | Line 120 cpu_memoryread_check(descriptor_t* sd, D |
| break; | break; |
| } | } |
| } | } |
| #if 0 /* XXX */ | |
| sd->flag |= CPU_DESC_READABLE; | sd->flag |= CPU_DESC_READABLE; |
| #endif | |
| } | } |
| void | void |
| cpu_memorywrite_check(descriptor_t* sd, DWORD madr, DWORD length, int e) | cpu_memorywrite_check(descriptor_t* sd, DWORD madr, DWORD length, int e) |
| { | { |
| if (!CPU_STAT_PM) { | if (CPU_STAT_PM) { |
| if ((madr > sd->u.seg.segend - length + 1) | |
| || (length - 1 > sd->u.seg.limit)) { | |
| EXCEPTION(e, 0); | |
| } | |
| } else { | |
| /* invalid */ | /* invalid */ |
| if (!sd->valid) { | if (!sd->valid) { |
| EXCEPTION(GP_EXCEPTION, 0); | EXCEPTION(GP_EXCEPTION, 0); |
| Line 178 cpu_memorywrite_check(descriptor_t* sd, | Line 162 cpu_memorywrite_check(descriptor_t* sd, |
| break; | break; |
| } | } |
| } | } |
| #if 0 /* XXX */ | |
| sd->flag |= CPU_DESC_WRITABLE; | sd->flag |= CPU_DESC_WRITABLE; |
| #endif | |
| } | } |
| BOOL | BOOL |
| Line 287 cpu_codefetch_w(DWORD madr) | Line 269 cpu_codefetch_w(DWORD madr) |
| DWORD addr; | DWORD addr; |
| sd = &CPU_STAT_SREG(CPU_CS_INDEX); | sd = &CPU_STAT_SREG(CPU_CS_INDEX); |
| if (!CPU_INST_AS32) | if (!CPU_INST_AS32) |
| madr &= 0xffff; | madr &= 0xffff; |
| if (madr <= sd->u.seg.segend) { | if (madr <= sd->u.seg.segend - 1) { |
| addr = CPU_STAT_SREGBASE(CPU_CS_INDEX) + madr; | addr = CPU_STAT_SREGBASE(CPU_CS_INDEX) + madr; |
| if (!CPU_STAT_PM) | if (!CPU_STAT_PM) |
| return cpu_memoryread_w(addr); | return cpu_memoryread_w(addr); |
| Line 309 cpu_codefetch_d(DWORD madr) | Line 290 cpu_codefetch_d(DWORD madr) |
| sd = &CPU_STAT_SREG(CPU_CS_INDEX); | sd = &CPU_STAT_SREG(CPU_CS_INDEX); |
| if (!CPU_INST_AS32) | if (!CPU_INST_AS32) |
| madr &= 0xffff; | madr &= 0xffff; |
| if (madr <= sd->u.seg.segend) { | if (madr <= sd->u.seg.segend - 3) { |
| addr = CPU_STAT_SREGBASE(CPU_CS_INDEX) + madr; | addr = CPU_STAT_SREGBASE(CPU_CS_INDEX) + madr; |
| if (!CPU_STAT_PM) | if (!CPU_STAT_PM) |
| return cpu_memoryread_d(addr); | return cpu_memoryread_d(addr); |
| Line 528 cpu_memorywrite_d(DWORD address, DWORD v | Line 509 cpu_memorywrite_d(DWORD address, DWORD v |
| cpu_memorywrite_w(adr + 2, (value >> 16) & 0xffff); | cpu_memorywrite_w(adr + 2, (value >> 16) & 0xffff); |
| } else { | } else { |
| adr -= LOWMEM; | adr -= LOWMEM; |
| if (adr < extmem_size) { | if (adr < extmem_size - 3) { |
| SETDWORD(cpumem + adr, value); | STOREINTELDWORD(cpumem + adr, value); |
| } else { | } else { |
| ia32_panic("cpu_memorywrite_d: out of universe."); | ia32_panic("cpu_memorywrite_d: out of universe."); |
| } | } |
| Line 548 cpu_memorywrite_w(DWORD address, WORD va | Line 529 cpu_memorywrite_w(DWORD address, WORD va |
| cpumem[adr - (LOWMEM - 1)] = (value >> 8) & 0xff; | cpumem[adr - (LOWMEM - 1)] = (value >> 8) & 0xff; |
| } else { | } else { |
| adr -= LOWMEM; | adr -= LOWMEM; |
| if (adr < extmem_size) { | if (adr < extmem_size - 1) { |
| SETWORD(cpumem + adr, value); | STOREINTELWORD(cpumem + adr, value); |
| } else { | } else { |
| ia32_panic("cpu_memorywrite_w: out of universe."); | ia32_panic("cpu_memorywrite_w: out of universe."); |
| } | } |
| Line 586 cpu_memoryread_d(DWORD address) | Line 567 cpu_memoryread_d(DWORD address) |
| val |= (DWORD)cpu_memoryread_w(adr + 2) << 16; | val |= (DWORD)cpu_memoryread_w(adr + 2) << 16; |
| } else { | } else { |
| adr -= LOWMEM; | adr -= LOWMEM; |
| if (adr < extmem_size) { | if (adr < extmem_size - 3) { |
| val = GETDWORD(cpumem + adr); | val = LOADINTELDWORD(cpumem + adr); |
| } else { | } else { |
| val = (DWORD)-1; | |
| ia32_panic("cpu_memoryread_d: out of universe."); | ia32_panic("cpu_memoryread_d: out of universe."); |
| val = (DWORD)-1; | |
| } | } |
| } | } |
| return val; | return val; |
| Line 609 cpu_memoryread_w(DWORD address) | Line 590 cpu_memoryread_w(DWORD address) |
| val |= (WORD)cpumem[adr - (LOWMEM - 1)] << 8; | val |= (WORD)cpumem[adr - (LOWMEM - 1)] << 8; |
| } else { | } else { |
| adr -= LOWMEM; | adr -= LOWMEM; |
| if (adr < extmem_size) { | if (adr < extmem_size - 1) { |
| val = GETWORD(cpumem + adr); | val = LOADINTELWORD(cpumem + adr); |
| } else { | } else { |
| val = (WORD)-1; | |
| ia32_panic("cpu_memoryread_w: out of universe."); | ia32_panic("cpu_memoryread_w: out of universe."); |
| val = (WORD)-1; | |
| } | } |
| } | } |
| return val; | return val; |
| Line 632 cpu_memoryread(DWORD address) | Line 613 cpu_memoryread(DWORD address) |
| if (adr < extmem_size) { | if (adr < extmem_size) { |
| val = cpumem[adr]; | val = cpumem[adr]; |
| } else { | } else { |
| val = (BYTE)-1; | |
| ia32_panic("cpu_memoryread: out of universe."); | ia32_panic("cpu_memoryread: out of universe."); |
| val = (BYTE)-1; | |
| } | } |
| } | } |
| return val; | return val; |