Statistics
| Branch: | Revision:

root / exec.c @ b3b00c78

History | View | Annotate | Download (128.6 kB)

1
/*
2
 *  virtual page mapping and translated block handling
3
 *
4
 *  Copyright (c) 2003 Fabrice Bellard
5
 *
6
 * This library is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU Lesser General Public
8
 * License as published by the Free Software Foundation; either
9
 * version 2 of the License, or (at your option) any later version.
10
 *
11
 * This library is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14
 * Lesser General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU Lesser General Public
17
 * License along with this library; if not, see <http://www.gnu.org/licenses/>.
18
 */
19
#include "config.h"
20
#ifdef _WIN32
21
#include <windows.h>
22
#else
23
#include <sys/types.h>
24
#include <sys/mman.h>
25
#endif
26

    
27
#include "qemu-common.h"
28
#include "cpu.h"
29
#include "tcg.h"
30
#include "hw/hw.h"
31
#include "hw/qdev.h"
32
#include "osdep.h"
33
#include "kvm.h"
34
#include "hw/xen.h"
35
#include "qemu-timer.h"
36
#include "memory.h"
37
#include "exec-memory.h"
38
#if defined(CONFIG_USER_ONLY)
39
#include <qemu.h>
40
#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
41
#include <sys/param.h>
42
#if __FreeBSD_version >= 700104
43
#define HAVE_KINFO_GETVMMAP
44
#define sigqueue sigqueue_freebsd  /* avoid redefinition */
45
#include <sys/time.h>
46
#include <sys/proc.h>
47
#include <machine/profile.h>
48
#define _KERNEL
49
#include <sys/user.h>
50
#undef _KERNEL
51
#undef sigqueue
52
#include <libutil.h>
53
#endif
54
#endif
55
#else /* !CONFIG_USER_ONLY */
56
#include "xen-mapcache.h"
57
#include "trace.h"
58
#endif
59

    
60
#define WANT_EXEC_OBSOLETE
61
#include "exec-obsolete.h"
62

    
63
//#define DEBUG_TB_INVALIDATE
64
//#define DEBUG_FLUSH
65
//#define DEBUG_TLB
66
//#define DEBUG_UNASSIGNED
67

    
68
/* make various TB consistency checks */
69
//#define DEBUG_TB_CHECK
70
//#define DEBUG_TLB_CHECK
71

    
72
//#define DEBUG_IOPORT
73
//#define DEBUG_SUBPAGE
74

    
75
#if !defined(CONFIG_USER_ONLY)
76
/* TB consistency checks only implemented for usermode emulation.  */
77
#undef DEBUG_TB_CHECK
78
#endif
79

    
80
#define SMC_BITMAP_USE_THRESHOLD 10
81

    
82
static TranslationBlock *tbs;
83
static int code_gen_max_blocks;
84
TranslationBlock *tb_phys_hash[CODE_GEN_PHYS_HASH_SIZE];
85
static int nb_tbs;
86
/* any access to the tbs or the page table must use this lock */
87
spinlock_t tb_lock = SPIN_LOCK_UNLOCKED;
88

    
89
#if defined(__arm__) || defined(__sparc_v9__)
90
/* The prologue must be reachable with a direct jump. ARM and Sparc64
91
 have limited branch ranges (possibly also PPC) so place it in a
92
 section close to code segment. */
93
#define code_gen_section                                \
94
    __attribute__((__section__(".gen_code")))           \
95
    __attribute__((aligned (32)))
96
#elif defined(_WIN32)
97
/* Maximum alignment for Win32 is 16. */
98
#define code_gen_section                                \
99
    __attribute__((aligned (16)))
100
#else
101
#define code_gen_section                                \
102
    __attribute__((aligned (32)))
103
#endif
104

    
105
uint8_t code_gen_prologue[1024] code_gen_section;
106
static uint8_t *code_gen_buffer;
107
static unsigned long code_gen_buffer_size;
108
/* threshold to flush the translated code buffer */
109
static unsigned long code_gen_buffer_max_size;
110
static uint8_t *code_gen_ptr;
111

    
112
#if !defined(CONFIG_USER_ONLY)
113
int phys_ram_fd;
114
static int in_migration;
115

    
116
RAMList ram_list = { .blocks = QLIST_HEAD_INITIALIZER(ram_list.blocks) };
117

    
118
static MemoryRegion *system_memory;
119
static MemoryRegion *system_io;
120

    
121
MemoryRegion io_mem_ram, io_mem_rom, io_mem_unassigned, io_mem_notdirty;
122
static MemoryRegion io_mem_subpage_ram;
123

    
124
#endif
125

    
126
CPUState *first_cpu;
127
/* current CPU in the current thread. It is only valid inside
128
   cpu_exec() */
129
DEFINE_TLS(CPUState *,cpu_single_env);
130
/* 0 = Do not count executed instructions.
131
   1 = Precise instruction counting.
132
   2 = Adaptive rate instruction counting.  */
133
int use_icount = 0;
134

    
135
typedef struct PageDesc {
136
    /* list of TBs intersecting this ram page */
137
    TranslationBlock *first_tb;
138
    /* in order to optimize self modifying code, we count the number
139
       of lookups we do to a given page to use a bitmap */
140
    unsigned int code_write_count;
141
    uint8_t *code_bitmap;
142
#if defined(CONFIG_USER_ONLY)
143
    unsigned long flags;
144
#endif
145
} PageDesc;
146

    
147
/* In system mode we want L1_MAP to be based on ram offsets,
148
   while in user mode we want it to be based on virtual addresses.  */
149
#if !defined(CONFIG_USER_ONLY)
150
#if HOST_LONG_BITS < TARGET_PHYS_ADDR_SPACE_BITS
151
# define L1_MAP_ADDR_SPACE_BITS  HOST_LONG_BITS
152
#else
153
# define L1_MAP_ADDR_SPACE_BITS  TARGET_PHYS_ADDR_SPACE_BITS
154
#endif
155
#else
156
# define L1_MAP_ADDR_SPACE_BITS  TARGET_VIRT_ADDR_SPACE_BITS
157
#endif
158

    
159
/* Size of the L2 (and L3, etc) page tables.  */
160
#define L2_BITS 10
161
#define L2_SIZE (1 << L2_BITS)
162

    
163
/* The bits remaining after N lower levels of page tables.  */
164
#define P_L1_BITS_REM \
165
    ((TARGET_PHYS_ADDR_SPACE_BITS - TARGET_PAGE_BITS) % L2_BITS)
166
#define V_L1_BITS_REM \
167
    ((L1_MAP_ADDR_SPACE_BITS - TARGET_PAGE_BITS) % L2_BITS)
168

    
169
/* Size of the L1 page table.  Avoid silly small sizes.  */
170
#if P_L1_BITS_REM < 4
171
#define P_L1_BITS  (P_L1_BITS_REM + L2_BITS)
172
#else
173
#define P_L1_BITS  P_L1_BITS_REM
174
#endif
175

    
176
#if V_L1_BITS_REM < 4
177
#define V_L1_BITS  (V_L1_BITS_REM + L2_BITS)
178
#else
179
#define V_L1_BITS  V_L1_BITS_REM
180
#endif
181

    
182
#define P_L1_SIZE  ((target_phys_addr_t)1 << P_L1_BITS)
183
#define V_L1_SIZE  ((target_ulong)1 << V_L1_BITS)
184

    
185
#define P_L1_SHIFT (TARGET_PHYS_ADDR_SPACE_BITS - TARGET_PAGE_BITS - P_L1_BITS)
186
#define V_L1_SHIFT (L1_MAP_ADDR_SPACE_BITS - TARGET_PAGE_BITS - V_L1_BITS)
187

    
188
unsigned long qemu_real_host_page_size;
189
unsigned long qemu_host_page_size;
190
unsigned long qemu_host_page_mask;
191

    
192
/* This is a multi-level map on the virtual address space.
193
   The bottom level has pointers to PageDesc.  */
194
static void *l1_map[V_L1_SIZE];
195

    
196
#if !defined(CONFIG_USER_ONLY)
197
typedef struct PhysPageDesc {
198
    /* offset in host memory of the page + io_index in the low bits */
199
    ram_addr_t phys_offset;
200
    ram_addr_t region_offset;
201
} PhysPageDesc;
202

    
203
/* This is a multi-level map on the physical address space.
204
   The bottom level has pointers to PhysPageDesc.  */
205
static void *l1_phys_map[P_L1_SIZE];
206

    
207
static void io_mem_init(void);
208
static void memory_map_init(void);
209

    
210
/* io memory support */
211
MemoryRegion *io_mem_region[IO_MEM_NB_ENTRIES];
212
static char io_mem_used[IO_MEM_NB_ENTRIES];
213
static MemoryRegion io_mem_watch;
214
#endif
215

    
216
/* log support */
217
#ifdef WIN32
218
static const char *logfilename = "qemu.log";
219
#else
220
static const char *logfilename = "/tmp/qemu.log";
221
#endif
222
FILE *logfile;
223
int loglevel;
224
static int log_append = 0;
225

    
226
/* statistics */
227
#if !defined(CONFIG_USER_ONLY)
228
static int tlb_flush_count;
229
#endif
230
static int tb_flush_count;
231
static int tb_phys_invalidate_count;
232

    
233
#ifdef _WIN32
234
static void map_exec(void *addr, long size)
235
{
236
    DWORD old_protect;
237
    VirtualProtect(addr, size,
238
                   PAGE_EXECUTE_READWRITE, &old_protect);
239
    
240
}
241
#else
242
static void map_exec(void *addr, long size)
243
{
244
    unsigned long start, end, page_size;
245
    
246
    page_size = getpagesize();
247
    start = (unsigned long)addr;
248
    start &= ~(page_size - 1);
249
    
250
    end = (unsigned long)addr + size;
251
    end += page_size - 1;
252
    end &= ~(page_size - 1);
253
    
254
    mprotect((void *)start, end - start,
255
             PROT_READ | PROT_WRITE | PROT_EXEC);
256
}
257
#endif
258

    
259
static void page_init(void)
260
{
261
    /* NOTE: we can always suppose that qemu_host_page_size >=
262
       TARGET_PAGE_SIZE */
263
#ifdef _WIN32
264
    {
265
        SYSTEM_INFO system_info;
266

    
267
        GetSystemInfo(&system_info);
268
        qemu_real_host_page_size = system_info.dwPageSize;
269
    }
270
#else
271
    qemu_real_host_page_size = getpagesize();
272
#endif
273
    if (qemu_host_page_size == 0)
274
        qemu_host_page_size = qemu_real_host_page_size;
275
    if (qemu_host_page_size < TARGET_PAGE_SIZE)
276
        qemu_host_page_size = TARGET_PAGE_SIZE;
277
    qemu_host_page_mask = ~(qemu_host_page_size - 1);
278

    
279
#if defined(CONFIG_BSD) && defined(CONFIG_USER_ONLY)
280
    {
281
#ifdef HAVE_KINFO_GETVMMAP
282
        struct kinfo_vmentry *freep;
283
        int i, cnt;
284

    
285
        freep = kinfo_getvmmap(getpid(), &cnt);
286
        if (freep) {
287
            mmap_lock();
288
            for (i = 0; i < cnt; i++) {
289
                unsigned long startaddr, endaddr;
290

    
291
                startaddr = freep[i].kve_start;
292
                endaddr = freep[i].kve_end;
293
                if (h2g_valid(startaddr)) {
294
                    startaddr = h2g(startaddr) & TARGET_PAGE_MASK;
295

    
296
                    if (h2g_valid(endaddr)) {
297
                        endaddr = h2g(endaddr);
298
                        page_set_flags(startaddr, endaddr, PAGE_RESERVED);
299
                    } else {
300
#if TARGET_ABI_BITS <= L1_MAP_ADDR_SPACE_BITS
301
                        endaddr = ~0ul;
302
                        page_set_flags(startaddr, endaddr, PAGE_RESERVED);
303
#endif
304
                    }
305
                }
306
            }
307
            free(freep);
308
            mmap_unlock();
309
        }
310
#else
311
        FILE *f;
312

    
313
        last_brk = (unsigned long)sbrk(0);
314

    
315
        f = fopen("/compat/linux/proc/self/maps", "r");
316
        if (f) {
317
            mmap_lock();
318

    
319
            do {
320
                unsigned long startaddr, endaddr;
321
                int n;
322

    
323
                n = fscanf (f, "%lx-%lx %*[^\n]\n", &startaddr, &endaddr);
324

    
325
                if (n == 2 && h2g_valid(startaddr)) {
326
                    startaddr = h2g(startaddr) & TARGET_PAGE_MASK;
327

    
328
                    if (h2g_valid(endaddr)) {
329
                        endaddr = h2g(endaddr);
330
                    } else {
331
                        endaddr = ~0ul;
332
                    }
333
                    page_set_flags(startaddr, endaddr, PAGE_RESERVED);
334
                }
335
            } while (!feof(f));
336

    
337
            fclose(f);
338
            mmap_unlock();
339
        }
340
#endif
341
    }
342
#endif
343
}
344

    
345
static PageDesc *page_find_alloc(tb_page_addr_t index, int alloc)
346
{
347
    PageDesc *pd;
348
    void **lp;
349
    int i;
350

    
351
#if defined(CONFIG_USER_ONLY)
352
    /* We can't use g_malloc because it may recurse into a locked mutex. */
353
# define ALLOC(P, SIZE)                                 \
354
    do {                                                \
355
        P = mmap(NULL, SIZE, PROT_READ | PROT_WRITE,    \
356
                 MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);   \
357
    } while (0)
358
#else
359
# define ALLOC(P, SIZE) \
360
    do { P = g_malloc0(SIZE); } while (0)
361
#endif
362

    
363
    /* Level 1.  Always allocated.  */
364
    lp = l1_map + ((index >> V_L1_SHIFT) & (V_L1_SIZE - 1));
365

    
366
    /* Level 2..N-1.  */
367
    for (i = V_L1_SHIFT / L2_BITS - 1; i > 0; i--) {
368
        void **p = *lp;
369

    
370
        if (p == NULL) {
371
            if (!alloc) {
372
                return NULL;
373
            }
374
            ALLOC(p, sizeof(void *) * L2_SIZE);
375
            *lp = p;
376
        }
377

    
378
        lp = p + ((index >> (i * L2_BITS)) & (L2_SIZE - 1));
379
    }
380

    
381
    pd = *lp;
382
    if (pd == NULL) {
383
        if (!alloc) {
384
            return NULL;
385
        }
386
        ALLOC(pd, sizeof(PageDesc) * L2_SIZE);
387
        *lp = pd;
388
    }
389

    
390
#undef ALLOC
391

    
392
    return pd + (index & (L2_SIZE - 1));
393
}
394

    
395
static inline PageDesc *page_find(tb_page_addr_t index)
396
{
397
    return page_find_alloc(index, 0);
398
}
399

    
400
#if !defined(CONFIG_USER_ONLY)
401
static PhysPageDesc *phys_page_find_alloc(target_phys_addr_t index, int alloc)
402
{
403
    PhysPageDesc *pd;
404
    void **lp;
405
    int i;
406

    
407
    /* Level 1.  Always allocated.  */
408
    lp = l1_phys_map + ((index >> P_L1_SHIFT) & (P_L1_SIZE - 1));
409

    
410
    /* Level 2..N-1.  */
411
    for (i = P_L1_SHIFT / L2_BITS - 1; i > 0; i--) {
412
        void **p = *lp;
413
        if (p == NULL) {
414
            if (!alloc) {
415
                return NULL;
416
            }
417
            *lp = p = g_malloc0(sizeof(void *) * L2_SIZE);
418
        }
419
        lp = p + ((index >> (i * L2_BITS)) & (L2_SIZE - 1));
420
    }
421

    
422
    pd = *lp;
423
    if (pd == NULL) {
424
        int i;
425
        int first_index = index & ~(L2_SIZE - 1);
426

    
427
        if (!alloc) {
428
            return NULL;
429
        }
430

    
431
        *lp = pd = g_malloc(sizeof(PhysPageDesc) * L2_SIZE);
432

    
433
        for (i = 0; i < L2_SIZE; i++) {
434
            pd[i].phys_offset = io_mem_unassigned.ram_addr;
435
            pd[i].region_offset = (first_index + i) << TARGET_PAGE_BITS;
436
        }
437
    }
438

    
439
    return pd + (index & (L2_SIZE - 1));
440
}
441

    
442
static inline PhysPageDesc phys_page_find(target_phys_addr_t index)
443
{
444
    PhysPageDesc *p = phys_page_find_alloc(index, 0);
445

    
446
    if (p) {
447
        return *p;
448
    } else {
449
        return (PhysPageDesc) {
450
            .phys_offset = io_mem_unassigned.ram_addr,
451
            .region_offset = index << TARGET_PAGE_BITS,
452
        };
453
    }
454
}
455

    
456
static void tlb_protect_code(ram_addr_t ram_addr);
457
static void tlb_unprotect_code_phys(CPUState *env, ram_addr_t ram_addr,
458
                                    target_ulong vaddr);
459
#define mmap_lock() do { } while(0)
460
#define mmap_unlock() do { } while(0)
461
#endif
462

    
463
#define DEFAULT_CODE_GEN_BUFFER_SIZE (32 * 1024 * 1024)
464

    
465
#if defined(CONFIG_USER_ONLY)
466
/* Currently it is not recommended to allocate big chunks of data in
467
   user mode. It will change when a dedicated libc will be used */
468
#define USE_STATIC_CODE_GEN_BUFFER
469
#endif
470

    
471
#ifdef USE_STATIC_CODE_GEN_BUFFER
472
static uint8_t static_code_gen_buffer[DEFAULT_CODE_GEN_BUFFER_SIZE]
473
               __attribute__((aligned (CODE_GEN_ALIGN)));
474
#endif
475

    
476
static void code_gen_alloc(unsigned long tb_size)
477
{
478
#ifdef USE_STATIC_CODE_GEN_BUFFER
479
    code_gen_buffer = static_code_gen_buffer;
480
    code_gen_buffer_size = DEFAULT_CODE_GEN_BUFFER_SIZE;
481
    map_exec(code_gen_buffer, code_gen_buffer_size);
482
#else
483
    code_gen_buffer_size = tb_size;
484
    if (code_gen_buffer_size == 0) {
485
#if defined(CONFIG_USER_ONLY)
486
        code_gen_buffer_size = DEFAULT_CODE_GEN_BUFFER_SIZE;
487
#else
488
        /* XXX: needs adjustments */
489
        code_gen_buffer_size = (unsigned long)(ram_size / 4);
490
#endif
491
    }
492
    if (code_gen_buffer_size < MIN_CODE_GEN_BUFFER_SIZE)
493
        code_gen_buffer_size = MIN_CODE_GEN_BUFFER_SIZE;
494
    /* The code gen buffer location may have constraints depending on
495
       the host cpu and OS */
496
#if defined(__linux__) 
497
    {
498
        int flags;
499
        void *start = NULL;
500

    
501
        flags = MAP_PRIVATE | MAP_ANONYMOUS;
502
#if defined(__x86_64__)
503
        flags |= MAP_32BIT;
504
        /* Cannot map more than that */
505
        if (code_gen_buffer_size > (800 * 1024 * 1024))
506
            code_gen_buffer_size = (800 * 1024 * 1024);
507
#elif defined(__sparc_v9__)
508
        // Map the buffer below 2G, so we can use direct calls and branches
509
        flags |= MAP_FIXED;
510
        start = (void *) 0x60000000UL;
511
        if (code_gen_buffer_size > (512 * 1024 * 1024))
512
            code_gen_buffer_size = (512 * 1024 * 1024);
513
#elif defined(__arm__)
514
        /* Keep the buffer no bigger than 16GB to branch between blocks */
515
        if (code_gen_buffer_size > 16 * 1024 * 1024)
516
            code_gen_buffer_size = 16 * 1024 * 1024;
517
#elif defined(__s390x__)
518
        /* Map the buffer so that we can use direct calls and branches.  */
519
        /* We have a +- 4GB range on the branches; leave some slop.  */
520
        if (code_gen_buffer_size > (3ul * 1024 * 1024 * 1024)) {
521
            code_gen_buffer_size = 3ul * 1024 * 1024 * 1024;
522
        }
523
        start = (void *)0x90000000UL;
524
#endif
525
        code_gen_buffer = mmap(start, code_gen_buffer_size,
526
                               PROT_WRITE | PROT_READ | PROT_EXEC,
527
                               flags, -1, 0);
528
        if (code_gen_buffer == MAP_FAILED) {
529
            fprintf(stderr, "Could not allocate dynamic translator buffer\n");
530
            exit(1);
531
        }
532
    }
533
#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) \
534
    || defined(__DragonFly__) || defined(__OpenBSD__) \
535
    || defined(__NetBSD__)
536
    {
537
        int flags;
538
        void *addr = NULL;
539
        flags = MAP_PRIVATE | MAP_ANONYMOUS;
540
#if defined(__x86_64__)
541
        /* FreeBSD doesn't have MAP_32BIT, use MAP_FIXED and assume
542
         * 0x40000000 is free */
543
        flags |= MAP_FIXED;
544
        addr = (void *)0x40000000;
545
        /* Cannot map more than that */
546
        if (code_gen_buffer_size > (800 * 1024 * 1024))
547
            code_gen_buffer_size = (800 * 1024 * 1024);
548
#elif defined(__sparc_v9__)
549
        // Map the buffer below 2G, so we can use direct calls and branches
550
        flags |= MAP_FIXED;
551
        addr = (void *) 0x60000000UL;
552
        if (code_gen_buffer_size > (512 * 1024 * 1024)) {
553
            code_gen_buffer_size = (512 * 1024 * 1024);
554
        }
555
#endif
556
        code_gen_buffer = mmap(addr, code_gen_buffer_size,
557
                               PROT_WRITE | PROT_READ | PROT_EXEC, 
558
                               flags, -1, 0);
559
        if (code_gen_buffer == MAP_FAILED) {
560
            fprintf(stderr, "Could not allocate dynamic translator buffer\n");
561
            exit(1);
562
        }
563
    }
564
#else
565
    code_gen_buffer = g_malloc(code_gen_buffer_size);
566
    map_exec(code_gen_buffer, code_gen_buffer_size);
567
#endif
568
#endif /* !USE_STATIC_CODE_GEN_BUFFER */
569
    map_exec(code_gen_prologue, sizeof(code_gen_prologue));
570
    code_gen_buffer_max_size = code_gen_buffer_size -
571
        (TCG_MAX_OP_SIZE * OPC_BUF_SIZE);
572
    code_gen_max_blocks = code_gen_buffer_size / CODE_GEN_AVG_BLOCK_SIZE;
573
    tbs = g_malloc(code_gen_max_blocks * sizeof(TranslationBlock));
574
}
575

    
576
/* Must be called before using the QEMU cpus. 'tb_size' is the size
577
   (in bytes) allocated to the translation buffer. Zero means default
578
   size. */
579
void tcg_exec_init(unsigned long tb_size)
580
{
581
    cpu_gen_init();
582
    code_gen_alloc(tb_size);
583
    code_gen_ptr = code_gen_buffer;
584
    page_init();
585
#if !defined(CONFIG_USER_ONLY) || !defined(CONFIG_USE_GUEST_BASE)
586
    /* There's no guest base to take into account, so go ahead and
587
       initialize the prologue now.  */
588
    tcg_prologue_init(&tcg_ctx);
589
#endif
590
}
591

    
592
bool tcg_enabled(void)
593
{
594
    return code_gen_buffer != NULL;
595
}
596

    
597
void cpu_exec_init_all(void)
598
{
599
#if !defined(CONFIG_USER_ONLY)
600
    memory_map_init();
601
    io_mem_init();
602
#endif
603
}
604

    
605
#if defined(CPU_SAVE_VERSION) && !defined(CONFIG_USER_ONLY)
606

    
607
static int cpu_common_post_load(void *opaque, int version_id)
608
{
609
    CPUState *env = opaque;
610

    
611
    /* 0x01 was CPU_INTERRUPT_EXIT. This line can be removed when the
612
       version_id is increased. */
613
    env->interrupt_request &= ~0x01;
614
    tlb_flush(env, 1);
615

    
616
    return 0;
617
}
618

    
619
static const VMStateDescription vmstate_cpu_common = {
620
    .name = "cpu_common",
621
    .version_id = 1,
622
    .minimum_version_id = 1,
623
    .minimum_version_id_old = 1,
624
    .post_load = cpu_common_post_load,
625
    .fields      = (VMStateField []) {
626
        VMSTATE_UINT32(halted, CPUState),
627
        VMSTATE_UINT32(interrupt_request, CPUState),
628
        VMSTATE_END_OF_LIST()
629
    }
630
};
631
#endif
632

    
633
CPUState *qemu_get_cpu(int cpu)
634
{
635
    CPUState *env = first_cpu;
636

    
637
    while (env) {
638
        if (env->cpu_index == cpu)
639
            break;
640
        env = env->next_cpu;
641
    }
642

    
643
    return env;
644
}
645

    
646
void cpu_exec_init(CPUState *env)
647
{
648
    CPUState **penv;
649
    int cpu_index;
650

    
651
#if defined(CONFIG_USER_ONLY)
652
    cpu_list_lock();
653
#endif
654
    env->next_cpu = NULL;
655
    penv = &first_cpu;
656
    cpu_index = 0;
657
    while (*penv != NULL) {
658
        penv = &(*penv)->next_cpu;
659
        cpu_index++;
660
    }
661
    env->cpu_index = cpu_index;
662
    env->numa_node = 0;
663
    QTAILQ_INIT(&env->breakpoints);
664
    QTAILQ_INIT(&env->watchpoints);
665
#ifndef CONFIG_USER_ONLY
666
    env->thread_id = qemu_get_thread_id();
667
#endif
668
    *penv = env;
669
#if defined(CONFIG_USER_ONLY)
670
    cpu_list_unlock();
671
#endif
672
#if defined(CPU_SAVE_VERSION) && !defined(CONFIG_USER_ONLY)
673
    vmstate_register(NULL, cpu_index, &vmstate_cpu_common, env);
674
    register_savevm(NULL, "cpu", cpu_index, CPU_SAVE_VERSION,
675
                    cpu_save, cpu_load, env);
676
#endif
677
}
678

    
679
/* Allocate a new translation block. Flush the translation buffer if
680
   too many translation blocks or too much generated code. */
681
static TranslationBlock *tb_alloc(target_ulong pc)
682
{
683
    TranslationBlock *tb;
684

    
685
    if (nb_tbs >= code_gen_max_blocks ||
686
        (code_gen_ptr - code_gen_buffer) >= code_gen_buffer_max_size)
687
        return NULL;
688
    tb = &tbs[nb_tbs++];
689
    tb->pc = pc;
690
    tb->cflags = 0;
691
    return tb;
692
}
693

    
694
void tb_free(TranslationBlock *tb)
695
{
696
    /* In practice this is mostly used for single use temporary TB
697
       Ignore the hard cases and just back up if this TB happens to
698
       be the last one generated.  */
699
    if (nb_tbs > 0 && tb == &tbs[nb_tbs - 1]) {
700
        code_gen_ptr = tb->tc_ptr;
701
        nb_tbs--;
702
    }
703
}
704

    
705
static inline void invalidate_page_bitmap(PageDesc *p)
706
{
707
    if (p->code_bitmap) {
708
        g_free(p->code_bitmap);
709
        p->code_bitmap = NULL;
710
    }
711
    p->code_write_count = 0;
712
}
713

    
714
/* Set to NULL all the 'first_tb' fields in all PageDescs. */
715

    
716
static void page_flush_tb_1 (int level, void **lp)
717
{
718
    int i;
719

    
720
    if (*lp == NULL) {
721
        return;
722
    }
723
    if (level == 0) {
724
        PageDesc *pd = *lp;
725
        for (i = 0; i < L2_SIZE; ++i) {
726
            pd[i].first_tb = NULL;
727
            invalidate_page_bitmap(pd + i);
728
        }
729
    } else {
730
        void **pp = *lp;
731
        for (i = 0; i < L2_SIZE; ++i) {
732
            page_flush_tb_1 (level - 1, pp + i);
733
        }
734
    }
735
}
736

    
737
static void page_flush_tb(void)
738
{
739
    int i;
740
    for (i = 0; i < V_L1_SIZE; i++) {
741
        page_flush_tb_1(V_L1_SHIFT / L2_BITS - 1, l1_map + i);
742
    }
743
}
744

    
745
/* flush all the translation blocks */
746
/* XXX: tb_flush is currently not thread safe */
747
void tb_flush(CPUState *env1)
748
{
749
    CPUState *env;
750
#if defined(DEBUG_FLUSH)
751
    printf("qemu: flush code_size=%ld nb_tbs=%d avg_tb_size=%ld\n",
752
           (unsigned long)(code_gen_ptr - code_gen_buffer),
753
           nb_tbs, nb_tbs > 0 ?
754
           ((unsigned long)(code_gen_ptr - code_gen_buffer)) / nb_tbs : 0);
755
#endif
756
    if ((unsigned long)(code_gen_ptr - code_gen_buffer) > code_gen_buffer_size)
757
        cpu_abort(env1, "Internal error: code buffer overflow\n");
758

    
759
    nb_tbs = 0;
760

    
761
    for(env = first_cpu; env != NULL; env = env->next_cpu) {
762
        memset (env->tb_jmp_cache, 0, TB_JMP_CACHE_SIZE * sizeof (void *));
763
    }
764

    
765
    memset (tb_phys_hash, 0, CODE_GEN_PHYS_HASH_SIZE * sizeof (void *));
766
    page_flush_tb();
767

    
768
    code_gen_ptr = code_gen_buffer;
769
    /* XXX: flush processor icache at this point if cache flush is
770
       expensive */
771
    tb_flush_count++;
772
}
773

    
774
#ifdef DEBUG_TB_CHECK
775

    
776
static void tb_invalidate_check(target_ulong address)
777
{
778
    TranslationBlock *tb;
779
    int i;
780
    address &= TARGET_PAGE_MASK;
781
    for(i = 0;i < CODE_GEN_PHYS_HASH_SIZE; i++) {
782
        for(tb = tb_phys_hash[i]; tb != NULL; tb = tb->phys_hash_next) {
783
            if (!(address + TARGET_PAGE_SIZE <= tb->pc ||
784
                  address >= tb->pc + tb->size)) {
785
                printf("ERROR invalidate: address=" TARGET_FMT_lx
786
                       " PC=%08lx size=%04x\n",
787
                       address, (long)tb->pc, tb->size);
788
            }
789
        }
790
    }
791
}
792

    
793
/* verify that all the pages have correct rights for code */
794
static void tb_page_check(void)
795
{
796
    TranslationBlock *tb;
797
    int i, flags1, flags2;
798

    
799
    for(i = 0;i < CODE_GEN_PHYS_HASH_SIZE; i++) {
800
        for(tb = tb_phys_hash[i]; tb != NULL; tb = tb->phys_hash_next) {
801
            flags1 = page_get_flags(tb->pc);
802
            flags2 = page_get_flags(tb->pc + tb->size - 1);
803
            if ((flags1 & PAGE_WRITE) || (flags2 & PAGE_WRITE)) {
804
                printf("ERROR page flags: PC=%08lx size=%04x f1=%x f2=%x\n",
805
                       (long)tb->pc, tb->size, flags1, flags2);
806
            }
807
        }
808
    }
809
}
810

    
811
#endif
812

    
813
/* invalidate one TB */
814
static inline void tb_remove(TranslationBlock **ptb, TranslationBlock *tb,
815
                             int next_offset)
816
{
817
    TranslationBlock *tb1;
818
    for(;;) {
819
        tb1 = *ptb;
820
        if (tb1 == tb) {
821
            *ptb = *(TranslationBlock **)((char *)tb1 + next_offset);
822
            break;
823
        }
824
        ptb = (TranslationBlock **)((char *)tb1 + next_offset);
825
    }
826
}
827

    
828
static inline void tb_page_remove(TranslationBlock **ptb, TranslationBlock *tb)
829
{
830
    TranslationBlock *tb1;
831
    unsigned int n1;
832

    
833
    for(;;) {
834
        tb1 = *ptb;
835
        n1 = (long)tb1 & 3;
836
        tb1 = (TranslationBlock *)((long)tb1 & ~3);
837
        if (tb1 == tb) {
838
            *ptb = tb1->page_next[n1];
839
            break;
840
        }
841
        ptb = &tb1->page_next[n1];
842
    }
843
}
844

    
845
static inline void tb_jmp_remove(TranslationBlock *tb, int n)
846
{
847
    TranslationBlock *tb1, **ptb;
848
    unsigned int n1;
849

    
850
    ptb = &tb->jmp_next[n];
851
    tb1 = *ptb;
852
    if (tb1) {
853
        /* find tb(n) in circular list */
854
        for(;;) {
855
            tb1 = *ptb;
856
            n1 = (long)tb1 & 3;
857
            tb1 = (TranslationBlock *)((long)tb1 & ~3);
858
            if (n1 == n && tb1 == tb)
859
                break;
860
            if (n1 == 2) {
861
                ptb = &tb1->jmp_first;
862
            } else {
863
                ptb = &tb1->jmp_next[n1];
864
            }
865
        }
866
        /* now we can suppress tb(n) from the list */
867
        *ptb = tb->jmp_next[n];
868

    
869
        tb->jmp_next[n] = NULL;
870
    }
871
}
872

    
873
/* reset the jump entry 'n' of a TB so that it is not chained to
874
   another TB */
875
static inline void tb_reset_jump(TranslationBlock *tb, int n)
876
{
877
    tb_set_jmp_target(tb, n, (unsigned long)(tb->tc_ptr + tb->tb_next_offset[n]));
878
}
879

    
880
void tb_phys_invalidate(TranslationBlock *tb, tb_page_addr_t page_addr)
881
{
882
    CPUState *env;
883
    PageDesc *p;
884
    unsigned int h, n1;
885
    tb_page_addr_t phys_pc;
886
    TranslationBlock *tb1, *tb2;
887

    
888
    /* remove the TB from the hash list */
889
    phys_pc = tb->page_addr[0] + (tb->pc & ~TARGET_PAGE_MASK);
890
    h = tb_phys_hash_func(phys_pc);
891
    tb_remove(&tb_phys_hash[h], tb,
892
              offsetof(TranslationBlock, phys_hash_next));
893

    
894
    /* remove the TB from the page list */
895
    if (tb->page_addr[0] != page_addr) {
896
        p = page_find(tb->page_addr[0] >> TARGET_PAGE_BITS);
897
        tb_page_remove(&p->first_tb, tb);
898
        invalidate_page_bitmap(p);
899
    }
900
    if (tb->page_addr[1] != -1 && tb->page_addr[1] != page_addr) {
901
        p = page_find(tb->page_addr[1] >> TARGET_PAGE_BITS);
902
        tb_page_remove(&p->first_tb, tb);
903
        invalidate_page_bitmap(p);
904
    }
905

    
906
    tb_invalidated_flag = 1;
907

    
908
    /* remove the TB from the hash list */
909
    h = tb_jmp_cache_hash_func(tb->pc);
910
    for(env = first_cpu; env != NULL; env = env->next_cpu) {
911
        if (env->tb_jmp_cache[h] == tb)
912
            env->tb_jmp_cache[h] = NULL;
913
    }
914

    
915
    /* suppress this TB from the two jump lists */
916
    tb_jmp_remove(tb, 0);
917
    tb_jmp_remove(tb, 1);
918

    
919
    /* suppress any remaining jumps to this TB */
920
    tb1 = tb->jmp_first;
921
    for(;;) {
922
        n1 = (long)tb1 & 3;
923
        if (n1 == 2)
924
            break;
925
        tb1 = (TranslationBlock *)((long)tb1 & ~3);
926
        tb2 = tb1->jmp_next[n1];
927
        tb_reset_jump(tb1, n1);
928
        tb1->jmp_next[n1] = NULL;
929
        tb1 = tb2;
930
    }
931
    tb->jmp_first = (TranslationBlock *)((long)tb | 2); /* fail safe */
932

    
933
    tb_phys_invalidate_count++;
934
}
935

    
936
static inline void set_bits(uint8_t *tab, int start, int len)
937
{
938
    int end, mask, end1;
939

    
940
    end = start + len;
941
    tab += start >> 3;
942
    mask = 0xff << (start & 7);
943
    if ((start & ~7) == (end & ~7)) {
944
        if (start < end) {
945
            mask &= ~(0xff << (end & 7));
946
            *tab |= mask;
947
        }
948
    } else {
949
        *tab++ |= mask;
950
        start = (start + 8) & ~7;
951
        end1 = end & ~7;
952
        while (start < end1) {
953
            *tab++ = 0xff;
954
            start += 8;
955
        }
956
        if (start < end) {
957
            mask = ~(0xff << (end & 7));
958
            *tab |= mask;
959
        }
960
    }
961
}
962

    
963
static void build_page_bitmap(PageDesc *p)
964
{
965
    int n, tb_start, tb_end;
966
    TranslationBlock *tb;
967

    
968
    p->code_bitmap = g_malloc0(TARGET_PAGE_SIZE / 8);
969

    
970
    tb = p->first_tb;
971
    while (tb != NULL) {
972
        n = (long)tb & 3;
973
        tb = (TranslationBlock *)((long)tb & ~3);
974
        /* NOTE: this is subtle as a TB may span two physical pages */
975
        if (n == 0) {
976
            /* NOTE: tb_end may be after the end of the page, but
977
               it is not a problem */
978
            tb_start = tb->pc & ~TARGET_PAGE_MASK;
979
            tb_end = tb_start + tb->size;
980
            if (tb_end > TARGET_PAGE_SIZE)
981
                tb_end = TARGET_PAGE_SIZE;
982
        } else {
983
            tb_start = 0;
984
            tb_end = ((tb->pc + tb->size) & ~TARGET_PAGE_MASK);
985
        }
986
        set_bits(p->code_bitmap, tb_start, tb_end - tb_start);
987
        tb = tb->page_next[n];
988
    }
989
}
990

    
991
TranslationBlock *tb_gen_code(CPUState *env,
992
                              target_ulong pc, target_ulong cs_base,
993
                              int flags, int cflags)
994
{
995
    TranslationBlock *tb;
996
    uint8_t *tc_ptr;
997
    tb_page_addr_t phys_pc, phys_page2;
998
    target_ulong virt_page2;
999
    int code_gen_size;
1000

    
1001
    phys_pc = get_page_addr_code(env, pc);
1002
    tb = tb_alloc(pc);
1003
    if (!tb) {
1004
        /* flush must be done */
1005
        tb_flush(env);
1006
        /* cannot fail at this point */
1007
        tb = tb_alloc(pc);
1008
        /* Don't forget to invalidate previous TB info.  */
1009
        tb_invalidated_flag = 1;
1010
    }
1011
    tc_ptr = code_gen_ptr;
1012
    tb->tc_ptr = tc_ptr;
1013
    tb->cs_base = cs_base;
1014
    tb->flags = flags;
1015
    tb->cflags = cflags;
1016
    cpu_gen_code(env, tb, &code_gen_size);
1017
    code_gen_ptr = (void *)(((unsigned long)code_gen_ptr + code_gen_size + CODE_GEN_ALIGN - 1) & ~(CODE_GEN_ALIGN - 1));
1018

    
1019
    /* check next page if needed */
1020
    virt_page2 = (pc + tb->size - 1) & TARGET_PAGE_MASK;
1021
    phys_page2 = -1;
1022
    if ((pc & TARGET_PAGE_MASK) != virt_page2) {
1023
        phys_page2 = get_page_addr_code(env, virt_page2);
1024
    }
1025
    tb_link_page(tb, phys_pc, phys_page2);
1026
    return tb;
1027
}
1028

    
1029
/* invalidate all TBs which intersect with the target physical page
1030
   starting in range [start;end[. NOTE: start and end must refer to
1031
   the same physical page. 'is_cpu_write_access' should be true if called
1032
   from a real cpu write access: the virtual CPU will exit the current
1033
   TB if code is modified inside this TB. */
1034
void tb_invalidate_phys_page_range(tb_page_addr_t start, tb_page_addr_t end,
1035
                                   int is_cpu_write_access)
1036
{
1037
    TranslationBlock *tb, *tb_next, *saved_tb;
1038
    CPUState *env = cpu_single_env;
1039
    tb_page_addr_t tb_start, tb_end;
1040
    PageDesc *p;
1041
    int n;
1042
#ifdef TARGET_HAS_PRECISE_SMC
1043
    int current_tb_not_found = is_cpu_write_access;
1044
    TranslationBlock *current_tb = NULL;
1045
    int current_tb_modified = 0;
1046
    target_ulong current_pc = 0;
1047
    target_ulong current_cs_base = 0;
1048
    int current_flags = 0;
1049
#endif /* TARGET_HAS_PRECISE_SMC */
1050

    
1051
    p = page_find(start >> TARGET_PAGE_BITS);
1052
    if (!p)
1053
        return;
1054
    if (!p->code_bitmap &&
1055
        ++p->code_write_count >= SMC_BITMAP_USE_THRESHOLD &&
1056
        is_cpu_write_access) {
1057
        /* build code bitmap */
1058
        build_page_bitmap(p);
1059
    }
1060

    
1061
    /* we remove all the TBs in the range [start, end[ */
1062
    /* XXX: see if in some cases it could be faster to invalidate all the code */
1063
    tb = p->first_tb;
1064
    while (tb != NULL) {
1065
        n = (long)tb & 3;
1066
        tb = (TranslationBlock *)((long)tb & ~3);
1067
        tb_next = tb->page_next[n];
1068
        /* NOTE: this is subtle as a TB may span two physical pages */
1069
        if (n == 0) {
1070
            /* NOTE: tb_end may be after the end of the page, but
1071
               it is not a problem */
1072
            tb_start = tb->page_addr[0] + (tb->pc & ~TARGET_PAGE_MASK);
1073
            tb_end = tb_start + tb->size;
1074
        } else {
1075
            tb_start = tb->page_addr[1];
1076
            tb_end = tb_start + ((tb->pc + tb->size) & ~TARGET_PAGE_MASK);
1077
        }
1078
        if (!(tb_end <= start || tb_start >= end)) {
1079
#ifdef TARGET_HAS_PRECISE_SMC
1080
            if (current_tb_not_found) {
1081
                current_tb_not_found = 0;
1082
                current_tb = NULL;
1083
                if (env->mem_io_pc) {
1084
                    /* now we have a real cpu fault */
1085
                    current_tb = tb_find_pc(env->mem_io_pc);
1086
                }
1087
            }
1088
            if (current_tb == tb &&
1089
                (current_tb->cflags & CF_COUNT_MASK) != 1) {
1090
                /* If we are modifying the current TB, we must stop
1091
                its execution. We could be more precise by checking
1092
                that the modification is after the current PC, but it
1093
                would require a specialized function to partially
1094
                restore the CPU state */
1095

    
1096
                current_tb_modified = 1;
1097
                cpu_restore_state(current_tb, env, env->mem_io_pc);
1098
                cpu_get_tb_cpu_state(env, &current_pc, &current_cs_base,
1099
                                     &current_flags);
1100
            }
1101
#endif /* TARGET_HAS_PRECISE_SMC */
1102
            /* we need to do that to handle the case where a signal
1103
               occurs while doing tb_phys_invalidate() */
1104
            saved_tb = NULL;
1105
            if (env) {
1106
                saved_tb = env->current_tb;
1107
                env->current_tb = NULL;
1108
            }
1109
            tb_phys_invalidate(tb, -1);
1110
            if (env) {
1111
                env->current_tb = saved_tb;
1112
                if (env->interrupt_request && env->current_tb)
1113
                    cpu_interrupt(env, env->interrupt_request);
1114
            }
1115
        }
1116
        tb = tb_next;
1117
    }
1118
#if !defined(CONFIG_USER_ONLY)
1119
    /* if no code remaining, no need to continue to use slow writes */
1120
    if (!p->first_tb) {
1121
        invalidate_page_bitmap(p);
1122
        if (is_cpu_write_access) {
1123
            tlb_unprotect_code_phys(env, start, env->mem_io_vaddr);
1124
        }
1125
    }
1126
#endif
1127
#ifdef TARGET_HAS_PRECISE_SMC
1128
    if (current_tb_modified) {
1129
        /* we generate a block containing just the instruction
1130
           modifying the memory. It will ensure that it cannot modify
1131
           itself */
1132
        env->current_tb = NULL;
1133
        tb_gen_code(env, current_pc, current_cs_base, current_flags, 1);
1134
        cpu_resume_from_signal(env, NULL);
1135
    }
1136
#endif
1137
}
1138

    
1139
/* len must be <= 8 and start must be a multiple of len */
1140
static inline void tb_invalidate_phys_page_fast(tb_page_addr_t start, int len)
1141
{
1142
    PageDesc *p;
1143
    int offset, b;
1144
#if 0
1145
    if (1) {
1146
        qemu_log("modifying code at 0x%x size=%d EIP=%x PC=%08x\n",
1147
                  cpu_single_env->mem_io_vaddr, len,
1148
                  cpu_single_env->eip,
1149
                  cpu_single_env->eip + (long)cpu_single_env->segs[R_CS].base);
1150
    }
1151
#endif
1152
    p = page_find(start >> TARGET_PAGE_BITS);
1153
    if (!p)
1154
        return;
1155
    if (p->code_bitmap) {
1156
        offset = start & ~TARGET_PAGE_MASK;
1157
        b = p->code_bitmap[offset >> 3] >> (offset & 7);
1158
        if (b & ((1 << len) - 1))
1159
            goto do_invalidate;
1160
    } else {
1161
    do_invalidate:
1162
        tb_invalidate_phys_page_range(start, start + len, 1);
1163
    }
1164
}
1165

    
1166
#if !defined(CONFIG_SOFTMMU)
1167
static void tb_invalidate_phys_page(tb_page_addr_t addr,
1168
                                    unsigned long pc, void *puc)
1169
{
1170
    TranslationBlock *tb;
1171
    PageDesc *p;
1172
    int n;
1173
#ifdef TARGET_HAS_PRECISE_SMC
1174
    TranslationBlock *current_tb = NULL;
1175
    CPUState *env = cpu_single_env;
1176
    int current_tb_modified = 0;
1177
    target_ulong current_pc = 0;
1178
    target_ulong current_cs_base = 0;
1179
    int current_flags = 0;
1180
#endif
1181

    
1182
    addr &= TARGET_PAGE_MASK;
1183
    p = page_find(addr >> TARGET_PAGE_BITS);
1184
    if (!p)
1185
        return;
1186
    tb = p->first_tb;
1187
#ifdef TARGET_HAS_PRECISE_SMC
1188
    if (tb && pc != 0) {
1189
        current_tb = tb_find_pc(pc);
1190
    }
1191
#endif
1192
    while (tb != NULL) {
1193
        n = (long)tb & 3;
1194
        tb = (TranslationBlock *)((long)tb & ~3);
1195
#ifdef TARGET_HAS_PRECISE_SMC
1196
        if (current_tb == tb &&
1197
            (current_tb->cflags & CF_COUNT_MASK) != 1) {
1198
                /* If we are modifying the current TB, we must stop
1199
                   its execution. We could be more precise by checking
1200
                   that the modification is after the current PC, but it
1201
                   would require a specialized function to partially
1202
                   restore the CPU state */
1203

    
1204
            current_tb_modified = 1;
1205
            cpu_restore_state(current_tb, env, pc);
1206
            cpu_get_tb_cpu_state(env, &current_pc, &current_cs_base,
1207
                                 &current_flags);
1208
        }
1209
#endif /* TARGET_HAS_PRECISE_SMC */
1210
        tb_phys_invalidate(tb, addr);
1211
        tb = tb->page_next[n];
1212
    }
1213
    p->first_tb = NULL;
1214
#ifdef TARGET_HAS_PRECISE_SMC
1215
    if (current_tb_modified) {
1216
        /* we generate a block containing just the instruction
1217
           modifying the memory. It will ensure that it cannot modify
1218
           itself */
1219
        env->current_tb = NULL;
1220
        tb_gen_code(env, current_pc, current_cs_base, current_flags, 1);
1221
        cpu_resume_from_signal(env, puc);
1222
    }
1223
#endif
1224
}
1225
#endif
1226

    
1227
/* add the tb in the target page and protect it if necessary */
1228
static inline void tb_alloc_page(TranslationBlock *tb,
1229
                                 unsigned int n, tb_page_addr_t page_addr)
1230
{
1231
    PageDesc *p;
1232
#ifndef CONFIG_USER_ONLY
1233
    bool page_already_protected;
1234
#endif
1235

    
1236
    tb->page_addr[n] = page_addr;
1237
    p = page_find_alloc(page_addr >> TARGET_PAGE_BITS, 1);
1238
    tb->page_next[n] = p->first_tb;
1239
#ifndef CONFIG_USER_ONLY
1240
    page_already_protected = p->first_tb != NULL;
1241
#endif
1242
    p->first_tb = (TranslationBlock *)((long)tb | n);
1243
    invalidate_page_bitmap(p);
1244

    
1245
#if defined(TARGET_HAS_SMC) || 1
1246

    
1247
#if defined(CONFIG_USER_ONLY)
1248
    if (p->flags & PAGE_WRITE) {
1249
        target_ulong addr;
1250
        PageDesc *p2;
1251
        int prot;
1252

    
1253
        /* force the host page as non writable (writes will have a
1254
           page fault + mprotect overhead) */
1255
        page_addr &= qemu_host_page_mask;
1256
        prot = 0;
1257
        for(addr = page_addr; addr < page_addr + qemu_host_page_size;
1258
            addr += TARGET_PAGE_SIZE) {
1259

    
1260
            p2 = page_find (addr >> TARGET_PAGE_BITS);
1261
            if (!p2)
1262
                continue;
1263
            prot |= p2->flags;
1264
            p2->flags &= ~PAGE_WRITE;
1265
          }
1266
        mprotect(g2h(page_addr), qemu_host_page_size,
1267
                 (prot & PAGE_BITS) & ~PAGE_WRITE);
1268
#ifdef DEBUG_TB_INVALIDATE
1269
        printf("protecting code page: 0x" TARGET_FMT_lx "\n",
1270
               page_addr);
1271
#endif
1272
    }
1273
#else
1274
    /* if some code is already present, then the pages are already
1275
       protected. So we handle the case where only the first TB is
1276
       allocated in a physical page */
1277
    if (!page_already_protected) {
1278
        tlb_protect_code(page_addr);
1279
    }
1280
#endif
1281

    
1282
#endif /* TARGET_HAS_SMC */
1283
}
1284

    
1285
/* add a new TB and link it to the physical page tables. phys_page2 is
1286
   (-1) to indicate that only one page contains the TB. */
1287
void tb_link_page(TranslationBlock *tb,
1288
                  tb_page_addr_t phys_pc, tb_page_addr_t phys_page2)
1289
{
1290
    unsigned int h;
1291
    TranslationBlock **ptb;
1292

    
1293
    /* Grab the mmap lock to stop another thread invalidating this TB
1294
       before we are done.  */
1295
    mmap_lock();
1296
    /* add in the physical hash table */
1297
    h = tb_phys_hash_func(phys_pc);
1298
    ptb = &tb_phys_hash[h];
1299
    tb->phys_hash_next = *ptb;
1300
    *ptb = tb;
1301

    
1302
    /* add in the page list */
1303
    tb_alloc_page(tb, 0, phys_pc & TARGET_PAGE_MASK);
1304
    if (phys_page2 != -1)
1305
        tb_alloc_page(tb, 1, phys_page2);
1306
    else
1307
        tb->page_addr[1] = -1;
1308

    
1309
    tb->jmp_first = (TranslationBlock *)((long)tb | 2);
1310
    tb->jmp_next[0] = NULL;
1311
    tb->jmp_next[1] = NULL;
1312

    
1313
    /* init original jump addresses */
1314
    if (tb->tb_next_offset[0] != 0xffff)
1315
        tb_reset_jump(tb, 0);
1316
    if (tb->tb_next_offset[1] != 0xffff)
1317
        tb_reset_jump(tb, 1);
1318

    
1319
#ifdef DEBUG_TB_CHECK
1320
    tb_page_check();
1321
#endif
1322
    mmap_unlock();
1323
}
1324

    
1325
/* find the TB 'tb' such that tb[0].tc_ptr <= tc_ptr <
1326
   tb[1].tc_ptr. Return NULL if not found */
1327
TranslationBlock *tb_find_pc(unsigned long tc_ptr)
1328
{
1329
    int m_min, m_max, m;
1330
    unsigned long v;
1331
    TranslationBlock *tb;
1332

    
1333
    if (nb_tbs <= 0)
1334
        return NULL;
1335
    if (tc_ptr < (unsigned long)code_gen_buffer ||
1336
        tc_ptr >= (unsigned long)code_gen_ptr)
1337
        return NULL;
1338
    /* binary search (cf Knuth) */
1339
    m_min = 0;
1340
    m_max = nb_tbs - 1;
1341
    while (m_min <= m_max) {
1342
        m = (m_min + m_max) >> 1;
1343
        tb = &tbs[m];
1344
        v = (unsigned long)tb->tc_ptr;
1345
        if (v == tc_ptr)
1346
            return tb;
1347
        else if (tc_ptr < v) {
1348
            m_max = m - 1;
1349
        } else {
1350
            m_min = m + 1;
1351
        }
1352
    }
1353
    return &tbs[m_max];
1354
}
1355

    
1356
static void tb_reset_jump_recursive(TranslationBlock *tb);
1357

    
1358
static inline void tb_reset_jump_recursive2(TranslationBlock *tb, int n)
1359
{
1360
    TranslationBlock *tb1, *tb_next, **ptb;
1361
    unsigned int n1;
1362

    
1363
    tb1 = tb->jmp_next[n];
1364
    if (tb1 != NULL) {
1365
        /* find head of list */
1366
        for(;;) {
1367
            n1 = (long)tb1 & 3;
1368
            tb1 = (TranslationBlock *)((long)tb1 & ~3);
1369
            if (n1 == 2)
1370
                break;
1371
            tb1 = tb1->jmp_next[n1];
1372
        }
1373
        /* we are now sure now that tb jumps to tb1 */
1374
        tb_next = tb1;
1375

    
1376
        /* remove tb from the jmp_first list */
1377
        ptb = &tb_next->jmp_first;
1378
        for(;;) {
1379
            tb1 = *ptb;
1380
            n1 = (long)tb1 & 3;
1381
            tb1 = (TranslationBlock *)((long)tb1 & ~3);
1382
            if (n1 == n && tb1 == tb)
1383
                break;
1384
            ptb = &tb1->jmp_next[n1];
1385
        }
1386
        *ptb = tb->jmp_next[n];
1387
        tb->jmp_next[n] = NULL;
1388

    
1389
        /* suppress the jump to next tb in generated code */
1390
        tb_reset_jump(tb, n);
1391

    
1392
        /* suppress jumps in the tb on which we could have jumped */
1393
        tb_reset_jump_recursive(tb_next);
1394
    }
1395
}
1396

    
1397
static void tb_reset_jump_recursive(TranslationBlock *tb)
1398
{
1399
    tb_reset_jump_recursive2(tb, 0);
1400
    tb_reset_jump_recursive2(tb, 1);
1401
}
1402

    
1403
#if defined(TARGET_HAS_ICE)
1404
#if defined(CONFIG_USER_ONLY)
1405
static void breakpoint_invalidate(CPUState *env, target_ulong pc)
1406
{
1407
    tb_invalidate_phys_page_range(pc, pc + 1, 0);
1408
}
1409
#else
1410
static void breakpoint_invalidate(CPUState *env, target_ulong pc)
1411
{
1412
    target_phys_addr_t addr;
1413
    target_ulong pd;
1414
    ram_addr_t ram_addr;
1415
    PhysPageDesc p;
1416

    
1417
    addr = cpu_get_phys_page_debug(env, pc);
1418
    p = phys_page_find(addr >> TARGET_PAGE_BITS);
1419
    pd = p.phys_offset;
1420
    ram_addr = (pd & TARGET_PAGE_MASK) | (pc & ~TARGET_PAGE_MASK);
1421
    tb_invalidate_phys_page_range(ram_addr, ram_addr + 1, 0);
1422
}
1423
#endif
1424
#endif /* TARGET_HAS_ICE */
1425

    
1426
#if defined(CONFIG_USER_ONLY)
1427
void cpu_watchpoint_remove_all(CPUState *env, int mask)
1428

    
1429
{
1430
}
1431

    
1432
int cpu_watchpoint_insert(CPUState *env, target_ulong addr, target_ulong len,
1433
                          int flags, CPUWatchpoint **watchpoint)
1434
{
1435
    return -ENOSYS;
1436
}
1437
#else
1438
/* Add a watchpoint.  */
1439
int cpu_watchpoint_insert(CPUState *env, target_ulong addr, target_ulong len,
1440
                          int flags, CPUWatchpoint **watchpoint)
1441
{
1442
    target_ulong len_mask = ~(len - 1);
1443
    CPUWatchpoint *wp;
1444

    
1445
    /* sanity checks: allow power-of-2 lengths, deny unaligned watchpoints */
1446
    if ((len != 1 && len != 2 && len != 4 && len != 8) || (addr & ~len_mask)) {
1447
        fprintf(stderr, "qemu: tried to set invalid watchpoint at "
1448
                TARGET_FMT_lx ", len=" TARGET_FMT_lu "\n", addr, len);
1449
        return -EINVAL;
1450
    }
1451
    wp = g_malloc(sizeof(*wp));
1452

    
1453
    wp->vaddr = addr;
1454
    wp->len_mask = len_mask;
1455
    wp->flags = flags;
1456

    
1457
    /* keep all GDB-injected watchpoints in front */
1458
    if (flags & BP_GDB)
1459
        QTAILQ_INSERT_HEAD(&env->watchpoints, wp, entry);
1460
    else
1461
        QTAILQ_INSERT_TAIL(&env->watchpoints, wp, entry);
1462

    
1463
    tlb_flush_page(env, addr);
1464

    
1465
    if (watchpoint)
1466
        *watchpoint = wp;
1467
    return 0;
1468
}
1469

    
1470
/* Remove a specific watchpoint.  */
1471
int cpu_watchpoint_remove(CPUState *env, target_ulong addr, target_ulong len,
1472
                          int flags)
1473
{
1474
    target_ulong len_mask = ~(len - 1);
1475
    CPUWatchpoint *wp;
1476

    
1477
    QTAILQ_FOREACH(wp, &env->watchpoints, entry) {
1478
        if (addr == wp->vaddr && len_mask == wp->len_mask
1479
                && flags == (wp->flags & ~BP_WATCHPOINT_HIT)) {
1480
            cpu_watchpoint_remove_by_ref(env, wp);
1481
            return 0;
1482
        }
1483
    }
1484
    return -ENOENT;
1485
}
1486

    
1487
/* Remove a specific watchpoint by reference.  */
1488
void cpu_watchpoint_remove_by_ref(CPUState *env, CPUWatchpoint *watchpoint)
1489
{
1490
    QTAILQ_REMOVE(&env->watchpoints, watchpoint, entry);
1491

    
1492
    tlb_flush_page(env, watchpoint->vaddr);
1493

    
1494
    g_free(watchpoint);
1495
}
1496

    
1497
/* Remove all matching watchpoints.  */
1498
void cpu_watchpoint_remove_all(CPUState *env, int mask)
1499
{
1500
    CPUWatchpoint *wp, *next;
1501

    
1502
    QTAILQ_FOREACH_SAFE(wp, &env->watchpoints, entry, next) {
1503
        if (wp->flags & mask)
1504
            cpu_watchpoint_remove_by_ref(env, wp);
1505
    }
1506
}
1507
#endif
1508

    
1509
/* Add a breakpoint.  */
1510
int cpu_breakpoint_insert(CPUState *env, target_ulong pc, int flags,
1511
                          CPUBreakpoint **breakpoint)
1512
{
1513
#if defined(TARGET_HAS_ICE)
1514
    CPUBreakpoint *bp;
1515

    
1516
    bp = g_malloc(sizeof(*bp));
1517

    
1518
    bp->pc = pc;
1519
    bp->flags = flags;
1520

    
1521
    /* keep all GDB-injected breakpoints in front */
1522
    if (flags & BP_GDB)
1523
        QTAILQ_INSERT_HEAD(&env->breakpoints, bp, entry);
1524
    else
1525
        QTAILQ_INSERT_TAIL(&env->breakpoints, bp, entry);
1526

    
1527
    breakpoint_invalidate(env, pc);
1528

    
1529
    if (breakpoint)
1530
        *breakpoint = bp;
1531
    return 0;
1532
#else
1533
    return -ENOSYS;
1534
#endif
1535
}
1536

    
1537
/* Remove a specific breakpoint.  */
1538
int cpu_breakpoint_remove(CPUState *env, target_ulong pc, int flags)
1539
{
1540
#if defined(TARGET_HAS_ICE)
1541
    CPUBreakpoint *bp;
1542

    
1543
    QTAILQ_FOREACH(bp, &env->breakpoints, entry) {
1544
        if (bp->pc == pc && bp->flags == flags) {
1545
            cpu_breakpoint_remove_by_ref(env, bp);
1546
            return 0;
1547
        }
1548
    }
1549
    return -ENOENT;
1550
#else
1551
    return -ENOSYS;
1552
#endif
1553
}
1554

    
1555
/* Remove a specific breakpoint by reference.  */
1556
void cpu_breakpoint_remove_by_ref(CPUState *env, CPUBreakpoint *breakpoint)
1557
{
1558
#if defined(TARGET_HAS_ICE)
1559
    QTAILQ_REMOVE(&env->breakpoints, breakpoint, entry);
1560

    
1561
    breakpoint_invalidate(env, breakpoint->pc);
1562

    
1563
    g_free(breakpoint);
1564
#endif
1565
}
1566

    
1567
/* Remove all matching breakpoints. */
1568
void cpu_breakpoint_remove_all(CPUState *env, int mask)
1569
{
1570
#if defined(TARGET_HAS_ICE)
1571
    CPUBreakpoint *bp, *next;
1572

    
1573
    QTAILQ_FOREACH_SAFE(bp, &env->breakpoints, entry, next) {
1574
        if (bp->flags & mask)
1575
            cpu_breakpoint_remove_by_ref(env, bp);
1576
    }
1577
#endif
1578
}
1579

    
1580
/* enable or disable single step mode. EXCP_DEBUG is returned by the
1581
   CPU loop after each instruction */
1582
void cpu_single_step(CPUState *env, int enabled)
1583
{
1584
#if defined(TARGET_HAS_ICE)
1585
    if (env->singlestep_enabled != enabled) {
1586
        env->singlestep_enabled = enabled;
1587
        if (kvm_enabled())
1588
            kvm_update_guest_debug(env, 0);
1589
        else {
1590
            /* must flush all the translated code to avoid inconsistencies */
1591
            /* XXX: only flush what is necessary */
1592
            tb_flush(env);
1593
        }
1594
    }
1595
#endif
1596
}
1597

    
1598
/* enable or disable low levels log */
1599
void cpu_set_log(int log_flags)
1600
{
1601
    loglevel = log_flags;
1602
    if (loglevel && !logfile) {
1603
        logfile = fopen(logfilename, log_append ? "a" : "w");
1604
        if (!logfile) {
1605
            perror(logfilename);
1606
            _exit(1);
1607
        }
1608
#if !defined(CONFIG_SOFTMMU)
1609
        /* must avoid mmap() usage of glibc by setting a buffer "by hand" */
1610
        {
1611
            static char logfile_buf[4096];
1612
            setvbuf(logfile, logfile_buf, _IOLBF, sizeof(logfile_buf));
1613
        }
1614
#elif defined(_WIN32)
1615
        /* Win32 doesn't support line-buffering, so use unbuffered output. */
1616
        setvbuf(logfile, NULL, _IONBF, 0);
1617
#else
1618
        setvbuf(logfile, NULL, _IOLBF, 0);
1619
#endif
1620
        log_append = 1;
1621
    }
1622
    if (!loglevel && logfile) {
1623
        fclose(logfile);
1624
        logfile = NULL;
1625
    }
1626
}
1627

    
1628
void cpu_set_log_filename(const char *filename)
1629
{
1630
    logfilename = strdup(filename);
1631
    if (logfile) {
1632
        fclose(logfile);
1633
        logfile = NULL;
1634
    }
1635
    cpu_set_log(loglevel);
1636
}
1637

    
1638
static void cpu_unlink_tb(CPUState *env)
1639
{
1640
    /* FIXME: TB unchaining isn't SMP safe.  For now just ignore the
1641
       problem and hope the cpu will stop of its own accord.  For userspace
1642
       emulation this often isn't actually as bad as it sounds.  Often
1643
       signals are used primarily to interrupt blocking syscalls.  */
1644
    TranslationBlock *tb;
1645
    static spinlock_t interrupt_lock = SPIN_LOCK_UNLOCKED;
1646

    
1647
    spin_lock(&interrupt_lock);
1648
    tb = env->current_tb;
1649
    /* if the cpu is currently executing code, we must unlink it and
1650
       all the potentially executing TB */
1651
    if (tb) {
1652
        env->current_tb = NULL;
1653
        tb_reset_jump_recursive(tb);
1654
    }
1655
    spin_unlock(&interrupt_lock);
1656
}
1657

    
1658
#ifndef CONFIG_USER_ONLY
1659
/* mask must never be zero, except for A20 change call */
1660
static void tcg_handle_interrupt(CPUState *env, int mask)
1661
{
1662
    int old_mask;
1663

    
1664
    old_mask = env->interrupt_request;
1665
    env->interrupt_request |= mask;
1666

    
1667
    /*
1668
     * If called from iothread context, wake the target cpu in
1669
     * case its halted.
1670
     */
1671
    if (!qemu_cpu_is_self(env)) {
1672
        qemu_cpu_kick(env);
1673
        return;
1674
    }
1675

    
1676
    if (use_icount) {
1677
        env->icount_decr.u16.high = 0xffff;
1678
        if (!can_do_io(env)
1679
            && (mask & ~old_mask) != 0) {
1680
            cpu_abort(env, "Raised interrupt while not in I/O function");
1681
        }
1682
    } else {
1683
        cpu_unlink_tb(env);
1684
    }
1685
}
1686

    
1687
CPUInterruptHandler cpu_interrupt_handler = tcg_handle_interrupt;
1688

    
1689
#else /* CONFIG_USER_ONLY */
1690

    
1691
void cpu_interrupt(CPUState *env, int mask)
1692
{
1693
    env->interrupt_request |= mask;
1694
    cpu_unlink_tb(env);
1695
}
1696
#endif /* CONFIG_USER_ONLY */
1697

    
1698
void cpu_reset_interrupt(CPUState *env, int mask)
1699
{
1700
    env->interrupt_request &= ~mask;
1701
}
1702

    
1703
void cpu_exit(CPUState *env)
1704
{
1705
    env->exit_request = 1;
1706
    cpu_unlink_tb(env);
1707
}
1708

    
1709
const CPULogItem cpu_log_items[] = {
1710
    { CPU_LOG_TB_OUT_ASM, "out_asm",
1711
      "show generated host assembly code for each compiled TB" },
1712
    { CPU_LOG_TB_IN_ASM, "in_asm",
1713
      "show target assembly code for each compiled TB" },
1714
    { CPU_LOG_TB_OP, "op",
1715
      "show micro ops for each compiled TB" },
1716
    { CPU_LOG_TB_OP_OPT, "op_opt",
1717
      "show micro ops "
1718
#ifdef TARGET_I386
1719
      "before eflags optimization and "
1720
#endif
1721
      "after liveness analysis" },
1722
    { CPU_LOG_INT, "int",
1723
      "show interrupts/exceptions in short format" },
1724
    { CPU_LOG_EXEC, "exec",
1725
      "show trace before each executed TB (lots of logs)" },
1726
    { CPU_LOG_TB_CPU, "cpu",
1727
      "show CPU state before block translation" },
1728
#ifdef TARGET_I386
1729
    { CPU_LOG_PCALL, "pcall",
1730
      "show protected mode far calls/returns/exceptions" },
1731
    { CPU_LOG_RESET, "cpu_reset",
1732
      "show CPU state before CPU resets" },
1733
#endif
1734
#ifdef DEBUG_IOPORT
1735
    { CPU_LOG_IOPORT, "ioport",
1736
      "show all i/o ports accesses" },
1737
#endif
1738
    { 0, NULL, NULL },
1739
};
1740

    
1741
static int cmp1(const char *s1, int n, const char *s2)
1742
{
1743
    if (strlen(s2) != n)
1744
        return 0;
1745
    return memcmp(s1, s2, n) == 0;
1746
}
1747

    
1748
/* takes a comma separated list of log masks. Return 0 if error. */
1749
int cpu_str_to_log_mask(const char *str)
1750
{
1751
    const CPULogItem *item;
1752
    int mask;
1753
    const char *p, *p1;
1754

    
1755
    p = str;
1756
    mask = 0;
1757
    for(;;) {
1758
        p1 = strchr(p, ',');
1759
        if (!p1)
1760
            p1 = p + strlen(p);
1761
        if(cmp1(p,p1-p,"all")) {
1762
            for(item = cpu_log_items; item->mask != 0; item++) {
1763
                mask |= item->mask;
1764
            }
1765
        } else {
1766
            for(item = cpu_log_items; item->mask != 0; item++) {
1767
                if (cmp1(p, p1 - p, item->name))
1768
                    goto found;
1769
            }
1770
            return 0;
1771
        }
1772
    found:
1773
        mask |= item->mask;
1774
        if (*p1 != ',')
1775
            break;
1776
        p = p1 + 1;
1777
    }
1778
    return mask;
1779
}
1780

    
1781
void cpu_abort(CPUState *env, const char *fmt, ...)
1782
{
1783
    va_list ap;
1784
    va_list ap2;
1785

    
1786
    va_start(ap, fmt);
1787
    va_copy(ap2, ap);
1788
    fprintf(stderr, "qemu: fatal: ");
1789
    vfprintf(stderr, fmt, ap);
1790
    fprintf(stderr, "\n");
1791
#ifdef TARGET_I386
1792
    cpu_dump_state(env, stderr, fprintf, X86_DUMP_FPU | X86_DUMP_CCOP);
1793
#else
1794
    cpu_dump_state(env, stderr, fprintf, 0);
1795
#endif
1796
    if (qemu_log_enabled()) {
1797
        qemu_log("qemu: fatal: ");
1798
        qemu_log_vprintf(fmt, ap2);
1799
        qemu_log("\n");
1800
#ifdef TARGET_I386
1801
        log_cpu_state(env, X86_DUMP_FPU | X86_DUMP_CCOP);
1802
#else
1803
        log_cpu_state(env, 0);
1804
#endif
1805
        qemu_log_flush();
1806
        qemu_log_close();
1807
    }
1808
    va_end(ap2);
1809
    va_end(ap);
1810
#if defined(CONFIG_USER_ONLY)
1811
    {
1812
        struct sigaction act;
1813
        sigfillset(&act.sa_mask);
1814
        act.sa_handler = SIG_DFL;
1815
        sigaction(SIGABRT, &act, NULL);
1816
    }
1817
#endif
1818
    abort();
1819
}
1820

    
1821
CPUState *cpu_copy(CPUState *env)
1822
{
1823
    CPUState *new_env = cpu_init(env->cpu_model_str);
1824
    CPUState *next_cpu = new_env->next_cpu;
1825
    int cpu_index = new_env->cpu_index;
1826
#if defined(TARGET_HAS_ICE)
1827
    CPUBreakpoint *bp;
1828
    CPUWatchpoint *wp;
1829
#endif
1830

    
1831
    memcpy(new_env, env, sizeof(CPUState));
1832

    
1833
    /* Preserve chaining and index. */
1834
    new_env->next_cpu = next_cpu;
1835
    new_env->cpu_index = cpu_index;
1836

    
1837
    /* Clone all break/watchpoints.
1838
       Note: Once we support ptrace with hw-debug register access, make sure
1839
       BP_CPU break/watchpoints are handled correctly on clone. */
1840
    QTAILQ_INIT(&env->breakpoints);
1841
    QTAILQ_INIT(&env->watchpoints);
1842
#if defined(TARGET_HAS_ICE)
1843
    QTAILQ_FOREACH(bp, &env->breakpoints, entry) {
1844
        cpu_breakpoint_insert(new_env, bp->pc, bp->flags, NULL);
1845
    }
1846
    QTAILQ_FOREACH(wp, &env->watchpoints, entry) {
1847
        cpu_watchpoint_insert(new_env, wp->vaddr, (~wp->len_mask) + 1,
1848
                              wp->flags, NULL);
1849
    }
1850
#endif
1851

    
1852
    return new_env;
1853
}
1854

    
1855
#if !defined(CONFIG_USER_ONLY)
1856

    
1857
static inline void tlb_flush_jmp_cache(CPUState *env, target_ulong addr)
1858
{
1859
    unsigned int i;
1860

    
1861
    /* Discard jump cache entries for any tb which might potentially
1862
       overlap the flushed page.  */
1863
    i = tb_jmp_cache_hash_page(addr - TARGET_PAGE_SIZE);
1864
    memset (&env->tb_jmp_cache[i], 0, 
1865
            TB_JMP_PAGE_SIZE * sizeof(TranslationBlock *));
1866

    
1867
    i = tb_jmp_cache_hash_page(addr);
1868
    memset (&env->tb_jmp_cache[i], 0, 
1869
            TB_JMP_PAGE_SIZE * sizeof(TranslationBlock *));
1870
}
1871

    
1872
static CPUTLBEntry s_cputlb_empty_entry = {
1873
    .addr_read  = -1,
1874
    .addr_write = -1,
1875
    .addr_code  = -1,
1876
    .addend     = -1,
1877
};
1878

    
1879
/* NOTE: if flush_global is true, also flush global entries (not
1880
   implemented yet) */
1881
void tlb_flush(CPUState *env, int flush_global)
1882
{
1883
    int i;
1884

    
1885
#if defined(DEBUG_TLB)
1886
    printf("tlb_flush:\n");
1887
#endif
1888
    /* must reset current TB so that interrupts cannot modify the
1889
       links while we are modifying them */
1890
    env->current_tb = NULL;
1891

    
1892
    for(i = 0; i < CPU_TLB_SIZE; i++) {
1893
        int mmu_idx;
1894
        for (mmu_idx = 0; mmu_idx < NB_MMU_MODES; mmu_idx++) {
1895
            env->tlb_table[mmu_idx][i] = s_cputlb_empty_entry;
1896
        }
1897
    }
1898

    
1899
    memset (env->tb_jmp_cache, 0, TB_JMP_CACHE_SIZE * sizeof (void *));
1900

    
1901
    env->tlb_flush_addr = -1;
1902
    env->tlb_flush_mask = 0;
1903
    tlb_flush_count++;
1904
}
1905

    
1906
static inline void tlb_flush_entry(CPUTLBEntry *tlb_entry, target_ulong addr)
1907
{
1908
    if (addr == (tlb_entry->addr_read &
1909
                 (TARGET_PAGE_MASK | TLB_INVALID_MASK)) ||
1910
        addr == (tlb_entry->addr_write &
1911
                 (TARGET_PAGE_MASK | TLB_INVALID_MASK)) ||
1912
        addr == (tlb_entry->addr_code &
1913
                 (TARGET_PAGE_MASK | TLB_INVALID_MASK))) {
1914
        *tlb_entry = s_cputlb_empty_entry;
1915
    }
1916
}
1917

    
1918
void tlb_flush_page(CPUState *env, target_ulong addr)
1919
{
1920
    int i;
1921
    int mmu_idx;
1922

    
1923
#if defined(DEBUG_TLB)
1924
    printf("tlb_flush_page: " TARGET_FMT_lx "\n", addr);
1925
#endif
1926
    /* Check if we need to flush due to large pages.  */
1927
    if ((addr & env->tlb_flush_mask) == env->tlb_flush_addr) {
1928
#if defined(DEBUG_TLB)
1929
        printf("tlb_flush_page: forced full flush ("
1930
               TARGET_FMT_lx "/" TARGET_FMT_lx ")\n",
1931
               env->tlb_flush_addr, env->tlb_flush_mask);
1932
#endif
1933
        tlb_flush(env, 1);
1934
        return;
1935
    }
1936
    /* must reset current TB so that interrupts cannot modify the
1937
       links while we are modifying them */
1938
    env->current_tb = NULL;
1939

    
1940
    addr &= TARGET_PAGE_MASK;
1941
    i = (addr >> TARGET_PAGE_BITS) & (CPU_TLB_SIZE - 1);
1942
    for (mmu_idx = 0; mmu_idx < NB_MMU_MODES; mmu_idx++)
1943
        tlb_flush_entry(&env->tlb_table[mmu_idx][i], addr);
1944

    
1945
    tlb_flush_jmp_cache(env, addr);
1946
}
1947

    
1948
/* update the TLBs so that writes to code in the virtual page 'addr'
1949
   can be detected */
1950
static void tlb_protect_code(ram_addr_t ram_addr)
1951
{
1952
    cpu_physical_memory_reset_dirty(ram_addr,
1953
                                    ram_addr + TARGET_PAGE_SIZE,
1954
                                    CODE_DIRTY_FLAG);
1955
}
1956

    
1957
/* update the TLB so that writes in physical page 'phys_addr' are no longer
1958
   tested for self modifying code */
1959
static void tlb_unprotect_code_phys(CPUState *env, ram_addr_t ram_addr,
1960
                                    target_ulong vaddr)
1961
{
1962
    cpu_physical_memory_set_dirty_flags(ram_addr, CODE_DIRTY_FLAG);
1963
}
1964

    
1965
static inline void tlb_reset_dirty_range(CPUTLBEntry *tlb_entry,
1966
                                         unsigned long start, unsigned long length)
1967
{
1968
    unsigned long addr;
1969
    if ((tlb_entry->addr_write & ~TARGET_PAGE_MASK) == io_mem_ram.ram_addr) {
1970
        addr = (tlb_entry->addr_write & TARGET_PAGE_MASK) + tlb_entry->addend;
1971
        if ((addr - start) < length) {
1972
            tlb_entry->addr_write = (tlb_entry->addr_write & TARGET_PAGE_MASK) | TLB_NOTDIRTY;
1973
        }
1974
    }
1975
}
1976

    
1977
/* Note: start and end must be within the same ram block.  */
1978
void cpu_physical_memory_reset_dirty(ram_addr_t start, ram_addr_t end,
1979
                                     int dirty_flags)
1980
{
1981
    CPUState *env;
1982
    unsigned long length, start1;
1983
    int i;
1984

    
1985
    start &= TARGET_PAGE_MASK;
1986
    end = TARGET_PAGE_ALIGN(end);
1987

    
1988
    length = end - start;
1989
    if (length == 0)
1990
        return;
1991
    cpu_physical_memory_mask_dirty_range(start, length, dirty_flags);
1992

    
1993
    /* we modify the TLB cache so that the dirty bit will be set again
1994
       when accessing the range */
1995
    start1 = (unsigned long)qemu_safe_ram_ptr(start);
1996
    /* Check that we don't span multiple blocks - this breaks the
1997
       address comparisons below.  */
1998
    if ((unsigned long)qemu_safe_ram_ptr(end - 1) - start1
1999
            != (end - 1) - start) {
2000
        abort();
2001
    }
2002

    
2003
    for(env = first_cpu; env != NULL; env = env->next_cpu) {
2004
        int mmu_idx;
2005
        for (mmu_idx = 0; mmu_idx < NB_MMU_MODES; mmu_idx++) {
2006
            for(i = 0; i < CPU_TLB_SIZE; i++)
2007
                tlb_reset_dirty_range(&env->tlb_table[mmu_idx][i],
2008
                                      start1, length);
2009
        }
2010
    }
2011
}
2012

    
2013
int cpu_physical_memory_set_dirty_tracking(int enable)
2014
{
2015
    int ret = 0;
2016
    in_migration = enable;
2017
    return ret;
2018
}
2019

    
2020
static inline void tlb_update_dirty(CPUTLBEntry *tlb_entry)
2021
{
2022
    ram_addr_t ram_addr;
2023
    void *p;
2024

    
2025
    if ((tlb_entry->addr_write & ~TARGET_PAGE_MASK) == io_mem_ram.ram_addr) {
2026
        p = (void *)(unsigned long)((tlb_entry->addr_write & TARGET_PAGE_MASK)
2027
            + tlb_entry->addend);
2028
        ram_addr = qemu_ram_addr_from_host_nofail(p);
2029
        if (!cpu_physical_memory_is_dirty(ram_addr)) {
2030
            tlb_entry->addr_write |= TLB_NOTDIRTY;
2031
        }
2032
    }
2033
}
2034

    
2035
/* update the TLB according to the current state of the dirty bits */
2036
void cpu_tlb_update_dirty(CPUState *env)
2037
{
2038
    int i;
2039
    int mmu_idx;
2040
    for (mmu_idx = 0; mmu_idx < NB_MMU_MODES; mmu_idx++) {
2041
        for(i = 0; i < CPU_TLB_SIZE; i++)
2042
            tlb_update_dirty(&env->tlb_table[mmu_idx][i]);
2043
    }
2044
}
2045

    
2046
static inline void tlb_set_dirty1(CPUTLBEntry *tlb_entry, target_ulong vaddr)
2047
{
2048
    if (tlb_entry->addr_write == (vaddr | TLB_NOTDIRTY))
2049
        tlb_entry->addr_write = vaddr;
2050
}
2051

    
2052
/* update the TLB corresponding to virtual page vaddr
2053
   so that it is no longer dirty */
2054
static inline void tlb_set_dirty(CPUState *env, target_ulong vaddr)
2055
{
2056
    int i;
2057
    int mmu_idx;
2058

    
2059
    vaddr &= TARGET_PAGE_MASK;
2060
    i = (vaddr >> TARGET_PAGE_BITS) & (CPU_TLB_SIZE - 1);
2061
    for (mmu_idx = 0; mmu_idx < NB_MMU_MODES; mmu_idx++)
2062
        tlb_set_dirty1(&env->tlb_table[mmu_idx][i], vaddr);
2063
}
2064

    
2065
/* Our TLB does not support large pages, so remember the area covered by
2066
   large pages and trigger a full TLB flush if these are invalidated.  */
2067
static void tlb_add_large_page(CPUState *env, target_ulong vaddr,
2068
                               target_ulong size)
2069
{
2070
    target_ulong mask = ~(size - 1);
2071

    
2072
    if (env->tlb_flush_addr == (target_ulong)-1) {
2073
        env->tlb_flush_addr = vaddr & mask;
2074
        env->tlb_flush_mask = mask;
2075
        return;
2076
    }
2077
    /* Extend the existing region to include the new page.
2078
       This is a compromise between unnecessary flushes and the cost
2079
       of maintaining a full variable size TLB.  */
2080
    mask &= env->tlb_flush_mask;
2081
    while (((env->tlb_flush_addr ^ vaddr) & mask) != 0) {
2082
        mask <<= 1;
2083
    }
2084
    env->tlb_flush_addr &= mask;
2085
    env->tlb_flush_mask = mask;
2086
}
2087

    
2088
static bool is_ram_rom(ram_addr_t pd)
2089
{
2090
    pd &= ~TARGET_PAGE_MASK;
2091
    return pd == io_mem_ram.ram_addr || pd == io_mem_rom.ram_addr;
2092
}
2093

    
2094
static bool is_ram_rom_romd(ram_addr_t pd)
2095
{
2096
    return is_ram_rom(pd) || (pd & IO_MEM_ROMD);
2097
}
2098

    
2099
/* Add a new TLB entry. At most one entry for a given virtual address
2100
   is permitted. Only a single TARGET_PAGE_SIZE region is mapped, the
2101
   supplied size is only used by tlb_flush_page.  */
2102
void tlb_set_page(CPUState *env, target_ulong vaddr,
2103
                  target_phys_addr_t paddr, int prot,
2104
                  int mmu_idx, target_ulong size)
2105
{
2106
    PhysPageDesc p;
2107
    unsigned long pd;
2108
    unsigned int index;
2109
    target_ulong address;
2110
    target_ulong code_address;
2111
    unsigned long addend;
2112
    CPUTLBEntry *te;
2113
    CPUWatchpoint *wp;
2114
    target_phys_addr_t iotlb;
2115

    
2116
    assert(size >= TARGET_PAGE_SIZE);
2117
    if (size != TARGET_PAGE_SIZE) {
2118
        tlb_add_large_page(env, vaddr, size);
2119
    }
2120
    p = phys_page_find(paddr >> TARGET_PAGE_BITS);
2121
    pd = p.phys_offset;
2122
#if defined(DEBUG_TLB)
2123
    printf("tlb_set_page: vaddr=" TARGET_FMT_lx " paddr=0x" TARGET_FMT_plx
2124
           " prot=%x idx=%d pd=0x%08lx\n",
2125
           vaddr, paddr, prot, mmu_idx, pd);
2126
#endif
2127

    
2128
    address = vaddr;
2129
    if (!is_ram_rom_romd(pd)) {
2130
        /* IO memory case (romd handled later) */
2131
        address |= TLB_MMIO;
2132
    }
2133
    addend = (unsigned long)qemu_get_ram_ptr(pd & TARGET_PAGE_MASK);
2134
    if (is_ram_rom(pd)) {
2135
        /* Normal RAM.  */
2136
        iotlb = pd & TARGET_PAGE_MASK;
2137
        if ((pd & ~TARGET_PAGE_MASK) == io_mem_ram.ram_addr)
2138
            iotlb |= io_mem_notdirty.ram_addr;
2139
        else
2140
            iotlb |= io_mem_rom.ram_addr;
2141
    } else {
2142
        /* IO handlers are currently passed a physical address.
2143
           It would be nice to pass an offset from the base address
2144
           of that region.  This would avoid having to special case RAM,
2145
           and avoid full address decoding in every device.
2146
           We can't use the high bits of pd for this because
2147
           IO_MEM_ROMD uses these as a ram address.  */
2148
        iotlb = (pd & ~TARGET_PAGE_MASK);
2149
        iotlb += p.region_offset;
2150
    }
2151

    
2152
    code_address = address;
2153
    /* Make accesses to pages with watchpoints go via the
2154
       watchpoint trap routines.  */
2155
    QTAILQ_FOREACH(wp, &env->watchpoints, entry) {
2156
        if (vaddr == (wp->vaddr & TARGET_PAGE_MASK)) {
2157
            /* Avoid trapping reads of pages with a write breakpoint. */
2158
            if ((prot & PAGE_WRITE) || (wp->flags & BP_MEM_READ)) {
2159
                iotlb = io_mem_watch.ram_addr + paddr;
2160
                address |= TLB_MMIO;
2161
                break;
2162
            }
2163
        }
2164
    }
2165

    
2166
    index = (vaddr >> TARGET_PAGE_BITS) & (CPU_TLB_SIZE - 1);
2167
    env->iotlb[mmu_idx][index] = iotlb - vaddr;
2168
    te = &env->tlb_table[mmu_idx][index];
2169
    te->addend = addend - vaddr;
2170
    if (prot & PAGE_READ) {
2171
        te->addr_read = address;
2172
    } else {
2173
        te->addr_read = -1;
2174
    }
2175

    
2176
    if (prot & PAGE_EXEC) {
2177
        te->addr_code = code_address;
2178
    } else {
2179
        te->addr_code = -1;
2180
    }
2181
    if (prot & PAGE_WRITE) {
2182
        if ((pd & ~TARGET_PAGE_MASK) == io_mem_rom.ram_addr ||
2183
            (pd & IO_MEM_ROMD)) {
2184
            /* Write access calls the I/O callback.  */
2185
            te->addr_write = address | TLB_MMIO;
2186
        } else if ((pd & ~TARGET_PAGE_MASK) == io_mem_ram.ram_addr &&
2187
                   !cpu_physical_memory_is_dirty(pd)) {
2188
            te->addr_write = address | TLB_NOTDIRTY;
2189
        } else {
2190
            te->addr_write = address;
2191
        }
2192
    } else {
2193
        te->addr_write = -1;
2194
    }
2195
}
2196

    
2197
#else
2198

    
2199
void tlb_flush(CPUState *env, int flush_global)
2200
{
2201
}
2202

    
2203
void tlb_flush_page(CPUState *env, target_ulong addr)
2204
{
2205
}
2206

    
2207
/*
2208
 * Walks guest process memory "regions" one by one
2209
 * and calls callback function 'fn' for each region.
2210
 */
2211

    
2212
struct walk_memory_regions_data
2213
{
2214
    walk_memory_regions_fn fn;
2215
    void *priv;
2216
    unsigned long start;
2217
    int prot;
2218
};
2219

    
2220
static int walk_memory_regions_end(struct walk_memory_regions_data *data,
2221
                                   abi_ulong end, int new_prot)
2222
{
2223
    if (data->start != -1ul) {
2224
        int rc = data->fn(data->priv, data->start, end, data->prot);
2225
        if (rc != 0) {
2226
            return rc;
2227
        }
2228
    }
2229

    
2230
    data->start = (new_prot ? end : -1ul);
2231
    data->prot = new_prot;
2232

    
2233
    return 0;
2234
}
2235

    
2236
static int walk_memory_regions_1(struct walk_memory_regions_data *data,
2237
                                 abi_ulong base, int level, void **lp)
2238
{
2239
    abi_ulong pa;
2240
    int i, rc;
2241

    
2242
    if (*lp == NULL) {
2243
        return walk_memory_regions_end(data, base, 0);
2244
    }
2245

    
2246
    if (level == 0) {
2247
        PageDesc *pd = *lp;
2248
        for (i = 0; i < L2_SIZE; ++i) {
2249
            int prot = pd[i].flags;
2250

    
2251
            pa = base | (i << TARGET_PAGE_BITS);
2252
            if (prot != data->prot) {
2253
                rc = walk_memory_regions_end(data, pa, prot);
2254
                if (rc != 0) {
2255
                    return rc;
2256
                }
2257
            }
2258
        }
2259
    } else {
2260
        void **pp = *lp;
2261
        for (i = 0; i < L2_SIZE; ++i) {
2262
            pa = base | ((abi_ulong)i <<
2263
                (TARGET_PAGE_BITS + L2_BITS * level));
2264
            rc = walk_memory_regions_1(data, pa, level - 1, pp + i);
2265
            if (rc != 0) {
2266
                return rc;
2267
            }
2268
        }
2269
    }
2270

    
2271
    return 0;
2272
}
2273

    
2274
int walk_memory_regions(void *priv, walk_memory_regions_fn fn)
2275
{
2276
    struct walk_memory_regions_data data;
2277
    unsigned long i;
2278

    
2279
    data.fn = fn;
2280
    data.priv = priv;
2281
    data.start = -1ul;
2282
    data.prot = 0;
2283

    
2284
    for (i = 0; i < V_L1_SIZE; i++) {
2285
        int rc = walk_memory_regions_1(&data, (abi_ulong)i << V_L1_SHIFT,
2286
                                       V_L1_SHIFT / L2_BITS - 1, l1_map + i);
2287
        if (rc != 0) {
2288
            return rc;
2289
        }
2290
    }
2291

    
2292
    return walk_memory_regions_end(&data, 0, 0);
2293
}
2294

    
2295
static int dump_region(void *priv, abi_ulong start,
2296
    abi_ulong end, unsigned long prot)
2297
{
2298
    FILE *f = (FILE *)priv;
2299

    
2300
    (void) fprintf(f, TARGET_ABI_FMT_lx"-"TARGET_ABI_FMT_lx
2301
        " "TARGET_ABI_FMT_lx" %c%c%c\n",
2302
        start, end, end - start,
2303
        ((prot & PAGE_READ) ? 'r' : '-'),
2304
        ((prot & PAGE_WRITE) ? 'w' : '-'),
2305
        ((prot & PAGE_EXEC) ? 'x' : '-'));
2306

    
2307
    return (0);
2308
}
2309

    
2310
/* dump memory mappings */
2311
void page_dump(FILE *f)
2312
{
2313
    (void) fprintf(f, "%-8s %-8s %-8s %s\n",
2314
            "start", "end", "size", "prot");
2315
    walk_memory_regions(f, dump_region);
2316
}
2317

    
2318
int page_get_flags(target_ulong address)
2319
{
2320
    PageDesc *p;
2321

    
2322
    p = page_find(address >> TARGET_PAGE_BITS);
2323
    if (!p)
2324
        return 0;
2325
    return p->flags;
2326
}
2327

    
2328
/* Modify the flags of a page and invalidate the code if necessary.
2329
   The flag PAGE_WRITE_ORG is positioned automatically depending
2330
   on PAGE_WRITE.  The mmap_lock should already be held.  */
2331
void page_set_flags(target_ulong start, target_ulong end, int flags)
2332
{
2333
    target_ulong addr, len;
2334

    
2335
    /* This function should never be called with addresses outside the
2336
       guest address space.  If this assert fires, it probably indicates
2337
       a missing call to h2g_valid.  */
2338
#if TARGET_ABI_BITS > L1_MAP_ADDR_SPACE_BITS
2339
    assert(end < ((abi_ulong)1 << L1_MAP_ADDR_SPACE_BITS));
2340
#endif
2341
    assert(start < end);
2342

    
2343
    start = start & TARGET_PAGE_MASK;
2344
    end = TARGET_PAGE_ALIGN(end);
2345

    
2346
    if (flags & PAGE_WRITE) {
2347
        flags |= PAGE_WRITE_ORG;
2348
    }
2349

    
2350
    for (addr = start, len = end - start;
2351
         len != 0;
2352
         len -= TARGET_PAGE_SIZE, addr += TARGET_PAGE_SIZE) {
2353
        PageDesc *p = page_find_alloc(addr >> TARGET_PAGE_BITS, 1);
2354

    
2355
        /* If the write protection bit is set, then we invalidate
2356
           the code inside.  */
2357
        if (!(p->flags & PAGE_WRITE) &&
2358
            (flags & PAGE_WRITE) &&
2359
            p->first_tb) {
2360
            tb_invalidate_phys_page(addr, 0, NULL);
2361
        }
2362
        p->flags = flags;
2363
    }
2364
}
2365

    
2366
int page_check_range(target_ulong start, target_ulong len, int flags)
2367
{
2368
    PageDesc *p;
2369
    target_ulong end;
2370
    target_ulong addr;
2371

    
2372
    /* This function should never be called with addresses outside the
2373
       guest address space.  If this assert fires, it probably indicates
2374
       a missing call to h2g_valid.  */
2375
#if TARGET_ABI_BITS > L1_MAP_ADDR_SPACE_BITS
2376
    assert(start < ((abi_ulong)1 << L1_MAP_ADDR_SPACE_BITS));
2377
#endif
2378

    
2379
    if (len == 0) {
2380
        return 0;
2381
    }
2382
    if (start + len - 1 < start) {
2383
        /* We've wrapped around.  */
2384
        return -1;
2385
    }
2386

    
2387
    end = TARGET_PAGE_ALIGN(start+len); /* must do before we loose bits in the next step */
2388
    start = start & TARGET_PAGE_MASK;
2389

    
2390
    for (addr = start, len = end - start;
2391
         len != 0;
2392
         len -= TARGET_PAGE_SIZE, addr += TARGET_PAGE_SIZE) {
2393
        p = page_find(addr >> TARGET_PAGE_BITS);
2394
        if( !p )
2395
            return -1;
2396
        if( !(p->flags & PAGE_VALID) )
2397
            return -1;
2398

    
2399
        if ((flags & PAGE_READ) && !(p->flags & PAGE_READ))
2400
            return -1;
2401
        if (flags & PAGE_WRITE) {
2402
            if (!(p->flags & PAGE_WRITE_ORG))
2403
                return -1;
2404
            /* unprotect the page if it was put read-only because it
2405
               contains translated code */
2406
            if (!(p->flags & PAGE_WRITE)) {
2407
                if (!page_unprotect(addr, 0, NULL))
2408
                    return -1;
2409
            }
2410
            return 0;
2411
        }
2412
    }
2413
    return 0;
2414
}
2415

    
2416
/* called from signal handler: invalidate the code and unprotect the
2417
   page. Return TRUE if the fault was successfully handled. */
2418
int page_unprotect(target_ulong address, unsigned long pc, void *puc)
2419
{
2420
    unsigned int prot;
2421
    PageDesc *p;
2422
    target_ulong host_start, host_end, addr;
2423

    
2424
    /* Technically this isn't safe inside a signal handler.  However we
2425
       know this only ever happens in a synchronous SEGV handler, so in
2426
       practice it seems to be ok.  */
2427
    mmap_lock();
2428

    
2429
    p = page_find(address >> TARGET_PAGE_BITS);
2430
    if (!p) {
2431
        mmap_unlock();
2432
        return 0;
2433
    }
2434

    
2435
    /* if the page was really writable, then we change its
2436
       protection back to writable */
2437
    if ((p->flags & PAGE_WRITE_ORG) && !(p->flags & PAGE_WRITE)) {
2438
        host_start = address & qemu_host_page_mask;
2439
        host_end = host_start + qemu_host_page_size;
2440

    
2441
        prot = 0;
2442
        for (addr = host_start ; addr < host_end ; addr += TARGET_PAGE_SIZE) {
2443
            p = page_find(addr >> TARGET_PAGE_BITS);
2444
            p->flags |= PAGE_WRITE;
2445
            prot |= p->flags;
2446

    
2447
            /* and since the content will be modified, we must invalidate
2448
               the corresponding translated code. */
2449
            tb_invalidate_phys_page(addr, pc, puc);
2450
#ifdef DEBUG_TB_CHECK
2451
            tb_invalidate_check(addr);
2452
#endif
2453
        }
2454
        mprotect((void *)g2h(host_start), qemu_host_page_size,
2455
                 prot & PAGE_BITS);
2456

    
2457
        mmap_unlock();
2458
        return 1;
2459
    }
2460
    mmap_unlock();
2461
    return 0;
2462
}
2463

    
2464
static inline void tlb_set_dirty(CPUState *env,
2465
                                 unsigned long addr, target_ulong vaddr)
2466
{
2467
}
2468
#endif /* defined(CONFIG_USER_ONLY) */
2469

    
2470
#if !defined(CONFIG_USER_ONLY)
2471

    
2472
#define SUBPAGE_IDX(addr) ((addr) & ~TARGET_PAGE_MASK)
2473
typedef struct subpage_t {
2474
    MemoryRegion iomem;
2475
    target_phys_addr_t base;
2476
    ram_addr_t sub_io_index[TARGET_PAGE_SIZE];
2477
    ram_addr_t region_offset[TARGET_PAGE_SIZE];
2478
} subpage_t;
2479

    
2480
static int subpage_register (subpage_t *mmio, uint32_t start, uint32_t end,
2481
                             ram_addr_t memory, ram_addr_t region_offset);
2482
static subpage_t *subpage_init (target_phys_addr_t base, ram_addr_t *phys,
2483
                                ram_addr_t orig_memory,
2484
                                ram_addr_t region_offset);
2485
#define CHECK_SUBPAGE(addr, start_addr, start_addr2, end_addr, end_addr2, \
2486
                      need_subpage)                                     \
2487
    do {                                                                \
2488
        if (addr > start_addr)                                          \
2489
            start_addr2 = 0;                                            \
2490
        else {                                                          \
2491
            start_addr2 = start_addr & ~TARGET_PAGE_MASK;               \
2492
            if (start_addr2 > 0)                                        \
2493
                need_subpage = 1;                                       \
2494
        }                                                               \
2495
                                                                        \
2496
        if ((start_addr + orig_size) - addr >= TARGET_PAGE_SIZE)        \
2497
            end_addr2 = TARGET_PAGE_SIZE - 1;                           \
2498
        else {                                                          \
2499
            end_addr2 = (start_addr + orig_size - 1) & ~TARGET_PAGE_MASK; \
2500
            if (end_addr2 < TARGET_PAGE_SIZE - 1)                       \
2501
                need_subpage = 1;                                       \
2502
        }                                                               \
2503
    } while (0)
2504

    
2505
/* register physical memory.
2506
   For RAM, 'size' must be a multiple of the target page size.
2507
   If (phys_offset & ~TARGET_PAGE_MASK) != 0, then it is an
2508
   io memory page.  The address used when calling the IO function is
2509
   the offset from the start of the region, plus region_offset.  Both
2510
   start_addr and region_offset are rounded down to a page boundary
2511
   before calculating this offset.  This should not be a problem unless
2512
   the low bits of start_addr and region_offset differ.  */
2513
void cpu_register_physical_memory_log(MemoryRegionSection *section,
2514
                                      bool readable, bool readonly)
2515
{
2516
    target_phys_addr_t start_addr = section->offset_within_address_space;
2517
    ram_addr_t size = section->size;
2518
    ram_addr_t phys_offset = section->mr->ram_addr;
2519
    ram_addr_t region_offset = section->offset_within_region;
2520
    target_phys_addr_t addr, end_addr;
2521
    PhysPageDesc *p;
2522
    CPUState *env;
2523
    ram_addr_t orig_size = size;
2524
    subpage_t *subpage;
2525

    
2526
    if (memory_region_is_ram(section->mr)) {
2527
        phys_offset += region_offset;
2528
        region_offset = 0;
2529
    }
2530

    
2531
    if (!readable) {
2532
        phys_offset &= ~TARGET_PAGE_MASK & ~IO_MEM_ROMD;
2533
    }
2534

    
2535
    if (readonly) {
2536
        phys_offset |= io_mem_rom.ram_addr;
2537
    }
2538

    
2539
    assert(size);
2540

    
2541
    if (phys_offset == io_mem_unassigned.ram_addr) {
2542
        region_offset = start_addr;
2543
    }
2544
    region_offset &= TARGET_PAGE_MASK;
2545
    size = (size + TARGET_PAGE_SIZE - 1) & TARGET_PAGE_MASK;
2546
    end_addr = start_addr + (target_phys_addr_t)size;
2547

    
2548
    addr = start_addr;
2549
    do {
2550
        p = phys_page_find_alloc(addr >> TARGET_PAGE_BITS, 0);
2551
        if (p && p->phys_offset != io_mem_unassigned.ram_addr) {
2552
            ram_addr_t orig_memory = p->phys_offset;
2553
            target_phys_addr_t start_addr2, end_addr2;
2554
            int need_subpage = 0;
2555
            MemoryRegion *mr = io_mem_region[(orig_memory & ~TARGET_PAGE_MASK)
2556
                                             >> IO_MEM_SHIFT];
2557

    
2558
            CHECK_SUBPAGE(addr, start_addr, start_addr2, end_addr, end_addr2,
2559
                          need_subpage);
2560
            if (need_subpage) {
2561
                if (!(mr->subpage)) {
2562
                    subpage = subpage_init((addr & TARGET_PAGE_MASK),
2563
                                           &p->phys_offset, orig_memory,
2564
                                           p->region_offset);
2565
                } else {
2566
                    subpage = container_of(mr, subpage_t, iomem);
2567
                }
2568
                subpage_register(subpage, start_addr2, end_addr2, phys_offset,
2569
                                 region_offset);
2570
                p->region_offset = 0;
2571
            } else {
2572
                p->phys_offset = phys_offset;
2573
                p->region_offset = region_offset;
2574
                if (is_ram_rom_romd(phys_offset))
2575
                    phys_offset += TARGET_PAGE_SIZE;
2576
            }
2577
        } else {
2578
            p = phys_page_find_alloc(addr >> TARGET_PAGE_BITS, 1);
2579
            p->phys_offset = phys_offset;
2580
            p->region_offset = region_offset;
2581
            if (is_ram_rom_romd(phys_offset)) {
2582
                phys_offset += TARGET_PAGE_SIZE;
2583
            } else {
2584
                target_phys_addr_t start_addr2, end_addr2;
2585
                int need_subpage = 0;
2586

    
2587
                CHECK_SUBPAGE(addr, start_addr, start_addr2, end_addr,
2588
                              end_addr2, need_subpage);
2589

    
2590
                if (need_subpage) {
2591
                    subpage = subpage_init((addr & TARGET_PAGE_MASK),
2592
                                           &p->phys_offset,
2593
                                           io_mem_unassigned.ram_addr,
2594
                                           addr & TARGET_PAGE_MASK);
2595
                    subpage_register(subpage, start_addr2, end_addr2,
2596
                                     phys_offset, region_offset);
2597
                    p->region_offset = 0;
2598
                }
2599
            }
2600
        }
2601
        region_offset += TARGET_PAGE_SIZE;
2602
        addr += TARGET_PAGE_SIZE;
2603
    } while (addr != end_addr);
2604

    
2605
    /* since each CPU stores ram addresses in its TLB cache, we must
2606
       reset the modified entries */
2607
    /* XXX: slow ! */
2608
    for(env = first_cpu; env != NULL; env = env->next_cpu) {
2609
        tlb_flush(env, 1);
2610
    }
2611
}
2612

    
2613
void qemu_register_coalesced_mmio(target_phys_addr_t addr, ram_addr_t size)
2614
{
2615
    if (kvm_enabled())
2616
        kvm_coalesce_mmio_region(addr, size);
2617
}
2618

    
2619
void qemu_unregister_coalesced_mmio(target_phys_addr_t addr, ram_addr_t size)
2620
{
2621
    if (kvm_enabled())
2622
        kvm_uncoalesce_mmio_region(addr, size);
2623
}
2624

    
2625
void qemu_flush_coalesced_mmio_buffer(void)
2626
{
2627
    if (kvm_enabled())
2628
        kvm_flush_coalesced_mmio_buffer();
2629
}
2630

    
2631
#if defined(__linux__) && !defined(TARGET_S390X)
2632

    
2633
#include <sys/vfs.h>
2634

    
2635
#define HUGETLBFS_MAGIC       0x958458f6
2636

    
2637
static long gethugepagesize(const char *path)
2638
{
2639
    struct statfs fs;
2640
    int ret;
2641

    
2642
    do {
2643
        ret = statfs(path, &fs);
2644
    } while (ret != 0 && errno == EINTR);
2645

    
2646
    if (ret != 0) {
2647
        perror(path);
2648
        return 0;
2649
    }
2650

    
2651
    if (fs.f_type != HUGETLBFS_MAGIC)
2652
        fprintf(stderr, "Warning: path not on HugeTLBFS: %s\n", path);
2653

    
2654
    return fs.f_bsize;
2655
}
2656

    
2657
static void *file_ram_alloc(RAMBlock *block,
2658
                            ram_addr_t memory,
2659
                            const char *path)
2660
{
2661
    char *filename;
2662
    void *area;
2663
    int fd;
2664
#ifdef MAP_POPULATE
2665
    int flags;
2666
#endif
2667
    unsigned long hpagesize;
2668

    
2669
    hpagesize = gethugepagesize(path);
2670
    if (!hpagesize) {
2671
        return NULL;
2672
    }
2673

    
2674
    if (memory < hpagesize) {
2675
        return NULL;
2676
    }
2677

    
2678
    if (kvm_enabled() && !kvm_has_sync_mmu()) {
2679
        fprintf(stderr, "host lacks kvm mmu notifiers, -mem-path unsupported\n");
2680
        return NULL;
2681
    }
2682

    
2683
    if (asprintf(&filename, "%s/qemu_back_mem.XXXXXX", path) == -1) {
2684
        return NULL;
2685
    }
2686

    
2687
    fd = mkstemp(filename);
2688
    if (fd < 0) {
2689
        perror("unable to create backing store for hugepages");
2690
        free(filename);
2691
        return NULL;
2692
    }
2693
    unlink(filename);
2694
    free(filename);
2695

    
2696
    memory = (memory+hpagesize-1) & ~(hpagesize-1);
2697

    
2698
    /*
2699
     * ftruncate is not supported by hugetlbfs in older
2700
     * hosts, so don't bother bailing out on errors.
2701
     * If anything goes wrong with it under other filesystems,
2702
     * mmap will fail.
2703
     */
2704
    if (ftruncate(fd, memory))
2705
        perror("ftruncate");
2706

    
2707
#ifdef MAP_POPULATE
2708
    /* NB: MAP_POPULATE won't exhaustively alloc all phys pages in the case
2709
     * MAP_PRIVATE is requested.  For mem_prealloc we mmap as MAP_SHARED
2710
     * to sidestep this quirk.
2711
     */
2712
    flags = mem_prealloc ? MAP_POPULATE | MAP_SHARED : MAP_PRIVATE;
2713
    area = mmap(0, memory, PROT_READ | PROT_WRITE, flags, fd, 0);
2714
#else
2715
    area = mmap(0, memory, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0);
2716
#endif
2717
    if (area == MAP_FAILED) {
2718
        perror("file_ram_alloc: can't mmap RAM pages");
2719
        close(fd);
2720
        return (NULL);
2721
    }
2722
    block->fd = fd;
2723
    return area;
2724
}
2725
#endif
2726

    
2727
static ram_addr_t find_ram_offset(ram_addr_t size)
2728
{
2729
    RAMBlock *block, *next_block;
2730
    ram_addr_t offset = RAM_ADDR_MAX, mingap = RAM_ADDR_MAX;
2731

    
2732
    if (QLIST_EMPTY(&ram_list.blocks))
2733
        return 0;
2734

    
2735
    QLIST_FOREACH(block, &ram_list.blocks, next) {
2736
        ram_addr_t end, next = RAM_ADDR_MAX;
2737

    
2738
        end = block->offset + block->length;
2739

    
2740
        QLIST_FOREACH(next_block, &ram_list.blocks, next) {
2741
            if (next_block->offset >= end) {
2742
                next = MIN(next, next_block->offset);
2743
            }
2744
        }
2745
        if (next - end >= size && next - end < mingap) {
2746
            offset = end;
2747
            mingap = next - end;
2748
        }
2749
    }
2750

    
2751
    if (offset == RAM_ADDR_MAX) {
2752
        fprintf(stderr, "Failed to find gap of requested size: %" PRIu64 "\n",
2753
                (uint64_t)size);
2754
        abort();
2755
    }
2756

    
2757
    return offset;
2758
}
2759

    
2760
static ram_addr_t last_ram_offset(void)
2761
{
2762
    RAMBlock *block;
2763
    ram_addr_t last = 0;
2764

    
2765
    QLIST_FOREACH(block, &ram_list.blocks, next)
2766
        last = MAX(last, block->offset + block->length);
2767

    
2768
    return last;
2769
}
2770

    
2771
void qemu_ram_set_idstr(ram_addr_t addr, const char *name, DeviceState *dev)
2772
{
2773
    RAMBlock *new_block, *block;
2774

    
2775
    new_block = NULL;
2776
    QLIST_FOREACH(block, &ram_list.blocks, next) {
2777
        if (block->offset == addr) {
2778
            new_block = block;
2779
            break;
2780
        }
2781
    }
2782
    assert(new_block);
2783
    assert(!new_block->idstr[0]);
2784

    
2785
    if (dev && dev->parent_bus && dev->parent_bus->info->get_dev_path) {
2786
        char *id = dev->parent_bus->info->get_dev_path(dev);
2787
        if (id) {
2788
            snprintf(new_block->idstr, sizeof(new_block->idstr), "%s/", id);
2789
            g_free(id);
2790
        }
2791
    }
2792
    pstrcat(new_block->idstr, sizeof(new_block->idstr), name);
2793

    
2794
    QLIST_FOREACH(block, &ram_list.blocks, next) {
2795
        if (block != new_block && !strcmp(block->idstr, new_block->idstr)) {
2796
            fprintf(stderr, "RAMBlock \"%s\" already registered, abort!\n",
2797
                    new_block->idstr);
2798
            abort();
2799
        }
2800
    }
2801
}
2802

    
2803
ram_addr_t qemu_ram_alloc_from_ptr(ram_addr_t size, void *host,
2804
                                   MemoryRegion *mr)
2805
{
2806
    RAMBlock *new_block;
2807

    
2808
    size = TARGET_PAGE_ALIGN(size);
2809
    new_block = g_malloc0(sizeof(*new_block));
2810

    
2811
    new_block->mr = mr;
2812
    new_block->offset = find_ram_offset(size);
2813
    if (host) {
2814
        new_block->host = host;
2815
        new_block->flags |= RAM_PREALLOC_MASK;
2816
    } else {
2817
        if (mem_path) {
2818
#if defined (__linux__) && !defined(TARGET_S390X)
2819
            new_block->host = file_ram_alloc(new_block, size, mem_path);
2820
            if (!new_block->host) {
2821
                new_block->host = qemu_vmalloc(size);
2822
                qemu_madvise(new_block->host, size, QEMU_MADV_MERGEABLE);
2823
            }
2824
#else
2825
            fprintf(stderr, "-mem-path option unsupported\n");
2826
            exit(1);
2827
#endif
2828
        } else {
2829
#if defined(TARGET_S390X) && defined(CONFIG_KVM)
2830
            /* S390 KVM requires the topmost vma of the RAM to be smaller than
2831
               an system defined value, which is at least 256GB. Larger systems
2832
               have larger values. We put the guest between the end of data
2833
               segment (system break) and this value. We use 32GB as a base to
2834
               have enough room for the system break to grow. */
2835
            new_block->host = mmap((void*)0x800000000, size,
2836
                                   PROT_EXEC|PROT_READ|PROT_WRITE,
2837
                                   MAP_SHARED | MAP_ANONYMOUS | MAP_FIXED, -1, 0);
2838
            if (new_block->host == MAP_FAILED) {
2839
                fprintf(stderr, "Allocating RAM failed\n");
2840
                abort();
2841
            }
2842
#else
2843
            if (xen_enabled()) {
2844
                xen_ram_alloc(new_block->offset, size, mr);
2845
            } else {
2846
                new_block->host = qemu_vmalloc(size);
2847
            }
2848
#endif
2849
            qemu_madvise(new_block->host, size, QEMU_MADV_MERGEABLE);
2850
        }
2851
    }
2852
    new_block->length = size;
2853

    
2854
    QLIST_INSERT_HEAD(&ram_list.blocks, new_block, next);
2855

    
2856
    ram_list.phys_dirty = g_realloc(ram_list.phys_dirty,
2857
                                       last_ram_offset() >> TARGET_PAGE_BITS);
2858
    memset(ram_list.phys_dirty + (new_block->offset >> TARGET_PAGE_BITS),
2859
           0xff, size >> TARGET_PAGE_BITS);
2860

    
2861
    if (kvm_enabled())
2862
        kvm_setup_guest_memory(new_block->host, size);
2863

    
2864
    return new_block->offset;
2865
}
2866

    
2867
ram_addr_t qemu_ram_alloc(ram_addr_t size, MemoryRegion *mr)
2868
{
2869
    return qemu_ram_alloc_from_ptr(size, NULL, mr);
2870
}
2871

    
2872
void qemu_ram_free_from_ptr(ram_addr_t addr)
2873
{
2874
    RAMBlock *block;
2875

    
2876
    QLIST_FOREACH(block, &ram_list.blocks, next) {
2877
        if (addr == block->offset) {
2878
            QLIST_REMOVE(block, next);
2879
            g_free(block);
2880
            return;
2881
        }
2882
    }
2883
}
2884

    
2885
void qemu_ram_free(ram_addr_t addr)
2886
{
2887
    RAMBlock *block;
2888

    
2889
    QLIST_FOREACH(block, &ram_list.blocks, next) {
2890
        if (addr == block->offset) {
2891
            QLIST_REMOVE(block, next);
2892
            if (block->flags & RAM_PREALLOC_MASK) {
2893
                ;
2894
            } else if (mem_path) {
2895
#if defined (__linux__) && !defined(TARGET_S390X)
2896
                if (block->fd) {
2897
                    munmap(block->host, block->length);
2898
                    close(block->fd);
2899
                } else {
2900
                    qemu_vfree(block->host);
2901
                }
2902
#else
2903
                abort();
2904
#endif
2905
            } else {
2906
#if defined(TARGET_S390X) && defined(CONFIG_KVM)
2907
                munmap(block->host, block->length);
2908
#else
2909
                if (xen_enabled()) {
2910
                    xen_invalidate_map_cache_entry(block->host);
2911
                } else {
2912
                    qemu_vfree(block->host);
2913
                }
2914
#endif
2915
            }
2916
            g_free(block);
2917
            return;
2918
        }
2919
    }
2920

    
2921
}
2922

    
2923
#ifndef _WIN32
2924
void qemu_ram_remap(ram_addr_t addr, ram_addr_t length)
2925
{
2926
    RAMBlock *block;
2927
    ram_addr_t offset;
2928
    int flags;
2929
    void *area, *vaddr;
2930

    
2931
    QLIST_FOREACH(block, &ram_list.blocks, next) {
2932
        offset = addr - block->offset;
2933
        if (offset < block->length) {
2934
            vaddr = block->host + offset;
2935
            if (block->flags & RAM_PREALLOC_MASK) {
2936
                ;
2937
            } else {
2938
                flags = MAP_FIXED;
2939
                munmap(vaddr, length);
2940
                if (mem_path) {
2941
#if defined(__linux__) && !defined(TARGET_S390X)
2942
                    if (block->fd) {
2943
#ifdef MAP_POPULATE
2944
                        flags |= mem_prealloc ? MAP_POPULATE | MAP_SHARED :
2945
                            MAP_PRIVATE;
2946
#else
2947
                        flags |= MAP_PRIVATE;
2948
#endif
2949
                        area = mmap(vaddr, length, PROT_READ | PROT_WRITE,
2950
                                    flags, block->fd, offset);
2951
                    } else {
2952
                        flags |= MAP_PRIVATE | MAP_ANONYMOUS;
2953
                        area = mmap(vaddr, length, PROT_READ | PROT_WRITE,
2954
                                    flags, -1, 0);
2955
                    }
2956
#else
2957
                    abort();
2958
#endif
2959
                } else {
2960
#if defined(TARGET_S390X) && defined(CONFIG_KVM)
2961
                    flags |= MAP_SHARED | MAP_ANONYMOUS;
2962
                    area = mmap(vaddr, length, PROT_EXEC|PROT_READ|PROT_WRITE,
2963
                                flags, -1, 0);
2964
#else
2965
                    flags |= MAP_PRIVATE | MAP_ANONYMOUS;
2966
                    area = mmap(vaddr, length, PROT_READ | PROT_WRITE,
2967
                                flags, -1, 0);
2968
#endif
2969
                }
2970
                if (area != vaddr) {
2971
                    fprintf(stderr, "Could not remap addr: "
2972
                            RAM_ADDR_FMT "@" RAM_ADDR_FMT "\n",
2973
                            length, addr);
2974
                    exit(1);
2975
                }
2976
                qemu_madvise(vaddr, length, QEMU_MADV_MERGEABLE);
2977
            }
2978
            return;
2979
        }
2980
    }
2981
}
2982
#endif /* !_WIN32 */
2983

    
2984
/* Return a host pointer to ram allocated with qemu_ram_alloc.
2985
   With the exception of the softmmu code in this file, this should
2986
   only be used for local memory (e.g. video ram) that the device owns,
2987
   and knows it isn't going to access beyond the end of the block.
2988

2989
   It should not be used for general purpose DMA.
2990
   Use cpu_physical_memory_map/cpu_physical_memory_rw instead.
2991
 */
2992
void *qemu_get_ram_ptr(ram_addr_t addr)
2993
{
2994
    RAMBlock *block;
2995

    
2996
    QLIST_FOREACH(block, &ram_list.blocks, next) {
2997
        if (addr - block->offset < block->length) {
2998
            /* Move this entry to to start of the list.  */
2999
            if (block != QLIST_FIRST(&ram_list.blocks)) {
3000
                QLIST_REMOVE(block, next);
3001
                QLIST_INSERT_HEAD(&ram_list.blocks, block, next);
3002
            }
3003
            if (xen_enabled()) {
3004
                /* We need to check if the requested address is in the RAM
3005
                 * because we don't want to map the entire memory in QEMU.
3006
                 * In that case just map until the end of the page.
3007
                 */
3008
                if (block->offset == 0) {
3009
                    return xen_map_cache(addr, 0, 0);
3010
                } else if (block->host == NULL) {
3011
                    block->host =
3012
                        xen_map_cache(block->offset, block->length, 1);
3013
                }
3014
            }
3015
            return block->host + (addr - block->offset);
3016
        }
3017
    }
3018

    
3019
    fprintf(stderr, "Bad ram offset %" PRIx64 "\n", (uint64_t)addr);
3020
    abort();
3021

    
3022
    return NULL;
3023
}
3024

    
3025
/* Return a host pointer to ram allocated with qemu_ram_alloc.
3026
 * Same as qemu_get_ram_ptr but avoid reordering ramblocks.
3027
 */
3028
void *qemu_safe_ram_ptr(ram_addr_t addr)
3029
{
3030
    RAMBlock *block;
3031

    
3032
    QLIST_FOREACH(block, &ram_list.blocks, next) {
3033
        if (addr - block->offset < block->length) {
3034
            if (xen_enabled()) {
3035
                /* We need to check if the requested address is in the RAM
3036
                 * because we don't want to map the entire memory in QEMU.
3037
                 * In that case just map until the end of the page.
3038
                 */
3039
                if (block->offset == 0) {
3040
                    return xen_map_cache(addr, 0, 0);
3041
                } else if (block->host == NULL) {
3042
                    block->host =
3043
                        xen_map_cache(block->offset, block->length, 1);
3044
                }
3045
            }
3046
            return block->host + (addr - block->offset);
3047
        }
3048
    }
3049

    
3050
    fprintf(stderr, "Bad ram offset %" PRIx64 "\n", (uint64_t)addr);
3051
    abort();
3052

    
3053
    return NULL;
3054
}
3055

    
3056
/* Return a host pointer to guest's ram. Similar to qemu_get_ram_ptr
3057
 * but takes a size argument */
3058
void *qemu_ram_ptr_length(ram_addr_t addr, ram_addr_t *size)
3059
{
3060
    if (*size == 0) {
3061
        return NULL;
3062
    }
3063
    if (xen_enabled()) {
3064
        return xen_map_cache(addr, *size, 1);
3065
    } else {
3066
        RAMBlock *block;
3067

    
3068
        QLIST_FOREACH(block, &ram_list.blocks, next) {
3069
            if (addr - block->offset < block->length) {
3070
                if (addr - block->offset + *size > block->length)
3071
                    *size = block->length - addr + block->offset;
3072
                return block->host + (addr - block->offset);
3073
            }
3074
        }
3075

    
3076
        fprintf(stderr, "Bad ram offset %" PRIx64 "\n", (uint64_t)addr);
3077
        abort();
3078
    }
3079
}
3080

    
3081
void qemu_put_ram_ptr(void *addr)
3082
{
3083
    trace_qemu_put_ram_ptr(addr);
3084
}
3085

    
3086
int qemu_ram_addr_from_host(void *ptr, ram_addr_t *ram_addr)
3087
{
3088
    RAMBlock *block;
3089
    uint8_t *host = ptr;
3090

    
3091
    if (xen_enabled()) {
3092
        *ram_addr = xen_ram_addr_from_mapcache(ptr);
3093
        return 0;
3094
    }
3095

    
3096
    QLIST_FOREACH(block, &ram_list.blocks, next) {
3097
        /* This case append when the block is not mapped. */
3098
        if (block->host == NULL) {
3099
            continue;
3100
        }
3101
        if (host - block->host < block->length) {
3102
            *ram_addr = block->offset + (host - block->host);
3103
            return 0;
3104
        }
3105
    }
3106

    
3107
    return -1;
3108
}
3109

    
3110
/* Some of the softmmu routines need to translate from a host pointer
3111
   (typically a TLB entry) back to a ram offset.  */
3112
ram_addr_t qemu_ram_addr_from_host_nofail(void *ptr)
3113
{
3114
    ram_addr_t ram_addr;
3115

    
3116
    if (qemu_ram_addr_from_host(ptr, &ram_addr)) {
3117
        fprintf(stderr, "Bad ram pointer %p\n", ptr);
3118
        abort();
3119
    }
3120
    return ram_addr;
3121
}
3122

    
3123
static uint64_t unassigned_mem_read(void *opaque, target_phys_addr_t addr,
3124
                                    unsigned size)
3125
{
3126
#ifdef DEBUG_UNASSIGNED
3127
    printf("Unassigned mem read " TARGET_FMT_plx "\n", addr);
3128
#endif
3129
#if defined(TARGET_ALPHA) || defined(TARGET_SPARC) || defined(TARGET_MICROBLAZE)
3130
    cpu_unassigned_access(cpu_single_env, addr, 0, 0, 0, size);
3131
#endif
3132
    return 0;
3133
}
3134

    
3135
static void unassigned_mem_write(void *opaque, target_phys_addr_t addr,
3136
                                 uint64_t val, unsigned size)
3137
{
3138
#ifdef DEBUG_UNASSIGNED
3139
    printf("Unassigned mem write " TARGET_FMT_plx " = 0x%"PRIx64"\n", addr, val);
3140
#endif
3141
#if defined(TARGET_ALPHA) || defined(TARGET_SPARC) || defined(TARGET_MICROBLAZE)
3142
    cpu_unassigned_access(cpu_single_env, addr, 1, 0, 0, size);
3143
#endif
3144
}
3145

    
3146
static const MemoryRegionOps unassigned_mem_ops = {
3147
    .read = unassigned_mem_read,
3148
    .write = unassigned_mem_write,
3149
    .endianness = DEVICE_NATIVE_ENDIAN,
3150
};
3151

    
3152
static uint64_t error_mem_read(void *opaque, target_phys_addr_t addr,
3153
                               unsigned size)
3154
{
3155
    abort();
3156
}
3157

    
3158
static void error_mem_write(void *opaque, target_phys_addr_t addr,
3159
                            uint64_t value, unsigned size)
3160
{
3161
    abort();
3162
}
3163

    
3164
static const MemoryRegionOps error_mem_ops = {
3165
    .read = error_mem_read,
3166
    .write = error_mem_write,
3167
    .endianness = DEVICE_NATIVE_ENDIAN,
3168
};
3169

    
3170
static const MemoryRegionOps rom_mem_ops = {
3171
    .read = error_mem_read,
3172
    .write = unassigned_mem_write,
3173
    .endianness = DEVICE_NATIVE_ENDIAN,
3174
};
3175

    
3176
static void notdirty_mem_write(void *opaque, target_phys_addr_t ram_addr,
3177
                               uint64_t val, unsigned size)
3178
{
3179
    int dirty_flags;
3180
    dirty_flags = cpu_physical_memory_get_dirty_flags(ram_addr);
3181
    if (!(dirty_flags & CODE_DIRTY_FLAG)) {
3182
#if !defined(CONFIG_USER_ONLY)
3183
        tb_invalidate_phys_page_fast(ram_addr, size);
3184
        dirty_flags = cpu_physical_memory_get_dirty_flags(ram_addr);
3185
#endif
3186
    }
3187
    switch (size) {
3188
    case 1:
3189
        stb_p(qemu_get_ram_ptr(ram_addr), val);
3190
        break;
3191
    case 2:
3192
        stw_p(qemu_get_ram_ptr(ram_addr), val);
3193
        break;
3194
    case 4:
3195
        stl_p(qemu_get_ram_ptr(ram_addr), val);
3196
        break;
3197
    default:
3198
        abort();
3199
    }
3200
    dirty_flags |= (0xff & ~CODE_DIRTY_FLAG);
3201
    cpu_physical_memory_set_dirty_flags(ram_addr, dirty_flags);
3202
    /* we remove the notdirty callback only if the code has been
3203
       flushed */
3204
    if (dirty_flags == 0xff)
3205
        tlb_set_dirty(cpu_single_env, cpu_single_env->mem_io_vaddr);
3206
}
3207

    
3208
static const MemoryRegionOps notdirty_mem_ops = {
3209
    .read = error_mem_read,
3210
    .write = notdirty_mem_write,
3211
    .endianness = DEVICE_NATIVE_ENDIAN,
3212
};
3213

    
3214
/* Generate a debug exception if a watchpoint has been hit.  */
3215
static void check_watchpoint(int offset, int len_mask, int flags)
3216
{
3217
    CPUState *env = cpu_single_env;
3218
    target_ulong pc, cs_base;
3219
    TranslationBlock *tb;
3220
    target_ulong vaddr;
3221
    CPUWatchpoint *wp;
3222
    int cpu_flags;
3223

    
3224
    if (env->watchpoint_hit) {
3225
        /* We re-entered the check after replacing the TB. Now raise
3226
         * the debug interrupt so that is will trigger after the
3227
         * current instruction. */
3228
        cpu_interrupt(env, CPU_INTERRUPT_DEBUG);
3229
        return;
3230
    }
3231
    vaddr = (env->mem_io_vaddr & TARGET_PAGE_MASK) + offset;
3232
    QTAILQ_FOREACH(wp, &env->watchpoints, entry) {
3233
        if ((vaddr == (wp->vaddr & len_mask) ||
3234
             (vaddr & wp->len_mask) == wp->vaddr) && (wp->flags & flags)) {
3235
            wp->flags |= BP_WATCHPOINT_HIT;
3236
            if (!env->watchpoint_hit) {
3237
                env->watchpoint_hit = wp;
3238
                tb = tb_find_pc(env->mem_io_pc);
3239
                if (!tb) {
3240
                    cpu_abort(env, "check_watchpoint: could not find TB for "
3241
                              "pc=%p", (void *)env->mem_io_pc);
3242
                }
3243
                cpu_restore_state(tb, env, env->mem_io_pc);
3244
                tb_phys_invalidate(tb, -1);
3245
                if (wp->flags & BP_STOP_BEFORE_ACCESS) {
3246
                    env->exception_index = EXCP_DEBUG;
3247
                } else {
3248
                    cpu_get_tb_cpu_state(env, &pc, &cs_base, &cpu_flags);
3249
                    tb_gen_code(env, pc, cs_base, cpu_flags, 1);
3250
                }
3251
                cpu_resume_from_signal(env, NULL);
3252
            }
3253
        } else {
3254
            wp->flags &= ~BP_WATCHPOINT_HIT;
3255
        }
3256
    }
3257
}
3258

    
3259
/* Watchpoint access routines.  Watchpoints are inserted using TLB tricks,
3260
   so these check for a hit then pass through to the normal out-of-line
3261
   phys routines.  */
3262
static uint64_t watch_mem_read(void *opaque, target_phys_addr_t addr,
3263
                               unsigned size)
3264
{
3265
    check_watchpoint(addr & ~TARGET_PAGE_MASK, ~(size - 1), BP_MEM_READ);
3266
    switch (size) {
3267
    case 1: return ldub_phys(addr);
3268
    case 2: return lduw_phys(addr);
3269
    case 4: return ldl_phys(addr);
3270
    default: abort();
3271
    }
3272
}
3273

    
3274
static void watch_mem_write(void *opaque, target_phys_addr_t addr,
3275
                            uint64_t val, unsigned size)
3276
{
3277
    check_watchpoint(addr & ~TARGET_PAGE_MASK, ~(size - 1), BP_MEM_WRITE);
3278
    switch (size) {
3279
    case 1: stb_phys(addr, val);
3280
    case 2: stw_phys(addr, val);
3281
    case 4: stl_phys(addr, val);
3282
    default: abort();
3283
    }
3284
}
3285

    
3286
static const MemoryRegionOps watch_mem_ops = {
3287
    .read = watch_mem_read,
3288
    .write = watch_mem_write,
3289
    .endianness = DEVICE_NATIVE_ENDIAN,
3290
};
3291

    
3292
static uint64_t subpage_read(void *opaque, target_phys_addr_t addr,
3293
                             unsigned len)
3294
{
3295
    subpage_t *mmio = opaque;
3296
    unsigned int idx = SUBPAGE_IDX(addr);
3297
#if defined(DEBUG_SUBPAGE)
3298
    printf("%s: subpage %p len %d addr " TARGET_FMT_plx " idx %d\n", __func__,
3299
           mmio, len, addr, idx);
3300
#endif
3301

    
3302
    addr += mmio->region_offset[idx];
3303
    idx = mmio->sub_io_index[idx];
3304
    return io_mem_read(idx, addr, len);
3305
}
3306

    
3307
static void subpage_write(void *opaque, target_phys_addr_t addr,
3308
                          uint64_t value, unsigned len)
3309
{
3310
    subpage_t *mmio = opaque;
3311
    unsigned int idx = SUBPAGE_IDX(addr);
3312
#if defined(DEBUG_SUBPAGE)
3313
    printf("%s: subpage %p len %d addr " TARGET_FMT_plx
3314
           " idx %d value %"PRIx64"\n",
3315
           __func__, mmio, len, addr, idx, value);
3316
#endif
3317

    
3318
    addr += mmio->region_offset[idx];
3319
    idx = mmio->sub_io_index[idx];
3320
    io_mem_write(idx, addr, value, len);
3321
}
3322

    
3323
static const MemoryRegionOps subpage_ops = {
3324
    .read = subpage_read,
3325
    .write = subpage_write,
3326
    .endianness = DEVICE_NATIVE_ENDIAN,
3327
};
3328

    
3329
static uint64_t subpage_ram_read(void *opaque, target_phys_addr_t addr,
3330
                                 unsigned size)
3331
{
3332
    ram_addr_t raddr = addr;
3333
    void *ptr = qemu_get_ram_ptr(raddr);
3334
    switch (size) {
3335
    case 1: return ldub_p(ptr);
3336
    case 2: return lduw_p(ptr);
3337
    case 4: return ldl_p(ptr);
3338
    default: abort();
3339
    }
3340
}
3341

    
3342
static void subpage_ram_write(void *opaque, target_phys_addr_t addr,
3343
                              uint64_t value, unsigned size)
3344
{
3345
    ram_addr_t raddr = addr;
3346
    void *ptr = qemu_get_ram_ptr(raddr);
3347
    switch (size) {
3348
    case 1: return stb_p(ptr, value);
3349
    case 2: return stw_p(ptr, value);
3350
    case 4: return stl_p(ptr, value);
3351
    default: abort();
3352
    }
3353
}
3354

    
3355
static const MemoryRegionOps subpage_ram_ops = {
3356
    .read = subpage_ram_read,
3357
    .write = subpage_ram_write,
3358
    .endianness = DEVICE_NATIVE_ENDIAN,
3359
};
3360

    
3361
static int subpage_register (subpage_t *mmio, uint32_t start, uint32_t end,
3362
                             ram_addr_t memory, ram_addr_t region_offset)
3363
{
3364
    int idx, eidx;
3365

    
3366
    if (start >= TARGET_PAGE_SIZE || end >= TARGET_PAGE_SIZE)
3367
        return -1;
3368
    idx = SUBPAGE_IDX(start);
3369
    eidx = SUBPAGE_IDX(end);
3370
#if defined(DEBUG_SUBPAGE)
3371
    printf("%s: %p start %08x end %08x idx %08x eidx %08x mem %ld\n", __func__,
3372
           mmio, start, end, idx, eidx, memory);
3373
#endif
3374
    if ((memory & ~TARGET_PAGE_MASK) == io_mem_ram.ram_addr) {
3375
        memory = io_mem_subpage_ram.ram_addr;
3376
    }
3377
    memory = (memory >> IO_MEM_SHIFT) & (IO_MEM_NB_ENTRIES - 1);
3378
    for (; idx <= eidx; idx++) {
3379
        mmio->sub_io_index[idx] = memory;
3380
        mmio->region_offset[idx] = region_offset;
3381
    }
3382

    
3383
    return 0;
3384
}
3385

    
3386
static subpage_t *subpage_init (target_phys_addr_t base, ram_addr_t *phys,
3387
                                ram_addr_t orig_memory,
3388
                                ram_addr_t region_offset)
3389
{
3390
    subpage_t *mmio;
3391
    int subpage_memory;
3392

    
3393
    mmio = g_malloc0(sizeof(subpage_t));
3394

    
3395
    mmio->base = base;
3396
    memory_region_init_io(&mmio->iomem, &subpage_ops, mmio,
3397
                          "subpage", TARGET_PAGE_SIZE);
3398
    mmio->iomem.subpage = true;
3399
    subpage_memory = mmio->iomem.ram_addr;
3400
#if defined(DEBUG_SUBPAGE)
3401
    printf("%s: %p base " TARGET_FMT_plx " len %08x %d\n", __func__,
3402
           mmio, base, TARGET_PAGE_SIZE, subpage_memory);
3403
#endif
3404
    *phys = subpage_memory;
3405
    subpage_register(mmio, 0, TARGET_PAGE_SIZE-1, orig_memory, region_offset);
3406

    
3407
    return mmio;
3408
}
3409

    
3410
static int get_free_io_mem_idx(void)
3411
{
3412
    int i;
3413

    
3414
    for (i = 0; i<IO_MEM_NB_ENTRIES; i++)
3415
        if (!io_mem_used[i]) {
3416
            io_mem_used[i] = 1;
3417
            return i;
3418
        }
3419
    fprintf(stderr, "RAN out out io_mem_idx, max %d !\n", IO_MEM_NB_ENTRIES);
3420
    return -1;
3421
}
3422

    
3423
/* mem_read and mem_write are arrays of functions containing the
3424
   function to access byte (index 0), word (index 1) and dword (index
3425
   2). Functions can be omitted with a NULL function pointer.
3426
   If io_index is non zero, the corresponding io zone is
3427
   modified. If it is zero, a new io zone is allocated. The return
3428
   value can be used with cpu_register_physical_memory(). (-1) is
3429
   returned if error. */
3430
static int cpu_register_io_memory_fixed(int io_index, MemoryRegion *mr)
3431
{
3432
    if (io_index <= 0) {
3433
        io_index = get_free_io_mem_idx();
3434
        if (io_index == -1)
3435
            return io_index;
3436
    } else {
3437
        io_index >>= IO_MEM_SHIFT;
3438
        if (io_index >= IO_MEM_NB_ENTRIES)
3439
            return -1;
3440
    }
3441

    
3442
    io_mem_region[io_index] = mr;
3443

    
3444
    return (io_index << IO_MEM_SHIFT);
3445
}
3446

    
3447
int cpu_register_io_memory(MemoryRegion *mr)
3448
{
3449
    return cpu_register_io_memory_fixed(0, mr);
3450
}
3451

    
3452
void cpu_unregister_io_memory(int io_table_address)
3453
{
3454
    int io_index = io_table_address >> IO_MEM_SHIFT;
3455

    
3456
    io_mem_region[io_index] = NULL;
3457
    io_mem_used[io_index] = 0;
3458
}
3459

    
3460
static void io_mem_init(void)
3461
{
3462
    int i;
3463

    
3464
    /* Must be first: */
3465
    memory_region_init_io(&io_mem_ram, &error_mem_ops, NULL, "ram", UINT64_MAX);
3466
    assert(io_mem_ram.ram_addr == 0);
3467
    memory_region_init_io(&io_mem_rom, &rom_mem_ops, NULL, "rom", UINT64_MAX);
3468
    memory_region_init_io(&io_mem_unassigned, &unassigned_mem_ops, NULL,
3469
                          "unassigned", UINT64_MAX);
3470
    memory_region_init_io(&io_mem_notdirty, &notdirty_mem_ops, NULL,
3471
                          "notdirty", UINT64_MAX);
3472
    memory_region_init_io(&io_mem_subpage_ram, &subpage_ram_ops, NULL,
3473
                          "subpage-ram", UINT64_MAX);
3474
    for (i=0; i<5; i++)
3475
        io_mem_used[i] = 1;
3476

    
3477
    memory_region_init_io(&io_mem_watch, &watch_mem_ops, NULL,
3478
                          "watch", UINT64_MAX);
3479
}
3480

    
3481
static void memory_map_init(void)
3482
{
3483
    system_memory = g_malloc(sizeof(*system_memory));
3484
    memory_region_init(system_memory, "system", INT64_MAX);
3485
    set_system_memory_map(system_memory);
3486

    
3487
    system_io = g_malloc(sizeof(*system_io));
3488
    memory_region_init(system_io, "io", 65536);
3489
    set_system_io_map(system_io);
3490
}
3491

    
3492
MemoryRegion *get_system_memory(void)
3493
{
3494
    return system_memory;
3495
}
3496

    
3497
MemoryRegion *get_system_io(void)
3498
{
3499
    return system_io;
3500
}
3501

    
3502
#endif /* !defined(CONFIG_USER_ONLY) */
3503

    
3504
/* physical memory access (slow version, mainly for debug) */
3505
#if defined(CONFIG_USER_ONLY)
3506
int cpu_memory_rw_debug(CPUState *env, target_ulong addr,
3507
                        uint8_t *buf, int len, int is_write)
3508
{
3509
    int l, flags;
3510
    target_ulong page;
3511
    void * p;
3512

    
3513
    while (len > 0) {
3514
        page = addr & TARGET_PAGE_MASK;
3515
        l = (page + TARGET_PAGE_SIZE) - addr;
3516
        if (l > len)
3517
            l = len;
3518
        flags = page_get_flags(page);
3519
        if (!(flags & PAGE_VALID))
3520
            return -1;
3521
        if (is_write) {
3522
            if (!(flags & PAGE_WRITE))
3523
                return -1;
3524
            /* XXX: this code should not depend on lock_user */
3525
            if (!(p = lock_user(VERIFY_WRITE, addr, l, 0)))
3526
                return -1;
3527
            memcpy(p, buf, l);
3528
            unlock_user(p, addr, l);
3529
        } else {
3530
            if (!(flags & PAGE_READ))
3531
                return -1;
3532
            /* XXX: this code should not depend on lock_user */
3533
            if (!(p = lock_user(VERIFY_READ, addr, l, 1)))
3534
                return -1;
3535
            memcpy(buf, p, l);
3536
            unlock_user(p, addr, 0);
3537
        }
3538
        len -= l;
3539
        buf += l;
3540
        addr += l;
3541
    }
3542
    return 0;
3543
}
3544

    
3545
#else
3546
void cpu_physical_memory_rw(target_phys_addr_t addr, uint8_t *buf,
3547
                            int len, int is_write)
3548
{
3549
    int l, io_index;
3550
    uint8_t *ptr;
3551
    uint32_t val;
3552
    target_phys_addr_t page;
3553
    ram_addr_t pd;
3554
    PhysPageDesc p;
3555

    
3556
    while (len > 0) {
3557
        page = addr & TARGET_PAGE_MASK;
3558
        l = (page + TARGET_PAGE_SIZE) - addr;
3559
        if (l > len)
3560
            l = len;
3561
        p = phys_page_find(page >> TARGET_PAGE_BITS);
3562
        pd = p.phys_offset;
3563

    
3564
        if (is_write) {
3565
            if ((pd & ~TARGET_PAGE_MASK) != io_mem_ram.ram_addr) {
3566
                target_phys_addr_t addr1;
3567
                io_index = (pd >> IO_MEM_SHIFT) & (IO_MEM_NB_ENTRIES - 1);
3568
                addr1 = (addr & ~TARGET_PAGE_MASK) + p.region_offset;
3569
                /* XXX: could force cpu_single_env to NULL to avoid
3570
                   potential bugs */
3571
                if (l >= 4 && ((addr1 & 3) == 0)) {
3572
                    /* 32 bit write access */
3573
                    val = ldl_p(buf);
3574
                    io_mem_write(io_index, addr1, val, 4);
3575
                    l = 4;
3576
                } else if (l >= 2 && ((addr1 & 1) == 0)) {
3577
                    /* 16 bit write access */
3578
                    val = lduw_p(buf);
3579
                    io_mem_write(io_index, addr1, val, 2);
3580
                    l = 2;
3581
                } else {
3582
                    /* 8 bit write access */
3583
                    val = ldub_p(buf);
3584
                    io_mem_write(io_index, addr1, val, 1);
3585
                    l = 1;
3586
                }
3587
            } else {
3588
                ram_addr_t addr1;
3589
                addr1 = (pd & TARGET_PAGE_MASK) + (addr & ~TARGET_PAGE_MASK);
3590
                /* RAM case */
3591
                ptr = qemu_get_ram_ptr(addr1);
3592
                memcpy(ptr, buf, l);
3593
                if (!cpu_physical_memory_is_dirty(addr1)) {
3594
                    /* invalidate code */
3595
                    tb_invalidate_phys_page_range(addr1, addr1 + l, 0);
3596
                    /* set dirty bit */
3597
                    cpu_physical_memory_set_dirty_flags(
3598
                        addr1, (0xff & ~CODE_DIRTY_FLAG));
3599
                }
3600
                qemu_put_ram_ptr(ptr);
3601
            }
3602
        } else {
3603
            if (!is_ram_rom_romd(pd)) {
3604
                target_phys_addr_t addr1;
3605
                /* I/O case */
3606
                io_index = (pd >> IO_MEM_SHIFT) & (IO_MEM_NB_ENTRIES - 1);
3607
                addr1 = (addr & ~TARGET_PAGE_MASK) + p.region_offset;
3608
                if (l >= 4 && ((addr1 & 3) == 0)) {
3609
                    /* 32 bit read access */
3610
                    val = io_mem_read(io_index, addr1, 4);
3611
                    stl_p(buf, val);
3612
                    l = 4;
3613
                } else if (l >= 2 && ((addr1 & 1) == 0)) {
3614
                    /* 16 bit read access */
3615
                    val = io_mem_read(io_index, addr1, 2);
3616
                    stw_p(buf, val);
3617
                    l = 2;
3618
                } else {
3619
                    /* 8 bit read access */
3620
                    val = io_mem_read(io_index, addr1, 1);
3621
                    stb_p(buf, val);
3622
                    l = 1;
3623
                }
3624
            } else {
3625
                /* RAM case */
3626
                ptr = qemu_get_ram_ptr(pd & TARGET_PAGE_MASK);
3627
                memcpy(buf, ptr + (addr & ~TARGET_PAGE_MASK), l);
3628
                qemu_put_ram_ptr(ptr);
3629
            }
3630
        }
3631
        len -= l;
3632
        buf += l;
3633
        addr += l;
3634
    }
3635
}
3636

    
3637
/* used for ROM loading : can write in RAM and ROM */
3638
void cpu_physical_memory_write_rom(target_phys_addr_t addr,
3639
                                   const uint8_t *buf, int len)
3640
{
3641
    int l;
3642
    uint8_t *ptr;
3643
    target_phys_addr_t page;
3644
    unsigned long pd;
3645
    PhysPageDesc p;
3646

    
3647
    while (len > 0) {
3648
        page = addr & TARGET_PAGE_MASK;
3649
        l = (page + TARGET_PAGE_SIZE) - addr;
3650
        if (l > len)
3651
            l = len;
3652
        p = phys_page_find(page >> TARGET_PAGE_BITS);
3653
        pd = p.phys_offset;
3654

    
3655
        if (!is_ram_rom_romd(pd)) {
3656
            /* do nothing */
3657
        } else {
3658
            unsigned long addr1;
3659
            addr1 = (pd & TARGET_PAGE_MASK) + (addr & ~TARGET_PAGE_MASK);
3660
            /* ROM/RAM case */
3661
            ptr = qemu_get_ram_ptr(addr1);
3662
            memcpy(ptr, buf, l);
3663
            qemu_put_ram_ptr(ptr);
3664
        }
3665
        len -= l;
3666
        buf += l;
3667
        addr += l;
3668
    }
3669
}
3670

    
3671
typedef struct {
3672
    void *buffer;
3673
    target_phys_addr_t addr;
3674
    target_phys_addr_t len;
3675
} BounceBuffer;
3676

    
3677
static BounceBuffer bounce;
3678

    
3679
typedef struct MapClient {
3680
    void *opaque;
3681
    void (*callback)(void *opaque);
3682
    QLIST_ENTRY(MapClient) link;
3683
} MapClient;
3684

    
3685
static QLIST_HEAD(map_client_list, MapClient) map_client_list
3686
    = QLIST_HEAD_INITIALIZER(map_client_list);
3687

    
3688
void *cpu_register_map_client(void *opaque, void (*callback)(void *opaque))
3689
{
3690
    MapClient *client = g_malloc(sizeof(*client));
3691

    
3692
    client->opaque = opaque;
3693
    client->callback = callback;
3694
    QLIST_INSERT_HEAD(&map_client_list, client, link);
3695
    return client;
3696
}
3697

    
3698
void cpu_unregister_map_client(void *_client)
3699
{
3700
    MapClient *client = (MapClient *)_client;
3701

    
3702
    QLIST_REMOVE(client, link);
3703
    g_free(client);
3704
}
3705

    
3706
static void cpu_notify_map_clients(void)
3707
{
3708
    MapClient *client;
3709

    
3710
    while (!QLIST_EMPTY(&map_client_list)) {
3711
        client = QLIST_FIRST(&map_client_list);
3712
        client->callback(client->opaque);
3713
        cpu_unregister_map_client(client);
3714
    }
3715
}
3716

    
3717
/* Map a physical memory region into a host virtual address.
3718
 * May map a subset of the requested range, given by and returned in *plen.
3719
 * May return NULL if resources needed to perform the mapping are exhausted.
3720
 * Use only for reads OR writes - not for read-modify-write operations.
3721
 * Use cpu_register_map_client() to know when retrying the map operation is
3722
 * likely to succeed.
3723
 */
3724
void *cpu_physical_memory_map(target_phys_addr_t addr,
3725
                              target_phys_addr_t *plen,
3726
                              int is_write)
3727
{
3728
    target_phys_addr_t len = *plen;
3729
    target_phys_addr_t todo = 0;
3730
    int l;
3731
    target_phys_addr_t page;
3732
    unsigned long pd;
3733
    PhysPageDesc p;
3734
    ram_addr_t raddr = RAM_ADDR_MAX;
3735
    ram_addr_t rlen;
3736
    void *ret;
3737

    
3738
    while (len > 0) {
3739
        page = addr & TARGET_PAGE_MASK;
3740
        l = (page + TARGET_PAGE_SIZE) - addr;
3741
        if (l > len)
3742
            l = len;
3743
        p = phys_page_find(page >> TARGET_PAGE_BITS);
3744
        pd = p.phys_offset;
3745

    
3746
        if ((pd & ~TARGET_PAGE_MASK) != io_mem_ram.ram_addr) {
3747
            if (todo || bounce.buffer) {
3748
                break;
3749
            }
3750
            bounce.buffer = qemu_memalign(TARGET_PAGE_SIZE, TARGET_PAGE_SIZE);
3751
            bounce.addr = addr;
3752
            bounce.len = l;
3753
            if (!is_write) {
3754
                cpu_physical_memory_read(addr, bounce.buffer, l);
3755
            }
3756

    
3757
            *plen = l;
3758
            return bounce.buffer;
3759
        }
3760
        if (!todo) {
3761
            raddr = (pd & TARGET_PAGE_MASK) + (addr & ~TARGET_PAGE_MASK);
3762
        }
3763

    
3764
        len -= l;
3765
        addr += l;
3766
        todo += l;
3767
    }
3768
    rlen = todo;
3769
    ret = qemu_ram_ptr_length(raddr, &rlen);
3770
    *plen = rlen;
3771
    return ret;
3772
}
3773

    
3774
/* Unmaps a memory region previously mapped by cpu_physical_memory_map().
3775
 * Will also mark the memory as dirty if is_write == 1.  access_len gives
3776
 * the amount of memory that was actually read or written by the caller.
3777
 */
3778
void cpu_physical_memory_unmap(void *buffer, target_phys_addr_t len,
3779
                               int is_write, target_phys_addr_t access_len)
3780
{
3781
    if (buffer != bounce.buffer) {
3782
        if (is_write) {
3783
            ram_addr_t addr1 = qemu_ram_addr_from_host_nofail(buffer);
3784
            while (access_len) {
3785
                unsigned l;
3786
                l = TARGET_PAGE_SIZE;
3787
                if (l > access_len)
3788
                    l = access_len;
3789
                if (!cpu_physical_memory_is_dirty(addr1)) {
3790
                    /* invalidate code */
3791
                    tb_invalidate_phys_page_range(addr1, addr1 + l, 0);
3792
                    /* set dirty bit */
3793
                    cpu_physical_memory_set_dirty_flags(
3794
                        addr1, (0xff & ~CODE_DIRTY_FLAG));
3795
                }
3796
                addr1 += l;
3797
                access_len -= l;
3798
            }
3799
        }
3800
        if (xen_enabled()) {
3801
            xen_invalidate_map_cache_entry(buffer);
3802
        }
3803
        return;
3804
    }
3805
    if (is_write) {
3806
        cpu_physical_memory_write(bounce.addr, bounce.buffer, access_len);
3807
    }
3808
    qemu_vfree(bounce.buffer);
3809
    bounce.buffer = NULL;
3810
    cpu_notify_map_clients();
3811
}
3812

    
3813
/* warning: addr must be aligned */
3814
static inline uint32_t ldl_phys_internal(target_phys_addr_t addr,
3815
                                         enum device_endian endian)
3816
{
3817
    int io_index;
3818
    uint8_t *ptr;
3819
    uint32_t val;
3820
    unsigned long pd;
3821
    PhysPageDesc p;
3822

    
3823
    p = phys_page_find(addr >> TARGET_PAGE_BITS);
3824
    pd = p.phys_offset;
3825

    
3826
    if (!is_ram_rom_romd(pd)) {
3827
        /* I/O case */
3828
        io_index = (pd >> IO_MEM_SHIFT) & (IO_MEM_NB_ENTRIES - 1);
3829
        addr = (addr & ~TARGET_PAGE_MASK) + p.region_offset;
3830
        val = io_mem_read(io_index, addr, 4);
3831
#if defined(TARGET_WORDS_BIGENDIAN)
3832
        if (endian == DEVICE_LITTLE_ENDIAN) {
3833
            val = bswap32(val);
3834
        }
3835
#else
3836
        if (endian == DEVICE_BIG_ENDIAN) {
3837
            val = bswap32(val);
3838
        }
3839
#endif
3840
    } else {
3841
        /* RAM case */
3842
        ptr = qemu_get_ram_ptr(pd & TARGET_PAGE_MASK) +
3843
            (addr & ~TARGET_PAGE_MASK);
3844
        switch (endian) {
3845
        case DEVICE_LITTLE_ENDIAN:
3846
            val = ldl_le_p(ptr);
3847
            break;
3848
        case DEVICE_BIG_ENDIAN:
3849
            val = ldl_be_p(ptr);
3850
            break;
3851
        default:
3852
            val = ldl_p(ptr);
3853
            break;
3854
        }
3855
    }
3856
    return val;
3857
}
3858

    
3859
uint32_t ldl_phys(target_phys_addr_t addr)
3860
{
3861
    return ldl_phys_internal(addr, DEVICE_NATIVE_ENDIAN);
3862
}
3863

    
3864
uint32_t ldl_le_phys(target_phys_addr_t addr)
3865
{
3866
    return ldl_phys_internal(addr, DEVICE_LITTLE_ENDIAN);
3867
}
3868

    
3869
uint32_t ldl_be_phys(target_phys_addr_t addr)
3870
{
3871
    return ldl_phys_internal(addr, DEVICE_BIG_ENDIAN);
3872
}
3873

    
3874
/* warning: addr must be aligned */
3875
static inline uint64_t ldq_phys_internal(target_phys_addr_t addr,
3876
                                         enum device_endian endian)
3877
{
3878
    int io_index;
3879
    uint8_t *ptr;
3880
    uint64_t val;
3881
    unsigned long pd;
3882
    PhysPageDesc p;
3883

    
3884
    p = phys_page_find(addr >> TARGET_PAGE_BITS);
3885
    pd = p.phys_offset;
3886

    
3887
    if (!is_ram_rom_romd(pd)) {
3888
        /* I/O case */
3889
        io_index = (pd >> IO_MEM_SHIFT) & (IO_MEM_NB_ENTRIES - 1);
3890
        addr = (addr & ~TARGET_PAGE_MASK) + p.region_offset;
3891

    
3892
        /* XXX This is broken when device endian != cpu endian.
3893
               Fix and add "endian" variable check */
3894
#ifdef TARGET_WORDS_BIGENDIAN
3895
        val = io_mem_read(io_index, addr, 4) << 32;
3896
        val |= io_mem_read(io_index, addr + 4, 4);
3897
#else
3898
        val = io_mem_read(io_index, addr, 4);
3899
        val |= io_mem_read(io_index, addr + 4, 4) << 32;
3900
#endif
3901
    } else {
3902
        /* RAM case */
3903
        ptr = qemu_get_ram_ptr(pd & TARGET_PAGE_MASK) +
3904
            (addr & ~TARGET_PAGE_MASK);
3905
        switch (endian) {
3906
        case DEVICE_LITTLE_ENDIAN:
3907
            val = ldq_le_p(ptr);
3908
            break;
3909
        case DEVICE_BIG_ENDIAN:
3910
            val = ldq_be_p(ptr);
3911
            break;
3912
        default:
3913
            val = ldq_p(ptr);
3914
            break;
3915
        }
3916
    }
3917
    return val;
3918
}
3919

    
3920
uint64_t ldq_phys(target_phys_addr_t addr)
3921
{
3922
    return ldq_phys_internal(addr, DEVICE_NATIVE_ENDIAN);
3923
}
3924

    
3925
uint64_t ldq_le_phys(target_phys_addr_t addr)
3926
{
3927
    return ldq_phys_internal(addr, DEVICE_LITTLE_ENDIAN);
3928
}
3929

    
3930
uint64_t ldq_be_phys(target_phys_addr_t addr)
3931
{
3932
    return ldq_phys_internal(addr, DEVICE_BIG_ENDIAN);
3933
}
3934

    
3935
/* XXX: optimize */
3936
uint32_t ldub_phys(target_phys_addr_t addr)
3937
{
3938
    uint8_t val;
3939
    cpu_physical_memory_read(addr, &val, 1);
3940
    return val;
3941
}
3942

    
3943
/* warning: addr must be aligned */
3944
static inline uint32_t lduw_phys_internal(target_phys_addr_t addr,
3945
                                          enum device_endian endian)
3946
{
3947
    int io_index;
3948
    uint8_t *ptr;
3949
    uint64_t val;
3950
    unsigned long pd;
3951
    PhysPageDesc p;
3952

    
3953
    p = phys_page_find(addr >> TARGET_PAGE_BITS);
3954
    pd = p.phys_offset;
3955

    
3956
    if (!is_ram_rom_romd(pd)) {
3957
        /* I/O case */
3958
        io_index = (pd >> IO_MEM_SHIFT) & (IO_MEM_NB_ENTRIES - 1);
3959
        addr = (addr & ~TARGET_PAGE_MASK) + p.region_offset;
3960
        val = io_mem_read(io_index, addr, 2);
3961
#if defined(TARGET_WORDS_BIGENDIAN)
3962
        if (endian == DEVICE_LITTLE_ENDIAN) {
3963
            val = bswap16(val);
3964
        }
3965
#else
3966
        if (endian == DEVICE_BIG_ENDIAN) {
3967
            val = bswap16(val);
3968
        }
3969
#endif
3970
    } else {
3971
        /* RAM case */
3972
        ptr = qemu_get_ram_ptr(pd & TARGET_PAGE_MASK) +
3973
            (addr & ~TARGET_PAGE_MASK);
3974
        switch (endian) {
3975
        case DEVICE_LITTLE_ENDIAN:
3976
            val = lduw_le_p(ptr);
3977
            break;
3978
        case DEVICE_BIG_ENDIAN:
3979
            val = lduw_be_p(ptr);
3980
            break;
3981
        default:
3982
            val = lduw_p(ptr);
3983
            break;
3984
        }
3985
    }
3986
    return val;
3987
}
3988

    
3989
uint32_t lduw_phys(target_phys_addr_t addr)
3990
{
3991
    return lduw_phys_internal(addr, DEVICE_NATIVE_ENDIAN);
3992
}
3993

    
3994
uint32_t lduw_le_phys(target_phys_addr_t addr)
3995
{
3996
    return lduw_phys_internal(addr, DEVICE_LITTLE_ENDIAN);
3997
}
3998

    
3999
uint32_t lduw_be_phys(target_phys_addr_t addr)
4000
{
4001
    return lduw_phys_internal(addr, DEVICE_BIG_ENDIAN);
4002
}
4003

    
4004
/* warning: addr must be aligned. The ram page is not masked as dirty
4005
   and the code inside is not invalidated. It is useful if the dirty
4006
   bits are used to track modified PTEs */
4007
void stl_phys_notdirty(target_phys_addr_t addr, uint32_t val)
4008
{
4009
    int io_index;
4010
    uint8_t *ptr;
4011
    unsigned long pd;
4012
    PhysPageDesc p;
4013

    
4014
    p = phys_page_find(addr >> TARGET_PAGE_BITS);
4015
    pd = p.phys_offset;
4016

    
4017
    if ((pd & ~TARGET_PAGE_MASK) != io_mem_ram.ram_addr) {
4018
        io_index = (pd >> IO_MEM_SHIFT) & (IO_MEM_NB_ENTRIES - 1);
4019
        addr = (addr & ~TARGET_PAGE_MASK) + p.region_offset;
4020
        io_mem_write(io_index, addr, val, 4);
4021
    } else {
4022
        unsigned long addr1 = (pd & TARGET_PAGE_MASK) + (addr & ~TARGET_PAGE_MASK);
4023
        ptr = qemu_get_ram_ptr(addr1);
4024
        stl_p(ptr, val);
4025

    
4026
        if (unlikely(in_migration)) {
4027
            if (!cpu_physical_memory_is_dirty(addr1)) {
4028
                /* invalidate code */
4029
                tb_invalidate_phys_page_range(addr1, addr1 + 4, 0);
4030
                /* set dirty bit */
4031
                cpu_physical_memory_set_dirty_flags(
4032
                    addr1, (0xff & ~CODE_DIRTY_FLAG));
4033
            }
4034
        }
4035
    }
4036
}
4037

    
4038
void stq_phys_notdirty(target_phys_addr_t addr, uint64_t val)
4039
{
4040
    int io_index;
4041
    uint8_t *ptr;
4042
    unsigned long pd;
4043
    PhysPageDesc p;
4044

    
4045
    p = phys_page_find(addr >> TARGET_PAGE_BITS);
4046
    pd = p.phys_offset;
4047

    
4048
    if ((pd & ~TARGET_PAGE_MASK) != io_mem_ram.ram_addr) {
4049
        io_index = (pd >> IO_MEM_SHIFT) & (IO_MEM_NB_ENTRIES - 1);
4050
        addr = (addr & ~TARGET_PAGE_MASK) + p.region_offset;
4051
#ifdef TARGET_WORDS_BIGENDIAN
4052
        io_mem_write(io_index, addr, val >> 32, 4);
4053
        io_mem_write(io_index, addr + 4, (uint32_t)val, 4);
4054
#else
4055
        io_mem_write(io_index, addr, (uint32_t)val, 4);
4056
        io_mem_write(io_index, addr + 4, val >> 32, 4);
4057
#endif
4058
    } else {
4059
        ptr = qemu_get_ram_ptr(pd & TARGET_PAGE_MASK) +
4060
            (addr & ~TARGET_PAGE_MASK);
4061
        stq_p(ptr, val);
4062
    }
4063
}
4064

    
4065
/* warning: addr must be aligned */
4066
static inline void stl_phys_internal(target_phys_addr_t addr, uint32_t val,
4067
                                     enum device_endian endian)
4068
{
4069
    int io_index;
4070
    uint8_t *ptr;
4071
    unsigned long pd;
4072
    PhysPageDesc p;
4073

    
4074
    p = phys_page_find(addr >> TARGET_PAGE_BITS);
4075
    pd = p.phys_offset;
4076

    
4077
    if ((pd & ~TARGET_PAGE_MASK) != io_mem_ram.ram_addr) {
4078
        io_index = (pd >> IO_MEM_SHIFT) & (IO_MEM_NB_ENTRIES - 1);
4079
        addr = (addr & ~TARGET_PAGE_MASK) + p.region_offset;
4080
#if defined(TARGET_WORDS_BIGENDIAN)
4081
        if (endian == DEVICE_LITTLE_ENDIAN) {
4082
            val = bswap32(val);
4083
        }
4084
#else
4085
        if (endian == DEVICE_BIG_ENDIAN) {
4086
            val = bswap32(val);
4087
        }
4088
#endif
4089
        io_mem_write(io_index, addr, val, 4);
4090
    } else {
4091
        unsigned long addr1;
4092
        addr1 = (pd & TARGET_PAGE_MASK) + (addr & ~TARGET_PAGE_MASK);
4093
        /* RAM case */
4094
        ptr = qemu_get_ram_ptr(addr1);
4095
        switch (endian) {
4096
        case DEVICE_LITTLE_ENDIAN:
4097
            stl_le_p(ptr, val);
4098
            break;
4099
        case DEVICE_BIG_ENDIAN:
4100
            stl_be_p(ptr, val);
4101
            break;
4102
        default:
4103
            stl_p(ptr, val);
4104
            break;
4105
        }
4106
        if (!cpu_physical_memory_is_dirty(addr1)) {
4107
            /* invalidate code */
4108
            tb_invalidate_phys_page_range(addr1, addr1 + 4, 0);
4109
            /* set dirty bit */
4110
            cpu_physical_memory_set_dirty_flags(addr1,
4111
                (0xff & ~CODE_DIRTY_FLAG));
4112
        }
4113
    }
4114
}
4115

    
4116
void stl_phys(target_phys_addr_t addr, uint32_t val)
4117
{
4118
    stl_phys_internal(addr, val, DEVICE_NATIVE_ENDIAN);
4119
}
4120

    
4121
void stl_le_phys(target_phys_addr_t addr, uint32_t val)
4122
{
4123
    stl_phys_internal(addr, val, DEVICE_LITTLE_ENDIAN);
4124
}
4125

    
4126
void stl_be_phys(target_phys_addr_t addr, uint32_t val)
4127
{
4128
    stl_phys_internal(addr, val, DEVICE_BIG_ENDIAN);
4129
}
4130

    
4131
/* XXX: optimize */
4132
void stb_phys(target_phys_addr_t addr, uint32_t val)
4133
{
4134
    uint8_t v = val;
4135
    cpu_physical_memory_write(addr, &v, 1);
4136
}
4137

    
4138
/* warning: addr must be aligned */
4139
static inline void stw_phys_internal(target_phys_addr_t addr, uint32_t val,
4140
                                     enum device_endian endian)
4141
{
4142
    int io_index;
4143
    uint8_t *ptr;
4144
    unsigned long pd;
4145
    PhysPageDesc p;
4146

    
4147
    p = phys_page_find(addr >> TARGET_PAGE_BITS);
4148
    pd = p.phys_offset;
4149

    
4150
    if ((pd & ~TARGET_PAGE_MASK) != io_mem_ram.ram_addr) {
4151
        io_index = (pd >> IO_MEM_SHIFT) & (IO_MEM_NB_ENTRIES - 1);
4152
        addr = (addr & ~TARGET_PAGE_MASK) + p.region_offset;
4153
#if defined(TARGET_WORDS_BIGENDIAN)
4154
        if (endian == DEVICE_LITTLE_ENDIAN) {
4155
            val = bswap16(val);
4156
        }
4157
#else
4158
        if (endian == DEVICE_BIG_ENDIAN) {
4159
            val = bswap16(val);
4160
        }
4161
#endif
4162
        io_mem_write(io_index, addr, val, 2);
4163
    } else {
4164
        unsigned long addr1;
4165
        addr1 = (pd & TARGET_PAGE_MASK) + (addr & ~TARGET_PAGE_MASK);
4166
        /* RAM case */
4167
        ptr = qemu_get_ram_ptr(addr1);
4168
        switch (endian) {
4169
        case DEVICE_LITTLE_ENDIAN:
4170
            stw_le_p(ptr, val);
4171
            break;
4172
        case DEVICE_BIG_ENDIAN:
4173
            stw_be_p(ptr, val);
4174
            break;
4175
        default:
4176
            stw_p(ptr, val);
4177
            break;
4178
        }
4179
        if (!cpu_physical_memory_is_dirty(addr1)) {
4180
            /* invalidate code */
4181
            tb_invalidate_phys_page_range(addr1, addr1 + 2, 0);
4182
            /* set dirty bit */
4183
            cpu_physical_memory_set_dirty_flags(addr1,
4184
                (0xff & ~CODE_DIRTY_FLAG));
4185
        }
4186
    }
4187
}
4188

    
4189
void stw_phys(target_phys_addr_t addr, uint32_t val)
4190
{
4191
    stw_phys_internal(addr, val, DEVICE_NATIVE_ENDIAN);
4192
}
4193

    
4194
void stw_le_phys(target_phys_addr_t addr, uint32_t val)
4195
{
4196
    stw_phys_internal(addr, val, DEVICE_LITTLE_ENDIAN);
4197
}
4198

    
4199
void stw_be_phys(target_phys_addr_t addr, uint32_t val)
4200
{
4201
    stw_phys_internal(addr, val, DEVICE_BIG_ENDIAN);
4202
}
4203

    
4204
/* XXX: optimize */
4205
void stq_phys(target_phys_addr_t addr, uint64_t val)
4206
{
4207
    val = tswap64(val);
4208
    cpu_physical_memory_write(addr, &val, 8);
4209
}
4210

    
4211
void stq_le_phys(target_phys_addr_t addr, uint64_t val)
4212
{
4213
    val = cpu_to_le64(val);
4214
    cpu_physical_memory_write(addr, &val, 8);
4215
}
4216

    
4217
void stq_be_phys(target_phys_addr_t addr, uint64_t val)
4218
{
4219
    val = cpu_to_be64(val);
4220
    cpu_physical_memory_write(addr, &val, 8);
4221
}
4222

    
4223
/* virtual memory access for debug (includes writing to ROM) */
4224
int cpu_memory_rw_debug(CPUState *env, target_ulong addr,
4225
                        uint8_t *buf, int len, int is_write)
4226
{
4227
    int l;
4228
    target_phys_addr_t phys_addr;
4229
    target_ulong page;
4230

    
4231
    while (len > 0) {
4232
        page = addr & TARGET_PAGE_MASK;
4233
        phys_addr = cpu_get_phys_page_debug(env, page);
4234
        /* if no physical page mapped, return an error */
4235
        if (phys_addr == -1)
4236
            return -1;
4237
        l = (page + TARGET_PAGE_SIZE) - addr;
4238
        if (l > len)
4239
            l = len;
4240
        phys_addr += (addr & ~TARGET_PAGE_MASK);
4241
        if (is_write)
4242
            cpu_physical_memory_write_rom(phys_addr, buf, l);
4243
        else
4244
            cpu_physical_memory_rw(phys_addr, buf, l, is_write);
4245
        len -= l;
4246
        buf += l;
4247
        addr += l;
4248
    }
4249
    return 0;
4250
}
4251
#endif
4252

    
4253
/* in deterministic execution mode, instructions doing device I/Os
4254
   must be at the end of the TB */
4255
void cpu_io_recompile(CPUState *env, void *retaddr)
4256
{
4257
    TranslationBlock *tb;
4258
    uint32_t n, cflags;
4259
    target_ulong pc, cs_base;
4260
    uint64_t flags;
4261

    
4262
    tb = tb_find_pc((unsigned long)retaddr);
4263
    if (!tb) {
4264
        cpu_abort(env, "cpu_io_recompile: could not find TB for pc=%p", 
4265
                  retaddr);
4266
    }
4267
    n = env->icount_decr.u16.low + tb->icount;
4268
    cpu_restore_state(tb, env, (unsigned long)retaddr);
4269
    /* Calculate how many instructions had been executed before the fault
4270
       occurred.  */
4271
    n = n - env->icount_decr.u16.low;
4272
    /* Generate a new TB ending on the I/O insn.  */
4273
    n++;
4274
    /* On MIPS and SH, delay slot instructions can only be restarted if
4275
       they were already the first instruction in the TB.  If this is not
4276
       the first instruction in a TB then re-execute the preceding
4277
       branch.  */
4278
#if defined(TARGET_MIPS)
4279
    if ((env->hflags & MIPS_HFLAG_BMASK) != 0 && n > 1) {
4280
        env->active_tc.PC -= 4;
4281
        env->icount_decr.u16.low++;
4282
        env->hflags &= ~MIPS_HFLAG_BMASK;
4283
    }
4284
#elif defined(TARGET_SH4)
4285
    if ((env->flags & ((DELAY_SLOT | DELAY_SLOT_CONDITIONAL))) != 0
4286
            && n > 1) {
4287
        env->pc -= 2;
4288
        env->icount_decr.u16.low++;
4289
        env->flags &= ~(DELAY_SLOT | DELAY_SLOT_CONDITIONAL);
4290
    }
4291
#endif
4292
    /* This should never happen.  */
4293
    if (n > CF_COUNT_MASK)
4294
        cpu_abort(env, "TB too big during recompile");
4295

    
4296
    cflags = n | CF_LAST_IO;
4297
    pc = tb->pc;
4298
    cs_base = tb->cs_base;
4299
    flags = tb->flags;
4300
    tb_phys_invalidate(tb, -1);
4301
    /* FIXME: In theory this could raise an exception.  In practice
4302
       we have already translated the block once so it's probably ok.  */
4303
    tb_gen_code(env, pc, cs_base, flags, cflags);
4304
    /* TODO: If env->pc != tb->pc (i.e. the faulting instruction was not
4305
       the first in the TB) then we end up generating a whole new TB and
4306
       repeating the fault, which is horribly inefficient.
4307
       Better would be to execute just this insn uncached, or generate a
4308
       second new TB.  */
4309
    cpu_resume_from_signal(env, NULL);
4310
}
4311

    
4312
#if !defined(CONFIG_USER_ONLY)
4313

    
4314
void dump_exec_info(FILE *f, fprintf_function cpu_fprintf)
4315
{
4316
    int i, target_code_size, max_target_code_size;
4317
    int direct_jmp_count, direct_jmp2_count, cross_page;
4318
    TranslationBlock *tb;
4319

    
4320
    target_code_size = 0;
4321
    max_target_code_size = 0;
4322
    cross_page = 0;
4323
    direct_jmp_count = 0;
4324
    direct_jmp2_count = 0;
4325
    for(i = 0; i < nb_tbs; i++) {
4326
        tb = &tbs[i];
4327
        target_code_size += tb->size;
4328
        if (tb->size > max_target_code_size)
4329
            max_target_code_size = tb->size;
4330
        if (tb->page_addr[1] != -1)
4331
            cross_page++;
4332
        if (tb->tb_next_offset[0] != 0xffff) {
4333
            direct_jmp_count++;
4334
            if (tb->tb_next_offset[1] != 0xffff) {
4335
                direct_jmp2_count++;
4336
            }
4337
        }
4338
    }
4339
    /* XXX: avoid using doubles ? */
4340
    cpu_fprintf(f, "Translation buffer state:\n");
4341
    cpu_fprintf(f, "gen code size       %td/%ld\n",
4342
                code_gen_ptr - code_gen_buffer, code_gen_buffer_max_size);
4343
    cpu_fprintf(f, "TB count            %d/%d\n", 
4344
                nb_tbs, code_gen_max_blocks);
4345
    cpu_fprintf(f, "TB avg target size  %d max=%d bytes\n",
4346
                nb_tbs ? target_code_size / nb_tbs : 0,
4347
                max_target_code_size);
4348
    cpu_fprintf(f, "TB avg host size    %td bytes (expansion ratio: %0.1f)\n",
4349
                nb_tbs ? (code_gen_ptr - code_gen_buffer) / nb_tbs : 0,
4350
                target_code_size ? (double) (code_gen_ptr - code_gen_buffer) / target_code_size : 0);
4351
    cpu_fprintf(f, "cross page TB count %d (%d%%)\n",
4352
            cross_page,
4353
            nb_tbs ? (cross_page * 100) / nb_tbs : 0);
4354
    cpu_fprintf(f, "direct jump count   %d (%d%%) (2 jumps=%d %d%%)\n",
4355
                direct_jmp_count,
4356
                nb_tbs ? (direct_jmp_count * 100) / nb_tbs : 0,
4357
                direct_jmp2_count,
4358
                nb_tbs ? (direct_jmp2_count * 100) / nb_tbs : 0);
4359
    cpu_fprintf(f, "\nStatistics:\n");
4360
    cpu_fprintf(f, "TB flush count      %d\n", tb_flush_count);
4361
    cpu_fprintf(f, "TB invalidate count %d\n", tb_phys_invalidate_count);
4362
    cpu_fprintf(f, "TLB flush count     %d\n", tlb_flush_count);
4363
    tcg_dump_info(f, cpu_fprintf);
4364
}
4365

    
4366
/* NOTE: this function can trigger an exception */
4367
/* NOTE2: the returned address is not exactly the physical address: it
4368
   is the offset relative to phys_ram_base */
4369
tb_page_addr_t get_page_addr_code(CPUState *env1, target_ulong addr)
4370
{
4371
    int mmu_idx, page_index, pd;
4372
    void *p;
4373

    
4374
    page_index = (addr >> TARGET_PAGE_BITS) & (CPU_TLB_SIZE - 1);
4375
    mmu_idx = cpu_mmu_index(env1);
4376
    if (unlikely(env1->tlb_table[mmu_idx][page_index].addr_code !=
4377
                 (addr & TARGET_PAGE_MASK))) {
4378
        ldub_code(addr);
4379
    }
4380
    pd = env1->tlb_table[mmu_idx][page_index].addr_code & ~TARGET_PAGE_MASK;
4381
    if (pd != io_mem_ram.ram_addr && pd != io_mem_rom.ram_addr
4382
        && !(pd & IO_MEM_ROMD)) {
4383
#if defined(TARGET_ALPHA) || defined(TARGET_MIPS) || defined(TARGET_SPARC)
4384
        cpu_unassigned_access(env1, addr, 0, 1, 0, 4);
4385
#else
4386
        cpu_abort(env1, "Trying to execute code outside RAM or ROM at 0x" TARGET_FMT_lx "\n", addr);
4387
#endif
4388
    }
4389
    p = (void *)((uintptr_t)addr + env1->tlb_table[mmu_idx][page_index].addend);
4390
    return qemu_ram_addr_from_host_nofail(p);
4391
}
4392

    
4393
#define MMUSUFFIX _cmmu
4394
#undef GETPC
4395
#define GETPC() NULL
4396
#define env cpu_single_env
4397
#define SOFTMMU_CODE_ACCESS
4398

    
4399
#define SHIFT 0
4400
#include "softmmu_template.h"
4401

    
4402
#define SHIFT 1
4403
#include "softmmu_template.h"
4404

    
4405
#define SHIFT 2
4406
#include "softmmu_template.h"
4407

    
4408
#define SHIFT 3
4409
#include "softmmu_template.h"
4410

    
4411
#undef env
4412

    
4413
#endif