Revision e25c3887

b/include/exec/softmmu_defs.h
9 9
#ifndef SOFTMMU_DEFS_H
10 10
#define SOFTMMU_DEFS_H
11 11

  
12
uint8_t helper_ret_ldb_mmu(CPUArchState *env, target_ulong addr,
13
                           int mmu_idx, uintptr_t retaddr);
14
uint16_t helper_ret_ldw_mmu(CPUArchState *env, target_ulong addr,
15
                            int mmu_idx, uintptr_t retaddr);
16
uint32_t helper_ret_ldl_mmu(CPUArchState *env, target_ulong addr,
17
                            int mmu_idx, uintptr_t retaddr);
18
uint64_t helper_ret_ldq_mmu(CPUArchState *env, target_ulong addr,
19
                            int mmu_idx, uintptr_t retaddr);
20

  
21
void helper_ret_stb_mmu(CPUArchState *env, target_ulong addr, uint8_t val,
22
                        int mmu_idx, uintptr_t retaddr);
23
void helper_ret_stw_mmu(CPUArchState *env, target_ulong addr, uint16_t val,
24
                        int mmu_idx, uintptr_t retaddr);
25
void helper_ret_stl_mmu(CPUArchState *env, target_ulong addr, uint32_t val,
26
                        int mmu_idx, uintptr_t retaddr);
27
void helper_ret_stq_mmu(CPUArchState *env, target_ulong addr, uint64_t val,
28
                        int mmu_idx, uintptr_t retaddr);
29

  
12 30
uint8_t helper_ldb_mmu(CPUArchState *env, target_ulong addr, int mmu_idx);
13
void helper_stb_mmu(CPUArchState *env, target_ulong addr, uint8_t val,
14
                    int mmu_idx);
15 31
uint16_t helper_ldw_mmu(CPUArchState *env, target_ulong addr, int mmu_idx);
16
void helper_stw_mmu(CPUArchState *env, target_ulong addr, uint16_t val,
17
                    int mmu_idx);
18 32
uint32_t helper_ldl_mmu(CPUArchState *env, target_ulong addr, int mmu_idx);
19
void helper_stl_mmu(CPUArchState *env, target_ulong addr, uint32_t val,
20
                    int mmu_idx);
21 33
uint64_t helper_ldq_mmu(CPUArchState *env, target_ulong addr, int mmu_idx);
22
void helper_stq_mmu(CPUArchState *env, target_ulong addr, uint64_t val,
23
                    int mmu_idx);
34

  
35
void helper_stb_mmu(CPUArchState *env, target_ulong addr,
36
                    uint8_t val, int mmu_idx);
37
void helper_stw_mmu(CPUArchState *env, target_ulong addr,
38
                    uint16_t val, int mmu_idx);
39
void helper_stl_mmu(CPUArchState *env, target_ulong addr,
40
                    uint32_t val, int mmu_idx);
41
void helper_stq_mmu(CPUArchState *env, target_ulong addr,
42
                    uint64_t val, int mmu_idx);
24 43

  
25 44
uint8_t helper_ldb_cmmu(CPUArchState *env, target_ulong addr, int mmu_idx);
26
void helper_stb_cmmu(CPUArchState *env, target_ulong addr, uint8_t val,
27
int mmu_idx);
28 45
uint16_t helper_ldw_cmmu(CPUArchState *env, target_ulong addr, int mmu_idx);
29
void helper_stw_cmmu(CPUArchState *env, target_ulong addr, uint16_t val,
30
                     int mmu_idx);
31 46
uint32_t helper_ldl_cmmu(CPUArchState *env, target_ulong addr, int mmu_idx);
32
void helper_stl_cmmu(CPUArchState *env, target_ulong addr, uint32_t val,
33
                     int mmu_idx);
34 47
uint64_t helper_ldq_cmmu(CPUArchState *env, target_ulong addr, int mmu_idx);
35
void helper_stq_cmmu(CPUArchState *env, target_ulong addr, uint64_t val,
36
                     int mmu_idx);
37
#endif
48

  
49
#endif /* SOFTMMU_DEFS_H */
b/include/exec/softmmu_template.h
78 78
}
79 79

  
80 80
/* handle all cases except unaligned access which span two pages */
81
#ifdef SOFTMMU_CODE_ACCESS
82
static
83
#endif
81 84
DATA_TYPE
82
glue(glue(helper_ld, SUFFIX), MMUSUFFIX)(CPUArchState *env, target_ulong addr,
83
                                         int mmu_idx)
85
glue(glue(helper_ret_ld, SUFFIX), MMUSUFFIX)(CPUArchState *env,
86
                                             target_ulong addr, int mmu_idx,
87
                                             uintptr_t retaddr)
84 88
{
85 89
    DATA_TYPE res;
86 90
    int index;
87 91
    target_ulong tlb_addr;
88 92
    hwaddr ioaddr;
89
    uintptr_t retaddr;
90 93

  
91 94
    /* test if there is match for unaligned or IO access */
92 95
    /* XXX: could done more in memory macro in a non portable way */
......
98 101
            /* IO access */
99 102
            if ((addr & (DATA_SIZE - 1)) != 0)
100 103
                goto do_unaligned_access;
101
            retaddr = GETPC_EXT();
102 104
            ioaddr = env->iotlb[mmu_idx][index];
103 105
            res = glue(io_read, SUFFIX)(env, ioaddr, addr, retaddr);
104 106
        } else if (((addr & ~TARGET_PAGE_MASK) + DATA_SIZE - 1) >= TARGET_PAGE_SIZE) {
105 107
            /* slow unaligned access (it spans two pages or IO) */
106 108
        do_unaligned_access:
107
            retaddr = GETPC_EXT();
108 109
#ifdef ALIGNED_ONLY
109 110
            do_unaligned_access(env, addr, READ_ACCESS_TYPE, mmu_idx, retaddr);
110 111
#endif
......
115 116
            uintptr_t addend;
116 117
#ifdef ALIGNED_ONLY
117 118
            if ((addr & (DATA_SIZE - 1)) != 0) {
118
                retaddr = GETPC_EXT();
119 119
                do_unaligned_access(env, addr, READ_ACCESS_TYPE, mmu_idx, retaddr);
120 120
            }
121 121
#endif
......
124 124
                                                (addr + addend));
125 125
        }
126 126
    } else {
127
        /* the page is not in the TLB : fill it */
128
        retaddr = GETPC_EXT();
129 127
#ifdef ALIGNED_ONLY
130 128
        if ((addr & (DATA_SIZE - 1)) != 0)
131 129
            do_unaligned_access(env, addr, READ_ACCESS_TYPE, mmu_idx, retaddr);
......
136 134
    return res;
137 135
}
138 136

  
137
DATA_TYPE
138
glue(glue(helper_ld, SUFFIX), MMUSUFFIX)(CPUArchState *env, target_ulong addr,
139
                                         int mmu_idx)
140
{
141
    return glue(glue(helper_ret_ld, SUFFIX), MMUSUFFIX)(env, addr, mmu_idx,
142
                                                        GETPC_EXT());
143
}
144

  
139 145
/* handle all unaligned cases */
140 146
static DATA_TYPE
141 147
glue(glue(slow_ld, SUFFIX), MMUSUFFIX)(CPUArchState *env,
......
214 220
    io_mem_write(mr, physaddr, val, 1 << SHIFT);
215 221
}
216 222

  
217
void glue(glue(helper_st, SUFFIX), MMUSUFFIX)(CPUArchState *env,
218
                                              target_ulong addr, DATA_TYPE val,
219
                                              int mmu_idx)
223
void
224
glue(glue(helper_ret_st, SUFFIX), MMUSUFFIX)(CPUArchState *env,
225
                                             target_ulong addr, DATA_TYPE val,
226
                                             int mmu_idx, uintptr_t retaddr)
220 227
{
221 228
    hwaddr ioaddr;
222 229
    target_ulong tlb_addr;
223
    uintptr_t retaddr;
224 230
    int index;
225 231

  
226 232
    index = (addr >> TARGET_PAGE_BITS) & (CPU_TLB_SIZE - 1);
......
231 237
            /* IO access */
232 238
            if ((addr & (DATA_SIZE - 1)) != 0)
233 239
                goto do_unaligned_access;
234
            retaddr = GETPC_EXT();
235 240
            ioaddr = env->iotlb[mmu_idx][index];
236 241
            glue(io_write, SUFFIX)(env, ioaddr, val, addr, retaddr);
237 242
        } else if (((addr & ~TARGET_PAGE_MASK) + DATA_SIZE - 1) >= TARGET_PAGE_SIZE) {
238 243
        do_unaligned_access:
239
            retaddr = GETPC_EXT();
240 244
#ifdef ALIGNED_ONLY
241 245
            do_unaligned_access(env, addr, 1, mmu_idx, retaddr);
242 246
#endif
......
247 251
            uintptr_t addend;
248 252
#ifdef ALIGNED_ONLY
249 253
            if ((addr & (DATA_SIZE - 1)) != 0) {
250
                retaddr = GETPC_EXT();
251 254
                do_unaligned_access(env, addr, 1, mmu_idx, retaddr);
252 255
            }
253 256
#endif
......
257 260
        }
258 261
    } else {
259 262
        /* the page is not in the TLB : fill it */
260
        retaddr = GETPC_EXT();
261 263
#ifdef ALIGNED_ONLY
262 264
        if ((addr & (DATA_SIZE - 1)) != 0)
263 265
            do_unaligned_access(env, addr, 1, mmu_idx, retaddr);
......
267 269
    }
268 270
}
269 271

  
272
void
273
glue(glue(helper_st, SUFFIX), MMUSUFFIX)(CPUArchState *env, target_ulong addr,
274
                                         DATA_TYPE val, int mmu_idx)
275
{
276
    glue(glue(helper_ret_st, SUFFIX), MMUSUFFIX)(env, addr, val, mmu_idx,
277
                                                 GETPC_EXT());
278
}
279

  
270 280
/* handles all unaligned cases */
271 281
static void glue(glue(slow_st, SUFFIX), MMUSUFFIX)(CPUArchState *env,
272 282
                                                   target_ulong addr,

Also available in: Unified diff