assembly soft MMU defines on i386
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@524 c046a42c-6fe2-441c-8c8c-71466251a162
This commit is contained in:
		
							parent
							
								
									8351d2d481
								
							
						
					
					
						commit
						e16c53fabb
					
				
							
								
								
									
										150
									
								
								softmmu_header.h
									
									
									
									
									
								
							
							
						
						
									
										150
									
								
								softmmu_header.h
									
									
									
									
									
								
							@ -74,6 +74,152 @@ DATA_TYPE REGPARM(1) glue(glue(__ld, SUFFIX), MMUSUFFIX)(unsigned long addr,
 | 
				
			|||||||
                                                         int is_user);
 | 
					                                                         int is_user);
 | 
				
			||||||
void REGPARM(2) glue(glue(__st, SUFFIX), MMUSUFFIX)(unsigned long addr, DATA_TYPE v, int is_user);
 | 
					void REGPARM(2) glue(glue(__st, SUFFIX), MMUSUFFIX)(unsigned long addr, DATA_TYPE v, int is_user);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if (DATA_SIZE <= 4) && defined(__i386__) && (ACCESS_TYPE <= 1) && defined(ASM_SOFTMMU)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static inline RES_TYPE glue(glue(ld, USUFFIX), MEMSUFFIX)(void *ptr)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    int res;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    asm volatile ("movl %1, %%edx\n"
 | 
				
			||||||
 | 
					                  "movl %1, %%eax\n"
 | 
				
			||||||
 | 
					                  "shrl %3, %%edx\n"
 | 
				
			||||||
 | 
					                  "andl %4, %%eax\n"
 | 
				
			||||||
 | 
					                  "andl %2, %%edx\n"
 | 
				
			||||||
 | 
					                  "leal %5(%%edx, %%ebp), %%edx\n"
 | 
				
			||||||
 | 
					                  "cmpl (%%edx), %%eax\n"
 | 
				
			||||||
 | 
					                  "movl %1, %%eax\n"
 | 
				
			||||||
 | 
					                  "je 1f\n"
 | 
				
			||||||
 | 
					                  "pushl %6\n"
 | 
				
			||||||
 | 
					                  "call %7\n"
 | 
				
			||||||
 | 
					                  "popl %%edx\n"
 | 
				
			||||||
 | 
					                  "movl %%eax, %0\n"
 | 
				
			||||||
 | 
					                  "jmp 2f\n"
 | 
				
			||||||
 | 
					                  "1:\n"
 | 
				
			||||||
 | 
					                  "addl 4(%%edx), %%eax\n"
 | 
				
			||||||
 | 
					#if DATA_SIZE == 1
 | 
				
			||||||
 | 
					                  "movzbl (%%eax), %0\n"
 | 
				
			||||||
 | 
					#elif DATA_SIZE == 2
 | 
				
			||||||
 | 
					                  "movzwl (%%eax), %0\n"
 | 
				
			||||||
 | 
					#elif DATA_SIZE == 4
 | 
				
			||||||
 | 
					                  "movl (%%eax), %0\n"
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					#error unsupported size
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					                  "2:\n"
 | 
				
			||||||
 | 
					                  : "=r" (res)
 | 
				
			||||||
 | 
					                  : "r" (ptr), 
 | 
				
			||||||
 | 
					                  "i" ((CPU_TLB_SIZE - 1) << 3), 
 | 
				
			||||||
 | 
					                  "i" (TARGET_PAGE_BITS - 3), 
 | 
				
			||||||
 | 
					                  "i" (TARGET_PAGE_MASK | (DATA_SIZE - 1)),
 | 
				
			||||||
 | 
					                  "m" (*(uint32_t *)offsetof(CPUState, tlb_read[CPU_MEM_INDEX][0].address)),
 | 
				
			||||||
 | 
					                  "i" (CPU_MEM_INDEX),
 | 
				
			||||||
 | 
					                  "m" (*(uint8_t *)&glue(glue(__ld, SUFFIX), MMUSUFFIX))
 | 
				
			||||||
 | 
					                  : "%eax", "%ecx", "%edx", "memory", "cc");
 | 
				
			||||||
 | 
					    return res;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if DATA_SIZE <= 2
 | 
				
			||||||
 | 
					static inline int glue(glue(lds, SUFFIX), MEMSUFFIX)(void *ptr)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    int res;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    asm volatile ("movl %1, %%edx\n"
 | 
				
			||||||
 | 
					                  "movl %1, %%eax\n"
 | 
				
			||||||
 | 
					                  "shrl %3, %%edx\n"
 | 
				
			||||||
 | 
					                  "andl %4, %%eax\n"
 | 
				
			||||||
 | 
					                  "andl %2, %%edx\n"
 | 
				
			||||||
 | 
					                  "leal %5(%%edx, %%ebp), %%edx\n"
 | 
				
			||||||
 | 
					                  "cmpl (%%edx), %%eax\n"
 | 
				
			||||||
 | 
					                  "movl %1, %%eax\n"
 | 
				
			||||||
 | 
					                  "je 1f\n"
 | 
				
			||||||
 | 
					                  "pushl %6\n"
 | 
				
			||||||
 | 
					                  "call %7\n"
 | 
				
			||||||
 | 
					                  "popl %%edx\n"
 | 
				
			||||||
 | 
					#if DATA_SIZE == 1
 | 
				
			||||||
 | 
					                  "movsbl %%al, %0\n"
 | 
				
			||||||
 | 
					#elif DATA_SIZE == 2
 | 
				
			||||||
 | 
					                  "movswl %%ax, %0\n"
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					#error unsupported size
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					                  "jmp 2f\n"
 | 
				
			||||||
 | 
					                  "1:\n"
 | 
				
			||||||
 | 
					                  "addl 4(%%edx), %%eax\n"
 | 
				
			||||||
 | 
					#if DATA_SIZE == 1
 | 
				
			||||||
 | 
					                  "movsbl (%%eax), %0\n"
 | 
				
			||||||
 | 
					#elif DATA_SIZE == 2
 | 
				
			||||||
 | 
					                  "movswl (%%eax), %0\n"
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					#error unsupported size
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					                  "2:\n"
 | 
				
			||||||
 | 
					                  : "=r" (res)
 | 
				
			||||||
 | 
					                  : "r" (ptr), 
 | 
				
			||||||
 | 
					                  "i" ((CPU_TLB_SIZE - 1) << 3), 
 | 
				
			||||||
 | 
					                  "i" (TARGET_PAGE_BITS - 3), 
 | 
				
			||||||
 | 
					                  "i" (TARGET_PAGE_MASK | (DATA_SIZE - 1)),
 | 
				
			||||||
 | 
					                  "m" (*(uint32_t *)offsetof(CPUState, tlb_read[CPU_MEM_INDEX][0].address)),
 | 
				
			||||||
 | 
					                  "i" (CPU_MEM_INDEX),
 | 
				
			||||||
 | 
					                  "m" (*(uint8_t *)&glue(glue(__ld, SUFFIX), MMUSUFFIX))
 | 
				
			||||||
 | 
					                  : "%eax", "%ecx", "%edx", "memory", "cc");
 | 
				
			||||||
 | 
					    return res;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static inline void glue(glue(st, SUFFIX), MEMSUFFIX)(void *ptr, RES_TYPE v)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    asm volatile ("movl %0, %%edx\n"
 | 
				
			||||||
 | 
					                  "movl %0, %%eax\n"
 | 
				
			||||||
 | 
					                  "shrl %3, %%edx\n"
 | 
				
			||||||
 | 
					                  "andl %4, %%eax\n"
 | 
				
			||||||
 | 
					                  "andl %2, %%edx\n"
 | 
				
			||||||
 | 
					                  "leal %5(%%edx, %%ebp), %%edx\n"
 | 
				
			||||||
 | 
					                  "cmpl (%%edx), %%eax\n"
 | 
				
			||||||
 | 
					                  "movl %0, %%eax\n"
 | 
				
			||||||
 | 
					                  "je 1f\n"
 | 
				
			||||||
 | 
					#if DATA_SIZE == 1
 | 
				
			||||||
 | 
					                  "movzbl %b1, %%edx\n"
 | 
				
			||||||
 | 
					#elif DATA_SIZE == 2
 | 
				
			||||||
 | 
					                  "movzwl %w1, %%edx\n"
 | 
				
			||||||
 | 
					#elif DATA_SIZE == 4
 | 
				
			||||||
 | 
					                  "movl %1, %%edx\n"
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					#error unsupported size
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					                  "pushl %6\n"
 | 
				
			||||||
 | 
					                  "call %7\n"
 | 
				
			||||||
 | 
					                  "popl %%eax\n"
 | 
				
			||||||
 | 
					                  "jmp 2f\n"
 | 
				
			||||||
 | 
					                  "1:\n"
 | 
				
			||||||
 | 
					                  "addl 4(%%edx), %%eax\n"
 | 
				
			||||||
 | 
					#if DATA_SIZE == 1
 | 
				
			||||||
 | 
					                  "movb %b1, (%%eax)\n"
 | 
				
			||||||
 | 
					#elif DATA_SIZE == 2
 | 
				
			||||||
 | 
					                  "movw %w1, (%%eax)\n"
 | 
				
			||||||
 | 
					#elif DATA_SIZE == 4
 | 
				
			||||||
 | 
					                  "movl %1, (%%eax)\n"
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					#error unsupported size
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					                  "2:\n"
 | 
				
			||||||
 | 
					                  : 
 | 
				
			||||||
 | 
					                  : "r" (ptr), 
 | 
				
			||||||
 | 
					/* NOTE: 'q' would be needed as constraint, but we could not use it
 | 
				
			||||||
 | 
					   with T1 ! */
 | 
				
			||||||
 | 
					                  "r" (v), 
 | 
				
			||||||
 | 
					                  "i" ((CPU_TLB_SIZE - 1) << 3), 
 | 
				
			||||||
 | 
					                  "i" (TARGET_PAGE_BITS - 3), 
 | 
				
			||||||
 | 
					                  "i" (TARGET_PAGE_MASK | (DATA_SIZE - 1)),
 | 
				
			||||||
 | 
					                  "m" (*(uint32_t *)offsetof(CPUState, tlb_write[CPU_MEM_INDEX][0].address)),
 | 
				
			||||||
 | 
					                  "i" (CPU_MEM_INDEX),
 | 
				
			||||||
 | 
					                  "m" (*(uint8_t *)&glue(glue(__st, SUFFIX), MMUSUFFIX))
 | 
				
			||||||
 | 
					                  : "%eax", "%ecx", "%edx", "memory", "cc");
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* generic load/store macros */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static inline RES_TYPE glue(glue(ld, USUFFIX), MEMSUFFIX)(void *ptr)
 | 
					static inline RES_TYPE glue(glue(ld, USUFFIX), MEMSUFFIX)(void *ptr)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    int index;
 | 
					    int index;
 | 
				
			||||||
@ -115,6 +261,8 @@ static inline int glue(glue(lds, SUFFIX), MEMSUFFIX)(void *ptr)
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* generic store macro */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static inline void glue(glue(st, SUFFIX), MEMSUFFIX)(void *ptr, RES_TYPE v)
 | 
					static inline void glue(glue(st, SUFFIX), MEMSUFFIX)(void *ptr, RES_TYPE v)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    int index;
 | 
					    int index;
 | 
				
			||||||
@ -133,6 +281,8 @@ static inline void glue(glue(st, SUFFIX), MEMSUFFIX)(void *ptr, RES_TYPE v)
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#undef RES_TYPE
 | 
					#undef RES_TYPE
 | 
				
			||||||
#undef DATA_TYPE
 | 
					#undef DATA_TYPE
 | 
				
			||||||
#undef DATA_STYPE
 | 
					#undef DATA_STYPE
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user