--- np2/i386c/ia32/cpu_mem.mcr 2011/12/29 13:32:12 1.7 +++ np2/i386c/ia32/cpu_mem.mcr 2012/01/08 18:26:10 1.8 @@ -34,27 +34,27 @@ cpu_vmemoryread_##width(int idx, UINT32 __ASSERT((unsigned int)idx < CPU_SEGREG_NUM); \ \ sdp = &CPU_STAT_SREG(idx); \ + addr = sdp->u.seg.segbase + offset; \ +\ + if (!CPU_STAT_PM) \ + return cpu_memoryread_##width(addr); \ +\ if (!SEG_IS_VALID(sdp)) { \ exc = GP_EXCEPTION; \ goto err; \ } \ -\ if (!(sdp->flag & CPU_DESC_FLAG_READABLE)) { \ cpu_memoryread_check(sdp, offset, (length), \ - (idx == CPU_SS_INDEX) ? SS_EXCEPTION : GP_EXCEPTION); \ + CHOOSE_EXCEPTION(idx)); \ } else if (!(sdp->flag & CPU_DESC_FLAG_WHOLEADR)) { \ if (!check_limit_upstairs(sdp, offset, (length))) \ goto range_failure; \ } \ - addr = sdp->u.seg.segbase + offset; \ - check_memory_break_point(addr, (length), CPU_DR7_RW_RO); \ - if (!CPU_STAT_PAGING) \ - return cpu_memoryread_##width(addr); \ - return cpu_linear_memory_read_##width(addr, CPU_PAGE_READ_DATA | CPU_STAT_USER_MODE); \ + return cpu_lmemoryread_##width(addr, CPU_PAGE_READ_DATA | CPU_STAT_USER_MODE); \ \ range_failure: \ VERBOSE(("cpu_vmemoryread_" #width ": type = %d, offset = %08x, length = %d, limit = %08x", sdp->type, offset, length, sdp->u.seg.limit)); \ - exc = (idx == CPU_SS_INDEX) ? SS_EXCEPTION : GP_EXCEPTION; \ + exc = CHOOSE_EXCEPTION(idx); \ err: \ EXCEPTION(exc, 0); \ return 0; /* compiler happy */ \ @@ -70,30 +70,30 @@ cpu_vmemorywrite_##width(int idx, UINT32 __ASSERT((unsigned int)idx < CPU_SEGREG_NUM); \ \ sdp = &CPU_STAT_SREG(idx); \ + addr = sdp->u.seg.segbase + offset; \ +\ + if (!CPU_STAT_PM) { \ + cpu_memorywrite_##width(addr, value); \ + return; \ + } \ +\ if (!SEG_IS_VALID(sdp)) { \ exc = GP_EXCEPTION; \ goto err; \ } \ -\ if (!(sdp->flag & CPU_DESC_FLAG_WRITABLE)) { \ cpu_memorywrite_check(sdp, offset, (length), \ - (idx == CPU_SS_INDEX) ? SS_EXCEPTION : GP_EXCEPTION); \ + CHOOSE_EXCEPTION(idx)); \ } else if (!(sdp->flag & CPU_DESC_FLAG_WHOLEADR)) { \ if (!check_limit_upstairs(sdp, offset, (length))) \ goto range_failure; \ } \ - addr = sdp->u.seg.segbase + offset; \ - check_memory_break_point(addr, (length), CPU_DR7_RW_RW); \ - if (!CPU_STAT_PAGING) { \ - cpu_memorywrite_##width(addr, value); \ - } else { \ - cpu_linear_memory_write_##width(addr, value, CPU_PAGE_WRITE_DATA | CPU_STAT_USER_MODE); \ - } \ + cpu_lmemorywrite_##width(addr, value, CPU_PAGE_WRITE_DATA | CPU_STAT_USER_MODE); \ return; \ \ range_failure: \ VERBOSE(("cpu_vmemorywrite_" #width ": type = %d, offset = %08x, length = %d, limit = %08x", sdp->type, offset, length, sdp->u.seg.limit)); \ - exc = (idx == CPU_SS_INDEX) ? SS_EXCEPTION : GP_EXCEPTION; \ + exc = CHOOSE_EXCEPTION(idx); \ err: \ EXCEPTION(exc, 0); \ } \ @@ -103,38 +103,38 @@ cpu_memory_access_va_RMW_##width(int idx { \ descriptor_t *sdp; \ UINT32 addr; \ - UINT32 res, dst; \ + UINT32 result; \ + valtype value; \ int exc; \ \ __ASSERT((unsigned int)idx < CPU_SEGREG_NUM); \ \ sdp = &CPU_STAT_SREG(idx); \ + addr = sdp->u.seg.segbase + offset; \ +\ + if (!CPU_STAT_PM) { \ + value = cpu_memoryread_##width(addr); \ + result = (*func)(value, arg); \ + cpu_memorywrite_##width(addr, result); \ + return value; \ + } \ +\ if (!SEG_IS_VALID(sdp)) { \ exc = GP_EXCEPTION; \ goto err; \ } \ -\ if (!(sdp->flag & CPU_DESC_FLAG_WRITABLE)) { \ cpu_memorywrite_check(sdp, offset, (length), \ - (idx == CPU_SS_INDEX) ? SS_EXCEPTION : GP_EXCEPTION); \ + CHOOSE_EXCEPTION(idx)); \ } else if (!(sdp->flag & CPU_DESC_FLAG_WHOLEADR)) { \ if (!check_limit_upstairs(sdp, offset, (length))) \ goto range_failure; \ } \ - addr = sdp->u.seg.segbase + offset; \ - check_memory_break_point(addr, (length), CPU_DR7_RW_RW); \ - if (!CPU_STAT_PAGING) { \ - dst = cpu_memoryread_##width(addr); \ - res = (*func)(dst, arg); \ - cpu_memorywrite_##width(addr, res); \ - } else { \ - dst = cpu_memory_access_la_RMW_##width(addr, func, arg); \ - } \ - return dst; \ + return cpu_lmemory_RMW_##width(addr, func, arg); \ \ range_failure: \ VERBOSE(("cpu_memory_access_va_RMW_" #width ": type = %d, offset = %08x, length = %d, limit = %08x", sdp->type, offset, length, sdp->u.seg.limit)); \ - exc = (idx == CPU_SS_INDEX) ? SS_EXCEPTION : GP_EXCEPTION; \ + exc = CHOOSE_EXCEPTION(idx); \ err: \ EXCEPTION(exc, 0); \ return 0; /* compiler happy */ \