Statistics
| Branch: | Revision:

root / exec.c @ 9bf0960a

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

    
58
//#define DEBUG_TB_INVALIDATE
59
//#define DEBUG_FLUSH
60
//#define DEBUG_TLB
61
//#define DEBUG_UNASSIGNED
62

    
63
/* make various TB consistency checks */
64
//#define DEBUG_TB_CHECK
65
//#define DEBUG_TLB_CHECK
66

    
67
//#define DEBUG_IOPORT
68
//#define DEBUG_SUBPAGE
69

    
70
#if !defined(CONFIG_USER_ONLY)
71
/* TB consistency checks only implemented for usermode emulation.  */
72
#undef DEBUG_TB_CHECK
73
#endif
74

    
75
#define SMC_BITMAP_USE_THRESHOLD 10
76

    
77
static TranslationBlock *tbs;
78
static int code_gen_max_blocks;
79
TranslationBlock *tb_phys_hash[CODE_GEN_PHYS_HASH_SIZE];
80
static int nb_tbs;
81
/* any access to the tbs or the page table must use this lock */
82
spinlock_t tb_lock = SPIN_LOCK_UNLOCKED;
83

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

    
100
uint8_t code_gen_prologue[1024] code_gen_section;
101
static uint8_t *code_gen_buffer;
102
static unsigned long code_gen_buffer_size;
103
/* threshold to flush the translated code buffer */
104
static unsigned long code_gen_buffer_max_size;
105
static uint8_t *code_gen_ptr;
106

    
107
#if !defined(CONFIG_USER_ONLY)
108
int phys_ram_fd;
109
static int in_migration;
110

    
111
RAMList ram_list = { .blocks = QLIST_HEAD_INITIALIZER(ram_list) };
112
#endif
113

    
114
CPUState *first_cpu;
115
/* current CPU in the current thread. It is only valid inside
116
   cpu_exec() */
117
CPUState *cpu_single_env;
118
/* 0 = Do not count executed instructions.
119
   1 = Precise instruction counting.
120
   2 = Adaptive rate instruction counting.  */
121
int use_icount = 0;
122
/* Current instruction counter.  While executing translated code this may
123
   include some instructions that have not yet been executed.  */
124
int64_t qemu_icount;
125

    
126
typedef struct PageDesc {
127
    /* list of TBs intersecting this ram page */
128
    TranslationBlock *first_tb;
129
    /* in order to optimize self modifying code, we count the number
130
       of lookups we do to a given page to use a bitmap */
131
    unsigned int code_write_count;
132
    uint8_t *code_bitmap;
133
#if defined(CONFIG_USER_ONLY)
134
    unsigned long flags;
135
#endif
136
} PageDesc;
137

    
138
/* In system mode we want L1_MAP to be based on ram offsets,
139
   while in user mode we want it to be based on virtual addresses.  */
140
#if !defined(CONFIG_USER_ONLY)
141
#if HOST_LONG_BITS < TARGET_PHYS_ADDR_SPACE_BITS
142
# define L1_MAP_ADDR_SPACE_BITS  HOST_LONG_BITS
143
#else
144
# define L1_MAP_ADDR_SPACE_BITS  TARGET_PHYS_ADDR_SPACE_BITS
145
#endif
146
#else
147
# define L1_MAP_ADDR_SPACE_BITS  TARGET_VIRT_ADDR_SPACE_BITS
148
#endif
149

    
150
/* Size of the L2 (and L3, etc) page tables.  */
151
#define L2_BITS 10
152
#define L2_SIZE (1 << L2_BITS)
153

    
154
/* The bits remaining after N lower levels of page tables.  */
155
#define P_L1_BITS_REM \
156
    ((TARGET_PHYS_ADDR_SPACE_BITS - TARGET_PAGE_BITS) % L2_BITS)
157
#define V_L1_BITS_REM \
158
    ((L1_MAP_ADDR_SPACE_BITS - TARGET_PAGE_BITS) % L2_BITS)
159

    
160
/* Size of the L1 page table.  Avoid silly small sizes.  */
161
#if P_L1_BITS_REM < 4
162
#define P_L1_BITS  (P_L1_BITS_REM + L2_BITS)
163
#else
164
#define P_L1_BITS  P_L1_BITS_REM
165
#endif
166

    
167
#if V_L1_BITS_REM < 4
168
#define V_L1_BITS  (V_L1_BITS_REM + L2_BITS)
169
#else
170
#define V_L1_BITS  V_L1_BITS_REM
171
#endif
172

    
173
#define P_L1_SIZE  ((target_phys_addr_t)1 << P_L1_BITS)
174
#define V_L1_SIZE  ((target_ulong)1 << V_L1_BITS)
175

    
176
#define P_L1_SHIFT (TARGET_PHYS_ADDR_SPACE_BITS - TARGET_PAGE_BITS - P_L1_BITS)
177
#define V_L1_SHIFT (L1_MAP_ADDR_SPACE_BITS - TARGET_PAGE_BITS - V_L1_BITS)
178

    
179
unsigned long qemu_real_host_page_size;
180
unsigned long qemu_host_page_bits;
181
unsigned long qemu_host_page_size;
182
unsigned long qemu_host_page_mask;
183

    
184
/* This is a multi-level map on the virtual address space.
185
   The bottom level has pointers to PageDesc.  */
186
static void *l1_map[V_L1_SIZE];
187

    
188
#if !defined(CONFIG_USER_ONLY)
189
typedef struct PhysPageDesc {
190
    /* offset in host memory of the page + io_index in the low bits */
191
    ram_addr_t phys_offset;
192
    ram_addr_t region_offset;
193
} PhysPageDesc;
194

    
195
/* This is a multi-level map on the physical address space.
196
   The bottom level has pointers to PhysPageDesc.  */
197
static void *l1_phys_map[P_L1_SIZE];
198

    
199
static void io_mem_init(void);
200

    
201
/* io memory support */
202
CPUWriteMemoryFunc *io_mem_write[IO_MEM_NB_ENTRIES][4];
203
CPUReadMemoryFunc *io_mem_read[IO_MEM_NB_ENTRIES][4];
204
void *io_mem_opaque[IO_MEM_NB_ENTRIES];
205
static char io_mem_used[IO_MEM_NB_ENTRIES];
206
static int io_mem_watch;
207
#endif
208

    
209
/* log support */
210
#ifdef WIN32
211
static const char *logfilename = "qemu.log";
212
#else
213
static const char *logfilename = "/tmp/qemu.log";
214
#endif
215
FILE *logfile;
216
int loglevel;
217
static int log_append = 0;
218

    
219
/* statistics */
220
#if !defined(CONFIG_USER_ONLY)
221
static int tlb_flush_count;
222
#endif
223
static int tb_flush_count;
224
static int tb_phys_invalidate_count;
225

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

    
252
static void page_init(void)
253
{
254
    /* NOTE: we can always suppose that qemu_host_page_size >=
255
       TARGET_PAGE_SIZE */
256
#ifdef _WIN32
257
    {
258
        SYSTEM_INFO system_info;
259

    
260
        GetSystemInfo(&system_info);
261
        qemu_real_host_page_size = system_info.dwPageSize;
262
    }
263
#else
264
    qemu_real_host_page_size = getpagesize();
265
#endif
266
    if (qemu_host_page_size == 0)
267
        qemu_host_page_size = qemu_real_host_page_size;
268
    if (qemu_host_page_size < TARGET_PAGE_SIZE)
269
        qemu_host_page_size = TARGET_PAGE_SIZE;
270
    qemu_host_page_bits = 0;
271
    while ((1 << qemu_host_page_bits) < qemu_host_page_size)
272
        qemu_host_page_bits++;
273
    qemu_host_page_mask = ~(qemu_host_page_size - 1);
274

    
275
#if defined(CONFIG_BSD) && defined(CONFIG_USER_ONLY)
276
    {
277
#ifdef HAVE_KINFO_GETVMMAP
278
        struct kinfo_vmentry *freep;
279
        int i, cnt;
280

    
281
        freep = kinfo_getvmmap(getpid(), &cnt);
282
        if (freep) {
283
            mmap_lock();
284
            for (i = 0; i < cnt; i++) {
285
                unsigned long startaddr, endaddr;
286

    
287
                startaddr = freep[i].kve_start;
288
                endaddr = freep[i].kve_end;
289
                if (h2g_valid(startaddr)) {
290
                    startaddr = h2g(startaddr) & TARGET_PAGE_MASK;
291

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

    
309
        last_brk = (unsigned long)sbrk(0);
310

    
311
        f = fopen("/compat/linux/proc/self/maps", "r");
312
        if (f) {
313
            mmap_lock();
314

    
315
            do {
316
                unsigned long startaddr, endaddr;
317
                int n;
318

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

    
321
                if (n == 2 && h2g_valid(startaddr)) {
322
                    startaddr = h2g(startaddr) & TARGET_PAGE_MASK;
323

    
324
                    if (h2g_valid(endaddr)) {
325
                        endaddr = h2g(endaddr);
326
                    } else {
327
                        endaddr = ~0ul;
328
                    }
329
                    page_set_flags(startaddr, endaddr, PAGE_RESERVED);
330
                }
331
            } while (!feof(f));
332

    
333
            fclose(f);
334
            mmap_unlock();
335
        }
336
#endif
337
    }
338
#endif
339
}
340

    
341
static PageDesc *page_find_alloc(tb_page_addr_t index, int alloc)
342
{
343
    PageDesc *pd;
344
    void **lp;
345
    int i;
346

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

    
359
    /* Level 1.  Always allocated.  */
360
    lp = l1_map + ((index >> V_L1_SHIFT) & (V_L1_SIZE - 1));
361

    
362
    /* Level 2..N-1.  */
363
    for (i = V_L1_SHIFT / L2_BITS - 1; i > 0; i--) {
364
        void **p = *lp;
365

    
366
        if (p == NULL) {
367
            if (!alloc) {
368
                return NULL;
369
            }
370
            ALLOC(p, sizeof(void *) * L2_SIZE);
371
            *lp = p;
372
        }
373

    
374
        lp = p + ((index >> (i * L2_BITS)) & (L2_SIZE - 1));
375
    }
376

    
377
    pd = *lp;
378
    if (pd == NULL) {
379
        if (!alloc) {
380
            return NULL;
381
        }
382
        ALLOC(pd, sizeof(PageDesc) * L2_SIZE);
383
        *lp = pd;
384
    }
385

    
386
#undef ALLOC
387

    
388
    return pd + (index & (L2_SIZE - 1));
389
}
390

    
391
static inline PageDesc *page_find(tb_page_addr_t index)
392
{
393
    return page_find_alloc(index, 0);
394
}
395

    
396
#if !defined(CONFIG_USER_ONLY)
397
static PhysPageDesc *phys_page_find_alloc(target_phys_addr_t index, int alloc)
398
{
399
    PhysPageDesc *pd;
400
    void **lp;
401
    int i;
402

    
403
    /* Level 1.  Always allocated.  */
404
    lp = l1_phys_map + ((index >> P_L1_SHIFT) & (P_L1_SIZE - 1));
405

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

    
418
    pd = *lp;
419
    if (pd == NULL) {
420
        int i;
421

    
422
        if (!alloc) {
423
            return NULL;
424
        }
425

    
426
        *lp = pd = qemu_malloc(sizeof(PhysPageDesc) * L2_SIZE);
427

    
428
        for (i = 0; i < L2_SIZE; i++) {
429
            pd[i].phys_offset = IO_MEM_UNASSIGNED;
430
            pd[i].region_offset = (index + i) << TARGET_PAGE_BITS;
431
        }
432
    }
433

    
434
    return pd + (index & (L2_SIZE - 1));
435
}
436

    
437
static inline PhysPageDesc *phys_page_find(target_phys_addr_t index)
438
{
439
    return phys_page_find_alloc(index, 0);
440
}
441

    
442
static void tlb_protect_code(ram_addr_t ram_addr);
443
static void tlb_unprotect_code_phys(CPUState *env, ram_addr_t ram_addr,
444
                                    target_ulong vaddr);
445
#define mmap_lock() do { } while(0)
446
#define mmap_unlock() do { } while(0)
447
#endif
448

    
449
#define DEFAULT_CODE_GEN_BUFFER_SIZE (32 * 1024 * 1024)
450

    
451
#if defined(CONFIG_USER_ONLY)
452
/* Currently it is not recommended to allocate big chunks of data in
453
   user mode. It will change when a dedicated libc will be used */
454
#define USE_STATIC_CODE_GEN_BUFFER
455
#endif
456

    
457
#ifdef USE_STATIC_CODE_GEN_BUFFER
458
static uint8_t static_code_gen_buffer[DEFAULT_CODE_GEN_BUFFER_SIZE]
459
               __attribute__((aligned (CODE_GEN_ALIGN)));
460
#endif
461

    
462
static void code_gen_alloc(unsigned long tb_size)
463
{
464
#ifdef USE_STATIC_CODE_GEN_BUFFER
465
    code_gen_buffer = static_code_gen_buffer;
466
    code_gen_buffer_size = DEFAULT_CODE_GEN_BUFFER_SIZE;
467
    map_exec(code_gen_buffer, code_gen_buffer_size);
468
#else
469
    code_gen_buffer_size = tb_size;
470
    if (code_gen_buffer_size == 0) {
471
#if defined(CONFIG_USER_ONLY)
472
        /* in user mode, phys_ram_size is not meaningful */
473
        code_gen_buffer_size = DEFAULT_CODE_GEN_BUFFER_SIZE;
474
#else
475
        /* XXX: needs adjustments */
476
        code_gen_buffer_size = (unsigned long)(ram_size / 4);
477
#endif
478
    }
479
    if (code_gen_buffer_size < MIN_CODE_GEN_BUFFER_SIZE)
480
        code_gen_buffer_size = MIN_CODE_GEN_BUFFER_SIZE;
481
    /* The code gen buffer location may have constraints depending on
482
       the host cpu and OS */
483
#if defined(__linux__) 
484
    {
485
        int flags;
486
        void *start = NULL;
487

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

    
564
/* Must be called before using the QEMU cpus. 'tb_size' is the size
565
   (in bytes) allocated to the translation buffer. Zero means default
566
   size. */
567
void cpu_exec_init_all(unsigned long tb_size)
568
{
569
    cpu_gen_init();
570
    code_gen_alloc(tb_size);
571
    code_gen_ptr = code_gen_buffer;
572
    page_init();
573
#if !defined(CONFIG_USER_ONLY)
574
    io_mem_init();
575
#endif
576
#if !defined(CONFIG_USER_ONLY) || !defined(CONFIG_USE_GUEST_BASE)
577
    /* There's no guest base to take into account, so go ahead and
578
       initialize the prologue now.  */
579
    tcg_prologue_init(&tcg_ctx);
580
#endif
581
}
582

    
583
#if defined(CPU_SAVE_VERSION) && !defined(CONFIG_USER_ONLY)
584

    
585
static int cpu_common_post_load(void *opaque, int version_id)
586
{
587
    CPUState *env = opaque;
588

    
589
    /* 0x01 was CPU_INTERRUPT_EXIT. This line can be removed when the
590
       version_id is increased. */
591
    env->interrupt_request &= ~0x01;
592
    tlb_flush(env, 1);
593

    
594
    return 0;
595
}
596

    
597
static const VMStateDescription vmstate_cpu_common = {
598
    .name = "cpu_common",
599
    .version_id = 1,
600
    .minimum_version_id = 1,
601
    .minimum_version_id_old = 1,
602
    .post_load = cpu_common_post_load,
603
    .fields      = (VMStateField []) {
604
        VMSTATE_UINT32(halted, CPUState),
605
        VMSTATE_UINT32(interrupt_request, CPUState),
606
        VMSTATE_END_OF_LIST()
607
    }
608
};
609
#endif
610

    
611
CPUState *qemu_get_cpu(int cpu)
612
{
613
    CPUState *env = first_cpu;
614

    
615
    while (env) {
616
        if (env->cpu_index == cpu)
617
            break;
618
        env = env->next_cpu;
619
    }
620

    
621
    return env;
622
}
623

    
624
void cpu_exec_init(CPUState *env)
625
{
626
    CPUState **penv;
627
    int cpu_index;
628

    
629
#if defined(CONFIG_USER_ONLY)
630
    cpu_list_lock();
631
#endif
632
    env->next_cpu = NULL;
633
    penv = &first_cpu;
634
    cpu_index = 0;
635
    while (*penv != NULL) {
636
        penv = &(*penv)->next_cpu;
637
        cpu_index++;
638
    }
639
    env->cpu_index = cpu_index;
640
    env->numa_node = 0;
641
    QTAILQ_INIT(&env->breakpoints);
642
    QTAILQ_INIT(&env->watchpoints);
643
#ifndef CONFIG_USER_ONLY
644
    env->thread_id = qemu_get_thread_id();
645
#endif
646
    *penv = env;
647
#if defined(CONFIG_USER_ONLY)
648
    cpu_list_unlock();
649
#endif
650
#if defined(CPU_SAVE_VERSION) && !defined(CONFIG_USER_ONLY)
651
    vmstate_register(NULL, cpu_index, &vmstate_cpu_common, env);
652
    register_savevm(NULL, "cpu", cpu_index, CPU_SAVE_VERSION,
653
                    cpu_save, cpu_load, env);
654
#endif
655
}
656

    
657
/* Allocate a new translation block. Flush the translation buffer if
658
   too many translation blocks or too much generated code. */
659
static TranslationBlock *tb_alloc(target_ulong pc)
660
{
661
    TranslationBlock *tb;
662

    
663
    if (nb_tbs >= code_gen_max_blocks ||
664
        (code_gen_ptr - code_gen_buffer) >= code_gen_buffer_max_size)
665
        return NULL;
666
    tb = &tbs[nb_tbs++];
667
    tb->pc = pc;
668
    tb->cflags = 0;
669
    return tb;
670
}
671

    
672
void tb_free(TranslationBlock *tb)
673
{
674
    /* In practice this is mostly used for single use temporary TB
675
       Ignore the hard cases and just back up if this TB happens to
676
       be the last one generated.  */
677
    if (nb_tbs > 0 && tb == &tbs[nb_tbs - 1]) {
678
        code_gen_ptr = tb->tc_ptr;
679
        nb_tbs--;
680
    }
681
}
682

    
683
static inline void invalidate_page_bitmap(PageDesc *p)
684
{
685
    if (p->code_bitmap) {
686
        qemu_free(p->code_bitmap);
687
        p->code_bitmap = NULL;
688
    }
689
    p->code_write_count = 0;
690
}
691

    
692
/* Set to NULL all the 'first_tb' fields in all PageDescs. */
693

    
694
static void page_flush_tb_1 (int level, void **lp)
695
{
696
    int i;
697

    
698
    if (*lp == NULL) {
699
        return;
700
    }
701
    if (level == 0) {
702
        PageDesc *pd = *lp;
703
        for (i = 0; i < L2_SIZE; ++i) {
704
            pd[i].first_tb = NULL;
705
            invalidate_page_bitmap(pd + i);
706
        }
707
    } else {
708
        void **pp = *lp;
709
        for (i = 0; i < L2_SIZE; ++i) {
710
            page_flush_tb_1 (level - 1, pp + i);
711
        }
712
    }
713
}
714

    
715
static void page_flush_tb(void)
716
{
717
    int i;
718
    for (i = 0; i < V_L1_SIZE; i++) {
719
        page_flush_tb_1(V_L1_SHIFT / L2_BITS - 1, l1_map + i);
720
    }
721
}
722

    
723
/* flush all the translation blocks */
724
/* XXX: tb_flush is currently not thread safe */
725
void tb_flush(CPUState *env1)
726
{
727
    CPUState *env;
728
#if defined(DEBUG_FLUSH)
729
    printf("qemu: flush code_size=%ld nb_tbs=%d avg_tb_size=%ld\n",
730
           (unsigned long)(code_gen_ptr - code_gen_buffer),
731
           nb_tbs, nb_tbs > 0 ?
732
           ((unsigned long)(code_gen_ptr - code_gen_buffer)) / nb_tbs : 0);
733
#endif
734
    if ((unsigned long)(code_gen_ptr - code_gen_buffer) > code_gen_buffer_size)
735
        cpu_abort(env1, "Internal error: code buffer overflow\n");
736

    
737
    nb_tbs = 0;
738

    
739
    for(env = first_cpu; env != NULL; env = env->next_cpu) {
740
        memset (env->tb_jmp_cache, 0, TB_JMP_CACHE_SIZE * sizeof (void *));
741
    }
742

    
743
    memset (tb_phys_hash, 0, CODE_GEN_PHYS_HASH_SIZE * sizeof (void *));
744
    page_flush_tb();
745

    
746
    code_gen_ptr = code_gen_buffer;
747
    /* XXX: flush processor icache at this point if cache flush is
748
       expensive */
749
    tb_flush_count++;
750
}
751

    
752
#ifdef DEBUG_TB_CHECK
753

    
754
static void tb_invalidate_check(target_ulong address)
755
{
756
    TranslationBlock *tb;
757
    int i;
758
    address &= TARGET_PAGE_MASK;
759
    for(i = 0;i < CODE_GEN_PHYS_HASH_SIZE; i++) {
760
        for(tb = tb_phys_hash[i]; tb != NULL; tb = tb->phys_hash_next) {
761
            if (!(address + TARGET_PAGE_SIZE <= tb->pc ||
762
                  address >= tb->pc + tb->size)) {
763
                printf("ERROR invalidate: address=" TARGET_FMT_lx
764
                       " PC=%08lx size=%04x\n",
765
                       address, (long)tb->pc, tb->size);
766
            }
767
        }
768
    }
769
}
770

    
771
/* verify that all the pages have correct rights for code */
772
static void tb_page_check(void)
773
{
774
    TranslationBlock *tb;
775
    int i, flags1, flags2;
776

    
777
    for(i = 0;i < CODE_GEN_PHYS_HASH_SIZE; i++) {
778
        for(tb = tb_phys_hash[i]; tb != NULL; tb = tb->phys_hash_next) {
779
            flags1 = page_get_flags(tb->pc);
780
            flags2 = page_get_flags(tb->pc + tb->size - 1);
781
            if ((flags1 & PAGE_WRITE) || (flags2 & PAGE_WRITE)) {
782
                printf("ERROR page flags: PC=%08lx size=%04x f1=%x f2=%x\n",
783
                       (long)tb->pc, tb->size, flags1, flags2);
784
            }
785
        }
786
    }
787
}
788

    
789
#endif
790

    
791
/* invalidate one TB */
792
static inline void tb_remove(TranslationBlock **ptb, TranslationBlock *tb,
793
                             int next_offset)
794
{
795
    TranslationBlock *tb1;
796
    for(;;) {
797
        tb1 = *ptb;
798
        if (tb1 == tb) {
799
            *ptb = *(TranslationBlock **)((char *)tb1 + next_offset);
800
            break;
801
        }
802
        ptb = (TranslationBlock **)((char *)tb1 + next_offset);
803
    }
804
}
805

    
806
static inline void tb_page_remove(TranslationBlock **ptb, TranslationBlock *tb)
807
{
808
    TranslationBlock *tb1;
809
    unsigned int n1;
810

    
811
    for(;;) {
812
        tb1 = *ptb;
813
        n1 = (long)tb1 & 3;
814
        tb1 = (TranslationBlock *)((long)tb1 & ~3);
815
        if (tb1 == tb) {
816
            *ptb = tb1->page_next[n1];
817
            break;
818
        }
819
        ptb = &tb1->page_next[n1];
820
    }
821
}
822

    
823
static inline void tb_jmp_remove(TranslationBlock *tb, int n)
824
{
825
    TranslationBlock *tb1, **ptb;
826
    unsigned int n1;
827

    
828
    ptb = &tb->jmp_next[n];
829
    tb1 = *ptb;
830
    if (tb1) {
831
        /* find tb(n) in circular list */
832
        for(;;) {
833
            tb1 = *ptb;
834
            n1 = (long)tb1 & 3;
835
            tb1 = (TranslationBlock *)((long)tb1 & ~3);
836
            if (n1 == n && tb1 == tb)
837
                break;
838
            if (n1 == 2) {
839
                ptb = &tb1->jmp_first;
840
            } else {
841
                ptb = &tb1->jmp_next[n1];
842
            }
843
        }
844
        /* now we can suppress tb(n) from the list */
845
        *ptb = tb->jmp_next[n];
846

    
847
        tb->jmp_next[n] = NULL;
848
    }
849
}
850

    
851
/* reset the jump entry 'n' of a TB so that it is not chained to
852
   another TB */
853
static inline void tb_reset_jump(TranslationBlock *tb, int n)
854
{
855
    tb_set_jmp_target(tb, n, (unsigned long)(tb->tc_ptr + tb->tb_next_offset[n]));
856
}
857

    
858
void tb_phys_invalidate(TranslationBlock *tb, tb_page_addr_t page_addr)
859
{
860
    CPUState *env;
861
    PageDesc *p;
862
    unsigned int h, n1;
863
    tb_page_addr_t phys_pc;
864
    TranslationBlock *tb1, *tb2;
865

    
866
    /* remove the TB from the hash list */
867
    phys_pc = tb->page_addr[0] + (tb->pc & ~TARGET_PAGE_MASK);
868
    h = tb_phys_hash_func(phys_pc);
869
    tb_remove(&tb_phys_hash[h], tb,
870
              offsetof(TranslationBlock, phys_hash_next));
871

    
872
    /* remove the TB from the page list */
873
    if (tb->page_addr[0] != page_addr) {
874
        p = page_find(tb->page_addr[0] >> TARGET_PAGE_BITS);
875
        tb_page_remove(&p->first_tb, tb);
876
        invalidate_page_bitmap(p);
877
    }
878
    if (tb->page_addr[1] != -1 && tb->page_addr[1] != page_addr) {
879
        p = page_find(tb->page_addr[1] >> TARGET_PAGE_BITS);
880
        tb_page_remove(&p->first_tb, tb);
881
        invalidate_page_bitmap(p);
882
    }
883

    
884
    tb_invalidated_flag = 1;
885

    
886
    /* remove the TB from the hash list */
887
    h = tb_jmp_cache_hash_func(tb->pc);
888
    for(env = first_cpu; env != NULL; env = env->next_cpu) {
889
        if (env->tb_jmp_cache[h] == tb)
890
            env->tb_jmp_cache[h] = NULL;
891
    }
892

    
893
    /* suppress this TB from the two jump lists */
894
    tb_jmp_remove(tb, 0);
895
    tb_jmp_remove(tb, 1);
896

    
897
    /* suppress any remaining jumps to this TB */
898
    tb1 = tb->jmp_first;
899
    for(;;) {
900
        n1 = (long)tb1 & 3;
901
        if (n1 == 2)
902
            break;
903
        tb1 = (TranslationBlock *)((long)tb1 & ~3);
904
        tb2 = tb1->jmp_next[n1];
905
        tb_reset_jump(tb1, n1);
906
        tb1->jmp_next[n1] = NULL;
907
        tb1 = tb2;
908
    }
909
    tb->jmp_first = (TranslationBlock *)((long)tb | 2); /* fail safe */
910

    
911
    tb_phys_invalidate_count++;
912
}
913

    
914
static inline void set_bits(uint8_t *tab, int start, int len)
915
{
916
    int end, mask, end1;
917

    
918
    end = start + len;
919
    tab += start >> 3;
920
    mask = 0xff << (start & 7);
921
    if ((start & ~7) == (end & ~7)) {
922
        if (start < end) {
923
            mask &= ~(0xff << (end & 7));
924
            *tab |= mask;
925
        }
926
    } else {
927
        *tab++ |= mask;
928
        start = (start + 8) & ~7;
929
        end1 = end & ~7;
930
        while (start < end1) {
931
            *tab++ = 0xff;
932
            start += 8;
933
        }
934
        if (start < end) {
935
            mask = ~(0xff << (end & 7));
936
            *tab |= mask;
937
        }
938
    }
939
}
940

    
941
static void build_page_bitmap(PageDesc *p)
942
{
943
    int n, tb_start, tb_end;
944
    TranslationBlock *tb;
945

    
946
    p->code_bitmap = qemu_mallocz(TARGET_PAGE_SIZE / 8);
947

    
948
    tb = p->first_tb;
949
    while (tb != NULL) {
950
        n = (long)tb & 3;
951
        tb = (TranslationBlock *)((long)tb & ~3);
952
        /* NOTE: this is subtle as a TB may span two physical pages */
953
        if (n == 0) {
954
            /* NOTE: tb_end may be after the end of the page, but
955
               it is not a problem */
956
            tb_start = tb->pc & ~TARGET_PAGE_MASK;
957
            tb_end = tb_start + tb->size;
958
            if (tb_end > TARGET_PAGE_SIZE)
959
                tb_end = TARGET_PAGE_SIZE;
960
        } else {
961
            tb_start = 0;
962
            tb_end = ((tb->pc + tb->size) & ~TARGET_PAGE_MASK);
963
        }
964
        set_bits(p->code_bitmap, tb_start, tb_end - tb_start);
965
        tb = tb->page_next[n];
966
    }
967
}
968

    
969
TranslationBlock *tb_gen_code(CPUState *env,
970
                              target_ulong pc, target_ulong cs_base,
971
                              int flags, int cflags)
972
{
973
    TranslationBlock *tb;
974
    uint8_t *tc_ptr;
975
    tb_page_addr_t phys_pc, phys_page2;
976
    target_ulong virt_page2;
977
    int code_gen_size;
978

    
979
    phys_pc = get_page_addr_code(env, pc);
980
    tb = tb_alloc(pc);
981
    if (!tb) {
982
        /* flush must be done */
983
        tb_flush(env);
984
        /* cannot fail at this point */
985
        tb = tb_alloc(pc);
986
        /* Don't forget to invalidate previous TB info.  */
987
        tb_invalidated_flag = 1;
988
    }
989
    tc_ptr = code_gen_ptr;
990
    tb->tc_ptr = tc_ptr;
991
    tb->cs_base = cs_base;
992
    tb->flags = flags;
993
    tb->cflags = cflags;
994
    cpu_gen_code(env, tb, &code_gen_size);
995
    code_gen_ptr = (void *)(((unsigned long)code_gen_ptr + code_gen_size + CODE_GEN_ALIGN - 1) & ~(CODE_GEN_ALIGN - 1));
996

    
997
    /* check next page if needed */
998
    virt_page2 = (pc + tb->size - 1) & TARGET_PAGE_MASK;
999
    phys_page2 = -1;
1000
    if ((pc & TARGET_PAGE_MASK) != virt_page2) {
1001
        phys_page2 = get_page_addr_code(env, virt_page2);
1002
    }
1003
    tb_link_page(tb, phys_pc, phys_page2);
1004
    return tb;
1005
}
1006

    
1007
/* invalidate all TBs which intersect with the target physical page
1008
   starting in range [start;end[. NOTE: start and end must refer to
1009
   the same physical page. 'is_cpu_write_access' should be true if called
1010
   from a real cpu write access: the virtual CPU will exit the current
1011
   TB if code is modified inside this TB. */
1012
void tb_invalidate_phys_page_range(tb_page_addr_t start, tb_page_addr_t end,
1013
                                   int is_cpu_write_access)
1014
{
1015
    TranslationBlock *tb, *tb_next, *saved_tb;
1016
    CPUState *env = cpu_single_env;
1017
    tb_page_addr_t tb_start, tb_end;
1018
    PageDesc *p;
1019
    int n;
1020
#ifdef TARGET_HAS_PRECISE_SMC
1021
    int current_tb_not_found = is_cpu_write_access;
1022
    TranslationBlock *current_tb = NULL;
1023
    int current_tb_modified = 0;
1024
    target_ulong current_pc = 0;
1025
    target_ulong current_cs_base = 0;
1026
    int current_flags = 0;
1027
#endif /* TARGET_HAS_PRECISE_SMC */
1028

    
1029
    p = page_find(start >> TARGET_PAGE_BITS);
1030
    if (!p)
1031
        return;
1032
    if (!p->code_bitmap &&
1033
        ++p->code_write_count >= SMC_BITMAP_USE_THRESHOLD &&
1034
        is_cpu_write_access) {
1035
        /* build code bitmap */
1036
        build_page_bitmap(p);
1037
    }
1038

    
1039
    /* we remove all the TBs in the range [start, end[ */
1040
    /* XXX: see if in some cases it could be faster to invalidate all the code */
1041
    tb = p->first_tb;
1042
    while (tb != NULL) {
1043
        n = (long)tb & 3;
1044
        tb = (TranslationBlock *)((long)tb & ~3);
1045
        tb_next = tb->page_next[n];
1046
        /* NOTE: this is subtle as a TB may span two physical pages */
1047
        if (n == 0) {
1048
            /* NOTE: tb_end may be after the end of the page, but
1049
               it is not a problem */
1050
            tb_start = tb->page_addr[0] + (tb->pc & ~TARGET_PAGE_MASK);
1051
            tb_end = tb_start + tb->size;
1052
        } else {
1053
            tb_start = tb->page_addr[1];
1054
            tb_end = tb_start + ((tb->pc + tb->size) & ~TARGET_PAGE_MASK);
1055
        }
1056
        if (!(tb_end <= start || tb_start >= end)) {
1057
#ifdef TARGET_HAS_PRECISE_SMC
1058
            if (current_tb_not_found) {
1059
                current_tb_not_found = 0;
1060
                current_tb = NULL;
1061
                if (env->mem_io_pc) {
1062
                    /* now we have a real cpu fault */
1063
                    current_tb = tb_find_pc(env->mem_io_pc);
1064
                }
1065
            }
1066
            if (current_tb == tb &&
1067
                (current_tb->cflags & CF_COUNT_MASK) != 1) {
1068
                /* If we are modifying the current TB, we must stop
1069
                its execution. We could be more precise by checking
1070
                that the modification is after the current PC, but it
1071
                would require a specialized function to partially
1072
                restore the CPU state */
1073

    
1074
                current_tb_modified = 1;
1075
                cpu_restore_state(current_tb, env, env->mem_io_pc);
1076
                cpu_get_tb_cpu_state(env, &current_pc, &current_cs_base,
1077
                                     &current_flags);
1078
            }
1079
#endif /* TARGET_HAS_PRECISE_SMC */
1080
            /* we need to do that to handle the case where a signal
1081
               occurs while doing tb_phys_invalidate() */
1082
            saved_tb = NULL;
1083
            if (env) {
1084
                saved_tb = env->current_tb;
1085
                env->current_tb = NULL;
1086
            }
1087
            tb_phys_invalidate(tb, -1);
1088
            if (env) {
1089
                env->current_tb = saved_tb;
1090
                if (env->interrupt_request && env->current_tb)
1091
                    cpu_interrupt(env, env->interrupt_request);
1092
            }
1093
        }
1094
        tb = tb_next;
1095
    }
1096
#if !defined(CONFIG_USER_ONLY)
1097
    /* if no code remaining, no need to continue to use slow writes */
1098
    if (!p->first_tb) {
1099
        invalidate_page_bitmap(p);
1100
        if (is_cpu_write_access) {
1101
            tlb_unprotect_code_phys(env, start, env->mem_io_vaddr);
1102
        }
1103
    }
1104
#endif
1105
#ifdef TARGET_HAS_PRECISE_SMC
1106
    if (current_tb_modified) {
1107
        /* we generate a block containing just the instruction
1108
           modifying the memory. It will ensure that it cannot modify
1109
           itself */
1110
        env->current_tb = NULL;
1111
        tb_gen_code(env, current_pc, current_cs_base, current_flags, 1);
1112
        cpu_resume_from_signal(env, NULL);
1113
    }
1114
#endif
1115
}
1116

    
1117
/* len must be <= 8 and start must be a multiple of len */
1118
static inline void tb_invalidate_phys_page_fast(tb_page_addr_t start, int len)
1119
{
1120
    PageDesc *p;
1121
    int offset, b;
1122
#if 0
1123
    if (1) {
1124
        qemu_log("modifying code at 0x%x size=%d EIP=%x PC=%08x\n",
1125
                  cpu_single_env->mem_io_vaddr, len,
1126
                  cpu_single_env->eip,
1127
                  cpu_single_env->eip + (long)cpu_single_env->segs[R_CS].base);
1128
    }
1129
#endif
1130
    p = page_find(start >> TARGET_PAGE_BITS);
1131
    if (!p)
1132
        return;
1133
    if (p->code_bitmap) {
1134
        offset = start & ~TARGET_PAGE_MASK;
1135
        b = p->code_bitmap[offset >> 3] >> (offset & 7);
1136
        if (b & ((1 << len) - 1))
1137
            goto do_invalidate;
1138
    } else {
1139
    do_invalidate:
1140
        tb_invalidate_phys_page_range(start, start + len, 1);
1141
    }
1142
}
1143

    
1144
#if !defined(CONFIG_SOFTMMU)
1145
static void tb_invalidate_phys_page(tb_page_addr_t addr,
1146
                                    unsigned long pc, void *puc)
1147
{
1148
    TranslationBlock *tb;
1149
    PageDesc *p;
1150
    int n;
1151
#ifdef TARGET_HAS_PRECISE_SMC
1152
    TranslationBlock *current_tb = NULL;
1153
    CPUState *env = cpu_single_env;
1154
    int current_tb_modified = 0;
1155
    target_ulong current_pc = 0;
1156
    target_ulong current_cs_base = 0;
1157
    int current_flags = 0;
1158
#endif
1159

    
1160
    addr &= TARGET_PAGE_MASK;
1161
    p = page_find(addr >> TARGET_PAGE_BITS);
1162
    if (!p)
1163
        return;
1164
    tb = p->first_tb;
1165
#ifdef TARGET_HAS_PRECISE_SMC
1166
    if (tb && pc != 0) {
1167
        current_tb = tb_find_pc(pc);
1168
    }
1169
#endif
1170
    while (tb != NULL) {
1171
        n = (long)tb & 3;
1172
        tb = (TranslationBlock *)((long)tb & ~3);
1173
#ifdef TARGET_HAS_PRECISE_SMC
1174
        if (current_tb == tb &&
1175
            (current_tb->cflags & CF_COUNT_MASK) != 1) {
1176
                /* If we are modifying the current TB, we must stop
1177
                   its execution. We could be more precise by checking
1178
                   that the modification is after the current PC, but it
1179
                   would require a specialized function to partially
1180
                   restore the CPU state */
1181

    
1182
            current_tb_modified = 1;
1183
            cpu_restore_state(current_tb, env, pc);
1184
            cpu_get_tb_cpu_state(env, &current_pc, &current_cs_base,
1185
                                 &current_flags);
1186
        }
1187
#endif /* TARGET_HAS_PRECISE_SMC */
1188
        tb_phys_invalidate(tb, addr);
1189
        tb = tb->page_next[n];
1190
    }
1191
    p->first_tb = NULL;
1192
#ifdef TARGET_HAS_PRECISE_SMC
1193
    if (current_tb_modified) {
1194
        /* we generate a block containing just the instruction
1195
           modifying the memory. It will ensure that it cannot modify
1196
           itself */
1197
        env->current_tb = NULL;
1198
        tb_gen_code(env, current_pc, current_cs_base, current_flags, 1);
1199
        cpu_resume_from_signal(env, puc);
1200
    }
1201
#endif
1202
}
1203
#endif
1204

    
1205
/* add the tb in the target page and protect it if necessary */
1206
static inline void tb_alloc_page(TranslationBlock *tb,
1207
                                 unsigned int n, tb_page_addr_t page_addr)
1208
{
1209
    PageDesc *p;
1210
    TranslationBlock *last_first_tb;
1211

    
1212
    tb->page_addr[n] = page_addr;
1213
    p = page_find_alloc(page_addr >> TARGET_PAGE_BITS, 1);
1214
    tb->page_next[n] = p->first_tb;
1215
    last_first_tb = p->first_tb;
1216
    p->first_tb = (TranslationBlock *)((long)tb | n);
1217
    invalidate_page_bitmap(p);
1218

    
1219
#if defined(TARGET_HAS_SMC) || 1
1220

    
1221
#if defined(CONFIG_USER_ONLY)
1222
    if (p->flags & PAGE_WRITE) {
1223
        target_ulong addr;
1224
        PageDesc *p2;
1225
        int prot;
1226

    
1227
        /* force the host page as non writable (writes will have a
1228
           page fault + mprotect overhead) */
1229
        page_addr &= qemu_host_page_mask;
1230
        prot = 0;
1231
        for(addr = page_addr; addr < page_addr + qemu_host_page_size;
1232
            addr += TARGET_PAGE_SIZE) {
1233

    
1234
            p2 = page_find (addr >> TARGET_PAGE_BITS);
1235
            if (!p2)
1236
                continue;
1237
            prot |= p2->flags;
1238
            p2->flags &= ~PAGE_WRITE;
1239
          }
1240
        mprotect(g2h(page_addr), qemu_host_page_size,
1241
                 (prot & PAGE_BITS) & ~PAGE_WRITE);
1242
#ifdef DEBUG_TB_INVALIDATE
1243
        printf("protecting code page: 0x" TARGET_FMT_lx "\n",
1244
               page_addr);
1245
#endif
1246
    }
1247
#else
1248
    /* if some code is already present, then the pages are already
1249
       protected. So we handle the case where only the first TB is
1250
       allocated in a physical page */
1251
    if (!last_first_tb) {
1252
        tlb_protect_code(page_addr);
1253
    }
1254
#endif
1255

    
1256
#endif /* TARGET_HAS_SMC */
1257
}
1258

    
1259
/* add a new TB and link it to the physical page tables. phys_page2 is
1260
   (-1) to indicate that only one page contains the TB. */
1261
void tb_link_page(TranslationBlock *tb,
1262
                  tb_page_addr_t phys_pc, tb_page_addr_t phys_page2)
1263
{
1264
    unsigned int h;
1265
    TranslationBlock **ptb;
1266

    
1267
    /* Grab the mmap lock to stop another thread invalidating this TB
1268
       before we are done.  */
1269
    mmap_lock();
1270
    /* add in the physical hash table */
1271
    h = tb_phys_hash_func(phys_pc);
1272
    ptb = &tb_phys_hash[h];
1273
    tb->phys_hash_next = *ptb;
1274
    *ptb = tb;
1275

    
1276
    /* add in the page list */
1277
    tb_alloc_page(tb, 0, phys_pc & TARGET_PAGE_MASK);
1278
    if (phys_page2 != -1)
1279
        tb_alloc_page(tb, 1, phys_page2);
1280
    else
1281
        tb->page_addr[1] = -1;
1282

    
1283
    tb->jmp_first = (TranslationBlock *)((long)tb | 2);
1284
    tb->jmp_next[0] = NULL;
1285
    tb->jmp_next[1] = NULL;
1286

    
1287
    /* init original jump addresses */
1288
    if (tb->tb_next_offset[0] != 0xffff)
1289
        tb_reset_jump(tb, 0);
1290
    if (tb->tb_next_offset[1] != 0xffff)
1291
        tb_reset_jump(tb, 1);
1292

    
1293
#ifdef DEBUG_TB_CHECK
1294
    tb_page_check();
1295
#endif
1296
    mmap_unlock();
1297
}
1298

    
1299
/* find the TB 'tb' such that tb[0].tc_ptr <= tc_ptr <
1300
   tb[1].tc_ptr. Return NULL if not found */
1301
TranslationBlock *tb_find_pc(unsigned long tc_ptr)
1302
{
1303
    int m_min, m_max, m;
1304
    unsigned long v;
1305
    TranslationBlock *tb;
1306

    
1307
    if (nb_tbs <= 0)
1308
        return NULL;
1309
    if (tc_ptr < (unsigned long)code_gen_buffer ||
1310
        tc_ptr >= (unsigned long)code_gen_ptr)
1311
        return NULL;
1312
    /* binary search (cf Knuth) */
1313
    m_min = 0;
1314
    m_max = nb_tbs - 1;
1315
    while (m_min <= m_max) {
1316
        m = (m_min + m_max) >> 1;
1317
        tb = &tbs[m];
1318
        v = (unsigned long)tb->tc_ptr;
1319
        if (v == tc_ptr)
1320
            return tb;
1321
        else if (tc_ptr < v) {
1322
            m_max = m - 1;
1323
        } else {
1324
            m_min = m + 1;
1325
        }
1326
    }
1327
    return &tbs[m_max];
1328
}
1329

    
1330
static void tb_reset_jump_recursive(TranslationBlock *tb);
1331

    
1332
static inline void tb_reset_jump_recursive2(TranslationBlock *tb, int n)
1333
{
1334
    TranslationBlock *tb1, *tb_next, **ptb;
1335
    unsigned int n1;
1336

    
1337
    tb1 = tb->jmp_next[n];
1338
    if (tb1 != NULL) {
1339
        /* find head of list */
1340
        for(;;) {
1341
            n1 = (long)tb1 & 3;
1342
            tb1 = (TranslationBlock *)((long)tb1 & ~3);
1343
            if (n1 == 2)
1344
                break;
1345
            tb1 = tb1->jmp_next[n1];
1346
        }
1347
        /* we are now sure now that tb jumps to tb1 */
1348
        tb_next = tb1;
1349

    
1350
        /* remove tb from the jmp_first list */
1351
        ptb = &tb_next->jmp_first;
1352
        for(;;) {
1353
            tb1 = *ptb;
1354
            n1 = (long)tb1 & 3;
1355
            tb1 = (TranslationBlock *)((long)tb1 & ~3);
1356
            if (n1 == n && tb1 == tb)
1357
                break;
1358
            ptb = &tb1->jmp_next[n1];
1359
        }
1360
        *ptb = tb->jmp_next[n];
1361
        tb->jmp_next[n] = NULL;
1362

    
1363
        /* suppress the jump to next tb in generated code */
1364
        tb_reset_jump(tb, n);
1365

    
1366
        /* suppress jumps in the tb on which we could have jumped */
1367
        tb_reset_jump_recursive(tb_next);
1368
    }
1369
}
1370

    
1371
static void tb_reset_jump_recursive(TranslationBlock *tb)
1372
{
1373
    tb_reset_jump_recursive2(tb, 0);
1374
    tb_reset_jump_recursive2(tb, 1);
1375
}
1376

    
1377
#if defined(TARGET_HAS_ICE)
1378
#if defined(CONFIG_USER_ONLY)
1379
static void breakpoint_invalidate(CPUState *env, target_ulong pc)
1380
{
1381
    tb_invalidate_phys_page_range(pc, pc + 1, 0);
1382
}
1383
#else
1384
static void breakpoint_invalidate(CPUState *env, target_ulong pc)
1385
{
1386
    target_phys_addr_t addr;
1387
    target_ulong pd;
1388
    ram_addr_t ram_addr;
1389
    PhysPageDesc *p;
1390

    
1391
    addr = cpu_get_phys_page_debug(env, pc);
1392
    p = phys_page_find(addr >> TARGET_PAGE_BITS);
1393
    if (!p) {
1394
        pd = IO_MEM_UNASSIGNED;
1395
    } else {
1396
        pd = p->phys_offset;
1397
    }
1398
    ram_addr = (pd & TARGET_PAGE_MASK) | (pc & ~TARGET_PAGE_MASK);
1399
    tb_invalidate_phys_page_range(ram_addr, ram_addr + 1, 0);
1400
}
1401
#endif
1402
#endif /* TARGET_HAS_ICE */
1403

    
1404
#if defined(CONFIG_USER_ONLY)
1405
void cpu_watchpoint_remove_all(CPUState *env, int mask)
1406

    
1407
{
1408
}
1409

    
1410
int cpu_watchpoint_insert(CPUState *env, target_ulong addr, target_ulong len,
1411
                          int flags, CPUWatchpoint **watchpoint)
1412
{
1413
    return -ENOSYS;
1414
}
1415
#else
1416
/* Add a watchpoint.  */
1417
int cpu_watchpoint_insert(CPUState *env, target_ulong addr, target_ulong len,
1418
                          int flags, CPUWatchpoint **watchpoint)
1419
{
1420
    target_ulong len_mask = ~(len - 1);
1421
    CPUWatchpoint *wp;
1422

    
1423
    /* sanity checks: allow power-of-2 lengths, deny unaligned watchpoints */
1424
    if ((len != 1 && len != 2 && len != 4 && len != 8) || (addr & ~len_mask)) {
1425
        fprintf(stderr, "qemu: tried to set invalid watchpoint at "
1426
                TARGET_FMT_lx ", len=" TARGET_FMT_lu "\n", addr, len);
1427
        return -EINVAL;
1428
    }
1429
    wp = qemu_malloc(sizeof(*wp));
1430

    
1431
    wp->vaddr = addr;
1432
    wp->len_mask = len_mask;
1433
    wp->flags = flags;
1434

    
1435
    /* keep all GDB-injected watchpoints in front */
1436
    if (flags & BP_GDB)
1437
        QTAILQ_INSERT_HEAD(&env->watchpoints, wp, entry);
1438
    else
1439
        QTAILQ_INSERT_TAIL(&env->watchpoints, wp, entry);
1440

    
1441
    tlb_flush_page(env, addr);
1442

    
1443
    if (watchpoint)
1444
        *watchpoint = wp;
1445
    return 0;
1446
}
1447

    
1448
/* Remove a specific watchpoint.  */
1449
int cpu_watchpoint_remove(CPUState *env, target_ulong addr, target_ulong len,
1450
                          int flags)
1451
{
1452
    target_ulong len_mask = ~(len - 1);
1453
    CPUWatchpoint *wp;
1454

    
1455
    QTAILQ_FOREACH(wp, &env->watchpoints, entry) {
1456
        if (addr == wp->vaddr && len_mask == wp->len_mask
1457
                && flags == (wp->flags & ~BP_WATCHPOINT_HIT)) {
1458
            cpu_watchpoint_remove_by_ref(env, wp);
1459
            return 0;
1460
        }
1461
    }
1462
    return -ENOENT;
1463
}
1464

    
1465
/* Remove a specific watchpoint by reference.  */
1466
void cpu_watchpoint_remove_by_ref(CPUState *env, CPUWatchpoint *watchpoint)
1467
{
1468
    QTAILQ_REMOVE(&env->watchpoints, watchpoint, entry);
1469

    
1470
    tlb_flush_page(env, watchpoint->vaddr);
1471

    
1472
    qemu_free(watchpoint);
1473
}
1474

    
1475
/* Remove all matching watchpoints.  */
1476
void cpu_watchpoint_remove_all(CPUState *env, int mask)
1477
{
1478
    CPUWatchpoint *wp, *next;
1479

    
1480
    QTAILQ_FOREACH_SAFE(wp, &env->watchpoints, entry, next) {
1481
        if (wp->flags & mask)
1482
            cpu_watchpoint_remove_by_ref(env, wp);
1483
    }
1484
}
1485
#endif
1486

    
1487
/* Add a breakpoint.  */
1488
int cpu_breakpoint_insert(CPUState *env, target_ulong pc, int flags,
1489
                          CPUBreakpoint **breakpoint)
1490
{
1491
#if defined(TARGET_HAS_ICE)
1492
    CPUBreakpoint *bp;
1493

    
1494
    bp = qemu_malloc(sizeof(*bp));
1495

    
1496
    bp->pc = pc;
1497
    bp->flags = flags;
1498

    
1499
    /* keep all GDB-injected breakpoints in front */
1500
    if (flags & BP_GDB)
1501
        QTAILQ_INSERT_HEAD(&env->breakpoints, bp, entry);
1502
    else
1503
        QTAILQ_INSERT_TAIL(&env->breakpoints, bp, entry);
1504

    
1505
    breakpoint_invalidate(env, pc);
1506

    
1507
    if (breakpoint)
1508
        *breakpoint = bp;
1509
    return 0;
1510
#else
1511
    return -ENOSYS;
1512
#endif
1513
}
1514

    
1515
/* Remove a specific breakpoint.  */
1516
int cpu_breakpoint_remove(CPUState *env, target_ulong pc, int flags)
1517
{
1518
#if defined(TARGET_HAS_ICE)
1519
    CPUBreakpoint *bp;
1520

    
1521
    QTAILQ_FOREACH(bp, &env->breakpoints, entry) {
1522
        if (bp->pc == pc && bp->flags == flags) {
1523
            cpu_breakpoint_remove_by_ref(env, bp);
1524
            return 0;
1525
        }
1526
    }
1527
    return -ENOENT;
1528
#else
1529
    return -ENOSYS;
1530
#endif
1531
}
1532

    
1533
/* Remove a specific breakpoint by reference.  */
1534
void cpu_breakpoint_remove_by_ref(CPUState *env, CPUBreakpoint *breakpoint)
1535
{
1536
#if defined(TARGET_HAS_ICE)
1537
    QTAILQ_REMOVE(&env->breakpoints, breakpoint, entry);
1538

    
1539
    breakpoint_invalidate(env, breakpoint->pc);
1540

    
1541
    qemu_free(breakpoint);
1542
#endif
1543
}
1544

    
1545
/* Remove all matching breakpoints. */
1546
void cpu_breakpoint_remove_all(CPUState *env, int mask)
1547
{
1548
#if defined(TARGET_HAS_ICE)
1549
    CPUBreakpoint *bp, *next;
1550

    
1551
    QTAILQ_FOREACH_SAFE(bp, &env->breakpoints, entry, next) {
1552
        if (bp->flags & mask)
1553
            cpu_breakpoint_remove_by_ref(env, bp);
1554
    }
1555
#endif
1556
}
1557

    
1558
/* enable or disable single step mode. EXCP_DEBUG is returned by the
1559
   CPU loop after each instruction */
1560
void cpu_single_step(CPUState *env, int enabled)
1561
{
1562
#if defined(TARGET_HAS_ICE)
1563
    if (env->singlestep_enabled != enabled) {
1564
        env->singlestep_enabled = enabled;
1565
        if (kvm_enabled())
1566
            kvm_update_guest_debug(env, 0);
1567
        else {
1568
            /* must flush all the translated code to avoid inconsistencies */
1569
            /* XXX: only flush what is necessary */
1570
            tb_flush(env);
1571
        }
1572
    }
1573
#endif
1574
}
1575

    
1576
/* enable or disable low levels log */
1577
void cpu_set_log(int log_flags)
1578
{
1579
    loglevel = log_flags;
1580
    if (loglevel && !logfile) {
1581
        logfile = fopen(logfilename, log_append ? "a" : "w");
1582
        if (!logfile) {
1583
            perror(logfilename);
1584
            _exit(1);
1585
        }
1586
#if !defined(CONFIG_SOFTMMU)
1587
        /* must avoid mmap() usage of glibc by setting a buffer "by hand" */
1588
        {
1589
            static char logfile_buf[4096];
1590
            setvbuf(logfile, logfile_buf, _IOLBF, sizeof(logfile_buf));
1591
        }
1592
#elif !defined(_WIN32)
1593
        /* Win32 doesn't support line-buffering and requires size >= 2 */
1594
        setvbuf(logfile, NULL, _IOLBF, 0);
1595
#endif
1596
        log_append = 1;
1597
    }
1598
    if (!loglevel && logfile) {
1599
        fclose(logfile);
1600
        logfile = NULL;
1601
    }
1602
}
1603

    
1604
void cpu_set_log_filename(const char *filename)
1605
{
1606
    logfilename = strdup(filename);
1607
    if (logfile) {
1608
        fclose(logfile);
1609
        logfile = NULL;
1610
    }
1611
    cpu_set_log(loglevel);
1612
}
1613

    
1614
static void cpu_unlink_tb(CPUState *env)
1615
{
1616
    /* FIXME: TB unchaining isn't SMP safe.  For now just ignore the
1617
       problem and hope the cpu will stop of its own accord.  For userspace
1618
       emulation this often isn't actually as bad as it sounds.  Often
1619
       signals are used primarily to interrupt blocking syscalls.  */
1620
    TranslationBlock *tb;
1621
    static spinlock_t interrupt_lock = SPIN_LOCK_UNLOCKED;
1622

    
1623
    spin_lock(&interrupt_lock);
1624
    tb = env->current_tb;
1625
    /* if the cpu is currently executing code, we must unlink it and
1626
       all the potentially executing TB */
1627
    if (tb) {
1628
        env->current_tb = NULL;
1629
        tb_reset_jump_recursive(tb);
1630
    }
1631
    spin_unlock(&interrupt_lock);
1632
}
1633

    
1634
#ifndef CONFIG_USER_ONLY
1635
/* mask must never be zero, except for A20 change call */
1636
static void tcg_handle_interrupt(CPUState *env, int mask)
1637
{
1638
    int old_mask;
1639

    
1640
    old_mask = env->interrupt_request;
1641
    env->interrupt_request |= mask;
1642

    
1643
    /*
1644
     * If called from iothread context, wake the target cpu in
1645
     * case its halted.
1646
     */
1647
    if (!qemu_cpu_is_self(env)) {
1648
        qemu_cpu_kick(env);
1649
        return;
1650
    }
1651

    
1652
    if (use_icount) {
1653
        env->icount_decr.u16.high = 0xffff;
1654
        if (!can_do_io(env)
1655
            && (mask & ~old_mask) != 0) {
1656
            cpu_abort(env, "Raised interrupt while not in I/O function");
1657
        }
1658
    } else {
1659
        cpu_unlink_tb(env);
1660
    }
1661
}
1662

    
1663
CPUInterruptHandler cpu_interrupt_handler = tcg_handle_interrupt;
1664

    
1665
#else /* CONFIG_USER_ONLY */
1666

    
1667
void cpu_interrupt(CPUState *env, int mask)
1668
{
1669
    env->interrupt_request |= mask;
1670
    cpu_unlink_tb(env);
1671
}
1672
#endif /* CONFIG_USER_ONLY */
1673

    
1674
void cpu_reset_interrupt(CPUState *env, int mask)
1675
{
1676
    env->interrupt_request &= ~mask;
1677
}
1678

    
1679
void cpu_exit(CPUState *env)
1680
{
1681
    env->exit_request = 1;
1682
    cpu_unlink_tb(env);
1683
}
1684

    
1685
const CPULogItem cpu_log_items[] = {
1686
    { CPU_LOG_TB_OUT_ASM, "out_asm",
1687
      "show generated host assembly code for each compiled TB" },
1688
    { CPU_LOG_TB_IN_ASM, "in_asm",
1689
      "show target assembly code for each compiled TB" },
1690
    { CPU_LOG_TB_OP, "op",
1691
      "show micro ops for each compiled TB" },
1692
    { CPU_LOG_TB_OP_OPT, "op_opt",
1693
      "show micro ops "
1694
#ifdef TARGET_I386
1695
      "before eflags optimization and "
1696
#endif
1697
      "after liveness analysis" },
1698
    { CPU_LOG_INT, "int",
1699
      "show interrupts/exceptions in short format" },
1700
    { CPU_LOG_EXEC, "exec",
1701
      "show trace before each executed TB (lots of logs)" },
1702
    { CPU_LOG_TB_CPU, "cpu",
1703
      "show CPU state before block translation" },
1704
#ifdef TARGET_I386
1705
    { CPU_LOG_PCALL, "pcall",
1706
      "show protected mode far calls/returns/exceptions" },
1707
    { CPU_LOG_RESET, "cpu_reset",
1708
      "show CPU state before CPU resets" },
1709
#endif
1710
#ifdef DEBUG_IOPORT
1711
    { CPU_LOG_IOPORT, "ioport",
1712
      "show all i/o ports accesses" },
1713
#endif
1714
    { 0, NULL, NULL },
1715
};
1716

    
1717
#ifndef CONFIG_USER_ONLY
1718
static QLIST_HEAD(memory_client_list, CPUPhysMemoryClient) memory_client_list
1719
    = QLIST_HEAD_INITIALIZER(memory_client_list);
1720

    
1721
static void cpu_notify_set_memory(target_phys_addr_t start_addr,
1722
                                  ram_addr_t size,
1723
                                  ram_addr_t phys_offset,
1724
                                  bool log_dirty)
1725
{
1726
    CPUPhysMemoryClient *client;
1727
    QLIST_FOREACH(client, &memory_client_list, list) {
1728
        client->set_memory(client, start_addr, size, phys_offset, log_dirty);
1729
    }
1730
}
1731

    
1732
static int cpu_notify_sync_dirty_bitmap(target_phys_addr_t start,
1733
                                        target_phys_addr_t end)
1734
{
1735
    CPUPhysMemoryClient *client;
1736
    QLIST_FOREACH(client, &memory_client_list, list) {
1737
        int r = client->sync_dirty_bitmap(client, start, end);
1738
        if (r < 0)
1739
            return r;
1740
    }
1741
    return 0;
1742
}
1743

    
1744
static int cpu_notify_migration_log(int enable)
1745
{
1746
    CPUPhysMemoryClient *client;
1747
    QLIST_FOREACH(client, &memory_client_list, list) {
1748
        int r = client->migration_log(client, enable);
1749
        if (r < 0)
1750
            return r;
1751
    }
1752
    return 0;
1753
}
1754

    
1755
/* The l1_phys_map provides the upper P_L1_BITs of the guest physical
1756
 * address.  Each intermediate table provides the next L2_BITs of guest
1757
 * physical address space.  The number of levels vary based on host and
1758
 * guest configuration, making it efficient to build the final guest
1759
 * physical address by seeding the L1 offset and shifting and adding in
1760
 * each L2 offset as we recurse through them. */
1761
static void phys_page_for_each_1(CPUPhysMemoryClient *client,
1762
                                 int level, void **lp, target_phys_addr_t addr)
1763
{
1764
    int i;
1765

    
1766
    if (*lp == NULL) {
1767
        return;
1768
    }
1769
    if (level == 0) {
1770
        PhysPageDesc *pd = *lp;
1771
        addr <<= L2_BITS + TARGET_PAGE_BITS;
1772
        for (i = 0; i < L2_SIZE; ++i) {
1773
            if (pd[i].phys_offset != IO_MEM_UNASSIGNED) {
1774
                client->set_memory(client, addr | i << TARGET_PAGE_BITS,
1775
                                   TARGET_PAGE_SIZE, pd[i].phys_offset, false);
1776
            }
1777
        }
1778
    } else {
1779
        void **pp = *lp;
1780
        for (i = 0; i < L2_SIZE; ++i) {
1781
            phys_page_for_each_1(client, level - 1, pp + i,
1782
                                 (addr << L2_BITS) | i);
1783
        }
1784
    }
1785
}
1786

    
1787
static void phys_page_for_each(CPUPhysMemoryClient *client)
1788
{
1789
    int i;
1790
    for (i = 0; i < P_L1_SIZE; ++i) {
1791
        phys_page_for_each_1(client, P_L1_SHIFT / L2_BITS - 1,
1792
                             l1_phys_map + i, i);
1793
    }
1794
}
1795

    
1796
void cpu_register_phys_memory_client(CPUPhysMemoryClient *client)
1797
{
1798
    QLIST_INSERT_HEAD(&memory_client_list, client, list);
1799
    phys_page_for_each(client);
1800
}
1801

    
1802
void cpu_unregister_phys_memory_client(CPUPhysMemoryClient *client)
1803
{
1804
    QLIST_REMOVE(client, list);
1805
}
1806
#endif
1807

    
1808
static int cmp1(const char *s1, int n, const char *s2)
1809
{
1810
    if (strlen(s2) != n)
1811
        return 0;
1812
    return memcmp(s1, s2, n) == 0;
1813
}
1814

    
1815
/* takes a comma separated list of log masks. Return 0 if error. */
1816
int cpu_str_to_log_mask(const char *str)
1817
{
1818
    const CPULogItem *item;
1819
    int mask;
1820
    const char *p, *p1;
1821

    
1822
    p = str;
1823
    mask = 0;
1824
    for(;;) {
1825
        p1 = strchr(p, ',');
1826
        if (!p1)
1827
            p1 = p + strlen(p);
1828
        if(cmp1(p,p1-p,"all")) {
1829
            for(item = cpu_log_items; item->mask != 0; item++) {
1830
                mask |= item->mask;
1831
            }
1832
        } else {
1833
            for(item = cpu_log_items; item->mask != 0; item++) {
1834
                if (cmp1(p, p1 - p, item->name))
1835
                    goto found;
1836
            }
1837
            return 0;
1838
        }
1839
    found:
1840
        mask |= item->mask;
1841
        if (*p1 != ',')
1842
            break;
1843
        p = p1 + 1;
1844
    }
1845
    return mask;
1846
}
1847

    
1848
void cpu_abort(CPUState *env, const char *fmt, ...)
1849
{
1850
    va_list ap;
1851
    va_list ap2;
1852

    
1853
    va_start(ap, fmt);
1854
    va_copy(ap2, ap);
1855
    fprintf(stderr, "qemu: fatal: ");
1856
    vfprintf(stderr, fmt, ap);
1857
    fprintf(stderr, "\n");
1858
#ifdef TARGET_I386
1859
    cpu_dump_state(env, stderr, fprintf, X86_DUMP_FPU | X86_DUMP_CCOP);
1860
#else
1861
    cpu_dump_state(env, stderr, fprintf, 0);
1862
#endif
1863
    if (qemu_log_enabled()) {
1864
        qemu_log("qemu: fatal: ");
1865
        qemu_log_vprintf(fmt, ap2);
1866
        qemu_log("\n");
1867
#ifdef TARGET_I386
1868
        log_cpu_state(env, X86_DUMP_FPU | X86_DUMP_CCOP);
1869
#else
1870
        log_cpu_state(env, 0);
1871
#endif
1872
        qemu_log_flush();
1873
        qemu_log_close();
1874
    }
1875
    va_end(ap2);
1876
    va_end(ap);
1877
#if defined(CONFIG_USER_ONLY)
1878
    {
1879
        struct sigaction act;
1880
        sigfillset(&act.sa_mask);
1881
        act.sa_handler = SIG_DFL;
1882
        sigaction(SIGABRT, &act, NULL);
1883
    }
1884
#endif
1885
    abort();
1886
}
1887

    
1888
CPUState *cpu_copy(CPUState *env)
1889
{
1890
    CPUState *new_env = cpu_init(env->cpu_model_str);
1891
    CPUState *next_cpu = new_env->next_cpu;
1892
    int cpu_index = new_env->cpu_index;
1893
#if defined(TARGET_HAS_ICE)
1894
    CPUBreakpoint *bp;
1895
    CPUWatchpoint *wp;
1896
#endif
1897

    
1898
    memcpy(new_env, env, sizeof(CPUState));
1899

    
1900
    /* Preserve chaining and index. */
1901
    new_env->next_cpu = next_cpu;
1902
    new_env->cpu_index = cpu_index;
1903

    
1904
    /* Clone all break/watchpoints.
1905
       Note: Once we support ptrace with hw-debug register access, make sure
1906
       BP_CPU break/watchpoints are handled correctly on clone. */
1907
    QTAILQ_INIT(&env->breakpoints);
1908
    QTAILQ_INIT(&env->watchpoints);
1909
#if defined(TARGET_HAS_ICE)
1910
    QTAILQ_FOREACH(bp, &env->breakpoints, entry) {
1911
        cpu_breakpoint_insert(new_env, bp->pc, bp->flags, NULL);
1912
    }
1913
    QTAILQ_FOREACH(wp, &env->watchpoints, entry) {
1914
        cpu_watchpoint_insert(new_env, wp->vaddr, (~wp->len_mask) + 1,
1915
                              wp->flags, NULL);
1916
    }
1917
#endif
1918

    
1919
    return new_env;
1920
}
1921

    
1922
#if !defined(CONFIG_USER_ONLY)
1923

    
1924
static inline void tlb_flush_jmp_cache(CPUState *env, target_ulong addr)
1925
{
1926
    unsigned int i;
1927

    
1928
    /* Discard jump cache entries for any tb which might potentially
1929
       overlap the flushed page.  */
1930
    i = tb_jmp_cache_hash_page(addr - TARGET_PAGE_SIZE);
1931
    memset (&env->tb_jmp_cache[i], 0, 
1932
            TB_JMP_PAGE_SIZE * sizeof(TranslationBlock *));
1933

    
1934
    i = tb_jmp_cache_hash_page(addr);
1935
    memset (&env->tb_jmp_cache[i], 0, 
1936
            TB_JMP_PAGE_SIZE * sizeof(TranslationBlock *));
1937
}
1938

    
1939
static CPUTLBEntry s_cputlb_empty_entry = {
1940
    .addr_read  = -1,
1941
    .addr_write = -1,
1942
    .addr_code  = -1,
1943
    .addend     = -1,
1944
};
1945

    
1946
/* NOTE: if flush_global is true, also flush global entries (not
1947
   implemented yet) */
1948
void tlb_flush(CPUState *env, int flush_global)
1949
{
1950
    int i;
1951

    
1952
#if defined(DEBUG_TLB)
1953
    printf("tlb_flush:\n");
1954
#endif
1955
    /* must reset current TB so that interrupts cannot modify the
1956
       links while we are modifying them */
1957
    env->current_tb = NULL;
1958

    
1959
    for(i = 0; i < CPU_TLB_SIZE; i++) {
1960
        int mmu_idx;
1961
        for (mmu_idx = 0; mmu_idx < NB_MMU_MODES; mmu_idx++) {
1962
            env->tlb_table[mmu_idx][i] = s_cputlb_empty_entry;
1963
        }
1964
    }
1965

    
1966
    memset (env->tb_jmp_cache, 0, TB_JMP_CACHE_SIZE * sizeof (void *));
1967

    
1968
    env->tlb_flush_addr = -1;
1969
    env->tlb_flush_mask = 0;
1970
    tlb_flush_count++;
1971
}
1972

    
1973
static inline void tlb_flush_entry(CPUTLBEntry *tlb_entry, target_ulong addr)
1974
{
1975
    if (addr == (tlb_entry->addr_read &
1976
                 (TARGET_PAGE_MASK | TLB_INVALID_MASK)) ||
1977
        addr == (tlb_entry->addr_write &
1978
                 (TARGET_PAGE_MASK | TLB_INVALID_MASK)) ||
1979
        addr == (tlb_entry->addr_code &
1980
                 (TARGET_PAGE_MASK | TLB_INVALID_MASK))) {
1981
        *tlb_entry = s_cputlb_empty_entry;
1982
    }
1983
}
1984

    
1985
void tlb_flush_page(CPUState *env, target_ulong addr)
1986
{
1987
    int i;
1988
    int mmu_idx;
1989

    
1990
#if defined(DEBUG_TLB)
1991
    printf("tlb_flush_page: " TARGET_FMT_lx "\n", addr);
1992
#endif
1993
    /* Check if we need to flush due to large pages.  */
1994
    if ((addr & env->tlb_flush_mask) == env->tlb_flush_addr) {
1995
#if defined(DEBUG_TLB)
1996
        printf("tlb_flush_page: forced full flush ("
1997
               TARGET_FMT_lx "/" TARGET_FMT_lx ")\n",
1998
               env->tlb_flush_addr, env->tlb_flush_mask);
1999
#endif
2000
        tlb_flush(env, 1);
2001
        return;
2002
    }
2003
    /* must reset current TB so that interrupts cannot modify the
2004
       links while we are modifying them */
2005
    env->current_tb = NULL;
2006

    
2007
    addr &= TARGET_PAGE_MASK;
2008
    i = (addr >> TARGET_PAGE_BITS) & (CPU_TLB_SIZE - 1);
2009
    for (mmu_idx = 0; mmu_idx < NB_MMU_MODES; mmu_idx++)
2010
        tlb_flush_entry(&env->tlb_table[mmu_idx][i], addr);
2011

    
2012
    tlb_flush_jmp_cache(env, addr);
2013
}
2014

    
2015
/* update the TLBs so that writes to code in the virtual page 'addr'
2016
   can be detected */
2017
static void tlb_protect_code(ram_addr_t ram_addr)
2018
{
2019
    cpu_physical_memory_reset_dirty(ram_addr,
2020
                                    ram_addr + TARGET_PAGE_SIZE,
2021
                                    CODE_DIRTY_FLAG);
2022
}
2023

    
2024
/* update the TLB so that writes in physical page 'phys_addr' are no longer
2025
   tested for self modifying code */
2026
static void tlb_unprotect_code_phys(CPUState *env, ram_addr_t ram_addr,
2027
                                    target_ulong vaddr)
2028
{
2029
    cpu_physical_memory_set_dirty_flags(ram_addr, CODE_DIRTY_FLAG);
2030
}
2031

    
2032
static inline void tlb_reset_dirty_range(CPUTLBEntry *tlb_entry,
2033
                                         unsigned long start, unsigned long length)
2034
{
2035
    unsigned long addr;
2036
    if ((tlb_entry->addr_write & ~TARGET_PAGE_MASK) == IO_MEM_RAM) {
2037
        addr = (tlb_entry->addr_write & TARGET_PAGE_MASK) + tlb_entry->addend;
2038
        if ((addr - start) < length) {
2039
            tlb_entry->addr_write = (tlb_entry->addr_write & TARGET_PAGE_MASK) | TLB_NOTDIRTY;
2040
        }
2041
    }
2042
}
2043

    
2044
/* Note: start and end must be within the same ram block.  */
2045
void cpu_physical_memory_reset_dirty(ram_addr_t start, ram_addr_t end,
2046
                                     int dirty_flags)
2047
{
2048
    CPUState *env;
2049
    unsigned long length, start1;
2050
    int i;
2051

    
2052
    start &= TARGET_PAGE_MASK;
2053
    end = TARGET_PAGE_ALIGN(end);
2054

    
2055
    length = end - start;
2056
    if (length == 0)
2057
        return;
2058
    cpu_physical_memory_mask_dirty_range(start, length, dirty_flags);
2059

    
2060
    /* we modify the TLB cache so that the dirty bit will be set again
2061
       when accessing the range */
2062
    start1 = (unsigned long)qemu_safe_ram_ptr(start);
2063
    /* Check that we don't span multiple blocks - this breaks the
2064
       address comparisons below.  */
2065
    if ((unsigned long)qemu_safe_ram_ptr(end - 1) - start1
2066
            != (end - 1) - start) {
2067
        abort();
2068
    }
2069

    
2070
    for(env = first_cpu; env != NULL; env = env->next_cpu) {
2071
        int mmu_idx;
2072
        for (mmu_idx = 0; mmu_idx < NB_MMU_MODES; mmu_idx++) {
2073
            for(i = 0; i < CPU_TLB_SIZE; i++)
2074
                tlb_reset_dirty_range(&env->tlb_table[mmu_idx][i],
2075
                                      start1, length);
2076
        }
2077
    }
2078
}
2079

    
2080
int cpu_physical_memory_set_dirty_tracking(int enable)
2081
{
2082
    int ret = 0;
2083
    in_migration = enable;
2084
    ret = cpu_notify_migration_log(!!enable);
2085
    return ret;
2086
}
2087

    
2088
int cpu_physical_memory_get_dirty_tracking(void)
2089
{
2090
    return in_migration;
2091
}
2092

    
2093
int cpu_physical_sync_dirty_bitmap(target_phys_addr_t start_addr,
2094
                                   target_phys_addr_t end_addr)
2095
{
2096
    int ret;
2097

    
2098
    ret = cpu_notify_sync_dirty_bitmap(start_addr, end_addr);
2099
    return ret;
2100
}
2101

    
2102
int cpu_physical_log_start(target_phys_addr_t start_addr,
2103
                           ram_addr_t size)
2104
{
2105
    CPUPhysMemoryClient *client;
2106
    QLIST_FOREACH(client, &memory_client_list, list) {
2107
        if (client->log_start) {
2108
            int r = client->log_start(client, start_addr, size);
2109
            if (r < 0) {
2110
                return r;
2111
            }
2112
        }
2113
    }
2114
    return 0;
2115
}
2116

    
2117
int cpu_physical_log_stop(target_phys_addr_t start_addr,
2118
                          ram_addr_t size)
2119
{
2120
    CPUPhysMemoryClient *client;
2121
    QLIST_FOREACH(client, &memory_client_list, list) {
2122
        if (client->log_stop) {
2123
            int r = client->log_stop(client, start_addr, size);
2124
            if (r < 0) {
2125
                return r;
2126
            }
2127
        }
2128
    }
2129
    return 0;
2130
}
2131

    
2132
static inline void tlb_update_dirty(CPUTLBEntry *tlb_entry)
2133
{
2134
    ram_addr_t ram_addr;
2135
    void *p;
2136

    
2137
    if ((tlb_entry->addr_write & ~TARGET_PAGE_MASK) == IO_MEM_RAM) {
2138
        p = (void *)(unsigned long)((tlb_entry->addr_write & TARGET_PAGE_MASK)
2139
            + tlb_entry->addend);
2140
        ram_addr = qemu_ram_addr_from_host_nofail(p);
2141
        if (!cpu_physical_memory_is_dirty(ram_addr)) {
2142
            tlb_entry->addr_write |= TLB_NOTDIRTY;
2143
        }
2144
    }
2145
}
2146

    
2147
/* update the TLB according to the current state of the dirty bits */
2148
void cpu_tlb_update_dirty(CPUState *env)
2149
{
2150
    int i;
2151
    int mmu_idx;
2152
    for (mmu_idx = 0; mmu_idx < NB_MMU_MODES; mmu_idx++) {
2153
        for(i = 0; i < CPU_TLB_SIZE; i++)
2154
            tlb_update_dirty(&env->tlb_table[mmu_idx][i]);
2155
    }
2156
}
2157

    
2158
static inline void tlb_set_dirty1(CPUTLBEntry *tlb_entry, target_ulong vaddr)
2159
{
2160
    if (tlb_entry->addr_write == (vaddr | TLB_NOTDIRTY))
2161
        tlb_entry->addr_write = vaddr;
2162
}
2163

    
2164
/* update the TLB corresponding to virtual page vaddr
2165
   so that it is no longer dirty */
2166
static inline void tlb_set_dirty(CPUState *env, target_ulong vaddr)
2167
{
2168
    int i;
2169
    int mmu_idx;
2170

    
2171
    vaddr &= TARGET_PAGE_MASK;
2172
    i = (vaddr >> TARGET_PAGE_BITS) & (CPU_TLB_SIZE - 1);
2173
    for (mmu_idx = 0; mmu_idx < NB_MMU_MODES; mmu_idx++)
2174
        tlb_set_dirty1(&env->tlb_table[mmu_idx][i], vaddr);
2175
}
2176

    
2177
/* Our TLB does not support large pages, so remember the area covered by
2178
   large pages and trigger a full TLB flush if these are invalidated.  */
2179
static void tlb_add_large_page(CPUState *env, target_ulong vaddr,
2180
                               target_ulong size)
2181
{
2182
    target_ulong mask = ~(size - 1);
2183

    
2184
    if (env->tlb_flush_addr == (target_ulong)-1) {
2185
        env->tlb_flush_addr = vaddr & mask;
2186
        env->tlb_flush_mask = mask;
2187
        return;
2188
    }
2189
    /* Extend the existing region to include the new page.
2190
       This is a compromise between unnecessary flushes and the cost
2191
       of maintaining a full variable size TLB.  */
2192
    mask &= env->tlb_flush_mask;
2193
    while (((env->tlb_flush_addr ^ vaddr) & mask) != 0) {
2194
        mask <<= 1;
2195
    }
2196
    env->tlb_flush_addr &= mask;
2197
    env->tlb_flush_mask = mask;
2198
}
2199

    
2200
/* Add a new TLB entry. At most one entry for a given virtual address
2201
   is permitted. Only a single TARGET_PAGE_SIZE region is mapped, the
2202
   supplied size is only used by tlb_flush_page.  */
2203
void tlb_set_page(CPUState *env, target_ulong vaddr,
2204
                  target_phys_addr_t paddr, int prot,
2205
                  int mmu_idx, target_ulong size)
2206
{
2207
    PhysPageDesc *p;
2208
    unsigned long pd;
2209
    unsigned int index;
2210
    target_ulong address;
2211
    target_ulong code_address;
2212
    unsigned long addend;
2213
    CPUTLBEntry *te;
2214
    CPUWatchpoint *wp;
2215
    target_phys_addr_t iotlb;
2216

    
2217
    assert(size >= TARGET_PAGE_SIZE);
2218
    if (size != TARGET_PAGE_SIZE) {
2219
        tlb_add_large_page(env, vaddr, size);
2220
    }
2221
    p = phys_page_find(paddr >> TARGET_PAGE_BITS);
2222
    if (!p) {
2223
        pd = IO_MEM_UNASSIGNED;
2224
    } else {
2225
        pd = p->phys_offset;
2226
    }
2227
#if defined(DEBUG_TLB)
2228
    printf("tlb_set_page: vaddr=" TARGET_FMT_lx " paddr=0x" TARGET_FMT_plx
2229
           " prot=%x idx=%d pd=0x%08lx\n",
2230
           vaddr, paddr, prot, mmu_idx, pd);
2231
#endif
2232

    
2233
    address = vaddr;
2234
    if ((pd & ~TARGET_PAGE_MASK) > IO_MEM_ROM && !(pd & IO_MEM_ROMD)) {
2235
        /* IO memory case (romd handled later) */
2236
        address |= TLB_MMIO;
2237
    }
2238
    addend = (unsigned long)qemu_get_ram_ptr(pd & TARGET_PAGE_MASK);
2239
    if ((pd & ~TARGET_PAGE_MASK) <= IO_MEM_ROM) {
2240
        /* Normal RAM.  */
2241
        iotlb = pd & TARGET_PAGE_MASK;
2242
        if ((pd & ~TARGET_PAGE_MASK) == IO_MEM_RAM)
2243
            iotlb |= IO_MEM_NOTDIRTY;
2244
        else
2245
            iotlb |= IO_MEM_ROM;
2246
    } else {
2247
        /* IO handlers are currently passed a physical address.
2248
           It would be nice to pass an offset from the base address
2249
           of that region.  This would avoid having to special case RAM,
2250
           and avoid full address decoding in every device.
2251
           We can't use the high bits of pd for this because
2252
           IO_MEM_ROMD uses these as a ram address.  */
2253
        iotlb = (pd & ~TARGET_PAGE_MASK);
2254
        if (p) {
2255
            iotlb += p->region_offset;
2256
        } else {
2257
            iotlb += paddr;
2258
        }
2259
    }
2260

    
2261
    code_address = address;
2262
    /* Make accesses to pages with watchpoints go via the
2263
       watchpoint trap routines.  */
2264
    QTAILQ_FOREACH(wp, &env->watchpoints, entry) {
2265
        if (vaddr == (wp->vaddr & TARGET_PAGE_MASK)) {
2266
            /* Avoid trapping reads of pages with a write breakpoint. */
2267
            if ((prot & PAGE_WRITE) || (wp->flags & BP_MEM_READ)) {
2268
                iotlb = io_mem_watch + paddr;
2269
                address |= TLB_MMIO;
2270
                break;
2271
            }
2272
        }
2273
    }
2274

    
2275
    index = (vaddr >> TARGET_PAGE_BITS) & (CPU_TLB_SIZE - 1);
2276
    env->iotlb[mmu_idx][index] = iotlb - vaddr;
2277
    te = &env->tlb_table[mmu_idx][index];
2278
    te->addend = addend - vaddr;
2279
    if (prot & PAGE_READ) {
2280
        te->addr_read = address;
2281
    } else {
2282
        te->addr_read = -1;
2283
    }
2284

    
2285
    if (prot & PAGE_EXEC) {
2286
        te->addr_code = code_address;
2287
    } else {
2288
        te->addr_code = -1;
2289
    }
2290
    if (prot & PAGE_WRITE) {
2291
        if ((pd & ~TARGET_PAGE_MASK) == IO_MEM_ROM ||
2292
            (pd & IO_MEM_ROMD)) {
2293
            /* Write access calls the I/O callback.  */
2294
            te->addr_write = address | TLB_MMIO;
2295
        } else if ((pd & ~TARGET_PAGE_MASK) == IO_MEM_RAM &&
2296
                   !cpu_physical_memory_is_dirty(pd)) {
2297
            te->addr_write = address | TLB_NOTDIRTY;
2298
        } else {
2299
            te->addr_write = address;
2300
        }
2301
    } else {
2302
        te->addr_write = -1;
2303
    }
2304
}
2305

    
2306
#else
2307

    
2308
void tlb_flush(CPUState *env, int flush_global)
2309
{
2310
}
2311

    
2312
void tlb_flush_page(CPUState *env, target_ulong addr)
2313
{
2314
}
2315

    
2316
/*
2317
 * Walks guest process memory "regions" one by one
2318
 * and calls callback function 'fn' for each region.
2319
 */
2320

    
2321
struct walk_memory_regions_data
2322
{
2323
    walk_memory_regions_fn fn;
2324
    void *priv;
2325
    unsigned long start;
2326
    int prot;
2327
};
2328

    
2329
static int walk_memory_regions_end(struct walk_memory_regions_data *data,
2330
                                   abi_ulong end, int new_prot)
2331
{
2332
    if (data->start != -1ul) {
2333
        int rc = data->fn(data->priv, data->start, end, data->prot);
2334
        if (rc != 0) {
2335
            return rc;
2336
        }
2337
    }
2338

    
2339
    data->start = (new_prot ? end : -1ul);
2340
    data->prot = new_prot;
2341

    
2342
    return 0;
2343
}
2344

    
2345
static int walk_memory_regions_1(struct walk_memory_regions_data *data,
2346
                                 abi_ulong base, int level, void **lp)
2347
{
2348
    abi_ulong pa;
2349
    int i, rc;
2350

    
2351
    if (*lp == NULL) {
2352
        return walk_memory_regions_end(data, base, 0);
2353
    }
2354

    
2355
    if (level == 0) {
2356
        PageDesc *pd = *lp;
2357
        for (i = 0; i < L2_SIZE; ++i) {
2358
            int prot = pd[i].flags;
2359

    
2360
            pa = base | (i << TARGET_PAGE_BITS);
2361
            if (prot != data->prot) {
2362
                rc = walk_memory_regions_end(data, pa, prot);
2363
                if (rc != 0) {
2364
                    return rc;
2365
                }
2366
            }
2367
        }
2368
    } else {
2369
        void **pp = *lp;
2370
        for (i = 0; i < L2_SIZE; ++i) {
2371
            pa = base | ((abi_ulong)i <<
2372
                (TARGET_PAGE_BITS + L2_BITS * level));
2373
            rc = walk_memory_regions_1(data, pa, level - 1, pp + i);
2374
            if (rc != 0) {
2375
                return rc;
2376
            }
2377
        }
2378
    }
2379

    
2380
    return 0;
2381
}
2382

    
2383
int walk_memory_regions(void *priv, walk_memory_regions_fn fn)
2384
{
2385
    struct walk_memory_regions_data data;
2386
    unsigned long i;
2387

    
2388
    data.fn = fn;
2389
    data.priv = priv;
2390
    data.start = -1ul;
2391
    data.prot = 0;
2392

    
2393
    for (i = 0; i < V_L1_SIZE; i++) {
2394
        int rc = walk_memory_regions_1(&data, (abi_ulong)i << V_L1_SHIFT,
2395
                                       V_L1_SHIFT / L2_BITS - 1, l1_map + i);
2396
        if (rc != 0) {
2397
            return rc;
2398
        }
2399
    }
2400

    
2401
    return walk_memory_regions_end(&data, 0, 0);
2402
}
2403

    
2404
static int dump_region(void *priv, abi_ulong start,
2405
    abi_ulong end, unsigned long prot)
2406
{
2407
    FILE *f = (FILE *)priv;
2408

    
2409
    (void) fprintf(f, TARGET_ABI_FMT_lx"-"TARGET_ABI_FMT_lx
2410
        " "TARGET_ABI_FMT_lx" %c%c%c\n",
2411
        start, end, end - start,
2412
        ((prot & PAGE_READ) ? 'r' : '-'),
2413
        ((prot & PAGE_WRITE) ? 'w' : '-'),
2414
        ((prot & PAGE_EXEC) ? 'x' : '-'));
2415

    
2416
    return (0);
2417
}
2418

    
2419
/* dump memory mappings */
2420
void page_dump(FILE *f)
2421
{
2422
    (void) fprintf(f, "%-8s %-8s %-8s %s\n",
2423
            "start", "end", "size", "prot");
2424
    walk_memory_regions(f, dump_region);
2425
}
2426

    
2427
int page_get_flags(target_ulong address)
2428
{
2429
    PageDesc *p;
2430

    
2431
    p = page_find(address >> TARGET_PAGE_BITS);
2432
    if (!p)
2433
        return 0;
2434
    return p->flags;
2435
}
2436

    
2437
/* Modify the flags of a page and invalidate the code if necessary.
2438
   The flag PAGE_WRITE_ORG is positioned automatically depending
2439
   on PAGE_WRITE.  The mmap_lock should already be held.  */
2440
void page_set_flags(target_ulong start, target_ulong end, int flags)
2441
{
2442
    target_ulong addr, len;
2443

    
2444
    /* This function should never be called with addresses outside the
2445
       guest address space.  If this assert fires, it probably indicates
2446
       a missing call to h2g_valid.  */
2447
#if TARGET_ABI_BITS > L1_MAP_ADDR_SPACE_BITS
2448
    assert(end < ((abi_ulong)1 << L1_MAP_ADDR_SPACE_BITS));
2449
#endif
2450
    assert(start < end);
2451

    
2452
    start = start & TARGET_PAGE_MASK;
2453
    end = TARGET_PAGE_ALIGN(end);
2454

    
2455
    if (flags & PAGE_WRITE) {
2456
        flags |= PAGE_WRITE_ORG;
2457
    }
2458

    
2459
    for (addr = start, len = end - start;
2460
         len != 0;
2461
         len -= TARGET_PAGE_SIZE, addr += TARGET_PAGE_SIZE) {
2462
        PageDesc *p = page_find_alloc(addr >> TARGET_PAGE_BITS, 1);
2463

    
2464
        /* If the write protection bit is set, then we invalidate
2465
           the code inside.  */
2466
        if (!(p->flags & PAGE_WRITE) &&
2467
            (flags & PAGE_WRITE) &&
2468
            p->first_tb) {
2469
            tb_invalidate_phys_page(addr, 0, NULL);
2470
        }
2471
        p->flags = flags;
2472
    }
2473
}
2474

    
2475
int page_check_range(target_ulong start, target_ulong len, int flags)
2476
{
2477
    PageDesc *p;
2478
    target_ulong end;
2479
    target_ulong addr;
2480

    
2481
    /* This function should never be called with addresses outside the
2482
       guest address space.  If this assert fires, it probably indicates
2483
       a missing call to h2g_valid.  */
2484
#if TARGET_ABI_BITS > L1_MAP_ADDR_SPACE_BITS
2485
    assert(start < ((abi_ulong)1 << L1_MAP_ADDR_SPACE_BITS));
2486
#endif
2487

    
2488
    if (len == 0) {
2489
        return 0;
2490
    }
2491
    if (start + len - 1 < start) {
2492
        /* We've wrapped around.  */
2493
        return -1;
2494
    }
2495

    
2496
    end = TARGET_PAGE_ALIGN(start+len); /* must do before we loose bits in the next step */
2497
    start = start & TARGET_PAGE_MASK;
2498

    
2499
    for (addr = start, len = end - start;
2500
         len != 0;
2501
         len -= TARGET_PAGE_SIZE, addr += TARGET_PAGE_SIZE) {
2502
        p = page_find(addr >> TARGET_PAGE_BITS);
2503
        if( !p )
2504
            return -1;
2505
        if( !(p->flags & PAGE_VALID) )
2506
            return -1;
2507

    
2508
        if ((flags & PAGE_READ) && !(p->flags & PAGE_READ))
2509
            return -1;
2510
        if (flags & PAGE_WRITE) {
2511
            if (!(p->flags & PAGE_WRITE_ORG))
2512
                return -1;
2513
            /* unprotect the page if it was put read-only because it
2514
               contains translated code */
2515
            if (!(p->flags & PAGE_WRITE)) {
2516
                if (!page_unprotect(addr, 0, NULL))
2517
                    return -1;
2518
            }
2519
            return 0;
2520
        }
2521
    }
2522
    return 0;
2523
}
2524

    
2525
/* called from signal handler: invalidate the code and unprotect the
2526
   page. Return TRUE if the fault was successfully handled. */
2527
int page_unprotect(target_ulong address, unsigned long pc, void *puc)
2528
{
2529
    unsigned int prot;
2530
    PageDesc *p;
2531
    target_ulong host_start, host_end, addr;
2532

    
2533
    /* Technically this isn't safe inside a signal handler.  However we
2534
       know this only ever happens in a synchronous SEGV handler, so in
2535
       practice it seems to be ok.  */
2536
    mmap_lock();
2537

    
2538
    p = page_find(address >> TARGET_PAGE_BITS);
2539
    if (!p) {
2540
        mmap_unlock();
2541
        return 0;
2542
    }
2543

    
2544
    /* if the page was really writable, then we change its
2545
       protection back to writable */
2546
    if ((p->flags & PAGE_WRITE_ORG) && !(p->flags & PAGE_WRITE)) {
2547
        host_start = address & qemu_host_page_mask;
2548
        host_end = host_start + qemu_host_page_size;
2549

    
2550
        prot = 0;
2551
        for (addr = host_start ; addr < host_end ; addr += TARGET_PAGE_SIZE) {
2552
            p = page_find(addr >> TARGET_PAGE_BITS);
2553
            p->flags |= PAGE_WRITE;
2554
            prot |= p->flags;
2555

    
2556
            /* and since the content will be modified, we must invalidate
2557
               the corresponding translated code. */
2558
            tb_invalidate_phys_page(addr, pc, puc);
2559
#ifdef DEBUG_TB_CHECK
2560
            tb_invalidate_check(addr);
2561
#endif
2562
        }
2563
        mprotect((void *)g2h(host_start), qemu_host_page_size,
2564
                 prot & PAGE_BITS);
2565

    
2566
        mmap_unlock();
2567
        return 1;
2568
    }
2569
    mmap_unlock();
2570
    return 0;
2571
}
2572

    
2573
static inline void tlb_set_dirty(CPUState *env,
2574
                                 unsigned long addr, target_ulong vaddr)
2575
{
2576
}
2577
#endif /* defined(CONFIG_USER_ONLY) */
2578

    
2579
#if !defined(CONFIG_USER_ONLY)
2580

    
2581
#define SUBPAGE_IDX(addr) ((addr) & ~TARGET_PAGE_MASK)
2582
typedef struct subpage_t {
2583
    target_phys_addr_t base;
2584
    ram_addr_t sub_io_index[TARGET_PAGE_SIZE];
2585
    ram_addr_t region_offset[TARGET_PAGE_SIZE];
2586
} subpage_t;
2587

    
2588
static int subpage_register (subpage_t *mmio, uint32_t start, uint32_t end,
2589
                             ram_addr_t memory, ram_addr_t region_offset);
2590
static subpage_t *subpage_init (target_phys_addr_t base, ram_addr_t *phys,
2591
                                ram_addr_t orig_memory,
2592
                                ram_addr_t region_offset);
2593
#define CHECK_SUBPAGE(addr, start_addr, start_addr2, end_addr, end_addr2, \
2594
                      need_subpage)                                     \
2595
    do {                                                                \
2596
        if (addr > start_addr)                                          \
2597
            start_addr2 = 0;                                            \
2598
        else {                                                          \
2599
            start_addr2 = start_addr & ~TARGET_PAGE_MASK;               \
2600
            if (start_addr2 > 0)                                        \
2601
                need_subpage = 1;                                       \
2602
        }                                                               \
2603
                                                                        \
2604
        if ((start_addr + orig_size) - addr >= TARGET_PAGE_SIZE)        \
2605
            end_addr2 = TARGET_PAGE_SIZE - 1;                           \
2606
        else {                                                          \
2607
            end_addr2 = (start_addr + orig_size - 1) & ~TARGET_PAGE_MASK; \
2608
            if (end_addr2 < TARGET_PAGE_SIZE - 1)                       \
2609
                need_subpage = 1;                                       \
2610
        }                                                               \
2611
    } while (0)
2612

    
2613
/* register physical memory.
2614
   For RAM, 'size' must be a multiple of the target page size.
2615
   If (phys_offset & ~TARGET_PAGE_MASK) != 0, then it is an
2616
   io memory page.  The address used when calling the IO function is
2617
   the offset from the start of the region, plus region_offset.  Both
2618
   start_addr and region_offset are rounded down to a page boundary
2619
   before calculating this offset.  This should not be a problem unless
2620
   the low bits of start_addr and region_offset differ.  */
2621
void cpu_register_physical_memory_log(target_phys_addr_t start_addr,
2622
                                         ram_addr_t size,
2623
                                         ram_addr_t phys_offset,
2624
                                         ram_addr_t region_offset,
2625
                                         bool log_dirty)
2626
{
2627
    target_phys_addr_t addr, end_addr;
2628
    PhysPageDesc *p;
2629
    CPUState *env;
2630
    ram_addr_t orig_size = size;
2631
    subpage_t *subpage;
2632

    
2633
    assert(size);
2634
    cpu_notify_set_memory(start_addr, size, phys_offset, log_dirty);
2635

    
2636
    if (phys_offset == IO_MEM_UNASSIGNED) {
2637
        region_offset = start_addr;
2638
    }
2639
    region_offset &= TARGET_PAGE_MASK;
2640
    size = (size + TARGET_PAGE_SIZE - 1) & TARGET_PAGE_MASK;
2641
    end_addr = start_addr + (target_phys_addr_t)size;
2642

    
2643
    addr = start_addr;
2644
    do {
2645
        p = phys_page_find(addr >> TARGET_PAGE_BITS);
2646
        if (p && p->phys_offset != IO_MEM_UNASSIGNED) {
2647
            ram_addr_t orig_memory = p->phys_offset;
2648
            target_phys_addr_t start_addr2, end_addr2;
2649
            int need_subpage = 0;
2650

    
2651
            CHECK_SUBPAGE(addr, start_addr, start_addr2, end_addr, end_addr2,
2652
                          need_subpage);
2653
            if (need_subpage) {
2654
                if (!(orig_memory & IO_MEM_SUBPAGE)) {
2655
                    subpage = subpage_init((addr & TARGET_PAGE_MASK),
2656
                                           &p->phys_offset, orig_memory,
2657
                                           p->region_offset);
2658
                } else {
2659
                    subpage = io_mem_opaque[(orig_memory & ~TARGET_PAGE_MASK)
2660
                                            >> IO_MEM_SHIFT];
2661
                }
2662
                subpage_register(subpage, start_addr2, end_addr2, phys_offset,
2663
                                 region_offset);
2664
                p->region_offset = 0;
2665
            } else {
2666
                p->phys_offset = phys_offset;
2667
                if ((phys_offset & ~TARGET_PAGE_MASK) <= IO_MEM_ROM ||
2668
                    (phys_offset & IO_MEM_ROMD))
2669
                    phys_offset += TARGET_PAGE_SIZE;
2670
            }
2671
        } else {
2672
            p = phys_page_find_alloc(addr >> TARGET_PAGE_BITS, 1);
2673
            p->phys_offset = phys_offset;
2674
            p->region_offset = region_offset;
2675
            if ((phys_offset & ~TARGET_PAGE_MASK) <= IO_MEM_ROM ||
2676
                (phys_offset & IO_MEM_ROMD)) {
2677
                phys_offset += TARGET_PAGE_SIZE;
2678
            } else {
2679
                target_phys_addr_t start_addr2, end_addr2;
2680
                int need_subpage = 0;
2681

    
2682
                CHECK_SUBPAGE(addr, start_addr, start_addr2, end_addr,
2683
                              end_addr2, need_subpage);
2684

    
2685
                if (need_subpage) {
2686
                    subpage = subpage_init((addr & TARGET_PAGE_MASK),
2687
                                           &p->phys_offset, IO_MEM_UNASSIGNED,
2688
                                           addr & TARGET_PAGE_MASK);
2689
                    subpage_register(subpage, start_addr2, end_addr2,
2690
                                     phys_offset, region_offset);
2691
                    p->region_offset = 0;
2692
                }
2693
            }
2694
        }
2695
        region_offset += TARGET_PAGE_SIZE;
2696
        addr += TARGET_PAGE_SIZE;
2697
    } while (addr != end_addr);
2698

    
2699
    /* since each CPU stores ram addresses in its TLB cache, we must
2700
       reset the modified entries */
2701
    /* XXX: slow ! */
2702
    for(env = first_cpu; env != NULL; env = env->next_cpu) {
2703
        tlb_flush(env, 1);
2704
    }
2705
}
2706

    
2707
/* XXX: temporary until new memory mapping API */
2708
ram_addr_t cpu_get_physical_page_desc(target_phys_addr_t addr)
2709
{
2710
    PhysPageDesc *p;
2711

    
2712
    p = phys_page_find(addr >> TARGET_PAGE_BITS);
2713
    if (!p)
2714
        return IO_MEM_UNASSIGNED;
2715
    return p->phys_offset;
2716
}
2717

    
2718
void qemu_register_coalesced_mmio(target_phys_addr_t addr, ram_addr_t size)
2719
{
2720
    if (kvm_enabled())
2721
        kvm_coalesce_mmio_region(addr, size);
2722
}
2723

    
2724
void qemu_unregister_coalesced_mmio(target_phys_addr_t addr, ram_addr_t size)
2725
{
2726
    if (kvm_enabled())
2727
        kvm_uncoalesce_mmio_region(addr, size);
2728
}
2729

    
2730
void qemu_flush_coalesced_mmio_buffer(void)
2731
{
2732
    if (kvm_enabled())
2733
        kvm_flush_coalesced_mmio_buffer();
2734
}
2735

    
2736
#if defined(__linux__) && !defined(TARGET_S390X)
2737

    
2738
#include <sys/vfs.h>
2739

    
2740
#define HUGETLBFS_MAGIC       0x958458f6
2741

    
2742
static long gethugepagesize(const char *path)
2743
{
2744
    struct statfs fs;
2745
    int ret;
2746

    
2747
    do {
2748
        ret = statfs(path, &fs);
2749
    } while (ret != 0 && errno == EINTR);
2750

    
2751
    if (ret != 0) {
2752
        perror(path);
2753
        return 0;
2754
    }
2755

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

    
2759
    return fs.f_bsize;
2760
}
2761

    
2762
static void *file_ram_alloc(RAMBlock *block,
2763
                            ram_addr_t memory,
2764
                            const char *path)
2765
{
2766
    char *filename;
2767
    void *area;
2768
    int fd;
2769
#ifdef MAP_POPULATE
2770
    int flags;
2771
#endif
2772
    unsigned long hpagesize;
2773

    
2774
    hpagesize = gethugepagesize(path);
2775
    if (!hpagesize) {
2776
        return NULL;
2777
    }
2778

    
2779
    if (memory < hpagesize) {
2780
        return NULL;
2781
    }
2782

    
2783
    if (kvm_enabled() && !kvm_has_sync_mmu()) {
2784
        fprintf(stderr, "host lacks kvm mmu notifiers, -mem-path unsupported\n");
2785
        return NULL;
2786
    }
2787

    
2788
    if (asprintf(&filename, "%s/qemu_back_mem.XXXXXX", path) == -1) {
2789
        return NULL;
2790
    }
2791

    
2792
    fd = mkstemp(filename);
2793
    if (fd < 0) {
2794
        perror("unable to create backing store for hugepages");
2795
        free(filename);
2796
        return NULL;
2797
    }
2798
    unlink(filename);
2799
    free(filename);
2800

    
2801
    memory = (memory+hpagesize-1) & ~(hpagesize-1);
2802

    
2803
    /*
2804
     * ftruncate is not supported by hugetlbfs in older
2805
     * hosts, so don't bother bailing out on errors.
2806
     * If anything goes wrong with it under other filesystems,
2807
     * mmap will fail.
2808
     */
2809
    if (ftruncate(fd, memory))
2810
        perror("ftruncate");
2811

    
2812
#ifdef MAP_POPULATE
2813
    /* NB: MAP_POPULATE won't exhaustively alloc all phys pages in the case
2814
     * MAP_PRIVATE is requested.  For mem_prealloc we mmap as MAP_SHARED
2815
     * to sidestep this quirk.
2816
     */
2817
    flags = mem_prealloc ? MAP_POPULATE | MAP_SHARED : MAP_PRIVATE;
2818
    area = mmap(0, memory, PROT_READ | PROT_WRITE, flags, fd, 0);
2819
#else
2820
    area = mmap(0, memory, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0);
2821
#endif
2822
    if (area == MAP_FAILED) {
2823
        perror("file_ram_alloc: can't mmap RAM pages");
2824
        close(fd);
2825
        return (NULL);
2826
    }
2827
    block->fd = fd;
2828
    return area;
2829
}
2830
#endif
2831

    
2832
static ram_addr_t find_ram_offset(ram_addr_t size)
2833
{
2834
    RAMBlock *block, *next_block;
2835
    ram_addr_t offset = 0, mingap = ULONG_MAX;
2836

    
2837
    if (QLIST_EMPTY(&ram_list.blocks))
2838
        return 0;
2839

    
2840
    QLIST_FOREACH(block, &ram_list.blocks, next) {
2841
        ram_addr_t end, next = ULONG_MAX;
2842

    
2843
        end = block->offset + block->length;
2844

    
2845
        QLIST_FOREACH(next_block, &ram_list.blocks, next) {
2846
            if (next_block->offset >= end) {
2847
                next = MIN(next, next_block->offset);
2848
            }
2849
        }
2850
        if (next - end >= size && next - end < mingap) {
2851
            offset =  end;
2852
            mingap = next - end;
2853
        }
2854
    }
2855
    return offset;
2856
}
2857

    
2858
static ram_addr_t last_ram_offset(void)
2859
{
2860
    RAMBlock *block;
2861
    ram_addr_t last = 0;
2862

    
2863
    QLIST_FOREACH(block, &ram_list.blocks, next)
2864
        last = MAX(last, block->offset + block->length);
2865

    
2866
    return last;
2867
}
2868

    
2869
ram_addr_t qemu_ram_alloc_from_ptr(DeviceState *dev, const char *name,
2870
                                   ram_addr_t size, void *host)
2871
{
2872
    RAMBlock *new_block, *block;
2873

    
2874
    size = TARGET_PAGE_ALIGN(size);
2875
    new_block = qemu_mallocz(sizeof(*new_block));
2876

    
2877
    if (dev && dev->parent_bus && dev->parent_bus->info->get_dev_path) {
2878
        char *id = dev->parent_bus->info->get_dev_path(dev);
2879
        if (id) {
2880
            snprintf(new_block->idstr, sizeof(new_block->idstr), "%s/", id);
2881
            qemu_free(id);
2882
        }
2883
    }
2884
    pstrcat(new_block->idstr, sizeof(new_block->idstr), name);
2885

    
2886
    QLIST_FOREACH(block, &ram_list.blocks, next) {
2887
        if (!strcmp(block->idstr, new_block->idstr)) {
2888
            fprintf(stderr, "RAMBlock \"%s\" already registered, abort!\n",
2889
                    new_block->idstr);
2890
            abort();
2891
        }
2892
    }
2893

    
2894
    new_block->offset = find_ram_offset(size);
2895
    if (host) {
2896
        new_block->host = host;
2897
        new_block->flags |= RAM_PREALLOC_MASK;
2898
    } else {
2899
        if (mem_path) {
2900
#if defined (__linux__) && !defined(TARGET_S390X)
2901
            new_block->host = file_ram_alloc(new_block, size, mem_path);
2902
            if (!new_block->host) {
2903
                new_block->host = qemu_vmalloc(size);
2904
                qemu_madvise(new_block->host, size, QEMU_MADV_MERGEABLE);
2905
            }
2906
#else
2907
            fprintf(stderr, "-mem-path option unsupported\n");
2908
            exit(1);
2909
#endif
2910
        } else {
2911
#if defined(TARGET_S390X) && defined(CONFIG_KVM)
2912
            /* S390 KVM requires the topmost vma of the RAM to be smaller than
2913
               an system defined value, which is at least 256GB. Larger systems
2914
               have larger values. We put the guest between the end of data
2915
               segment (system break) and this value. We use 32GB as a base to
2916
               have enough room for the system break to grow. */
2917
            new_block->host = mmap((void*)0x800000000, size,
2918
                                   PROT_EXEC|PROT_READ|PROT_WRITE,
2919
                                   MAP_SHARED | MAP_ANONYMOUS | MAP_FIXED, -1, 0);
2920
            if (new_block->host == MAP_FAILED) {
2921
                fprintf(stderr, "Allocating RAM failed\n");
2922
                abort();
2923
            }
2924
#else
2925
            if (xen_mapcache_enabled()) {
2926
                xen_ram_alloc(new_block->offset, size);
2927
            } else {
2928
                new_block->host = qemu_vmalloc(size);
2929
            }
2930
#endif
2931
            qemu_madvise(new_block->host, size, QEMU_MADV_MERGEABLE);
2932
        }
2933
    }
2934
    new_block->length = size;
2935

    
2936
    QLIST_INSERT_HEAD(&ram_list.blocks, new_block, next);
2937

    
2938
    ram_list.phys_dirty = qemu_realloc(ram_list.phys_dirty,
2939
                                       last_ram_offset() >> TARGET_PAGE_BITS);
2940
    memset(ram_list.phys_dirty + (new_block->offset >> TARGET_PAGE_BITS),
2941
           0xff, size >> TARGET_PAGE_BITS);
2942

    
2943
    if (kvm_enabled())
2944
        kvm_setup_guest_memory(new_block->host, size);
2945

    
2946
    return new_block->offset;
2947
}
2948

    
2949
ram_addr_t qemu_ram_alloc(DeviceState *dev, const char *name, ram_addr_t size)
2950
{
2951
    return qemu_ram_alloc_from_ptr(dev, name, size, NULL);
2952
}
2953

    
2954
void qemu_ram_free_from_ptr(ram_addr_t addr)
2955
{
2956
    RAMBlock *block;
2957

    
2958
    QLIST_FOREACH(block, &ram_list.blocks, next) {
2959
        if (addr == block->offset) {
2960
            QLIST_REMOVE(block, next);
2961
            qemu_free(block);
2962
            return;
2963
        }
2964
    }
2965
}
2966

    
2967
void qemu_ram_free(ram_addr_t addr)
2968
{
2969
    RAMBlock *block;
2970

    
2971
    QLIST_FOREACH(block, &ram_list.blocks, next) {
2972
        if (addr == block->offset) {
2973
            QLIST_REMOVE(block, next);
2974
            if (block->flags & RAM_PREALLOC_MASK) {
2975
                ;
2976
            } else if (mem_path) {
2977
#if defined (__linux__) && !defined(TARGET_S390X)
2978
                if (block->fd) {
2979
                    munmap(block->host, block->length);
2980
                    close(block->fd);
2981
                } else {
2982
                    qemu_vfree(block->host);
2983
                }
2984
#else
2985
                abort();
2986
#endif
2987
            } else {
2988
#if defined(TARGET_S390X) && defined(CONFIG_KVM)
2989
                munmap(block->host, block->length);
2990
#else
2991
                if (xen_mapcache_enabled()) {
2992
                    qemu_invalidate_entry(block->host);
2993
                } else {
2994
                    qemu_vfree(block->host);
2995
                }
2996
#endif
2997
            }
2998
            qemu_free(block);
2999
            return;
3000
        }
3001
    }
3002

    
3003
}
3004

    
3005
#ifndef _WIN32
3006
void qemu_ram_remap(ram_addr_t addr, ram_addr_t length)
3007
{
3008
    RAMBlock *block;
3009
    ram_addr_t offset;
3010
    int flags;
3011
    void *area, *vaddr;
3012

    
3013
    QLIST_FOREACH(block, &ram_list.blocks, next) {
3014
        offset = addr - block->offset;
3015
        if (offset < block->length) {
3016
            vaddr = block->host + offset;
3017
            if (block->flags & RAM_PREALLOC_MASK) {
3018
                ;
3019
            } else {
3020
                flags = MAP_FIXED;
3021
                munmap(vaddr, length);
3022
                if (mem_path) {
3023
#if defined(__linux__) && !defined(TARGET_S390X)
3024
                    if (block->fd) {
3025
#ifdef MAP_POPULATE
3026
                        flags |= mem_prealloc ? MAP_POPULATE | MAP_SHARED :
3027
                            MAP_PRIVATE;
3028
#else
3029
                        flags |= MAP_PRIVATE;
3030
#endif
3031
                        area = mmap(vaddr, length, PROT_READ | PROT_WRITE,
3032
                                    flags, block->fd, offset);
3033
                    } else {
3034
                        flags |= MAP_PRIVATE | MAP_ANONYMOUS;
3035
                        area = mmap(vaddr, length, PROT_READ | PROT_WRITE,
3036
                                    flags, -1, 0);
3037
                    }
3038
#else
3039
                    abort();
3040
#endif
3041
                } else {
3042
#if defined(TARGET_S390X) && defined(CONFIG_KVM)
3043
                    flags |= MAP_SHARED | MAP_ANONYMOUS;
3044
                    area = mmap(vaddr, length, PROT_EXEC|PROT_READ|PROT_WRITE,
3045
                                flags, -1, 0);
3046
#else
3047
                    flags |= MAP_PRIVATE | MAP_ANONYMOUS;
3048
                    area = mmap(vaddr, length, PROT_READ | PROT_WRITE,
3049
                                flags, -1, 0);
3050
#endif
3051
                }
3052
                if (area != vaddr) {
3053
                    fprintf(stderr, "Could not remap addr: %lx@%lx\n",
3054
                            length, addr);
3055
                    exit(1);
3056
                }
3057
                qemu_madvise(vaddr, length, QEMU_MADV_MERGEABLE);
3058
            }
3059
            return;
3060
        }
3061
    }
3062
}
3063
#endif /* !_WIN32 */
3064

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

3070
   It should not be used for general purpose DMA.
3071
   Use cpu_physical_memory_map/cpu_physical_memory_rw instead.
3072
 */
3073
void *qemu_get_ram_ptr(ram_addr_t addr)
3074
{
3075
    RAMBlock *block;
3076

    
3077
    QLIST_FOREACH(block, &ram_list.blocks, next) {
3078
        if (addr - block->offset < block->length) {
3079
            /* Move this entry to to start of the list.  */
3080
            if (block != QLIST_FIRST(&ram_list.blocks)) {
3081
                QLIST_REMOVE(block, next);
3082
                QLIST_INSERT_HEAD(&ram_list.blocks, block, next);
3083
            }
3084
            if (xen_mapcache_enabled()) {
3085
                /* We need to check if the requested address is in the RAM
3086
                 * because we don't want to map the entire memory in QEMU.
3087
                 */
3088
                if (block->offset == 0) {
3089
                    return qemu_map_cache(addr, 0, 1);
3090
                } else if (block->host == NULL) {
3091
                    block->host = xen_map_block(block->offset, block->length);
3092
                }
3093
            }
3094
            return block->host + (addr - block->offset);
3095
        }
3096
    }
3097

    
3098
    fprintf(stderr, "Bad ram offset %" PRIx64 "\n", (uint64_t)addr);
3099
    abort();
3100

    
3101
    return NULL;
3102
}
3103

    
3104
/* Return a host pointer to ram allocated with qemu_ram_alloc.
3105
 * Same as qemu_get_ram_ptr but avoid reordering ramblocks.
3106
 */
3107
void *qemu_safe_ram_ptr(ram_addr_t addr)
3108
{
3109
    RAMBlock *block;
3110

    
3111
    QLIST_FOREACH(block, &ram_list.blocks, next) {
3112
        if (addr - block->offset < block->length) {
3113
            if (xen_mapcache_enabled()) {
3114
                /* We need to check if the requested address is in the RAM
3115
                 * because we don't want to map the entire memory in QEMU.
3116
                 */
3117
                if (block->offset == 0) {
3118
                    return qemu_map_cache(addr, 0, 1);
3119
                } else if (block->host == NULL) {
3120
                    block->host = xen_map_block(block->offset, block->length);
3121
                }
3122
            }
3123
            return block->host + (addr - block->offset);
3124
        }
3125
    }
3126

    
3127
    fprintf(stderr, "Bad ram offset %" PRIx64 "\n", (uint64_t)addr);
3128
    abort();
3129

    
3130
    return NULL;
3131
}
3132

    
3133
void qemu_put_ram_ptr(void *addr)
3134
{
3135
    trace_qemu_put_ram_ptr(addr);
3136

    
3137
    if (xen_mapcache_enabled()) {
3138
        RAMBlock *block;
3139

    
3140
        QLIST_FOREACH(block, &ram_list.blocks, next) {
3141
            if (addr == block->host) {
3142
                break;
3143
            }
3144
        }
3145
        if (block && block->host) {
3146
            xen_unmap_block(block->host, block->length);
3147
            block->host = NULL;
3148
        } else {
3149
            qemu_map_cache_unlock(addr);
3150
        }
3151
    }
3152
}
3153

    
3154
int qemu_ram_addr_from_host(void *ptr, ram_addr_t *ram_addr)
3155
{
3156
    RAMBlock *block;
3157
    uint8_t *host = ptr;
3158

    
3159
    QLIST_FOREACH(block, &ram_list.blocks, next) {
3160
        /* This case append when the block is not mapped. */
3161
        if (block->host == NULL) {
3162
            continue;
3163
        }
3164
        if (host - block->host < block->length) {
3165
            *ram_addr = block->offset + (host - block->host);
3166
            return 0;
3167
        }
3168
    }
3169

    
3170
    if (xen_mapcache_enabled()) {
3171
        *ram_addr = qemu_ram_addr_from_mapcache(ptr);
3172
        return 0;
3173
    }
3174

    
3175
    return -1;
3176
}
3177

    
3178
/* Some of the softmmu routines need to translate from a host pointer
3179
   (typically a TLB entry) back to a ram offset.  */
3180
ram_addr_t qemu_ram_addr_from_host_nofail(void *ptr)
3181
{
3182
    ram_addr_t ram_addr;
3183

    
3184
    if (qemu_ram_addr_from_host(ptr, &ram_addr)) {
3185
        fprintf(stderr, "Bad ram pointer %p\n", ptr);
3186
        abort();
3187
    }
3188
    return ram_addr;
3189
}
3190

    
3191
static uint32_t unassigned_mem_readb(void *opaque, target_phys_addr_t addr)
3192
{
3193
#ifdef DEBUG_UNASSIGNED
3194
    printf("Unassigned mem read " TARGET_FMT_plx "\n", addr);
3195
#endif
3196
#if defined(TARGET_SPARC) || defined(TARGET_MICROBLAZE)
3197
    do_unassigned_access(addr, 0, 0, 0, 1);
3198
#endif
3199
    return 0;
3200
}
3201

    
3202
static uint32_t unassigned_mem_readw(void *opaque, target_phys_addr_t addr)
3203
{
3204
#ifdef DEBUG_UNASSIGNED
3205
    printf("Unassigned mem read " TARGET_FMT_plx "\n", addr);
3206
#endif
3207
#if defined(TARGET_SPARC) || defined(TARGET_MICROBLAZE)
3208
    do_unassigned_access(addr, 0, 0, 0, 2);
3209
#endif
3210
    return 0;
3211
}
3212

    
3213
static uint32_t unassigned_mem_readl(void *opaque, target_phys_addr_t addr)
3214
{
3215
#ifdef DEBUG_UNASSIGNED
3216
    printf("Unassigned mem read " TARGET_FMT_plx "\n", addr);
3217
#endif
3218
#if defined(TARGET_SPARC) || defined(TARGET_MICROBLAZE)
3219
    do_unassigned_access(addr, 0, 0, 0, 4);
3220
#endif
3221
    return 0;
3222
}
3223

    
3224
static void unassigned_mem_writeb(void *opaque, target_phys_addr_t addr, uint32_t val)
3225
{
3226
#ifdef DEBUG_UNASSIGNED
3227
    printf("Unassigned mem write " TARGET_FMT_plx " = 0x%x\n", addr, val);
3228
#endif
3229
#if defined(TARGET_SPARC) || defined(TARGET_MICROBLAZE)
3230
    do_unassigned_access(addr, 1, 0, 0, 1);
3231
#endif
3232
}
3233

    
3234
static void unassigned_mem_writew(void *opaque, target_phys_addr_t addr, uint32_t val)
3235
{
3236
#ifdef DEBUG_UNASSIGNED
3237
    printf("Unassigned mem write " TARGET_FMT_plx " = 0x%x\n", addr, val);
3238
#endif
3239
#if defined(TARGET_SPARC) || defined(TARGET_MICROBLAZE)
3240
    do_unassigned_access(addr, 1, 0, 0, 2);
3241
#endif
3242
}
3243

    
3244
static void unassigned_mem_writel(void *opaque, target_phys_addr_t addr, uint32_t val)
3245
{
3246
#ifdef DEBUG_UNASSIGNED
3247
    printf("Unassigned mem write " TARGET_FMT_plx " = 0x%x\n", addr, val);
3248
#endif
3249
#if defined(TARGET_SPARC) || defined(TARGET_MICROBLAZE)
3250
    do_unassigned_access(addr, 1, 0, 0, 4);
3251
#endif
3252
}
3253

    
3254
static CPUReadMemoryFunc * const unassigned_mem_read[3] = {
3255
    unassigned_mem_readb,
3256
    unassigned_mem_readw,
3257
    unassigned_mem_readl,
3258
};
3259

    
3260
static CPUWriteMemoryFunc * const unassigned_mem_write[3] = {
3261
    unassigned_mem_writeb,
3262
    unassigned_mem_writew,
3263
    unassigned_mem_writel,
3264
};
3265

    
3266
static void notdirty_mem_writeb(void *opaque, target_phys_addr_t ram_addr,
3267
                                uint32_t val)
3268
{
3269
    int dirty_flags;
3270
    dirty_flags = cpu_physical_memory_get_dirty_flags(ram_addr);
3271
    if (!(dirty_flags & CODE_DIRTY_FLAG)) {
3272
#if !defined(CONFIG_USER_ONLY)
3273
        tb_invalidate_phys_page_fast(ram_addr, 1);
3274
        dirty_flags = cpu_physical_memory_get_dirty_flags(ram_addr);
3275
#endif
3276
    }
3277
    stb_p(qemu_get_ram_ptr(ram_addr), val);
3278
    dirty_flags |= (0xff & ~CODE_DIRTY_FLAG);
3279
    cpu_physical_memory_set_dirty_flags(ram_addr, dirty_flags);
3280
    /* we remove the notdirty callback only if the code has been
3281
       flushed */
3282
    if (dirty_flags == 0xff)
3283
        tlb_set_dirty(cpu_single_env, cpu_single_env->mem_io_vaddr);
3284
}
3285

    
3286
static void notdirty_mem_writew(void *opaque, target_phys_addr_t ram_addr,
3287
                                uint32_t val)
3288
{
3289
    int dirty_flags;
3290
    dirty_flags = cpu_physical_memory_get_dirty_flags(ram_addr);
3291
    if (!(dirty_flags & CODE_DIRTY_FLAG)) {
3292
#if !defined(CONFIG_USER_ONLY)
3293
        tb_invalidate_phys_page_fast(ram_addr, 2);
3294
        dirty_flags = cpu_physical_memory_get_dirty_flags(ram_addr);
3295
#endif
3296
    }
3297
    stw_p(qemu_get_ram_ptr(ram_addr), val);
3298
    dirty_flags |= (0xff & ~CODE_DIRTY_FLAG);
3299
    cpu_physical_memory_set_dirty_flags(ram_addr, dirty_flags);
3300
    /* we remove the notdirty callback only if the code has been
3301
       flushed */
3302
    if (dirty_flags == 0xff)
3303
        tlb_set_dirty(cpu_single_env, cpu_single_env->mem_io_vaddr);
3304
}
3305

    
3306
static void notdirty_mem_writel(void *opaque, target_phys_addr_t ram_addr,
3307
                                uint32_t val)
3308
{
3309
    int dirty_flags;
3310
    dirty_flags = cpu_physical_memory_get_dirty_flags(ram_addr);
3311
    if (!(dirty_flags & CODE_DIRTY_FLAG)) {
3312
#if !defined(CONFIG_USER_ONLY)
3313
        tb_invalidate_phys_page_fast(ram_addr, 4);
3314
        dirty_flags = cpu_physical_memory_get_dirty_flags(ram_addr);
3315
#endif
3316
    }
3317
    stl_p(qemu_get_ram_ptr(ram_addr), val);
3318
    dirty_flags |= (0xff & ~CODE_DIRTY_FLAG);
3319
    cpu_physical_memory_set_dirty_flags(ram_addr, dirty_flags);
3320
    /* we remove the notdirty callback only if the code has been
3321
       flushed */
3322
    if (dirty_flags == 0xff)
3323
        tlb_set_dirty(cpu_single_env, cpu_single_env->mem_io_vaddr);
3324
}
3325

    
3326
static CPUReadMemoryFunc * const error_mem_read[3] = {
3327
    NULL, /* never used */
3328
    NULL, /* never used */
3329
    NULL, /* never used */
3330
};
3331

    
3332
static CPUWriteMemoryFunc * const notdirty_mem_write[3] = {
3333
    notdirty_mem_writeb,
3334
    notdirty_mem_writew,
3335
    notdirty_mem_writel,
3336
};
3337

    
3338
/* Generate a debug exception if a watchpoint has been hit.  */
3339
static void check_watchpoint(int offset, int len_mask, int flags)
3340
{
3341
    CPUState *env = cpu_single_env;
3342
    target_ulong pc, cs_base;
3343
    TranslationBlock *tb;
3344
    target_ulong vaddr;
3345
    CPUWatchpoint *wp;
3346
    int cpu_flags;
3347

    
3348
    if (env->watchpoint_hit) {
3349
        /* We re-entered the check after replacing the TB. Now raise
3350
         * the debug interrupt so that is will trigger after the
3351
         * current instruction. */
3352
        cpu_interrupt(env, CPU_INTERRUPT_DEBUG);
3353
        return;
3354
    }
3355
    vaddr = (env->mem_io_vaddr & TARGET_PAGE_MASK) + offset;
3356
    QTAILQ_FOREACH(wp, &env->watchpoints, entry) {
3357
        if ((vaddr == (wp->vaddr & len_mask) ||
3358
             (vaddr & wp->len_mask) == wp->vaddr) && (wp->flags & flags)) {
3359
            wp->flags |= BP_WATCHPOINT_HIT;
3360
            if (!env->watchpoint_hit) {
3361
                env->watchpoint_hit = wp;
3362
                tb = tb_find_pc(env->mem_io_pc);
3363
                if (!tb) {
3364
                    cpu_abort(env, "check_watchpoint: could not find TB for "
3365
                              "pc=%p", (void *)env->mem_io_pc);
3366
                }
3367
                cpu_restore_state(tb, env, env->mem_io_pc);
3368
                tb_phys_invalidate(tb, -1);
3369
                if (wp->flags & BP_STOP_BEFORE_ACCESS) {
3370
                    env->exception_index = EXCP_DEBUG;
3371
                } else {
3372
                    cpu_get_tb_cpu_state(env, &pc, &cs_base, &cpu_flags);
3373
                    tb_gen_code(env, pc, cs_base, cpu_flags, 1);
3374
                }
3375
                cpu_resume_from_signal(env, NULL);
3376
            }
3377
        } else {
3378
            wp->flags &= ~BP_WATCHPOINT_HIT;
3379
        }
3380
    }
3381
}
3382

    
3383
/* Watchpoint access routines.  Watchpoints are inserted using TLB tricks,
3384
   so these check for a hit then pass through to the normal out-of-line
3385
   phys routines.  */
3386
static uint32_t watch_mem_readb(void *opaque, target_phys_addr_t addr)
3387
{
3388
    check_watchpoint(addr & ~TARGET_PAGE_MASK, ~0x0, BP_MEM_READ);
3389
    return ldub_phys(addr);
3390
}
3391

    
3392
static uint32_t watch_mem_readw(void *opaque, target_phys_addr_t addr)
3393
{
3394
    check_watchpoint(addr & ~TARGET_PAGE_MASK, ~0x1, BP_MEM_READ);
3395
    return lduw_phys(addr);
3396
}
3397

    
3398
static uint32_t watch_mem_readl(void *opaque, target_phys_addr_t addr)
3399
{
3400
    check_watchpoint(addr & ~TARGET_PAGE_MASK, ~0x3, BP_MEM_READ);
3401
    return ldl_phys(addr);
3402
}
3403

    
3404
static void watch_mem_writeb(void *opaque, target_phys_addr_t addr,
3405
                             uint32_t val)
3406
{
3407
    check_watchpoint(addr & ~TARGET_PAGE_MASK, ~0x0, BP_MEM_WRITE);
3408
    stb_phys(addr, val);
3409
}
3410

    
3411
static void watch_mem_writew(void *opaque, target_phys_addr_t addr,
3412
                             uint32_t val)
3413
{
3414
    check_watchpoint(addr & ~TARGET_PAGE_MASK, ~0x1, BP_MEM_WRITE);
3415
    stw_phys(addr, val);
3416
}
3417

    
3418
static void watch_mem_writel(void *opaque, target_phys_addr_t addr,
3419
                             uint32_t val)
3420
{
3421
    check_watchpoint(addr & ~TARGET_PAGE_MASK, ~0x3, BP_MEM_WRITE);
3422
    stl_phys(addr, val);
3423
}
3424

    
3425
static CPUReadMemoryFunc * const watch_mem_read[3] = {
3426
    watch_mem_readb,
3427
    watch_mem_readw,
3428
    watch_mem_readl,
3429
};
3430

    
3431
static CPUWriteMemoryFunc * const watch_mem_write[3] = {
3432
    watch_mem_writeb,
3433
    watch_mem_writew,
3434
    watch_mem_writel,
3435
};
3436

    
3437
static inline uint32_t subpage_readlen (subpage_t *mmio,
3438
                                        target_phys_addr_t addr,
3439
                                        unsigned int len)
3440
{
3441
    unsigned int idx = SUBPAGE_IDX(addr);
3442
#if defined(DEBUG_SUBPAGE)
3443
    printf("%s: subpage %p len %d addr " TARGET_FMT_plx " idx %d\n", __func__,
3444
           mmio, len, addr, idx);
3445
#endif
3446

    
3447
    addr += mmio->region_offset[idx];
3448
    idx = mmio->sub_io_index[idx];
3449
    return io_mem_read[idx][len](io_mem_opaque[idx], addr);
3450
}
3451

    
3452
static inline void subpage_writelen (subpage_t *mmio, target_phys_addr_t addr,
3453
                                     uint32_t value, unsigned int len)
3454
{
3455
    unsigned int idx = SUBPAGE_IDX(addr);
3456
#if defined(DEBUG_SUBPAGE)
3457
    printf("%s: subpage %p len %d addr " TARGET_FMT_plx " idx %d value %08x\n",
3458
           __func__, mmio, len, addr, idx, value);
3459
#endif
3460

    
3461
    addr += mmio->region_offset[idx];
3462
    idx = mmio->sub_io_index[idx];
3463
    io_mem_write[idx][len](io_mem_opaque[idx], addr, value);
3464
}
3465

    
3466
static uint32_t subpage_readb (void *opaque, target_phys_addr_t addr)
3467
{
3468
    return subpage_readlen(opaque, addr, 0);
3469
}
3470

    
3471
static void subpage_writeb (void *opaque, target_phys_addr_t addr,
3472
                            uint32_t value)
3473
{
3474
    subpage_writelen(opaque, addr, value, 0);
3475
}
3476

    
3477
static uint32_t subpage_readw (void *opaque, target_phys_addr_t addr)
3478
{
3479
    return subpage_readlen(opaque, addr, 1);
3480
}
3481

    
3482
static void subpage_writew (void *opaque, target_phys_addr_t addr,
3483
                            uint32_t value)
3484
{
3485
    subpage_writelen(opaque, addr, value, 1);
3486
}
3487

    
3488
static uint32_t subpage_readl (void *opaque, target_phys_addr_t addr)
3489
{
3490
    return subpage_readlen(opaque, addr, 2);
3491
}
3492

    
3493
static void subpage_writel (void *opaque, target_phys_addr_t addr,
3494
                            uint32_t value)
3495
{
3496
    subpage_writelen(opaque, addr, value, 2);
3497
}
3498

    
3499
static CPUReadMemoryFunc * const subpage_read[] = {
3500
    &subpage_readb,
3501
    &subpage_readw,
3502
    &subpage_readl,
3503
};
3504

    
3505
static CPUWriteMemoryFunc * const subpage_write[] = {
3506
    &subpage_writeb,
3507
    &subpage_writew,
3508
    &subpage_writel,
3509
};
3510

    
3511
static int subpage_register (subpage_t *mmio, uint32_t start, uint32_t end,
3512
                             ram_addr_t memory, ram_addr_t region_offset)
3513
{
3514
    int idx, eidx;
3515

    
3516
    if (start >= TARGET_PAGE_SIZE || end >= TARGET_PAGE_SIZE)
3517
        return -1;
3518
    idx = SUBPAGE_IDX(start);
3519
    eidx = SUBPAGE_IDX(end);
3520
#if defined(DEBUG_SUBPAGE)
3521
    printf("%s: %p start %08x end %08x idx %08x eidx %08x mem %ld\n", __func__,
3522
           mmio, start, end, idx, eidx, memory);
3523
#endif
3524
    if ((memory & ~TARGET_PAGE_MASK) == IO_MEM_RAM)
3525
        memory = IO_MEM_UNASSIGNED;
3526
    memory = (memory >> IO_MEM_SHIFT) & (IO_MEM_NB_ENTRIES - 1);
3527
    for (; idx <= eidx; idx++) {
3528
        mmio->sub_io_index[idx] = memory;
3529
        mmio->region_offset[idx] = region_offset;
3530
    }
3531

    
3532
    return 0;
3533
}
3534

    
3535
static subpage_t *subpage_init (target_phys_addr_t base, ram_addr_t *phys,
3536
                                ram_addr_t orig_memory,
3537
                                ram_addr_t region_offset)
3538
{
3539
    subpage_t *mmio;
3540
    int subpage_memory;
3541

    
3542
    mmio = qemu_mallocz(sizeof(subpage_t));
3543

    
3544
    mmio->base = base;
3545
    subpage_memory = cpu_register_io_memory(subpage_read, subpage_write, mmio,
3546
                                            DEVICE_NATIVE_ENDIAN);
3547
#if defined(DEBUG_SUBPAGE)
3548
    printf("%s: %p base " TARGET_FMT_plx " len %08x %d\n", __func__,
3549
           mmio, base, TARGET_PAGE_SIZE, subpage_memory);
3550
#endif
3551
    *phys = subpage_memory | IO_MEM_SUBPAGE;
3552
    subpage_register(mmio, 0, TARGET_PAGE_SIZE-1, orig_memory, region_offset);
3553

    
3554
    return mmio;
3555
}
3556

    
3557
static int get_free_io_mem_idx(void)
3558
{
3559
    int i;
3560

    
3561
    for (i = 0; i<IO_MEM_NB_ENTRIES; i++)
3562
        if (!io_mem_used[i]) {
3563
            io_mem_used[i] = 1;
3564
            return i;
3565
        }
3566
    fprintf(stderr, "RAN out out io_mem_idx, max %d !\n", IO_MEM_NB_ENTRIES);
3567
    return -1;
3568
}
3569

    
3570
/*
3571
 * Usually, devices operate in little endian mode. There are devices out
3572
 * there that operate in big endian too. Each device gets byte swapped
3573
 * mmio if plugged onto a CPU that does the other endianness.
3574
 *
3575
 * CPU          Device           swap?
3576
 *
3577
 * little       little           no
3578
 * little       big              yes
3579
 * big          little           yes
3580
 * big          big              no
3581
 */
3582

    
3583
typedef struct SwapEndianContainer {
3584
    CPUReadMemoryFunc *read[3];
3585
    CPUWriteMemoryFunc *write[3];
3586
    void *opaque;
3587
} SwapEndianContainer;
3588

    
3589
static uint32_t swapendian_mem_readb (void *opaque, target_phys_addr_t addr)
3590
{
3591
    uint32_t val;
3592
    SwapEndianContainer *c = opaque;
3593
    val = c->read[0](c->opaque, addr);
3594
    return val;
3595
}
3596

    
3597
static uint32_t swapendian_mem_readw(void *opaque, target_phys_addr_t addr)
3598
{
3599
    uint32_t val;
3600
    SwapEndianContainer *c = opaque;
3601
    val = bswap16(c->read[1](c->opaque, addr));
3602
    return val;
3603
}
3604

    
3605
static uint32_t swapendian_mem_readl(void *opaque, target_phys_addr_t addr)
3606
{
3607
    uint32_t val;
3608
    SwapEndianContainer *c = opaque;
3609
    val = bswap32(c->read[2](c->opaque, addr));
3610
    return val;
3611
}
3612

    
3613
static CPUReadMemoryFunc * const swapendian_readfn[3]={
3614
    swapendian_mem_readb,
3615
    swapendian_mem_readw,
3616
    swapendian_mem_readl
3617
};
3618

    
3619
static void swapendian_mem_writeb(void *opaque, target_phys_addr_t addr,
3620
                                  uint32_t val)
3621
{
3622
    SwapEndianContainer *c = opaque;
3623
    c->write[0](c->opaque, addr, val);
3624
}
3625

    
3626
static void swapendian_mem_writew(void *opaque, target_phys_addr_t addr,
3627
                                  uint32_t val)
3628
{
3629
    SwapEndianContainer *c = opaque;
3630
    c->write[1](c->opaque, addr, bswap16(val));
3631
}
3632

    
3633
static void swapendian_mem_writel(void *opaque, target_phys_addr_t addr,
3634
                                  uint32_t val)
3635
{
3636
    SwapEndianContainer *c = opaque;
3637
    c->write[2](c->opaque, addr, bswap32(val));
3638
}
3639

    
3640
static CPUWriteMemoryFunc * const swapendian_writefn[3]={
3641
    swapendian_mem_writeb,
3642
    swapendian_mem_writew,
3643
    swapendian_mem_writel
3644
};
3645

    
3646
static void swapendian_init(int io_index)
3647
{
3648
    SwapEndianContainer *c = qemu_malloc(sizeof(SwapEndianContainer));
3649
    int i;
3650

    
3651
    /* Swap mmio for big endian targets */
3652
    c->opaque = io_mem_opaque[io_index];
3653
    for (i = 0; i < 3; i++) {
3654
        c->read[i] = io_mem_read[io_index][i];
3655
        c->write[i] = io_mem_write[io_index][i];
3656

    
3657
        io_mem_read[io_index][i] = swapendian_readfn[i];
3658
        io_mem_write[io_index][i] = swapendian_writefn[i];
3659
    }
3660
    io_mem_opaque[io_index] = c;
3661
}
3662

    
3663
static void swapendian_del(int io_index)
3664
{
3665
    if (io_mem_read[io_index][0] == swapendian_readfn[0]) {
3666
        qemu_free(io_mem_opaque[io_index]);
3667
    }
3668
}
3669

    
3670
/* mem_read and mem_write are arrays of functions containing the
3671
   function to access byte (index 0), word (index 1) and dword (index
3672
   2). Functions can be omitted with a NULL function pointer.
3673
   If io_index is non zero, the corresponding io zone is
3674
   modified. If it is zero, a new io zone is allocated. The return
3675
   value can be used with cpu_register_physical_memory(). (-1) is
3676
   returned if error. */
3677
static int cpu_register_io_memory_fixed(int io_index,
3678
                                        CPUReadMemoryFunc * const *mem_read,
3679
                                        CPUWriteMemoryFunc * const *mem_write,
3680
                                        void *opaque, enum device_endian endian)
3681
{
3682
    int i;
3683

    
3684
    if (io_index <= 0) {
3685
        io_index = get_free_io_mem_idx();
3686
        if (io_index == -1)
3687
            return io_index;
3688
    } else {
3689
        io_index >>= IO_MEM_SHIFT;
3690
        if (io_index >= IO_MEM_NB_ENTRIES)
3691
            return -1;
3692
    }
3693

    
3694
    for (i = 0; i < 3; ++i) {
3695
        io_mem_read[io_index][i]
3696
            = (mem_read[i] ? mem_read[i] : unassigned_mem_read[i]);
3697
    }
3698
    for (i = 0; i < 3; ++i) {
3699
        io_mem_write[io_index][i]
3700
            = (mem_write[i] ? mem_write[i] : unassigned_mem_write[i]);
3701
    }
3702
    io_mem_opaque[io_index] = opaque;
3703

    
3704
    switch (endian) {
3705
    case DEVICE_BIG_ENDIAN:
3706
#ifndef TARGET_WORDS_BIGENDIAN
3707
        swapendian_init(io_index);
3708
#endif
3709
        break;
3710
    case DEVICE_LITTLE_ENDIAN:
3711
#ifdef TARGET_WORDS_BIGENDIAN
3712
        swapendian_init(io_index);
3713
#endif
3714
        break;
3715
    case DEVICE_NATIVE_ENDIAN:
3716
    default:
3717
        break;
3718
    }
3719

    
3720
    return (io_index << IO_MEM_SHIFT);
3721
}
3722

    
3723
int cpu_register_io_memory(CPUReadMemoryFunc * const *mem_read,
3724
                           CPUWriteMemoryFunc * const *mem_write,
3725
                           void *opaque, enum device_endian endian)
3726
{
3727
    return cpu_register_io_memory_fixed(0, mem_read, mem_write, opaque, endian);
3728
}
3729

    
3730
void cpu_unregister_io_memory(int io_table_address)
3731
{
3732
    int i;
3733
    int io_index = io_table_address >> IO_MEM_SHIFT;
3734

    
3735
    swapendian_del(io_index);
3736

    
3737
    for (i=0;i < 3; i++) {
3738
        io_mem_read[io_index][i] = unassigned_mem_read[i];
3739
        io_mem_write[io_index][i] = unassigned_mem_write[i];
3740
    }
3741
    io_mem_opaque[io_index] = NULL;
3742
    io_mem_used[io_index] = 0;
3743
}
3744

    
3745
static void io_mem_init(void)
3746
{
3747
    int i;
3748

    
3749
    cpu_register_io_memory_fixed(IO_MEM_ROM, error_mem_read,
3750
                                 unassigned_mem_write, NULL,
3751
                                 DEVICE_NATIVE_ENDIAN);
3752
    cpu_register_io_memory_fixed(IO_MEM_UNASSIGNED, unassigned_mem_read,
3753
                                 unassigned_mem_write, NULL,
3754
                                 DEVICE_NATIVE_ENDIAN);
3755
    cpu_register_io_memory_fixed(IO_MEM_NOTDIRTY, error_mem_read,
3756
                                 notdirty_mem_write, NULL,
3757
                                 DEVICE_NATIVE_ENDIAN);
3758
    for (i=0; i<5; i++)
3759
        io_mem_used[i] = 1;
3760

    
3761
    io_mem_watch = cpu_register_io_memory(watch_mem_read,
3762
                                          watch_mem_write, NULL,
3763
                                          DEVICE_NATIVE_ENDIAN);
3764
}
3765

    
3766
#endif /* !defined(CONFIG_USER_ONLY) */
3767

    
3768
/* physical memory access (slow version, mainly for debug) */
3769
#if defined(CONFIG_USER_ONLY)
3770
int cpu_memory_rw_debug(CPUState *env, target_ulong addr,
3771
                        uint8_t *buf, int len, int is_write)
3772
{
3773
    int l, flags;
3774
    target_ulong page;
3775
    void * p;
3776

    
3777
    while (len > 0) {
3778
        page = addr & TARGET_PAGE_MASK;
3779
        l = (page + TARGET_PAGE_SIZE) - addr;
3780
        if (l > len)
3781
            l = len;
3782
        flags = page_get_flags(page);
3783
        if (!(flags & PAGE_VALID))
3784
            return -1;
3785
        if (is_write) {
3786
            if (!(flags & PAGE_WRITE))
3787
                return -1;
3788
            /* XXX: this code should not depend on lock_user */
3789
            if (!(p = lock_user(VERIFY_WRITE, addr, l, 0)))
3790
                return -1;
3791
            memcpy(p, buf, l);
3792
            unlock_user(p, addr, l);
3793
        } else {
3794
            if (!(flags & PAGE_READ))
3795
                return -1;
3796
            /* XXX: this code should not depend on lock_user */
3797
            if (!(p = lock_user(VERIFY_READ, addr, l, 1)))
3798
                return -1;
3799
            memcpy(buf, p, l);
3800
            unlock_user(p, addr, 0);
3801
        }
3802
        len -= l;
3803
        buf += l;
3804
        addr += l;
3805
    }
3806
    return 0;
3807
}
3808

    
3809
#else
3810
void cpu_physical_memory_rw(target_phys_addr_t addr, uint8_t *buf,
3811
                            int len, int is_write)
3812
{
3813
    int l, io_index;
3814
    uint8_t *ptr;
3815
    uint32_t val;
3816
    target_phys_addr_t page;
3817
    unsigned long pd;
3818
    PhysPageDesc *p;
3819

    
3820
    while (len > 0) {
3821
        page = addr & TARGET_PAGE_MASK;
3822
        l = (page + TARGET_PAGE_SIZE) - addr;
3823
        if (l > len)
3824
            l = len;
3825
        p = phys_page_find(page >> TARGET_PAGE_BITS);
3826
        if (!p) {
3827
            pd = IO_MEM_UNASSIGNED;
3828
        } else {
3829
            pd = p->phys_offset;
3830
        }
3831

    
3832
        if (is_write) {
3833
            if ((pd & ~TARGET_PAGE_MASK) != IO_MEM_RAM) {
3834
                target_phys_addr_t addr1 = addr;
3835
                io_index = (pd >> IO_MEM_SHIFT) & (IO_MEM_NB_ENTRIES - 1);
3836
                if (p)
3837
                    addr1 = (addr & ~TARGET_PAGE_MASK) + p->region_offset;
3838
                /* XXX: could force cpu_single_env to NULL to avoid
3839
                   potential bugs */
3840
                if (l >= 4 && ((addr1 & 3) == 0)) {
3841
                    /* 32 bit write access */
3842
                    val = ldl_p(buf);
3843
                    io_mem_write[io_index][2](io_mem_opaque[io_index], addr1, val);
3844
                    l = 4;
3845
                } else if (l >= 2 && ((addr1 & 1) == 0)) {
3846
                    /* 16 bit write access */
3847
                    val = lduw_p(buf);
3848
                    io_mem_write[io_index][1](io_mem_opaque[io_index], addr1, val);
3849
                    l = 2;
3850
                } else {
3851
                    /* 8 bit write access */
3852
                    val = ldub_p(buf);
3853
                    io_mem_write[io_index][0](io_mem_opaque[io_index], addr1, val);
3854
                    l = 1;
3855
                }
3856
            } else {
3857
                unsigned long addr1;
3858
                addr1 = (pd & TARGET_PAGE_MASK) + (addr & ~TARGET_PAGE_MASK);
3859
                /* RAM case */
3860
                ptr = qemu_get_ram_ptr(addr1);
3861
                memcpy(ptr, buf, l);
3862
                if (!cpu_physical_memory_is_dirty(addr1)) {
3863
                    /* invalidate code */
3864
                    tb_invalidate_phys_page_range(addr1, addr1 + l, 0);
3865
                    /* set dirty bit */
3866
                    cpu_physical_memory_set_dirty_flags(
3867
                        addr1, (0xff & ~CODE_DIRTY_FLAG));
3868
                }
3869
                qemu_put_ram_ptr(ptr);
3870
            }
3871
        } else {
3872
            if ((pd & ~TARGET_PAGE_MASK) > IO_MEM_ROM &&
3873
                !(pd & IO_MEM_ROMD)) {
3874
                target_phys_addr_t addr1 = addr;
3875
                /* I/O case */
3876
                io_index = (pd >> IO_MEM_SHIFT) & (IO_MEM_NB_ENTRIES - 1);
3877
                if (p)
3878
                    addr1 = (addr & ~TARGET_PAGE_MASK) + p->region_offset;
3879
                if (l >= 4 && ((addr1 & 3) == 0)) {
3880
                    /* 32 bit read access */
3881
                    val = io_mem_read[io_index][2](io_mem_opaque[io_index], addr1);
3882
                    stl_p(buf, val);
3883
                    l = 4;
3884
                } else if (l >= 2 && ((addr1 & 1) == 0)) {
3885
                    /* 16 bit read access */
3886
                    val = io_mem_read[io_index][1](io_mem_opaque[io_index], addr1);
3887
                    stw_p(buf, val);
3888
                    l = 2;
3889
                } else {
3890
                    /* 8 bit read access */
3891
                    val = io_mem_read[io_index][0](io_mem_opaque[io_index], addr1);
3892
                    stb_p(buf, val);
3893
                    l = 1;
3894
                }
3895
            } else {
3896
                /* RAM case */
3897
                ptr = qemu_get_ram_ptr(pd & TARGET_PAGE_MASK);
3898
                memcpy(buf, ptr + (addr & ~TARGET_PAGE_MASK), l);
3899
                qemu_put_ram_ptr(ptr);
3900
            }
3901
        }
3902
        len -= l;
3903
        buf += l;
3904
        addr += l;
3905
    }
3906
}
3907

    
3908
/* used for ROM loading : can write in RAM and ROM */
3909
void cpu_physical_memory_write_rom(target_phys_addr_t addr,
3910
                                   const uint8_t *buf, int len)
3911
{
3912
    int l;
3913
    uint8_t *ptr;
3914
    target_phys_addr_t page;
3915
    unsigned long pd;
3916
    PhysPageDesc *p;
3917

    
3918
    while (len > 0) {
3919
        page = addr & TARGET_PAGE_MASK;
3920
        l = (page + TARGET_PAGE_SIZE) - addr;
3921
        if (l > len)
3922
            l = len;
3923
        p = phys_page_find(page >> TARGET_PAGE_BITS);
3924
        if (!p) {
3925
            pd = IO_MEM_UNASSIGNED;
3926
        } else {
3927
            pd = p->phys_offset;
3928
        }
3929

    
3930
        if ((pd & ~TARGET_PAGE_MASK) != IO_MEM_RAM &&
3931
            (pd & ~TARGET_PAGE_MASK) != IO_MEM_ROM &&
3932
            !(pd & IO_MEM_ROMD)) {
3933
            /* do nothing */
3934
        } else {
3935
            unsigned long addr1;
3936
            addr1 = (pd & TARGET_PAGE_MASK) + (addr & ~TARGET_PAGE_MASK);
3937
            /* ROM/RAM case */
3938
            ptr = qemu_get_ram_ptr(addr1);
3939
            memcpy(ptr, buf, l);
3940
            qemu_put_ram_ptr(ptr);
3941
        }
3942
        len -= l;
3943
        buf += l;
3944
        addr += l;
3945
    }
3946
}
3947

    
3948
typedef struct {
3949
    void *buffer;
3950
    target_phys_addr_t addr;
3951
    target_phys_addr_t len;
3952
} BounceBuffer;
3953

    
3954
static BounceBuffer bounce;
3955

    
3956
typedef struct MapClient {
3957
    void *opaque;
3958
    void (*callback)(void *opaque);
3959
    QLIST_ENTRY(MapClient) link;
3960
} MapClient;
3961

    
3962
static QLIST_HEAD(map_client_list, MapClient) map_client_list
3963
    = QLIST_HEAD_INITIALIZER(map_client_list);
3964

    
3965
void *cpu_register_map_client(void *opaque, void (*callback)(void *opaque))
3966
{
3967
    MapClient *client = qemu_malloc(sizeof(*client));
3968

    
3969
    client->opaque = opaque;
3970
    client->callback = callback;
3971
    QLIST_INSERT_HEAD(&map_client_list, client, link);
3972
    return client;
3973
}
3974

    
3975
void cpu_unregister_map_client(void *_client)
3976
{
3977
    MapClient *client = (MapClient *)_client;
3978

    
3979
    QLIST_REMOVE(client, link);
3980
    qemu_free(client);
3981
}
3982

    
3983
static void cpu_notify_map_clients(void)
3984
{
3985
    MapClient *client;
3986

    
3987
    while (!QLIST_EMPTY(&map_client_list)) {
3988
        client = QLIST_FIRST(&map_client_list);
3989
        client->callback(client->opaque);
3990
        cpu_unregister_map_client(client);
3991
    }
3992
}
3993

    
3994
/* Map a physical memory region into a host virtual address.
3995
 * May map a subset of the requested range, given by and returned in *plen.
3996
 * May return NULL if resources needed to perform the mapping are exhausted.
3997
 * Use only for reads OR writes - not for read-modify-write operations.
3998
 * Use cpu_register_map_client() to know when retrying the map operation is
3999
 * likely to succeed.
4000
 */
4001
void *cpu_physical_memory_map(target_phys_addr_t addr,
4002
                              target_phys_addr_t *plen,
4003
                              int is_write)
4004
{
4005
    target_phys_addr_t len = *plen;
4006
    target_phys_addr_t done = 0;
4007
    int l;
4008
    uint8_t *ret = NULL;
4009
    uint8_t *ptr;
4010
    target_phys_addr_t page;
4011
    unsigned long pd;
4012
    PhysPageDesc *p;
4013
    unsigned long addr1;
4014

    
4015
    while (len > 0) {
4016
        page = addr & TARGET_PAGE_MASK;
4017
        l = (page + TARGET_PAGE_SIZE) - addr;
4018
        if (l > len)
4019
            l = len;
4020
        p = phys_page_find(page >> TARGET_PAGE_BITS);
4021
        if (!p) {
4022
            pd = IO_MEM_UNASSIGNED;
4023
        } else {
4024
            pd = p->phys_offset;
4025
        }
4026

    
4027
        if ((pd & ~TARGET_PAGE_MASK) != IO_MEM_RAM) {
4028
            if (done || bounce.buffer) {
4029
                break;
4030
            }
4031
            bounce.buffer = qemu_memalign(TARGET_PAGE_SIZE, TARGET_PAGE_SIZE);
4032
            bounce.addr = addr;
4033
            bounce.len = l;
4034
            if (!is_write) {
4035
                cpu_physical_memory_read(addr, bounce.buffer, l);
4036
            }
4037
            ptr = bounce.buffer;
4038
        } else {
4039
            addr1 = (pd & TARGET_PAGE_MASK) + (addr & ~TARGET_PAGE_MASK);
4040
            ptr = qemu_get_ram_ptr(addr1);
4041
        }
4042
        if (!done) {
4043
            ret = ptr;
4044
        } else if (ret + done != ptr) {
4045
            break;
4046
        }
4047

    
4048
        len -= l;
4049
        addr += l;
4050
        done += l;
4051
    }
4052
    *plen = done;
4053
    return ret;
4054
}
4055

    
4056
/* Unmaps a memory region previously mapped by cpu_physical_memory_map().
4057
 * Will also mark the memory as dirty if is_write == 1.  access_len gives
4058
 * the amount of memory that was actually read or written by the caller.
4059
 */
4060
void cpu_physical_memory_unmap(void *buffer, target_phys_addr_t len,
4061
                               int is_write, target_phys_addr_t access_len)
4062
{
4063
    if (buffer != bounce.buffer) {
4064
        if (is_write) {
4065
            ram_addr_t addr1 = qemu_ram_addr_from_host_nofail(buffer);
4066
            while (access_len) {
4067
                unsigned l;
4068
                l = TARGET_PAGE_SIZE;
4069
                if (l > access_len)
4070
                    l = access_len;
4071
                if (!cpu_physical_memory_is_dirty(addr1)) {
4072
                    /* invalidate code */
4073
                    tb_invalidate_phys_page_range(addr1, addr1 + l, 0);
4074
                    /* set dirty bit */
4075
                    cpu_physical_memory_set_dirty_flags(
4076
                        addr1, (0xff & ~CODE_DIRTY_FLAG));
4077
                }
4078
                addr1 += l;
4079
                access_len -= l;
4080
            }
4081
        }
4082
        if (xen_mapcache_enabled()) {
4083
            uint8_t *buffer1 = buffer;
4084
            uint8_t *end_buffer = buffer + len;
4085

    
4086
            while (buffer1 < end_buffer) {
4087
                qemu_put_ram_ptr(buffer1);
4088
                buffer1 += TARGET_PAGE_SIZE;
4089
            }
4090
        }
4091
        return;
4092
    }
4093
    if (is_write) {
4094
        cpu_physical_memory_write(bounce.addr, bounce.buffer, access_len);
4095
    }
4096
    qemu_vfree(bounce.buffer);
4097
    bounce.buffer = NULL;
4098
    cpu_notify_map_clients();
4099
}
4100

    
4101
/* warning: addr must be aligned */
4102
uint32_t ldl_phys(target_phys_addr_t addr)
4103
{
4104
    int io_index;
4105
    uint8_t *ptr;
4106
    uint32_t val;
4107
    unsigned long pd;
4108
    PhysPageDesc *p;
4109

    
4110
    p = phys_page_find(addr >> TARGET_PAGE_BITS);
4111
    if (!p) {
4112
        pd = IO_MEM_UNASSIGNED;
4113
    } else {
4114
        pd = p->phys_offset;
4115
    }
4116

    
4117
    if ((pd & ~TARGET_PAGE_MASK) > IO_MEM_ROM &&
4118
        !(pd & IO_MEM_ROMD)) {
4119
        /* I/O case */
4120
        io_index = (pd >> IO_MEM_SHIFT) & (IO_MEM_NB_ENTRIES - 1);
4121
        if (p)
4122
            addr = (addr & ~TARGET_PAGE_MASK) + p->region_offset;
4123
        val = io_mem_read[io_index][2](io_mem_opaque[io_index], addr);
4124
    } else {
4125
        /* RAM case */
4126
        ptr = qemu_get_ram_ptr(pd & TARGET_PAGE_MASK) +
4127
            (addr & ~TARGET_PAGE_MASK);
4128
        val = ldl_p(ptr);
4129
    }
4130
    return val;
4131
}
4132

    
4133
/* warning: addr must be aligned */
4134
uint64_t ldq_phys(target_phys_addr_t addr)
4135
{
4136
    int io_index;
4137
    uint8_t *ptr;
4138
    uint64_t val;
4139
    unsigned long pd;
4140
    PhysPageDesc *p;
4141

    
4142
    p = phys_page_find(addr >> TARGET_PAGE_BITS);
4143
    if (!p) {
4144
        pd = IO_MEM_UNASSIGNED;
4145
    } else {
4146
        pd = p->phys_offset;
4147
    }
4148

    
4149
    if ((pd & ~TARGET_PAGE_MASK) > IO_MEM_ROM &&
4150
        !(pd & IO_MEM_ROMD)) {
4151
        /* I/O case */
4152
        io_index = (pd >> IO_MEM_SHIFT) & (IO_MEM_NB_ENTRIES - 1);
4153
        if (p)
4154
            addr = (addr & ~TARGET_PAGE_MASK) + p->region_offset;
4155
#ifdef TARGET_WORDS_BIGENDIAN
4156
        val = (uint64_t)io_mem_read[io_index][2](io_mem_opaque[io_index], addr) << 32;
4157
        val |= io_mem_read[io_index][2](io_mem_opaque[io_index], addr + 4);
4158
#else
4159
        val = io_mem_read[io_index][2](io_mem_opaque[io_index], addr);
4160
        val |= (uint64_t)io_mem_read[io_index][2](io_mem_opaque[io_index], addr + 4) << 32;
4161
#endif
4162
    } else {
4163
        /* RAM case */
4164
        ptr = qemu_get_ram_ptr(pd & TARGET_PAGE_MASK) +
4165
            (addr & ~TARGET_PAGE_MASK);
4166
        val = ldq_p(ptr);
4167
    }
4168
    return val;
4169
}
4170

    
4171
/* XXX: optimize */
4172
uint32_t ldub_phys(target_phys_addr_t addr)
4173
{
4174
    uint8_t val;
4175
    cpu_physical_memory_read(addr, &val, 1);
4176
    return val;
4177
}
4178

    
4179
/* warning: addr must be aligned */
4180
uint32_t lduw_phys(target_phys_addr_t addr)
4181
{
4182
    int io_index;
4183
    uint8_t *ptr;
4184
    uint64_t val;
4185
    unsigned long pd;
4186
    PhysPageDesc *p;
4187

    
4188
    p = phys_page_find(addr >> TARGET_PAGE_BITS);
4189
    if (!p) {
4190
        pd = IO_MEM_UNASSIGNED;
4191
    } else {
4192
        pd = p->phys_offset;
4193
    }
4194

    
4195
    if ((pd & ~TARGET_PAGE_MASK) > IO_MEM_ROM &&
4196
        !(pd & IO_MEM_ROMD)) {
4197
        /* I/O case */
4198
        io_index = (pd >> IO_MEM_SHIFT) & (IO_MEM_NB_ENTRIES - 1);
4199
        if (p)
4200
            addr = (addr & ~TARGET_PAGE_MASK) + p->region_offset;
4201
        val = io_mem_read[io_index][1](io_mem_opaque[io_index], addr);
4202
    } else {
4203
        /* RAM case */
4204
        ptr = qemu_get_ram_ptr(pd & TARGET_PAGE_MASK) +
4205
            (addr & ~TARGET_PAGE_MASK);
4206
        val = lduw_p(ptr);
4207
    }
4208
    return val;
4209
}
4210

    
4211
/* warning: addr must be aligned. The ram page is not masked as dirty
4212
   and the code inside is not invalidated. It is useful if the dirty
4213
   bits are used to track modified PTEs */
4214
void stl_phys_notdirty(target_phys_addr_t addr, uint32_t val)
4215
{
4216
    int io_index;
4217
    uint8_t *ptr;
4218
    unsigned long pd;
4219
    PhysPageDesc *p;
4220

    
4221
    p = phys_page_find(addr >> TARGET_PAGE_BITS);
4222
    if (!p) {
4223
        pd = IO_MEM_UNASSIGNED;
4224
    } else {
4225
        pd = p->phys_offset;
4226
    }
4227

    
4228
    if ((pd & ~TARGET_PAGE_MASK) != IO_MEM_RAM) {
4229
        io_index = (pd >> IO_MEM_SHIFT) & (IO_MEM_NB_ENTRIES - 1);
4230
        if (p)
4231
            addr = (addr & ~TARGET_PAGE_MASK) + p->region_offset;
4232
        io_mem_write[io_index][2](io_mem_opaque[io_index], addr, val);
4233
    } else {
4234
        unsigned long addr1 = (pd & TARGET_PAGE_MASK) + (addr & ~TARGET_PAGE_MASK);
4235
        ptr = qemu_get_ram_ptr(addr1);
4236
        stl_p(ptr, val);
4237

    
4238
        if (unlikely(in_migration)) {
4239
            if (!cpu_physical_memory_is_dirty(addr1)) {
4240
                /* invalidate code */
4241
                tb_invalidate_phys_page_range(addr1, addr1 + 4, 0);
4242
                /* set dirty bit */
4243
                cpu_physical_memory_set_dirty_flags(
4244
                    addr1, (0xff & ~CODE_DIRTY_FLAG));
4245
            }
4246
        }
4247
    }
4248
}
4249

    
4250
void stq_phys_notdirty(target_phys_addr_t addr, uint64_t val)
4251
{
4252
    int io_index;
4253
    uint8_t *ptr;
4254
    unsigned long pd;
4255
    PhysPageDesc *p;
4256

    
4257
    p = phys_page_find(addr >> TARGET_PAGE_BITS);
4258
    if (!p) {
4259
        pd = IO_MEM_UNASSIGNED;
4260
    } else {
4261
        pd = p->phys_offset;
4262
    }
4263

    
4264
    if ((pd & ~TARGET_PAGE_MASK) != IO_MEM_RAM) {
4265
        io_index = (pd >> IO_MEM_SHIFT) & (IO_MEM_NB_ENTRIES - 1);
4266
        if (p)
4267
            addr = (addr & ~TARGET_PAGE_MASK) + p->region_offset;
4268
#ifdef TARGET_WORDS_BIGENDIAN
4269
        io_mem_write[io_index][2](io_mem_opaque[io_index], addr, val >> 32);
4270
        io_mem_write[io_index][2](io_mem_opaque[io_index], addr + 4, val);
4271
#else
4272
        io_mem_write[io_index][2](io_mem_opaque[io_index], addr, val);
4273
        io_mem_write[io_index][2](io_mem_opaque[io_index], addr + 4, val >> 32);
4274
#endif
4275
    } else {
4276
        ptr = qemu_get_ram_ptr(pd & TARGET_PAGE_MASK) +
4277
            (addr & ~TARGET_PAGE_MASK);
4278
        stq_p(ptr, val);
4279
    }
4280
}
4281

    
4282
/* warning: addr must be aligned */
4283
void stl_phys(target_phys_addr_t addr, uint32_t val)
4284
{
4285
    int io_index;
4286
    uint8_t *ptr;
4287
    unsigned long pd;
4288
    PhysPageDesc *p;
4289

    
4290
    p = phys_page_find(addr >> TARGET_PAGE_BITS);
4291
    if (!p) {
4292
        pd = IO_MEM_UNASSIGNED;
4293
    } else {
4294
        pd = p->phys_offset;
4295
    }
4296

    
4297
    if ((pd & ~TARGET_PAGE_MASK) != IO_MEM_RAM) {
4298
        io_index = (pd >> IO_MEM_SHIFT) & (IO_MEM_NB_ENTRIES - 1);
4299
        if (p)
4300
            addr = (addr & ~TARGET_PAGE_MASK) + p->region_offset;
4301
        io_mem_write[io_index][2](io_mem_opaque[io_index], addr, val);
4302
    } else {
4303
        unsigned long addr1;
4304
        addr1 = (pd & TARGET_PAGE_MASK) + (addr & ~TARGET_PAGE_MASK);
4305
        /* RAM case */
4306
        ptr = qemu_get_ram_ptr(addr1);
4307
        stl_p(ptr, val);
4308
        if (!cpu_physical_memory_is_dirty(addr1)) {
4309
            /* invalidate code */
4310
            tb_invalidate_phys_page_range(addr1, addr1 + 4, 0);
4311
            /* set dirty bit */
4312
            cpu_physical_memory_set_dirty_flags(addr1,
4313
                (0xff & ~CODE_DIRTY_FLAG));
4314
        }
4315
    }
4316
}
4317

    
4318
/* XXX: optimize */
4319
void stb_phys(target_phys_addr_t addr, uint32_t val)
4320
{
4321
    uint8_t v = val;
4322
    cpu_physical_memory_write(addr, &v, 1);
4323
}
4324

    
4325
/* warning: addr must be aligned */
4326
void stw_phys(target_phys_addr_t addr, uint32_t val)
4327
{
4328
    int io_index;
4329
    uint8_t *ptr;
4330
    unsigned long pd;
4331
    PhysPageDesc *p;
4332

    
4333
    p = phys_page_find(addr >> TARGET_PAGE_BITS);
4334
    if (!p) {
4335
        pd = IO_MEM_UNASSIGNED;
4336
    } else {
4337
        pd = p->phys_offset;
4338
    }
4339

    
4340
    if ((pd & ~TARGET_PAGE_MASK) != IO_MEM_RAM) {
4341
        io_index = (pd >> IO_MEM_SHIFT) & (IO_MEM_NB_ENTRIES - 1);
4342
        if (p)
4343
            addr = (addr & ~TARGET_PAGE_MASK) + p->region_offset;
4344
        io_mem_write[io_index][1](io_mem_opaque[io_index], addr, val);
4345
    } else {
4346
        unsigned long addr1;
4347
        addr1 = (pd & TARGET_PAGE_MASK) + (addr & ~TARGET_PAGE_MASK);
4348
        /* RAM case */
4349
        ptr = qemu_get_ram_ptr(addr1);
4350
        stw_p(ptr, val);
4351
        if (!cpu_physical_memory_is_dirty(addr1)) {
4352
            /* invalidate code */
4353
            tb_invalidate_phys_page_range(addr1, addr1 + 2, 0);
4354
            /* set dirty bit */
4355
            cpu_physical_memory_set_dirty_flags(addr1,
4356
                (0xff & ~CODE_DIRTY_FLAG));
4357
        }
4358
    }
4359
}
4360

    
4361
/* XXX: optimize */
4362
void stq_phys(target_phys_addr_t addr, uint64_t val)
4363
{
4364
    val = tswap64(val);
4365
    cpu_physical_memory_write(addr, &val, 8);
4366
}
4367

    
4368
/* virtual memory access for debug (includes writing to ROM) */
4369
int cpu_memory_rw_debug(CPUState *env, target_ulong addr,
4370
                        uint8_t *buf, int len, int is_write)
4371
{
4372
    int l;
4373
    target_phys_addr_t phys_addr;
4374
    target_ulong page;
4375

    
4376
    while (len > 0) {
4377
        page = addr & TARGET_PAGE_MASK;
4378
        phys_addr = cpu_get_phys_page_debug(env, page);
4379
        /* if no physical page mapped, return an error */
4380
        if (phys_addr == -1)
4381
            return -1;
4382
        l = (page + TARGET_PAGE_SIZE) - addr;
4383
        if (l > len)
4384
            l = len;
4385
        phys_addr += (addr & ~TARGET_PAGE_MASK);
4386
        if (is_write)
4387
            cpu_physical_memory_write_rom(phys_addr, buf, l);
4388
        else
4389
            cpu_physical_memory_rw(phys_addr, buf, l, is_write);
4390
        len -= l;
4391
        buf += l;
4392
        addr += l;
4393
    }
4394
    return 0;
4395
}
4396
#endif
4397

    
4398
/* in deterministic execution mode, instructions doing device I/Os
4399
   must be at the end of the TB */
4400
void cpu_io_recompile(CPUState *env, void *retaddr)
4401
{
4402
    TranslationBlock *tb;
4403
    uint32_t n, cflags;
4404
    target_ulong pc, cs_base;
4405
    uint64_t flags;
4406

    
4407
    tb = tb_find_pc((unsigned long)retaddr);
4408
    if (!tb) {
4409
        cpu_abort(env, "cpu_io_recompile: could not find TB for pc=%p", 
4410
                  retaddr);
4411
    }
4412
    n = env->icount_decr.u16.low + tb->icount;
4413
    cpu_restore_state(tb, env, (unsigned long)retaddr);
4414
    /* Calculate how many instructions had been executed before the fault
4415
       occurred.  */
4416
    n = n - env->icount_decr.u16.low;
4417
    /* Generate a new TB ending on the I/O insn.  */
4418
    n++;
4419
    /* On MIPS and SH, delay slot instructions can only be restarted if
4420
       they were already the first instruction in the TB.  If this is not
4421
       the first instruction in a TB then re-execute the preceding
4422
       branch.  */
4423
#if defined(TARGET_MIPS)
4424
    if ((env->hflags & MIPS_HFLAG_BMASK) != 0 && n > 1) {
4425
        env->active_tc.PC -= 4;
4426
        env->icount_decr.u16.low++;
4427
        env->hflags &= ~MIPS_HFLAG_BMASK;
4428
    }
4429
#elif defined(TARGET_SH4)
4430
    if ((env->flags & ((DELAY_SLOT | DELAY_SLOT_CONDITIONAL))) != 0
4431
            && n > 1) {
4432
        env->pc -= 2;
4433
        env->icount_decr.u16.low++;
4434
        env->flags &= ~(DELAY_SLOT | DELAY_SLOT_CONDITIONAL);
4435
    }
4436
#endif
4437
    /* This should never happen.  */
4438
    if (n > CF_COUNT_MASK)
4439
        cpu_abort(env, "TB too big during recompile");
4440

    
4441
    cflags = n | CF_LAST_IO;
4442
    pc = tb->pc;
4443
    cs_base = tb->cs_base;
4444
    flags = tb->flags;
4445
    tb_phys_invalidate(tb, -1);
4446
    /* FIXME: In theory this could raise an exception.  In practice
4447
       we have already translated the block once so it's probably ok.  */
4448
    tb_gen_code(env, pc, cs_base, flags, cflags);
4449
    /* TODO: If env->pc != tb->pc (i.e. the faulting instruction was not
4450
       the first in the TB) then we end up generating a whole new TB and
4451
       repeating the fault, which is horribly inefficient.
4452
       Better would be to execute just this insn uncached, or generate a
4453
       second new TB.  */
4454
    cpu_resume_from_signal(env, NULL);
4455
}
4456

    
4457
#if !defined(CONFIG_USER_ONLY)
4458

    
4459
void dump_exec_info(FILE *f, fprintf_function cpu_fprintf)
4460
{
4461
    int i, target_code_size, max_target_code_size;
4462
    int direct_jmp_count, direct_jmp2_count, cross_page;
4463
    TranslationBlock *tb;
4464

    
4465
    target_code_size = 0;
4466
    max_target_code_size = 0;
4467
    cross_page = 0;
4468
    direct_jmp_count = 0;
4469
    direct_jmp2_count = 0;
4470
    for(i = 0; i < nb_tbs; i++) {
4471
        tb = &tbs[i];
4472
        target_code_size += tb->size;
4473
        if (tb->size > max_target_code_size)
4474
            max_target_code_size = tb->size;
4475
        if (tb->page_addr[1] != -1)
4476
            cross_page++;
4477
        if (tb->tb_next_offset[0] != 0xffff) {
4478
            direct_jmp_count++;
4479
            if (tb->tb_next_offset[1] != 0xffff) {
4480
                direct_jmp2_count++;
4481
            }
4482
        }
4483
    }
4484
    /* XXX: avoid using doubles ? */
4485
    cpu_fprintf(f, "Translation buffer state:\n");
4486
    cpu_fprintf(f, "gen code size       %td/%ld\n",
4487
                code_gen_ptr - code_gen_buffer, code_gen_buffer_max_size);
4488
    cpu_fprintf(f, "TB count            %d/%d\n", 
4489
                nb_tbs, code_gen_max_blocks);
4490
    cpu_fprintf(f, "TB avg target size  %d max=%d bytes\n",
4491
                nb_tbs ? target_code_size / nb_tbs : 0,
4492
                max_target_code_size);
4493
    cpu_fprintf(f, "TB avg host size    %td bytes (expansion ratio: %0.1f)\n",
4494
                nb_tbs ? (code_gen_ptr - code_gen_buffer) / nb_tbs : 0,
4495
                target_code_size ? (double) (code_gen_ptr - code_gen_buffer) / target_code_size : 0);
4496
    cpu_fprintf(f, "cross page TB count %d (%d%%)\n",
4497
            cross_page,
4498
            nb_tbs ? (cross_page * 100) / nb_tbs : 0);
4499
    cpu_fprintf(f, "direct jump count   %d (%d%%) (2 jumps=%d %d%%)\n",
4500
                direct_jmp_count,
4501
                nb_tbs ? (direct_jmp_count * 100) / nb_tbs : 0,
4502
                direct_jmp2_count,
4503
                nb_tbs ? (direct_jmp2_count * 100) / nb_tbs : 0);
4504
    cpu_fprintf(f, "\nStatistics:\n");
4505
    cpu_fprintf(f, "TB flush count      %d\n", tb_flush_count);
4506
    cpu_fprintf(f, "TB invalidate count %d\n", tb_phys_invalidate_count);
4507
    cpu_fprintf(f, "TLB flush count     %d\n", tlb_flush_count);
4508
    tcg_dump_info(f, cpu_fprintf);
4509
}
4510

    
4511
#define MMUSUFFIX _cmmu
4512
#define GETPC() NULL
4513
#define env cpu_single_env
4514
#define SOFTMMU_CODE_ACCESS
4515

    
4516
#define SHIFT 0
4517
#include "softmmu_template.h"
4518

    
4519
#define SHIFT 1
4520
#include "softmmu_template.h"
4521

    
4522
#define SHIFT 2
4523
#include "softmmu_template.h"
4524

    
4525
#define SHIFT 3
4526
#include "softmmu_template.h"
4527

    
4528
#undef env
4529

    
4530
#endif