Statistics
| Branch: | Revision:

root / exec.c @ 8c5e95d8

History | View | Annotate | Download (94.4 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, write to the Free Software
18
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19
 */
20
#include "config.h"
21
#ifdef _WIN32
22
#define WIN32_LEAN_AND_MEAN
23
#include <windows.h>
24
#else
25
#include <sys/types.h>
26
#include <sys/mman.h>
27
#endif
28
#include <stdlib.h>
29
#include <stdio.h>
30
#include <stdarg.h>
31
#include <string.h>
32
#include <errno.h>
33
#include <unistd.h>
34
#include <inttypes.h>
35

    
36
#include "cpu.h"
37
#include "exec-all.h"
38
#include "qemu-common.h"
39
#include "tcg.h"
40
#include "hw/hw.h"
41
#if defined(CONFIG_USER_ONLY)
42
#include <qemu.h>
43
#endif
44

    
45
//#define DEBUG_TB_INVALIDATE
46
//#define DEBUG_FLUSH
47
//#define DEBUG_TLB
48
//#define DEBUG_UNASSIGNED
49

    
50
/* make various TB consistency checks */
51
//#define DEBUG_TB_CHECK
52
//#define DEBUG_TLB_CHECK
53

    
54
//#define DEBUG_IOPORT
55
//#define DEBUG_SUBPAGE
56

    
57
#if !defined(CONFIG_USER_ONLY)
58
/* TB consistency checks only implemented for usermode emulation.  */
59
#undef DEBUG_TB_CHECK
60
#endif
61

    
62
#define SMC_BITMAP_USE_THRESHOLD 10
63

    
64
#define MMAP_AREA_START        0x00000000
65
#define MMAP_AREA_END          0xa8000000
66

    
67
#if defined(TARGET_SPARC64)
68
#define TARGET_PHYS_ADDR_SPACE_BITS 41
69
#elif defined(TARGET_SPARC)
70
#define TARGET_PHYS_ADDR_SPACE_BITS 36
71
#elif defined(TARGET_ALPHA)
72
#define TARGET_PHYS_ADDR_SPACE_BITS 42
73
#define TARGET_VIRT_ADDR_SPACE_BITS 42
74
#elif defined(TARGET_PPC64)
75
#define TARGET_PHYS_ADDR_SPACE_BITS 42
76
#elif defined(TARGET_X86_64) && !defined(USE_KQEMU)
77
#define TARGET_PHYS_ADDR_SPACE_BITS 42
78
#elif defined(TARGET_I386) && !defined(USE_KQEMU)
79
#define TARGET_PHYS_ADDR_SPACE_BITS 36
80
#else
81
/* Note: for compatibility with kqemu, we use 32 bits for x86_64 */
82
#define TARGET_PHYS_ADDR_SPACE_BITS 32
83
#endif
84

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

    
92
uint8_t code_gen_prologue[1024] __attribute__((aligned (32)));
93
uint8_t *code_gen_buffer;
94
unsigned long code_gen_buffer_size;
95
/* threshold to flush the translated code buffer */
96
unsigned long code_gen_buffer_max_size; 
97
uint8_t *code_gen_ptr;
98

    
99
#if !defined(CONFIG_USER_ONLY)
100
ram_addr_t phys_ram_size;
101
int phys_ram_fd;
102
uint8_t *phys_ram_base;
103
uint8_t *phys_ram_dirty;
104
static ram_addr_t phys_ram_alloc_offset = 0;
105
#endif
106

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

    
119
typedef struct PageDesc {
120
    /* list of TBs intersecting this ram page */
121
    TranslationBlock *first_tb;
122
    /* in order to optimize self modifying code, we count the number
123
       of lookups we do to a given page to use a bitmap */
124
    unsigned int code_write_count;
125
    uint8_t *code_bitmap;
126
#if defined(CONFIG_USER_ONLY)
127
    unsigned long flags;
128
#endif
129
} PageDesc;
130

    
131
typedef struct PhysPageDesc {
132
    /* offset in host memory of the page + io_index in the low bits */
133
    ram_addr_t phys_offset;
134
} PhysPageDesc;
135

    
136
#define L2_BITS 10
137
#if defined(CONFIG_USER_ONLY) && defined(TARGET_VIRT_ADDR_SPACE_BITS)
138
/* XXX: this is a temporary hack for alpha target.
139
 *      In the future, this is to be replaced by a multi-level table
140
 *      to actually be able to handle the complete 64 bits address space.
141
 */
142
#define L1_BITS (TARGET_VIRT_ADDR_SPACE_BITS - L2_BITS - TARGET_PAGE_BITS)
143
#else
144
#define L1_BITS (32 - L2_BITS - TARGET_PAGE_BITS)
145
#endif
146

    
147
#define L1_SIZE (1 << L1_BITS)
148
#define L2_SIZE (1 << L2_BITS)
149

    
150
unsigned long qemu_real_host_page_size;
151
unsigned long qemu_host_page_bits;
152
unsigned long qemu_host_page_size;
153
unsigned long qemu_host_page_mask;
154

    
155
/* XXX: for system emulation, it could just be an array */
156
static PageDesc *l1_map[L1_SIZE];
157
PhysPageDesc **l1_phys_map;
158

    
159
#if !defined(CONFIG_USER_ONLY)
160
static void io_mem_init(void);
161

    
162
/* io memory support */
163
CPUWriteMemoryFunc *io_mem_write[IO_MEM_NB_ENTRIES][4];
164
CPUReadMemoryFunc *io_mem_read[IO_MEM_NB_ENTRIES][4];
165
void *io_mem_opaque[IO_MEM_NB_ENTRIES];
166
static int io_mem_nb;
167
static int io_mem_watch;
168
#endif
169

    
170
/* log support */
171
char *logfilename = "/tmp/qemu.log";
172
FILE *logfile;
173
int loglevel;
174
static int log_append = 0;
175

    
176
/* statistics */
177
static int tlb_flush_count;
178
static int tb_flush_count;
179
static int tb_phys_invalidate_count;
180

    
181
#define SUBPAGE_IDX(addr) ((addr) & ~TARGET_PAGE_MASK)
182
typedef struct subpage_t {
183
    target_phys_addr_t base;
184
    CPUReadMemoryFunc **mem_read[TARGET_PAGE_SIZE][4];
185
    CPUWriteMemoryFunc **mem_write[TARGET_PAGE_SIZE][4];
186
    void *opaque[TARGET_PAGE_SIZE][2][4];
187
} subpage_t;
188

    
189
#ifdef _WIN32
190
static void map_exec(void *addr, long size)
191
{
192
    DWORD old_protect;
193
    VirtualProtect(addr, size,
194
                   PAGE_EXECUTE_READWRITE, &old_protect);
195
    
196
}
197
#else
198
static void map_exec(void *addr, long size)
199
{
200
    unsigned long start, end, page_size;
201
    
202
    page_size = getpagesize();
203
    start = (unsigned long)addr;
204
    start &= ~(page_size - 1);
205
    
206
    end = (unsigned long)addr + size;
207
    end += page_size - 1;
208
    end &= ~(page_size - 1);
209
    
210
    mprotect((void *)start, end - start,
211
             PROT_READ | PROT_WRITE | PROT_EXEC);
212
}
213
#endif
214

    
215
static void page_init(void)
216
{
217
    /* NOTE: we can always suppose that qemu_host_page_size >=
218
       TARGET_PAGE_SIZE */
219
#ifdef _WIN32
220
    {
221
        SYSTEM_INFO system_info;
222
        DWORD old_protect;
223

    
224
        GetSystemInfo(&system_info);
225
        qemu_real_host_page_size = system_info.dwPageSize;
226
    }
227
#else
228
    qemu_real_host_page_size = getpagesize();
229
#endif
230
    if (qemu_host_page_size == 0)
231
        qemu_host_page_size = qemu_real_host_page_size;
232
    if (qemu_host_page_size < TARGET_PAGE_SIZE)
233
        qemu_host_page_size = TARGET_PAGE_SIZE;
234
    qemu_host_page_bits = 0;
235
    while ((1 << qemu_host_page_bits) < qemu_host_page_size)
236
        qemu_host_page_bits++;
237
    qemu_host_page_mask = ~(qemu_host_page_size - 1);
238
    l1_phys_map = qemu_vmalloc(L1_SIZE * sizeof(void *));
239
    memset(l1_phys_map, 0, L1_SIZE * sizeof(void *));
240

    
241
#if !defined(_WIN32) && defined(CONFIG_USER_ONLY)
242
    {
243
        long long startaddr, endaddr;
244
        FILE *f;
245
        int n;
246

    
247
        mmap_lock();
248
        last_brk = (unsigned long)sbrk(0);
249
        f = fopen("/proc/self/maps", "r");
250
        if (f) {
251
            do {
252
                n = fscanf (f, "%llx-%llx %*[^\n]\n", &startaddr, &endaddr);
253
                if (n == 2) {
254
                    startaddr = MIN(startaddr,
255
                                    (1ULL << TARGET_PHYS_ADDR_SPACE_BITS) - 1);
256
                    endaddr = MIN(endaddr,
257
                                    (1ULL << TARGET_PHYS_ADDR_SPACE_BITS) - 1);
258
                    page_set_flags(startaddr & TARGET_PAGE_MASK,
259
                                   TARGET_PAGE_ALIGN(endaddr),
260
                                   PAGE_RESERVED); 
261
                }
262
            } while (!feof(f));
263
            fclose(f);
264
        }
265
        mmap_unlock();
266
    }
267
#endif
268
}
269

    
270
static inline PageDesc *page_find_alloc(target_ulong index)
271
{
272
    PageDesc **lp, *p;
273

    
274
#if TARGET_LONG_BITS > 32
275
    /* Host memory outside guest VM.  For 32-bit targets we have already
276
       excluded high addresses.  */
277
    if (index > ((target_ulong)L2_SIZE * L1_SIZE * TARGET_PAGE_SIZE))
278
        return NULL;
279
#endif
280
    lp = &l1_map[index >> L2_BITS];
281
    p = *lp;
282
    if (!p) {
283
        /* allocate if not found */
284
#if defined(CONFIG_USER_ONLY)
285
        unsigned long addr;
286
        size_t len = sizeof(PageDesc) * L2_SIZE;
287
        /* Don't use qemu_malloc because it may recurse.  */
288
        p = mmap(0, len, PROT_READ | PROT_WRITE,
289
                 MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
290
        *lp = p;
291
        addr = h2g(p);
292
        if (addr == (target_ulong)addr) {
293
            page_set_flags(addr & TARGET_PAGE_MASK,
294
                           TARGET_PAGE_ALIGN(addr + len),
295
                           PAGE_RESERVED); 
296
        }
297
#else
298
        p = qemu_mallocz(sizeof(PageDesc) * L2_SIZE);
299
        *lp = p;
300
#endif
301
    }
302
    return p + (index & (L2_SIZE - 1));
303
}
304

    
305
static inline PageDesc *page_find(target_ulong index)
306
{
307
    PageDesc *p;
308

    
309
    p = l1_map[index >> L2_BITS];
310
    if (!p)
311
        return 0;
312
    return p + (index & (L2_SIZE - 1));
313
}
314

    
315
static PhysPageDesc *phys_page_find_alloc(target_phys_addr_t index, int alloc)
316
{
317
    void **lp, **p;
318
    PhysPageDesc *pd;
319

    
320
    p = (void **)l1_phys_map;
321
#if TARGET_PHYS_ADDR_SPACE_BITS > 32
322

    
323
#if TARGET_PHYS_ADDR_SPACE_BITS > (32 + L1_BITS)
324
#error unsupported TARGET_PHYS_ADDR_SPACE_BITS
325
#endif
326
    lp = p + ((index >> (L1_BITS + L2_BITS)) & (L1_SIZE - 1));
327
    p = *lp;
328
    if (!p) {
329
        /* allocate if not found */
330
        if (!alloc)
331
            return NULL;
332
        p = qemu_vmalloc(sizeof(void *) * L1_SIZE);
333
        memset(p, 0, sizeof(void *) * L1_SIZE);
334
        *lp = p;
335
    }
336
#endif
337
    lp = p + ((index >> L2_BITS) & (L1_SIZE - 1));
338
    pd = *lp;
339
    if (!pd) {
340
        int i;
341
        /* allocate if not found */
342
        if (!alloc)
343
            return NULL;
344
        pd = qemu_vmalloc(sizeof(PhysPageDesc) * L2_SIZE);
345
        *lp = pd;
346
        for (i = 0; i < L2_SIZE; i++)
347
          pd[i].phys_offset = IO_MEM_UNASSIGNED;
348
    }
349
    return ((PhysPageDesc *)pd) + (index & (L2_SIZE - 1));
350
}
351

    
352
static inline PhysPageDesc *phys_page_find(target_phys_addr_t index)
353
{
354
    return phys_page_find_alloc(index, 0);
355
}
356

    
357
#if !defined(CONFIG_USER_ONLY)
358
static void tlb_protect_code(ram_addr_t ram_addr);
359
static void tlb_unprotect_code_phys(CPUState *env, ram_addr_t ram_addr,
360
                                    target_ulong vaddr);
361
#define mmap_lock() do { } while(0)
362
#define mmap_unlock() do { } while(0)
363
#endif
364

    
365
#define DEFAULT_CODE_GEN_BUFFER_SIZE (32 * 1024 * 1024)
366

    
367
#if defined(CONFIG_USER_ONLY)
368
/* Currently it is not recommanded to allocate big chunks of data in
369
   user mode. It will change when a dedicated libc will be used */
370
#define USE_STATIC_CODE_GEN_BUFFER
371
#endif
372

    
373
#ifdef USE_STATIC_CODE_GEN_BUFFER
374
static uint8_t static_code_gen_buffer[DEFAULT_CODE_GEN_BUFFER_SIZE];
375
#endif
376

    
377
void code_gen_alloc(unsigned long tb_size)
378
{
379
#ifdef USE_STATIC_CODE_GEN_BUFFER
380
    code_gen_buffer = static_code_gen_buffer;
381
    code_gen_buffer_size = DEFAULT_CODE_GEN_BUFFER_SIZE;
382
    map_exec(code_gen_buffer, code_gen_buffer_size);
383
#else
384
    code_gen_buffer_size = tb_size;
385
    if (code_gen_buffer_size == 0) {
386
#if defined(CONFIG_USER_ONLY)
387
        /* in user mode, phys_ram_size is not meaningful */
388
        code_gen_buffer_size = DEFAULT_CODE_GEN_BUFFER_SIZE;
389
#else
390
        /* XXX: needs ajustments */
391
        code_gen_buffer_size = (int)(phys_ram_size / 4);
392
#endif
393
    }
394
    if (code_gen_buffer_size < MIN_CODE_GEN_BUFFER_SIZE)
395
        code_gen_buffer_size = MIN_CODE_GEN_BUFFER_SIZE;
396
    /* The code gen buffer location may have constraints depending on
397
       the host cpu and OS */
398
#if defined(__linux__) 
399
    {
400
        int flags;
401
        flags = MAP_PRIVATE | MAP_ANONYMOUS;
402
#if defined(__x86_64__)
403
        flags |= MAP_32BIT;
404
        /* Cannot map more than that */
405
        if (code_gen_buffer_size > (800 * 1024 * 1024))
406
            code_gen_buffer_size = (800 * 1024 * 1024);
407
#endif
408
        code_gen_buffer = mmap(NULL, code_gen_buffer_size,
409
                               PROT_WRITE | PROT_READ | PROT_EXEC, 
410
                               flags, -1, 0);
411
        if (code_gen_buffer == MAP_FAILED) {
412
            fprintf(stderr, "Could not allocate dynamic translator buffer\n");
413
            exit(1);
414
        }
415
    }
416
#else
417
    code_gen_buffer = qemu_malloc(code_gen_buffer_size);
418
    if (!code_gen_buffer) {
419
        fprintf(stderr, "Could not allocate dynamic translator buffer\n");
420
        exit(1);
421
    }
422
    map_exec(code_gen_buffer, code_gen_buffer_size);
423
#endif
424
#endif /* !USE_STATIC_CODE_GEN_BUFFER */
425
    map_exec(code_gen_prologue, sizeof(code_gen_prologue));
426
    code_gen_buffer_max_size = code_gen_buffer_size - 
427
        code_gen_max_block_size();
428
    code_gen_max_blocks = code_gen_buffer_size / CODE_GEN_AVG_BLOCK_SIZE;
429
    tbs = qemu_malloc(code_gen_max_blocks * sizeof(TranslationBlock));
430
}
431

    
432
/* Must be called before using the QEMU cpus. 'tb_size' is the size
433
   (in bytes) allocated to the translation buffer. Zero means default
434
   size. */
435
void cpu_exec_init_all(unsigned long tb_size)
436
{
437
    cpu_gen_init();
438
    code_gen_alloc(tb_size);
439
    code_gen_ptr = code_gen_buffer;
440
    page_init();
441
#if !defined(CONFIG_USER_ONLY)
442
    io_mem_init();
443
#endif
444
}
445

    
446
#if defined(CPU_SAVE_VERSION) && !defined(CONFIG_USER_ONLY)
447

    
448
#define CPU_COMMON_SAVE_VERSION 1
449

    
450
static void cpu_common_save(QEMUFile *f, void *opaque)
451
{
452
    CPUState *env = opaque;
453

    
454
    qemu_put_be32s(f, &env->halted);
455
    qemu_put_be32s(f, &env->interrupt_request);
456
}
457

    
458
static int cpu_common_load(QEMUFile *f, void *opaque, int version_id)
459
{
460
    CPUState *env = opaque;
461

    
462
    if (version_id != CPU_COMMON_SAVE_VERSION)
463
        return -EINVAL;
464

    
465
    qemu_get_be32s(f, &env->halted);
466
    qemu_get_be32s(f, &env->interrupt_request);
467
    tlb_flush(env, 1);
468

    
469
    return 0;
470
}
471
#endif
472

    
473
void cpu_exec_init(CPUState *env)
474
{
475
    CPUState **penv;
476
    int cpu_index;
477

    
478
    env->next_cpu = NULL;
479
    penv = &first_cpu;
480
    cpu_index = 0;
481
    while (*penv != NULL) {
482
        penv = (CPUState **)&(*penv)->next_cpu;
483
        cpu_index++;
484
    }
485
    env->cpu_index = cpu_index;
486
    env->nb_watchpoints = 0;
487
    *penv = env;
488
#if defined(CPU_SAVE_VERSION) && !defined(CONFIG_USER_ONLY)
489
    register_savevm("cpu_common", cpu_index, CPU_COMMON_SAVE_VERSION,
490
                    cpu_common_save, cpu_common_load, env);
491
    register_savevm("cpu", cpu_index, CPU_SAVE_VERSION,
492
                    cpu_save, cpu_load, env);
493
#endif
494
}
495

    
496
static inline void invalidate_page_bitmap(PageDesc *p)
497
{
498
    if (p->code_bitmap) {
499
        qemu_free(p->code_bitmap);
500
        p->code_bitmap = NULL;
501
    }
502
    p->code_write_count = 0;
503
}
504

    
505
/* set to NULL all the 'first_tb' fields in all PageDescs */
506
static void page_flush_tb(void)
507
{
508
    int i, j;
509
    PageDesc *p;
510

    
511
    for(i = 0; i < L1_SIZE; i++) {
512
        p = l1_map[i];
513
        if (p) {
514
            for(j = 0; j < L2_SIZE; j++) {
515
                p->first_tb = NULL;
516
                invalidate_page_bitmap(p);
517
                p++;
518
            }
519
        }
520
    }
521
}
522

    
523
/* flush all the translation blocks */
524
/* XXX: tb_flush is currently not thread safe */
525
void tb_flush(CPUState *env1)
526
{
527
    CPUState *env;
528
#if defined(DEBUG_FLUSH)
529
    printf("qemu: flush code_size=%ld nb_tbs=%d avg_tb_size=%ld\n",
530
           (unsigned long)(code_gen_ptr - code_gen_buffer),
531
           nb_tbs, nb_tbs > 0 ?
532
           ((unsigned long)(code_gen_ptr - code_gen_buffer)) / nb_tbs : 0);
533
#endif
534
    if ((unsigned long)(code_gen_ptr - code_gen_buffer) > code_gen_buffer_size)
535
        cpu_abort(env1, "Internal error: code buffer overflow\n");
536

    
537
    nb_tbs = 0;
538

    
539
    for(env = first_cpu; env != NULL; env = env->next_cpu) {
540
        memset (env->tb_jmp_cache, 0, TB_JMP_CACHE_SIZE * sizeof (void *));
541
    }
542

    
543
    memset (tb_phys_hash, 0, CODE_GEN_PHYS_HASH_SIZE * sizeof (void *));
544
    page_flush_tb();
545

    
546
    code_gen_ptr = code_gen_buffer;
547
    /* XXX: flush processor icache at this point if cache flush is
548
       expensive */
549
    tb_flush_count++;
550
}
551

    
552
#ifdef DEBUG_TB_CHECK
553

    
554
static void tb_invalidate_check(target_ulong address)
555
{
556
    TranslationBlock *tb;
557
    int i;
558
    address &= TARGET_PAGE_MASK;
559
    for(i = 0;i < CODE_GEN_PHYS_HASH_SIZE; i++) {
560
        for(tb = tb_phys_hash[i]; tb != NULL; tb = tb->phys_hash_next) {
561
            if (!(address + TARGET_PAGE_SIZE <= tb->pc ||
562
                  address >= tb->pc + tb->size)) {
563
                printf("ERROR invalidate: address=%08lx PC=%08lx size=%04x\n",
564
                       address, (long)tb->pc, tb->size);
565
            }
566
        }
567
    }
568
}
569

    
570
/* verify that all the pages have correct rights for code */
571
static void tb_page_check(void)
572
{
573
    TranslationBlock *tb;
574
    int i, flags1, flags2;
575

    
576
    for(i = 0;i < CODE_GEN_PHYS_HASH_SIZE; i++) {
577
        for(tb = tb_phys_hash[i]; tb != NULL; tb = tb->phys_hash_next) {
578
            flags1 = page_get_flags(tb->pc);
579
            flags2 = page_get_flags(tb->pc + tb->size - 1);
580
            if ((flags1 & PAGE_WRITE) || (flags2 & PAGE_WRITE)) {
581
                printf("ERROR page flags: PC=%08lx size=%04x f1=%x f2=%x\n",
582
                       (long)tb->pc, tb->size, flags1, flags2);
583
            }
584
        }
585
    }
586
}
587

    
588
void tb_jmp_check(TranslationBlock *tb)
589
{
590
    TranslationBlock *tb1;
591
    unsigned int n1;
592

    
593
    /* suppress any remaining jumps to this TB */
594
    tb1 = tb->jmp_first;
595
    for(;;) {
596
        n1 = (long)tb1 & 3;
597
        tb1 = (TranslationBlock *)((long)tb1 & ~3);
598
        if (n1 == 2)
599
            break;
600
        tb1 = tb1->jmp_next[n1];
601
    }
602
    /* check end of list */
603
    if (tb1 != tb) {
604
        printf("ERROR: jmp_list from 0x%08lx\n", (long)tb);
605
    }
606
}
607

    
608
#endif
609

    
610
/* invalidate one TB */
611
static inline void tb_remove(TranslationBlock **ptb, TranslationBlock *tb,
612
                             int next_offset)
613
{
614
    TranslationBlock *tb1;
615
    for(;;) {
616
        tb1 = *ptb;
617
        if (tb1 == tb) {
618
            *ptb = *(TranslationBlock **)((char *)tb1 + next_offset);
619
            break;
620
        }
621
        ptb = (TranslationBlock **)((char *)tb1 + next_offset);
622
    }
623
}
624

    
625
static inline void tb_page_remove(TranslationBlock **ptb, TranslationBlock *tb)
626
{
627
    TranslationBlock *tb1;
628
    unsigned int n1;
629

    
630
    for(;;) {
631
        tb1 = *ptb;
632
        n1 = (long)tb1 & 3;
633
        tb1 = (TranslationBlock *)((long)tb1 & ~3);
634
        if (tb1 == tb) {
635
            *ptb = tb1->page_next[n1];
636
            break;
637
        }
638
        ptb = &tb1->page_next[n1];
639
    }
640
}
641

    
642
static inline void tb_jmp_remove(TranslationBlock *tb, int n)
643
{
644
    TranslationBlock *tb1, **ptb;
645
    unsigned int n1;
646

    
647
    ptb = &tb->jmp_next[n];
648
    tb1 = *ptb;
649
    if (tb1) {
650
        /* find tb(n) in circular list */
651
        for(;;) {
652
            tb1 = *ptb;
653
            n1 = (long)tb1 & 3;
654
            tb1 = (TranslationBlock *)((long)tb1 & ~3);
655
            if (n1 == n && tb1 == tb)
656
                break;
657
            if (n1 == 2) {
658
                ptb = &tb1->jmp_first;
659
            } else {
660
                ptb = &tb1->jmp_next[n1];
661
            }
662
        }
663
        /* now we can suppress tb(n) from the list */
664
        *ptb = tb->jmp_next[n];
665

    
666
        tb->jmp_next[n] = NULL;
667
    }
668
}
669

    
670
/* reset the jump entry 'n' of a TB so that it is not chained to
671
   another TB */
672
static inline void tb_reset_jump(TranslationBlock *tb, int n)
673
{
674
    tb_set_jmp_target(tb, n, (unsigned long)(tb->tc_ptr + tb->tb_next_offset[n]));
675
}
676

    
677
void tb_phys_invalidate(TranslationBlock *tb, target_ulong page_addr)
678
{
679
    CPUState *env;
680
    PageDesc *p;
681
    unsigned int h, n1;
682
    target_phys_addr_t phys_pc;
683
    TranslationBlock *tb1, *tb2;
684

    
685
    /* remove the TB from the hash list */
686
    phys_pc = tb->page_addr[0] + (tb->pc & ~TARGET_PAGE_MASK);
687
    h = tb_phys_hash_func(phys_pc);
688
    tb_remove(&tb_phys_hash[h], tb,
689
              offsetof(TranslationBlock, phys_hash_next));
690

    
691
    /* remove the TB from the page list */
692
    if (tb->page_addr[0] != page_addr) {
693
        p = page_find(tb->page_addr[0] >> TARGET_PAGE_BITS);
694
        tb_page_remove(&p->first_tb, tb);
695
        invalidate_page_bitmap(p);
696
    }
697
    if (tb->page_addr[1] != -1 && tb->page_addr[1] != page_addr) {
698
        p = page_find(tb->page_addr[1] >> TARGET_PAGE_BITS);
699
        tb_page_remove(&p->first_tb, tb);
700
        invalidate_page_bitmap(p);
701
    }
702

    
703
    tb_invalidated_flag = 1;
704

    
705
    /* remove the TB from the hash list */
706
    h = tb_jmp_cache_hash_func(tb->pc);
707
    for(env = first_cpu; env != NULL; env = env->next_cpu) {
708
        if (env->tb_jmp_cache[h] == tb)
709
            env->tb_jmp_cache[h] = NULL;
710
    }
711

    
712
    /* suppress this TB from the two jump lists */
713
    tb_jmp_remove(tb, 0);
714
    tb_jmp_remove(tb, 1);
715

    
716
    /* suppress any remaining jumps to this TB */
717
    tb1 = tb->jmp_first;
718
    for(;;) {
719
        n1 = (long)tb1 & 3;
720
        if (n1 == 2)
721
            break;
722
        tb1 = (TranslationBlock *)((long)tb1 & ~3);
723
        tb2 = tb1->jmp_next[n1];
724
        tb_reset_jump(tb1, n1);
725
        tb1->jmp_next[n1] = NULL;
726
        tb1 = tb2;
727
    }
728
    tb->jmp_first = (TranslationBlock *)((long)tb | 2); /* fail safe */
729

    
730
    tb_phys_invalidate_count++;
731
}
732

    
733
static inline void set_bits(uint8_t *tab, int start, int len)
734
{
735
    int end, mask, end1;
736

    
737
    end = start + len;
738
    tab += start >> 3;
739
    mask = 0xff << (start & 7);
740
    if ((start & ~7) == (end & ~7)) {
741
        if (start < end) {
742
            mask &= ~(0xff << (end & 7));
743
            *tab |= mask;
744
        }
745
    } else {
746
        *tab++ |= mask;
747
        start = (start + 8) & ~7;
748
        end1 = end & ~7;
749
        while (start < end1) {
750
            *tab++ = 0xff;
751
            start += 8;
752
        }
753
        if (start < end) {
754
            mask = ~(0xff << (end & 7));
755
            *tab |= mask;
756
        }
757
    }
758
}
759

    
760
static void build_page_bitmap(PageDesc *p)
761
{
762
    int n, tb_start, tb_end;
763
    TranslationBlock *tb;
764

    
765
    p->code_bitmap = qemu_mallocz(TARGET_PAGE_SIZE / 8);
766
    if (!p->code_bitmap)
767
        return;
768

    
769
    tb = p->first_tb;
770
    while (tb != NULL) {
771
        n = (long)tb & 3;
772
        tb = (TranslationBlock *)((long)tb & ~3);
773
        /* NOTE: this is subtle as a TB may span two physical pages */
774
        if (n == 0) {
775
            /* NOTE: tb_end may be after the end of the page, but
776
               it is not a problem */
777
            tb_start = tb->pc & ~TARGET_PAGE_MASK;
778
            tb_end = tb_start + tb->size;
779
            if (tb_end > TARGET_PAGE_SIZE)
780
                tb_end = TARGET_PAGE_SIZE;
781
        } else {
782
            tb_start = 0;
783
            tb_end = ((tb->pc + tb->size) & ~TARGET_PAGE_MASK);
784
        }
785
        set_bits(p->code_bitmap, tb_start, tb_end - tb_start);
786
        tb = tb->page_next[n];
787
    }
788
}
789

    
790
TranslationBlock *tb_gen_code(CPUState *env,
791
                              target_ulong pc, target_ulong cs_base,
792
                              int flags, int cflags)
793
{
794
    TranslationBlock *tb;
795
    uint8_t *tc_ptr;
796
    target_ulong phys_pc, phys_page2, virt_page2;
797
    int code_gen_size;
798

    
799
    phys_pc = get_phys_addr_code(env, pc);
800
    tb = tb_alloc(pc);
801
    if (!tb) {
802
        /* flush must be done */
803
        tb_flush(env);
804
        /* cannot fail at this point */
805
        tb = tb_alloc(pc);
806
        /* Don't forget to invalidate previous TB info.  */
807
        tb_invalidated_flag = 1;
808
    }
809
    tc_ptr = code_gen_ptr;
810
    tb->tc_ptr = tc_ptr;
811
    tb->cs_base = cs_base;
812
    tb->flags = flags;
813
    tb->cflags = cflags;
814
    cpu_gen_code(env, tb, &code_gen_size);
815
    code_gen_ptr = (void *)(((unsigned long)code_gen_ptr + code_gen_size + CODE_GEN_ALIGN - 1) & ~(CODE_GEN_ALIGN - 1));
816

    
817
    /* check next page if needed */
818
    virt_page2 = (pc + tb->size - 1) & TARGET_PAGE_MASK;
819
    phys_page2 = -1;
820
    if ((pc & TARGET_PAGE_MASK) != virt_page2) {
821
        phys_page2 = get_phys_addr_code(env, virt_page2);
822
    }
823
    tb_link_phys(tb, phys_pc, phys_page2);
824
    return tb;
825
}
826

    
827
/* invalidate all TBs which intersect with the target physical page
828
   starting in range [start;end[. NOTE: start and end must refer to
829
   the same physical page. 'is_cpu_write_access' should be true if called
830
   from a real cpu write access: the virtual CPU will exit the current
831
   TB if code is modified inside this TB. */
832
void tb_invalidate_phys_page_range(target_phys_addr_t start, target_phys_addr_t end,
833
                                   int is_cpu_write_access)
834
{
835
    int n, current_tb_modified, current_tb_not_found, current_flags;
836
    CPUState *env = cpu_single_env;
837
    PageDesc *p;
838
    TranslationBlock *tb, *tb_next, *current_tb, *saved_tb;
839
    target_ulong tb_start, tb_end;
840
    target_ulong current_pc, current_cs_base;
841

    
842
    p = page_find(start >> TARGET_PAGE_BITS);
843
    if (!p)
844
        return;
845
    if (!p->code_bitmap &&
846
        ++p->code_write_count >= SMC_BITMAP_USE_THRESHOLD &&
847
        is_cpu_write_access) {
848
        /* build code bitmap */
849
        build_page_bitmap(p);
850
    }
851

    
852
    /* we remove all the TBs in the range [start, end[ */
853
    /* XXX: see if in some cases it could be faster to invalidate all the code */
854
    current_tb_not_found = is_cpu_write_access;
855
    current_tb_modified = 0;
856
    current_tb = NULL; /* avoid warning */
857
    current_pc = 0; /* avoid warning */
858
    current_cs_base = 0; /* avoid warning */
859
    current_flags = 0; /* avoid warning */
860
    tb = p->first_tb;
861
    while (tb != NULL) {
862
        n = (long)tb & 3;
863
        tb = (TranslationBlock *)((long)tb & ~3);
864
        tb_next = tb->page_next[n];
865
        /* NOTE: this is subtle as a TB may span two physical pages */
866
        if (n == 0) {
867
            /* NOTE: tb_end may be after the end of the page, but
868
               it is not a problem */
869
            tb_start = tb->page_addr[0] + (tb->pc & ~TARGET_PAGE_MASK);
870
            tb_end = tb_start + tb->size;
871
        } else {
872
            tb_start = tb->page_addr[1];
873
            tb_end = tb_start + ((tb->pc + tb->size) & ~TARGET_PAGE_MASK);
874
        }
875
        if (!(tb_end <= start || tb_start >= end)) {
876
#ifdef TARGET_HAS_PRECISE_SMC
877
            if (current_tb_not_found) {
878
                current_tb_not_found = 0;
879
                current_tb = NULL;
880
                if (env->mem_io_pc) {
881
                    /* now we have a real cpu fault */
882
                    current_tb = tb_find_pc(env->mem_io_pc);
883
                }
884
            }
885
            if (current_tb == tb &&
886
                (current_tb->cflags & CF_COUNT_MASK) != 1) {
887
                /* If we are modifying the current TB, we must stop
888
                its execution. We could be more precise by checking
889
                that the modification is after the current PC, but it
890
                would require a specialized function to partially
891
                restore the CPU state */
892

    
893
                current_tb_modified = 1;
894
                cpu_restore_state(current_tb, env,
895
                                  env->mem_io_pc, NULL);
896
#if defined(TARGET_I386)
897
                current_flags = env->hflags;
898
                current_flags |= (env->eflags & (IOPL_MASK | TF_MASK | VM_MASK));
899
                current_cs_base = (target_ulong)env->segs[R_CS].base;
900
                current_pc = current_cs_base + env->eip;
901
#else
902
#error unsupported CPU
903
#endif
904
            }
905
#endif /* TARGET_HAS_PRECISE_SMC */
906
            /* we need to do that to handle the case where a signal
907
               occurs while doing tb_phys_invalidate() */
908
            saved_tb = NULL;
909
            if (env) {
910
                saved_tb = env->current_tb;
911
                env->current_tb = NULL;
912
            }
913
            tb_phys_invalidate(tb, -1);
914
            if (env) {
915
                env->current_tb = saved_tb;
916
                if (env->interrupt_request && env->current_tb)
917
                    cpu_interrupt(env, env->interrupt_request);
918
            }
919
        }
920
        tb = tb_next;
921
    }
922
#if !defined(CONFIG_USER_ONLY)
923
    /* if no code remaining, no need to continue to use slow writes */
924
    if (!p->first_tb) {
925
        invalidate_page_bitmap(p);
926
        if (is_cpu_write_access) {
927
            tlb_unprotect_code_phys(env, start, env->mem_io_vaddr);
928
        }
929
    }
930
#endif
931
#ifdef TARGET_HAS_PRECISE_SMC
932
    if (current_tb_modified) {
933
        /* we generate a block containing just the instruction
934
           modifying the memory. It will ensure that it cannot modify
935
           itself */
936
        env->current_tb = NULL;
937
        tb_gen_code(env, current_pc, current_cs_base, current_flags, 1);
938
        cpu_resume_from_signal(env, NULL);
939
    }
940
#endif
941
}
942

    
943
/* len must be <= 8 and start must be a multiple of len */
944
static inline void tb_invalidate_phys_page_fast(target_phys_addr_t start, int len)
945
{
946
    PageDesc *p;
947
    int offset, b;
948
#if 0
949
    if (1) {
950
        if (loglevel) {
951
            fprintf(logfile, "modifying code at 0x%x size=%d EIP=%x PC=%08x\n",
952
                   cpu_single_env->mem_io_vaddr, len,
953
                   cpu_single_env->eip,
954
                   cpu_single_env->eip + (long)cpu_single_env->segs[R_CS].base);
955
        }
956
    }
957
#endif
958
    p = page_find(start >> TARGET_PAGE_BITS);
959
    if (!p)
960
        return;
961
    if (p->code_bitmap) {
962
        offset = start & ~TARGET_PAGE_MASK;
963
        b = p->code_bitmap[offset >> 3] >> (offset & 7);
964
        if (b & ((1 << len) - 1))
965
            goto do_invalidate;
966
    } else {
967
    do_invalidate:
968
        tb_invalidate_phys_page_range(start, start + len, 1);
969
    }
970
}
971

    
972
#if !defined(CONFIG_SOFTMMU)
973
static void tb_invalidate_phys_page(target_phys_addr_t addr,
974
                                    unsigned long pc, void *puc)
975
{
976
    int n, current_flags, current_tb_modified;
977
    target_ulong current_pc, current_cs_base;
978
    PageDesc *p;
979
    TranslationBlock *tb, *current_tb;
980
#ifdef TARGET_HAS_PRECISE_SMC
981
    CPUState *env = cpu_single_env;
982
#endif
983

    
984
    addr &= TARGET_PAGE_MASK;
985
    p = page_find(addr >> TARGET_PAGE_BITS);
986
    if (!p)
987
        return;
988
    tb = p->first_tb;
989
    current_tb_modified = 0;
990
    current_tb = NULL;
991
    current_pc = 0; /* avoid warning */
992
    current_cs_base = 0; /* avoid warning */
993
    current_flags = 0; /* avoid warning */
994
#ifdef TARGET_HAS_PRECISE_SMC
995
    if (tb && pc != 0) {
996
        current_tb = tb_find_pc(pc);
997
    }
998
#endif
999
    while (tb != NULL) {
1000
        n = (long)tb & 3;
1001
        tb = (TranslationBlock *)((long)tb & ~3);
1002
#ifdef TARGET_HAS_PRECISE_SMC
1003
        if (current_tb == tb &&
1004
            (current_tb->cflags & CF_COUNT_MASK) != 1) {
1005
                /* If we are modifying the current TB, we must stop
1006
                   its execution. We could be more precise by checking
1007
                   that the modification is after the current PC, but it
1008
                   would require a specialized function to partially
1009
                   restore the CPU state */
1010

    
1011
            current_tb_modified = 1;
1012
            cpu_restore_state(current_tb, env, pc, puc);
1013
#if defined(TARGET_I386)
1014
            current_flags = env->hflags;
1015
            current_flags |= (env->eflags & (IOPL_MASK | TF_MASK | VM_MASK));
1016
            current_cs_base = (target_ulong)env->segs[R_CS].base;
1017
            current_pc = current_cs_base + env->eip;
1018
#else
1019
#error unsupported CPU
1020
#endif
1021
        }
1022
#endif /* TARGET_HAS_PRECISE_SMC */
1023
        tb_phys_invalidate(tb, addr);
1024
        tb = tb->page_next[n];
1025
    }
1026
    p->first_tb = NULL;
1027
#ifdef TARGET_HAS_PRECISE_SMC
1028
    if (current_tb_modified) {
1029
        /* we generate a block containing just the instruction
1030
           modifying the memory. It will ensure that it cannot modify
1031
           itself */
1032
        env->current_tb = NULL;
1033
        tb_gen_code(env, current_pc, current_cs_base, current_flags, 1);
1034
        cpu_resume_from_signal(env, puc);
1035
    }
1036
#endif
1037
}
1038
#endif
1039

    
1040
/* add the tb in the target page and protect it if necessary */
1041
static inline void tb_alloc_page(TranslationBlock *tb,
1042
                                 unsigned int n, target_ulong page_addr)
1043
{
1044
    PageDesc *p;
1045
    TranslationBlock *last_first_tb;
1046

    
1047
    tb->page_addr[n] = page_addr;
1048
    p = page_find_alloc(page_addr >> TARGET_PAGE_BITS);
1049
    tb->page_next[n] = p->first_tb;
1050
    last_first_tb = p->first_tb;
1051
    p->first_tb = (TranslationBlock *)((long)tb | n);
1052
    invalidate_page_bitmap(p);
1053

    
1054
#if defined(TARGET_HAS_SMC) || 1
1055

    
1056
#if defined(CONFIG_USER_ONLY)
1057
    if (p->flags & PAGE_WRITE) {
1058
        target_ulong addr;
1059
        PageDesc *p2;
1060
        int prot;
1061

    
1062
        /* force the host page as non writable (writes will have a
1063
           page fault + mprotect overhead) */
1064
        page_addr &= qemu_host_page_mask;
1065
        prot = 0;
1066
        for(addr = page_addr; addr < page_addr + qemu_host_page_size;
1067
            addr += TARGET_PAGE_SIZE) {
1068

    
1069
            p2 = page_find (addr >> TARGET_PAGE_BITS);
1070
            if (!p2)
1071
                continue;
1072
            prot |= p2->flags;
1073
            p2->flags &= ~PAGE_WRITE;
1074
            page_get_flags(addr);
1075
          }
1076
        mprotect(g2h(page_addr), qemu_host_page_size,
1077
                 (prot & PAGE_BITS) & ~PAGE_WRITE);
1078
#ifdef DEBUG_TB_INVALIDATE
1079
        printf("protecting code page: 0x" TARGET_FMT_lx "\n",
1080
               page_addr);
1081
#endif
1082
    }
1083
#else
1084
    /* if some code is already present, then the pages are already
1085
       protected. So we handle the case where only the first TB is
1086
       allocated in a physical page */
1087
    if (!last_first_tb) {
1088
        tlb_protect_code(page_addr);
1089
    }
1090
#endif
1091

    
1092
#endif /* TARGET_HAS_SMC */
1093
}
1094

    
1095
/* Allocate a new translation block. Flush the translation buffer if
1096
   too many translation blocks or too much generated code. */
1097
TranslationBlock *tb_alloc(target_ulong pc)
1098
{
1099
    TranslationBlock *tb;
1100

    
1101
    if (nb_tbs >= code_gen_max_blocks ||
1102
        (code_gen_ptr - code_gen_buffer) >= code_gen_buffer_max_size)
1103
        return NULL;
1104
    tb = &tbs[nb_tbs++];
1105
    tb->pc = pc;
1106
    tb->cflags = 0;
1107
    return tb;
1108
}
1109

    
1110
void tb_free(TranslationBlock *tb)
1111
{
1112
    /* In practice this is mostly used for single use temporary TB
1113
       Ignore the hard cases and just back up if this TB happens to
1114
       be the last one generated.  */
1115
    if (nb_tbs > 0 && tb == &tbs[nb_tbs - 1]) {
1116
        code_gen_ptr = tb->tc_ptr;
1117
        nb_tbs--;
1118
    }
1119
}
1120

    
1121
/* add a new TB and link it to the physical page tables. phys_page2 is
1122
   (-1) to indicate that only one page contains the TB. */
1123
void tb_link_phys(TranslationBlock *tb,
1124
                  target_ulong phys_pc, target_ulong phys_page2)
1125
{
1126
    unsigned int h;
1127
    TranslationBlock **ptb;
1128

    
1129
    /* Grab the mmap lock to stop another thread invalidating this TB
1130
       before we are done.  */
1131
    mmap_lock();
1132
    /* add in the physical hash table */
1133
    h = tb_phys_hash_func(phys_pc);
1134
    ptb = &tb_phys_hash[h];
1135
    tb->phys_hash_next = *ptb;
1136
    *ptb = tb;
1137

    
1138
    /* add in the page list */
1139
    tb_alloc_page(tb, 0, phys_pc & TARGET_PAGE_MASK);
1140
    if (phys_page2 != -1)
1141
        tb_alloc_page(tb, 1, phys_page2);
1142
    else
1143
        tb->page_addr[1] = -1;
1144

    
1145
    tb->jmp_first = (TranslationBlock *)((long)tb | 2);
1146
    tb->jmp_next[0] = NULL;
1147
    tb->jmp_next[1] = NULL;
1148

    
1149
    /* init original jump addresses */
1150
    if (tb->tb_next_offset[0] != 0xffff)
1151
        tb_reset_jump(tb, 0);
1152
    if (tb->tb_next_offset[1] != 0xffff)
1153
        tb_reset_jump(tb, 1);
1154

    
1155
#ifdef DEBUG_TB_CHECK
1156
    tb_page_check();
1157
#endif
1158
    mmap_unlock();
1159
}
1160

    
1161
/* find the TB 'tb' such that tb[0].tc_ptr <= tc_ptr <
1162
   tb[1].tc_ptr. Return NULL if not found */
1163
TranslationBlock *tb_find_pc(unsigned long tc_ptr)
1164
{
1165
    int m_min, m_max, m;
1166
    unsigned long v;
1167
    TranslationBlock *tb;
1168

    
1169
    if (nb_tbs <= 0)
1170
        return NULL;
1171
    if (tc_ptr < (unsigned long)code_gen_buffer ||
1172
        tc_ptr >= (unsigned long)code_gen_ptr)
1173
        return NULL;
1174
    /* binary search (cf Knuth) */
1175
    m_min = 0;
1176
    m_max = nb_tbs - 1;
1177
    while (m_min <= m_max) {
1178
        m = (m_min + m_max) >> 1;
1179
        tb = &tbs[m];
1180
        v = (unsigned long)tb->tc_ptr;
1181
        if (v == tc_ptr)
1182
            return tb;
1183
        else if (tc_ptr < v) {
1184
            m_max = m - 1;
1185
        } else {
1186
            m_min = m + 1;
1187
        }
1188
    }
1189
    return &tbs[m_max];
1190
}
1191

    
1192
static void tb_reset_jump_recursive(TranslationBlock *tb);
1193

    
1194
static inline void tb_reset_jump_recursive2(TranslationBlock *tb, int n)
1195
{
1196
    TranslationBlock *tb1, *tb_next, **ptb;
1197
    unsigned int n1;
1198

    
1199
    tb1 = tb->jmp_next[n];
1200
    if (tb1 != NULL) {
1201
        /* find head of list */
1202
        for(;;) {
1203
            n1 = (long)tb1 & 3;
1204
            tb1 = (TranslationBlock *)((long)tb1 & ~3);
1205
            if (n1 == 2)
1206
                break;
1207
            tb1 = tb1->jmp_next[n1];
1208
        }
1209
        /* we are now sure now that tb jumps to tb1 */
1210
        tb_next = tb1;
1211

    
1212
        /* remove tb from the jmp_first list */
1213
        ptb = &tb_next->jmp_first;
1214
        for(;;) {
1215
            tb1 = *ptb;
1216
            n1 = (long)tb1 & 3;
1217
            tb1 = (TranslationBlock *)((long)tb1 & ~3);
1218
            if (n1 == n && tb1 == tb)
1219
                break;
1220
            ptb = &tb1->jmp_next[n1];
1221
        }
1222
        *ptb = tb->jmp_next[n];
1223
        tb->jmp_next[n] = NULL;
1224

    
1225
        /* suppress the jump to next tb in generated code */
1226
        tb_reset_jump(tb, n);
1227

    
1228
        /* suppress jumps in the tb on which we could have jumped */
1229
        tb_reset_jump_recursive(tb_next);
1230
    }
1231
}
1232

    
1233
static void tb_reset_jump_recursive(TranslationBlock *tb)
1234
{
1235
    tb_reset_jump_recursive2(tb, 0);
1236
    tb_reset_jump_recursive2(tb, 1);
1237
}
1238

    
1239
#if defined(TARGET_HAS_ICE)
1240
static void breakpoint_invalidate(CPUState *env, target_ulong pc)
1241
{
1242
    target_phys_addr_t addr;
1243
    target_ulong pd;
1244
    ram_addr_t ram_addr;
1245
    PhysPageDesc *p;
1246

    
1247
    addr = cpu_get_phys_page_debug(env, pc);
1248
    p = phys_page_find(addr >> TARGET_PAGE_BITS);
1249
    if (!p) {
1250
        pd = IO_MEM_UNASSIGNED;
1251
    } else {
1252
        pd = p->phys_offset;
1253
    }
1254
    ram_addr = (pd & TARGET_PAGE_MASK) | (pc & ~TARGET_PAGE_MASK);
1255
    tb_invalidate_phys_page_range(ram_addr, ram_addr + 1, 0);
1256
}
1257
#endif
1258

    
1259
/* Add a watchpoint.  */
1260
int cpu_watchpoint_insert(CPUState *env, target_ulong addr, int type)
1261
{
1262
    int i;
1263

    
1264
    for (i = 0; i < env->nb_watchpoints; i++) {
1265
        if (addr == env->watchpoint[i].vaddr)
1266
            return 0;
1267
    }
1268
    if (env->nb_watchpoints >= MAX_WATCHPOINTS)
1269
        return -1;
1270

    
1271
    i = env->nb_watchpoints++;
1272
    env->watchpoint[i].vaddr = addr;
1273
    env->watchpoint[i].type = type;
1274
    tlb_flush_page(env, addr);
1275
    /* FIXME: This flush is needed because of the hack to make memory ops
1276
       terminate the TB.  It can be removed once the proper IO trap and
1277
       re-execute bits are in.  */
1278
    tb_flush(env);
1279
    return i;
1280
}
1281

    
1282
/* Remove a watchpoint.  */
1283
int cpu_watchpoint_remove(CPUState *env, target_ulong addr)
1284
{
1285
    int i;
1286

    
1287
    for (i = 0; i < env->nb_watchpoints; i++) {
1288
        if (addr == env->watchpoint[i].vaddr) {
1289
            env->nb_watchpoints--;
1290
            env->watchpoint[i] = env->watchpoint[env->nb_watchpoints];
1291
            tlb_flush_page(env, addr);
1292
            return 0;
1293
        }
1294
    }
1295
    return -1;
1296
}
1297

    
1298
/* Remove all watchpoints. */
1299
void cpu_watchpoint_remove_all(CPUState *env) {
1300
    int i;
1301

    
1302
    for (i = 0; i < env->nb_watchpoints; i++) {
1303
        tlb_flush_page(env, env->watchpoint[i].vaddr);
1304
    }
1305
    env->nb_watchpoints = 0;
1306
}
1307

    
1308
/* add a breakpoint. EXCP_DEBUG is returned by the CPU loop if a
1309
   breakpoint is reached */
1310
int cpu_breakpoint_insert(CPUState *env, target_ulong pc)
1311
{
1312
#if defined(TARGET_HAS_ICE)
1313
    int i;
1314

    
1315
    for(i = 0; i < env->nb_breakpoints; i++) {
1316
        if (env->breakpoints[i] == pc)
1317
            return 0;
1318
    }
1319

    
1320
    if (env->nb_breakpoints >= MAX_BREAKPOINTS)
1321
        return -1;
1322
    env->breakpoints[env->nb_breakpoints++] = pc;
1323

    
1324
    breakpoint_invalidate(env, pc);
1325
    return 0;
1326
#else
1327
    return -1;
1328
#endif
1329
}
1330

    
1331
/* remove all breakpoints */
1332
void cpu_breakpoint_remove_all(CPUState *env) {
1333
#if defined(TARGET_HAS_ICE)
1334
    int i;
1335
    for(i = 0; i < env->nb_breakpoints; i++) {
1336
        breakpoint_invalidate(env, env->breakpoints[i]);
1337
    }
1338
    env->nb_breakpoints = 0;
1339
#endif
1340
}
1341

    
1342
/* remove a breakpoint */
1343
int cpu_breakpoint_remove(CPUState *env, target_ulong pc)
1344
{
1345
#if defined(TARGET_HAS_ICE)
1346
    int i;
1347
    for(i = 0; i < env->nb_breakpoints; i++) {
1348
        if (env->breakpoints[i] == pc)
1349
            goto found;
1350
    }
1351
    return -1;
1352
 found:
1353
    env->nb_breakpoints--;
1354
    if (i < env->nb_breakpoints)
1355
      env->breakpoints[i] = env->breakpoints[env->nb_breakpoints];
1356

    
1357
    breakpoint_invalidate(env, pc);
1358
    return 0;
1359
#else
1360
    return -1;
1361
#endif
1362
}
1363

    
1364
/* enable or disable single step mode. EXCP_DEBUG is returned by the
1365
   CPU loop after each instruction */
1366
void cpu_single_step(CPUState *env, int enabled)
1367
{
1368
#if defined(TARGET_HAS_ICE)
1369
    if (env->singlestep_enabled != enabled) {
1370
        env->singlestep_enabled = enabled;
1371
        /* must flush all the translated code to avoid inconsistancies */
1372
        /* XXX: only flush what is necessary */
1373
        tb_flush(env);
1374
    }
1375
#endif
1376
}
1377

    
1378
/* enable or disable low levels log */
1379
void cpu_set_log(int log_flags)
1380
{
1381
    loglevel = log_flags;
1382
    if (loglevel && !logfile) {
1383
        logfile = fopen(logfilename, log_append ? "a" : "w");
1384
        if (!logfile) {
1385
            perror(logfilename);
1386
            _exit(1);
1387
        }
1388
#if !defined(CONFIG_SOFTMMU)
1389
        /* must avoid mmap() usage of glibc by setting a buffer "by hand" */
1390
        {
1391
            static uint8_t logfile_buf[4096];
1392
            setvbuf(logfile, logfile_buf, _IOLBF, sizeof(logfile_buf));
1393
        }
1394
#else
1395
        setvbuf(logfile, NULL, _IOLBF, 0);
1396
#endif
1397
        log_append = 1;
1398
    }
1399
    if (!loglevel && logfile) {
1400
        fclose(logfile);
1401
        logfile = NULL;
1402
    }
1403
}
1404

    
1405
void cpu_set_log_filename(const char *filename)
1406
{
1407
    logfilename = strdup(filename);
1408
    if (logfile) {
1409
        fclose(logfile);
1410
        logfile = NULL;
1411
    }
1412
    cpu_set_log(loglevel);
1413
}
1414

    
1415
/* mask must never be zero, except for A20 change call */
1416
void cpu_interrupt(CPUState *env, int mask)
1417
{
1418
#if !defined(USE_NPTL)
1419
    TranslationBlock *tb;
1420
    static spinlock_t interrupt_lock = SPIN_LOCK_UNLOCKED;
1421
#endif
1422
    int old_mask;
1423

    
1424
    old_mask = env->interrupt_request;
1425
    /* FIXME: This is probably not threadsafe.  A different thread could
1426
       be in the middle of a read-modify-write operation.  */
1427
    env->interrupt_request |= mask;
1428
#if defined(USE_NPTL)
1429
    /* FIXME: TB unchaining isn't SMP safe.  For now just ignore the
1430
       problem and hope the cpu will stop of its own accord.  For userspace
1431
       emulation this often isn't actually as bad as it sounds.  Often
1432
       signals are used primarily to interrupt blocking syscalls.  */
1433
#else
1434
    if (use_icount) {
1435
        env->icount_decr.u16.high = 0x8000;
1436
#ifndef CONFIG_USER_ONLY
1437
        /* CPU_INTERRUPT_EXIT isn't a real interrupt.  It just means
1438
           an async event happened and we need to process it.  */
1439
        if (!can_do_io(env)
1440
            && (mask & ~(old_mask | CPU_INTERRUPT_EXIT)) != 0) {
1441
            cpu_abort(env, "Raised interrupt while not in I/O function");
1442
        }
1443
#endif
1444
    } else {
1445
        tb = env->current_tb;
1446
        /* if the cpu is currently executing code, we must unlink it and
1447
           all the potentially executing TB */
1448
        if (tb && !testandset(&interrupt_lock)) {
1449
            env->current_tb = NULL;
1450
            tb_reset_jump_recursive(tb);
1451
            resetlock(&interrupt_lock);
1452
        }
1453
    }
1454
#endif
1455
}
1456

    
1457
void cpu_reset_interrupt(CPUState *env, int mask)
1458
{
1459
    env->interrupt_request &= ~mask;
1460
}
1461

    
1462
CPULogItem cpu_log_items[] = {
1463
    { CPU_LOG_TB_OUT_ASM, "out_asm",
1464
      "show generated host assembly code for each compiled TB" },
1465
    { CPU_LOG_TB_IN_ASM, "in_asm",
1466
      "show target assembly code for each compiled TB" },
1467
    { CPU_LOG_TB_OP, "op",
1468
      "show micro ops for each compiled TB" },
1469
    { CPU_LOG_TB_OP_OPT, "op_opt",
1470
      "show micro ops "
1471
#ifdef TARGET_I386
1472
      "before eflags optimization and "
1473
#endif
1474
      "after liveness analysis" },
1475
    { CPU_LOG_INT, "int",
1476
      "show interrupts/exceptions in short format" },
1477
    { CPU_LOG_EXEC, "exec",
1478
      "show trace before each executed TB (lots of logs)" },
1479
    { CPU_LOG_TB_CPU, "cpu",
1480
      "show CPU state before block translation" },
1481
#ifdef TARGET_I386
1482
    { CPU_LOG_PCALL, "pcall",
1483
      "show protected mode far calls/returns/exceptions" },
1484
#endif
1485
#ifdef DEBUG_IOPORT
1486
    { CPU_LOG_IOPORT, "ioport",
1487
      "show all i/o ports accesses" },
1488
#endif
1489
    { 0, NULL, NULL },
1490
};
1491

    
1492
static int cmp1(const char *s1, int n, const char *s2)
1493
{
1494
    if (strlen(s2) != n)
1495
        return 0;
1496
    return memcmp(s1, s2, n) == 0;
1497
}
1498

    
1499
/* takes a comma separated list of log masks. Return 0 if error. */
1500
int cpu_str_to_log_mask(const char *str)
1501
{
1502
    CPULogItem *item;
1503
    int mask;
1504
    const char *p, *p1;
1505

    
1506
    p = str;
1507
    mask = 0;
1508
    for(;;) {
1509
        p1 = strchr(p, ',');
1510
        if (!p1)
1511
            p1 = p + strlen(p);
1512
        if(cmp1(p,p1-p,"all")) {
1513
                for(item = cpu_log_items; item->mask != 0; item++) {
1514
                        mask |= item->mask;
1515
                }
1516
        } else {
1517
        for(item = cpu_log_items; item->mask != 0; item++) {
1518
            if (cmp1(p, p1 - p, item->name))
1519
                goto found;
1520
        }
1521
        return 0;
1522
        }
1523
    found:
1524
        mask |= item->mask;
1525
        if (*p1 != ',')
1526
            break;
1527
        p = p1 + 1;
1528
    }
1529
    return mask;
1530
}
1531

    
1532
void cpu_abort(CPUState *env, const char *fmt, ...)
1533
{
1534
    va_list ap;
1535
    va_list ap2;
1536

    
1537
    va_start(ap, fmt);
1538
    va_copy(ap2, ap);
1539
    fprintf(stderr, "qemu: fatal: ");
1540
    vfprintf(stderr, fmt, ap);
1541
    fprintf(stderr, "\n");
1542
#ifdef TARGET_I386
1543
    cpu_dump_state(env, stderr, fprintf, X86_DUMP_FPU | X86_DUMP_CCOP);
1544
#else
1545
    cpu_dump_state(env, stderr, fprintf, 0);
1546
#endif
1547
    if (logfile) {
1548
        fprintf(logfile, "qemu: fatal: ");
1549
        vfprintf(logfile, fmt, ap2);
1550
        fprintf(logfile, "\n");
1551
#ifdef TARGET_I386
1552
        cpu_dump_state(env, logfile, fprintf, X86_DUMP_FPU | X86_DUMP_CCOP);
1553
#else
1554
        cpu_dump_state(env, logfile, fprintf, 0);
1555
#endif
1556
        fflush(logfile);
1557
        fclose(logfile);
1558
    }
1559
    va_end(ap2);
1560
    va_end(ap);
1561
    abort();
1562
}
1563

    
1564
CPUState *cpu_copy(CPUState *env)
1565
{
1566
    CPUState *new_env = cpu_init(env->cpu_model_str);
1567
    /* preserve chaining and index */
1568
    CPUState *next_cpu = new_env->next_cpu;
1569
    int cpu_index = new_env->cpu_index;
1570
    memcpy(new_env, env, sizeof(CPUState));
1571
    new_env->next_cpu = next_cpu;
1572
    new_env->cpu_index = cpu_index;
1573
    return new_env;
1574
}
1575

    
1576
#if !defined(CONFIG_USER_ONLY)
1577

    
1578
static inline void tlb_flush_jmp_cache(CPUState *env, target_ulong addr)
1579
{
1580
    unsigned int i;
1581

    
1582
    /* Discard jump cache entries for any tb which might potentially
1583
       overlap the flushed page.  */
1584
    i = tb_jmp_cache_hash_page(addr - TARGET_PAGE_SIZE);
1585
    memset (&env->tb_jmp_cache[i], 0, 
1586
            TB_JMP_PAGE_SIZE * sizeof(TranslationBlock *));
1587

    
1588
    i = tb_jmp_cache_hash_page(addr);
1589
    memset (&env->tb_jmp_cache[i], 0, 
1590
            TB_JMP_PAGE_SIZE * sizeof(TranslationBlock *));
1591
}
1592

    
1593
/* NOTE: if flush_global is true, also flush global entries (not
1594
   implemented yet) */
1595
void tlb_flush(CPUState *env, int flush_global)
1596
{
1597
    int i;
1598

    
1599
#if defined(DEBUG_TLB)
1600
    printf("tlb_flush:\n");
1601
#endif
1602
    /* must reset current TB so that interrupts cannot modify the
1603
       links while we are modifying them */
1604
    env->current_tb = NULL;
1605

    
1606
    for(i = 0; i < CPU_TLB_SIZE; i++) {
1607
        env->tlb_table[0][i].addr_read = -1;
1608
        env->tlb_table[0][i].addr_write = -1;
1609
        env->tlb_table[0][i].addr_code = -1;
1610
        env->tlb_table[1][i].addr_read = -1;
1611
        env->tlb_table[1][i].addr_write = -1;
1612
        env->tlb_table[1][i].addr_code = -1;
1613
#if (NB_MMU_MODES >= 3)
1614
        env->tlb_table[2][i].addr_read = -1;
1615
        env->tlb_table[2][i].addr_write = -1;
1616
        env->tlb_table[2][i].addr_code = -1;
1617
#if (NB_MMU_MODES == 4)
1618
        env->tlb_table[3][i].addr_read = -1;
1619
        env->tlb_table[3][i].addr_write = -1;
1620
        env->tlb_table[3][i].addr_code = -1;
1621
#endif
1622
#endif
1623
    }
1624

    
1625
    memset (env->tb_jmp_cache, 0, TB_JMP_CACHE_SIZE * sizeof (void *));
1626

    
1627
#ifdef USE_KQEMU
1628
    if (env->kqemu_enabled) {
1629
        kqemu_flush(env, flush_global);
1630
    }
1631
#endif
1632
    tlb_flush_count++;
1633
}
1634

    
1635
static inline void tlb_flush_entry(CPUTLBEntry *tlb_entry, target_ulong addr)
1636
{
1637
    if (addr == (tlb_entry->addr_read &
1638
                 (TARGET_PAGE_MASK | TLB_INVALID_MASK)) ||
1639
        addr == (tlb_entry->addr_write &
1640
                 (TARGET_PAGE_MASK | TLB_INVALID_MASK)) ||
1641
        addr == (tlb_entry->addr_code &
1642
                 (TARGET_PAGE_MASK | TLB_INVALID_MASK))) {
1643
        tlb_entry->addr_read = -1;
1644
        tlb_entry->addr_write = -1;
1645
        tlb_entry->addr_code = -1;
1646
    }
1647
}
1648

    
1649
void tlb_flush_page(CPUState *env, target_ulong addr)
1650
{
1651
    int i;
1652

    
1653
#if defined(DEBUG_TLB)
1654
    printf("tlb_flush_page: " TARGET_FMT_lx "\n", addr);
1655
#endif
1656
    /* must reset current TB so that interrupts cannot modify the
1657
       links while we are modifying them */
1658
    env->current_tb = NULL;
1659

    
1660
    addr &= TARGET_PAGE_MASK;
1661
    i = (addr >> TARGET_PAGE_BITS) & (CPU_TLB_SIZE - 1);
1662
    tlb_flush_entry(&env->tlb_table[0][i], addr);
1663
    tlb_flush_entry(&env->tlb_table[1][i], addr);
1664
#if (NB_MMU_MODES >= 3)
1665
    tlb_flush_entry(&env->tlb_table[2][i], addr);
1666
#if (NB_MMU_MODES == 4)
1667
    tlb_flush_entry(&env->tlb_table[3][i], addr);
1668
#endif
1669
#endif
1670

    
1671
    tlb_flush_jmp_cache(env, addr);
1672

    
1673
#ifdef USE_KQEMU
1674
    if (env->kqemu_enabled) {
1675
        kqemu_flush_page(env, addr);
1676
    }
1677
#endif
1678
}
1679

    
1680
/* update the TLBs so that writes to code in the virtual page 'addr'
1681
   can be detected */
1682
static void tlb_protect_code(ram_addr_t ram_addr)
1683
{
1684
    cpu_physical_memory_reset_dirty(ram_addr,
1685
                                    ram_addr + TARGET_PAGE_SIZE,
1686
                                    CODE_DIRTY_FLAG);
1687
}
1688

    
1689
/* update the TLB so that writes in physical page 'phys_addr' are no longer
1690
   tested for self modifying code */
1691
static void tlb_unprotect_code_phys(CPUState *env, ram_addr_t ram_addr,
1692
                                    target_ulong vaddr)
1693
{
1694
    phys_ram_dirty[ram_addr >> TARGET_PAGE_BITS] |= CODE_DIRTY_FLAG;
1695
}
1696

    
1697
static inline void tlb_reset_dirty_range(CPUTLBEntry *tlb_entry,
1698
                                         unsigned long start, unsigned long length)
1699
{
1700
    unsigned long addr;
1701
    if ((tlb_entry->addr_write & ~TARGET_PAGE_MASK) == IO_MEM_RAM) {
1702
        addr = (tlb_entry->addr_write & TARGET_PAGE_MASK) + tlb_entry->addend;
1703
        if ((addr - start) < length) {
1704
            tlb_entry->addr_write = (tlb_entry->addr_write & TARGET_PAGE_MASK) | TLB_NOTDIRTY;
1705
        }
1706
    }
1707
}
1708

    
1709
void cpu_physical_memory_reset_dirty(ram_addr_t start, ram_addr_t end,
1710
                                     int dirty_flags)
1711
{
1712
    CPUState *env;
1713
    unsigned long length, start1;
1714
    int i, mask, len;
1715
    uint8_t *p;
1716

    
1717
    start &= TARGET_PAGE_MASK;
1718
    end = TARGET_PAGE_ALIGN(end);
1719

    
1720
    length = end - start;
1721
    if (length == 0)
1722
        return;
1723
    len = length >> TARGET_PAGE_BITS;
1724
#ifdef USE_KQEMU
1725
    /* XXX: should not depend on cpu context */
1726
    env = first_cpu;
1727
    if (env->kqemu_enabled) {
1728
        ram_addr_t addr;
1729
        addr = start;
1730
        for(i = 0; i < len; i++) {
1731
            kqemu_set_notdirty(env, addr);
1732
            addr += TARGET_PAGE_SIZE;
1733
        }
1734
    }
1735
#endif
1736
    mask = ~dirty_flags;
1737
    p = phys_ram_dirty + (start >> TARGET_PAGE_BITS);
1738
    for(i = 0; i < len; i++)
1739
        p[i] &= mask;
1740

    
1741
    /* we modify the TLB cache so that the dirty bit will be set again
1742
       when accessing the range */
1743
    start1 = start + (unsigned long)phys_ram_base;
1744
    for(env = first_cpu; env != NULL; env = env->next_cpu) {
1745
        for(i = 0; i < CPU_TLB_SIZE; i++)
1746
            tlb_reset_dirty_range(&env->tlb_table[0][i], start1, length);
1747
        for(i = 0; i < CPU_TLB_SIZE; i++)
1748
            tlb_reset_dirty_range(&env->tlb_table[1][i], start1, length);
1749
#if (NB_MMU_MODES >= 3)
1750
        for(i = 0; i < CPU_TLB_SIZE; i++)
1751
            tlb_reset_dirty_range(&env->tlb_table[2][i], start1, length);
1752
#if (NB_MMU_MODES == 4)
1753
        for(i = 0; i < CPU_TLB_SIZE; i++)
1754
            tlb_reset_dirty_range(&env->tlb_table[3][i], start1, length);
1755
#endif
1756
#endif
1757
    }
1758
}
1759

    
1760
static inline void tlb_update_dirty(CPUTLBEntry *tlb_entry)
1761
{
1762
    ram_addr_t ram_addr;
1763

    
1764
    if ((tlb_entry->addr_write & ~TARGET_PAGE_MASK) == IO_MEM_RAM) {
1765
        ram_addr = (tlb_entry->addr_write & TARGET_PAGE_MASK) +
1766
            tlb_entry->addend - (unsigned long)phys_ram_base;
1767
        if (!cpu_physical_memory_is_dirty(ram_addr)) {
1768
            tlb_entry->addr_write |= TLB_NOTDIRTY;
1769
        }
1770
    }
1771
}
1772

    
1773
/* update the TLB according to the current state of the dirty bits */
1774
void cpu_tlb_update_dirty(CPUState *env)
1775
{
1776
    int i;
1777
    for(i = 0; i < CPU_TLB_SIZE; i++)
1778
        tlb_update_dirty(&env->tlb_table[0][i]);
1779
    for(i = 0; i < CPU_TLB_SIZE; i++)
1780
        tlb_update_dirty(&env->tlb_table[1][i]);
1781
#if (NB_MMU_MODES >= 3)
1782
    for(i = 0; i < CPU_TLB_SIZE; i++)
1783
        tlb_update_dirty(&env->tlb_table[2][i]);
1784
#if (NB_MMU_MODES == 4)
1785
    for(i = 0; i < CPU_TLB_SIZE; i++)
1786
        tlb_update_dirty(&env->tlb_table[3][i]);
1787
#endif
1788
#endif
1789
}
1790

    
1791
static inline void tlb_set_dirty1(CPUTLBEntry *tlb_entry, target_ulong vaddr)
1792
{
1793
    if (tlb_entry->addr_write == (vaddr | TLB_NOTDIRTY))
1794
        tlb_entry->addr_write = vaddr;
1795
}
1796

    
1797
/* update the TLB corresponding to virtual page vaddr
1798
   so that it is no longer dirty */
1799
static inline void tlb_set_dirty(CPUState *env, target_ulong vaddr)
1800
{
1801
    int i;
1802

    
1803
    vaddr &= TARGET_PAGE_MASK;
1804
    i = (vaddr >> TARGET_PAGE_BITS) & (CPU_TLB_SIZE - 1);
1805
    tlb_set_dirty1(&env->tlb_table[0][i], vaddr);
1806
    tlb_set_dirty1(&env->tlb_table[1][i], vaddr);
1807
#if (NB_MMU_MODES >= 3)
1808
    tlb_set_dirty1(&env->tlb_table[2][i], vaddr);
1809
#if (NB_MMU_MODES == 4)
1810
    tlb_set_dirty1(&env->tlb_table[3][i], vaddr);
1811
#endif
1812
#endif
1813
}
1814

    
1815
/* add a new TLB entry. At most one entry for a given virtual address
1816
   is permitted. Return 0 if OK or 2 if the page could not be mapped
1817
   (can only happen in non SOFTMMU mode for I/O pages or pages
1818
   conflicting with the host address space). */
1819
int tlb_set_page_exec(CPUState *env, target_ulong vaddr,
1820
                      target_phys_addr_t paddr, int prot,
1821
                      int mmu_idx, int is_softmmu)
1822
{
1823
    PhysPageDesc *p;
1824
    unsigned long pd;
1825
    unsigned int index;
1826
    target_ulong address;
1827
    target_ulong code_address;
1828
    target_phys_addr_t addend;
1829
    int ret;
1830
    CPUTLBEntry *te;
1831
    int i;
1832
    target_phys_addr_t iotlb;
1833

    
1834
    p = phys_page_find(paddr >> TARGET_PAGE_BITS);
1835
    if (!p) {
1836
        pd = IO_MEM_UNASSIGNED;
1837
    } else {
1838
        pd = p->phys_offset;
1839
    }
1840
#if defined(DEBUG_TLB)
1841
    printf("tlb_set_page: vaddr=" TARGET_FMT_lx " paddr=0x%08x prot=%x idx=%d smmu=%d pd=0x%08lx\n",
1842
           vaddr, (int)paddr, prot, mmu_idx, is_softmmu, pd);
1843
#endif
1844

    
1845
    ret = 0;
1846
    address = vaddr;
1847
    if ((pd & ~TARGET_PAGE_MASK) > IO_MEM_ROM && !(pd & IO_MEM_ROMD)) {
1848
        /* IO memory case (romd handled later) */
1849
        address |= TLB_MMIO;
1850
    }
1851
    addend = (unsigned long)phys_ram_base + (pd & TARGET_PAGE_MASK);
1852
    if ((pd & ~TARGET_PAGE_MASK) <= IO_MEM_ROM) {
1853
        /* Normal RAM.  */
1854
        iotlb = pd & TARGET_PAGE_MASK;
1855
        if ((pd & ~TARGET_PAGE_MASK) == IO_MEM_RAM)
1856
            iotlb |= IO_MEM_NOTDIRTY;
1857
        else
1858
            iotlb |= IO_MEM_ROM;
1859
    } else {
1860
        /* IO handlers are currently passed a phsical address.
1861
           It would be nice to pass an offset from the base address
1862
           of that region.  This would avoid having to special case RAM,
1863
           and avoid full address decoding in every device.
1864
           We can't use the high bits of pd for this because
1865
           IO_MEM_ROMD uses these as a ram address.  */
1866
        iotlb = (pd & ~TARGET_PAGE_MASK) + paddr;
1867
    }
1868

    
1869
    code_address = address;
1870
    /* Make accesses to pages with watchpoints go via the
1871
       watchpoint trap routines.  */
1872
    for (i = 0; i < env->nb_watchpoints; i++) {
1873
        if (vaddr == (env->watchpoint[i].vaddr & TARGET_PAGE_MASK)) {
1874
            iotlb = io_mem_watch + paddr;
1875
            /* TODO: The memory case can be optimized by not trapping
1876
               reads of pages with a write breakpoint.  */
1877
            address |= TLB_MMIO;
1878
        }
1879
    }
1880

    
1881
    index = (vaddr >> TARGET_PAGE_BITS) & (CPU_TLB_SIZE - 1);
1882
    env->iotlb[mmu_idx][index] = iotlb - vaddr;
1883
    te = &env->tlb_table[mmu_idx][index];
1884
    te->addend = addend - vaddr;
1885
    if (prot & PAGE_READ) {
1886
        te->addr_read = address;
1887
    } else {
1888
        te->addr_read = -1;
1889
    }
1890

    
1891
    if (prot & PAGE_EXEC) {
1892
        te->addr_code = code_address;
1893
    } else {
1894
        te->addr_code = -1;
1895
    }
1896
    if (prot & PAGE_WRITE) {
1897
        if ((pd & ~TARGET_PAGE_MASK) == IO_MEM_ROM ||
1898
            (pd & IO_MEM_ROMD)) {
1899
            /* Write access calls the I/O callback.  */
1900
            te->addr_write = address | TLB_MMIO;
1901
        } else if ((pd & ~TARGET_PAGE_MASK) == IO_MEM_RAM &&
1902
                   !cpu_physical_memory_is_dirty(pd)) {
1903
            te->addr_write = address | TLB_NOTDIRTY;
1904
        } else {
1905
            te->addr_write = address;
1906
        }
1907
    } else {
1908
        te->addr_write = -1;
1909
    }
1910
    return ret;
1911
}
1912

    
1913
#else
1914

    
1915
void tlb_flush(CPUState *env, int flush_global)
1916
{
1917
}
1918

    
1919
void tlb_flush_page(CPUState *env, target_ulong addr)
1920
{
1921
}
1922

    
1923
int tlb_set_page_exec(CPUState *env, target_ulong vaddr,
1924
                      target_phys_addr_t paddr, int prot,
1925
                      int mmu_idx, int is_softmmu)
1926
{
1927
    return 0;
1928
}
1929

    
1930
/* dump memory mappings */
1931
void page_dump(FILE *f)
1932
{
1933
    unsigned long start, end;
1934
    int i, j, prot, prot1;
1935
    PageDesc *p;
1936

    
1937
    fprintf(f, "%-8s %-8s %-8s %s\n",
1938
            "start", "end", "size", "prot");
1939
    start = -1;
1940
    end = -1;
1941
    prot = 0;
1942
    for(i = 0; i <= L1_SIZE; i++) {
1943
        if (i < L1_SIZE)
1944
            p = l1_map[i];
1945
        else
1946
            p = NULL;
1947
        for(j = 0;j < L2_SIZE; j++) {
1948
            if (!p)
1949
                prot1 = 0;
1950
            else
1951
                prot1 = p[j].flags;
1952
            if (prot1 != prot) {
1953
                end = (i << (32 - L1_BITS)) | (j << TARGET_PAGE_BITS);
1954
                if (start != -1) {
1955
                    fprintf(f, "%08lx-%08lx %08lx %c%c%c\n",
1956
                            start, end, end - start,
1957
                            prot & PAGE_READ ? 'r' : '-',
1958
                            prot & PAGE_WRITE ? 'w' : '-',
1959
                            prot & PAGE_EXEC ? 'x' : '-');
1960
                }
1961
                if (prot1 != 0)
1962
                    start = end;
1963
                else
1964
                    start = -1;
1965
                prot = prot1;
1966
            }
1967
            if (!p)
1968
                break;
1969
        }
1970
    }
1971
}
1972

    
1973
int page_get_flags(target_ulong address)
1974
{
1975
    PageDesc *p;
1976

    
1977
    p = page_find(address >> TARGET_PAGE_BITS);
1978
    if (!p)
1979
        return 0;
1980
    return p->flags;
1981
}
1982

    
1983
/* modify the flags of a page and invalidate the code if
1984
   necessary. The flag PAGE_WRITE_ORG is positionned automatically
1985
   depending on PAGE_WRITE */
1986
void page_set_flags(target_ulong start, target_ulong end, int flags)
1987
{
1988
    PageDesc *p;
1989
    target_ulong addr;
1990

    
1991
    /* mmap_lock should already be held.  */
1992
    start = start & TARGET_PAGE_MASK;
1993
    end = TARGET_PAGE_ALIGN(end);
1994
    if (flags & PAGE_WRITE)
1995
        flags |= PAGE_WRITE_ORG;
1996
    for(addr = start; addr < end; addr += TARGET_PAGE_SIZE) {
1997
        p = page_find_alloc(addr >> TARGET_PAGE_BITS);
1998
        /* We may be called for host regions that are outside guest
1999
           address space.  */
2000
        if (!p)
2001
            return;
2002
        /* if the write protection is set, then we invalidate the code
2003
           inside */
2004
        if (!(p->flags & PAGE_WRITE) &&
2005
            (flags & PAGE_WRITE) &&
2006
            p->first_tb) {
2007
            tb_invalidate_phys_page(addr, 0, NULL);
2008
        }
2009
        p->flags = flags;
2010
    }
2011
}
2012

    
2013
int page_check_range(target_ulong start, target_ulong len, int flags)
2014
{
2015
    PageDesc *p;
2016
    target_ulong end;
2017
    target_ulong addr;
2018

    
2019
    end = TARGET_PAGE_ALIGN(start+len); /* must do before we loose bits in the next step */
2020
    start = start & TARGET_PAGE_MASK;
2021

    
2022
    if( end < start )
2023
        /* we've wrapped around */
2024
        return -1;
2025
    for(addr = start; addr < end; addr += TARGET_PAGE_SIZE) {
2026
        p = page_find(addr >> TARGET_PAGE_BITS);
2027
        if( !p )
2028
            return -1;
2029
        if( !(p->flags & PAGE_VALID) )
2030
            return -1;
2031

    
2032
        if ((flags & PAGE_READ) && !(p->flags & PAGE_READ))
2033
            return -1;
2034
        if (flags & PAGE_WRITE) {
2035
            if (!(p->flags & PAGE_WRITE_ORG))
2036
                return -1;
2037
            /* unprotect the page if it was put read-only because it
2038
               contains translated code */
2039
            if (!(p->flags & PAGE_WRITE)) {
2040
                if (!page_unprotect(addr, 0, NULL))
2041
                    return -1;
2042
            }
2043
            return 0;
2044
        }
2045
    }
2046
    return 0;
2047
}
2048

    
2049
/* called from signal handler: invalidate the code and unprotect the
2050
   page. Return TRUE if the fault was succesfully handled. */
2051
int page_unprotect(target_ulong address, unsigned long pc, void *puc)
2052
{
2053
    unsigned int page_index, prot, pindex;
2054
    PageDesc *p, *p1;
2055
    target_ulong host_start, host_end, addr;
2056

    
2057
    /* Technically this isn't safe inside a signal handler.  However we
2058
       know this only ever happens in a synchronous SEGV handler, so in
2059
       practice it seems to be ok.  */
2060
    mmap_lock();
2061

    
2062
    host_start = address & qemu_host_page_mask;
2063
    page_index = host_start >> TARGET_PAGE_BITS;
2064
    p1 = page_find(page_index);
2065
    if (!p1) {
2066
        mmap_unlock();
2067
        return 0;
2068
    }
2069
    host_end = host_start + qemu_host_page_size;
2070
    p = p1;
2071
    prot = 0;
2072
    for(addr = host_start;addr < host_end; addr += TARGET_PAGE_SIZE) {
2073
        prot |= p->flags;
2074
        p++;
2075
    }
2076
    /* if the page was really writable, then we change its
2077
       protection back to writable */
2078
    if (prot & PAGE_WRITE_ORG) {
2079
        pindex = (address - host_start) >> TARGET_PAGE_BITS;
2080
        if (!(p1[pindex].flags & PAGE_WRITE)) {
2081
            mprotect((void *)g2h(host_start), qemu_host_page_size,
2082
                     (prot & PAGE_BITS) | PAGE_WRITE);
2083
            p1[pindex].flags |= PAGE_WRITE;
2084
            /* and since the content will be modified, we must invalidate
2085
               the corresponding translated code. */
2086
            tb_invalidate_phys_page(address, pc, puc);
2087
#ifdef DEBUG_TB_CHECK
2088
            tb_invalidate_check(address);
2089
#endif
2090
            mmap_unlock();
2091
            return 1;
2092
        }
2093
    }
2094
    mmap_unlock();
2095
    return 0;
2096
}
2097

    
2098
static inline void tlb_set_dirty(CPUState *env,
2099
                                 unsigned long addr, target_ulong vaddr)
2100
{
2101
}
2102
#endif /* defined(CONFIG_USER_ONLY) */
2103

    
2104
#if !defined(CONFIG_USER_ONLY)
2105
static int subpage_register (subpage_t *mmio, uint32_t start, uint32_t end,
2106
                             ram_addr_t memory);
2107
static void *subpage_init (target_phys_addr_t base, ram_addr_t *phys,
2108
                           ram_addr_t orig_memory);
2109
#define CHECK_SUBPAGE(addr, start_addr, start_addr2, end_addr, end_addr2, \
2110
                      need_subpage)                                     \
2111
    do {                                                                \
2112
        if (addr > start_addr)                                          \
2113
            start_addr2 = 0;                                            \
2114
        else {                                                          \
2115
            start_addr2 = start_addr & ~TARGET_PAGE_MASK;               \
2116
            if (start_addr2 > 0)                                        \
2117
                need_subpage = 1;                                       \
2118
        }                                                               \
2119
                                                                        \
2120
        if ((start_addr + orig_size) - addr >= TARGET_PAGE_SIZE)        \
2121
            end_addr2 = TARGET_PAGE_SIZE - 1;                           \
2122
        else {                                                          \
2123
            end_addr2 = (start_addr + orig_size - 1) & ~TARGET_PAGE_MASK; \
2124
            if (end_addr2 < TARGET_PAGE_SIZE - 1)                       \
2125
                need_subpage = 1;                                       \
2126
        }                                                               \
2127
    } while (0)
2128

    
2129
/* register physical memory. 'size' must be a multiple of the target
2130
   page size. If (phys_offset & ~TARGET_PAGE_MASK) != 0, then it is an
2131
   io memory page */
2132
void cpu_register_physical_memory(target_phys_addr_t start_addr,
2133
                                  ram_addr_t size,
2134
                                  ram_addr_t phys_offset)
2135
{
2136
    target_phys_addr_t addr, end_addr;
2137
    PhysPageDesc *p;
2138
    CPUState *env;
2139
    ram_addr_t orig_size = size;
2140
    void *subpage;
2141

    
2142
#ifdef USE_KQEMU
2143
    /* XXX: should not depend on cpu context */
2144
    env = first_cpu;
2145
    if (env->kqemu_enabled) {
2146
        kqemu_set_phys_mem(start_addr, size, phys_offset);
2147
    }
2148
#endif
2149
    size = (size + TARGET_PAGE_SIZE - 1) & TARGET_PAGE_MASK;
2150
    end_addr = start_addr + (target_phys_addr_t)size;
2151
    for(addr = start_addr; addr != end_addr; addr += TARGET_PAGE_SIZE) {
2152
        p = phys_page_find(addr >> TARGET_PAGE_BITS);
2153
        if (p && p->phys_offset != IO_MEM_UNASSIGNED) {
2154
            ram_addr_t orig_memory = p->phys_offset;
2155
            target_phys_addr_t start_addr2, end_addr2;
2156
            int need_subpage = 0;
2157

    
2158
            CHECK_SUBPAGE(addr, start_addr, start_addr2, end_addr, end_addr2,
2159
                          need_subpage);
2160
            if (need_subpage || phys_offset & IO_MEM_SUBWIDTH) {
2161
                if (!(orig_memory & IO_MEM_SUBPAGE)) {
2162
                    subpage = subpage_init((addr & TARGET_PAGE_MASK),
2163
                                           &p->phys_offset, orig_memory);
2164
                } else {
2165
                    subpage = io_mem_opaque[(orig_memory & ~TARGET_PAGE_MASK)
2166
                                            >> IO_MEM_SHIFT];
2167
                }
2168
                subpage_register(subpage, start_addr2, end_addr2, phys_offset);
2169
            } else {
2170
                p->phys_offset = phys_offset;
2171
                if ((phys_offset & ~TARGET_PAGE_MASK) <= IO_MEM_ROM ||
2172
                    (phys_offset & IO_MEM_ROMD))
2173
                    phys_offset += TARGET_PAGE_SIZE;
2174
            }
2175
        } else {
2176
            p = phys_page_find_alloc(addr >> TARGET_PAGE_BITS, 1);
2177
            p->phys_offset = phys_offset;
2178
            if ((phys_offset & ~TARGET_PAGE_MASK) <= IO_MEM_ROM ||
2179
                (phys_offset & IO_MEM_ROMD))
2180
                phys_offset += TARGET_PAGE_SIZE;
2181
            else {
2182
                target_phys_addr_t start_addr2, end_addr2;
2183
                int need_subpage = 0;
2184

    
2185
                CHECK_SUBPAGE(addr, start_addr, start_addr2, end_addr,
2186
                              end_addr2, need_subpage);
2187

    
2188
                if (need_subpage || phys_offset & IO_MEM_SUBWIDTH) {
2189
                    subpage = subpage_init((addr & TARGET_PAGE_MASK),
2190
                                           &p->phys_offset, IO_MEM_UNASSIGNED);
2191
                    subpage_register(subpage, start_addr2, end_addr2,
2192
                                     phys_offset);
2193
                }
2194
            }
2195
        }
2196
    }
2197

    
2198
    /* since each CPU stores ram addresses in its TLB cache, we must
2199
       reset the modified entries */
2200
    /* XXX: slow ! */
2201
    for(env = first_cpu; env != NULL; env = env->next_cpu) {
2202
        tlb_flush(env, 1);
2203
    }
2204
}
2205

    
2206
/* XXX: temporary until new memory mapping API */
2207
ram_addr_t cpu_get_physical_page_desc(target_phys_addr_t addr)
2208
{
2209
    PhysPageDesc *p;
2210

    
2211
    p = phys_page_find(addr >> TARGET_PAGE_BITS);
2212
    if (!p)
2213
        return IO_MEM_UNASSIGNED;
2214
    return p->phys_offset;
2215
}
2216

    
2217
/* XXX: better than nothing */
2218
ram_addr_t qemu_ram_alloc(ram_addr_t size)
2219
{
2220
    ram_addr_t addr;
2221
    if ((phys_ram_alloc_offset + size) > phys_ram_size) {
2222
        fprintf(stderr, "Not enough memory (requested_size = %" PRIu64 ", max memory = %" PRIu64 "\n",
2223
                (uint64_t)size, (uint64_t)phys_ram_size);
2224
        abort();
2225
    }
2226
    addr = phys_ram_alloc_offset;
2227
    phys_ram_alloc_offset = TARGET_PAGE_ALIGN(phys_ram_alloc_offset + size);
2228
    return addr;
2229
}
2230

    
2231
void qemu_ram_free(ram_addr_t addr)
2232
{
2233
}
2234

    
2235
static uint32_t unassigned_mem_readb(void *opaque, target_phys_addr_t addr)
2236
{
2237
#ifdef DEBUG_UNASSIGNED
2238
    printf("Unassigned mem read " TARGET_FMT_plx "\n", addr);
2239
#endif
2240
#ifdef TARGET_SPARC
2241
    do_unassigned_access(addr, 0, 0, 0);
2242
#elif TARGET_CRIS
2243
    do_unassigned_access(addr, 0, 0, 0);
2244
#endif
2245
    return 0;
2246
}
2247

    
2248
static void unassigned_mem_writeb(void *opaque, target_phys_addr_t addr, uint32_t val)
2249
{
2250
#ifdef DEBUG_UNASSIGNED
2251
    printf("Unassigned mem write " TARGET_FMT_plx " = 0x%x\n", addr, val);
2252
#endif
2253
#ifdef TARGET_SPARC
2254
    do_unassigned_access(addr, 1, 0, 0);
2255
#elif TARGET_CRIS
2256
    do_unassigned_access(addr, 1, 0, 0);
2257
#endif
2258
}
2259

    
2260
static CPUReadMemoryFunc *unassigned_mem_read[3] = {
2261
    unassigned_mem_readb,
2262
    unassigned_mem_readb,
2263
    unassigned_mem_readb,
2264
};
2265

    
2266
static CPUWriteMemoryFunc *unassigned_mem_write[3] = {
2267
    unassigned_mem_writeb,
2268
    unassigned_mem_writeb,
2269
    unassigned_mem_writeb,
2270
};
2271

    
2272
static void notdirty_mem_writeb(void *opaque, target_phys_addr_t ram_addr,
2273
                                uint32_t val)
2274
{
2275
    int dirty_flags;
2276
    dirty_flags = phys_ram_dirty[ram_addr >> TARGET_PAGE_BITS];
2277
    if (!(dirty_flags & CODE_DIRTY_FLAG)) {
2278
#if !defined(CONFIG_USER_ONLY)
2279
        tb_invalidate_phys_page_fast(ram_addr, 1);
2280
        dirty_flags = phys_ram_dirty[ram_addr >> TARGET_PAGE_BITS];
2281
#endif
2282
    }
2283
    stb_p(phys_ram_base + ram_addr, val);
2284
#ifdef USE_KQEMU
2285
    if (cpu_single_env->kqemu_enabled &&
2286
        (dirty_flags & KQEMU_MODIFY_PAGE_MASK) != KQEMU_MODIFY_PAGE_MASK)
2287
        kqemu_modify_page(cpu_single_env, ram_addr);
2288
#endif
2289
    dirty_flags |= (0xff & ~CODE_DIRTY_FLAG);
2290
    phys_ram_dirty[ram_addr >> TARGET_PAGE_BITS] = dirty_flags;
2291
    /* we remove the notdirty callback only if the code has been
2292
       flushed */
2293
    if (dirty_flags == 0xff)
2294
        tlb_set_dirty(cpu_single_env, cpu_single_env->mem_io_vaddr);
2295
}
2296

    
2297
static void notdirty_mem_writew(void *opaque, target_phys_addr_t ram_addr,
2298
                                uint32_t val)
2299
{
2300
    int dirty_flags;
2301
    dirty_flags = phys_ram_dirty[ram_addr >> TARGET_PAGE_BITS];
2302
    if (!(dirty_flags & CODE_DIRTY_FLAG)) {
2303
#if !defined(CONFIG_USER_ONLY)
2304
        tb_invalidate_phys_page_fast(ram_addr, 2);
2305
        dirty_flags = phys_ram_dirty[ram_addr >> TARGET_PAGE_BITS];
2306
#endif
2307
    }
2308
    stw_p(phys_ram_base + ram_addr, val);
2309
#ifdef USE_KQEMU
2310
    if (cpu_single_env->kqemu_enabled &&
2311
        (dirty_flags & KQEMU_MODIFY_PAGE_MASK) != KQEMU_MODIFY_PAGE_MASK)
2312
        kqemu_modify_page(cpu_single_env, ram_addr);
2313
#endif
2314
    dirty_flags |= (0xff & ~CODE_DIRTY_FLAG);
2315
    phys_ram_dirty[ram_addr >> TARGET_PAGE_BITS] = dirty_flags;
2316
    /* we remove the notdirty callback only if the code has been
2317
       flushed */
2318
    if (dirty_flags == 0xff)
2319
        tlb_set_dirty(cpu_single_env, cpu_single_env->mem_io_vaddr);
2320
}
2321

    
2322
static void notdirty_mem_writel(void *opaque, target_phys_addr_t ram_addr,
2323
                                uint32_t val)
2324
{
2325
    int dirty_flags;
2326
    dirty_flags = phys_ram_dirty[ram_addr >> TARGET_PAGE_BITS];
2327
    if (!(dirty_flags & CODE_DIRTY_FLAG)) {
2328
#if !defined(CONFIG_USER_ONLY)
2329
        tb_invalidate_phys_page_fast(ram_addr, 4);
2330
        dirty_flags = phys_ram_dirty[ram_addr >> TARGET_PAGE_BITS];
2331
#endif
2332
    }
2333
    stl_p(phys_ram_base + ram_addr, val);
2334
#ifdef USE_KQEMU
2335
    if (cpu_single_env->kqemu_enabled &&
2336
        (dirty_flags & KQEMU_MODIFY_PAGE_MASK) != KQEMU_MODIFY_PAGE_MASK)
2337
        kqemu_modify_page(cpu_single_env, ram_addr);
2338
#endif
2339
    dirty_flags |= (0xff & ~CODE_DIRTY_FLAG);
2340
    phys_ram_dirty[ram_addr >> TARGET_PAGE_BITS] = dirty_flags;
2341
    /* we remove the notdirty callback only if the code has been
2342
       flushed */
2343
    if (dirty_flags == 0xff)
2344
        tlb_set_dirty(cpu_single_env, cpu_single_env->mem_io_vaddr);
2345
}
2346

    
2347
static CPUReadMemoryFunc *error_mem_read[3] = {
2348
    NULL, /* never used */
2349
    NULL, /* never used */
2350
    NULL, /* never used */
2351
};
2352

    
2353
static CPUWriteMemoryFunc *notdirty_mem_write[3] = {
2354
    notdirty_mem_writeb,
2355
    notdirty_mem_writew,
2356
    notdirty_mem_writel,
2357
};
2358

    
2359
/* Generate a debug exception if a watchpoint has been hit.  */
2360
static void check_watchpoint(int offset, int flags)
2361
{
2362
    CPUState *env = cpu_single_env;
2363
    target_ulong vaddr;
2364
    int i;
2365

    
2366
    vaddr = (env->mem_io_vaddr & TARGET_PAGE_MASK) + offset;
2367
    for (i = 0; i < env->nb_watchpoints; i++) {
2368
        if (vaddr == env->watchpoint[i].vaddr
2369
                && (env->watchpoint[i].type & flags)) {
2370
            env->watchpoint_hit = i + 1;
2371
            cpu_interrupt(env, CPU_INTERRUPT_DEBUG);
2372
            break;
2373
        }
2374
    }
2375
}
2376

    
2377
/* Watchpoint access routines.  Watchpoints are inserted using TLB tricks,
2378
   so these check for a hit then pass through to the normal out-of-line
2379
   phys routines.  */
2380
static uint32_t watch_mem_readb(void *opaque, target_phys_addr_t addr)
2381
{
2382
    check_watchpoint(addr & ~TARGET_PAGE_MASK, PAGE_READ);
2383
    return ldub_phys(addr);
2384
}
2385

    
2386
static uint32_t watch_mem_readw(void *opaque, target_phys_addr_t addr)
2387
{
2388
    check_watchpoint(addr & ~TARGET_PAGE_MASK, PAGE_READ);
2389
    return lduw_phys(addr);
2390
}
2391

    
2392
static uint32_t watch_mem_readl(void *opaque, target_phys_addr_t addr)
2393
{
2394
    check_watchpoint(addr & ~TARGET_PAGE_MASK, PAGE_READ);
2395
    return ldl_phys(addr);
2396
}
2397

    
2398
static void watch_mem_writeb(void *opaque, target_phys_addr_t addr,
2399
                             uint32_t val)
2400
{
2401
    check_watchpoint(addr & ~TARGET_PAGE_MASK, PAGE_WRITE);
2402
    stb_phys(addr, val);
2403
}
2404

    
2405
static void watch_mem_writew(void *opaque, target_phys_addr_t addr,
2406
                             uint32_t val)
2407
{
2408
    check_watchpoint(addr & ~TARGET_PAGE_MASK, PAGE_WRITE);
2409
    stw_phys(addr, val);
2410
}
2411

    
2412
static void watch_mem_writel(void *opaque, target_phys_addr_t addr,
2413
                             uint32_t val)
2414
{
2415
    check_watchpoint(addr & ~TARGET_PAGE_MASK, PAGE_WRITE);
2416
    stl_phys(addr, val);
2417
}
2418

    
2419
static CPUReadMemoryFunc *watch_mem_read[3] = {
2420
    watch_mem_readb,
2421
    watch_mem_readw,
2422
    watch_mem_readl,
2423
};
2424

    
2425
static CPUWriteMemoryFunc *watch_mem_write[3] = {
2426
    watch_mem_writeb,
2427
    watch_mem_writew,
2428
    watch_mem_writel,
2429
};
2430

    
2431
static inline uint32_t subpage_readlen (subpage_t *mmio, target_phys_addr_t addr,
2432
                                 unsigned int len)
2433
{
2434
    uint32_t ret;
2435
    unsigned int idx;
2436

    
2437
    idx = SUBPAGE_IDX(addr - mmio->base);
2438
#if defined(DEBUG_SUBPAGE)
2439
    printf("%s: subpage %p len %d addr " TARGET_FMT_plx " idx %d\n", __func__,
2440
           mmio, len, addr, idx);
2441
#endif
2442
    ret = (**mmio->mem_read[idx][len])(mmio->opaque[idx][0][len], addr);
2443

    
2444
    return ret;
2445
}
2446

    
2447
static inline void subpage_writelen (subpage_t *mmio, target_phys_addr_t addr,
2448
                              uint32_t value, unsigned int len)
2449
{
2450
    unsigned int idx;
2451

    
2452
    idx = SUBPAGE_IDX(addr - mmio->base);
2453
#if defined(DEBUG_SUBPAGE)
2454
    printf("%s: subpage %p len %d addr " TARGET_FMT_plx " idx %d value %08x\n", __func__,
2455
           mmio, len, addr, idx, value);
2456
#endif
2457
    (**mmio->mem_write[idx][len])(mmio->opaque[idx][1][len], addr, value);
2458
}
2459

    
2460
static uint32_t subpage_readb (void *opaque, target_phys_addr_t addr)
2461
{
2462
#if defined(DEBUG_SUBPAGE)
2463
    printf("%s: addr " TARGET_FMT_plx "\n", __func__, addr);
2464
#endif
2465

    
2466
    return subpage_readlen(opaque, addr, 0);
2467
}
2468

    
2469
static void subpage_writeb (void *opaque, target_phys_addr_t addr,
2470
                            uint32_t value)
2471
{
2472
#if defined(DEBUG_SUBPAGE)
2473
    printf("%s: addr " TARGET_FMT_plx " val %08x\n", __func__, addr, value);
2474
#endif
2475
    subpage_writelen(opaque, addr, value, 0);
2476
}
2477

    
2478
static uint32_t subpage_readw (void *opaque, target_phys_addr_t addr)
2479
{
2480
#if defined(DEBUG_SUBPAGE)
2481
    printf("%s: addr " TARGET_FMT_plx "\n", __func__, addr);
2482
#endif
2483

    
2484
    return subpage_readlen(opaque, addr, 1);
2485
}
2486

    
2487
static void subpage_writew (void *opaque, target_phys_addr_t addr,
2488
                            uint32_t value)
2489
{
2490
#if defined(DEBUG_SUBPAGE)
2491
    printf("%s: addr " TARGET_FMT_plx " val %08x\n", __func__, addr, value);
2492
#endif
2493
    subpage_writelen(opaque, addr, value, 1);
2494
}
2495

    
2496
static uint32_t subpage_readl (void *opaque, target_phys_addr_t addr)
2497
{
2498
#if defined(DEBUG_SUBPAGE)
2499
    printf("%s: addr " TARGET_FMT_plx "\n", __func__, addr);
2500
#endif
2501

    
2502
    return subpage_readlen(opaque, addr, 2);
2503
}
2504

    
2505
static void subpage_writel (void *opaque,
2506
                         target_phys_addr_t addr, uint32_t value)
2507
{
2508
#if defined(DEBUG_SUBPAGE)
2509
    printf("%s: addr " TARGET_FMT_plx " val %08x\n", __func__, addr, value);
2510
#endif
2511
    subpage_writelen(opaque, addr, value, 2);
2512
}
2513

    
2514
static CPUReadMemoryFunc *subpage_read[] = {
2515
    &subpage_readb,
2516
    &subpage_readw,
2517
    &subpage_readl,
2518
};
2519

    
2520
static CPUWriteMemoryFunc *subpage_write[] = {
2521
    &subpage_writeb,
2522
    &subpage_writew,
2523
    &subpage_writel,
2524
};
2525

    
2526
static int subpage_register (subpage_t *mmio, uint32_t start, uint32_t end,
2527
                             ram_addr_t memory)
2528
{
2529
    int idx, eidx;
2530
    unsigned int i;
2531

    
2532
    if (start >= TARGET_PAGE_SIZE || end >= TARGET_PAGE_SIZE)
2533
        return -1;
2534
    idx = SUBPAGE_IDX(start);
2535
    eidx = SUBPAGE_IDX(end);
2536
#if defined(DEBUG_SUBPAGE)
2537
    printf("%s: %p start %08x end %08x idx %08x eidx %08x mem %d\n", __func__,
2538
           mmio, start, end, idx, eidx, memory);
2539
#endif
2540
    memory >>= IO_MEM_SHIFT;
2541
    for (; idx <= eidx; idx++) {
2542
        for (i = 0; i < 4; i++) {
2543
            if (io_mem_read[memory][i]) {
2544
                mmio->mem_read[idx][i] = &io_mem_read[memory][i];
2545
                mmio->opaque[idx][0][i] = io_mem_opaque[memory];
2546
            }
2547
            if (io_mem_write[memory][i]) {
2548
                mmio->mem_write[idx][i] = &io_mem_write[memory][i];
2549
                mmio->opaque[idx][1][i] = io_mem_opaque[memory];
2550
            }
2551
        }
2552
    }
2553

    
2554
    return 0;
2555
}
2556

    
2557
static void *subpage_init (target_phys_addr_t base, ram_addr_t *phys,
2558
                           ram_addr_t orig_memory)
2559
{
2560
    subpage_t *mmio;
2561
    int subpage_memory;
2562

    
2563
    mmio = qemu_mallocz(sizeof(subpage_t));
2564
    if (mmio != NULL) {
2565
        mmio->base = base;
2566
        subpage_memory = cpu_register_io_memory(0, subpage_read, subpage_write, mmio);
2567
#if defined(DEBUG_SUBPAGE)
2568
        printf("%s: %p base " TARGET_FMT_plx " len %08x %d\n", __func__,
2569
               mmio, base, TARGET_PAGE_SIZE, subpage_memory);
2570
#endif
2571
        *phys = subpage_memory | IO_MEM_SUBPAGE;
2572
        subpage_register(mmio, 0, TARGET_PAGE_SIZE - 1, orig_memory);
2573
    }
2574

    
2575
    return mmio;
2576
}
2577

    
2578
static void io_mem_init(void)
2579
{
2580
    cpu_register_io_memory(IO_MEM_ROM >> IO_MEM_SHIFT, error_mem_read, unassigned_mem_write, NULL);
2581
    cpu_register_io_memory(IO_MEM_UNASSIGNED >> IO_MEM_SHIFT, unassigned_mem_read, unassigned_mem_write, NULL);
2582
    cpu_register_io_memory(IO_MEM_NOTDIRTY >> IO_MEM_SHIFT, error_mem_read, notdirty_mem_write, NULL);
2583
    io_mem_nb = 5;
2584

    
2585
    io_mem_watch = cpu_register_io_memory(0, watch_mem_read,
2586
                                          watch_mem_write, NULL);
2587
    /* alloc dirty bits array */
2588
    phys_ram_dirty = qemu_vmalloc(phys_ram_size >> TARGET_PAGE_BITS);
2589
    memset(phys_ram_dirty, 0xff, phys_ram_size >> TARGET_PAGE_BITS);
2590
}
2591

    
2592
/* mem_read and mem_write are arrays of functions containing the
2593
   function to access byte (index 0), word (index 1) and dword (index
2594
   2). Functions can be omitted with a NULL function pointer. The
2595
   registered functions may be modified dynamically later.
2596
   If io_index is non zero, the corresponding io zone is
2597
   modified. If it is zero, a new io zone is allocated. The return
2598
   value can be used with cpu_register_physical_memory(). (-1) is
2599
   returned if error. */
2600
int cpu_register_io_memory(int io_index,
2601
                           CPUReadMemoryFunc **mem_read,
2602
                           CPUWriteMemoryFunc **mem_write,
2603
                           void *opaque)
2604
{
2605
    int i, subwidth = 0;
2606

    
2607
    if (io_index <= 0) {
2608
        if (io_mem_nb >= IO_MEM_NB_ENTRIES)
2609
            return -1;
2610
        io_index = io_mem_nb++;
2611
    } else {
2612
        if (io_index >= IO_MEM_NB_ENTRIES)
2613
            return -1;
2614
    }
2615

    
2616
    for(i = 0;i < 3; i++) {
2617
        if (!mem_read[i] || !mem_write[i])
2618
            subwidth = IO_MEM_SUBWIDTH;
2619
        io_mem_read[io_index][i] = mem_read[i];
2620
        io_mem_write[io_index][i] = mem_write[i];
2621
    }
2622
    io_mem_opaque[io_index] = opaque;
2623
    return (io_index << IO_MEM_SHIFT) | subwidth;
2624
}
2625

    
2626
CPUWriteMemoryFunc **cpu_get_io_memory_write(int io_index)
2627
{
2628
    return io_mem_write[io_index >> IO_MEM_SHIFT];
2629
}
2630

    
2631
CPUReadMemoryFunc **cpu_get_io_memory_read(int io_index)
2632
{
2633
    return io_mem_read[io_index >> IO_MEM_SHIFT];
2634
}
2635

    
2636
#endif /* !defined(CONFIG_USER_ONLY) */
2637

    
2638
/* physical memory access (slow version, mainly for debug) */
2639
#if defined(CONFIG_USER_ONLY)
2640
void cpu_physical_memory_rw(target_phys_addr_t addr, uint8_t *buf,
2641
                            int len, int is_write)
2642
{
2643
    int l, flags;
2644
    target_ulong page;
2645
    void * p;
2646

    
2647
    while (len > 0) {
2648
        page = addr & TARGET_PAGE_MASK;
2649
        l = (page + TARGET_PAGE_SIZE) - addr;
2650
        if (l > len)
2651
            l = len;
2652
        flags = page_get_flags(page);
2653
        if (!(flags & PAGE_VALID))
2654
            return;
2655
        if (is_write) {
2656
            if (!(flags & PAGE_WRITE))
2657
                return;
2658
            /* XXX: this code should not depend on lock_user */
2659
            if (!(p = lock_user(VERIFY_WRITE, addr, l, 0)))
2660
                /* FIXME - should this return an error rather than just fail? */
2661
                return;
2662
            memcpy(p, buf, l);
2663
            unlock_user(p, addr, l);
2664
        } else {
2665
            if (!(flags & PAGE_READ))
2666
                return;
2667
            /* XXX: this code should not depend on lock_user */
2668
            if (!(p = lock_user(VERIFY_READ, addr, l, 1)))
2669
                /* FIXME - should this return an error rather than just fail? */
2670
                return;
2671
            memcpy(buf, p, l);
2672
            unlock_user(p, addr, 0);
2673
        }
2674
        len -= l;
2675
        buf += l;
2676
        addr += l;
2677
    }
2678
}
2679

    
2680
#else
2681
void cpu_physical_memory_rw(target_phys_addr_t addr, uint8_t *buf,
2682
                            int len, int is_write)
2683
{
2684
    int l, io_index;
2685
    uint8_t *ptr;
2686
    uint32_t val;
2687
    target_phys_addr_t page;
2688
    unsigned long pd;
2689
    PhysPageDesc *p;
2690

    
2691
    while (len > 0) {
2692
        page = addr & TARGET_PAGE_MASK;
2693
        l = (page + TARGET_PAGE_SIZE) - addr;
2694
        if (l > len)
2695
            l = len;
2696
        p = phys_page_find(page >> TARGET_PAGE_BITS);
2697
        if (!p) {
2698
            pd = IO_MEM_UNASSIGNED;
2699
        } else {
2700
            pd = p->phys_offset;
2701
        }
2702

    
2703
        if (is_write) {
2704
            if ((pd & ~TARGET_PAGE_MASK) != IO_MEM_RAM) {
2705
                io_index = (pd >> IO_MEM_SHIFT) & (IO_MEM_NB_ENTRIES - 1);
2706
                /* XXX: could force cpu_single_env to NULL to avoid
2707
                   potential bugs */
2708
                if (l >= 4 && ((addr & 3) == 0)) {
2709
                    /* 32 bit write access */
2710
                    val = ldl_p(buf);
2711
                    io_mem_write[io_index][2](io_mem_opaque[io_index], addr, val);
2712
                    l = 4;
2713
                } else if (l >= 2 && ((addr & 1) == 0)) {
2714
                    /* 16 bit write access */
2715
                    val = lduw_p(buf);
2716
                    io_mem_write[io_index][1](io_mem_opaque[io_index], addr, val);
2717
                    l = 2;
2718
                } else {
2719
                    /* 8 bit write access */
2720
                    val = ldub_p(buf);
2721
                    io_mem_write[io_index][0](io_mem_opaque[io_index], addr, val);
2722
                    l = 1;
2723
                }
2724
            } else {
2725
                unsigned long addr1;
2726
                addr1 = (pd & TARGET_PAGE_MASK) + (addr & ~TARGET_PAGE_MASK);
2727
                /* RAM case */
2728
                ptr = phys_ram_base + addr1;
2729
                memcpy(ptr, buf, l);
2730
                if (!cpu_physical_memory_is_dirty(addr1)) {
2731
                    /* invalidate code */
2732
                    tb_invalidate_phys_page_range(addr1, addr1 + l, 0);
2733
                    /* set dirty bit */
2734
                    phys_ram_dirty[addr1 >> TARGET_PAGE_BITS] |=
2735
                        (0xff & ~CODE_DIRTY_FLAG);
2736
                }
2737
            }
2738
        } else {
2739
            if ((pd & ~TARGET_PAGE_MASK) > IO_MEM_ROM &&
2740
                !(pd & IO_MEM_ROMD)) {
2741
                /* I/O case */
2742
                io_index = (pd >> IO_MEM_SHIFT) & (IO_MEM_NB_ENTRIES - 1);
2743
                if (l >= 4 && ((addr & 3) == 0)) {
2744
                    /* 32 bit read access */
2745
                    val = io_mem_read[io_index][2](io_mem_opaque[io_index], addr);
2746
                    stl_p(buf, val);
2747
                    l = 4;
2748
                } else if (l >= 2 && ((addr & 1) == 0)) {
2749
                    /* 16 bit read access */
2750
                    val = io_mem_read[io_index][1](io_mem_opaque[io_index], addr);
2751
                    stw_p(buf, val);
2752
                    l = 2;
2753
                } else {
2754
                    /* 8 bit read access */
2755
                    val = io_mem_read[io_index][0](io_mem_opaque[io_index], addr);
2756
                    stb_p(buf, val);
2757
                    l = 1;
2758
                }
2759
            } else {
2760
                /* RAM case */
2761
                ptr = phys_ram_base + (pd & TARGET_PAGE_MASK) +
2762
                    (addr & ~TARGET_PAGE_MASK);
2763
                memcpy(buf, ptr, l);
2764
            }
2765
        }
2766
        len -= l;
2767
        buf += l;
2768
        addr += l;
2769
    }
2770
}
2771

    
2772
/* used for ROM loading : can write in RAM and ROM */
2773
void cpu_physical_memory_write_rom(target_phys_addr_t addr,
2774
                                   const uint8_t *buf, int len)
2775
{
2776
    int l;
2777
    uint8_t *ptr;
2778
    target_phys_addr_t page;
2779
    unsigned long pd;
2780
    PhysPageDesc *p;
2781

    
2782
    while (len > 0) {
2783
        page = addr & TARGET_PAGE_MASK;
2784
        l = (page + TARGET_PAGE_SIZE) - addr;
2785
        if (l > len)
2786
            l = len;
2787
        p = phys_page_find(page >> TARGET_PAGE_BITS);
2788
        if (!p) {
2789
            pd = IO_MEM_UNASSIGNED;
2790
        } else {
2791
            pd = p->phys_offset;
2792
        }
2793

    
2794
        if ((pd & ~TARGET_PAGE_MASK) != IO_MEM_RAM &&
2795
            (pd & ~TARGET_PAGE_MASK) != IO_MEM_ROM &&
2796
            !(pd & IO_MEM_ROMD)) {
2797
            /* do nothing */
2798
        } else {
2799
            unsigned long addr1;
2800
            addr1 = (pd & TARGET_PAGE_MASK) + (addr & ~TARGET_PAGE_MASK);
2801
            /* ROM/RAM case */
2802
            ptr = phys_ram_base + addr1;
2803
            memcpy(ptr, buf, l);
2804
        }
2805
        len -= l;
2806
        buf += l;
2807
        addr += l;
2808
    }
2809
}
2810

    
2811

    
2812
/* warning: addr must be aligned */
2813
uint32_t ldl_phys(target_phys_addr_t addr)
2814
{
2815
    int io_index;
2816
    uint8_t *ptr;
2817
    uint32_t val;
2818
    unsigned long pd;
2819
    PhysPageDesc *p;
2820

    
2821
    p = phys_page_find(addr >> TARGET_PAGE_BITS);
2822
    if (!p) {
2823
        pd = IO_MEM_UNASSIGNED;
2824
    } else {
2825
        pd = p->phys_offset;
2826
    }
2827

    
2828
    if ((pd & ~TARGET_PAGE_MASK) > IO_MEM_ROM &&
2829
        !(pd & IO_MEM_ROMD)) {
2830
        /* I/O case */
2831
        io_index = (pd >> IO_MEM_SHIFT) & (IO_MEM_NB_ENTRIES - 1);
2832
        val = io_mem_read[io_index][2](io_mem_opaque[io_index], addr);
2833
    } else {
2834
        /* RAM case */
2835
        ptr = phys_ram_base + (pd & TARGET_PAGE_MASK) +
2836
            (addr & ~TARGET_PAGE_MASK);
2837
        val = ldl_p(ptr);
2838
    }
2839
    return val;
2840
}
2841

    
2842
/* warning: addr must be aligned */
2843
uint64_t ldq_phys(target_phys_addr_t addr)
2844
{
2845
    int io_index;
2846
    uint8_t *ptr;
2847
    uint64_t val;
2848
    unsigned long pd;
2849
    PhysPageDesc *p;
2850

    
2851
    p = phys_page_find(addr >> TARGET_PAGE_BITS);
2852
    if (!p) {
2853
        pd = IO_MEM_UNASSIGNED;
2854
    } else {
2855
        pd = p->phys_offset;
2856
    }
2857

    
2858
    if ((pd & ~TARGET_PAGE_MASK) > IO_MEM_ROM &&
2859
        !(pd & IO_MEM_ROMD)) {
2860
        /* I/O case */
2861
        io_index = (pd >> IO_MEM_SHIFT) & (IO_MEM_NB_ENTRIES - 1);
2862
#ifdef TARGET_WORDS_BIGENDIAN
2863
        val = (uint64_t)io_mem_read[io_index][2](io_mem_opaque[io_index], addr) << 32;
2864
        val |= io_mem_read[io_index][2](io_mem_opaque[io_index], addr + 4);
2865
#else
2866
        val = io_mem_read[io_index][2](io_mem_opaque[io_index], addr);
2867
        val |= (uint64_t)io_mem_read[io_index][2](io_mem_opaque[io_index], addr + 4) << 32;
2868
#endif
2869
    } else {
2870
        /* RAM case */
2871
        ptr = phys_ram_base + (pd & TARGET_PAGE_MASK) +
2872
            (addr & ~TARGET_PAGE_MASK);
2873
        val = ldq_p(ptr);
2874
    }
2875
    return val;
2876
}
2877

    
2878
/* XXX: optimize */
2879
uint32_t ldub_phys(target_phys_addr_t addr)
2880
{
2881
    uint8_t val;
2882
    cpu_physical_memory_read(addr, &val, 1);
2883
    return val;
2884
}
2885

    
2886
/* XXX: optimize */
2887
uint32_t lduw_phys(target_phys_addr_t addr)
2888
{
2889
    uint16_t val;
2890
    cpu_physical_memory_read(addr, (uint8_t *)&val, 2);
2891
    return tswap16(val);
2892
}
2893

    
2894
/* warning: addr must be aligned. The ram page is not masked as dirty
2895
   and the code inside is not invalidated. It is useful if the dirty
2896
   bits are used to track modified PTEs */
2897
void stl_phys_notdirty(target_phys_addr_t addr, uint32_t val)
2898
{
2899
    int io_index;
2900
    uint8_t *ptr;
2901
    unsigned long pd;
2902
    PhysPageDesc *p;
2903

    
2904
    p = phys_page_find(addr >> TARGET_PAGE_BITS);
2905
    if (!p) {
2906
        pd = IO_MEM_UNASSIGNED;
2907
    } else {
2908
        pd = p->phys_offset;
2909
    }
2910

    
2911
    if ((pd & ~TARGET_PAGE_MASK) != IO_MEM_RAM) {
2912
        io_index = (pd >> IO_MEM_SHIFT) & (IO_MEM_NB_ENTRIES - 1);
2913
        io_mem_write[io_index][2](io_mem_opaque[io_index], addr, val);
2914
    } else {
2915
        ptr = phys_ram_base + (pd & TARGET_PAGE_MASK) +
2916
            (addr & ~TARGET_PAGE_MASK);
2917
        stl_p(ptr, val);
2918
    }
2919
}
2920

    
2921
void stq_phys_notdirty(target_phys_addr_t addr, uint64_t val)
2922
{
2923
    int io_index;
2924
    uint8_t *ptr;
2925
    unsigned long pd;
2926
    PhysPageDesc *p;
2927

    
2928
    p = phys_page_find(addr >> TARGET_PAGE_BITS);
2929
    if (!p) {
2930
        pd = IO_MEM_UNASSIGNED;
2931
    } else {
2932
        pd = p->phys_offset;
2933
    }
2934

    
2935
    if ((pd & ~TARGET_PAGE_MASK) != IO_MEM_RAM) {
2936
        io_index = (pd >> IO_MEM_SHIFT) & (IO_MEM_NB_ENTRIES - 1);
2937
#ifdef TARGET_WORDS_BIGENDIAN
2938
        io_mem_write[io_index][2](io_mem_opaque[io_index], addr, val >> 32);
2939
        io_mem_write[io_index][2](io_mem_opaque[io_index], addr + 4, val);
2940
#else
2941
        io_mem_write[io_index][2](io_mem_opaque[io_index], addr, val);
2942
        io_mem_write[io_index][2](io_mem_opaque[io_index], addr + 4, val >> 32);
2943
#endif
2944
    } else {
2945
        ptr = phys_ram_base + (pd & TARGET_PAGE_MASK) +
2946
            (addr & ~TARGET_PAGE_MASK);
2947
        stq_p(ptr, val);
2948
    }
2949
}
2950

    
2951
/* warning: addr must be aligned */
2952
void stl_phys(target_phys_addr_t addr, uint32_t val)
2953
{
2954
    int io_index;
2955
    uint8_t *ptr;
2956
    unsigned long pd;
2957
    PhysPageDesc *p;
2958

    
2959
    p = phys_page_find(addr >> TARGET_PAGE_BITS);
2960
    if (!p) {
2961
        pd = IO_MEM_UNASSIGNED;
2962
    } else {
2963
        pd = p->phys_offset;
2964
    }
2965

    
2966
    if ((pd & ~TARGET_PAGE_MASK) != IO_MEM_RAM) {
2967
        io_index = (pd >> IO_MEM_SHIFT) & (IO_MEM_NB_ENTRIES - 1);
2968
        io_mem_write[io_index][2](io_mem_opaque[io_index], addr, val);
2969
    } else {
2970
        unsigned long addr1;
2971
        addr1 = (pd & TARGET_PAGE_MASK) + (addr & ~TARGET_PAGE_MASK);
2972
        /* RAM case */
2973
        ptr = phys_ram_base + addr1;
2974
        stl_p(ptr, val);
2975
        if (!cpu_physical_memory_is_dirty(addr1)) {
2976
            /* invalidate code */
2977
            tb_invalidate_phys_page_range(addr1, addr1 + 4, 0);
2978
            /* set dirty bit */
2979
            phys_ram_dirty[addr1 >> TARGET_PAGE_BITS] |=
2980
                (0xff & ~CODE_DIRTY_FLAG);
2981
        }
2982
    }
2983
}
2984

    
2985
/* XXX: optimize */
2986
void stb_phys(target_phys_addr_t addr, uint32_t val)
2987
{
2988
    uint8_t v = val;
2989
    cpu_physical_memory_write(addr, &v, 1);
2990
}
2991

    
2992
/* XXX: optimize */
2993
void stw_phys(target_phys_addr_t addr, uint32_t val)
2994
{
2995
    uint16_t v = tswap16(val);
2996
    cpu_physical_memory_write(addr, (const uint8_t *)&v, 2);
2997
}
2998

    
2999
/* XXX: optimize */
3000
void stq_phys(target_phys_addr_t addr, uint64_t val)
3001
{
3002
    val = tswap64(val);
3003
    cpu_physical_memory_write(addr, (const uint8_t *)&val, 8);
3004
}
3005

    
3006
#endif
3007

    
3008
/* virtual memory access for debug */
3009
int cpu_memory_rw_debug(CPUState *env, target_ulong addr,
3010
                        uint8_t *buf, int len, int is_write)
3011
{
3012
    int l;
3013
    target_phys_addr_t phys_addr;
3014
    target_ulong page;
3015

    
3016
    while (len > 0) {
3017
        page = addr & TARGET_PAGE_MASK;
3018
        phys_addr = cpu_get_phys_page_debug(env, page);
3019
        /* if no physical page mapped, return an error */
3020
        if (phys_addr == -1)
3021
            return -1;
3022
        l = (page + TARGET_PAGE_SIZE) - addr;
3023
        if (l > len)
3024
            l = len;
3025
        cpu_physical_memory_rw(phys_addr + (addr & ~TARGET_PAGE_MASK),
3026
                               buf, l, is_write);
3027
        len -= l;
3028
        buf += l;
3029
        addr += l;
3030
    }
3031
    return 0;
3032
}
3033

    
3034
/* in deterministic execution mode, instructions doing device I/Os
3035
   must be at the end of the TB */
3036
void cpu_io_recompile(CPUState *env, void *retaddr)
3037
{
3038
    TranslationBlock *tb;
3039
    uint32_t n, cflags;
3040
    target_ulong pc, cs_base;
3041
    uint64_t flags;
3042

    
3043
    tb = tb_find_pc((unsigned long)retaddr);
3044
    if (!tb) {
3045
        cpu_abort(env, "cpu_io_recompile: could not find TB for pc=%p", 
3046
                  retaddr);
3047
    }
3048
    n = env->icount_decr.u16.low + tb->icount;
3049
    cpu_restore_state(tb, env, (unsigned long)retaddr, NULL);
3050
    /* Calculate how many instructions had been executed before the fault
3051
       occurred.  */
3052
    n = n - env->icount_decr.u16.low;
3053
    /* Generate a new TB ending on the I/O insn.  */
3054
    n++;
3055
    /* On MIPS and SH, delay slot instructions can only be restarted if
3056
       they were already the first instruction in the TB.  If this is not
3057
       the first instruction in a TB then re-execute the preceding
3058
       branch.  */
3059
#if defined(TARGET_MIPS)
3060
    if ((env->hflags & MIPS_HFLAG_BMASK) != 0 && n > 1) {
3061
        env->active_tc.PC -= 4;
3062
        env->icount_decr.u16.low++;
3063
        env->hflags &= ~MIPS_HFLAG_BMASK;
3064
    }
3065
#elif defined(TARGET_SH4)
3066
    if ((env->flags & ((DELAY_SLOT | DELAY_SLOT_CONDITIONAL))) != 0
3067
            && n > 1) {
3068
        env->pc -= 2;
3069
        env->icount_decr.u16.low++;
3070
        env->flags &= ~(DELAY_SLOT | DELAY_SLOT_CONDITIONAL);
3071
    }
3072
#endif
3073
    /* This should never happen.  */
3074
    if (n > CF_COUNT_MASK)
3075
        cpu_abort(env, "TB too big during recompile");
3076

    
3077
    cflags = n | CF_LAST_IO;
3078
    pc = tb->pc;
3079
    cs_base = tb->cs_base;
3080
    flags = tb->flags;
3081
    tb_phys_invalidate(tb, -1);
3082
    /* FIXME: In theory this could raise an exception.  In practice
3083
       we have already translated the block once so it's probably ok.  */
3084
    tb_gen_code(env, pc, cs_base, flags, cflags);
3085
    /* TODO: If env->pc != tb->pc (i.e. the faulting instruction was not
3086
       the first in the TB) then we end up generating a whole new TB and
3087
       repeating the fault, which is horribly inefficient.
3088
       Better would be to execute just this insn uncached, or generate a
3089
       second new TB.  */
3090
    cpu_resume_from_signal(env, NULL);
3091
}
3092

    
3093
void dump_exec_info(FILE *f,
3094
                    int (*cpu_fprintf)(FILE *f, const char *fmt, ...))
3095
{
3096
    int i, target_code_size, max_target_code_size;
3097
    int direct_jmp_count, direct_jmp2_count, cross_page;
3098
    TranslationBlock *tb;
3099

    
3100
    target_code_size = 0;
3101
    max_target_code_size = 0;
3102
    cross_page = 0;
3103
    direct_jmp_count = 0;
3104
    direct_jmp2_count = 0;
3105
    for(i = 0; i < nb_tbs; i++) {
3106
        tb = &tbs[i];
3107
        target_code_size += tb->size;
3108
        if (tb->size > max_target_code_size)
3109
            max_target_code_size = tb->size;
3110
        if (tb->page_addr[1] != -1)
3111
            cross_page++;
3112
        if (tb->tb_next_offset[0] != 0xffff) {
3113
            direct_jmp_count++;
3114
            if (tb->tb_next_offset[1] != 0xffff) {
3115
                direct_jmp2_count++;
3116
            }
3117
        }
3118
    }
3119
    /* XXX: avoid using doubles ? */
3120
    cpu_fprintf(f, "Translation buffer state:\n");
3121
    cpu_fprintf(f, "gen code size       %ld/%ld\n",
3122
                code_gen_ptr - code_gen_buffer, code_gen_buffer_max_size);
3123
    cpu_fprintf(f, "TB count            %d/%d\n", 
3124
                nb_tbs, code_gen_max_blocks);
3125
    cpu_fprintf(f, "TB avg target size  %d max=%d bytes\n",
3126
                nb_tbs ? target_code_size / nb_tbs : 0,
3127
                max_target_code_size);
3128
    cpu_fprintf(f, "TB avg host size    %d bytes (expansion ratio: %0.1f)\n",
3129
                nb_tbs ? (code_gen_ptr - code_gen_buffer) / nb_tbs : 0,
3130
                target_code_size ? (double) (code_gen_ptr - code_gen_buffer) / target_code_size : 0);
3131
    cpu_fprintf(f, "cross page TB count %d (%d%%)\n",
3132
            cross_page,
3133
            nb_tbs ? (cross_page * 100) / nb_tbs : 0);
3134
    cpu_fprintf(f, "direct jump count   %d (%d%%) (2 jumps=%d %d%%)\n",
3135
                direct_jmp_count,
3136
                nb_tbs ? (direct_jmp_count * 100) / nb_tbs : 0,
3137
                direct_jmp2_count,
3138
                nb_tbs ? (direct_jmp2_count * 100) / nb_tbs : 0);
3139
    cpu_fprintf(f, "\nStatistics:\n");
3140
    cpu_fprintf(f, "TB flush count      %d\n", tb_flush_count);
3141
    cpu_fprintf(f, "TB invalidate count %d\n", tb_phys_invalidate_count);
3142
    cpu_fprintf(f, "TLB flush count     %d\n", tlb_flush_count);
3143
    tcg_dump_info(f, cpu_fprintf);
3144
}
3145

    
3146
#if !defined(CONFIG_USER_ONLY)
3147

    
3148
#define MMUSUFFIX _cmmu
3149
#define GETPC() NULL
3150
#define env cpu_single_env
3151
#define SOFTMMU_CODE_ACCESS
3152

    
3153
#define SHIFT 0
3154
#include "softmmu_template.h"
3155

    
3156
#define SHIFT 1
3157
#include "softmmu_template.h"
3158

    
3159
#define SHIFT 2
3160
#include "softmmu_template.h"
3161

    
3162
#define SHIFT 3
3163
#include "softmmu_template.h"
3164

    
3165
#undef env
3166

    
3167
#endif