|
|
| version 1.28, 2012/01/08 11:32:16 | version 1.30, 2012/01/08 11:36:47 |
|---|---|
| Line 368 exc: | Line 368 exc: |
| EXCEPTION(SS_EXCEPTION, s & 0xfffc); | EXCEPTION(SS_EXCEPTION, s & 0xfffc); |
| } | } |
| #if defined(IA32_SUPPORT_DEBUG_REGISTER) | |
| static INLINE void | |
| check_memory_break_point(UINT32 address, UINT length, UINT rw) | |
| { | |
| int i; | |
| if (CPU_STAT_BP && !(CPU_EFLAG & RF_FLAG)) { | |
| for (i = 0; i < CPU_DEBUG_REG_INDEX_NUM; i++) { | |
| if ((CPU_STAT_BP & (1 << i)) | |
| && (CPU_DR7_GET_RW(i) & rw) | |
| && ((address <= CPU_DR(i) && address + length > CPU_DR(i)) | |
| || (address > CPU_DR(i) && address < CPU_DR(i) + CPU_DR7_GET_LEN(i)))) { | |
| CPU_STAT_BP_EVENT |= CPU_STAT_BP_EVENT_B(i); | |
| } | |
| } | |
| } | |
| } | |
| #else | |
| #define check_memory_break_point(address, length, rw) | |
| #endif | |
| /* | /* |
| * code fetch | * code fetch |
| Line 580 cpu_vmemoryread_q(int idx, UINT32 offset | Line 558 cpu_vmemoryread_q(int idx, UINT32 offset |
| goto range_failure; | goto range_failure; |
| } | } |
| addr = sdp->u.seg.segbase + offset; | addr = sdp->u.seg.segbase + offset; |
| check_memory_break_point(addr, 8, CPU_DR7_RW_RO); | |
| if (!CPU_STAT_PAGING) | if (!CPU_STAT_PAGING) |
| return cpu_memoryread_q(addr); | return cpu_memoryread_q(addr); |
| return cpu_linear_memory_read_q(addr, CPU_PAGE_READ_DATA | CPU_STAT_USER_MODE); | return cpu_linear_memory_read_q(addr, CPU_PAGE_READ_DATA | CPU_STAT_USER_MODE); |
| Line 616 cpu_vmemorywrite_q(int idx, UINT32 offse | Line 593 cpu_vmemorywrite_q(int idx, UINT32 offse |
| goto range_failure; | goto range_failure; |
| } | } |
| addr = sdp->u.seg.segbase + offset; | addr = sdp->u.seg.segbase + offset; |
| check_memory_break_point(addr, 8, CPU_DR7_RW_RW); | |
| if (!CPU_STAT_PAGING) { | if (!CPU_STAT_PAGING) { |
| cpu_memorywrite_q(addr, value); | cpu_memorywrite_q(addr, value); |
| } else { | } else { |
| Line 654 cpu_vmemoryread_f(int idx, UINT32 offset | Line 630 cpu_vmemoryread_f(int idx, UINT32 offset |
| goto range_failure; | goto range_failure; |
| } | } |
| addr = sdp->u.seg.segbase + offset; | addr = sdp->u.seg.segbase + offset; |
| check_memory_break_point(addr, 10, CPU_DR7_RW_RO); | |
| if (!CPU_STAT_PAGING) | if (!CPU_STAT_PAGING) |
| return cpu_memoryread_f(addr); | return cpu_memoryread_f(addr); |
| return cpu_linear_memory_read_f(addr, CPU_PAGE_READ_DATA | CPU_PAGE_READ_DATA | CPU_STAT_USER_MODE); | return cpu_linear_memory_read_f(addr, CPU_PAGE_READ_DATA | CPU_PAGE_READ_DATA | CPU_STAT_USER_MODE); |
| Line 694 cpu_vmemorywrite_f(int idx, UINT32 offse | Line 669 cpu_vmemorywrite_f(int idx, UINT32 offse |
| goto range_failure; | goto range_failure; |
| } | } |
| addr = sdp->u.seg.segbase + offset; | addr = sdp->u.seg.segbase + offset; |
| check_memory_break_point(addr, 10, CPU_DR7_RW_RW); | |
| if (!CPU_STAT_PAGING) { | if (!CPU_STAT_PAGING) { |
| cpu_memorywrite_f(addr, value); | cpu_memorywrite_f(addr, value); |
| } else { | } else { |