Statistics
| Branch: | Revision:

root / exec.c @ 488d6577

History | View | Annotate | Download (129.2 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 16MB 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:
1880
 * If flush_global is true (the usual case), flush all tlb entries.
1881
 * If flush_global is false, flush (at least) all tlb entries not
1882
 * marked global.
1883
 *
1884
 * Since QEMU doesn't currently implement a global/not-global flag
1885
 * for tlb entries, at the moment tlb_flush() will also flush all
1886
 * tlb entries in the flush_global == false case. This is OK because
1887
 * CPU architectures generally permit an implementation to drop
1888
 * entries from the TLB at any time, so flushing more entries than
1889
 * required is only an efficiency issue, not a correctness issue.
1890
 */
1891
void tlb_flush(CPUState *env, int flush_global)
1892
{
1893
    int i;
1894

    
1895
#if defined(DEBUG_TLB)
1896
    printf("tlb_flush:\n");
1897
#endif
1898
    /* must reset current TB so that interrupts cannot modify the
1899
       links while we are modifying them */
1900
    env->current_tb = NULL;
1901

    
1902
    for(i = 0; i < CPU_TLB_SIZE; i++) {
1903
        int mmu_idx;
1904
        for (mmu_idx = 0; mmu_idx < NB_MMU_MODES; mmu_idx++) {
1905
            env->tlb_table[mmu_idx][i] = s_cputlb_empty_entry;
1906
        }
1907
    }
1908

    
1909
    memset (env->tb_jmp_cache, 0, TB_JMP_CACHE_SIZE * sizeof (void *));
1910

    
1911
    env->tlb_flush_addr = -1;
1912
    env->tlb_flush_mask = 0;
1913
    tlb_flush_count++;
1914
}
1915

    
1916
static inline void tlb_flush_entry(CPUTLBEntry *tlb_entry, target_ulong addr)
1917
{
1918
    if (addr == (tlb_entry->addr_read &
1919
                 (TARGET_PAGE_MASK | TLB_INVALID_MASK)) ||
1920
        addr == (tlb_entry->addr_write &
1921
                 (TARGET_PAGE_MASK | TLB_INVALID_MASK)) ||
1922
        addr == (tlb_entry->addr_code &
1923
                 (TARGET_PAGE_MASK | TLB_INVALID_MASK))) {
1924
        *tlb_entry = s_cputlb_empty_entry;
1925
    }
1926
}
1927

    
1928
void tlb_flush_page(CPUState *env, target_ulong addr)
1929
{
1930
    int i;
1931
    int mmu_idx;
1932

    
1933
#if defined(DEBUG_TLB)
1934
    printf("tlb_flush_page: " TARGET_FMT_lx "\n", addr);
1935
#endif
1936
    /* Check if we need to flush due to large pages.  */
1937
    if ((addr & env->tlb_flush_mask) == env->tlb_flush_addr) {
1938
#if defined(DEBUG_TLB)
1939
        printf("tlb_flush_page: forced full flush ("
1940
               TARGET_FMT_lx "/" TARGET_FMT_lx ")\n",
1941
               env->tlb_flush_addr, env->tlb_flush_mask);
1942
#endif
1943
        tlb_flush(env, 1);
1944
        return;
1945
    }
1946
    /* must reset current TB so that interrupts cannot modify the
1947
       links while we are modifying them */
1948
    env->current_tb = NULL;
1949

    
1950
    addr &= TARGET_PAGE_MASK;
1951
    i = (addr >> TARGET_PAGE_BITS) & (CPU_TLB_SIZE - 1);
1952
    for (mmu_idx = 0; mmu_idx < NB_MMU_MODES; mmu_idx++)
1953
        tlb_flush_entry(&env->tlb_table[mmu_idx][i], addr);
1954

    
1955
    tlb_flush_jmp_cache(env, addr);
1956
}
1957

    
1958
/* update the TLBs so that writes to code in the virtual page 'addr'
1959
   can be detected */
1960
static void tlb_protect_code(ram_addr_t ram_addr)
1961
{
1962
    cpu_physical_memory_reset_dirty(ram_addr,
1963
                                    ram_addr + TARGET_PAGE_SIZE,
1964
                                    CODE_DIRTY_FLAG);
1965
}
1966

    
1967
/* update the TLB so that writes in physical page 'phys_addr' are no longer
1968
   tested for self modifying code */
1969
static void tlb_unprotect_code_phys(CPUState *env, ram_addr_t ram_addr,
1970
                                    target_ulong vaddr)
1971
{
1972
    cpu_physical_memory_set_dirty_flags(ram_addr, CODE_DIRTY_FLAG);
1973
}
1974

    
1975
static inline void tlb_reset_dirty_range(CPUTLBEntry *tlb_entry,
1976
                                         unsigned long start, unsigned long length)
1977
{
1978
    unsigned long addr;
1979
    if ((tlb_entry->addr_write & ~TARGET_PAGE_MASK) == io_mem_ram.ram_addr) {
1980
        addr = (tlb_entry->addr_write & TARGET_PAGE_MASK) + tlb_entry->addend;
1981
        if ((addr - start) < length) {
1982
            tlb_entry->addr_write = (tlb_entry->addr_write & TARGET_PAGE_MASK) | TLB_NOTDIRTY;
1983
        }
1984
    }
1985
}
1986

    
1987
/* Note: start and end must be within the same ram block.  */
1988
void cpu_physical_memory_reset_dirty(ram_addr_t start, ram_addr_t end,
1989
                                     int dirty_flags)
1990
{
1991
    CPUState *env;
1992
    unsigned long length, start1;
1993
    int i;
1994

    
1995
    start &= TARGET_PAGE_MASK;
1996
    end = TARGET_PAGE_ALIGN(end);
1997

    
1998
    length = end - start;
1999
    if (length == 0)
2000
        return;
2001
    cpu_physical_memory_mask_dirty_range(start, length, dirty_flags);
2002

    
2003
    /* we modify the TLB cache so that the dirty bit will be set again
2004
       when accessing the range */
2005
    start1 = (unsigned long)qemu_safe_ram_ptr(start);
2006
    /* Check that we don't span multiple blocks - this breaks the
2007
       address comparisons below.  */
2008
    if ((unsigned long)qemu_safe_ram_ptr(end - 1) - start1
2009
            != (end - 1) - start) {
2010
        abort();
2011
    }
2012

    
2013
    for(env = first_cpu; env != NULL; env = env->next_cpu) {
2014
        int mmu_idx;
2015
        for (mmu_idx = 0; mmu_idx < NB_MMU_MODES; mmu_idx++) {
2016
            for(i = 0; i < CPU_TLB_SIZE; i++)
2017
                tlb_reset_dirty_range(&env->tlb_table[mmu_idx][i],
2018
                                      start1, length);
2019
        }
2020
    }
2021
}
2022

    
2023
int cpu_physical_memory_set_dirty_tracking(int enable)
2024
{
2025
    int ret = 0;
2026
    in_migration = enable;
2027
    return ret;
2028
}
2029

    
2030
static inline void tlb_update_dirty(CPUTLBEntry *tlb_entry)
2031
{
2032
    ram_addr_t ram_addr;
2033
    void *p;
2034

    
2035
    if ((tlb_entry->addr_write & ~TARGET_PAGE_MASK) == io_mem_ram.ram_addr) {
2036
        p = (void *)(unsigned long)((tlb_entry->addr_write & TARGET_PAGE_MASK)
2037
            + tlb_entry->addend);
2038
        ram_addr = qemu_ram_addr_from_host_nofail(p);
2039
        if (!cpu_physical_memory_is_dirty(ram_addr)) {
2040
            tlb_entry->addr_write |= TLB_NOTDIRTY;
2041
        }
2042
    }
2043
}
2044

    
2045
/* update the TLB according to the current state of the dirty bits */
2046
void cpu_tlb_update_dirty(CPUState *env)
2047
{
2048
    int i;
2049
    int mmu_idx;
2050
    for (mmu_idx = 0; mmu_idx < NB_MMU_MODES; mmu_idx++) {
2051
        for(i = 0; i < CPU_TLB_SIZE; i++)
2052
            tlb_update_dirty(&env->tlb_table[mmu_idx][i]);
2053
    }
2054
}
2055

    
2056
static inline void tlb_set_dirty1(CPUTLBEntry *tlb_entry, target_ulong vaddr)
2057
{
2058
    if (tlb_entry->addr_write == (vaddr | TLB_NOTDIRTY))
2059
        tlb_entry->addr_write = vaddr;
2060
}
2061

    
2062
/* update the TLB corresponding to virtual page vaddr
2063
   so that it is no longer dirty */
2064
static inline void tlb_set_dirty(CPUState *env, target_ulong vaddr)
2065
{
2066
    int i;
2067
    int mmu_idx;
2068

    
2069
    vaddr &= TARGET_PAGE_MASK;
2070
    i = (vaddr >> TARGET_PAGE_BITS) & (CPU_TLB_SIZE - 1);
2071
    for (mmu_idx = 0; mmu_idx < NB_MMU_MODES; mmu_idx++)
2072
        tlb_set_dirty1(&env->tlb_table[mmu_idx][i], vaddr);
2073
}
2074

    
2075
/* Our TLB does not support large pages, so remember the area covered by
2076
   large pages and trigger a full TLB flush if these are invalidated.  */
2077
static void tlb_add_large_page(CPUState *env, target_ulong vaddr,
2078
                               target_ulong size)
2079
{
2080
    target_ulong mask = ~(size - 1);
2081

    
2082
    if (env->tlb_flush_addr == (target_ulong)-1) {
2083
        env->tlb_flush_addr = vaddr & mask;
2084
        env->tlb_flush_mask = mask;
2085
        return;
2086
    }
2087
    /* Extend the existing region to include the new page.
2088
       This is a compromise between unnecessary flushes and the cost
2089
       of maintaining a full variable size TLB.  */
2090
    mask &= env->tlb_flush_mask;
2091
    while (((env->tlb_flush_addr ^ vaddr) & mask) != 0) {
2092
        mask <<= 1;
2093
    }
2094
    env->tlb_flush_addr &= mask;
2095
    env->tlb_flush_mask = mask;
2096
}
2097

    
2098
static bool is_ram_rom(ram_addr_t pd)
2099
{
2100
    pd &= ~TARGET_PAGE_MASK;
2101
    return pd == io_mem_ram.ram_addr || pd == io_mem_rom.ram_addr;
2102
}
2103

    
2104
static bool is_romd(ram_addr_t pd)
2105
{
2106
    MemoryRegion *mr;
2107

    
2108
    pd &= ~TARGET_PAGE_MASK;
2109
    mr = io_mem_region[pd];
2110
    return mr->rom_device && mr->readable;
2111
}
2112

    
2113
static bool is_ram_rom_romd(ram_addr_t pd)
2114
{
2115
    return is_ram_rom(pd) || is_romd(pd);
2116
}
2117

    
2118
/* Add a new TLB entry. At most one entry for a given virtual address
2119
   is permitted. Only a single TARGET_PAGE_SIZE region is mapped, the
2120
   supplied size is only used by tlb_flush_page.  */
2121
void tlb_set_page(CPUState *env, target_ulong vaddr,
2122
                  target_phys_addr_t paddr, int prot,
2123
                  int mmu_idx, target_ulong size)
2124
{
2125
    PhysPageDesc p;
2126
    unsigned long pd;
2127
    unsigned int index;
2128
    target_ulong address;
2129
    target_ulong code_address;
2130
    unsigned long addend;
2131
    CPUTLBEntry *te;
2132
    CPUWatchpoint *wp;
2133
    target_phys_addr_t iotlb;
2134

    
2135
    assert(size >= TARGET_PAGE_SIZE);
2136
    if (size != TARGET_PAGE_SIZE) {
2137
        tlb_add_large_page(env, vaddr, size);
2138
    }
2139
    p = phys_page_find(paddr >> TARGET_PAGE_BITS);
2140
    pd = p.phys_offset;
2141
#if defined(DEBUG_TLB)
2142
    printf("tlb_set_page: vaddr=" TARGET_FMT_lx " paddr=0x" TARGET_FMT_plx
2143
           " prot=%x idx=%d pd=0x%08lx\n",
2144
           vaddr, paddr, prot, mmu_idx, pd);
2145
#endif
2146

    
2147
    address = vaddr;
2148
    if (!is_ram_rom_romd(pd)) {
2149
        /* IO memory case (romd handled later) */
2150
        address |= TLB_MMIO;
2151
    }
2152
    addend = (unsigned long)qemu_get_ram_ptr(pd & TARGET_PAGE_MASK);
2153
    if (is_ram_rom(pd)) {
2154
        /* Normal RAM.  */
2155
        iotlb = pd & TARGET_PAGE_MASK;
2156
        if ((pd & ~TARGET_PAGE_MASK) == io_mem_ram.ram_addr)
2157
            iotlb |= io_mem_notdirty.ram_addr;
2158
        else
2159
            iotlb |= io_mem_rom.ram_addr;
2160
    } else {
2161
        /* IO handlers are currently passed a physical address.
2162
           It would be nice to pass an offset from the base address
2163
           of that region.  This would avoid having to special case RAM,
2164
           and avoid full address decoding in every device.
2165
           We can't use the high bits of pd for this because
2166
           IO_MEM_ROMD uses these as a ram address.  */
2167
        iotlb = (pd & ~TARGET_PAGE_MASK);
2168
        iotlb += p.region_offset;
2169
    }
2170

    
2171
    code_address = address;
2172
    /* Make accesses to pages with watchpoints go via the
2173
       watchpoint trap routines.  */
2174
    QTAILQ_FOREACH(wp, &env->watchpoints, entry) {
2175
        if (vaddr == (wp->vaddr & TARGET_PAGE_MASK)) {
2176
            /* Avoid trapping reads of pages with a write breakpoint. */
2177
            if ((prot & PAGE_WRITE) || (wp->flags & BP_MEM_READ)) {
2178
                iotlb = io_mem_watch.ram_addr + paddr;
2179
                address |= TLB_MMIO;
2180
                break;
2181
            }
2182
        }
2183
    }
2184

    
2185
    index = (vaddr >> TARGET_PAGE_BITS) & (CPU_TLB_SIZE - 1);
2186
    env->iotlb[mmu_idx][index] = iotlb - vaddr;
2187
    te = &env->tlb_table[mmu_idx][index];
2188
    te->addend = addend - vaddr;
2189
    if (prot & PAGE_READ) {
2190
        te->addr_read = address;
2191
    } else {
2192
        te->addr_read = -1;
2193
    }
2194

    
2195
    if (prot & PAGE_EXEC) {
2196
        te->addr_code = code_address;
2197
    } else {
2198
        te->addr_code = -1;
2199
    }
2200
    if (prot & PAGE_WRITE) {
2201
        if ((pd & ~TARGET_PAGE_MASK) == io_mem_rom.ram_addr || is_romd(pd)) {
2202
            /* Write access calls the I/O callback.  */
2203
            te->addr_write = address | TLB_MMIO;
2204
        } else if ((pd & ~TARGET_PAGE_MASK) == io_mem_ram.ram_addr &&
2205
                   !cpu_physical_memory_is_dirty(pd)) {
2206
            te->addr_write = address | TLB_NOTDIRTY;
2207
        } else {
2208
            te->addr_write = address;
2209
        }
2210
    } else {
2211
        te->addr_write = -1;
2212
    }
2213
}
2214

    
2215
#else
2216

    
2217
void tlb_flush(CPUState *env, int flush_global)
2218
{
2219
}
2220

    
2221
void tlb_flush_page(CPUState *env, target_ulong addr)
2222
{
2223
}
2224

    
2225
/*
2226
 * Walks guest process memory "regions" one by one
2227
 * and calls callback function 'fn' for each region.
2228
 */
2229

    
2230
struct walk_memory_regions_data
2231
{
2232
    walk_memory_regions_fn fn;
2233
    void *priv;
2234
    unsigned long start;
2235
    int prot;
2236
};
2237

    
2238
static int walk_memory_regions_end(struct walk_memory_regions_data *data,
2239
                                   abi_ulong end, int new_prot)
2240
{
2241
    if (data->start != -1ul) {
2242
        int rc = data->fn(data->priv, data->start, end, data->prot);
2243
        if (rc != 0) {
2244
            return rc;
2245
        }
2246
    }
2247

    
2248
    data->start = (new_prot ? end : -1ul);
2249
    data->prot = new_prot;
2250

    
2251
    return 0;
2252
}
2253

    
2254
static int walk_memory_regions_1(struct walk_memory_regions_data *data,
2255
                                 abi_ulong base, int level, void **lp)
2256
{
2257
    abi_ulong pa;
2258
    int i, rc;
2259

    
2260
    if (*lp == NULL) {
2261
        return walk_memory_regions_end(data, base, 0);
2262
    }
2263

    
2264
    if (level == 0) {
2265
        PageDesc *pd = *lp;
2266
        for (i = 0; i < L2_SIZE; ++i) {
2267
            int prot = pd[i].flags;
2268

    
2269
            pa = base | (i << TARGET_PAGE_BITS);
2270
            if (prot != data->prot) {
2271
                rc = walk_memory_regions_end(data, pa, prot);
2272
                if (rc != 0) {
2273
                    return rc;
2274
                }
2275
            }
2276
        }
2277
    } else {
2278
        void **pp = *lp;
2279
        for (i = 0; i < L2_SIZE; ++i) {
2280
            pa = base | ((abi_ulong)i <<
2281
                (TARGET_PAGE_BITS + L2_BITS * level));
2282
            rc = walk_memory_regions_1(data, pa, level - 1, pp + i);
2283
            if (rc != 0) {
2284
                return rc;
2285
            }
2286
        }
2287
    }
2288

    
2289
    return 0;
2290
}
2291

    
2292
int walk_memory_regions(void *priv, walk_memory_regions_fn fn)
2293
{
2294
    struct walk_memory_regions_data data;
2295
    unsigned long i;
2296

    
2297
    data.fn = fn;
2298
    data.priv = priv;
2299
    data.start = -1ul;
2300
    data.prot = 0;
2301

    
2302
    for (i = 0; i < V_L1_SIZE; i++) {
2303
        int rc = walk_memory_regions_1(&data, (abi_ulong)i << V_L1_SHIFT,
2304
                                       V_L1_SHIFT / L2_BITS - 1, l1_map + i);
2305
        if (rc != 0) {
2306
            return rc;
2307
        }
2308
    }
2309

    
2310
    return walk_memory_regions_end(&data, 0, 0);
2311
}
2312

    
2313
static int dump_region(void *priv, abi_ulong start,
2314
    abi_ulong end, unsigned long prot)
2315
{
2316
    FILE *f = (FILE *)priv;
2317

    
2318
    (void) fprintf(f, TARGET_ABI_FMT_lx"-"TARGET_ABI_FMT_lx
2319
        " "TARGET_ABI_FMT_lx" %c%c%c\n",
2320
        start, end, end - start,
2321
        ((prot & PAGE_READ) ? 'r' : '-'),
2322
        ((prot & PAGE_WRITE) ? 'w' : '-'),
2323
        ((prot & PAGE_EXEC) ? 'x' : '-'));
2324

    
2325
    return (0);
2326
}
2327

    
2328
/* dump memory mappings */
2329
void page_dump(FILE *f)
2330
{
2331
    (void) fprintf(f, "%-8s %-8s %-8s %s\n",
2332
            "start", "end", "size", "prot");
2333
    walk_memory_regions(f, dump_region);
2334
}
2335

    
2336
int page_get_flags(target_ulong address)
2337
{
2338
    PageDesc *p;
2339

    
2340
    p = page_find(address >> TARGET_PAGE_BITS);
2341
    if (!p)
2342
        return 0;
2343
    return p->flags;
2344
}
2345

    
2346
/* Modify the flags of a page and invalidate the code if necessary.
2347
   The flag PAGE_WRITE_ORG is positioned automatically depending
2348
   on PAGE_WRITE.  The mmap_lock should already be held.  */
2349
void page_set_flags(target_ulong start, target_ulong end, int flags)
2350
{
2351
    target_ulong addr, len;
2352

    
2353
    /* This function should never be called with addresses outside the
2354
       guest address space.  If this assert fires, it probably indicates
2355
       a missing call to h2g_valid.  */
2356
#if TARGET_ABI_BITS > L1_MAP_ADDR_SPACE_BITS
2357
    assert(end < ((abi_ulong)1 << L1_MAP_ADDR_SPACE_BITS));
2358
#endif
2359
    assert(start < end);
2360

    
2361
    start = start & TARGET_PAGE_MASK;
2362
    end = TARGET_PAGE_ALIGN(end);
2363

    
2364
    if (flags & PAGE_WRITE) {
2365
        flags |= PAGE_WRITE_ORG;
2366
    }
2367

    
2368
    for (addr = start, len = end - start;
2369
         len != 0;
2370
         len -= TARGET_PAGE_SIZE, addr += TARGET_PAGE_SIZE) {
2371
        PageDesc *p = page_find_alloc(addr >> TARGET_PAGE_BITS, 1);
2372

    
2373
        /* If the write protection bit is set, then we invalidate
2374
           the code inside.  */
2375
        if (!(p->flags & PAGE_WRITE) &&
2376
            (flags & PAGE_WRITE) &&
2377
            p->first_tb) {
2378
            tb_invalidate_phys_page(addr, 0, NULL);
2379
        }
2380
        p->flags = flags;
2381
    }
2382
}
2383

    
2384
int page_check_range(target_ulong start, target_ulong len, int flags)
2385
{
2386
    PageDesc *p;
2387
    target_ulong end;
2388
    target_ulong addr;
2389

    
2390
    /* This function should never be called with addresses outside the
2391
       guest address space.  If this assert fires, it probably indicates
2392
       a missing call to h2g_valid.  */
2393
#if TARGET_ABI_BITS > L1_MAP_ADDR_SPACE_BITS
2394
    assert(start < ((abi_ulong)1 << L1_MAP_ADDR_SPACE_BITS));
2395
#endif
2396

    
2397
    if (len == 0) {
2398
        return 0;
2399
    }
2400
    if (start + len - 1 < start) {
2401
        /* We've wrapped around.  */
2402
        return -1;
2403
    }
2404

    
2405
    end = TARGET_PAGE_ALIGN(start+len); /* must do before we loose bits in the next step */
2406
    start = start & TARGET_PAGE_MASK;
2407

    
2408
    for (addr = start, len = end - start;
2409
         len != 0;
2410
         len -= TARGET_PAGE_SIZE, addr += TARGET_PAGE_SIZE) {
2411
        p = page_find(addr >> TARGET_PAGE_BITS);
2412
        if( !p )
2413
            return -1;
2414
        if( !(p->flags & PAGE_VALID) )
2415
            return -1;
2416

    
2417
        if ((flags & PAGE_READ) && !(p->flags & PAGE_READ))
2418
            return -1;
2419
        if (flags & PAGE_WRITE) {
2420
            if (!(p->flags & PAGE_WRITE_ORG))
2421
                return -1;
2422
            /* unprotect the page if it was put read-only because it
2423
               contains translated code */
2424
            if (!(p->flags & PAGE_WRITE)) {
2425
                if (!page_unprotect(addr, 0, NULL))
2426
                    return -1;
2427
            }
2428
            return 0;
2429
        }
2430
    }
2431
    return 0;
2432
}
2433

    
2434
/* called from signal handler: invalidate the code and unprotect the
2435
   page. Return TRUE if the fault was successfully handled. */
2436
int page_unprotect(target_ulong address, unsigned long pc, void *puc)
2437
{
2438
    unsigned int prot;
2439
    PageDesc *p;
2440
    target_ulong host_start, host_end, addr;
2441

    
2442
    /* Technically this isn't safe inside a signal handler.  However we
2443
       know this only ever happens in a synchronous SEGV handler, so in
2444
       practice it seems to be ok.  */
2445
    mmap_lock();
2446

    
2447
    p = page_find(address >> TARGET_PAGE_BITS);
2448
    if (!p) {
2449
        mmap_unlock();
2450
        return 0;
2451
    }
2452

    
2453
    /* if the page was really writable, then we change its
2454
       protection back to writable */
2455
    if ((p->flags & PAGE_WRITE_ORG) && !(p->flags & PAGE_WRITE)) {
2456
        host_start = address & qemu_host_page_mask;
2457
        host_end = host_start + qemu_host_page_size;
2458

    
2459
        prot = 0;
2460
        for (addr = host_start ; addr < host_end ; addr += TARGET_PAGE_SIZE) {
2461
            p = page_find(addr >> TARGET_PAGE_BITS);
2462
            p->flags |= PAGE_WRITE;
2463
            prot |= p->flags;
2464

    
2465
            /* and since the content will be modified, we must invalidate
2466
               the corresponding translated code. */
2467
            tb_invalidate_phys_page(addr, pc, puc);
2468
#ifdef DEBUG_TB_CHECK
2469
            tb_invalidate_check(addr);
2470
#endif
2471
        }
2472
        mprotect((void *)g2h(host_start), qemu_host_page_size,
2473
                 prot & PAGE_BITS);
2474

    
2475
        mmap_unlock();
2476
        return 1;
2477
    }
2478
    mmap_unlock();
2479
    return 0;
2480
}
2481

    
2482
static inline void tlb_set_dirty(CPUState *env,
2483
                                 unsigned long addr, target_ulong vaddr)
2484
{
2485
}
2486
#endif /* defined(CONFIG_USER_ONLY) */
2487

    
2488
#if !defined(CONFIG_USER_ONLY)
2489

    
2490
#define SUBPAGE_IDX(addr) ((addr) & ~TARGET_PAGE_MASK)
2491
typedef struct subpage_t {
2492
    MemoryRegion iomem;
2493
    target_phys_addr_t base;
2494
    ram_addr_t sub_io_index[TARGET_PAGE_SIZE];
2495
    ram_addr_t region_offset[TARGET_PAGE_SIZE];
2496
} subpage_t;
2497

    
2498
static int subpage_register (subpage_t *mmio, uint32_t start, uint32_t end,
2499
                             ram_addr_t memory, ram_addr_t region_offset);
2500
static subpage_t *subpage_init (target_phys_addr_t base, ram_addr_t *phys,
2501
                                ram_addr_t orig_memory,
2502
                                ram_addr_t region_offset);
2503
#define CHECK_SUBPAGE(addr, start_addr, start_addr2, end_addr, end_addr2, \
2504
                      need_subpage)                                     \
2505
    do {                                                                \
2506
        if (addr > start_addr)                                          \
2507
            start_addr2 = 0;                                            \
2508
        else {                                                          \
2509
            start_addr2 = start_addr & ~TARGET_PAGE_MASK;               \
2510
            if (start_addr2 > 0)                                        \
2511
                need_subpage = 1;                                       \
2512
        }                                                               \
2513
                                                                        \
2514
        if ((start_addr + orig_size) - addr >= TARGET_PAGE_SIZE)        \
2515
            end_addr2 = TARGET_PAGE_SIZE - 1;                           \
2516
        else {                                                          \
2517
            end_addr2 = (start_addr + orig_size - 1) & ~TARGET_PAGE_MASK; \
2518
            if (end_addr2 < TARGET_PAGE_SIZE - 1)                       \
2519
                need_subpage = 1;                                       \
2520
        }                                                               \
2521
    } while (0)
2522

    
2523
/* register physical memory.
2524
   For RAM, 'size' must be a multiple of the target page size.
2525
   If (phys_offset & ~TARGET_PAGE_MASK) != 0, then it is an
2526
   io memory page.  The address used when calling the IO function is
2527
   the offset from the start of the region, plus region_offset.  Both
2528
   start_addr and region_offset are rounded down to a page boundary
2529
   before calculating this offset.  This should not be a problem unless
2530
   the low bits of start_addr and region_offset differ.  */
2531
void cpu_register_physical_memory_log(MemoryRegionSection *section,
2532
                                      bool readable, bool readonly)
2533
{
2534
    target_phys_addr_t start_addr = section->offset_within_address_space;
2535
    ram_addr_t size = section->size;
2536
    ram_addr_t phys_offset = section->mr->ram_addr;
2537
    ram_addr_t region_offset = section->offset_within_region;
2538
    target_phys_addr_t addr, end_addr;
2539
    PhysPageDesc *p;
2540
    CPUState *env;
2541
    ram_addr_t orig_size = size;
2542
    subpage_t *subpage;
2543

    
2544
    if (memory_region_is_ram(section->mr)) {
2545
        phys_offset += region_offset;
2546
        region_offset = 0;
2547
    }
2548

    
2549
    if (readonly) {
2550
        phys_offset |= io_mem_rom.ram_addr;
2551
    }
2552

    
2553
    assert(size);
2554

    
2555
    if (phys_offset == io_mem_unassigned.ram_addr) {
2556
        region_offset = start_addr;
2557
    }
2558
    region_offset &= TARGET_PAGE_MASK;
2559
    size = (size + TARGET_PAGE_SIZE - 1) & TARGET_PAGE_MASK;
2560
    end_addr = start_addr + (target_phys_addr_t)size;
2561

    
2562
    addr = start_addr;
2563
    do {
2564
        p = phys_page_find_alloc(addr >> TARGET_PAGE_BITS, 0);
2565
        if (p && p->phys_offset != io_mem_unassigned.ram_addr) {
2566
            ram_addr_t orig_memory = p->phys_offset;
2567
            target_phys_addr_t start_addr2, end_addr2;
2568
            int need_subpage = 0;
2569
            MemoryRegion *mr = io_mem_region[orig_memory & ~TARGET_PAGE_MASK];
2570

    
2571
            CHECK_SUBPAGE(addr, start_addr, start_addr2, end_addr, end_addr2,
2572
                          need_subpage);
2573
            if (need_subpage) {
2574
                if (!(mr->subpage)) {
2575
                    subpage = subpage_init((addr & TARGET_PAGE_MASK),
2576
                                           &p->phys_offset, orig_memory,
2577
                                           p->region_offset);
2578
                } else {
2579
                    subpage = container_of(mr, subpage_t, iomem);
2580
                }
2581
                subpage_register(subpage, start_addr2, end_addr2, phys_offset,
2582
                                 region_offset);
2583
                p->region_offset = 0;
2584
            } else {
2585
                p->phys_offset = phys_offset;
2586
                p->region_offset = region_offset;
2587
                if (is_ram_rom_romd(phys_offset))
2588
                    phys_offset += TARGET_PAGE_SIZE;
2589
            }
2590
        } else {
2591
            p = phys_page_find_alloc(addr >> TARGET_PAGE_BITS, 1);
2592
            p->phys_offset = phys_offset;
2593
            p->region_offset = region_offset;
2594
            if (is_ram_rom_romd(phys_offset)) {
2595
                phys_offset += TARGET_PAGE_SIZE;
2596
            } else {
2597
                target_phys_addr_t start_addr2, end_addr2;
2598
                int need_subpage = 0;
2599

    
2600
                CHECK_SUBPAGE(addr, start_addr, start_addr2, end_addr,
2601
                              end_addr2, need_subpage);
2602

    
2603
                if (need_subpage) {
2604
                    subpage = subpage_init((addr & TARGET_PAGE_MASK),
2605
                                           &p->phys_offset,
2606
                                           io_mem_unassigned.ram_addr,
2607
                                           addr & TARGET_PAGE_MASK);
2608
                    subpage_register(subpage, start_addr2, end_addr2,
2609
                                     phys_offset, region_offset);
2610
                    p->region_offset = 0;
2611
                }
2612
            }
2613
        }
2614
        region_offset += TARGET_PAGE_SIZE;
2615
        addr += TARGET_PAGE_SIZE;
2616
    } while (addr != end_addr);
2617

    
2618
    /* since each CPU stores ram addresses in its TLB cache, we must
2619
       reset the modified entries */
2620
    /* XXX: slow ! */
2621
    for(env = first_cpu; env != NULL; env = env->next_cpu) {
2622
        tlb_flush(env, 1);
2623
    }
2624
}
2625

    
2626
void qemu_register_coalesced_mmio(target_phys_addr_t addr, ram_addr_t size)
2627
{
2628
    if (kvm_enabled())
2629
        kvm_coalesce_mmio_region(addr, size);
2630
}
2631

    
2632
void qemu_unregister_coalesced_mmio(target_phys_addr_t addr, ram_addr_t size)
2633
{
2634
    if (kvm_enabled())
2635
        kvm_uncoalesce_mmio_region(addr, size);
2636
}
2637

    
2638
void qemu_flush_coalesced_mmio_buffer(void)
2639
{
2640
    if (kvm_enabled())
2641
        kvm_flush_coalesced_mmio_buffer();
2642
}
2643

    
2644
#if defined(__linux__) && !defined(TARGET_S390X)
2645

    
2646
#include <sys/vfs.h>
2647

    
2648
#define HUGETLBFS_MAGIC       0x958458f6
2649

    
2650
static long gethugepagesize(const char *path)
2651
{
2652
    struct statfs fs;
2653
    int ret;
2654

    
2655
    do {
2656
        ret = statfs(path, &fs);
2657
    } while (ret != 0 && errno == EINTR);
2658

    
2659
    if (ret != 0) {
2660
        perror(path);
2661
        return 0;
2662
    }
2663

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

    
2667
    return fs.f_bsize;
2668
}
2669

    
2670
static void *file_ram_alloc(RAMBlock *block,
2671
                            ram_addr_t memory,
2672
                            const char *path)
2673
{
2674
    char *filename;
2675
    void *area;
2676
    int fd;
2677
#ifdef MAP_POPULATE
2678
    int flags;
2679
#endif
2680
    unsigned long hpagesize;
2681

    
2682
    hpagesize = gethugepagesize(path);
2683
    if (!hpagesize) {
2684
        return NULL;
2685
    }
2686

    
2687
    if (memory < hpagesize) {
2688
        return NULL;
2689
    }
2690

    
2691
    if (kvm_enabled() && !kvm_has_sync_mmu()) {
2692
        fprintf(stderr, "host lacks kvm mmu notifiers, -mem-path unsupported\n");
2693
        return NULL;
2694
    }
2695

    
2696
    if (asprintf(&filename, "%s/qemu_back_mem.XXXXXX", path) == -1) {
2697
        return NULL;
2698
    }
2699

    
2700
    fd = mkstemp(filename);
2701
    if (fd < 0) {
2702
        perror("unable to create backing store for hugepages");
2703
        free(filename);
2704
        return NULL;
2705
    }
2706
    unlink(filename);
2707
    free(filename);
2708

    
2709
    memory = (memory+hpagesize-1) & ~(hpagesize-1);
2710

    
2711
    /*
2712
     * ftruncate is not supported by hugetlbfs in older
2713
     * hosts, so don't bother bailing out on errors.
2714
     * If anything goes wrong with it under other filesystems,
2715
     * mmap will fail.
2716
     */
2717
    if (ftruncate(fd, memory))
2718
        perror("ftruncate");
2719

    
2720
#ifdef MAP_POPULATE
2721
    /* NB: MAP_POPULATE won't exhaustively alloc all phys pages in the case
2722
     * MAP_PRIVATE is requested.  For mem_prealloc we mmap as MAP_SHARED
2723
     * to sidestep this quirk.
2724
     */
2725
    flags = mem_prealloc ? MAP_POPULATE | MAP_SHARED : MAP_PRIVATE;
2726
    area = mmap(0, memory, PROT_READ | PROT_WRITE, flags, fd, 0);
2727
#else
2728
    area = mmap(0, memory, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0);
2729
#endif
2730
    if (area == MAP_FAILED) {
2731
        perror("file_ram_alloc: can't mmap RAM pages");
2732
        close(fd);
2733
        return (NULL);
2734
    }
2735
    block->fd = fd;
2736
    return area;
2737
}
2738
#endif
2739

    
2740
static ram_addr_t find_ram_offset(ram_addr_t size)
2741
{
2742
    RAMBlock *block, *next_block;
2743
    ram_addr_t offset = RAM_ADDR_MAX, mingap = RAM_ADDR_MAX;
2744

    
2745
    if (QLIST_EMPTY(&ram_list.blocks))
2746
        return 0;
2747

    
2748
    QLIST_FOREACH(block, &ram_list.blocks, next) {
2749
        ram_addr_t end, next = RAM_ADDR_MAX;
2750

    
2751
        end = block->offset + block->length;
2752

    
2753
        QLIST_FOREACH(next_block, &ram_list.blocks, next) {
2754
            if (next_block->offset >= end) {
2755
                next = MIN(next, next_block->offset);
2756
            }
2757
        }
2758
        if (next - end >= size && next - end < mingap) {
2759
            offset = end;
2760
            mingap = next - end;
2761
        }
2762
    }
2763

    
2764
    if (offset == RAM_ADDR_MAX) {
2765
        fprintf(stderr, "Failed to find gap of requested size: %" PRIu64 "\n",
2766
                (uint64_t)size);
2767
        abort();
2768
    }
2769

    
2770
    return offset;
2771
}
2772

    
2773
static ram_addr_t last_ram_offset(void)
2774
{
2775
    RAMBlock *block;
2776
    ram_addr_t last = 0;
2777

    
2778
    QLIST_FOREACH(block, &ram_list.blocks, next)
2779
        last = MAX(last, block->offset + block->length);
2780

    
2781
    return last;
2782
}
2783

    
2784
void qemu_ram_set_idstr(ram_addr_t addr, const char *name, DeviceState *dev)
2785
{
2786
    RAMBlock *new_block, *block;
2787

    
2788
    new_block = NULL;
2789
    QLIST_FOREACH(block, &ram_list.blocks, next) {
2790
        if (block->offset == addr) {
2791
            new_block = block;
2792
            break;
2793
        }
2794
    }
2795
    assert(new_block);
2796
    assert(!new_block->idstr[0]);
2797

    
2798
    if (dev && dev->parent_bus && dev->parent_bus->info->get_dev_path) {
2799
        char *id = dev->parent_bus->info->get_dev_path(dev);
2800
        if (id) {
2801
            snprintf(new_block->idstr, sizeof(new_block->idstr), "%s/", id);
2802
            g_free(id);
2803
        }
2804
    }
2805
    pstrcat(new_block->idstr, sizeof(new_block->idstr), name);
2806

    
2807
    QLIST_FOREACH(block, &ram_list.blocks, next) {
2808
        if (block != new_block && !strcmp(block->idstr, new_block->idstr)) {
2809
            fprintf(stderr, "RAMBlock \"%s\" already registered, abort!\n",
2810
                    new_block->idstr);
2811
            abort();
2812
        }
2813
    }
2814
}
2815

    
2816
ram_addr_t qemu_ram_alloc_from_ptr(ram_addr_t size, void *host,
2817
                                   MemoryRegion *mr)
2818
{
2819
    RAMBlock *new_block;
2820

    
2821
    size = TARGET_PAGE_ALIGN(size);
2822
    new_block = g_malloc0(sizeof(*new_block));
2823

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

    
2867
    QLIST_INSERT_HEAD(&ram_list.blocks, new_block, next);
2868

    
2869
    ram_list.phys_dirty = g_realloc(ram_list.phys_dirty,
2870
                                       last_ram_offset() >> TARGET_PAGE_BITS);
2871
    memset(ram_list.phys_dirty + (new_block->offset >> TARGET_PAGE_BITS),
2872
           0xff, size >> TARGET_PAGE_BITS);
2873

    
2874
    if (kvm_enabled())
2875
        kvm_setup_guest_memory(new_block->host, size);
2876

    
2877
    return new_block->offset;
2878
}
2879

    
2880
ram_addr_t qemu_ram_alloc(ram_addr_t size, MemoryRegion *mr)
2881
{
2882
    return qemu_ram_alloc_from_ptr(size, NULL, mr);
2883
}
2884

    
2885
void qemu_ram_free_from_ptr(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
            g_free(block);
2893
            return;
2894
        }
2895
    }
2896
}
2897

    
2898
void qemu_ram_free(ram_addr_t addr)
2899
{
2900
    RAMBlock *block;
2901

    
2902
    QLIST_FOREACH(block, &ram_list.blocks, next) {
2903
        if (addr == block->offset) {
2904
            QLIST_REMOVE(block, next);
2905
            if (block->flags & RAM_PREALLOC_MASK) {
2906
                ;
2907
            } else if (mem_path) {
2908
#if defined (__linux__) && !defined(TARGET_S390X)
2909
                if (block->fd) {
2910
                    munmap(block->host, block->length);
2911
                    close(block->fd);
2912
                } else {
2913
                    qemu_vfree(block->host);
2914
                }
2915
#else
2916
                abort();
2917
#endif
2918
            } else {
2919
#if defined(TARGET_S390X) && defined(CONFIG_KVM)
2920
                munmap(block->host, block->length);
2921
#else
2922
                if (xen_enabled()) {
2923
                    xen_invalidate_map_cache_entry(block->host);
2924
                } else {
2925
                    qemu_vfree(block->host);
2926
                }
2927
#endif
2928
            }
2929
            g_free(block);
2930
            return;
2931
        }
2932
    }
2933

    
2934
}
2935

    
2936
#ifndef _WIN32
2937
void qemu_ram_remap(ram_addr_t addr, ram_addr_t length)
2938
{
2939
    RAMBlock *block;
2940
    ram_addr_t offset;
2941
    int flags;
2942
    void *area, *vaddr;
2943

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

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

3002
   It should not be used for general purpose DMA.
3003
   Use cpu_physical_memory_map/cpu_physical_memory_rw instead.
3004
 */
3005
void *qemu_get_ram_ptr(ram_addr_t addr)
3006
{
3007
    RAMBlock *block;
3008

    
3009
    QLIST_FOREACH(block, &ram_list.blocks, next) {
3010
        if (addr - block->offset < block->length) {
3011
            /* Move this entry to to start of the list.  */
3012
            if (block != QLIST_FIRST(&ram_list.blocks)) {
3013
                QLIST_REMOVE(block, next);
3014
                QLIST_INSERT_HEAD(&ram_list.blocks, block, next);
3015
            }
3016
            if (xen_enabled()) {
3017
                /* We need to check if the requested address is in the RAM
3018
                 * because we don't want to map the entire memory in QEMU.
3019
                 * In that case just map until the end of the page.
3020
                 */
3021
                if (block->offset == 0) {
3022
                    return xen_map_cache(addr, 0, 0);
3023
                } else if (block->host == NULL) {
3024
                    block->host =
3025
                        xen_map_cache(block->offset, block->length, 1);
3026
                }
3027
            }
3028
            return block->host + (addr - block->offset);
3029
        }
3030
    }
3031

    
3032
    fprintf(stderr, "Bad ram offset %" PRIx64 "\n", (uint64_t)addr);
3033
    abort();
3034

    
3035
    return NULL;
3036
}
3037

    
3038
/* Return a host pointer to ram allocated with qemu_ram_alloc.
3039
 * Same as qemu_get_ram_ptr but avoid reordering ramblocks.
3040
 */
3041
void *qemu_safe_ram_ptr(ram_addr_t addr)
3042
{
3043
    RAMBlock *block;
3044

    
3045
    QLIST_FOREACH(block, &ram_list.blocks, next) {
3046
        if (addr - block->offset < block->length) {
3047
            if (xen_enabled()) {
3048
                /* We need to check if the requested address is in the RAM
3049
                 * because we don't want to map the entire memory in QEMU.
3050
                 * In that case just map until the end of the page.
3051
                 */
3052
                if (block->offset == 0) {
3053
                    return xen_map_cache(addr, 0, 0);
3054
                } else if (block->host == NULL) {
3055
                    block->host =
3056
                        xen_map_cache(block->offset, block->length, 1);
3057
                }
3058
            }
3059
            return block->host + (addr - block->offset);
3060
        }
3061
    }
3062

    
3063
    fprintf(stderr, "Bad ram offset %" PRIx64 "\n", (uint64_t)addr);
3064
    abort();
3065

    
3066
    return NULL;
3067
}
3068

    
3069
/* Return a host pointer to guest's ram. Similar to qemu_get_ram_ptr
3070
 * but takes a size argument */
3071
void *qemu_ram_ptr_length(ram_addr_t addr, ram_addr_t *size)
3072
{
3073
    if (*size == 0) {
3074
        return NULL;
3075
    }
3076
    if (xen_enabled()) {
3077
        return xen_map_cache(addr, *size, 1);
3078
    } else {
3079
        RAMBlock *block;
3080

    
3081
        QLIST_FOREACH(block, &ram_list.blocks, next) {
3082
            if (addr - block->offset < block->length) {
3083
                if (addr - block->offset + *size > block->length)
3084
                    *size = block->length - addr + block->offset;
3085
                return block->host + (addr - block->offset);
3086
            }
3087
        }
3088

    
3089
        fprintf(stderr, "Bad ram offset %" PRIx64 "\n", (uint64_t)addr);
3090
        abort();
3091
    }
3092
}
3093

    
3094
void qemu_put_ram_ptr(void *addr)
3095
{
3096
    trace_qemu_put_ram_ptr(addr);
3097
}
3098

    
3099
int qemu_ram_addr_from_host(void *ptr, ram_addr_t *ram_addr)
3100
{
3101
    RAMBlock *block;
3102
    uint8_t *host = ptr;
3103

    
3104
    if (xen_enabled()) {
3105
        *ram_addr = xen_ram_addr_from_mapcache(ptr);
3106
        return 0;
3107
    }
3108

    
3109
    QLIST_FOREACH(block, &ram_list.blocks, next) {
3110
        /* This case append when the block is not mapped. */
3111
        if (block->host == NULL) {
3112
            continue;
3113
        }
3114
        if (host - block->host < block->length) {
3115
            *ram_addr = block->offset + (host - block->host);
3116
            return 0;
3117
        }
3118
    }
3119

    
3120
    return -1;
3121
}
3122

    
3123
/* Some of the softmmu routines need to translate from a host pointer
3124
   (typically a TLB entry) back to a ram offset.  */
3125
ram_addr_t qemu_ram_addr_from_host_nofail(void *ptr)
3126
{
3127
    ram_addr_t ram_addr;
3128

    
3129
    if (qemu_ram_addr_from_host(ptr, &ram_addr)) {
3130
        fprintf(stderr, "Bad ram pointer %p\n", ptr);
3131
        abort();
3132
    }
3133
    return ram_addr;
3134
}
3135

    
3136
static uint64_t unassigned_mem_read(void *opaque, target_phys_addr_t addr,
3137
                                    unsigned size)
3138
{
3139
#ifdef DEBUG_UNASSIGNED
3140
    printf("Unassigned mem read " TARGET_FMT_plx "\n", addr);
3141
#endif
3142
#if defined(TARGET_ALPHA) || defined(TARGET_SPARC) || defined(TARGET_MICROBLAZE)
3143
    cpu_unassigned_access(cpu_single_env, addr, 0, 0, 0, size);
3144
#endif
3145
    return 0;
3146
}
3147

    
3148
static void unassigned_mem_write(void *opaque, target_phys_addr_t addr,
3149
                                 uint64_t val, unsigned size)
3150
{
3151
#ifdef DEBUG_UNASSIGNED
3152
    printf("Unassigned mem write " TARGET_FMT_plx " = 0x%"PRIx64"\n", addr, val);
3153
#endif
3154
#if defined(TARGET_ALPHA) || defined(TARGET_SPARC) || defined(TARGET_MICROBLAZE)
3155
    cpu_unassigned_access(cpu_single_env, addr, 1, 0, 0, size);
3156
#endif
3157
}
3158

    
3159
static const MemoryRegionOps unassigned_mem_ops = {
3160
    .read = unassigned_mem_read,
3161
    .write = unassigned_mem_write,
3162
    .endianness = DEVICE_NATIVE_ENDIAN,
3163
};
3164

    
3165
static uint64_t error_mem_read(void *opaque, target_phys_addr_t addr,
3166
                               unsigned size)
3167
{
3168
    abort();
3169
}
3170

    
3171
static void error_mem_write(void *opaque, target_phys_addr_t addr,
3172
                            uint64_t value, unsigned size)
3173
{
3174
    abort();
3175
}
3176

    
3177
static const MemoryRegionOps error_mem_ops = {
3178
    .read = error_mem_read,
3179
    .write = error_mem_write,
3180
    .endianness = DEVICE_NATIVE_ENDIAN,
3181
};
3182

    
3183
static const MemoryRegionOps rom_mem_ops = {
3184
    .read = error_mem_read,
3185
    .write = unassigned_mem_write,
3186
    .endianness = DEVICE_NATIVE_ENDIAN,
3187
};
3188

    
3189
static void notdirty_mem_write(void *opaque, target_phys_addr_t ram_addr,
3190
                               uint64_t val, unsigned size)
3191
{
3192
    int dirty_flags;
3193
    dirty_flags = cpu_physical_memory_get_dirty_flags(ram_addr);
3194
    if (!(dirty_flags & CODE_DIRTY_FLAG)) {
3195
#if !defined(CONFIG_USER_ONLY)
3196
        tb_invalidate_phys_page_fast(ram_addr, size);
3197
        dirty_flags = cpu_physical_memory_get_dirty_flags(ram_addr);
3198
#endif
3199
    }
3200
    switch (size) {
3201
    case 1:
3202
        stb_p(qemu_get_ram_ptr(ram_addr), val);
3203
        break;
3204
    case 2:
3205
        stw_p(qemu_get_ram_ptr(ram_addr), val);
3206
        break;
3207
    case 4:
3208
        stl_p(qemu_get_ram_ptr(ram_addr), val);
3209
        break;
3210
    default:
3211
        abort();
3212
    }
3213
    dirty_flags |= (0xff & ~CODE_DIRTY_FLAG);
3214
    cpu_physical_memory_set_dirty_flags(ram_addr, dirty_flags);
3215
    /* we remove the notdirty callback only if the code has been
3216
       flushed */
3217
    if (dirty_flags == 0xff)
3218
        tlb_set_dirty(cpu_single_env, cpu_single_env->mem_io_vaddr);
3219
}
3220

    
3221
static const MemoryRegionOps notdirty_mem_ops = {
3222
    .read = error_mem_read,
3223
    .write = notdirty_mem_write,
3224
    .endianness = DEVICE_NATIVE_ENDIAN,
3225
};
3226

    
3227
/* Generate a debug exception if a watchpoint has been hit.  */
3228
static void check_watchpoint(int offset, int len_mask, int flags)
3229
{
3230
    CPUState *env = cpu_single_env;
3231
    target_ulong pc, cs_base;
3232
    TranslationBlock *tb;
3233
    target_ulong vaddr;
3234
    CPUWatchpoint *wp;
3235
    int cpu_flags;
3236

    
3237
    if (env->watchpoint_hit) {
3238
        /* We re-entered the check after replacing the TB. Now raise
3239
         * the debug interrupt so that is will trigger after the
3240
         * current instruction. */
3241
        cpu_interrupt(env, CPU_INTERRUPT_DEBUG);
3242
        return;
3243
    }
3244
    vaddr = (env->mem_io_vaddr & TARGET_PAGE_MASK) + offset;
3245
    QTAILQ_FOREACH(wp, &env->watchpoints, entry) {
3246
        if ((vaddr == (wp->vaddr & len_mask) ||
3247
             (vaddr & wp->len_mask) == wp->vaddr) && (wp->flags & flags)) {
3248
            wp->flags |= BP_WATCHPOINT_HIT;
3249
            if (!env->watchpoint_hit) {
3250
                env->watchpoint_hit = wp;
3251
                tb = tb_find_pc(env->mem_io_pc);
3252
                if (!tb) {
3253
                    cpu_abort(env, "check_watchpoint: could not find TB for "
3254
                              "pc=%p", (void *)env->mem_io_pc);
3255
                }
3256
                cpu_restore_state(tb, env, env->mem_io_pc);
3257
                tb_phys_invalidate(tb, -1);
3258
                if (wp->flags & BP_STOP_BEFORE_ACCESS) {
3259
                    env->exception_index = EXCP_DEBUG;
3260
                    cpu_loop_exit(env);
3261
                } else {
3262
                    cpu_get_tb_cpu_state(env, &pc, &cs_base, &cpu_flags);
3263
                    tb_gen_code(env, pc, cs_base, cpu_flags, 1);
3264
                    cpu_resume_from_signal(env, NULL);
3265
                }
3266
            }
3267
        } else {
3268
            wp->flags &= ~BP_WATCHPOINT_HIT;
3269
        }
3270
    }
3271
}
3272

    
3273
/* Watchpoint access routines.  Watchpoints are inserted using TLB tricks,
3274
   so these check for a hit then pass through to the normal out-of-line
3275
   phys routines.  */
3276
static uint64_t watch_mem_read(void *opaque, target_phys_addr_t addr,
3277
                               unsigned size)
3278
{
3279
    check_watchpoint(addr & ~TARGET_PAGE_MASK, ~(size - 1), BP_MEM_READ);
3280
    switch (size) {
3281
    case 1: return ldub_phys(addr);
3282
    case 2: return lduw_phys(addr);
3283
    case 4: return ldl_phys(addr);
3284
    default: abort();
3285
    }
3286
}
3287

    
3288
static void watch_mem_write(void *opaque, target_phys_addr_t addr,
3289
                            uint64_t val, unsigned size)
3290
{
3291
    check_watchpoint(addr & ~TARGET_PAGE_MASK, ~(size - 1), BP_MEM_WRITE);
3292
    switch (size) {
3293
    case 1:
3294
        stb_phys(addr, val);
3295
        break;
3296
    case 2:
3297
        stw_phys(addr, val);
3298
        break;
3299
    case 4:
3300
        stl_phys(addr, val);
3301
        break;
3302
    default: abort();
3303
    }
3304
}
3305

    
3306
static const MemoryRegionOps watch_mem_ops = {
3307
    .read = watch_mem_read,
3308
    .write = watch_mem_write,
3309
    .endianness = DEVICE_NATIVE_ENDIAN,
3310
};
3311

    
3312
static uint64_t subpage_read(void *opaque, target_phys_addr_t addr,
3313
                             unsigned len)
3314
{
3315
    subpage_t *mmio = opaque;
3316
    unsigned int idx = SUBPAGE_IDX(addr);
3317
#if defined(DEBUG_SUBPAGE)
3318
    printf("%s: subpage %p len %d addr " TARGET_FMT_plx " idx %d\n", __func__,
3319
           mmio, len, addr, idx);
3320
#endif
3321

    
3322
    addr += mmio->region_offset[idx];
3323
    idx = mmio->sub_io_index[idx];
3324
    return io_mem_read(idx, addr, len);
3325
}
3326

    
3327
static void subpage_write(void *opaque, target_phys_addr_t addr,
3328
                          uint64_t value, unsigned len)
3329
{
3330
    subpage_t *mmio = opaque;
3331
    unsigned int idx = SUBPAGE_IDX(addr);
3332
#if defined(DEBUG_SUBPAGE)
3333
    printf("%s: subpage %p len %d addr " TARGET_FMT_plx
3334
           " idx %d value %"PRIx64"\n",
3335
           __func__, mmio, len, addr, idx, value);
3336
#endif
3337

    
3338
    addr += mmio->region_offset[idx];
3339
    idx = mmio->sub_io_index[idx];
3340
    io_mem_write(idx, addr, value, len);
3341
}
3342

    
3343
static const MemoryRegionOps subpage_ops = {
3344
    .read = subpage_read,
3345
    .write = subpage_write,
3346
    .endianness = DEVICE_NATIVE_ENDIAN,
3347
};
3348

    
3349
static uint64_t subpage_ram_read(void *opaque, target_phys_addr_t addr,
3350
                                 unsigned size)
3351
{
3352
    ram_addr_t raddr = addr;
3353
    void *ptr = qemu_get_ram_ptr(raddr);
3354
    switch (size) {
3355
    case 1: return ldub_p(ptr);
3356
    case 2: return lduw_p(ptr);
3357
    case 4: return ldl_p(ptr);
3358
    default: abort();
3359
    }
3360
}
3361

    
3362
static void subpage_ram_write(void *opaque, target_phys_addr_t addr,
3363
                              uint64_t value, unsigned size)
3364
{
3365
    ram_addr_t raddr = addr;
3366
    void *ptr = qemu_get_ram_ptr(raddr);
3367
    switch (size) {
3368
    case 1: return stb_p(ptr, value);
3369
    case 2: return stw_p(ptr, value);
3370
    case 4: return stl_p(ptr, value);
3371
    default: abort();
3372
    }
3373
}
3374

    
3375
static const MemoryRegionOps subpage_ram_ops = {
3376
    .read = subpage_ram_read,
3377
    .write = subpage_ram_write,
3378
    .endianness = DEVICE_NATIVE_ENDIAN,
3379
};
3380

    
3381
static int subpage_register (subpage_t *mmio, uint32_t start, uint32_t end,
3382
                             ram_addr_t memory, ram_addr_t region_offset)
3383
{
3384
    int idx, eidx;
3385

    
3386
    if (start >= TARGET_PAGE_SIZE || end >= TARGET_PAGE_SIZE)
3387
        return -1;
3388
    idx = SUBPAGE_IDX(start);
3389
    eidx = SUBPAGE_IDX(end);
3390
#if defined(DEBUG_SUBPAGE)
3391
    printf("%s: %p start %08x end %08x idx %08x eidx %08x mem %ld\n", __func__,
3392
           mmio, start, end, idx, eidx, memory);
3393
#endif
3394
    if ((memory & ~TARGET_PAGE_MASK) == io_mem_ram.ram_addr) {
3395
        memory = io_mem_subpage_ram.ram_addr;
3396
    }
3397
    memory &= IO_MEM_NB_ENTRIES - 1;
3398
    for (; idx <= eidx; idx++) {
3399
        mmio->sub_io_index[idx] = memory;
3400
        mmio->region_offset[idx] = region_offset;
3401
    }
3402

    
3403
    return 0;
3404
}
3405

    
3406
static subpage_t *subpage_init (target_phys_addr_t base, ram_addr_t *phys,
3407
                                ram_addr_t orig_memory,
3408
                                ram_addr_t region_offset)
3409
{
3410
    subpage_t *mmio;
3411
    int subpage_memory;
3412

    
3413
    mmio = g_malloc0(sizeof(subpage_t));
3414

    
3415
    mmio->base = base;
3416
    memory_region_init_io(&mmio->iomem, &subpage_ops, mmio,
3417
                          "subpage", TARGET_PAGE_SIZE);
3418
    mmio->iomem.subpage = true;
3419
    subpage_memory = mmio->iomem.ram_addr;
3420
#if defined(DEBUG_SUBPAGE)
3421
    printf("%s: %p base " TARGET_FMT_plx " len %08x %d\n", __func__,
3422
           mmio, base, TARGET_PAGE_SIZE, subpage_memory);
3423
#endif
3424
    *phys = subpage_memory;
3425
    subpage_register(mmio, 0, TARGET_PAGE_SIZE-1, orig_memory, region_offset);
3426

    
3427
    return mmio;
3428
}
3429

    
3430
static int get_free_io_mem_idx(void)
3431
{
3432
    int i;
3433

    
3434
    for (i = 0; i<IO_MEM_NB_ENTRIES; i++)
3435
        if (!io_mem_used[i]) {
3436
            io_mem_used[i] = 1;
3437
            return i;
3438
        }
3439
    fprintf(stderr, "RAN out out io_mem_idx, max %d !\n", IO_MEM_NB_ENTRIES);
3440
    return -1;
3441
}
3442

    
3443
/* mem_read and mem_write are arrays of functions containing the
3444
   function to access byte (index 0), word (index 1) and dword (index
3445
   2). Functions can be omitted with a NULL function pointer.
3446
   If io_index is non zero, the corresponding io zone is
3447
   modified. If it is zero, a new io zone is allocated. The return
3448
   value can be used with cpu_register_physical_memory(). (-1) is
3449
   returned if error. */
3450
static int cpu_register_io_memory_fixed(int io_index, MemoryRegion *mr)
3451
{
3452
    if (io_index <= 0) {
3453
        io_index = get_free_io_mem_idx();
3454
        if (io_index == -1)
3455
            return io_index;
3456
    } else {
3457
        if (io_index >= IO_MEM_NB_ENTRIES)
3458
            return -1;
3459
    }
3460

    
3461
    io_mem_region[io_index] = mr;
3462

    
3463
    return io_index;
3464
}
3465

    
3466
int cpu_register_io_memory(MemoryRegion *mr)
3467
{
3468
    return cpu_register_io_memory_fixed(0, mr);
3469
}
3470

    
3471
void cpu_unregister_io_memory(int io_index)
3472
{
3473
    io_mem_region[io_index] = NULL;
3474
    io_mem_used[io_index] = 0;
3475
}
3476

    
3477
static void io_mem_init(void)
3478
{
3479
    int i;
3480

    
3481
    /* Must be first: */
3482
    memory_region_init_io(&io_mem_ram, &error_mem_ops, NULL, "ram", UINT64_MAX);
3483
    assert(io_mem_ram.ram_addr == 0);
3484
    memory_region_init_io(&io_mem_rom, &rom_mem_ops, NULL, "rom", UINT64_MAX);
3485
    memory_region_init_io(&io_mem_unassigned, &unassigned_mem_ops, NULL,
3486
                          "unassigned", UINT64_MAX);
3487
    memory_region_init_io(&io_mem_notdirty, &notdirty_mem_ops, NULL,
3488
                          "notdirty", UINT64_MAX);
3489
    memory_region_init_io(&io_mem_subpage_ram, &subpage_ram_ops, NULL,
3490
                          "subpage-ram", UINT64_MAX);
3491
    for (i=0; i<5; i++)
3492
        io_mem_used[i] = 1;
3493

    
3494
    memory_region_init_io(&io_mem_watch, &watch_mem_ops, NULL,
3495
                          "watch", UINT64_MAX);
3496
}
3497

    
3498
static void memory_map_init(void)
3499
{
3500
    system_memory = g_malloc(sizeof(*system_memory));
3501
    memory_region_init(system_memory, "system", INT64_MAX);
3502
    set_system_memory_map(system_memory);
3503

    
3504
    system_io = g_malloc(sizeof(*system_io));
3505
    memory_region_init(system_io, "io", 65536);
3506
    set_system_io_map(system_io);
3507
}
3508

    
3509
MemoryRegion *get_system_memory(void)
3510
{
3511
    return system_memory;
3512
}
3513

    
3514
MemoryRegion *get_system_io(void)
3515
{
3516
    return system_io;
3517
}
3518

    
3519
#endif /* !defined(CONFIG_USER_ONLY) */
3520

    
3521
/* physical memory access (slow version, mainly for debug) */
3522
#if defined(CONFIG_USER_ONLY)
3523
int cpu_memory_rw_debug(CPUState *env, target_ulong addr,
3524
                        uint8_t *buf, int len, int is_write)
3525
{
3526
    int l, flags;
3527
    target_ulong page;
3528
    void * p;
3529

    
3530
    while (len > 0) {
3531
        page = addr & TARGET_PAGE_MASK;
3532
        l = (page + TARGET_PAGE_SIZE) - addr;
3533
        if (l > len)
3534
            l = len;
3535
        flags = page_get_flags(page);
3536
        if (!(flags & PAGE_VALID))
3537
            return -1;
3538
        if (is_write) {
3539
            if (!(flags & PAGE_WRITE))
3540
                return -1;
3541
            /* XXX: this code should not depend on lock_user */
3542
            if (!(p = lock_user(VERIFY_WRITE, addr, l, 0)))
3543
                return -1;
3544
            memcpy(p, buf, l);
3545
            unlock_user(p, addr, l);
3546
        } else {
3547
            if (!(flags & PAGE_READ))
3548
                return -1;
3549
            /* XXX: this code should not depend on lock_user */
3550
            if (!(p = lock_user(VERIFY_READ, addr, l, 1)))
3551
                return -1;
3552
            memcpy(buf, p, l);
3553
            unlock_user(p, addr, 0);
3554
        }
3555
        len -= l;
3556
        buf += l;
3557
        addr += l;
3558
    }
3559
    return 0;
3560
}
3561

    
3562
#else
3563
void cpu_physical_memory_rw(target_phys_addr_t addr, uint8_t *buf,
3564
                            int len, int is_write)
3565
{
3566
    int l, io_index;
3567
    uint8_t *ptr;
3568
    uint32_t val;
3569
    target_phys_addr_t page;
3570
    ram_addr_t pd;
3571
    PhysPageDesc p;
3572

    
3573
    while (len > 0) {
3574
        page = addr & TARGET_PAGE_MASK;
3575
        l = (page + TARGET_PAGE_SIZE) - addr;
3576
        if (l > len)
3577
            l = len;
3578
        p = phys_page_find(page >> TARGET_PAGE_BITS);
3579
        pd = p.phys_offset;
3580

    
3581
        if (is_write) {
3582
            if ((pd & ~TARGET_PAGE_MASK) != io_mem_ram.ram_addr) {
3583
                target_phys_addr_t addr1;
3584
                io_index = pd & (IO_MEM_NB_ENTRIES - 1);
3585
                addr1 = (addr & ~TARGET_PAGE_MASK) + p.region_offset;
3586
                /* XXX: could force cpu_single_env to NULL to avoid
3587
                   potential bugs */
3588
                if (l >= 4 && ((addr1 & 3) == 0)) {
3589
                    /* 32 bit write access */
3590
                    val = ldl_p(buf);
3591
                    io_mem_write(io_index, addr1, val, 4);
3592
                    l = 4;
3593
                } else if (l >= 2 && ((addr1 & 1) == 0)) {
3594
                    /* 16 bit write access */
3595
                    val = lduw_p(buf);
3596
                    io_mem_write(io_index, addr1, val, 2);
3597
                    l = 2;
3598
                } else {
3599
                    /* 8 bit write access */
3600
                    val = ldub_p(buf);
3601
                    io_mem_write(io_index, addr1, val, 1);
3602
                    l = 1;
3603
                }
3604
            } else {
3605
                ram_addr_t addr1;
3606
                addr1 = (pd & TARGET_PAGE_MASK) + (addr & ~TARGET_PAGE_MASK);
3607
                /* RAM case */
3608
                ptr = qemu_get_ram_ptr(addr1);
3609
                memcpy(ptr, buf, l);
3610
                if (!cpu_physical_memory_is_dirty(addr1)) {
3611
                    /* invalidate code */
3612
                    tb_invalidate_phys_page_range(addr1, addr1 + l, 0);
3613
                    /* set dirty bit */
3614
                    cpu_physical_memory_set_dirty_flags(
3615
                        addr1, (0xff & ~CODE_DIRTY_FLAG));
3616
                }
3617
                qemu_put_ram_ptr(ptr);
3618
            }
3619
        } else {
3620
            if (!is_ram_rom_romd(pd)) {
3621
                target_phys_addr_t addr1;
3622
                /* I/O case */
3623
                io_index = pd & (IO_MEM_NB_ENTRIES - 1);
3624
                addr1 = (addr & ~TARGET_PAGE_MASK) + p.region_offset;
3625
                if (l >= 4 && ((addr1 & 3) == 0)) {
3626
                    /* 32 bit read access */
3627
                    val = io_mem_read(io_index, addr1, 4);
3628
                    stl_p(buf, val);
3629
                    l = 4;
3630
                } else if (l >= 2 && ((addr1 & 1) == 0)) {
3631
                    /* 16 bit read access */
3632
                    val = io_mem_read(io_index, addr1, 2);
3633
                    stw_p(buf, val);
3634
                    l = 2;
3635
                } else {
3636
                    /* 8 bit read access */
3637
                    val = io_mem_read(io_index, addr1, 1);
3638
                    stb_p(buf, val);
3639
                    l = 1;
3640
                }
3641
            } else {
3642
                /* RAM case */
3643
                ptr = qemu_get_ram_ptr(pd & TARGET_PAGE_MASK);
3644
                memcpy(buf, ptr + (addr & ~TARGET_PAGE_MASK), l);
3645
                qemu_put_ram_ptr(ptr);
3646
            }
3647
        }
3648
        len -= l;
3649
        buf += l;
3650
        addr += l;
3651
    }
3652
}
3653

    
3654
/* used for ROM loading : can write in RAM and ROM */
3655
void cpu_physical_memory_write_rom(target_phys_addr_t addr,
3656
                                   const uint8_t *buf, int len)
3657
{
3658
    int l;
3659
    uint8_t *ptr;
3660
    target_phys_addr_t page;
3661
    unsigned long pd;
3662
    PhysPageDesc p;
3663

    
3664
    while (len > 0) {
3665
        page = addr & TARGET_PAGE_MASK;
3666
        l = (page + TARGET_PAGE_SIZE) - addr;
3667
        if (l > len)
3668
            l = len;
3669
        p = phys_page_find(page >> TARGET_PAGE_BITS);
3670
        pd = p.phys_offset;
3671

    
3672
        if (!is_ram_rom_romd(pd)) {
3673
            /* do nothing */
3674
        } else {
3675
            unsigned long addr1;
3676
            addr1 = (pd & TARGET_PAGE_MASK) + (addr & ~TARGET_PAGE_MASK);
3677
            /* ROM/RAM case */
3678
            ptr = qemu_get_ram_ptr(addr1);
3679
            memcpy(ptr, buf, l);
3680
            qemu_put_ram_ptr(ptr);
3681
        }
3682
        len -= l;
3683
        buf += l;
3684
        addr += l;
3685
    }
3686
}
3687

    
3688
typedef struct {
3689
    void *buffer;
3690
    target_phys_addr_t addr;
3691
    target_phys_addr_t len;
3692
} BounceBuffer;
3693

    
3694
static BounceBuffer bounce;
3695

    
3696
typedef struct MapClient {
3697
    void *opaque;
3698
    void (*callback)(void *opaque);
3699
    QLIST_ENTRY(MapClient) link;
3700
} MapClient;
3701

    
3702
static QLIST_HEAD(map_client_list, MapClient) map_client_list
3703
    = QLIST_HEAD_INITIALIZER(map_client_list);
3704

    
3705
void *cpu_register_map_client(void *opaque, void (*callback)(void *opaque))
3706
{
3707
    MapClient *client = g_malloc(sizeof(*client));
3708

    
3709
    client->opaque = opaque;
3710
    client->callback = callback;
3711
    QLIST_INSERT_HEAD(&map_client_list, client, link);
3712
    return client;
3713
}
3714

    
3715
void cpu_unregister_map_client(void *_client)
3716
{
3717
    MapClient *client = (MapClient *)_client;
3718

    
3719
    QLIST_REMOVE(client, link);
3720
    g_free(client);
3721
}
3722

    
3723
static void cpu_notify_map_clients(void)
3724
{
3725
    MapClient *client;
3726

    
3727
    while (!QLIST_EMPTY(&map_client_list)) {
3728
        client = QLIST_FIRST(&map_client_list);
3729
        client->callback(client->opaque);
3730
        cpu_unregister_map_client(client);
3731
    }
3732
}
3733

    
3734
/* Map a physical memory region into a host virtual address.
3735
 * May map a subset of the requested range, given by and returned in *plen.
3736
 * May return NULL if resources needed to perform the mapping are exhausted.
3737
 * Use only for reads OR writes - not for read-modify-write operations.
3738
 * Use cpu_register_map_client() to know when retrying the map operation is
3739
 * likely to succeed.
3740
 */
3741
void *cpu_physical_memory_map(target_phys_addr_t addr,
3742
                              target_phys_addr_t *plen,
3743
                              int is_write)
3744
{
3745
    target_phys_addr_t len = *plen;
3746
    target_phys_addr_t todo = 0;
3747
    int l;
3748
    target_phys_addr_t page;
3749
    unsigned long pd;
3750
    PhysPageDesc p;
3751
    ram_addr_t raddr = RAM_ADDR_MAX;
3752
    ram_addr_t rlen;
3753
    void *ret;
3754

    
3755
    while (len > 0) {
3756
        page = addr & TARGET_PAGE_MASK;
3757
        l = (page + TARGET_PAGE_SIZE) - addr;
3758
        if (l > len)
3759
            l = len;
3760
        p = phys_page_find(page >> TARGET_PAGE_BITS);
3761
        pd = p.phys_offset;
3762

    
3763
        if ((pd & ~TARGET_PAGE_MASK) != io_mem_ram.ram_addr) {
3764
            if (todo || bounce.buffer) {
3765
                break;
3766
            }
3767
            bounce.buffer = qemu_memalign(TARGET_PAGE_SIZE, TARGET_PAGE_SIZE);
3768
            bounce.addr = addr;
3769
            bounce.len = l;
3770
            if (!is_write) {
3771
                cpu_physical_memory_read(addr, bounce.buffer, l);
3772
            }
3773

    
3774
            *plen = l;
3775
            return bounce.buffer;
3776
        }
3777
        if (!todo) {
3778
            raddr = (pd & TARGET_PAGE_MASK) + (addr & ~TARGET_PAGE_MASK);
3779
        }
3780

    
3781
        len -= l;
3782
        addr += l;
3783
        todo += l;
3784
    }
3785
    rlen = todo;
3786
    ret = qemu_ram_ptr_length(raddr, &rlen);
3787
    *plen = rlen;
3788
    return ret;
3789
}
3790

    
3791
/* Unmaps a memory region previously mapped by cpu_physical_memory_map().
3792
 * Will also mark the memory as dirty if is_write == 1.  access_len gives
3793
 * the amount of memory that was actually read or written by the caller.
3794
 */
3795
void cpu_physical_memory_unmap(void *buffer, target_phys_addr_t len,
3796
                               int is_write, target_phys_addr_t access_len)
3797
{
3798
    if (buffer != bounce.buffer) {
3799
        if (is_write) {
3800
            ram_addr_t addr1 = qemu_ram_addr_from_host_nofail(buffer);
3801
            while (access_len) {
3802
                unsigned l;
3803
                l = TARGET_PAGE_SIZE;
3804
                if (l > access_len)
3805
                    l = access_len;
3806
                if (!cpu_physical_memory_is_dirty(addr1)) {
3807
                    /* invalidate code */
3808
                    tb_invalidate_phys_page_range(addr1, addr1 + l, 0);
3809
                    /* set dirty bit */
3810
                    cpu_physical_memory_set_dirty_flags(
3811
                        addr1, (0xff & ~CODE_DIRTY_FLAG));
3812
                }
3813
                addr1 += l;
3814
                access_len -= l;
3815
            }
3816
        }
3817
        if (xen_enabled()) {
3818
            xen_invalidate_map_cache_entry(buffer);
3819
        }
3820
        return;
3821
    }
3822
    if (is_write) {
3823
        cpu_physical_memory_write(bounce.addr, bounce.buffer, access_len);
3824
    }
3825
    qemu_vfree(bounce.buffer);
3826
    bounce.buffer = NULL;
3827
    cpu_notify_map_clients();
3828
}
3829

    
3830
/* warning: addr must be aligned */
3831
static inline uint32_t ldl_phys_internal(target_phys_addr_t addr,
3832
                                         enum device_endian endian)
3833
{
3834
    int io_index;
3835
    uint8_t *ptr;
3836
    uint32_t val;
3837
    unsigned long pd;
3838
    PhysPageDesc p;
3839

    
3840
    p = phys_page_find(addr >> TARGET_PAGE_BITS);
3841
    pd = p.phys_offset;
3842

    
3843
    if (!is_ram_rom_romd(pd)) {
3844
        /* I/O case */
3845
        io_index = pd & (IO_MEM_NB_ENTRIES - 1);
3846
        addr = (addr & ~TARGET_PAGE_MASK) + p.region_offset;
3847
        val = io_mem_read(io_index, addr, 4);
3848
#if defined(TARGET_WORDS_BIGENDIAN)
3849
        if (endian == DEVICE_LITTLE_ENDIAN) {
3850
            val = bswap32(val);
3851
        }
3852
#else
3853
        if (endian == DEVICE_BIG_ENDIAN) {
3854
            val = bswap32(val);
3855
        }
3856
#endif
3857
    } else {
3858
        /* RAM case */
3859
        ptr = qemu_get_ram_ptr(pd & TARGET_PAGE_MASK) +
3860
            (addr & ~TARGET_PAGE_MASK);
3861
        switch (endian) {
3862
        case DEVICE_LITTLE_ENDIAN:
3863
            val = ldl_le_p(ptr);
3864
            break;
3865
        case DEVICE_BIG_ENDIAN:
3866
            val = ldl_be_p(ptr);
3867
            break;
3868
        default:
3869
            val = ldl_p(ptr);
3870
            break;
3871
        }
3872
    }
3873
    return val;
3874
}
3875

    
3876
uint32_t ldl_phys(target_phys_addr_t addr)
3877
{
3878
    return ldl_phys_internal(addr, DEVICE_NATIVE_ENDIAN);
3879
}
3880

    
3881
uint32_t ldl_le_phys(target_phys_addr_t addr)
3882
{
3883
    return ldl_phys_internal(addr, DEVICE_LITTLE_ENDIAN);
3884
}
3885

    
3886
uint32_t ldl_be_phys(target_phys_addr_t addr)
3887
{
3888
    return ldl_phys_internal(addr, DEVICE_BIG_ENDIAN);
3889
}
3890

    
3891
/* warning: addr must be aligned */
3892
static inline uint64_t ldq_phys_internal(target_phys_addr_t addr,
3893
                                         enum device_endian endian)
3894
{
3895
    int io_index;
3896
    uint8_t *ptr;
3897
    uint64_t val;
3898
    unsigned long pd;
3899
    PhysPageDesc p;
3900

    
3901
    p = phys_page_find(addr >> TARGET_PAGE_BITS);
3902
    pd = p.phys_offset;
3903

    
3904
    if (!is_ram_rom_romd(pd)) {
3905
        /* I/O case */
3906
        io_index = pd & (IO_MEM_NB_ENTRIES - 1);
3907
        addr = (addr & ~TARGET_PAGE_MASK) + p.region_offset;
3908

    
3909
        /* XXX This is broken when device endian != cpu endian.
3910
               Fix and add "endian" variable check */
3911
#ifdef TARGET_WORDS_BIGENDIAN
3912
        val = io_mem_read(io_index, addr, 4) << 32;
3913
        val |= io_mem_read(io_index, addr + 4, 4);
3914
#else
3915
        val = io_mem_read(io_index, addr, 4);
3916
        val |= io_mem_read(io_index, addr + 4, 4) << 32;
3917
#endif
3918
    } else {
3919
        /* RAM case */
3920
        ptr = qemu_get_ram_ptr(pd & TARGET_PAGE_MASK) +
3921
            (addr & ~TARGET_PAGE_MASK);
3922
        switch (endian) {
3923
        case DEVICE_LITTLE_ENDIAN:
3924
            val = ldq_le_p(ptr);
3925
            break;
3926
        case DEVICE_BIG_ENDIAN:
3927
            val = ldq_be_p(ptr);
3928
            break;
3929
        default:
3930
            val = ldq_p(ptr);
3931
            break;
3932
        }
3933
    }
3934
    return val;
3935
}
3936

    
3937
uint64_t ldq_phys(target_phys_addr_t addr)
3938
{
3939
    return ldq_phys_internal(addr, DEVICE_NATIVE_ENDIAN);
3940
}
3941

    
3942
uint64_t ldq_le_phys(target_phys_addr_t addr)
3943
{
3944
    return ldq_phys_internal(addr, DEVICE_LITTLE_ENDIAN);
3945
}
3946

    
3947
uint64_t ldq_be_phys(target_phys_addr_t addr)
3948
{
3949
    return ldq_phys_internal(addr, DEVICE_BIG_ENDIAN);
3950
}
3951

    
3952
/* XXX: optimize */
3953
uint32_t ldub_phys(target_phys_addr_t addr)
3954
{
3955
    uint8_t val;
3956
    cpu_physical_memory_read(addr, &val, 1);
3957
    return val;
3958
}
3959

    
3960
/* warning: addr must be aligned */
3961
static inline uint32_t lduw_phys_internal(target_phys_addr_t addr,
3962
                                          enum device_endian endian)
3963
{
3964
    int io_index;
3965
    uint8_t *ptr;
3966
    uint64_t val;
3967
    unsigned long pd;
3968
    PhysPageDesc p;
3969

    
3970
    p = phys_page_find(addr >> TARGET_PAGE_BITS);
3971
    pd = p.phys_offset;
3972

    
3973
    if (!is_ram_rom_romd(pd)) {
3974
        /* I/O case */
3975
        io_index = pd & (IO_MEM_NB_ENTRIES - 1);
3976
        addr = (addr & ~TARGET_PAGE_MASK) + p.region_offset;
3977
        val = io_mem_read(io_index, addr, 2);
3978
#if defined(TARGET_WORDS_BIGENDIAN)
3979
        if (endian == DEVICE_LITTLE_ENDIAN) {
3980
            val = bswap16(val);
3981
        }
3982
#else
3983
        if (endian == DEVICE_BIG_ENDIAN) {
3984
            val = bswap16(val);
3985
        }
3986
#endif
3987
    } else {
3988
        /* RAM case */
3989
        ptr = qemu_get_ram_ptr(pd & TARGET_PAGE_MASK) +
3990
            (addr & ~TARGET_PAGE_MASK);
3991
        switch (endian) {
3992
        case DEVICE_LITTLE_ENDIAN:
3993
            val = lduw_le_p(ptr);
3994
            break;
3995
        case DEVICE_BIG_ENDIAN:
3996
            val = lduw_be_p(ptr);
3997
            break;
3998
        default:
3999
            val = lduw_p(ptr);
4000
            break;
4001
        }
4002
    }
4003
    return val;
4004
}
4005

    
4006
uint32_t lduw_phys(target_phys_addr_t addr)
4007
{
4008
    return lduw_phys_internal(addr, DEVICE_NATIVE_ENDIAN);
4009
}
4010

    
4011
uint32_t lduw_le_phys(target_phys_addr_t addr)
4012
{
4013
    return lduw_phys_internal(addr, DEVICE_LITTLE_ENDIAN);
4014
}
4015

    
4016
uint32_t lduw_be_phys(target_phys_addr_t addr)
4017
{
4018
    return lduw_phys_internal(addr, DEVICE_BIG_ENDIAN);
4019
}
4020

    
4021
/* warning: addr must be aligned. The ram page is not masked as dirty
4022
   and the code inside is not invalidated. It is useful if the dirty
4023
   bits are used to track modified PTEs */
4024
void stl_phys_notdirty(target_phys_addr_t addr, uint32_t val)
4025
{
4026
    int io_index;
4027
    uint8_t *ptr;
4028
    unsigned long pd;
4029
    PhysPageDesc p;
4030

    
4031
    p = phys_page_find(addr >> TARGET_PAGE_BITS);
4032
    pd = p.phys_offset;
4033

    
4034
    if ((pd & ~TARGET_PAGE_MASK) != io_mem_ram.ram_addr) {
4035
        io_index = pd & (IO_MEM_NB_ENTRIES - 1);
4036
        addr = (addr & ~TARGET_PAGE_MASK) + p.region_offset;
4037
        io_mem_write(io_index, addr, val, 4);
4038
    } else {
4039
        unsigned long addr1 = (pd & TARGET_PAGE_MASK) + (addr & ~TARGET_PAGE_MASK);
4040
        ptr = qemu_get_ram_ptr(addr1);
4041
        stl_p(ptr, val);
4042

    
4043
        if (unlikely(in_migration)) {
4044
            if (!cpu_physical_memory_is_dirty(addr1)) {
4045
                /* invalidate code */
4046
                tb_invalidate_phys_page_range(addr1, addr1 + 4, 0);
4047
                /* set dirty bit */
4048
                cpu_physical_memory_set_dirty_flags(
4049
                    addr1, (0xff & ~CODE_DIRTY_FLAG));
4050
            }
4051
        }
4052
    }
4053
}
4054

    
4055
void stq_phys_notdirty(target_phys_addr_t addr, uint64_t val)
4056
{
4057
    int io_index;
4058
    uint8_t *ptr;
4059
    unsigned long pd;
4060
    PhysPageDesc p;
4061

    
4062
    p = phys_page_find(addr >> TARGET_PAGE_BITS);
4063
    pd = p.phys_offset;
4064

    
4065
    if ((pd & ~TARGET_PAGE_MASK) != io_mem_ram.ram_addr) {
4066
        io_index = pd & (IO_MEM_NB_ENTRIES - 1);
4067
        addr = (addr & ~TARGET_PAGE_MASK) + p.region_offset;
4068
#ifdef TARGET_WORDS_BIGENDIAN
4069
        io_mem_write(io_index, addr, val >> 32, 4);
4070
        io_mem_write(io_index, addr + 4, (uint32_t)val, 4);
4071
#else
4072
        io_mem_write(io_index, addr, (uint32_t)val, 4);
4073
        io_mem_write(io_index, addr + 4, val >> 32, 4);
4074
#endif
4075
    } else {
4076
        ptr = qemu_get_ram_ptr(pd & TARGET_PAGE_MASK) +
4077
            (addr & ~TARGET_PAGE_MASK);
4078
        stq_p(ptr, val);
4079
    }
4080
}
4081

    
4082
/* warning: addr must be aligned */
4083
static inline void stl_phys_internal(target_phys_addr_t addr, uint32_t val,
4084
                                     enum device_endian endian)
4085
{
4086
    int io_index;
4087
    uint8_t *ptr;
4088
    unsigned long pd;
4089
    PhysPageDesc p;
4090

    
4091
    p = phys_page_find(addr >> TARGET_PAGE_BITS);
4092
    pd = p.phys_offset;
4093

    
4094
    if ((pd & ~TARGET_PAGE_MASK) != io_mem_ram.ram_addr) {
4095
        io_index = pd & (IO_MEM_NB_ENTRIES - 1);
4096
        addr = (addr & ~TARGET_PAGE_MASK) + p.region_offset;
4097
#if defined(TARGET_WORDS_BIGENDIAN)
4098
        if (endian == DEVICE_LITTLE_ENDIAN) {
4099
            val = bswap32(val);
4100
        }
4101
#else
4102
        if (endian == DEVICE_BIG_ENDIAN) {
4103
            val = bswap32(val);
4104
        }
4105
#endif
4106
        io_mem_write(io_index, addr, val, 4);
4107
    } else {
4108
        unsigned long addr1;
4109
        addr1 = (pd & TARGET_PAGE_MASK) + (addr & ~TARGET_PAGE_MASK);
4110
        /* RAM case */
4111
        ptr = qemu_get_ram_ptr(addr1);
4112
        switch (endian) {
4113
        case DEVICE_LITTLE_ENDIAN:
4114
            stl_le_p(ptr, val);
4115
            break;
4116
        case DEVICE_BIG_ENDIAN:
4117
            stl_be_p(ptr, val);
4118
            break;
4119
        default:
4120
            stl_p(ptr, val);
4121
            break;
4122
        }
4123
        if (!cpu_physical_memory_is_dirty(addr1)) {
4124
            /* invalidate code */
4125
            tb_invalidate_phys_page_range(addr1, addr1 + 4, 0);
4126
            /* set dirty bit */
4127
            cpu_physical_memory_set_dirty_flags(addr1,
4128
                (0xff & ~CODE_DIRTY_FLAG));
4129
        }
4130
    }
4131
}
4132

    
4133
void stl_phys(target_phys_addr_t addr, uint32_t val)
4134
{
4135
    stl_phys_internal(addr, val, DEVICE_NATIVE_ENDIAN);
4136
}
4137

    
4138
void stl_le_phys(target_phys_addr_t addr, uint32_t val)
4139
{
4140
    stl_phys_internal(addr, val, DEVICE_LITTLE_ENDIAN);
4141
}
4142

    
4143
void stl_be_phys(target_phys_addr_t addr, uint32_t val)
4144
{
4145
    stl_phys_internal(addr, val, DEVICE_BIG_ENDIAN);
4146
}
4147

    
4148
/* XXX: optimize */
4149
void stb_phys(target_phys_addr_t addr, uint32_t val)
4150
{
4151
    uint8_t v = val;
4152
    cpu_physical_memory_write(addr, &v, 1);
4153
}
4154

    
4155
/* warning: addr must be aligned */
4156
static inline void stw_phys_internal(target_phys_addr_t addr, uint32_t val,
4157
                                     enum device_endian endian)
4158
{
4159
    int io_index;
4160
    uint8_t *ptr;
4161
    unsigned long pd;
4162
    PhysPageDesc p;
4163

    
4164
    p = phys_page_find(addr >> TARGET_PAGE_BITS);
4165
    pd = p.phys_offset;
4166

    
4167
    if ((pd & ~TARGET_PAGE_MASK) != io_mem_ram.ram_addr) {
4168
        io_index = pd & (IO_MEM_NB_ENTRIES - 1);
4169
        addr = (addr & ~TARGET_PAGE_MASK) + p.region_offset;
4170
#if defined(TARGET_WORDS_BIGENDIAN)
4171
        if (endian == DEVICE_LITTLE_ENDIAN) {
4172
            val = bswap16(val);
4173
        }
4174
#else
4175
        if (endian == DEVICE_BIG_ENDIAN) {
4176
            val = bswap16(val);
4177
        }
4178
#endif
4179
        io_mem_write(io_index, addr, val, 2);
4180
    } else {
4181
        unsigned long addr1;
4182
        addr1 = (pd & TARGET_PAGE_MASK) + (addr & ~TARGET_PAGE_MASK);
4183
        /* RAM case */
4184
        ptr = qemu_get_ram_ptr(addr1);
4185
        switch (endian) {
4186
        case DEVICE_LITTLE_ENDIAN:
4187
            stw_le_p(ptr, val);
4188
            break;
4189
        case DEVICE_BIG_ENDIAN:
4190
            stw_be_p(ptr, val);
4191
            break;
4192
        default:
4193
            stw_p(ptr, val);
4194
            break;
4195
        }
4196
        if (!cpu_physical_memory_is_dirty(addr1)) {
4197
            /* invalidate code */
4198
            tb_invalidate_phys_page_range(addr1, addr1 + 2, 0);
4199
            /* set dirty bit */
4200
            cpu_physical_memory_set_dirty_flags(addr1,
4201
                (0xff & ~CODE_DIRTY_FLAG));
4202
        }
4203
    }
4204
}
4205

    
4206
void stw_phys(target_phys_addr_t addr, uint32_t val)
4207
{
4208
    stw_phys_internal(addr, val, DEVICE_NATIVE_ENDIAN);
4209
}
4210

    
4211
void stw_le_phys(target_phys_addr_t addr, uint32_t val)
4212
{
4213
    stw_phys_internal(addr, val, DEVICE_LITTLE_ENDIAN);
4214
}
4215

    
4216
void stw_be_phys(target_phys_addr_t addr, uint32_t val)
4217
{
4218
    stw_phys_internal(addr, val, DEVICE_BIG_ENDIAN);
4219
}
4220

    
4221
/* XXX: optimize */
4222
void stq_phys(target_phys_addr_t addr, uint64_t val)
4223
{
4224
    val = tswap64(val);
4225
    cpu_physical_memory_write(addr, &val, 8);
4226
}
4227

    
4228
void stq_le_phys(target_phys_addr_t addr, uint64_t val)
4229
{
4230
    val = cpu_to_le64(val);
4231
    cpu_physical_memory_write(addr, &val, 8);
4232
}
4233

    
4234
void stq_be_phys(target_phys_addr_t addr, uint64_t val)
4235
{
4236
    val = cpu_to_be64(val);
4237
    cpu_physical_memory_write(addr, &val, 8);
4238
}
4239

    
4240
/* virtual memory access for debug (includes writing to ROM) */
4241
int cpu_memory_rw_debug(CPUState *env, target_ulong addr,
4242
                        uint8_t *buf, int len, int is_write)
4243
{
4244
    int l;
4245
    target_phys_addr_t phys_addr;
4246
    target_ulong page;
4247

    
4248
    while (len > 0) {
4249
        page = addr & TARGET_PAGE_MASK;
4250
        phys_addr = cpu_get_phys_page_debug(env, page);
4251
        /* if no physical page mapped, return an error */
4252
        if (phys_addr == -1)
4253
            return -1;
4254
        l = (page + TARGET_PAGE_SIZE) - addr;
4255
        if (l > len)
4256
            l = len;
4257
        phys_addr += (addr & ~TARGET_PAGE_MASK);
4258
        if (is_write)
4259
            cpu_physical_memory_write_rom(phys_addr, buf, l);
4260
        else
4261
            cpu_physical_memory_rw(phys_addr, buf, l, is_write);
4262
        len -= l;
4263
        buf += l;
4264
        addr += l;
4265
    }
4266
    return 0;
4267
}
4268
#endif
4269

    
4270
/* in deterministic execution mode, instructions doing device I/Os
4271
   must be at the end of the TB */
4272
void cpu_io_recompile(CPUState *env, void *retaddr)
4273
{
4274
    TranslationBlock *tb;
4275
    uint32_t n, cflags;
4276
    target_ulong pc, cs_base;
4277
    uint64_t flags;
4278

    
4279
    tb = tb_find_pc((unsigned long)retaddr);
4280
    if (!tb) {
4281
        cpu_abort(env, "cpu_io_recompile: could not find TB for pc=%p", 
4282
                  retaddr);
4283
    }
4284
    n = env->icount_decr.u16.low + tb->icount;
4285
    cpu_restore_state(tb, env, (unsigned long)retaddr);
4286
    /* Calculate how many instructions had been executed before the fault
4287
       occurred.  */
4288
    n = n - env->icount_decr.u16.low;
4289
    /* Generate a new TB ending on the I/O insn.  */
4290
    n++;
4291
    /* On MIPS and SH, delay slot instructions can only be restarted if
4292
       they were already the first instruction in the TB.  If this is not
4293
       the first instruction in a TB then re-execute the preceding
4294
       branch.  */
4295
#if defined(TARGET_MIPS)
4296
    if ((env->hflags & MIPS_HFLAG_BMASK) != 0 && n > 1) {
4297
        env->active_tc.PC -= 4;
4298
        env->icount_decr.u16.low++;
4299
        env->hflags &= ~MIPS_HFLAG_BMASK;
4300
    }
4301
#elif defined(TARGET_SH4)
4302
    if ((env->flags & ((DELAY_SLOT | DELAY_SLOT_CONDITIONAL))) != 0
4303
            && n > 1) {
4304
        env->pc -= 2;
4305
        env->icount_decr.u16.low++;
4306
        env->flags &= ~(DELAY_SLOT | DELAY_SLOT_CONDITIONAL);
4307
    }
4308
#endif
4309
    /* This should never happen.  */
4310
    if (n > CF_COUNT_MASK)
4311
        cpu_abort(env, "TB too big during recompile");
4312

    
4313
    cflags = n | CF_LAST_IO;
4314
    pc = tb->pc;
4315
    cs_base = tb->cs_base;
4316
    flags = tb->flags;
4317
    tb_phys_invalidate(tb, -1);
4318
    /* FIXME: In theory this could raise an exception.  In practice
4319
       we have already translated the block once so it's probably ok.  */
4320
    tb_gen_code(env, pc, cs_base, flags, cflags);
4321
    /* TODO: If env->pc != tb->pc (i.e. the faulting instruction was not
4322
       the first in the TB) then we end up generating a whole new TB and
4323
       repeating the fault, which is horribly inefficient.
4324
       Better would be to execute just this insn uncached, or generate a
4325
       second new TB.  */
4326
    cpu_resume_from_signal(env, NULL);
4327
}
4328

    
4329
#if !defined(CONFIG_USER_ONLY)
4330

    
4331
void dump_exec_info(FILE *f, fprintf_function cpu_fprintf)
4332
{
4333
    int i, target_code_size, max_target_code_size;
4334
    int direct_jmp_count, direct_jmp2_count, cross_page;
4335
    TranslationBlock *tb;
4336

    
4337
    target_code_size = 0;
4338
    max_target_code_size = 0;
4339
    cross_page = 0;
4340
    direct_jmp_count = 0;
4341
    direct_jmp2_count = 0;
4342
    for(i = 0; i < nb_tbs; i++) {
4343
        tb = &tbs[i];
4344
        target_code_size += tb->size;
4345
        if (tb->size > max_target_code_size)
4346
            max_target_code_size = tb->size;
4347
        if (tb->page_addr[1] != -1)
4348
            cross_page++;
4349
        if (tb->tb_next_offset[0] != 0xffff) {
4350
            direct_jmp_count++;
4351
            if (tb->tb_next_offset[1] != 0xffff) {
4352
                direct_jmp2_count++;
4353
            }
4354
        }
4355
    }
4356
    /* XXX: avoid using doubles ? */
4357
    cpu_fprintf(f, "Translation buffer state:\n");
4358
    cpu_fprintf(f, "gen code size       %td/%ld\n",
4359
                code_gen_ptr - code_gen_buffer, code_gen_buffer_max_size);
4360
    cpu_fprintf(f, "TB count            %d/%d\n", 
4361
                nb_tbs, code_gen_max_blocks);
4362
    cpu_fprintf(f, "TB avg target size  %d max=%d bytes\n",
4363
                nb_tbs ? target_code_size / nb_tbs : 0,
4364
                max_target_code_size);
4365
    cpu_fprintf(f, "TB avg host size    %td bytes (expansion ratio: %0.1f)\n",
4366
                nb_tbs ? (code_gen_ptr - code_gen_buffer) / nb_tbs : 0,
4367
                target_code_size ? (double) (code_gen_ptr - code_gen_buffer) / target_code_size : 0);
4368
    cpu_fprintf(f, "cross page TB count %d (%d%%)\n",
4369
            cross_page,
4370
            nb_tbs ? (cross_page * 100) / nb_tbs : 0);
4371
    cpu_fprintf(f, "direct jump count   %d (%d%%) (2 jumps=%d %d%%)\n",
4372
                direct_jmp_count,
4373
                nb_tbs ? (direct_jmp_count * 100) / nb_tbs : 0,
4374
                direct_jmp2_count,
4375
                nb_tbs ? (direct_jmp2_count * 100) / nb_tbs : 0);
4376
    cpu_fprintf(f, "\nStatistics:\n");
4377
    cpu_fprintf(f, "TB flush count      %d\n", tb_flush_count);
4378
    cpu_fprintf(f, "TB invalidate count %d\n", tb_phys_invalidate_count);
4379
    cpu_fprintf(f, "TLB flush count     %d\n", tlb_flush_count);
4380
    tcg_dump_info(f, cpu_fprintf);
4381
}
4382

    
4383
/* NOTE: this function can trigger an exception */
4384
/* NOTE2: the returned address is not exactly the physical address: it
4385
   is the offset relative to phys_ram_base */
4386
tb_page_addr_t get_page_addr_code(CPUState *env1, target_ulong addr)
4387
{
4388
    int mmu_idx, page_index, pd;
4389
    void *p;
4390

    
4391
    page_index = (addr >> TARGET_PAGE_BITS) & (CPU_TLB_SIZE - 1);
4392
    mmu_idx = cpu_mmu_index(env1);
4393
    if (unlikely(env1->tlb_table[mmu_idx][page_index].addr_code !=
4394
                 (addr & TARGET_PAGE_MASK))) {
4395
        ldub_code(addr);
4396
    }
4397
    pd = env1->tlb_table[mmu_idx][page_index].addr_code & ~TARGET_PAGE_MASK;
4398
    if (pd != io_mem_ram.ram_addr && pd != io_mem_rom.ram_addr
4399
        && !is_romd(pd)) {
4400
#if defined(TARGET_ALPHA) || defined(TARGET_MIPS) || defined(TARGET_SPARC)
4401
        cpu_unassigned_access(env1, addr, 0, 1, 0, 4);
4402
#else
4403
        cpu_abort(env1, "Trying to execute code outside RAM or ROM at 0x" TARGET_FMT_lx "\n", addr);
4404
#endif
4405
    }
4406
    p = (void *)((uintptr_t)addr + env1->tlb_table[mmu_idx][page_index].addend);
4407
    return qemu_ram_addr_from_host_nofail(p);
4408
}
4409

    
4410
/*
4411
 * A helper function for the _utterly broken_ virtio device model to find out if
4412
 * it's running on a big endian machine. Don't do this at home kids!
4413
 */
4414
bool virtio_is_big_endian(void);
4415
bool virtio_is_big_endian(void)
4416
{
4417
#if defined(TARGET_WORDS_BIGENDIAN)
4418
    return true;
4419
#else
4420
    return false;
4421
#endif
4422
}
4423

    
4424
#define MMUSUFFIX _cmmu
4425
#undef GETPC
4426
#define GETPC() NULL
4427
#define env cpu_single_env
4428
#define SOFTMMU_CODE_ACCESS
4429

    
4430
#define SHIFT 0
4431
#include "softmmu_template.h"
4432

    
4433
#define SHIFT 1
4434
#include "softmmu_template.h"
4435

    
4436
#define SHIFT 2
4437
#include "softmmu_template.h"
4438

    
4439
#define SHIFT 3
4440
#include "softmmu_template.h"
4441

    
4442
#undef env
4443

    
4444
#endif