Commit d656469f44aa541b1e2ca4019fef101b60557aac

Authored by bellard
1 parent 0019ad53

use simpler REGPARM convention - make CPUTLBEntry size a power of two


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3935 c046a42c-6fe2-441c-8c8c-71466251a162
cpu-defs.h
... ... @@ -102,6 +102,12 @@ typedef unsigned long ram_addr_t;
102 102 #define CPU_TLB_BITS 8
103 103 #define CPU_TLB_SIZE (1 << CPU_TLB_BITS)
104 104  
  105 +#if TARGET_PHYS_ADDR_BITS == 32 && TARGET_LONG_BITS == 32
  106 +#define CPU_TLB_ENTRY_BITS 4
  107 +#else
  108 +#define CPU_TLB_ENTRY_BITS 5
  109 +#endif
  110 +
105 111 typedef struct CPUTLBEntry {
106 112 /* bit 31 to TARGET_PAGE_BITS : virtual address
107 113 bit TARGET_PAGE_BITS-1..IO_MEM_SHIFT : if non zero, memory io
... ... @@ -113,7 +119,17 @@ typedef struct CPUTLBEntry {
113 119 target_ulong addr_write;
114 120 target_ulong addr_code;
115 121 /* addend to virtual address to get physical address */
  122 +#if TARGET_PHYS_ADDR_BITS == 64
  123 + /* on i386 Linux make sure it is aligned */
  124 + target_phys_addr_t addend __attribute__((aligned(8)));
  125 +#else
116 126 target_phys_addr_t addend;
  127 +#endif
  128 + /* padding to get a power of two size */
  129 + uint8_t dummy[(1 << CPU_TLB_ENTRY_BITS) -
  130 + (sizeof(target_ulong) * 3 +
  131 + ((-sizeof(target_ulong) * 3) & (sizeof(target_phys_addr_t) - 1)) +
  132 + sizeof(target_phys_addr_t))];
117 133 } CPUTLBEntry;
118 134  
119 135 #define CPU_COMMON \
... ...
... ... @@ -36,9 +36,9 @@
36 36 #define inline always_inline
37 37  
38 38 #ifdef __i386__
39   -#define REGPARM(n) __attribute((regparm(n)))
  39 +#define REGPARM __attribute((regparm(3)))
40 40 #else
41   -#define REGPARM(n)
  41 +#define REGPARM
42 42 #endif
43 43  
44 44 #define qemu_printf printf
... ...
softmmu_header.h
... ... @@ -70,15 +70,13 @@
70 70 #define ADDR_READ addr_read
71 71 #endif
72 72  
73   -DATA_TYPE REGPARM(1) glue(glue(__ld, SUFFIX), MMUSUFFIX)(target_ulong addr,
  73 +DATA_TYPE REGPARM glue(glue(__ld, SUFFIX), MMUSUFFIX)(target_ulong addr,
74 74 int mmu_idx);
75   -void REGPARM(2) glue(glue(__st, SUFFIX), MMUSUFFIX)(target_ulong addr, DATA_TYPE v, int mmu_idx);
  75 +void REGPARM glue(glue(__st, SUFFIX), MMUSUFFIX)(target_ulong addr, DATA_TYPE v, int mmu_idx);
76 76  
77 77 #if (DATA_SIZE <= 4) && (TARGET_LONG_BITS == 32) && defined(__i386__) && \
78 78 (ACCESS_TYPE < NB_MMU_MODES) && defined(ASM_SOFTMMU)
79 79  
80   -#define CPU_TLB_ENTRY_BITS 4
81   -
82 80 static inline RES_TYPE glue(glue(ld, USUFFIX), MEMSUFFIX)(target_ulong ptr)
83 81 {
84 82 int res;
... ... @@ -92,9 +90,8 @@ static inline RES_TYPE glue(glue(ld, USUFFIX), MEMSUFFIX)(target_ulong ptr)
92 90 "cmpl (%%edx), %%eax\n"
93 91 "movl %1, %%eax\n"
94 92 "je 1f\n"
95   - "pushl %6\n"
  93 + "movl %6, %%edx\n"
96 94 "call %7\n"
97   - "popl %%edx\n"
98 95 "movl %%eax, %0\n"
99 96 "jmp 2f\n"
100 97 "1:\n"
... ... @@ -135,9 +132,8 @@ static inline int glue(glue(lds, SUFFIX), MEMSUFFIX)(target_ulong ptr)
135 132 "cmpl (%%edx), %%eax\n"
136 133 "movl %1, %%eax\n"
137 134 "je 1f\n"
138   - "pushl %6\n"
  135 + "movl %6, %%edx\n"
139 136 "call %7\n"
140   - "popl %%edx\n"
141 137 #if DATA_SIZE == 1
142 138 "movsbl %%al, %0\n"
143 139 #elif DATA_SIZE == 2
... ... @@ -189,9 +185,8 @@ static inline void glue(glue(st, SUFFIX), MEMSUFFIX)(target_ulong ptr, RES_TYPE
189 185 #else
190 186 #error unsupported size
191 187 #endif
192   - "pushl %6\n"
  188 + "movl %6, %%ecx\n"
193 189 "call %7\n"
194   - "popl %%eax\n"
195 190 "jmp 2f\n"
196 191 "1:\n"
197 192 "addl 8(%%edx), %%eax\n"
... ...
softmmu_template.h
... ... @@ -75,8 +75,8 @@ static inline DATA_TYPE glue(io_read, SUFFIX)(target_phys_addr_t physaddr,
75 75 }
76 76  
77 77 /* handle all cases except unaligned access which span two pages */
78   -DATA_TYPE REGPARM(1) glue(glue(__ld, SUFFIX), MMUSUFFIX)(target_ulong addr,
79   - int mmu_idx)
  78 +DATA_TYPE REGPARM glue(glue(__ld, SUFFIX), MMUSUFFIX)(target_ulong addr,
  79 + int mmu_idx)
80 80 {
81 81 DATA_TYPE res;
82 82 int index;
... ... @@ -209,9 +209,9 @@ static inline void glue(io_write, SUFFIX)(target_phys_addr_t physaddr,
209 209 #endif
210 210 }
211 211  
212   -void REGPARM(2) glue(glue(__st, SUFFIX), MMUSUFFIX)(target_ulong addr,
213   - DATA_TYPE val,
214   - int mmu_idx)
  212 +void REGPARM glue(glue(__st, SUFFIX), MMUSUFFIX)(target_ulong addr,
  213 + DATA_TYPE val,
  214 + int mmu_idx)
215 215 {
216 216 target_phys_addr_t physaddr;
217 217 target_ulong tlb_addr;
... ...