|
|
| version 1.29, 2007/02/06 14:20:57 | version 1.34, 2011/12/21 18:07:57 |
|---|---|
| Line 1 | Line 1 |
| /* $Id$ */ | |
| /* | /* |
| * Copyright (c) 2003-2004 NONAKA Kimihiro | * Copyright (c) 2003-2004 NONAKA Kimihiro |
| * All rights reserved. | * All rights reserved. |
| Line 30 | Line 28 |
| #include "ia32.mcr" | #include "ia32.mcr" |
| /* | /* |
| * ¡¦¥ì¡£¥·¡¦¥¯¡¦¥æ¡¦¥¥¡¦ö§¥Í¥Û浡¼ | * åãÔ妾å⥯åãÊ夫å㥩åã°æ¥»¶ç¡¢ * |
| * 4-31: ͽÌóºÑ¤ß | * 4-31: äººÑ¤ß |
| * 3: RSVD: 0 = ¥Õ¥©¥ë¥È¤Î¸¶°ø¤ÏͽÌó¥Ó¥Ã¥È°ãÈ¿¤Ç¤Ï¤Ê¤«¤Ã¤¿¡¥ | * 3: RSVD: 0 = ¥Õ¥©¥ë¥È¤Î¸¶°ø¤ÏͽÌó¥Ó¥Ã¥È°ãÈ¿¤Ç¤Ï¤Ê¤«¤Ã¤¿¡¥ |
| * 1 = ¥Ú¡¼¥¸¡¦¥Õ¥©¥ë¥È¤Î¸¶°ø¤Ï¡¤°ãÈ¿¤È¥Þ¡¼¥¯¤µ¤ì¤¿ PTE ¤Þ¤¿¤Ï | * 1 = ¥Ú¡¼¥¸¡¦¥Õ¥©¥ë¥È¤Î¸¶°ø¤Ï¡¤°ãÈ¿¤È¥Þ¡¼¥¯¤µ¤ì¤¿ PTE ¤Þ¤¿¤Ï |
| * PDE ¤ÎͽÌó¥Ó¥Ã¥È°ÌÃ֤Τ¦¤Á°ì¤Ä¤Ç¡¤1 ¤¬¸¡½Ð¤µ¤ì¤¿¤³¤È¤Ç¤¢¤ë¡¥ | * PDE ¤ÎͽÌó¥Ó¥Ã¥È°ÌÃ֤Τ¦¤Á°ì¤Ä¤Ç¡¤1 ¤¬¸¡½Ð¤µ¤ì¤¿¤³¤È¤Ç¤¢¤ë¡¥ |
| * 2: U/S: 0 = ¥Õ¥©¥ë¥È¤Î¸¶°ø¤È¤Ê¤Ã¤¿¥¢¥¯¥»¥¹¤Ï¥×¥í¥»¥Ã¥µ¤¬¥¹¡¼¥Ñ¥Ð¥¤¥¶¡¦ | * 2: U/S: 0 = ¥Õ¥©¥ë¥È¤Î¸¶°ø¤È¤Ê¤Ã¤¿¥¢¥¯¥»¥¹¤Ï¥×¥í¥»¥Ã¥µ¤¬¥¹¡¼¥Ñ¥Ð¥¤¥¶¡¦ |
| * ¥â¡¼¥É¤Ç¼Â¹ÔÃæ¤Ë¹Ô¤ï¤ì¤¿¡¥ | * ¥â¡¼¥É¤Ç¼Â¹ÔÃæ¤Ë¹Ô¤ï¤ì¤¿¡¥ |
| * 1 = ¥Õ¥©¥ë¥È¤Î¸¶°ø¤È¤Ê¤Ã¤¿¥¢¥¯¥»¥¹¤Ï¥×¥í¥»¥Ã¥µ¤¬¥æ¡¼¥¶¡¦¥â¡¼¥É¤Ç | * 1 = ¥Õ¥©¥ë¥È¤Î¸¶°ø¤È¤Ê¤Ã¤¿¥¢¥¯¥»¥¹¤Ï¥×¥í¥»¥Ã¥µ¤¬¥æ¡¼¥¶¡¦¥â¡¼¥É¤Ç |
| * ¼Â¹ÔÃæ¤Ë¹Ô¤ï¤ì¤¿¡¥ | * ¼Â¹ÔÃæ¤Ë¹Ô¤ï¤ì¤¿¡¥ |
| * 1: W/R: 0 = ¥Õ¥©¥ë¥È¤Î¸¶°ø¤È¤Ê¤Ã¤¿¥¢¥¯¥»¥¹¤¬ÆÉ¤ß¼è¤ê¤Ç¤¢¤Ã¤¿¡¥ | * 1: W/R: 0 = ¥Õ¥©¥ë¥È¤Î¸¶°ø¤È¤Ê¤Ã¤¿¥¢¥¯¥»¥¹¤¬ÆÉ¤ß¼è¤ê¤Ç¤¢¤Ã¤¿¡¥ |
| * 1 = ¥Õ¥©¥ë¥È¤Î¸¶°ø¤È¤Ê¤Ã¤¿¥¢¥¯¥»¥¹¤¬½ñ¤¹þ¤ß¤Ç¤¢¤Ã¤¿¡¥ | * 1 = ¥Õ¥©¥ë¥È¤Î¸¶°ø¤È¤Ê¤Ã¤¿¥¢¥¯¥»¥¹¤¬½ñ¤¹þ¤ß¤Ç¤¢¤Ã¤¿¡¥ |
| * 0: P: 0 = ¥Õ¥©¥ë¥È¤Î¸¶°ø¤¬ÉԺߥڡ¼¥¸¤Ç¤¢¤Ã¤¿¡¥ | * 0: P: 0 = ¥Õ¥©¥ë¥È¤Î¸¶°ø¤¬ÉԺߥڡ¼¥¸¤Ç¤¢¤Ã¤¿¡¥ |
| * 1 = ¥Õ¥©¥ë¥È¤Î¸¶°ø¤¬¥Ú¡¼¥¸¡¦¥ì¥Ù¥ëÊݸî°ãÈ¿¤Ç¤¢¤Ã¤¿¡¥ | * 1 = ¥Õ¥©¥ë¥È¤Î¸¶°ø¤¬¥Ú¡¼¥¸¡¦¥ì¥Ù¥ëÊݸî°ãÈ¿¤Ç¤¢¤Ã¤¿¡¥ |
| */ | */ |
| /* | /* |
| * ²¼´¬ 4.12. ¥Ú¡¼¥¸Êݸî¤È¥»¥°¥á¥ó¥ÈÊݸî¤ÎÁȤ߹ç¤ï¤» | * ä¸ 4.12. ¥Ú¡¼¥¸Êݸî¤È¥»¥°¥á¥ó¥ÈÊݸî¤ÎÁȤ߹ç¤ï¤» |
| * ¡Öɽ 4-2. ¥Ú¡¼¥¸¡¦¥Ç¥£¥ì¥¯¥È¥ê¤È¥Ú¡¼¥¸¡¦¥Æ¡¼¥Ö¥ë¤ÎÊݸî¤ÎÁȤ߹ç¤ï¤»¡× | * ¡Öɽ 4-2. ¥Ú¡¼¥¸¡¦¥Ç¥£¥ì¥¯¥È¥ê¤È¥Ú¡¼¥¸¡¦¥Æ¡¼¥Ö¥ë¤ÎÊݸî¤ÎÁȤ߹ç¤ï¤»¡× |
| * | * |
| * +------------+------------+------------+ | * +------------+------------+------------+ |
| * | PDE | PTE | merge | | * | PDE | PTE | merge | |
| Line 73 | Line 71 |
| * | s | rw | s | rw | s | rw | | * | s | rw | s | rw | s | rw | |
| * +-----+------+-----+------+-----+------+ | * +-----+------+-----+------+-----+------+ |
| * | * |
| * ¡Ö¥£ rw/p : CR0 ¡¢¥Û WP ¡¦¥â¡¦¥Æ¡¦¥Í¡¢¥ã ON ¡¢¥Û¥»ø»î¦¥Ò¡¢¥Þ ro | * ãॵ rw/p : CR0 åá¥ç WP åãÆå¥ãåã°å¡ì ON åá¥çꢥ¨éð°å¢åá¥Ã ro |
| */ | */ |
| /* | /* |
| * ¡¦â§ä§ô§¡Ö¡¦¥Ã¡¦¥µ¡¦¥±/PxE(¥»ê·¥å¥µ¥¤¥»¥Í)/CPL/CR0 ¡¢¥Í¡¦¥ì¡£¥·¡¦¥¯¡¦¡Ö¡¦¥Ã¡¦¥µ¡¦¥±¥¯¡Ö¡¢¥Û¥¨¥ê¥¥¯ | * åã¡£åã¡Öå㥧åâ¡Öåâ¥Ãå⥵å⥱/PxE(躴ꥣÐç½âí奡)/CPL/CR0 åᥣåãÔ妾å⥯åâ¡Öåâ¥Ãå⥵å⥱쪥¥åá¥çñö¡ÖèÁ * |
| * +-----+-----+-----+-----+-----+---+ | * +-----+-----+-----+-----+-----+---+ |
| * | CR0 | CPL | PxE | PxE | ope | | | * | CR0 | CPL | PxE | PxE | ope | | |
| Line 157 static const UINT8 page_access_bit[32] = | Line 155 static const UINT8 page_access_bit[32] = |
| /* | /* |
| *-- | *-- |
| * 32bit ʪÍý¥¢¥É¥ì¥¹ 4k ¥Ú¡¼¥¸ | * 32bit í饥íð¬å¤¤åã²å¦®å⥱ 4k åãÔ妾å⥯ |
| * | * |
| * ¡¦ô§¥Ò¡¦¡Ö¡£¥ò¡¦¡Ö¡¦¥Î¡¦ø§¥± | * å㥧åã¶å¤¤å㥵åâ¡Öåã²å¦®å⥱ |
| * 31 22 21 12 11 0 | * 31 22 21 12 11 0 |
| * +------------------------+----------------------+--------------------------+ | * +------------------------+----------------------+--------------------------+ |
| * | ¡¦¥ì¡£¥·¡¦¥¯¡£¥ò¡¦¥Ì¡¦¡×¡¦ø§¥Ã¡¦¥Í¡¦ | ¥Ú¡¼¥¸¡¦¥Æ¡¼¥Ö¥ë | ¥ª¥Õ¥»¥Ã¥È | | * | åãÔ妾å⥯å㥵åã®å¤¥åã¥ãåâ¥Ãåã°å¦¬ | åãÔ妾å⥯å㥵åã¬å¦¾åãÌå¦ | å⥧åãÊ夽åã¦å¥è | |
| * +------------------------+----------------------+--------------------------+ | * +------------------------+----------------------+--------------------------+ |
| * | | | | * | | | |
| * +-----------+ +-----------+ +----------+ | * +-----------+ +-----------+ +----------+ |
| * | | | | * | | | |
| * | ¡¦¥ì¡£¥·¡¦¥¯¡£¥ò¡¦¥Ì¡¦¡×¡¦ø§¥Ã¡¦¥Í¡¦ | ¥Ú¡¼¥¸¡¦¥Æ¡¼¥Ö¥ë ¥Ú¡¼¥¸ | | * | ¥Ú¡¼¥¸¡¦¥Ç¥£¥ì¥¯¥È¥ê | ¥Ú¡¼¥¸¡¦¥Æ¡¼¥Ö¥ë ¥Ú¡¼¥¸ | |
| * | +--------------------+ | +-------------------+ +------------------+ | | * | +--------------------+ | +-------------------+ +------------------+ | |
| * | | | | | | | | | | * | | | | | | | | | |
| * | | | | +-------------------+ | | | | * | | | | +-------------------+ | | | |
| Line 179 static const UINT8 page_access_bit[32] = | Line 177 static const UINT8 page_access_bit[32] = |
| * | | | | | | | | | * | | | | | | | | |
| * +>+--------------------+ +>+-------------------+ +>+------------------+ | * +>+--------------------+ +>+-------------------+ +>+------------------+ |
| * | | * | |
| * +- CR3() | * +- CR3(ʪÍý¥¢¥É¥ì¥¹) |
| */ | */ |
| static UINT32 MEMCALL paging(const UINT32 laddr, const int ucrw); | static UINT32 MEMCALL paging(const UINT32 laddr, const int ucrw); |
| #if defined(IA32_SUPPORT_TLB) | |
| static void MEMCALL tlb_update(const UINT32 laddr, const UINT entry, const int ucrw); | static void MEMCALL tlb_update(const UINT32 laddr, const UINT entry, const int ucrw); |
| #endif | |
| #define PAGE_SIZE 0x1000 | |
| #define PAGE_MASK (PAGE_SIZE - 1) | |
| UINT8 MEMCALL | UINT8 MEMCALL |
| cpu_memory_access_la_RMW_b(UINT32 laddr, UINT32 (*func)(UINT32, void *), void *arg) | cpu_memory_access_la_RMW_b(UINT32 laddr, UINT32 (*func)(UINT32, void *), void *arg) |
| { | { |
| const int ucrw = CPU_PAGE_WRITE|CPU_PAGE_DATA|CPU_STAT_USER_MODE; | const int ucrw = CPU_PAGE_WRITE_DATA|CPU_STAT_USER_MODE; |
| UINT32 result, value; | UINT32 result, value; |
| UINT32 paddr; | UINT32 paddr; |
| Line 205 cpu_memory_access_la_RMW_b(UINT32 laddr, | Line 204 cpu_memory_access_la_RMW_b(UINT32 laddr, |
| UINT16 MEMCALL | UINT16 MEMCALL |
| cpu_memory_access_la_RMW_w(UINT32 laddr, UINT32 (*func)(UINT32, void *), void *arg) | cpu_memory_access_la_RMW_w(UINT32 laddr, UINT32 (*func)(UINT32, void *), void *arg) |
| { | { |
| const int ucrw = CPU_PAGE_WRITE|CPU_PAGE_DATA|CPU_STAT_USER_MODE; | const int ucrw = CPU_PAGE_WRITE_DATA|CPU_STAT_USER_MODE; |
| UINT32 result, value; | UINT32 result, value; |
| UINT32 paddr[2]; | UINT32 paddr[2]; |
| paddr[0] = paging(laddr, ucrw); | paddr[0] = paging(laddr, ucrw); |
| if ((laddr + 1) & 0x00000fff) { | if ((laddr + 1) & PAGE_MASK) { |
| value = cpu_memoryread_w(paddr[0]); | value = cpu_memoryread_w(paddr[0]); |
| result = (*func)(value, arg); | result = (*func)(value, arg); |
| cpu_memorywrite_w(paddr[0], (UINT16)result); | cpu_memorywrite_w(paddr[0], (UINT16)result); |
| Line 228 cpu_memory_access_la_RMW_w(UINT32 laddr, | Line 227 cpu_memory_access_la_RMW_w(UINT32 laddr, |
| UINT32 MEMCALL | UINT32 MEMCALL |
| cpu_memory_access_la_RMW_d(UINT32 laddr, UINT32 (*func)(UINT32, void *), void *arg) | cpu_memory_access_la_RMW_d(UINT32 laddr, UINT32 (*func)(UINT32, void *), void *arg) |
| { | { |
| const int ucrw = CPU_PAGE_WRITE|CPU_PAGE_DATA|CPU_STAT_USER_MODE; | const int ucrw = CPU_PAGE_WRITE_DATA|CPU_STAT_USER_MODE; |
| UINT32 result, value; | UINT32 result, value; |
| UINT32 paddr[2]; | UINT32 paddr[2]; |
| UINT remain; | UINT remain; |
| paddr[0] = paging(laddr, ucrw); | paddr[0] = paging(laddr, ucrw); |
| remain = 0x1000 - (laddr & 0x00000fff); | remain = PAGE_SIZE - (laddr & PAGE_MASK); |
| if (remain >= 4) { | if (remain >= 4) { |
| value = cpu_memoryread_d(paddr[0]); | value = cpu_memoryread_d(paddr[0]); |
| result = (*func)(value, arg); | result = (*func)(value, arg); |
| Line 294 cpu_linear_memory_read_w(UINT32 laddr, c | Line 293 cpu_linear_memory_read_w(UINT32 laddr, c |
| UINT16 value; | UINT16 value; |
| paddr[0] = paging(laddr, ucrw); | paddr[0] = paging(laddr, ucrw); |
| if ((laddr + 1) & 0x00000fff) { | if ((laddr + 1) & PAGE_MASK) { |
| return cpu_memoryread_w(paddr[0]); | return cpu_memoryread_w(paddr[0]); |
| } else { | } else { |
| paddr[1] = paging(laddr + 1, ucrw); | paddr[1] = paging(laddr + 1, ucrw); |
| Line 312 cpu_linear_memory_read_d(UINT32 laddr, c | Line 311 cpu_linear_memory_read_d(UINT32 laddr, c |
| UINT remain; | UINT remain; |
| paddr[0] = paging(laddr, ucrw); | paddr[0] = paging(laddr, ucrw); |
| remain = 0x1000 - (laddr & 0x00000fff); | remain = PAGE_SIZE - (laddr & PAGE_MASK); |
| if (remain >= 4) { | if (remain >= 4) { |
| return cpu_memoryread_d(paddr[0]); | return cpu_memoryread_d(paddr[0]); |
| } else { | } else { |
| Line 352 cpu_linear_memory_read_q(UINT32 laddr, c | Line 351 cpu_linear_memory_read_q(UINT32 laddr, c |
| UINT remain; | UINT remain; |
| paddr[0] = paging(laddr, ucrw); | paddr[0] = paging(laddr, ucrw); |
| remain = 0x1000 - (laddr & 0x00000fff); | remain = PAGE_SIZE - (laddr & PAGE_MASK); |
| if (remain >= 8) { | if (remain >= 8) { |
| return cpu_memoryread_q(paddr[0]); | return cpu_memoryread_q(paddr[0]); |
| } else { | } else { |
| Line 375 cpu_linear_memory_read_q(UINT32 laddr, c | Line 374 cpu_linear_memory_read_q(UINT32 laddr, c |
| value = cpu_memoryread(paddr[0]); | value = cpu_memoryread(paddr[0]); |
| value += (UINT64)cpu_memoryread_d(paddr[0] + 1) << 8; | value += (UINT64)cpu_memoryread_d(paddr[0] + 1) << 8; |
| value += (UINT64)cpu_memoryread_w(paddr[1]) << 40; | value += (UINT64)cpu_memoryread_w(paddr[1]) << 40; |
| value += (UINT64)cpu_memoryread(paddr[1] + 1) << 56; | value += (UINT64)cpu_memoryread(paddr[1] + 2) << 56; |
| break; | break; |
| case 4: | case 4: |
| Line 421 cpu_linear_memory_read_f(UINT32 laddr, c | Line 420 cpu_linear_memory_read_f(UINT32 laddr, c |
| UINT i, j; | UINT i, j; |
| paddr[0] = paging(laddr, ucrw); | paddr[0] = paging(laddr, ucrw); |
| remain = 0x1000 - (laddr & 0x00000fff); | remain = PAGE_SIZE - (laddr & PAGE_MASK); |
| if (remain >= 10) { | if (remain >= 10) { |
| return cpu_memoryread_f(paddr[0]); | return cpu_memoryread_f(paddr[0]); |
| } else { | } else { |
| Line 439 cpu_linear_memory_read_f(UINT32 laddr, c | Line 438 cpu_linear_memory_read_f(UINT32 laddr, c |
| void MEMCALL | void MEMCALL |
| cpu_linear_memory_write_b(UINT32 laddr, UINT8 value, const int user_mode) | cpu_linear_memory_write_b(UINT32 laddr, UINT8 value, const int user_mode) |
| { | { |
| const int ucrw = CPU_PAGE_WRITE|CPU_PAGE_DATA|user_mode; | const int ucrw = CPU_PAGE_WRITE_DATA|user_mode; |
| UINT32 paddr; | UINT32 paddr; |
| paddr = paging(laddr, ucrw); | paddr = paging(laddr, ucrw); |
| Line 449 cpu_linear_memory_write_b(UINT32 laddr, | Line 448 cpu_linear_memory_write_b(UINT32 laddr, |
| void MEMCALL | void MEMCALL |
| cpu_linear_memory_write_w(UINT32 laddr, UINT16 value, const int user_mode) | cpu_linear_memory_write_w(UINT32 laddr, UINT16 value, const int user_mode) |
| { | { |
| const int ucrw = CPU_PAGE_WRITE|CPU_PAGE_DATA|user_mode; | const int ucrw = CPU_PAGE_WRITE_DATA|user_mode; |
| UINT32 paddr[2]; | UINT32 paddr[2]; |
| paddr[0] = paging(laddr, ucrw); | paddr[0] = paging(laddr, ucrw); |
| if ((laddr + 1) & 0x00000fff) { | if ((laddr + 1) & PAGE_MASK) { |
| cpu_memorywrite_w(paddr[0], value); | cpu_memorywrite_w(paddr[0], value); |
| } else { | } else { |
| paddr[1] = paging(laddr + 1, ucrw); | paddr[1] = paging(laddr + 1, ucrw); |
| Line 465 cpu_linear_memory_write_w(UINT32 laddr, | Line 464 cpu_linear_memory_write_w(UINT32 laddr, |
| void MEMCALL | void MEMCALL |
| cpu_linear_memory_write_d(UINT32 laddr, UINT32 value, const int user_mode) | cpu_linear_memory_write_d(UINT32 laddr, UINT32 value, const int user_mode) |
| { | { |
| const int ucrw = CPU_PAGE_WRITE|CPU_PAGE_DATA|user_mode; | const int ucrw = CPU_PAGE_WRITE_DATA|user_mode; |
| UINT32 paddr[2]; | UINT32 paddr[2]; |
| UINT remain; | UINT remain; |
| paddr[0] = paging(laddr, ucrw); | paddr[0] = paging(laddr, ucrw); |
| remain = 0x1000 - (laddr & 0x00000fff); | remain = PAGE_SIZE - (laddr & PAGE_MASK); |
| if (remain >= 4) { | if (remain >= 4) { |
| cpu_memorywrite_d(paddr[0], value); | cpu_memorywrite_d(paddr[0], value); |
| } else { | } else { |
| Line 499 cpu_linear_memory_write_d(UINT32 laddr, | Line 498 cpu_linear_memory_write_d(UINT32 laddr, |
| void MEMCALL | void MEMCALL |
| cpu_linear_memory_write_q(UINT32 laddr, UINT64 value, const int user_mode) | cpu_linear_memory_write_q(UINT32 laddr, UINT64 value, const int user_mode) |
| { | { |
| const int ucrw = CPU_PAGE_WRITE|CPU_PAGE_DATA|user_mode; | const int ucrw = CPU_PAGE_WRITE_DATA|user_mode; |
| UINT32 paddr[2]; | UINT32 paddr[2]; |
| UINT remain; | UINT remain; |
| paddr[0] = paging(laddr, ucrw); | paddr[0] = paging(laddr, ucrw); |
| remain = 0x1000 - (laddr & 0x00000fff); | remain = PAGE_SIZE - (laddr & PAGE_MASK); |
| if (remain >= 8) { | if (remain >= 8) { |
| cpu_memorywrite_q(paddr[0], value); | cpu_memorywrite_q(paddr[0], value); |
| } else { | } else { |
| Line 518 cpu_linear_memory_write_q(UINT32 laddr, | Line 517 cpu_linear_memory_write_q(UINT32 laddr, |
| break; | break; |
| case 6: | case 6: |
| cpu_memorywrite_w(paddr[0], (UINT16)value); | |
| cpu_memorywrite_d(paddr[0] + 2, (UINT32)(value >> 16)); | cpu_memorywrite_d(paddr[0] + 2, (UINT32)(value >> 16)); |
| cpu_memorywrite_w(paddr[1], (UINT16)(value >> 48)); | cpu_memorywrite_w(paddr[1], (UINT16)(value >> 48)); |
| break; | break; |
| Line 560 cpu_linear_memory_write_q(UINT32 laddr, | Line 560 cpu_linear_memory_write_q(UINT32 laddr, |
| void MEMCALL | void MEMCALL |
| cpu_linear_memory_write_f(UINT32 laddr, const REG80 *value, const int user_mode) | cpu_linear_memory_write_f(UINT32 laddr, const REG80 *value, const int user_mode) |
| { | { |
| const int ucrw = CPU_PAGE_WRITE|CPU_PAGE_DATA|user_mode; | const int ucrw = CPU_PAGE_WRITE_DATA|user_mode; |
| UINT32 paddr[2]; | UINT32 paddr[2]; |
| UINT remain; | UINT remain; |
| UINT i, j; | UINT i, j; |
| paddr[0] = paging(laddr, ucrw); | paddr[0] = paging(laddr, ucrw); |
| remain = 0x1000 - (laddr & 0x00000fff); | remain = PAGE_SIZE - (laddr & PAGE_MASK); |
| if (remain >= 10) { | if (remain >= 10) { |
| cpu_memorywrite_f(paddr[0], value); | cpu_memorywrite_f(paddr[0], value); |
| } else { | } else { |
| Line 582 cpu_linear_memory_write_f(UINT32 laddr, | Line 582 cpu_linear_memory_write_f(UINT32 laddr, |
| void MEMCALL | void MEMCALL |
| cpu_memory_access_la_region(UINT32 laddr, UINT length, const int ucrw, BYTE *data) | cpu_memory_access_la_region(UINT32 laddr, UINT length, const int ucrw, UINT8 *data) |
| { | { |
| UINT32 paddr; | UINT32 paddr; |
| UINT remain; /* page remain */ | UINT remain; /* page remain */ |
| Line 591 cpu_memory_access_la_region(UINT32 laddr | Line 591 cpu_memory_access_la_region(UINT32 laddr |
| if (length == 0) | if (length == 0) |
| return; | return; |
| remain = 0x1000 - (laddr & 0x00000fff); | remain = PAGE_SIZE - (laddr & PAGE_MASK); |
| for (;;) { | for (;;) { |
| if (!CPU_STAT_PAGING) { | if (!CPU_STAT_PAGING) { |
| paddr = laddr; | paddr = laddr; |
| Line 615 cpu_memory_access_la_region(UINT32 laddr | Line 615 cpu_memory_access_la_region(UINT32 laddr |
| remain -= r; | remain -= r; |
| if (remain <= 0) { | if (remain <= 0) { |
| /* next page */ | /* next page */ |
| remain += 0x1000; | remain += PAGE_SIZE; |
| } | } |
| } | } |
| } | } |
| void MEMCALL | UINT32 MEMCALL |
| paging_check(UINT32 laddr, UINT length, const int ucrw) | laddr2paddr(const UINT32 laddr, const int ucrw) |
| { | { |
| UINT32 paddr; | |
| UINT remain; /* page remain */ | |
| UINT r; | |
| remain = 0x1000 - (laddr & 0x00000fff); | |
| for (;;) { | |
| paddr = paging(laddr, ucrw); | |
| r = (remain > length) ? length : remain; | return paging(laddr, ucrw); |
| length -= r; | |
| if (length == 0) | |
| break; | |
| laddr += r; | |
| remain -= r; | |
| if (remain <= 0) { | |
| /* next page */ | |
| remain += 0x1000; | |
| } | |
| } | |
| } | } |
| static UINT32 MEMCALL | static UINT32 MEMCALL |
| Line 656 paging(const UINT32 laddr, const int ucr | Line 637 paging(const UINT32 laddr, const int ucr |
| UINT32 pte; /* page table entry */ | UINT32 pte; /* page table entry */ |
| UINT bit; | UINT bit; |
| UINT err; | UINT err; |
| #if defined(IA32_SUPPORT_TLB) | |
| TLB_ENTRY_T *ep; | TLB_ENTRY_T *ep; |
| ep = tlb_lookup(laddr, ucrw); | ep = tlb_lookup(laddr, ucrw); |
| if (ep != NULL) | if (ep != NULL) |
| return ep->paddr + (laddr & 0xfff); | return ep->paddr + (laddr & PAGE_MASK); |
| #endif | |
| pde_addr = CPU_STAT_PDE_BASE + ((laddr >> 20) & 0xffc); | pde_addr = CPU_STAT_PDE_BASE + ((laddr >> 20) & 0xffc); |
| pde = cpu_memoryread_d(pde_addr); | pde = cpu_memoryread_d(pde_addr); |
| Line 693 paging(const UINT32 laddr, const int ucr | Line 672 paging(const UINT32 laddr, const int ucr |
| } | } |
| /* make physical address */ | /* make physical address */ |
| paddr = (pte & CPU_PTE_BASEADDR_MASK) + (laddr & 0x00000fff); | paddr = (pte & CPU_PTE_BASEADDR_MASK) + (laddr & PAGE_MASK); |
| bit = ucrw & (CPU_PAGE_WRITE|CPU_PAGE_USER_MODE); | bit = ucrw & (CPU_PAGE_WRITE|CPU_PAGE_USER_MODE); |
| bit |= (pde & pte & (CPU_PTE_WRITABLE|CPU_PTE_USER_MODE)); | bit |= (pde & pte & (CPU_PTE_WRITABLE|CPU_PTE_USER_MODE)); |
| Line 718 paging(const UINT32 laddr, const int ucr | Line 697 paging(const UINT32 laddr, const int ucr |
| cpu_memorywrite_d(pte_addr, pte); | cpu_memorywrite_d(pte_addr, pte); |
| } | } |
| #if defined(IA32_SUPPORT_TLB) | |
| tlb_update(laddr, pte, (bit & (CPU_PTE_WRITABLE|CPU_PTE_USER_MODE)) + ((ucrw & CPU_PAGE_CODE) >> 1)); | tlb_update(laddr, pte, (bit & (CPU_PTE_WRITABLE|CPU_PTE_USER_MODE)) + ((ucrw & CPU_PAGE_CODE) >> 1)); |
| #endif | |
| return paddr; | return paddr; |
| pf_exception: | pf_exception: |
| Line 731 pf_exception: | Line 709 pf_exception: |
| return 0; /* compiler happy */ | return 0; /* compiler happy */ |
| } | } |
| #if defined(IA32_SUPPORT_TLB) | |
| /* | /* |
| * TLB | * TLB |
| */ | */ |
| Line 758 do { \ | Line 734 do { \ |
| #if (CPU_FEATURES & CPU_FEATURE_PGE) == CPU_FEATURE_PGE | #if (CPU_FEATURES & CPU_FEATURE_PGE) == CPU_FEATURE_PGE |
| #define TLB_IS_GLOBAL(ep) ((ep)->tag & TLB_ENTRY_TAG_GLOBAL) | #define TLB_IS_GLOBAL(ep) ((ep)->tag & TLB_ENTRY_TAG_GLOBAL) |
| #else | #else |
| #define TLB_IS_GLOBAL(ep) FALSE | #define TLB_IS_GLOBAL(ep) 0 |
| #endif | #endif |
| #define TLB_SET_TAG_FLAGS(ep, entry, bit) \ | #define TLB_SET_TAG_FLAGS(ep, entry, bit) \ |
| Line 804 tlb_init(void) | Line 780 tlb_init(void) |
| memset(tlb, 0, sizeof(tlb)); | memset(tlb, 0, sizeof(tlb)); |
| #if defined(IA32_PROFILE_TLB) | #if defined(IA32_PROFILE_TLB) |
| memset(tlb_profile, 0, sizeof(tlb_profile)); | memset(&tlb_profile, 0, sizeof(tlb_profile)); |
| #endif /* IA32_PROFILE_TLB */ | #endif /* IA32_PROFILE_TLB */ |
| } | } |
| Line 921 tlb_update(const UINT32 laddr, const UIN | Line 897 tlb_update(const UINT32 laddr, const UIN |
| } | } |
| ep->memp = NULL; | ep->memp = NULL; |
| } | } |
| #endif /* IA32_SUPPORT_TLB */ |