|
|
| version 1.8, 2012/01/08 18:26:10 | version 1.10, 2012/06/18 14:30:27 |
|---|---|
| Line 23 | Line 23 |
| * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| */ | */ |
| #define VIRTUAL_ADDRESS_MEMORY_ACCESS_FUNCTION(width, valtype, length) \ | #define DECLARE_VIRTUAL_ADDRESS_MEMORY_RW_FUNCTIONS(width, valtype, length) \ |
| valtype MEMCALL \ | valtype MEMCALL \ |
| cpu_vmemoryread_##width(int idx, UINT32 offset) \ | cpu_vmemoryread_##width(int idx, UINT32 offset) \ |
| { \ | { \ |
| Line 47 cpu_vmemoryread_##width(int idx, UINT32 | Line 47 cpu_vmemoryread_##width(int idx, UINT32 |
| cpu_memoryread_check(sdp, offset, (length), \ | cpu_memoryread_check(sdp, offset, (length), \ |
| CHOOSE_EXCEPTION(idx)); \ | CHOOSE_EXCEPTION(idx)); \ |
| } else if (!(sdp->flag & CPU_DESC_FLAG_WHOLEADR)) { \ | } else if (!(sdp->flag & CPU_DESC_FLAG_WHOLEADR)) { \ |
| if (!check_limit_upstairs(sdp, offset, (length))) \ | if (!check_limit_upstairs(sdp, offset, (length), SEG_IS_32BIT(sdp))) \ |
| goto range_failure; \ | goto range_failure; \ |
| } \ | } \ |
| return cpu_lmemoryread_##width(addr, CPU_PAGE_READ_DATA | CPU_STAT_USER_MODE); \ | return cpu_lmemoryread_##width(addr, CPU_PAGE_READ_DATA | CPU_STAT_USER_MODE); \ |
| Line 85 cpu_vmemorywrite_##width(int idx, UINT32 | Line 85 cpu_vmemorywrite_##width(int idx, UINT32 |
| cpu_memorywrite_check(sdp, offset, (length), \ | cpu_memorywrite_check(sdp, offset, (length), \ |
| CHOOSE_EXCEPTION(idx)); \ | CHOOSE_EXCEPTION(idx)); \ |
| } else if (!(sdp->flag & CPU_DESC_FLAG_WHOLEADR)) { \ | } else if (!(sdp->flag & CPU_DESC_FLAG_WHOLEADR)) { \ |
| if (!check_limit_upstairs(sdp, offset, (length))) \ | if (!check_limit_upstairs(sdp, offset, (length), SEG_IS_32BIT(sdp))) \ |
| goto range_failure; \ | goto range_failure; \ |
| } \ | } \ |
| cpu_lmemorywrite_##width(addr, value, CPU_PAGE_WRITE_DATA | CPU_STAT_USER_MODE); \ | cpu_lmemorywrite_##width(addr, value, CPU_PAGE_WRITE_DATA | CPU_STAT_USER_MODE); \ |
| Line 96 range_failure: \ | Line 96 range_failure: \ |
| exc = CHOOSE_EXCEPTION(idx); \ | exc = CHOOSE_EXCEPTION(idx); \ |
| err: \ | err: \ |
| EXCEPTION(exc, 0); \ | EXCEPTION(exc, 0); \ |
| } \ | } |
| \ | |
| #define DECLARE_VIRTUAL_ADDRESS_MEMORY_RMW_FUNCTIONS(width, valtype, length) \ | |
| UINT32 MEMCALL \ | UINT32 MEMCALL \ |
| cpu_memory_access_va_RMW_##width(int idx, UINT32 offset, UINT32 (CPUCALL *func)(UINT32, void *), void *arg) \ | cpu_vmemory_RMW_##width(int idx, UINT32 offset, UINT32 (CPUCALL *func)(UINT32, void *), void *arg) \ |
| { \ | { \ |
| descriptor_t *sdp; \ | descriptor_t *sdp; \ |
| UINT32 addr; \ | UINT32 addr; \ |
| Line 127 cpu_memory_access_va_RMW_##width(int idx | Line 128 cpu_memory_access_va_RMW_##width(int idx |
| cpu_memorywrite_check(sdp, offset, (length), \ | cpu_memorywrite_check(sdp, offset, (length), \ |
| CHOOSE_EXCEPTION(idx)); \ | CHOOSE_EXCEPTION(idx)); \ |
| } else if (!(sdp->flag & CPU_DESC_FLAG_WHOLEADR)) { \ | } else if (!(sdp->flag & CPU_DESC_FLAG_WHOLEADR)) { \ |
| if (!check_limit_upstairs(sdp, offset, (length))) \ | if (!check_limit_upstairs(sdp, offset, (length), SEG_IS_32BIT(sdp))) \ |
| goto range_failure; \ | goto range_failure; \ |
| } \ | } \ |
| return cpu_lmemory_RMW_##width(addr, func, arg); \ | return cpu_lmemory_RMW_##width(addr, func, arg); \ |
| \ | \ |
| range_failure: \ | 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)); \ | VERBOSE(("cpu_vmemory_RMW_" #width ": type = %d, offset = %08x, length = %d, limit = %08x", sdp->type, offset, length, sdp->u.seg.limit)); \ |
| exc = CHOOSE_EXCEPTION(idx); \ | exc = CHOOSE_EXCEPTION(idx); \ |
| err: \ | err: \ |
| EXCEPTION(exc, 0); \ | EXCEPTION(exc, 0); \ |