Statistics
| Branch: | Revision:

root / exec.c @ fb8b2735

History | View | Annotate | Download (133.1 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
#include <signal.h>
40
#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
41
#include <sys/param.h>
42
#if __FreeBSD_version >= 700104
43
#define HAVE_KINFO_GETVMMAP
44
#define sigqueue sigqueue_freebsd  /* avoid redefinition */
45
#include <sys/time.h>
46
#include <sys/proc.h>
47
#include <machine/profile.h>
48
#define _KERNEL
49
#include <sys/user.h>
50
#undef _KERNEL
51
#undef sigqueue
52
#include <libutil.h>
53
#endif
54
#endif
55
#else /* !CONFIG_USER_ONLY */
56
#include "xen-mapcache.h"
57
#endif
58

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

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

    
68
//#define DEBUG_IOPORT
69
//#define DEBUG_SUBPAGE
70

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

    
76
#define SMC_BITMAP_USE_THRESHOLD 10
77

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
200
static void io_mem_init(void);
201

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
387
#undef ALLOC
388

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
595
    return 0;
596
}
597

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

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

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

    
622
    return env;
623
}
624

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

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

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

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

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

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

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

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

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

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

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

    
738
    nb_tbs = 0;
739

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

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

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

    
753
#ifdef DEBUG_TB_CHECK
754

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

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

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

    
790
#endif
791

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

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

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

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

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

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

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

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

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

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

    
885
    tb_invalidated_flag = 1;
886

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

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

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

    
912
    tb_phys_invalidate_count++;
913
}
914

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
1220
#if defined(TARGET_HAS_SMC) || 1
1221

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

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

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

    
1257
#endif /* TARGET_HAS_SMC */
1258
}
1259

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

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

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

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

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

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

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

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

    
1331
static void tb_reset_jump_recursive(TranslationBlock *tb);
1332

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

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

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

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

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

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

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

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

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

    
1408
{
1409
}
1410

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

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

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

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

    
1442
    tlb_flush_page(env, addr);
1443

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

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

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

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

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

    
1473
    qemu_free(watchpoint);
1474
}
1475

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

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

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

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

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

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

    
1506
    breakpoint_invalidate(env, pc);
1507

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
1664
CPUInterruptHandler cpu_interrupt_handler = tcg_handle_interrupt;
1665

    
1666
#else /* CONFIG_USER_ONLY */
1667

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
1920
    return new_env;
1921
}
1922

    
1923
#if !defined(CONFIG_USER_ONLY)
1924

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

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

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

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

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

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

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

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

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

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

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

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

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

    
2013
    tlb_flush_jmp_cache(env, addr);
2014
}
2015

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
2307
#else
2308

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

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

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

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

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

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

    
2343
    return 0;
2344
}
2345

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

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

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

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

    
2381
    return 0;
2382
}
2383

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

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

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

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

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

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

    
2417
    return (0);
2418
}
2419

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
2580
#if !defined(CONFIG_USER_ONLY)
2581

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
2739
#include <sys/vfs.h>
2740

    
2741
#define HUGETLBFS_MAGIC       0x958458f6
2742

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

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

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

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

    
2760
    return fs.f_bsize;
2761
}
2762

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
2867
    return last;
2868
}
2869

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

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

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

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

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

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

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

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

    
2947
    return new_block->offset;
2948
}
2949

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

    
2955
void qemu_ram_free(ram_addr_t addr)
2956
{
2957
    RAMBlock *block;
2958

    
2959
    QLIST_FOREACH(block, &ram_list.blocks, next) {
2960
        if (addr == block->offset) {
2961
            QLIST_REMOVE(block, next);
2962
            if (block->flags & RAM_PREALLOC_MASK) {
2963
                ;
2964
            } else if (mem_path) {
2965
#if defined (__linux__) && !defined(TARGET_S390X)
2966
                if (block->fd) {
2967
                    munmap(block->host, block->length);
2968
                    close(block->fd);
2969
                } else {
2970
                    qemu_vfree(block->host);
2971
                }
2972
#else
2973
                abort();
2974
#endif
2975
            } else {
2976
#if defined(TARGET_S390X) && defined(CONFIG_KVM)
2977
                munmap(block->host, block->length);
2978
#else
2979
                if (xen_mapcache_enabled()) {
2980
                    qemu_invalidate_entry(block->host);
2981
                } else {
2982
                    qemu_vfree(block->host);
2983
                }
2984
#endif
2985
            }
2986
            qemu_free(block);
2987
            return;
2988
        }
2989
    }
2990

    
2991
}
2992

    
2993
#ifndef _WIN32
2994
void qemu_ram_remap(ram_addr_t addr, ram_addr_t length)
2995
{
2996
    RAMBlock *block;
2997
    ram_addr_t offset;
2998
    int flags;
2999
    void *area, *vaddr;
3000

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

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

3058
   It should not be used for general purpose DMA.
3059
   Use cpu_physical_memory_map/cpu_physical_memory_rw instead.
3060
 */
3061
void *qemu_get_ram_ptr(ram_addr_t addr)
3062
{
3063
    RAMBlock *block;
3064

    
3065
    QLIST_FOREACH(block, &ram_list.blocks, next) {
3066
        if (addr - block->offset < block->length) {
3067
            /* Move this entry to to start of the list.  */
3068
            if (block != QLIST_FIRST(&ram_list.blocks)) {
3069
                QLIST_REMOVE(block, next);
3070
                QLIST_INSERT_HEAD(&ram_list.blocks, block, next);
3071
            }
3072
            if (xen_mapcache_enabled()) {
3073
                /* We need to check if the requested address is in the RAM
3074
                 * because we don't want to map the entire memory in QEMU.
3075
                 */
3076
                if (block->offset == 0) {
3077
                    return qemu_map_cache(addr, 0, 1);
3078
                } else if (block->host == NULL) {
3079
                    block->host = xen_map_block(block->offset, block->length);
3080
                }
3081
            }
3082
            return block->host + (addr - block->offset);
3083
        }
3084
    }
3085

    
3086
    fprintf(stderr, "Bad ram offset %" PRIx64 "\n", (uint64_t)addr);
3087
    abort();
3088

    
3089
    return NULL;
3090
}
3091

    
3092
/* Return a host pointer to ram allocated with qemu_ram_alloc.
3093
 * Same as qemu_get_ram_ptr but avoid reordering ramblocks.
3094
 */
3095
void *qemu_safe_ram_ptr(ram_addr_t addr)
3096
{
3097
    RAMBlock *block;
3098

    
3099
    QLIST_FOREACH(block, &ram_list.blocks, next) {
3100
        if (addr - block->offset < block->length) {
3101
            if (xen_mapcache_enabled()) {
3102
                /* We need to check if the requested address is in the RAM
3103
                 * because we don't want to map the entire memory in QEMU.
3104
                 */
3105
                if (block->offset == 0) {
3106
                    return qemu_map_cache(addr, 0, 1);
3107
                } else if (block->host == NULL) {
3108
                    block->host = xen_map_block(block->offset, block->length);
3109
                }
3110
            }
3111
            return block->host + (addr - block->offset);
3112
        }
3113
    }
3114

    
3115
    fprintf(stderr, "Bad ram offset %" PRIx64 "\n", (uint64_t)addr);
3116
    abort();
3117

    
3118
    return NULL;
3119
}
3120

    
3121
void qemu_put_ram_ptr(void *addr)
3122
{
3123
    trace_qemu_put_ram_ptr(addr);
3124

    
3125
    if (xen_mapcache_enabled()) {
3126
        RAMBlock *block;
3127

    
3128
        QLIST_FOREACH(block, &ram_list.blocks, next) {
3129
            if (addr == block->host) {
3130
                break;
3131
            }
3132
        }
3133
        if (block && block->host) {
3134
            xen_unmap_block(block->host, block->length);
3135
            block->host = NULL;
3136
        } else {
3137
            qemu_map_cache_unlock(addr);
3138
        }
3139
    }
3140
}
3141

    
3142
int qemu_ram_addr_from_host(void *ptr, ram_addr_t *ram_addr)
3143
{
3144
    RAMBlock *block;
3145
    uint8_t *host = ptr;
3146

    
3147
    QLIST_FOREACH(block, &ram_list.blocks, next) {
3148
        /* This case append when the block is not mapped. */
3149
        if (block->host == NULL) {
3150
            continue;
3151
        }
3152
        if (host - block->host < block->length) {
3153
            *ram_addr = block->offset + (host - block->host);
3154
            return 0;
3155
        }
3156
    }
3157

    
3158
    if (xen_mapcache_enabled()) {
3159
        *ram_addr = qemu_ram_addr_from_mapcache(ptr);
3160
        return 0;
3161
    }
3162

    
3163
    return -1;
3164
}
3165

    
3166
/* Some of the softmmu routines need to translate from a host pointer
3167
   (typically a TLB entry) back to a ram offset.  */
3168
ram_addr_t qemu_ram_addr_from_host_nofail(void *ptr)
3169
{
3170
    ram_addr_t ram_addr;
3171

    
3172
    if (qemu_ram_addr_from_host(ptr, &ram_addr)) {
3173
        fprintf(stderr, "Bad ram pointer %p\n", ptr);
3174
        abort();
3175
    }
3176
    return ram_addr;
3177
}
3178

    
3179
static uint32_t unassigned_mem_readb(void *opaque, target_phys_addr_t addr)
3180
{
3181
#ifdef DEBUG_UNASSIGNED
3182
    printf("Unassigned mem read " TARGET_FMT_plx "\n", addr);
3183
#endif
3184
#if defined(TARGET_SPARC) || defined(TARGET_MICROBLAZE)
3185
    do_unassigned_access(addr, 0, 0, 0, 1);
3186
#endif
3187
    return 0;
3188
}
3189

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

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

    
3212
static void unassigned_mem_writeb(void *opaque, target_phys_addr_t addr, uint32_t val)
3213
{
3214
#ifdef DEBUG_UNASSIGNED
3215
    printf("Unassigned mem write " TARGET_FMT_plx " = 0x%x\n", addr, val);
3216
#endif
3217
#if defined(TARGET_SPARC) || defined(TARGET_MICROBLAZE)
3218
    do_unassigned_access(addr, 1, 0, 0, 1);
3219
#endif
3220
}
3221

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

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

    
3242
static CPUReadMemoryFunc * const unassigned_mem_read[3] = {
3243
    unassigned_mem_readb,
3244
    unassigned_mem_readw,
3245
    unassigned_mem_readl,
3246
};
3247

    
3248
static CPUWriteMemoryFunc * const unassigned_mem_write[3] = {
3249
    unassigned_mem_writeb,
3250
    unassigned_mem_writew,
3251
    unassigned_mem_writel,
3252
};
3253

    
3254
static void notdirty_mem_writeb(void *opaque, target_phys_addr_t ram_addr,
3255
                                uint32_t val)
3256
{
3257
    int dirty_flags;
3258
    dirty_flags = cpu_physical_memory_get_dirty_flags(ram_addr);
3259
    if (!(dirty_flags & CODE_DIRTY_FLAG)) {
3260
#if !defined(CONFIG_USER_ONLY)
3261
        tb_invalidate_phys_page_fast(ram_addr, 1);
3262
        dirty_flags = cpu_physical_memory_get_dirty_flags(ram_addr);
3263
#endif
3264
    }
3265
    stb_p(qemu_get_ram_ptr(ram_addr), val);
3266
    dirty_flags |= (0xff & ~CODE_DIRTY_FLAG);
3267
    cpu_physical_memory_set_dirty_flags(ram_addr, dirty_flags);
3268
    /* we remove the notdirty callback only if the code has been
3269
       flushed */
3270
    if (dirty_flags == 0xff)
3271
        tlb_set_dirty(cpu_single_env, cpu_single_env->mem_io_vaddr);
3272
}
3273

    
3274
static void notdirty_mem_writew(void *opaque, target_phys_addr_t ram_addr,
3275
                                uint32_t val)
3276
{
3277
    int dirty_flags;
3278
    dirty_flags = cpu_physical_memory_get_dirty_flags(ram_addr);
3279
    if (!(dirty_flags & CODE_DIRTY_FLAG)) {
3280
#if !defined(CONFIG_USER_ONLY)
3281
        tb_invalidate_phys_page_fast(ram_addr, 2);
3282
        dirty_flags = cpu_physical_memory_get_dirty_flags(ram_addr);
3283
#endif
3284
    }
3285
    stw_p(qemu_get_ram_ptr(ram_addr), val);
3286
    dirty_flags |= (0xff & ~CODE_DIRTY_FLAG);
3287
    cpu_physical_memory_set_dirty_flags(ram_addr, dirty_flags);
3288
    /* we remove the notdirty callback only if the code has been
3289
       flushed */
3290
    if (dirty_flags == 0xff)
3291
        tlb_set_dirty(cpu_single_env, cpu_single_env->mem_io_vaddr);
3292
}
3293

    
3294
static void notdirty_mem_writel(void *opaque, target_phys_addr_t ram_addr,
3295
                                uint32_t val)
3296
{
3297
    int dirty_flags;
3298
    dirty_flags = cpu_physical_memory_get_dirty_flags(ram_addr);
3299
    if (!(dirty_flags & CODE_DIRTY_FLAG)) {
3300
#if !defined(CONFIG_USER_ONLY)
3301
        tb_invalidate_phys_page_fast(ram_addr, 4);
3302
        dirty_flags = cpu_physical_memory_get_dirty_flags(ram_addr);
3303
#endif
3304
    }
3305
    stl_p(qemu_get_ram_ptr(ram_addr), val);
3306
    dirty_flags |= (0xff & ~CODE_DIRTY_FLAG);
3307
    cpu_physical_memory_set_dirty_flags(ram_addr, dirty_flags);
3308
    /* we remove the notdirty callback only if the code has been
3309
       flushed */
3310
    if (dirty_flags == 0xff)
3311
        tlb_set_dirty(cpu_single_env, cpu_single_env->mem_io_vaddr);
3312
}
3313

    
3314
static CPUReadMemoryFunc * const error_mem_read[3] = {
3315
    NULL, /* never used */
3316
    NULL, /* never used */
3317
    NULL, /* never used */
3318
};
3319

    
3320
static CPUWriteMemoryFunc * const notdirty_mem_write[3] = {
3321
    notdirty_mem_writeb,
3322
    notdirty_mem_writew,
3323
    notdirty_mem_writel,
3324
};
3325

    
3326
/* Generate a debug exception if a watchpoint has been hit.  */
3327
static void check_watchpoint(int offset, int len_mask, int flags)
3328
{
3329
    CPUState *env = cpu_single_env;
3330
    target_ulong pc, cs_base;
3331
    TranslationBlock *tb;
3332
    target_ulong vaddr;
3333
    CPUWatchpoint *wp;
3334
    int cpu_flags;
3335

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

    
3371
/* Watchpoint access routines.  Watchpoints are inserted using TLB tricks,
3372
   so these check for a hit then pass through to the normal out-of-line
3373
   phys routines.  */
3374
static uint32_t watch_mem_readb(void *opaque, target_phys_addr_t addr)
3375
{
3376
    check_watchpoint(addr & ~TARGET_PAGE_MASK, ~0x0, BP_MEM_READ);
3377
    return ldub_phys(addr);
3378
}
3379

    
3380
static uint32_t watch_mem_readw(void *opaque, target_phys_addr_t addr)
3381
{
3382
    check_watchpoint(addr & ~TARGET_PAGE_MASK, ~0x1, BP_MEM_READ);
3383
    return lduw_phys(addr);
3384
}
3385

    
3386
static uint32_t watch_mem_readl(void *opaque, target_phys_addr_t addr)
3387
{
3388
    check_watchpoint(addr & ~TARGET_PAGE_MASK, ~0x3, BP_MEM_READ);
3389
    return ldl_phys(addr);
3390
}
3391

    
3392
static void watch_mem_writeb(void *opaque, target_phys_addr_t addr,
3393
                             uint32_t val)
3394
{
3395
    check_watchpoint(addr & ~TARGET_PAGE_MASK, ~0x0, BP_MEM_WRITE);
3396
    stb_phys(addr, val);
3397
}
3398

    
3399
static void watch_mem_writew(void *opaque, target_phys_addr_t addr,
3400
                             uint32_t val)
3401
{
3402
    check_watchpoint(addr & ~TARGET_PAGE_MASK, ~0x1, BP_MEM_WRITE);
3403
    stw_phys(addr, val);
3404
}
3405

    
3406
static void watch_mem_writel(void *opaque, target_phys_addr_t addr,
3407
                             uint32_t val)
3408
{
3409
    check_watchpoint(addr & ~TARGET_PAGE_MASK, ~0x3, BP_MEM_WRITE);
3410
    stl_phys(addr, val);
3411
}
3412

    
3413
static CPUReadMemoryFunc * const watch_mem_read[3] = {
3414
    watch_mem_readb,
3415
    watch_mem_readw,
3416
    watch_mem_readl,
3417
};
3418

    
3419
static CPUWriteMemoryFunc * const watch_mem_write[3] = {
3420
    watch_mem_writeb,
3421
    watch_mem_writew,
3422
    watch_mem_writel,
3423
};
3424

    
3425
static inline uint32_t subpage_readlen (subpage_t *mmio,
3426
                                        target_phys_addr_t addr,
3427
                                        unsigned int len)
3428
{
3429
    unsigned int idx = SUBPAGE_IDX(addr);
3430
#if defined(DEBUG_SUBPAGE)
3431
    printf("%s: subpage %p len %d addr " TARGET_FMT_plx " idx %d\n", __func__,
3432
           mmio, len, addr, idx);
3433
#endif
3434

    
3435
    addr += mmio->region_offset[idx];
3436
    idx = mmio->sub_io_index[idx];
3437
    return io_mem_read[idx][len](io_mem_opaque[idx], addr);
3438
}
3439

    
3440
static inline void subpage_writelen (subpage_t *mmio, target_phys_addr_t addr,
3441
                                     uint32_t value, unsigned int len)
3442
{
3443
    unsigned int idx = SUBPAGE_IDX(addr);
3444
#if defined(DEBUG_SUBPAGE)
3445
    printf("%s: subpage %p len %d addr " TARGET_FMT_plx " idx %d value %08x\n",
3446
           __func__, mmio, len, addr, idx, value);
3447
#endif
3448

    
3449
    addr += mmio->region_offset[idx];
3450
    idx = mmio->sub_io_index[idx];
3451
    io_mem_write[idx][len](io_mem_opaque[idx], addr, value);
3452
}
3453

    
3454
static uint32_t subpage_readb (void *opaque, target_phys_addr_t addr)
3455
{
3456
    return subpage_readlen(opaque, addr, 0);
3457
}
3458

    
3459
static void subpage_writeb (void *opaque, target_phys_addr_t addr,
3460
                            uint32_t value)
3461
{
3462
    subpage_writelen(opaque, addr, value, 0);
3463
}
3464

    
3465
static uint32_t subpage_readw (void *opaque, target_phys_addr_t addr)
3466
{
3467
    return subpage_readlen(opaque, addr, 1);
3468
}
3469

    
3470
static void subpage_writew (void *opaque, target_phys_addr_t addr,
3471
                            uint32_t value)
3472
{
3473
    subpage_writelen(opaque, addr, value, 1);
3474
}
3475

    
3476
static uint32_t subpage_readl (void *opaque, target_phys_addr_t addr)
3477
{
3478
    return subpage_readlen(opaque, addr, 2);
3479
}
3480

    
3481
static void subpage_writel (void *opaque, target_phys_addr_t addr,
3482
                            uint32_t value)
3483
{
3484
    subpage_writelen(opaque, addr, value, 2);
3485
}
3486

    
3487
static CPUReadMemoryFunc * const subpage_read[] = {
3488
    &subpage_readb,
3489
    &subpage_readw,
3490
    &subpage_readl,
3491
};
3492

    
3493
static CPUWriteMemoryFunc * const subpage_write[] = {
3494
    &subpage_writeb,
3495
    &subpage_writew,
3496
    &subpage_writel,
3497
};
3498

    
3499
static int subpage_register (subpage_t *mmio, uint32_t start, uint32_t end,
3500
                             ram_addr_t memory, ram_addr_t region_offset)
3501
{
3502
    int idx, eidx;
3503

    
3504
    if (start >= TARGET_PAGE_SIZE || end >= TARGET_PAGE_SIZE)
3505
        return -1;
3506
    idx = SUBPAGE_IDX(start);
3507
    eidx = SUBPAGE_IDX(end);
3508
#if defined(DEBUG_SUBPAGE)
3509
    printf("%s: %p start %08x end %08x idx %08x eidx %08x mem %ld\n", __func__,
3510
           mmio, start, end, idx, eidx, memory);
3511
#endif
3512
    if ((memory & ~TARGET_PAGE_MASK) == IO_MEM_RAM)
3513
        memory = IO_MEM_UNASSIGNED;
3514
    memory = (memory >> IO_MEM_SHIFT) & (IO_MEM_NB_ENTRIES - 1);
3515
    for (; idx <= eidx; idx++) {
3516
        mmio->sub_io_index[idx] = memory;
3517
        mmio->region_offset[idx] = region_offset;
3518
    }
3519

    
3520
    return 0;
3521
}
3522

    
3523
static subpage_t *subpage_init (target_phys_addr_t base, ram_addr_t *phys,
3524
                                ram_addr_t orig_memory,
3525
                                ram_addr_t region_offset)
3526
{
3527
    subpage_t *mmio;
3528
    int subpage_memory;
3529

    
3530
    mmio = qemu_mallocz(sizeof(subpage_t));
3531

    
3532
    mmio->base = base;
3533
    subpage_memory = cpu_register_io_memory(subpage_read, subpage_write, mmio,
3534
                                            DEVICE_NATIVE_ENDIAN);
3535
#if defined(DEBUG_SUBPAGE)
3536
    printf("%s: %p base " TARGET_FMT_plx " len %08x %d\n", __func__,
3537
           mmio, base, TARGET_PAGE_SIZE, subpage_memory);
3538
#endif
3539
    *phys = subpage_memory | IO_MEM_SUBPAGE;
3540
    subpage_register(mmio, 0, TARGET_PAGE_SIZE-1, orig_memory, region_offset);
3541

    
3542
    return mmio;
3543
}
3544

    
3545
static int get_free_io_mem_idx(void)
3546
{
3547
    int i;
3548

    
3549
    for (i = 0; i<IO_MEM_NB_ENTRIES; i++)
3550
        if (!io_mem_used[i]) {
3551
            io_mem_used[i] = 1;
3552
            return i;
3553
        }
3554
    fprintf(stderr, "RAN out out io_mem_idx, max %d !\n", IO_MEM_NB_ENTRIES);
3555
    return -1;
3556
}
3557

    
3558
/*
3559
 * Usually, devices operate in little endian mode. There are devices out
3560
 * there that operate in big endian too. Each device gets byte swapped
3561
 * mmio if plugged onto a CPU that does the other endianness.
3562
 *
3563
 * CPU          Device           swap?
3564
 *
3565
 * little       little           no
3566
 * little       big              yes
3567
 * big          little           yes
3568
 * big          big              no
3569
 */
3570

    
3571
typedef struct SwapEndianContainer {
3572
    CPUReadMemoryFunc *read[3];
3573
    CPUWriteMemoryFunc *write[3];
3574
    void *opaque;
3575
} SwapEndianContainer;
3576

    
3577
static uint32_t swapendian_mem_readb (void *opaque, target_phys_addr_t addr)
3578
{
3579
    uint32_t val;
3580
    SwapEndianContainer *c = opaque;
3581
    val = c->read[0](c->opaque, addr);
3582
    return val;
3583
}
3584

    
3585
static uint32_t swapendian_mem_readw(void *opaque, target_phys_addr_t addr)
3586
{
3587
    uint32_t val;
3588
    SwapEndianContainer *c = opaque;
3589
    val = bswap16(c->read[1](c->opaque, addr));
3590
    return val;
3591
}
3592

    
3593
static uint32_t swapendian_mem_readl(void *opaque, target_phys_addr_t addr)
3594
{
3595
    uint32_t val;
3596
    SwapEndianContainer *c = opaque;
3597
    val = bswap32(c->read[2](c->opaque, addr));
3598
    return val;
3599
}
3600

    
3601
static CPUReadMemoryFunc * const swapendian_readfn[3]={
3602
    swapendian_mem_readb,
3603
    swapendian_mem_readw,
3604
    swapendian_mem_readl
3605
};
3606

    
3607
static void swapendian_mem_writeb(void *opaque, target_phys_addr_t addr,
3608
                                  uint32_t val)
3609
{
3610
    SwapEndianContainer *c = opaque;
3611
    c->write[0](c->opaque, addr, val);
3612
}
3613

    
3614
static void swapendian_mem_writew(void *opaque, target_phys_addr_t addr,
3615
                                  uint32_t val)
3616
{
3617
    SwapEndianContainer *c = opaque;
3618
    c->write[1](c->opaque, addr, bswap16(val));
3619
}
3620

    
3621
static void swapendian_mem_writel(void *opaque, target_phys_addr_t addr,
3622
                                  uint32_t val)
3623
{
3624
    SwapEndianContainer *c = opaque;
3625
    c->write[2](c->opaque, addr, bswap32(val));
3626
}
3627

    
3628
static CPUWriteMemoryFunc * const swapendian_writefn[3]={
3629
    swapendian_mem_writeb,
3630
    swapendian_mem_writew,
3631
    swapendian_mem_writel
3632
};
3633

    
3634
static void swapendian_init(int io_index)
3635
{
3636
    SwapEndianContainer *c = qemu_malloc(sizeof(SwapEndianContainer));
3637
    int i;
3638

    
3639
    /* Swap mmio for big endian targets */
3640
    c->opaque = io_mem_opaque[io_index];
3641
    for (i = 0; i < 3; i++) {
3642
        c->read[i] = io_mem_read[io_index][i];
3643
        c->write[i] = io_mem_write[io_index][i];
3644

    
3645
        io_mem_read[io_index][i] = swapendian_readfn[i];
3646
        io_mem_write[io_index][i] = swapendian_writefn[i];
3647
    }
3648
    io_mem_opaque[io_index] = c;
3649
}
3650

    
3651
static void swapendian_del(int io_index)
3652
{
3653
    if (io_mem_read[io_index][0] == swapendian_readfn[0]) {
3654
        qemu_free(io_mem_opaque[io_index]);
3655
    }
3656
}
3657

    
3658
/* mem_read and mem_write are arrays of functions containing the
3659
   function to access byte (index 0), word (index 1) and dword (index
3660
   2). Functions can be omitted with a NULL function pointer.
3661
   If io_index is non zero, the corresponding io zone is
3662
   modified. If it is zero, a new io zone is allocated. The return
3663
   value can be used with cpu_register_physical_memory(). (-1) is
3664
   returned if error. */
3665
static int cpu_register_io_memory_fixed(int io_index,
3666
                                        CPUReadMemoryFunc * const *mem_read,
3667
                                        CPUWriteMemoryFunc * const *mem_write,
3668
                                        void *opaque, enum device_endian endian)
3669
{
3670
    int i;
3671

    
3672
    if (io_index <= 0) {
3673
        io_index = get_free_io_mem_idx();
3674
        if (io_index == -1)
3675
            return io_index;
3676
    } else {
3677
        io_index >>= IO_MEM_SHIFT;
3678
        if (io_index >= IO_MEM_NB_ENTRIES)
3679
            return -1;
3680
    }
3681

    
3682
    for (i = 0; i < 3; ++i) {
3683
        io_mem_read[io_index][i]
3684
            = (mem_read[i] ? mem_read[i] : unassigned_mem_read[i]);
3685
    }
3686
    for (i = 0; i < 3; ++i) {
3687
        io_mem_write[io_index][i]
3688
            = (mem_write[i] ? mem_write[i] : unassigned_mem_write[i]);
3689
    }
3690
    io_mem_opaque[io_index] = opaque;
3691

    
3692
    switch (endian) {
3693
    case DEVICE_BIG_ENDIAN:
3694
#ifndef TARGET_WORDS_BIGENDIAN
3695
        swapendian_init(io_index);
3696
#endif
3697
        break;
3698
    case DEVICE_LITTLE_ENDIAN:
3699
#ifdef TARGET_WORDS_BIGENDIAN
3700
        swapendian_init(io_index);
3701
#endif
3702
        break;
3703
    case DEVICE_NATIVE_ENDIAN:
3704
    default:
3705
        break;
3706
    }
3707

    
3708
    return (io_index << IO_MEM_SHIFT);
3709
}
3710

    
3711
int cpu_register_io_memory(CPUReadMemoryFunc * const *mem_read,
3712
                           CPUWriteMemoryFunc * const *mem_write,
3713
                           void *opaque, enum device_endian endian)
3714
{
3715
    return cpu_register_io_memory_fixed(0, mem_read, mem_write, opaque, endian);
3716
}
3717

    
3718
void cpu_unregister_io_memory(int io_table_address)
3719
{
3720
    int i;
3721
    int io_index = io_table_address >> IO_MEM_SHIFT;
3722

    
3723
    swapendian_del(io_index);
3724

    
3725
    for (i=0;i < 3; i++) {
3726
        io_mem_read[io_index][i] = unassigned_mem_read[i];
3727
        io_mem_write[io_index][i] = unassigned_mem_write[i];
3728
    }
3729
    io_mem_opaque[io_index] = NULL;
3730
    io_mem_used[io_index] = 0;
3731
}
3732

    
3733
static void io_mem_init(void)
3734
{
3735
    int i;
3736

    
3737
    cpu_register_io_memory_fixed(IO_MEM_ROM, error_mem_read,
3738
                                 unassigned_mem_write, NULL,
3739
                                 DEVICE_NATIVE_ENDIAN);
3740
    cpu_register_io_memory_fixed(IO_MEM_UNASSIGNED, unassigned_mem_read,
3741
                                 unassigned_mem_write, NULL,
3742
                                 DEVICE_NATIVE_ENDIAN);
3743
    cpu_register_io_memory_fixed(IO_MEM_NOTDIRTY, error_mem_read,
3744
                                 notdirty_mem_write, NULL,
3745
                                 DEVICE_NATIVE_ENDIAN);
3746
    for (i=0; i<5; i++)
3747
        io_mem_used[i] = 1;
3748

    
3749
    io_mem_watch = cpu_register_io_memory(watch_mem_read,
3750
                                          watch_mem_write, NULL,
3751
                                          DEVICE_NATIVE_ENDIAN);
3752
}
3753

    
3754
#endif /* !defined(CONFIG_USER_ONLY) */
3755

    
3756
/* physical memory access (slow version, mainly for debug) */
3757
#if defined(CONFIG_USER_ONLY)
3758
int cpu_memory_rw_debug(CPUState *env, target_ulong addr,
3759
                        uint8_t *buf, int len, int is_write)
3760
{
3761
    int l, flags;
3762
    target_ulong page;
3763
    void * p;
3764

    
3765
    while (len > 0) {
3766
        page = addr & TARGET_PAGE_MASK;
3767
        l = (page + TARGET_PAGE_SIZE) - addr;
3768
        if (l > len)
3769
            l = len;
3770
        flags = page_get_flags(page);
3771
        if (!(flags & PAGE_VALID))
3772
            return -1;
3773
        if (is_write) {
3774
            if (!(flags & PAGE_WRITE))
3775
                return -1;
3776
            /* XXX: this code should not depend on lock_user */
3777
            if (!(p = lock_user(VERIFY_WRITE, addr, l, 0)))
3778
                return -1;
3779
            memcpy(p, buf, l);
3780
            unlock_user(p, addr, l);
3781
        } else {
3782
            if (!(flags & PAGE_READ))
3783
                return -1;
3784
            /* XXX: this code should not depend on lock_user */
3785
            if (!(p = lock_user(VERIFY_READ, addr, l, 1)))
3786
                return -1;
3787
            memcpy(buf, p, l);
3788
            unlock_user(p, addr, 0);
3789
        }
3790
        len -= l;
3791
        buf += l;
3792
        addr += l;
3793
    }
3794
    return 0;
3795
}
3796

    
3797
#else
3798
void cpu_physical_memory_rw(target_phys_addr_t addr, uint8_t *buf,
3799
                            int len, int is_write)
3800
{
3801
    int l, io_index;
3802
    uint8_t *ptr;
3803
    uint32_t val;
3804
    target_phys_addr_t page;
3805
    unsigned long pd;
3806
    PhysPageDesc *p;
3807

    
3808
    while (len > 0) {
3809
        page = addr & TARGET_PAGE_MASK;
3810
        l = (page + TARGET_PAGE_SIZE) - addr;
3811
        if (l > len)
3812
            l = len;
3813
        p = phys_page_find(page >> TARGET_PAGE_BITS);
3814
        if (!p) {
3815
            pd = IO_MEM_UNASSIGNED;
3816
        } else {
3817
            pd = p->phys_offset;
3818
        }
3819

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

    
3896
/* used for ROM loading : can write in RAM and ROM */
3897
void cpu_physical_memory_write_rom(target_phys_addr_t addr,
3898
                                   const uint8_t *buf, int len)
3899
{
3900
    int l;
3901
    uint8_t *ptr;
3902
    target_phys_addr_t page;
3903
    unsigned long pd;
3904
    PhysPageDesc *p;
3905

    
3906
    while (len > 0) {
3907
        page = addr & TARGET_PAGE_MASK;
3908
        l = (page + TARGET_PAGE_SIZE) - addr;
3909
        if (l > len)
3910
            l = len;
3911
        p = phys_page_find(page >> TARGET_PAGE_BITS);
3912
        if (!p) {
3913
            pd = IO_MEM_UNASSIGNED;
3914
        } else {
3915
            pd = p->phys_offset;
3916
        }
3917

    
3918
        if ((pd & ~TARGET_PAGE_MASK) != IO_MEM_RAM &&
3919
            (pd & ~TARGET_PAGE_MASK) != IO_MEM_ROM &&
3920
            !(pd & IO_MEM_ROMD)) {
3921
            /* do nothing */
3922
        } else {
3923
            unsigned long addr1;
3924
            addr1 = (pd & TARGET_PAGE_MASK) + (addr & ~TARGET_PAGE_MASK);
3925
            /* ROM/RAM case */
3926
            ptr = qemu_get_ram_ptr(addr1);
3927
            memcpy(ptr, buf, l);
3928
            qemu_put_ram_ptr(ptr);
3929
        }
3930
        len -= l;
3931
        buf += l;
3932
        addr += l;
3933
    }
3934
}
3935

    
3936
typedef struct {
3937
    void *buffer;
3938
    target_phys_addr_t addr;
3939
    target_phys_addr_t len;
3940
} BounceBuffer;
3941

    
3942
static BounceBuffer bounce;
3943

    
3944
typedef struct MapClient {
3945
    void *opaque;
3946
    void (*callback)(void *opaque);
3947
    QLIST_ENTRY(MapClient) link;
3948
} MapClient;
3949

    
3950
static QLIST_HEAD(map_client_list, MapClient) map_client_list
3951
    = QLIST_HEAD_INITIALIZER(map_client_list);
3952

    
3953
void *cpu_register_map_client(void *opaque, void (*callback)(void *opaque))
3954
{
3955
    MapClient *client = qemu_malloc(sizeof(*client));
3956

    
3957
    client->opaque = opaque;
3958
    client->callback = callback;
3959
    QLIST_INSERT_HEAD(&map_client_list, client, link);
3960
    return client;
3961
}
3962

    
3963
void cpu_unregister_map_client(void *_client)
3964
{
3965
    MapClient *client = (MapClient *)_client;
3966

    
3967
    QLIST_REMOVE(client, link);
3968
    qemu_free(client);
3969
}
3970

    
3971
static void cpu_notify_map_clients(void)
3972
{
3973
    MapClient *client;
3974

    
3975
    while (!QLIST_EMPTY(&map_client_list)) {
3976
        client = QLIST_FIRST(&map_client_list);
3977
        client->callback(client->opaque);
3978
        cpu_unregister_map_client(client);
3979
    }
3980
}
3981

    
3982
/* Map a physical memory region into a host virtual address.
3983
 * May map a subset of the requested range, given by and returned in *plen.
3984
 * May return NULL if resources needed to perform the mapping are exhausted.
3985
 * Use only for reads OR writes - not for read-modify-write operations.
3986
 * Use cpu_register_map_client() to know when retrying the map operation is
3987
 * likely to succeed.
3988
 */
3989
void *cpu_physical_memory_map(target_phys_addr_t addr,
3990
                              target_phys_addr_t *plen,
3991
                              int is_write)
3992
{
3993
    target_phys_addr_t len = *plen;
3994
    target_phys_addr_t done = 0;
3995
    int l;
3996
    uint8_t *ret = NULL;
3997
    uint8_t *ptr;
3998
    target_phys_addr_t page;
3999
    unsigned long pd;
4000
    PhysPageDesc *p;
4001
    unsigned long addr1;
4002

    
4003
    while (len > 0) {
4004
        page = addr & TARGET_PAGE_MASK;
4005
        l = (page + TARGET_PAGE_SIZE) - addr;
4006
        if (l > len)
4007
            l = len;
4008
        p = phys_page_find(page >> TARGET_PAGE_BITS);
4009
        if (!p) {
4010
            pd = IO_MEM_UNASSIGNED;
4011
        } else {
4012
            pd = p->phys_offset;
4013
        }
4014

    
4015
        if ((pd & ~TARGET_PAGE_MASK) != IO_MEM_RAM) {
4016
            if (done || bounce.buffer) {
4017
                break;
4018
            }
4019
            bounce.buffer = qemu_memalign(TARGET_PAGE_SIZE, TARGET_PAGE_SIZE);
4020
            bounce.addr = addr;
4021
            bounce.len = l;
4022
            if (!is_write) {
4023
                cpu_physical_memory_read(addr, bounce.buffer, l);
4024
            }
4025
            ptr = bounce.buffer;
4026
        } else {
4027
            addr1 = (pd & TARGET_PAGE_MASK) + (addr & ~TARGET_PAGE_MASK);
4028
            ptr = qemu_get_ram_ptr(addr1);
4029
        }
4030
        if (!done) {
4031
            ret = ptr;
4032
        } else if (ret + done != ptr) {
4033
            break;
4034
        }
4035

    
4036
        len -= l;
4037
        addr += l;
4038
        done += l;
4039
    }
4040
    *plen = done;
4041
    return ret;
4042
}
4043

    
4044
/* Unmaps a memory region previously mapped by cpu_physical_memory_map().
4045
 * Will also mark the memory as dirty if is_write == 1.  access_len gives
4046
 * the amount of memory that was actually read or written by the caller.
4047
 */
4048
void cpu_physical_memory_unmap(void *buffer, target_phys_addr_t len,
4049
                               int is_write, target_phys_addr_t access_len)
4050
{
4051
    if (buffer != bounce.buffer) {
4052
        if (is_write) {
4053
            ram_addr_t addr1 = qemu_ram_addr_from_host_nofail(buffer);
4054
            while (access_len) {
4055
                unsigned l;
4056
                l = TARGET_PAGE_SIZE;
4057
                if (l > access_len)
4058
                    l = access_len;
4059
                if (!cpu_physical_memory_is_dirty(addr1)) {
4060
                    /* invalidate code */
4061
                    tb_invalidate_phys_page_range(addr1, addr1 + l, 0);
4062
                    /* set dirty bit */
4063
                    cpu_physical_memory_set_dirty_flags(
4064
                        addr1, (0xff & ~CODE_DIRTY_FLAG));
4065
                }
4066
                addr1 += l;
4067
                access_len -= l;
4068
            }
4069
        }
4070
        if (xen_mapcache_enabled()) {
4071
            uint8_t *buffer1 = buffer;
4072
            uint8_t *end_buffer = buffer + len;
4073

    
4074
            while (buffer1 < end_buffer) {
4075
                qemu_put_ram_ptr(buffer1);
4076
                buffer1 += TARGET_PAGE_SIZE;
4077
            }
4078
        }
4079
        return;
4080
    }
4081
    if (is_write) {
4082
        cpu_physical_memory_write(bounce.addr, bounce.buffer, access_len);
4083
    }
4084
    qemu_vfree(bounce.buffer);
4085
    bounce.buffer = NULL;
4086
    cpu_notify_map_clients();
4087
}
4088

    
4089
/* warning: addr must be aligned */
4090
uint32_t ldl_phys(target_phys_addr_t addr)
4091
{
4092
    int io_index;
4093
    uint8_t *ptr;
4094
    uint32_t val;
4095
    unsigned long pd;
4096
    PhysPageDesc *p;
4097

    
4098
    p = phys_page_find(addr >> TARGET_PAGE_BITS);
4099
    if (!p) {
4100
        pd = IO_MEM_UNASSIGNED;
4101
    } else {
4102
        pd = p->phys_offset;
4103
    }
4104

    
4105
    if ((pd & ~TARGET_PAGE_MASK) > IO_MEM_ROM &&
4106
        !(pd & IO_MEM_ROMD)) {
4107
        /* I/O case */
4108
        io_index = (pd >> IO_MEM_SHIFT) & (IO_MEM_NB_ENTRIES - 1);
4109
        if (p)
4110
            addr = (addr & ~TARGET_PAGE_MASK) + p->region_offset;
4111
        val = io_mem_read[io_index][2](io_mem_opaque[io_index], addr);
4112
    } else {
4113
        /* RAM case */
4114
        ptr = qemu_get_ram_ptr(pd & TARGET_PAGE_MASK) +
4115
            (addr & ~TARGET_PAGE_MASK);
4116
        val = ldl_p(ptr);
4117
    }
4118
    return val;
4119
}
4120

    
4121
/* warning: addr must be aligned */
4122
uint64_t ldq_phys(target_phys_addr_t addr)
4123
{
4124
    int io_index;
4125
    uint8_t *ptr;
4126
    uint64_t val;
4127
    unsigned long pd;
4128
    PhysPageDesc *p;
4129

    
4130
    p = phys_page_find(addr >> TARGET_PAGE_BITS);
4131
    if (!p) {
4132
        pd = IO_MEM_UNASSIGNED;
4133
    } else {
4134
        pd = p->phys_offset;
4135
    }
4136

    
4137
    if ((pd & ~TARGET_PAGE_MASK) > IO_MEM_ROM &&
4138
        !(pd & IO_MEM_ROMD)) {
4139
        /* I/O case */
4140
        io_index = (pd >> IO_MEM_SHIFT) & (IO_MEM_NB_ENTRIES - 1);
4141
        if (p)
4142
            addr = (addr & ~TARGET_PAGE_MASK) + p->region_offset;
4143
#ifdef TARGET_WORDS_BIGENDIAN
4144
        val = (uint64_t)io_mem_read[io_index][2](io_mem_opaque[io_index], addr) << 32;
4145
        val |= io_mem_read[io_index][2](io_mem_opaque[io_index], addr + 4);
4146
#else
4147
        val = io_mem_read[io_index][2](io_mem_opaque[io_index], addr);
4148
        val |= (uint64_t)io_mem_read[io_index][2](io_mem_opaque[io_index], addr + 4) << 32;
4149
#endif
4150
    } else {
4151
        /* RAM case */
4152
        ptr = qemu_get_ram_ptr(pd & TARGET_PAGE_MASK) +
4153
            (addr & ~TARGET_PAGE_MASK);
4154
        val = ldq_p(ptr);
4155
    }
4156
    return val;
4157
}
4158

    
4159
/* XXX: optimize */
4160
uint32_t ldub_phys(target_phys_addr_t addr)
4161
{
4162
    uint8_t val;
4163
    cpu_physical_memory_read(addr, &val, 1);
4164
    return val;
4165
}
4166

    
4167
/* warning: addr must be aligned */
4168
uint32_t lduw_phys(target_phys_addr_t addr)
4169
{
4170
    int io_index;
4171
    uint8_t *ptr;
4172
    uint64_t val;
4173
    unsigned long pd;
4174
    PhysPageDesc *p;
4175

    
4176
    p = phys_page_find(addr >> TARGET_PAGE_BITS);
4177
    if (!p) {
4178
        pd = IO_MEM_UNASSIGNED;
4179
    } else {
4180
        pd = p->phys_offset;
4181
    }
4182

    
4183
    if ((pd & ~TARGET_PAGE_MASK) > IO_MEM_ROM &&
4184
        !(pd & IO_MEM_ROMD)) {
4185
        /* I/O case */
4186
        io_index = (pd >> IO_MEM_SHIFT) & (IO_MEM_NB_ENTRIES - 1);
4187
        if (p)
4188
            addr = (addr & ~TARGET_PAGE_MASK) + p->region_offset;
4189
        val = io_mem_read[io_index][1](io_mem_opaque[io_index], addr);
4190
    } else {
4191
        /* RAM case */
4192
        ptr = qemu_get_ram_ptr(pd & TARGET_PAGE_MASK) +
4193
            (addr & ~TARGET_PAGE_MASK);
4194
        val = lduw_p(ptr);
4195
    }
4196
    return val;
4197
}
4198

    
4199
/* warning: addr must be aligned. The ram page is not masked as dirty
4200
   and the code inside is not invalidated. It is useful if the dirty
4201
   bits are used to track modified PTEs */
4202
void stl_phys_notdirty(target_phys_addr_t addr, uint32_t val)
4203
{
4204
    int io_index;
4205
    uint8_t *ptr;
4206
    unsigned long pd;
4207
    PhysPageDesc *p;
4208

    
4209
    p = phys_page_find(addr >> TARGET_PAGE_BITS);
4210
    if (!p) {
4211
        pd = IO_MEM_UNASSIGNED;
4212
    } else {
4213
        pd = p->phys_offset;
4214
    }
4215

    
4216
    if ((pd & ~TARGET_PAGE_MASK) != IO_MEM_RAM) {
4217
        io_index = (pd >> IO_MEM_SHIFT) & (IO_MEM_NB_ENTRIES - 1);
4218
        if (p)
4219
            addr = (addr & ~TARGET_PAGE_MASK) + p->region_offset;
4220
        io_mem_write[io_index][2](io_mem_opaque[io_index], addr, val);
4221
    } else {
4222
        unsigned long addr1 = (pd & TARGET_PAGE_MASK) + (addr & ~TARGET_PAGE_MASK);
4223
        ptr = qemu_get_ram_ptr(addr1);
4224
        stl_p(ptr, val);
4225

    
4226
        if (unlikely(in_migration)) {
4227
            if (!cpu_physical_memory_is_dirty(addr1)) {
4228
                /* invalidate code */
4229
                tb_invalidate_phys_page_range(addr1, addr1 + 4, 0);
4230
                /* set dirty bit */
4231
                cpu_physical_memory_set_dirty_flags(
4232
                    addr1, (0xff & ~CODE_DIRTY_FLAG));
4233
            }
4234
        }
4235
    }
4236
}
4237

    
4238
void stq_phys_notdirty(target_phys_addr_t addr, uint64_t val)
4239
{
4240
    int io_index;
4241
    uint8_t *ptr;
4242
    unsigned long pd;
4243
    PhysPageDesc *p;
4244

    
4245
    p = phys_page_find(addr >> TARGET_PAGE_BITS);
4246
    if (!p) {
4247
        pd = IO_MEM_UNASSIGNED;
4248
    } else {
4249
        pd = p->phys_offset;
4250
    }
4251

    
4252
    if ((pd & ~TARGET_PAGE_MASK) != IO_MEM_RAM) {
4253
        io_index = (pd >> IO_MEM_SHIFT) & (IO_MEM_NB_ENTRIES - 1);
4254
        if (p)
4255
            addr = (addr & ~TARGET_PAGE_MASK) + p->region_offset;
4256
#ifdef TARGET_WORDS_BIGENDIAN
4257
        io_mem_write[io_index][2](io_mem_opaque[io_index], addr, val >> 32);
4258
        io_mem_write[io_index][2](io_mem_opaque[io_index], addr + 4, val);
4259
#else
4260
        io_mem_write[io_index][2](io_mem_opaque[io_index], addr, val);
4261
        io_mem_write[io_index][2](io_mem_opaque[io_index], addr + 4, val >> 32);
4262
#endif
4263
    } else {
4264
        ptr = qemu_get_ram_ptr(pd & TARGET_PAGE_MASK) +
4265
            (addr & ~TARGET_PAGE_MASK);
4266
        stq_p(ptr, val);
4267
    }
4268
}
4269

    
4270
/* warning: addr must be aligned */
4271
void stl_phys(target_phys_addr_t addr, uint32_t val)
4272
{
4273
    int io_index;
4274
    uint8_t *ptr;
4275
    unsigned long pd;
4276
    PhysPageDesc *p;
4277

    
4278
    p = phys_page_find(addr >> TARGET_PAGE_BITS);
4279
    if (!p) {
4280
        pd = IO_MEM_UNASSIGNED;
4281
    } else {
4282
        pd = p->phys_offset;
4283
    }
4284

    
4285
    if ((pd & ~TARGET_PAGE_MASK) != IO_MEM_RAM) {
4286
        io_index = (pd >> IO_MEM_SHIFT) & (IO_MEM_NB_ENTRIES - 1);
4287
        if (p)
4288
            addr = (addr & ~TARGET_PAGE_MASK) + p->region_offset;
4289
        io_mem_write[io_index][2](io_mem_opaque[io_index], addr, val);
4290
    } else {
4291
        unsigned long addr1;
4292
        addr1 = (pd & TARGET_PAGE_MASK) + (addr & ~TARGET_PAGE_MASK);
4293
        /* RAM case */
4294
        ptr = qemu_get_ram_ptr(addr1);
4295
        stl_p(ptr, val);
4296
        if (!cpu_physical_memory_is_dirty(addr1)) {
4297
            /* invalidate code */
4298
            tb_invalidate_phys_page_range(addr1, addr1 + 4, 0);
4299
            /* set dirty bit */
4300
            cpu_physical_memory_set_dirty_flags(addr1,
4301
                (0xff & ~CODE_DIRTY_FLAG));
4302
        }
4303
    }
4304
}
4305

    
4306
/* XXX: optimize */
4307
void stb_phys(target_phys_addr_t addr, uint32_t val)
4308
{
4309
    uint8_t v = val;
4310
    cpu_physical_memory_write(addr, &v, 1);
4311
}
4312

    
4313
/* warning: addr must be aligned */
4314
void stw_phys(target_phys_addr_t addr, uint32_t val)
4315
{
4316
    int io_index;
4317
    uint8_t *ptr;
4318
    unsigned long pd;
4319
    PhysPageDesc *p;
4320

    
4321
    p = phys_page_find(addr >> TARGET_PAGE_BITS);
4322
    if (!p) {
4323
        pd = IO_MEM_UNASSIGNED;
4324
    } else {
4325
        pd = p->phys_offset;
4326
    }
4327

    
4328
    if ((pd & ~TARGET_PAGE_MASK) != IO_MEM_RAM) {
4329
        io_index = (pd >> IO_MEM_SHIFT) & (IO_MEM_NB_ENTRIES - 1);
4330
        if (p)
4331
            addr = (addr & ~TARGET_PAGE_MASK) + p->region_offset;
4332
        io_mem_write[io_index][1](io_mem_opaque[io_index], addr, val);
4333
    } else {
4334
        unsigned long addr1;
4335
        addr1 = (pd & TARGET_PAGE_MASK) + (addr & ~TARGET_PAGE_MASK);
4336
        /* RAM case */
4337
        ptr = qemu_get_ram_ptr(addr1);
4338
        stw_p(ptr, val);
4339
        if (!cpu_physical_memory_is_dirty(addr1)) {
4340
            /* invalidate code */
4341
            tb_invalidate_phys_page_range(addr1, addr1 + 2, 0);
4342
            /* set dirty bit */
4343
            cpu_physical_memory_set_dirty_flags(addr1,
4344
                (0xff & ~CODE_DIRTY_FLAG));
4345
        }
4346
    }
4347
}
4348

    
4349
/* XXX: optimize */
4350
void stq_phys(target_phys_addr_t addr, uint64_t val)
4351
{
4352
    val = tswap64(val);
4353
    cpu_physical_memory_write(addr, &val, 8);
4354
}
4355

    
4356
/* virtual memory access for debug (includes writing to ROM) */
4357
int cpu_memory_rw_debug(CPUState *env, target_ulong addr,
4358
                        uint8_t *buf, int len, int is_write)
4359
{
4360
    int l;
4361
    target_phys_addr_t phys_addr;
4362
    target_ulong page;
4363

    
4364
    while (len > 0) {
4365
        page = addr & TARGET_PAGE_MASK;
4366
        phys_addr = cpu_get_phys_page_debug(env, page);
4367
        /* if no physical page mapped, return an error */
4368
        if (phys_addr == -1)
4369
            return -1;
4370
        l = (page + TARGET_PAGE_SIZE) - addr;
4371
        if (l > len)
4372
            l = len;
4373
        phys_addr += (addr & ~TARGET_PAGE_MASK);
4374
        if (is_write)
4375
            cpu_physical_memory_write_rom(phys_addr, buf, l);
4376
        else
4377
            cpu_physical_memory_rw(phys_addr, buf, l, is_write);
4378
        len -= l;
4379
        buf += l;
4380
        addr += l;
4381
    }
4382
    return 0;
4383
}
4384
#endif
4385

    
4386
/* in deterministic execution mode, instructions doing device I/Os
4387
   must be at the end of the TB */
4388
void cpu_io_recompile(CPUState *env, void *retaddr)
4389
{
4390
    TranslationBlock *tb;
4391
    uint32_t n, cflags;
4392
    target_ulong pc, cs_base;
4393
    uint64_t flags;
4394

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

    
4429
    cflags = n | CF_LAST_IO;
4430
    pc = tb->pc;
4431
    cs_base = tb->cs_base;
4432
    flags = tb->flags;
4433
    tb_phys_invalidate(tb, -1);
4434
    /* FIXME: In theory this could raise an exception.  In practice
4435
       we have already translated the block once so it's probably ok.  */
4436
    tb_gen_code(env, pc, cs_base, flags, cflags);
4437
    /* TODO: If env->pc != tb->pc (i.e. the faulting instruction was not
4438
       the first in the TB) then we end up generating a whole new TB and
4439
       repeating the fault, which is horribly inefficient.
4440
       Better would be to execute just this insn uncached, or generate a
4441
       second new TB.  */
4442
    cpu_resume_from_signal(env, NULL);
4443
}
4444

    
4445
#if !defined(CONFIG_USER_ONLY)
4446

    
4447
void dump_exec_info(FILE *f, fprintf_function cpu_fprintf)
4448
{
4449
    int i, target_code_size, max_target_code_size;
4450
    int direct_jmp_count, direct_jmp2_count, cross_page;
4451
    TranslationBlock *tb;
4452

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

    
4499
#define MMUSUFFIX _cmmu
4500
#define GETPC() NULL
4501
#define env cpu_single_env
4502
#define SOFTMMU_CODE_ACCESS
4503

    
4504
#define SHIFT 0
4505
#include "softmmu_template.h"
4506

    
4507
#define SHIFT 1
4508
#include "softmmu_template.h"
4509

    
4510
#define SHIFT 2
4511
#include "softmmu_template.h"
4512

    
4513
#define SHIFT 3
4514
#include "softmmu_template.h"
4515

    
4516
#undef env
4517

    
4518
#endif