| version 1.5, 2004/01/23 16:17:51 | version 1.8, 2004/02/03 14:27:07 | 
| Line 112 | Line 112 | 
 | * +-----+-----------+-----+-----+---+ | * +-----+-----------+-----+-----+---+ | 
 | */ | */ | 
 | #if !defined(USE_PAGE_ACCESS_TABLE) | #if !defined(USE_PAGE_ACCESS_TABLE) | 
| static const DWORD page_access = 0xd0cdd0ff; | #define page_access     0xd0ddd0ff | 
 | #else   /* USE_PAGE_ACCESS_TABLE */ | #else   /* USE_PAGE_ACCESS_TABLE */ | 
 | static const BYTE page_access_bit[32] = { | static const BYTE page_access_bit[32] = { | 
 | 1,      /* CR0: n, CPL: s, PTE: s, PTE: r, ope: r */ | 1,      /* CR0: n, CPL: s, PTE: s, PTE: r, ope: r */ | 
| Line 143  static const BYTE page_access_bit[32] = | Line 143  static const BYTE page_access_bit[32] = | 
 | 1,      /* CR0: p, CPL: s, PTE: u, PTE: r, ope: r */ | 1,      /* CR0: p, CPL: s, PTE: u, PTE: r, ope: r */ | 
 | 0,      /* CR0: p, CPL: s, PTE: u, PTE: r, ope: w */ | 0,      /* CR0: p, CPL: s, PTE: u, PTE: r, ope: w */ | 
 | 1,      /* CR0: p, CPL: s, PTE: u, PTE: w, ope: r */ | 1,      /* CR0: p, CPL: s, PTE: u, PTE: w, ope: r */ | 
| 0,      /* CR0: p, CPL: s, PTE: u, PTE: w, ope: w */ | 1,      /* CR0: p, CPL: s, PTE: u, PTE: w, ope: w */ | 
 |  |  | 
 | 0,      /* CR0: p, CPL: u, PTE: s, PTE: r, ope: r */ | 0,      /* CR0: p, CPL: u, PTE: s, PTE: r, ope: r */ | 
 | 0,      /* CR0: p, CPL: u, PTE: s, PTE: r, ope: w */ | 0,      /* CR0: p, CPL: u, PTE: s, PTE: r, ope: w */ | 
| Line 239  cpu_linear_memory_read(DWORD laddr, DWOR | Line 239  cpu_linear_memory_read(DWORD laddr, DWOR | 
 | break; | break; | 
 | } | } | 
 |  |  | 
| if (length == r) | length -= r; | 
|  | if (length == 0) | 
 | break; | break; | 
 |  |  | 
 | laddr += r; | laddr += r; | 
 | length -= r; |  | 
 | remain -= r; | remain -= r; | 
| if (remain <= 0) | if (remain <= 0) { | 
|  | /* next page */ | 
 | remain += 0x1000; | remain += 0x1000; | 
 |  | } | 
 | } | } | 
 |  |  | 
 | return value; | return value; | 
| Line 285  cpu_linear_memory_write(DWORD laddr, DWO | Line 287  cpu_linear_memory_write(DWORD laddr, DWO | 
 | case 3: | case 3: | 
 | cpu_memorywrite_w(paddr, value & 0xffff); | cpu_memorywrite_w(paddr, value & 0xffff); | 
 | value >>= 16; | value >>= 16; | 
| cpu_memorywrite(paddr, value & 0xff); | cpu_memorywrite(paddr + 2, value & 0xff); | 
 | value >>= 8; | value >>= 8; | 
 | break; | break; | 
 |  |  | 
| Line 298  cpu_linear_memory_write(DWORD laddr, DWO | Line 300  cpu_linear_memory_write(DWORD laddr, DWO | 
 | break; | break; | 
 | } | } | 
 |  |  | 
| if (length == r) | length -= r; | 
|  | if (length == 0) | 
 | break; | break; | 
 |  |  | 
 | laddr += r; | laddr += r; | 
 | length -= r; |  | 
 | remain -= r; | remain -= r; | 
| if (remain <= 0) | if (remain <= 0) { | 
|  | /* next page */ | 
 | remain += 0x1000; | remain += 0x1000; | 
 |  | } | 
 | } | } | 
 | } | } | 
 |  |  | 
| Line 327  paging_check(DWORD laddr, DWORD length, | Line 331  paging_check(DWORD laddr, DWORD length, | 
 | paddr = paging(laddr, crw, pl); | paddr = paging(laddr, crw, pl); | 
 |  |  | 
 | r = (remain > length) ? length : remain; | r = (remain > length) ? length : remain; | 
| if (length == r) |  | 
|  | length -= r; | 
|  | if (length == 0) | 
 | break; | break; | 
 |  |  | 
 | laddr += r; | laddr += r; | 
 | length -= r; |  | 
 | remain -= r; | remain -= r; | 
| if (remain <= 0) | if (remain <= 0) { | 
|  | /* next page */ | 
 | remain += 0x1000; | remain += 0x1000; | 
 |  | } | 
 | } | } | 
 | } | } | 
 |  |  | 
| Line 347  paging(DWORD laddr, int crw, int user_mo | Line 354  paging(DWORD laddr, int crw, int user_mo | 
 | DWORD pte_addr; /* page table entry address */ | DWORD pte_addr; /* page table entry address */ | 
 | DWORD pte;      /* page table entry */ | DWORD pte;      /* page table entry */ | 
 | DWORD bit; | DWORD bit; | 
| DWORD err = 0; | DWORD err; | 
 |  |  | 
 | #if defined(IA32_SUPPORT_TLB) | #if defined(IA32_SUPPORT_TLB) | 
 | if (tlb_lookup(laddr, crw, &paddr)) | if (tlb_lookup(laddr, crw, &paddr)) | 
| Line 368  paging(DWORD laddr, int crw, int user_mo | Line 375  paging(DWORD laddr, int crw, int user_mo | 
 | cpu_memorywrite_d(pde_addr, pde); | cpu_memorywrite_d(pde_addr, pde); | 
 | } | } | 
 |  |  | 
 |  | #if CPU_FAMILY >= 5 | 
 | /* no support PAE */ | /* no support PAE */ | 
 | __ASSERT(!(CPU_CR4 & CPU_CR4_PAE)); | __ASSERT(!(CPU_CR4 & CPU_CR4_PAE)); | 
 |  |  | 
| Line 380  paging(DWORD laddr, int crw, int user_mo | Line 388  paging(DWORD laddr, int crw, int user_mo | 
 |  |  | 
 | /* make physical address */ | /* make physical address */ | 
 | paddr = (pde & CPU_PDE_4M_BASEADDR_MASK) | (laddr & 0x003fffff); | paddr = (pde & CPU_PDE_4M_BASEADDR_MASK) | (laddr & 0x003fffff); | 
| } else { | } else | 
|  | #endif  /* CPU_FAMILY >= 5 */ | 
|  | { | 
 | /* 4KB page size */ | /* 4KB page size */ | 
 | pte_addr = (pde & CPU_PDE_BASEADDR_MASK) | ((laddr >> 10) & 0xffc); | pte_addr = (pde & CPU_PDE_BASEADDR_MASK) | ((laddr >> 10) & 0xffc); | 
 | pte = cpu_memoryread_d(pte_addr); | pte = cpu_memoryread_d(pte_addr); |