Statistics
| Branch: | Revision:

root / softmmu_template.h @ dc1c13d9

History | View | Annotate | Download (12.7 kB)

1 b92e5a22 bellard
/*
2 b92e5a22 bellard
 *  Software MMU support
3 5fafdf24 ths
 *
4 efbf29b6 Blue Swirl
 * Generate helpers used by TCG for qemu_ld/st ops and code load
5 efbf29b6 Blue Swirl
 * functions.
6 efbf29b6 Blue Swirl
 *
7 efbf29b6 Blue Swirl
 * Included from target op helpers and exec.c.
8 efbf29b6 Blue Swirl
 *
9 b92e5a22 bellard
 *  Copyright (c) 2003 Fabrice Bellard
10 b92e5a22 bellard
 *
11 b92e5a22 bellard
 * This library is free software; you can redistribute it and/or
12 b92e5a22 bellard
 * modify it under the terms of the GNU Lesser General Public
13 b92e5a22 bellard
 * License as published by the Free Software Foundation; either
14 b92e5a22 bellard
 * version 2 of the License, or (at your option) any later version.
15 b92e5a22 bellard
 *
16 b92e5a22 bellard
 * This library is distributed in the hope that it will be useful,
17 b92e5a22 bellard
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 b92e5a22 bellard
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
19 b92e5a22 bellard
 * Lesser General Public License for more details.
20 b92e5a22 bellard
 *
21 b92e5a22 bellard
 * You should have received a copy of the GNU Lesser General Public
22 8167ee88 Blue Swirl
 * License along with this library; if not, see <http://www.gnu.org/licenses/>.
23 b92e5a22 bellard
 */
24 29e922b6 Blue Swirl
#include "qemu-timer.h"
25 0e0df1e2 Avi Kivity
#include "memory.h"
26 29e922b6 Blue Swirl
27 b92e5a22 bellard
#define DATA_SIZE (1 << SHIFT)
28 b92e5a22 bellard
29 b92e5a22 bellard
#if DATA_SIZE == 8
30 b92e5a22 bellard
#define SUFFIX q
31 61382a50 bellard
#define USUFFIX q
32 b92e5a22 bellard
#define DATA_TYPE uint64_t
33 b92e5a22 bellard
#elif DATA_SIZE == 4
34 b92e5a22 bellard
#define SUFFIX l
35 61382a50 bellard
#define USUFFIX l
36 b92e5a22 bellard
#define DATA_TYPE uint32_t
37 b92e5a22 bellard
#elif DATA_SIZE == 2
38 b92e5a22 bellard
#define SUFFIX w
39 61382a50 bellard
#define USUFFIX uw
40 b92e5a22 bellard
#define DATA_TYPE uint16_t
41 b92e5a22 bellard
#elif DATA_SIZE == 1
42 b92e5a22 bellard
#define SUFFIX b
43 61382a50 bellard
#define USUFFIX ub
44 b92e5a22 bellard
#define DATA_TYPE uint8_t
45 b92e5a22 bellard
#else
46 b92e5a22 bellard
#error unsupported data size
47 b92e5a22 bellard
#endif
48 b92e5a22 bellard
49 b769d8fe bellard
#ifdef SOFTMMU_CODE_ACCESS
50 b769d8fe bellard
#define READ_ACCESS_TYPE 2
51 84b7b8e7 bellard
#define ADDR_READ addr_code
52 b769d8fe bellard
#else
53 b769d8fe bellard
#define READ_ACCESS_TYPE 0
54 84b7b8e7 bellard
#define ADDR_READ addr_read
55 b769d8fe bellard
#endif
56 b769d8fe bellard
57 89c33337 Blue Swirl
static DATA_TYPE glue(glue(slow_ld, SUFFIX), MMUSUFFIX)(CPUArchState *env,
58 e141ab52 Blue Swirl
                                                        target_ulong addr,
59 6ebbf390 j_mayer
                                                        int mmu_idx,
60 20503968 Blue Swirl
                                                        uintptr_t retaddr);
61 89c33337 Blue Swirl
static inline DATA_TYPE glue(io_read, SUFFIX)(CPUArchState *env,
62 e141ab52 Blue Swirl
                                              target_phys_addr_t physaddr,
63 2e70f6ef pbrook
                                              target_ulong addr,
64 20503968 Blue Swirl
                                              uintptr_t retaddr)
65 b92e5a22 bellard
{
66 b92e5a22 bellard
    DATA_TYPE res;
67 37ec01d4 Avi Kivity
    MemoryRegion *mr = iotlb_to_region(physaddr);
68 37ec01d4 Avi Kivity
69 0f459d16 pbrook
    physaddr = (physaddr & TARGET_PAGE_MASK) + addr;
70 20503968 Blue Swirl
    env->mem_io_pc = retaddr;
71 37ec01d4 Avi Kivity
    if (mr != &io_mem_ram && mr != &io_mem_rom
72 37ec01d4 Avi Kivity
        && mr != &io_mem_unassigned
73 37ec01d4 Avi Kivity
        && mr != &io_mem_notdirty
74 2e70f6ef pbrook
            && !can_do_io(env)) {
75 2e70f6ef pbrook
        cpu_io_recompile(env, retaddr);
76 2e70f6ef pbrook
    }
77 b92e5a22 bellard
78 db8886d3 aliguori
    env->mem_io_vaddr = addr;
79 b92e5a22 bellard
#if SHIFT <= 2
80 37ec01d4 Avi Kivity
    res = io_mem_read(mr, physaddr, 1 << SHIFT);
81 b92e5a22 bellard
#else
82 b92e5a22 bellard
#ifdef TARGET_WORDS_BIGENDIAN
83 37ec01d4 Avi Kivity
    res = io_mem_read(mr, physaddr, 4) << 32;
84 37ec01d4 Avi Kivity
    res |= io_mem_read(mr, physaddr + 4, 4);
85 b92e5a22 bellard
#else
86 37ec01d4 Avi Kivity
    res = io_mem_read(mr, physaddr, 4);
87 37ec01d4 Avi Kivity
    res |= io_mem_read(mr, physaddr + 4, 4) << 32;
88 b92e5a22 bellard
#endif
89 b92e5a22 bellard
#endif /* SHIFT > 2 */
90 b92e5a22 bellard
    return res;
91 b92e5a22 bellard
}
92 b92e5a22 bellard
93 b92e5a22 bellard
/* handle all cases except unaligned access which span two pages */
94 e141ab52 Blue Swirl
DATA_TYPE
95 89c33337 Blue Swirl
glue(glue(helper_ld, SUFFIX), MMUSUFFIX)(CPUArchState *env, target_ulong addr,
96 89c33337 Blue Swirl
                                         int mmu_idx)
97 b92e5a22 bellard
{
98 b92e5a22 bellard
    DATA_TYPE res;
99 61382a50 bellard
    int index;
100 c27004ec bellard
    target_ulong tlb_addr;
101 355b1943 Paul Brook
    target_phys_addr_t ioaddr;
102 20503968 Blue Swirl
    uintptr_t retaddr;
103 3b46e624 ths
104 b92e5a22 bellard
    /* test if there is match for unaligned or IO access */
105 b92e5a22 bellard
    /* XXX: could done more in memory macro in a non portable way */
106 b92e5a22 bellard
    index = (addr >> TARGET_PAGE_BITS) & (CPU_TLB_SIZE - 1);
107 b92e5a22 bellard
 redo:
108 6ebbf390 j_mayer
    tlb_addr = env->tlb_table[mmu_idx][index].ADDR_READ;
109 b92e5a22 bellard
    if ((addr & TARGET_PAGE_MASK) == (tlb_addr & (TARGET_PAGE_MASK | TLB_INVALID_MASK))) {
110 b92e5a22 bellard
        if (tlb_addr & ~TARGET_PAGE_MASK) {
111 b92e5a22 bellard
            /* IO access */
112 b92e5a22 bellard
            if ((addr & (DATA_SIZE - 1)) != 0)
113 b92e5a22 bellard
                goto do_unaligned_access;
114 2e70f6ef pbrook
            retaddr = GETPC();
115 37ec01d4 Avi Kivity
            ioaddr = env->iotlb[mmu_idx][index];
116 89c33337 Blue Swirl
            res = glue(io_read, SUFFIX)(env, ioaddr, addr, retaddr);
117 98699967 bellard
        } else if (((addr & ~TARGET_PAGE_MASK) + DATA_SIZE - 1) >= TARGET_PAGE_SIZE) {
118 b92e5a22 bellard
            /* slow unaligned access (it spans two pages or IO) */
119 b92e5a22 bellard
        do_unaligned_access:
120 61382a50 bellard
            retaddr = GETPC();
121 a64d4718 bellard
#ifdef ALIGNED_ONLY
122 89c33337 Blue Swirl
            do_unaligned_access(env, addr, READ_ACCESS_TYPE, mmu_idx, retaddr);
123 a64d4718 bellard
#endif
124 89c33337 Blue Swirl
            res = glue(glue(slow_ld, SUFFIX), MMUSUFFIX)(env, addr,
125 6ebbf390 j_mayer
                                                         mmu_idx, retaddr);
126 b92e5a22 bellard
        } else {
127 a64d4718 bellard
            /* unaligned/aligned access in the same page */
128 b065927a Stefan Weil
            uintptr_t addend;
129 a64d4718 bellard
#ifdef ALIGNED_ONLY
130 a64d4718 bellard
            if ((addr & (DATA_SIZE - 1)) != 0) {
131 a64d4718 bellard
                retaddr = GETPC();
132 89c33337 Blue Swirl
                do_unaligned_access(env, addr, READ_ACCESS_TYPE, mmu_idx, retaddr);
133 a64d4718 bellard
            }
134 a64d4718 bellard
#endif
135 0f459d16 pbrook
            addend = env->tlb_table[mmu_idx][index].addend;
136 b065927a Stefan Weil
            res = glue(glue(ld, USUFFIX), _raw)((uint8_t *)(intptr_t)
137 b065927a Stefan Weil
                                                (addr + addend));
138 b92e5a22 bellard
        }
139 b92e5a22 bellard
    } else {
140 b92e5a22 bellard
        /* the page is not in the TLB : fill it */
141 61382a50 bellard
        retaddr = GETPC();
142 a64d4718 bellard
#ifdef ALIGNED_ONLY
143 a64d4718 bellard
        if ((addr & (DATA_SIZE - 1)) != 0)
144 89c33337 Blue Swirl
            do_unaligned_access(env, addr, READ_ACCESS_TYPE, mmu_idx, retaddr);
145 a64d4718 bellard
#endif
146 bccd9ec5 Blue Swirl
        tlb_fill(env, addr, READ_ACCESS_TYPE, mmu_idx, retaddr);
147 b92e5a22 bellard
        goto redo;
148 b92e5a22 bellard
    }
149 b92e5a22 bellard
    return res;
150 b92e5a22 bellard
}
151 b92e5a22 bellard
152 b92e5a22 bellard
/* handle all unaligned cases */
153 e141ab52 Blue Swirl
static DATA_TYPE
154 89c33337 Blue Swirl
glue(glue(slow_ld, SUFFIX), MMUSUFFIX)(CPUArchState *env,
155 e141ab52 Blue Swirl
                                       target_ulong addr,
156 e141ab52 Blue Swirl
                                       int mmu_idx,
157 20503968 Blue Swirl
                                       uintptr_t retaddr)
158 b92e5a22 bellard
{
159 b92e5a22 bellard
    DATA_TYPE res, res1, res2;
160 61382a50 bellard
    int index, shift;
161 355b1943 Paul Brook
    target_phys_addr_t ioaddr;
162 c27004ec bellard
    target_ulong tlb_addr, addr1, addr2;
163 b92e5a22 bellard
164 b92e5a22 bellard
    index = (addr >> TARGET_PAGE_BITS) & (CPU_TLB_SIZE - 1);
165 b92e5a22 bellard
 redo:
166 6ebbf390 j_mayer
    tlb_addr = env->tlb_table[mmu_idx][index].ADDR_READ;
167 b92e5a22 bellard
    if ((addr & TARGET_PAGE_MASK) == (tlb_addr & (TARGET_PAGE_MASK | TLB_INVALID_MASK))) {
168 b92e5a22 bellard
        if (tlb_addr & ~TARGET_PAGE_MASK) {
169 b92e5a22 bellard
            /* IO access */
170 b92e5a22 bellard
            if ((addr & (DATA_SIZE - 1)) != 0)
171 b92e5a22 bellard
                goto do_unaligned_access;
172 37ec01d4 Avi Kivity
            ioaddr = env->iotlb[mmu_idx][index];
173 89c33337 Blue Swirl
            res = glue(io_read, SUFFIX)(env, ioaddr, addr, retaddr);
174 98699967 bellard
        } else if (((addr & ~TARGET_PAGE_MASK) + DATA_SIZE - 1) >= TARGET_PAGE_SIZE) {
175 b92e5a22 bellard
        do_unaligned_access:
176 b92e5a22 bellard
            /* slow unaligned access (it spans two pages) */
177 b92e5a22 bellard
            addr1 = addr & ~(DATA_SIZE - 1);
178 b92e5a22 bellard
            addr2 = addr1 + DATA_SIZE;
179 89c33337 Blue Swirl
            res1 = glue(glue(slow_ld, SUFFIX), MMUSUFFIX)(env, addr1,
180 6ebbf390 j_mayer
                                                          mmu_idx, retaddr);
181 89c33337 Blue Swirl
            res2 = glue(glue(slow_ld, SUFFIX), MMUSUFFIX)(env, addr2,
182 6ebbf390 j_mayer
                                                          mmu_idx, retaddr);
183 b92e5a22 bellard
            shift = (addr & (DATA_SIZE - 1)) * 8;
184 b92e5a22 bellard
#ifdef TARGET_WORDS_BIGENDIAN
185 b92e5a22 bellard
            res = (res1 << shift) | (res2 >> ((DATA_SIZE * 8) - shift));
186 b92e5a22 bellard
#else
187 b92e5a22 bellard
            res = (res1 >> shift) | (res2 << ((DATA_SIZE * 8) - shift));
188 b92e5a22 bellard
#endif
189 6986f88c bellard
            res = (DATA_TYPE)res;
190 b92e5a22 bellard
        } else {
191 b92e5a22 bellard
            /* unaligned/aligned access in the same page */
192 b065927a Stefan Weil
            uintptr_t addend = env->tlb_table[mmu_idx][index].addend;
193 b065927a Stefan Weil
            res = glue(glue(ld, USUFFIX), _raw)((uint8_t *)(intptr_t)
194 b065927a Stefan Weil
                                                (addr + addend));
195 b92e5a22 bellard
        }
196 b92e5a22 bellard
    } else {
197 b92e5a22 bellard
        /* the page is not in the TLB : fill it */
198 bccd9ec5 Blue Swirl
        tlb_fill(env, addr, READ_ACCESS_TYPE, mmu_idx, retaddr);
199 b92e5a22 bellard
        goto redo;
200 b92e5a22 bellard
    }
201 b92e5a22 bellard
    return res;
202 b92e5a22 bellard
}
203 b92e5a22 bellard
204 b769d8fe bellard
#ifndef SOFTMMU_CODE_ACCESS
205 b769d8fe bellard
206 89c33337 Blue Swirl
static void glue(glue(slow_st, SUFFIX), MMUSUFFIX)(CPUArchState *env,
207 e141ab52 Blue Swirl
                                                   target_ulong addr,
208 5fafdf24 ths
                                                   DATA_TYPE val,
209 6ebbf390 j_mayer
                                                   int mmu_idx,
210 20503968 Blue Swirl
                                                   uintptr_t retaddr);
211 b769d8fe bellard
212 89c33337 Blue Swirl
static inline void glue(io_write, SUFFIX)(CPUArchState *env,
213 e141ab52 Blue Swirl
                                          target_phys_addr_t physaddr,
214 b769d8fe bellard
                                          DATA_TYPE val,
215 0f459d16 pbrook
                                          target_ulong addr,
216 20503968 Blue Swirl
                                          uintptr_t retaddr)
217 b769d8fe bellard
{
218 37ec01d4 Avi Kivity
    MemoryRegion *mr = iotlb_to_region(physaddr);
219 37ec01d4 Avi Kivity
220 0f459d16 pbrook
    physaddr = (physaddr & TARGET_PAGE_MASK) + addr;
221 37ec01d4 Avi Kivity
    if (mr != &io_mem_ram && mr != &io_mem_rom
222 37ec01d4 Avi Kivity
        && mr != &io_mem_unassigned
223 37ec01d4 Avi Kivity
        && mr != &io_mem_notdirty
224 2e70f6ef pbrook
            && !can_do_io(env)) {
225 2e70f6ef pbrook
        cpu_io_recompile(env, retaddr);
226 2e70f6ef pbrook
    }
227 b769d8fe bellard
228 2e70f6ef pbrook
    env->mem_io_vaddr = addr;
229 20503968 Blue Swirl
    env->mem_io_pc = retaddr;
230 b769d8fe bellard
#if SHIFT <= 2
231 37ec01d4 Avi Kivity
    io_mem_write(mr, physaddr, val, 1 << SHIFT);
232 b769d8fe bellard
#else
233 b769d8fe bellard
#ifdef TARGET_WORDS_BIGENDIAN
234 37ec01d4 Avi Kivity
    io_mem_write(mr, physaddr, (val >> 32), 4);
235 37ec01d4 Avi Kivity
    io_mem_write(mr, physaddr + 4, (uint32_t)val, 4);
236 b769d8fe bellard
#else
237 37ec01d4 Avi Kivity
    io_mem_write(mr, physaddr, (uint32_t)val, 4);
238 37ec01d4 Avi Kivity
    io_mem_write(mr, physaddr + 4, val >> 32, 4);
239 b769d8fe bellard
#endif
240 b769d8fe bellard
#endif /* SHIFT > 2 */
241 b769d8fe bellard
}
242 b92e5a22 bellard
243 89c33337 Blue Swirl
void glue(glue(helper_st, SUFFIX), MMUSUFFIX)(CPUArchState *env,
244 89c33337 Blue Swirl
                                              target_ulong addr, DATA_TYPE val,
245 89c33337 Blue Swirl
                                              int mmu_idx)
246 b92e5a22 bellard
{
247 355b1943 Paul Brook
    target_phys_addr_t ioaddr;
248 c27004ec bellard
    target_ulong tlb_addr;
249 20503968 Blue Swirl
    uintptr_t retaddr;
250 61382a50 bellard
    int index;
251 3b46e624 ths
252 b92e5a22 bellard
    index = (addr >> TARGET_PAGE_BITS) & (CPU_TLB_SIZE - 1);
253 b92e5a22 bellard
 redo:
254 6ebbf390 j_mayer
    tlb_addr = env->tlb_table[mmu_idx][index].addr_write;
255 b92e5a22 bellard
    if ((addr & TARGET_PAGE_MASK) == (tlb_addr & (TARGET_PAGE_MASK | TLB_INVALID_MASK))) {
256 b92e5a22 bellard
        if (tlb_addr & ~TARGET_PAGE_MASK) {
257 b92e5a22 bellard
            /* IO access */
258 b92e5a22 bellard
            if ((addr & (DATA_SIZE - 1)) != 0)
259 b92e5a22 bellard
                goto do_unaligned_access;
260 d720b93d bellard
            retaddr = GETPC();
261 37ec01d4 Avi Kivity
            ioaddr = env->iotlb[mmu_idx][index];
262 89c33337 Blue Swirl
            glue(io_write, SUFFIX)(env, ioaddr, val, addr, retaddr);
263 98699967 bellard
        } else if (((addr & ~TARGET_PAGE_MASK) + DATA_SIZE - 1) >= TARGET_PAGE_SIZE) {
264 b92e5a22 bellard
        do_unaligned_access:
265 61382a50 bellard
            retaddr = GETPC();
266 a64d4718 bellard
#ifdef ALIGNED_ONLY
267 89c33337 Blue Swirl
            do_unaligned_access(env, addr, 1, mmu_idx, retaddr);
268 a64d4718 bellard
#endif
269 89c33337 Blue Swirl
            glue(glue(slow_st, SUFFIX), MMUSUFFIX)(env, addr, val,
270 6ebbf390 j_mayer
                                                   mmu_idx, retaddr);
271 b92e5a22 bellard
        } else {
272 b92e5a22 bellard
            /* aligned/unaligned access in the same page */
273 b065927a Stefan Weil
            uintptr_t addend;
274 a64d4718 bellard
#ifdef ALIGNED_ONLY
275 a64d4718 bellard
            if ((addr & (DATA_SIZE - 1)) != 0) {
276 a64d4718 bellard
                retaddr = GETPC();
277 89c33337 Blue Swirl
                do_unaligned_access(env, addr, 1, mmu_idx, retaddr);
278 a64d4718 bellard
            }
279 a64d4718 bellard
#endif
280 0f459d16 pbrook
            addend = env->tlb_table[mmu_idx][index].addend;
281 b065927a Stefan Weil
            glue(glue(st, SUFFIX), _raw)((uint8_t *)(intptr_t)
282 b065927a Stefan Weil
                                         (addr + addend), val);
283 b92e5a22 bellard
        }
284 b92e5a22 bellard
    } else {
285 b92e5a22 bellard
        /* the page is not in the TLB : fill it */
286 61382a50 bellard
        retaddr = GETPC();
287 a64d4718 bellard
#ifdef ALIGNED_ONLY
288 a64d4718 bellard
        if ((addr & (DATA_SIZE - 1)) != 0)
289 89c33337 Blue Swirl
            do_unaligned_access(env, addr, 1, mmu_idx, retaddr);
290 a64d4718 bellard
#endif
291 bccd9ec5 Blue Swirl
        tlb_fill(env, addr, 1, mmu_idx, retaddr);
292 b92e5a22 bellard
        goto redo;
293 b92e5a22 bellard
    }
294 b92e5a22 bellard
}
295 b92e5a22 bellard
296 b92e5a22 bellard
/* handles all unaligned cases */
297 89c33337 Blue Swirl
static void glue(glue(slow_st, SUFFIX), MMUSUFFIX)(CPUArchState *env,
298 e141ab52 Blue Swirl
                                                   target_ulong addr,
299 61382a50 bellard
                                                   DATA_TYPE val,
300 6ebbf390 j_mayer
                                                   int mmu_idx,
301 20503968 Blue Swirl
                                                   uintptr_t retaddr)
302 b92e5a22 bellard
{
303 355b1943 Paul Brook
    target_phys_addr_t ioaddr;
304 c27004ec bellard
    target_ulong tlb_addr;
305 61382a50 bellard
    int index, i;
306 b92e5a22 bellard
307 b92e5a22 bellard
    index = (addr >> TARGET_PAGE_BITS) & (CPU_TLB_SIZE - 1);
308 b92e5a22 bellard
 redo:
309 6ebbf390 j_mayer
    tlb_addr = env->tlb_table[mmu_idx][index].addr_write;
310 b92e5a22 bellard
    if ((addr & TARGET_PAGE_MASK) == (tlb_addr & (TARGET_PAGE_MASK | TLB_INVALID_MASK))) {
311 b92e5a22 bellard
        if (tlb_addr & ~TARGET_PAGE_MASK) {
312 b92e5a22 bellard
            /* IO access */
313 b92e5a22 bellard
            if ((addr & (DATA_SIZE - 1)) != 0)
314 b92e5a22 bellard
                goto do_unaligned_access;
315 37ec01d4 Avi Kivity
            ioaddr = env->iotlb[mmu_idx][index];
316 89c33337 Blue Swirl
            glue(io_write, SUFFIX)(env, ioaddr, val, addr, retaddr);
317 98699967 bellard
        } else if (((addr & ~TARGET_PAGE_MASK) + DATA_SIZE - 1) >= TARGET_PAGE_SIZE) {
318 b92e5a22 bellard
        do_unaligned_access:
319 b92e5a22 bellard
            /* XXX: not efficient, but simple */
320 6c41b272 balrog
            /* Note: relies on the fact that tlb_fill() does not remove the
321 6c41b272 balrog
             * previous page from the TLB cache.  */
322 7221fa98 balrog
            for(i = DATA_SIZE - 1; i >= 0; i--) {
323 b92e5a22 bellard
#ifdef TARGET_WORDS_BIGENDIAN
324 89c33337 Blue Swirl
                glue(slow_stb, MMUSUFFIX)(env, addr + i,
325 e141ab52 Blue Swirl
                                          val >> (((DATA_SIZE - 1) * 8) - (i * 8)),
326 6ebbf390 j_mayer
                                          mmu_idx, retaddr);
327 b92e5a22 bellard
#else
328 89c33337 Blue Swirl
                glue(slow_stb, MMUSUFFIX)(env, addr + i,
329 e141ab52 Blue Swirl
                                          val >> (i * 8),
330 6ebbf390 j_mayer
                                          mmu_idx, retaddr);
331 b92e5a22 bellard
#endif
332 b92e5a22 bellard
            }
333 b92e5a22 bellard
        } else {
334 b92e5a22 bellard
            /* aligned/unaligned access in the same page */
335 b065927a Stefan Weil
            uintptr_t addend = env->tlb_table[mmu_idx][index].addend;
336 b065927a Stefan Weil
            glue(glue(st, SUFFIX), _raw)((uint8_t *)(intptr_t)
337 b065927a Stefan Weil
                                         (addr + addend), val);
338 b92e5a22 bellard
        }
339 b92e5a22 bellard
    } else {
340 b92e5a22 bellard
        /* the page is not in the TLB : fill it */
341 bccd9ec5 Blue Swirl
        tlb_fill(env, addr, 1, mmu_idx, retaddr);
342 b92e5a22 bellard
        goto redo;
343 b92e5a22 bellard
    }
344 b92e5a22 bellard
}
345 b92e5a22 bellard
346 b769d8fe bellard
#endif /* !defined(SOFTMMU_CODE_ACCESS) */
347 b769d8fe bellard
348 b769d8fe bellard
#undef READ_ACCESS_TYPE
349 b92e5a22 bellard
#undef SHIFT
350 b92e5a22 bellard
#undef DATA_TYPE
351 b92e5a22 bellard
#undef SUFFIX
352 61382a50 bellard
#undef USUFFIX
353 b92e5a22 bellard
#undef DATA_SIZE
354 84b7b8e7 bellard
#undef ADDR_READ