VirtualBox

Changeset 37689 in vbox for trunk/src/recompiler/exec.c


Ignore:
Timestamp:
Jun 29, 2011 4:01:23 PM (13 years ago)
Author:
vboxsync
Message:

recompiler: Merged in changes from 0.13.0.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/recompiler/exec.c

    r37675 r37689  
    5757#ifndef VBOX
    5858#include "hw/hw.h"
    59 #endif
     59#include "hw/qdev.h"
     60#endif /* !VBOX */
    6061#include "osdep.h"
    6162#include "kvm.h"
     63#include "qemu-timer.h"
    6264#if defined(CONFIG_USER_ONLY)
    6365#include <qemu.h>
     66#include <signal.h>
     67#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
     68#include <sys/param.h>
     69#if __FreeBSD_version >= 700104
     70#define HAVE_KINFO_GETVMMAP
     71#define sigqueue sigqueue_freebsd  /* avoid redefinition */
     72#include <sys/time.h>
     73#include <sys/proc.h>
     74#include <machine/profile.h>
     75#define _KERNEL
     76#include <sys/user.h>
     77#undef _KERNEL
     78#undef sigqueue
     79#include <libutil.h>
     80#endif
     81#endif
    6482#endif
    6583
     
    83101#define SMC_BITMAP_USE_THRESHOLD 10
    84102
    85 #if defined(TARGET_SPARC64)
    86 #define TARGET_PHYS_ADDR_SPACE_BITS 41
    87 #elif defined(TARGET_SPARC)
    88 #define TARGET_PHYS_ADDR_SPACE_BITS 36
    89 #elif defined(TARGET_ALPHA)
    90 #define TARGET_PHYS_ADDR_SPACE_BITS 42
    91 #define TARGET_VIRT_ADDR_SPACE_BITS 42
    92 #elif defined(TARGET_PPC64)
    93 #define TARGET_PHYS_ADDR_SPACE_BITS 42
    94 #elif defined(TARGET_X86_64)
    95 #define TARGET_PHYS_ADDR_SPACE_BITS 42
    96 #elif defined(TARGET_I386)
    97 #define TARGET_PHYS_ADDR_SPACE_BITS 36
    98 #else
    99 #define TARGET_PHYS_ADDR_SPACE_BITS 32
    100 #endif
    101 
    102103static TranslationBlock *tbs;
    103 int code_gen_max_blocks;
     104static int code_gen_max_blocks;
    104105TranslationBlock *tb_phys_hash[CODE_GEN_PHYS_HASH_SIZE];
    105106static int nb_tbs;
     
    126127uint8_t code_gen_prologue[1024] code_gen_section;
    127128#else /* VBOX */
    128 extern uint8_t* code_gen_prologue;
     129extern uint8_t *code_gen_prologue;
    129130#endif /* VBOX */
    130131static uint8_t *code_gen_buffer;
     
    132133/* threshold to flush the translated code buffer */
    133134static unsigned long code_gen_buffer_max_size;
    134 uint8_t *code_gen_ptr;
    135 
    136 #ifndef VBOX
     135static uint8_t *code_gen_ptr;
     136
    137137#if !defined(CONFIG_USER_ONLY)
     138# ifndef VBOX
    138139int phys_ram_fd;
    139 uint8_t *phys_ram_dirty;
    140140static int in_migration;
    141 
    142 typedef struct RAMBlock {
    143     uint8_t *host;
    144     ram_addr_t offset;
    145     ram_addr_t length;
    146     struct RAMBlock *next;
    147 } RAMBlock;
    148 
    149 static RAMBlock *ram_blocks;
    150 /* TODO: When we implement (and use) ram deallocation (e.g. for hotplug)
    151    then we can no longer assume contiguous ram offsets, and external uses
    152    of this variable will break.  */
    153 ram_addr_t last_ram_offset;
    154 #endif
    155 #else /* VBOX */
    156 /* we have memory ranges (the high PC-BIOS mapping) which
    157    causes some pages to fall outside the dirty map here. */
    158 RTGCPHYS phys_ram_dirty_size;
    159 uint8_t *phys_ram_dirty;
    160 #endif /* VBOX */
     141# endif /* !VBOX */
     142
     143RAMList ram_list = { .blocks = QLIST_HEAD_INITIALIZER(ram_list) };
     144#endif
    161145
    162146CPUState *first_cpu;
     
    184168} PageDesc;
    185169
     170/* In system mode we want L1_MAP to be based on ram offsets,
     171   while in user mode we want it to be based on virtual addresses.  */
     172#if !defined(CONFIG_USER_ONLY)
     173#if HOST_LONG_BITS < TARGET_PHYS_ADDR_SPACE_BITS
     174# define L1_MAP_ADDR_SPACE_BITS  HOST_LONG_BITS
     175#else
     176# define L1_MAP_ADDR_SPACE_BITS  TARGET_PHYS_ADDR_SPACE_BITS
     177#endif
     178#else
     179# define L1_MAP_ADDR_SPACE_BITS  TARGET_VIRT_ADDR_SPACE_BITS
     180#endif
     181
     182/* Size of the L2 (and L3, etc) page tables.  */
     183#define L2_BITS 10
     184#define L2_SIZE (1 << L2_BITS)
     185
     186/* The bits remaining after N lower levels of page tables.  */
     187#define P_L1_BITS_REM \
     188    ((TARGET_PHYS_ADDR_SPACE_BITS - TARGET_PAGE_BITS) % L2_BITS)
     189#define V_L1_BITS_REM \
     190    ((L1_MAP_ADDR_SPACE_BITS - TARGET_PAGE_BITS) % L2_BITS)
     191
     192/* Size of the L1 page table.  Avoid silly small sizes.  */
     193#if P_L1_BITS_REM < 4
     194#define P_L1_BITS  (P_L1_BITS_REM + L2_BITS)
     195#else
     196#define P_L1_BITS  P_L1_BITS_REM
     197#endif
     198
     199#if V_L1_BITS_REM < 4
     200#define V_L1_BITS  (V_L1_BITS_REM + L2_BITS)
     201#else
     202#define V_L1_BITS  V_L1_BITS_REM
     203#endif
     204
     205#define P_L1_SIZE  ((target_phys_addr_t)1 << P_L1_BITS)
     206#define V_L1_SIZE  ((target_ulong)1 << V_L1_BITS)
     207
     208#define P_L1_SHIFT (TARGET_PHYS_ADDR_SPACE_BITS - TARGET_PAGE_BITS - P_L1_BITS)
     209#define V_L1_SHIFT (L1_MAP_ADDR_SPACE_BITS - TARGET_PAGE_BITS - V_L1_BITS)
     210
     211unsigned long qemu_real_host_page_size;
     212unsigned long qemu_host_page_bits;
     213unsigned long qemu_host_page_size;
     214unsigned long qemu_host_page_mask;
     215
     216/* This is a multi-level map on the virtual address space.
     217   The bottom level has pointers to PageDesc.  */
     218static void *l1_map[V_L1_SIZE];
     219
     220#if !defined(CONFIG_USER_ONLY)
    186221typedef struct PhysPageDesc {
    187222    /* offset in host memory of the page + io_index in the low bits */
     
    190225} PhysPageDesc;
    191226
    192 #define L2_BITS 10
    193 #if defined(CONFIG_USER_ONLY) && defined(TARGET_VIRT_ADDR_SPACE_BITS)
    194 /* XXX: this is a temporary hack for alpha target.
    195  *      In the future, this is to be replaced by a multi-level table
    196  *      to actually be able to handle the complete 64 bits address space.
    197  */
    198 #define L1_BITS (TARGET_VIRT_ADDR_SPACE_BITS - L2_BITS - TARGET_PAGE_BITS)
    199 #else
    200 #define L1_BITS (32 - L2_BITS - TARGET_PAGE_BITS)
    201 #endif
    202 #ifdef VBOX
    203 #define L0_BITS (TARGET_PHYS_ADDR_SPACE_BITS - 32)
    204 #endif
    205 
    206 #ifdef VBOX
    207 #define L0_SIZE (1 << L0_BITS)
    208 #endif
    209 #define L1_SIZE (1 << L1_BITS)
    210 #define L2_SIZE (1 << L2_BITS)
    211 
    212 unsigned long qemu_real_host_page_size;
    213 unsigned long qemu_host_page_bits;
    214 unsigned long qemu_host_page_size;
    215 unsigned long qemu_host_page_mask;
    216 
    217 /* XXX: for system emulation, it could just be an array */
    218 #ifndef VBOX
    219 static PageDesc *l1_map[L1_SIZE];
    220 static PhysPageDesc **l1_phys_map;
    221 #else
    222 static unsigned l0_map_max_used = 0;
    223 static PageDesc **l0_map[L0_SIZE];
    224 static void **l0_phys_map[L0_SIZE];
    225 #endif
    226 
    227 #if !defined(CONFIG_USER_ONLY)
     227/* This is a multi-level map on the physical address space.
     228   The bottom level has pointers to PhysPageDesc.  */
     229static void *l1_phys_map[P_L1_SIZE];
     230
    228231static void io_mem_init(void);
    229232
     
    238241#ifndef VBOX
    239242/* log support */
     243#ifdef WIN32
     244static const char *logfilename = "qemu.log";
     245#else
    240246static const char *logfilename = "/tmp/qemu.log";
     247#endif
    241248#endif /* !VBOX */
    242249FILE *logfile;
     
    244251#ifndef VBOX
    245252static int log_append = 0;
    246 #endif
     253#endif /* !VBOX */
    247254
    248255/* statistics */
    249256#ifndef VBOX
     257#if !defined(CONFIG_USER_ONLY)
    250258static int tlb_flush_count;
     259#endif
    251260static int tb_flush_count;
    252261static int tb_phys_invalidate_count;
     
    256265uint32_t tb_phys_invalidate_count;
    257266#endif /* VBOX */
    258 
    259 #define SUBPAGE_IDX(addr) ((addr) & ~TARGET_PAGE_MASK)
    260 typedef struct subpage_t {
    261     target_phys_addr_t base;
    262     CPUReadMemoryFunc * const *mem_read[TARGET_PAGE_SIZE][4];
    263     CPUWriteMemoryFunc * const *mem_write[TARGET_PAGE_SIZE][4];
    264     void *opaque[TARGET_PAGE_SIZE][2][4];
    265     ram_addr_t region_offset[TARGET_PAGE_SIZE][2][4];
    266 } subpage_t;
    267267
    268268#ifndef VBOX
     
    325325        qemu_host_page_size = TARGET_PAGE_SIZE;
    326326    qemu_host_page_bits = 0;
    327 #ifndef VBOX
    328     while ((1 << qemu_host_page_bits) < qemu_host_page_size)
    329 #else
    330     while ((1 << qemu_host_page_bits) < (int)qemu_host_page_size)
    331 #endif
     327    while ((1 << qemu_host_page_bits) < VBOX_ONLY((int))qemu_host_page_size)
    332328        qemu_host_page_bits++;
    333329    qemu_host_page_mask = ~(qemu_host_page_size - 1);
    334 #ifndef VBOX
    335     l1_phys_map = qemu_vmalloc(L1_SIZE * sizeof(void *));
    336     memset(l1_phys_map, 0, L1_SIZE * sizeof(void *));
    337 #endif
    338 
    339 #ifdef VBOX
    340     /* We use other means to set reserved bit on our pages */
    341 #else  /* !VBOX */
    342 #if !defined(_WIN32) && defined(CONFIG_USER_ONLY)
     330
     331#ifndef VBOX /* We use other means to set reserved bit on our pages */
     332#if defined(CONFIG_BSD) && defined(CONFIG_USER_ONLY)
    343333    {
    344         long long startaddr, endaddr;
     334#ifdef HAVE_KINFO_GETVMMAP
     335        struct kinfo_vmentry *freep;
     336        int i, cnt;
     337
     338        freep = kinfo_getvmmap(getpid(), &cnt);
     339        if (freep) {
     340            mmap_lock();
     341            for (i = 0; i < cnt; i++) {
     342                unsigned long startaddr, endaddr;
     343
     344                startaddr = freep[i].kve_start;
     345                endaddr = freep[i].kve_end;
     346                if (h2g_valid(startaddr)) {
     347                    startaddr = h2g(startaddr) & TARGET_PAGE_MASK;
     348
     349                    if (h2g_valid(endaddr)) {
     350                        endaddr = h2g(endaddr);
     351                        page_set_flags(startaddr, endaddr, PAGE_RESERVED);
     352                    } else {
     353#if TARGET_ABI_BITS <= L1_MAP_ADDR_SPACE_BITS
     354                        endaddr = ~0ul;
     355                        page_set_flags(startaddr, endaddr, PAGE_RESERVED);
     356#endif
     357                    }
     358                }
     359            }
     360            free(freep);
     361            mmap_unlock();
     362        }
     363#else
    345364        FILE *f;
    346         int n;
    347 
    348         mmap_lock();
     365
    349366        last_brk = (unsigned long)sbrk(0);
    350         f = fopen("/proc/self/maps", "r");
     367
     368        f = fopen("/compat/linux/proc/self/maps", "r");
    351369        if (f) {
     370            mmap_lock();
     371
    352372            do {
    353                 n = fscanf (f, "%llx-%llx %*[^\n]\n", &startaddr, &endaddr);
    354                 if (n == 2) {
    355                     startaddr = MIN(startaddr,
    356                                     (1ULL << TARGET_PHYS_ADDR_SPACE_BITS) - 1);
    357                     endaddr = MIN(endaddr,
    358                                     (1ULL << TARGET_PHYS_ADDR_SPACE_BITS) - 1);
    359                     page_set_flags(startaddr & TARGET_PAGE_MASK,
    360                                    TARGET_PAGE_ALIGN(endaddr),
    361                                    PAGE_RESERVED);
     373                unsigned long startaddr, endaddr;
     374                int n;
     375
     376                n = fscanf (f, "%lx-%lx %*[^\n]\n", &startaddr, &endaddr);
     377
     378                if (n == 2 && h2g_valid(startaddr)) {
     379                    startaddr = h2g(startaddr) & TARGET_PAGE_MASK;
     380
     381                    if (h2g_valid(endaddr)) {
     382                        endaddr = h2g(endaddr);
     383                    } else {
     384                        endaddr = ~0ul;
     385                    }
     386                    page_set_flags(startaddr, endaddr, PAGE_RESERVED);
    362387                }
    363388            } while (!feof(f));
     389
    364390            fclose(f);
    365         }
    366         mmap_unlock();
     391            mmap_unlock();
     392        }
     393#endif
    367394    }
    368395#endif
     
    370397}
    371398
    372 static inline PageDesc **page_l1_map(target_ulong index)
    373 {
    374 #ifndef VBOX
    375 #if TARGET_LONG_BITS > 32
    376     /* Host memory outside guest VM.  For 32-bit targets we have already
    377        excluded high addresses.  */
    378     if (index > ((target_ulong)L2_SIZE * L1_SIZE))
    379         return NULL;
    380 #endif
    381     return &l1_map[index >> L2_BITS];
    382 #else  /* VBOX */
    383     PageDesc **l1_map;
    384     AssertMsgReturn(index < (target_ulong)L2_SIZE * L1_SIZE * L0_SIZE,
    385                     ("index=%RGp >= %RGp; L1_SIZE=%#x L2_SIZE=%#x L0_SIZE=%#x\n",
    386                      (RTGCPHYS)index, (RTGCPHYS)L2_SIZE * L1_SIZE, L1_SIZE, L2_SIZE, L0_SIZE),
    387                     NULL);
    388     l1_map = l0_map[index >> (L1_BITS + L2_BITS)];
    389     if (RT_UNLIKELY(!l1_map))
    390     {
    391         unsigned i0 = index >> (L1_BITS + L2_BITS);
    392         l0_map[i0] = l1_map = qemu_mallocz(sizeof(PageDesc *) * L1_SIZE);
    393         if (RT_UNLIKELY(!l1_map))
     399static PageDesc *page_find_alloc(tb_page_addr_t index, int alloc)
     400{
     401    PageDesc *pd;
     402    void **lp;
     403    int i;
     404
     405#if defined(CONFIG_USER_ONLY)
     406    /* We can't use qemu_malloc because it may recurse into a locked mutex. */
     407# define ALLOC(P, SIZE)                                 \
     408    do {                                                \
     409        P = mmap(NULL, SIZE, PROT_READ | PROT_WRITE,    \
     410                 MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);   \
     411    } while (0)
     412#else
     413# define ALLOC(P, SIZE) \
     414    do { P = qemu_mallocz(SIZE); } while (0)
     415#endif
     416
     417    /* Level 1.  Always allocated.  */
     418    lp = l1_map + ((index >> V_L1_SHIFT) & (V_L1_SIZE - 1));
     419
     420    /* Level 2..N-1.  */
     421    for (i = V_L1_SHIFT / L2_BITS - 1; i > 0; i--) {
     422        void **p = *lp;
     423
     424        if (p == NULL) {
     425            if (!alloc) {
     426                return NULL;
     427            }
     428            ALLOC(p, sizeof(void *) * L2_SIZE);
     429            *lp = p;
     430        }
     431
     432        lp = p + ((index >> (i * L2_BITS)) & (L2_SIZE - 1));
     433    }
     434
     435    pd = *lp;
     436    if (pd == NULL) {
     437        if (!alloc) {
    394438            return NULL;
    395         if (i0 >= l0_map_max_used)
    396             l0_map_max_used = i0 + 1;
    397     }
    398     return &l1_map[(index >> L2_BITS) & (L1_SIZE - 1)];
    399 #endif /* VBOX */
    400 }
    401 
    402 static inline PageDesc *page_find_alloc(target_ulong index)
    403 {
    404     PageDesc **lp, *p;
    405     lp = page_l1_map(index);
    406     if (!lp)
    407         return NULL;
    408 
    409     p = *lp;
    410     if (!p) {
    411         /* allocate if not found */
    412 #if defined(CONFIG_USER_ONLY)
    413         size_t len = sizeof(PageDesc) * L2_SIZE;
    414         /* Don't use qemu_malloc because it may recurse.  */
    415         p = mmap(NULL, len, PROT_READ | PROT_WRITE,
    416                  MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
    417         *lp = p;
    418         if (h2g_valid(p)) {
    419             unsigned long addr = h2g(p);
    420             page_set_flags(addr & TARGET_PAGE_MASK,
    421                            TARGET_PAGE_ALIGN(addr + len),
    422                            PAGE_RESERVED);
    423         }
    424 #else
    425         p = qemu_mallocz(sizeof(PageDesc) * L2_SIZE);
    426         *lp = p;
    427 #endif
    428     }
    429     return p + (index & (L2_SIZE - 1));
    430 }
    431 
    432 static inline PageDesc *page_find(target_ulong index)
    433 {
    434     PageDesc **lp, *p;
    435     lp = page_l1_map(index);
    436     if (!lp)
    437         return NULL;
    438 
    439     p = *lp;
    440     if (!p) {
    441         return NULL;
    442     }
    443     return p + (index & (L2_SIZE - 1));
    444 }
    445 
     439        }
     440        ALLOC(pd, sizeof(PageDesc) * L2_SIZE);
     441        *lp = pd;
     442    }
     443
     444#undef ALLOC
     445
     446    return pd + (index & (L2_SIZE - 1));
     447}
     448
     449static inline PageDesc *page_find(tb_page_addr_t index)
     450{
     451    return page_find_alloc(index, 0);
     452}
     453
     454#if !defined(CONFIG_USER_ONLY)
    446455static PhysPageDesc *phys_page_find_alloc(target_phys_addr_t index, int alloc)
    447456{
    448     void **lp, **p;
    449457    PhysPageDesc *pd;
    450 
    451 #ifndef VBOX
    452     p = (void **)l1_phys_map;
    453 #if TARGET_PHYS_ADDR_SPACE_BITS > 32
    454 
    455 #if TARGET_PHYS_ADDR_SPACE_BITS > (32 + L1_BITS)
    456 #error unsupported TARGET_PHYS_ADDR_SPACE_BITS
    457 #endif
    458     lp = p + ((index >> (L1_BITS + L2_BITS)) & (L1_SIZE - 1));
    459     p = *lp;
    460     if (!p) {
    461         /* allocate if not found */
    462         if (!alloc)
     458    void **lp;
     459    int i;
     460
     461    /* Level 1.  Always allocated.  */
     462    lp = l1_phys_map + ((index >> P_L1_SHIFT) & (P_L1_SIZE - 1));
     463
     464    /* Level 2..N-1.  */
     465    for (i = P_L1_SHIFT / L2_BITS - 1; i > 0; i--) {
     466        void **p = *lp;
     467        if (p == NULL) {
     468            if (!alloc) {
     469                return NULL;
     470            }
     471            *lp = p = qemu_mallocz(sizeof(void *) * L2_SIZE);
     472        }
     473        lp = p + ((index >> (i * L2_BITS)) & (L2_SIZE - 1));
     474    }
     475
     476    pd = *lp;
     477    if (pd == NULL) {
     478        int i;
     479
     480        if (!alloc) {
    463481            return NULL;
    464         p = qemu_vmalloc(sizeof(void *) * L1_SIZE);
    465         memset(p, 0, sizeof(void *) * L1_SIZE);
    466         *lp = p;
    467     }
    468 #endif
    469 #else  /* VBOX */
    470     /* level 0 lookup and lazy allocation of level 1 map. */
    471     if (RT_UNLIKELY(index >= (target_phys_addr_t)L2_SIZE * L1_SIZE * L0_SIZE))
    472         return NULL;
    473     p = l0_phys_map[index >> (L1_BITS + L2_BITS)];
    474     if (RT_UNLIKELY(!p)) {
    475         if (!alloc)
    476             return NULL;
    477         p = qemu_vmalloc(sizeof(void **) * L1_SIZE);
    478         memset(p, 0, sizeof(void **) * L1_SIZE);
    479         l0_phys_map[index >> (L1_BITS + L2_BITS)] = p;
    480     }
    481 
    482     /* level 1 lookup and lazy allocation of level 2 map. */
    483 #endif /* VBOX */
    484     lp = p + ((index >> L2_BITS) & (L1_SIZE - 1));
    485     pd = *lp;
    486     if (!pd) {
    487         int i;
    488         /* allocate if not found */
    489         if (!alloc)
    490             return NULL;
    491         pd = qemu_vmalloc(sizeof(PhysPageDesc) * L2_SIZE);
    492         *lp = pd;
     482        }
     483
     484        *lp = pd = qemu_malloc(sizeof(PhysPageDesc) * L2_SIZE);
     485
    493486        for (i = 0; i < L2_SIZE; i++) {
    494           pd[i].phys_offset = IO_MEM_UNASSIGNED;
    495           pd[i].region_offset = (index + i) << TARGET_PAGE_BITS;
    496         }
    497     }
    498     return ((PhysPageDesc *)pd) + (index & (L2_SIZE - 1));
     487            pd[i].phys_offset = IO_MEM_UNASSIGNED;
     488            pd[i].region_offset = (index + i) << TARGET_PAGE_BITS;
     489        }
     490    }
     491
     492    return pd + (index & (L2_SIZE - 1));
    499493}
    500494
     
    504498}
    505499
    506 #if !defined(CONFIG_USER_ONLY)
    507500static void tlb_protect_code(ram_addr_t ram_addr);
    508501static void tlb_unprotect_code_phys(CPUState *env, ram_addr_t ram_addr,
     
    530523
    531524#ifdef USE_STATIC_CODE_GEN_BUFFER
    532 static uint8_t static_code_gen_buffer[DEFAULT_CODE_GEN_BUFFER_SIZE];
     525static uint8_t static_code_gen_buffer[DEFAULT_CODE_GEN_BUFFER_SIZE]
     526               __attribute__((aligned (CODE_GEN_ALIGN)));
    533527#endif
    534528
     
    594588        if (code_gen_buffer_size > 16 * 1024 * 1024)
    595589            code_gen_buffer_size = 16 * 1024 * 1024;
     590#elif defined(__s390x__)
     591        /* Map the buffer so that we can use direct calls and branches.  */
     592        /* We have a +- 4GB range on the branches; leave some slop.  */
     593        if (code_gen_buffer_size > (3ul * 1024 * 1024 * 1024)) {
     594            code_gen_buffer_size = 3ul * 1024 * 1024 * 1024;
     595        }
     596        start = (void *)0x90000000UL;
    596597#endif
    597598        code_gen_buffer = mmap(start, code_gen_buffer_size,
     
    637638#endif
    638639    code_gen_buffer_max_size = code_gen_buffer_size -
    639         code_gen_max_block_size();
     640        (TCG_MAX_OP_SIZE * OPC_MAX_SIZE);
    640641    code_gen_max_blocks = code_gen_buffer_size / CODE_GEN_AVG_BLOCK_SIZE;
    641642    tbs = qemu_malloc(code_gen_max_blocks * sizeof(TranslationBlock));
     
    654655    io_mem_init();
    655656#endif
     657#if !defined(CONFIG_USER_ONLY) || !defined(CONFIG_USE_GUEST_BASE)
     658    /* There's no guest base to take into account, so go ahead and
     659       initialize the prologue now.  */
     660    tcg_prologue_init(&tcg_ctx);
     661#endif
    656662}
    657663
    658664#ifndef VBOX
    659665#if defined(CPU_SAVE_VERSION) && !defined(CONFIG_USER_ONLY)
    660 
    661 static void cpu_common_pre_save(void *opaque)
    662 {
    663     CPUState *env = opaque;
    664 
    665     cpu_synchronize_state(env);
    666 }
    667 
    668 static int cpu_common_pre_load(void *opaque)
    669 {
    670     CPUState *env = opaque;
    671 
    672     cpu_synchronize_state(env);
    673     return 0;
    674 }
    675666
    676667static int cpu_common_post_load(void *opaque, int version_id)
     
    691682    .minimum_version_id = 1,
    692683    .minimum_version_id_old = 1,
    693     .pre_save = cpu_common_pre_save,
    694     .pre_load = cpu_common_pre_load,
    695684    .post_load = cpu_common_post_load,
    696685    .fields      = (VMStateField []) {
     
    742731#endif
    743732#if defined(CPU_SAVE_VERSION) && !defined(CONFIG_USER_ONLY)
    744     vmstate_register(cpu_index, &vmstate_cpu_common, env);
    745     register_savevm("cpu", cpu_index, CPU_SAVE_VERSION,
     733    vmstate_register(NULL, cpu_index, &vmstate_cpu_common, env);
     734    register_savevm(NULL, "cpu", cpu_index, CPU_SAVE_VERSION,
    746735                    cpu_save, cpu_load, env);
    747736#endif
     
    758747}
    759748
    760 /* set to NULL all the 'first_tb' fields in all PageDescs */
     749/* Set to NULL all the 'first_tb' fields in all PageDescs. */
     750
     751static void page_flush_tb_1 (int level, void **lp)
     752{
     753    int i;
     754
     755    if (*lp == NULL) {
     756        return;
     757    }
     758    if (level == 0) {
     759        PageDesc *pd = *lp;
     760        for (i = 0; i < L2_SIZE; ++i) {
     761            pd[i].first_tb = NULL;
     762            invalidate_page_bitmap(pd + i);
     763        }
     764    } else {
     765        void **pp = *lp;
     766        for (i = 0; i < L2_SIZE; ++i) {
     767            page_flush_tb_1 (level - 1, pp + i);
     768        }
     769    }
     770}
     771
    761772static void page_flush_tb(void)
    762773{
    763     int i, j;
    764     PageDesc *p;
    765 #ifdef VBOX
    766     int k;
    767 #endif
    768 
    769 #ifdef VBOX
    770     k = l0_map_max_used;
    771     while (k-- > 0) {
    772         PageDesc **l1_map = l0_map[k];
    773         if (l1_map) {
    774 #endif
    775             for(i = 0; i < L1_SIZE; i++) {
    776                 p = l1_map[i];
    777                 if (p) {
    778                     for(j = 0; j < L2_SIZE; j++) {
    779                         p->first_tb = NULL;
    780                         invalidate_page_bitmap(p);
    781                         p++;
    782                     }
    783                 }
    784             }
    785 #ifdef VBOX
    786         }
    787     }
    788 #endif
     774    int i;
     775    for (i = 0; i < V_L1_SIZE; i++) {
     776        page_flush_tb_1(V_L1_SHIFT / L2_BITS - 1, l1_map + i);
     777    }
    789778}
    790779
     
    930919}
    931920
    932 void tb_phys_invalidate(TranslationBlock *tb, target_ulong page_addr)
     921void tb_phys_invalidate(TranslationBlock *tb, tb_page_addr_t page_addr)
    933922{
    934923    CPUState *env;
    935924    PageDesc *p;
    936925    unsigned int h, n1;
    937     target_phys_addr_t phys_pc;
     926    tb_page_addr_t phys_pc;
    938927    TranslationBlock *tb1, *tb2;
    939928
     
    10941083    TranslationBlock *tb;
    10951084    uint8_t *tc_ptr;
    1096     target_ulong phys_pc, phys_page2, virt_page2;
     1085    tb_page_addr_t phys_pc, phys_page2;
     1086    target_ulong virt_page2;
    10971087    int code_gen_size;
    10981088
    1099     phys_pc = get_phys_addr_code(env, pc);
     1089    phys_pc = get_page_addr_code(env, pc);
    11001090    tb = tb_alloc(pc);
    11011091    if (!tb) {
     
    11191109    phys_page2 = -1;
    11201110    if ((pc & TARGET_PAGE_MASK) != virt_page2) {
    1121         phys_page2 = get_phys_addr_code(env, virt_page2);
    1122     }
    1123     tb_link_phys(tb, phys_pc, phys_page2);
     1111        phys_page2 = get_page_addr_code(env, virt_page2);
     1112    }
     1113    tb_link_page(tb, phys_pc, phys_page2);
    11241114    return tb;
    11251115}
     
    11301120   from a real cpu write access: the virtual CPU will exit the current
    11311121   TB if code is modified inside this TB. */
    1132 void tb_invalidate_phys_page_range(target_phys_addr_t start, target_phys_addr_t end,
     1122void tb_invalidate_phys_page_range(tb_page_addr_t start, tb_page_addr_t end,
    11331123                                   int is_cpu_write_access)
    11341124{
    11351125    TranslationBlock *tb, *tb_next, *saved_tb;
    11361126    CPUState *env = cpu_single_env;
    1137     target_ulong tb_start, tb_end;
     1127    tb_page_addr_t tb_start, tb_end;
    11381128    PageDesc *p;
    11391129    int n;
     
    12371227
    12381228/* len must be <= 8 and start must be a multiple of len */
    1239 static inline void tb_invalidate_phys_page_fast(target_phys_addr_t start, int len)
     1229static inline void tb_invalidate_phys_page_fast(tb_page_addr_t start, int len)
    12401230{
    12411231    PageDesc *p;
     
    12641254
    12651255#if !defined(CONFIG_SOFTMMU)
    1266 static void tb_invalidate_phys_page(target_phys_addr_t addr,
     1256static void tb_invalidate_phys_page(tb_page_addr_t addr,
    12671257                                    unsigned long pc, void *puc)
    12681258{
     
    13261316/* add the tb in the target page and protect it if necessary */
    13271317static inline void tb_alloc_page(TranslationBlock *tb,
    1328                                  unsigned int n, target_ulong page_addr)
     1318                                 unsigned int n, tb_page_addr_t page_addr)
    13291319{
    13301320    PageDesc *p;
     
    13321322
    13331323    tb->page_addr[n] = page_addr;
    1334     p = page_find_alloc(page_addr >> TARGET_PAGE_BITS);
     1324    p = page_find_alloc(page_addr >> TARGET_PAGE_BITS, 1);
    13351325    tb->page_next[n] = p->first_tb;
    13361326    last_first_tb = p->first_tb;
     
    13581348            prot |= p2->flags;
    13591349            p2->flags &= ~PAGE_WRITE;
    1360             page_get_flags(addr);
    13611350          }
    13621351        mprotect(g2h(page_addr), qemu_host_page_size,
     
    13861375
    13871376    if (nb_tbs >= code_gen_max_blocks ||
    1388 #ifndef VBOX
    1389         (code_gen_ptr - code_gen_buffer) >= code_gen_buffer_max_size)
    1390 #else
    1391         (code_gen_ptr - code_gen_buffer) >= (int)code_gen_buffer_max_size)
    1392 #endif
     1377        (code_gen_ptr - code_gen_buffer) >= VBOX_ONLY((unsigned long))code_gen_buffer_max_size)
    13931378        return NULL;
    13941379    tb = &tbs[nb_tbs++];
     
    14111396/* add a new TB and link it to the physical page tables. phys_page2 is
    14121397   (-1) to indicate that only one page contains the TB. */
    1413 void tb_link_phys(TranslationBlock *tb,
    1414                   target_ulong phys_pc, target_ulong phys_page2)
     1398void tb_link_page(TranslationBlock *tb,
     1399                  tb_page_addr_t phys_pc, tb_page_addr_t phys_page2)
    14151400{
    14161401    unsigned int h;
     
    15281513
    15291514#if defined(TARGET_HAS_ICE)
     1515#if defined(CONFIG_USER_ONLY)
     1516static void breakpoint_invalidate(CPUState *env, target_ulong pc)
     1517{
     1518    tb_invalidate_phys_page_range(pc, pc + 1, 0);
     1519}
     1520#else
    15301521static void breakpoint_invalidate(CPUState *env, target_ulong pc)
    15311522{
     
    15461537}
    15471538#endif
    1548 
     1539#endif /* TARGET_HAS_ICE */
     1540
     1541#if defined(CONFIG_USER_ONLY)
     1542void cpu_watchpoint_remove_all(CPUState *env, int mask)
     1543
     1544{
     1545}
     1546
     1547int cpu_watchpoint_insert(CPUState *env, target_ulong addr, target_ulong len,
     1548                          int flags, CPUWatchpoint **watchpoint)
     1549{
     1550    return -ENOSYS;
     1551}
     1552#else
    15491553/* Add a watchpoint.  */
    15501554int cpu_watchpoint_insert(CPUState *env, target_ulong addr, target_ulong len,
     
    16241628    }
    16251629}
     1630#endif
    16261631
    16271632/* Add a breakpoint.  */
     
    17621767static void cpu_unlink_tb(CPUState *env)
    17631768{
    1764 #if defined(CONFIG_USE_NPTL)
    17651769    /* FIXME: TB unchaining isn't SMP safe.  For now just ignore the
    17661770       problem and hope the cpu will stop of its own accord.  For userspace
    17671771       emulation this often isn't actually as bad as it sounds.  Often
    17681772       signals are used primarily to interrupt blocking syscalls.  */
    1769 #else
    17701773    TranslationBlock *tb;
    17711774    static spinlock_t interrupt_lock = SPIN_LOCK_UNLOCKED;
    17721775
     1776    spin_lock(&interrupt_lock);
    17731777    tb = env->current_tb;
    17741778    /* if the cpu is currently executing code, we must unlink it and
    17751779       all the potentially executing TB */
    1776     if (tb && !testandset(&interrupt_lock)) {
     1780    if (tb) {
    17771781        env->current_tb = NULL;
    17781782        tb_reset_jump_recursive(tb);
    1779         resetlock(&interrupt_lock);
    1780     }
    1781 #endif
     1783    }
     1784    spin_unlock(&interrupt_lock);
    17821785}
    17831786
     
    18721875    { 0, NULL, NULL },
    18731876};
     1877
     1878#ifndef CONFIG_USER_ONLY
     1879static QLIST_HEAD(memory_client_list, CPUPhysMemoryClient) memory_client_list
     1880    = QLIST_HEAD_INITIALIZER(memory_client_list);
     1881
     1882static void cpu_notify_set_memory(target_phys_addr_t start_addr,
     1883                                  ram_addr_t size,
     1884                                  ram_addr_t phys_offset)
     1885{
     1886    CPUPhysMemoryClient *client;
     1887    QLIST_FOREACH(client, &memory_client_list, list) {
     1888        client->set_memory(client, start_addr, size, phys_offset);
     1889    }
     1890}
     1891
     1892static int cpu_notify_sync_dirty_bitmap(target_phys_addr_t start,
     1893                                        target_phys_addr_t end)
     1894{
     1895    CPUPhysMemoryClient *client;
     1896    QLIST_FOREACH(client, &memory_client_list, list) {
     1897        int r = client->sync_dirty_bitmap(client, start, end);
     1898        if (r < 0)
     1899            return r;
     1900    }
     1901    return 0;
     1902}
     1903
     1904static int cpu_notify_migration_log(int enable)
     1905{
     1906    CPUPhysMemoryClient *client;
     1907    QLIST_FOREACH(client, &memory_client_list, list) {
     1908        int r = client->migration_log(client, enable);
     1909        if (r < 0)
     1910            return r;
     1911    }
     1912    return 0;
     1913}
     1914
     1915static void phys_page_for_each_1(CPUPhysMemoryClient *client,
     1916                                 int level, void **lp)
     1917{
     1918    int i;
     1919
     1920    if (*lp == NULL) {
     1921        return;
     1922    }
     1923    if (level == 0) {
     1924        PhysPageDesc *pd = *lp;
     1925        for (i = 0; i < L2_SIZE; ++i) {
     1926            if (pd[i].phys_offset != IO_MEM_UNASSIGNED) {
     1927                client->set_memory(client, pd[i].region_offset,
     1928                                   TARGET_PAGE_SIZE, pd[i].phys_offset);
     1929            }
     1930        }
     1931    } else {
     1932        void **pp = *lp;
     1933        for (i = 0; i < L2_SIZE; ++i) {
     1934            phys_page_for_each_1(client, level - 1, pp + i);
     1935        }
     1936    }
     1937}
     1938
     1939static void phys_page_for_each(CPUPhysMemoryClient *client)
     1940{
     1941    int i;
     1942    for (i = 0; i < P_L1_SIZE; ++i) {
     1943        phys_page_for_each_1(client, P_L1_SHIFT / L2_BITS - 1,
     1944                             l1_phys_map + 1);
     1945    }
     1946}
     1947
     1948void cpu_register_phys_memory_client(CPUPhysMemoryClient *client)
     1949{
     1950    QLIST_INSERT_HEAD(&memory_client_list, client, list);
     1951    phys_page_for_each(client);
     1952}
     1953
     1954void cpu_unregister_phys_memory_client(CPUPhysMemoryClient *client)
     1955{
     1956    QLIST_REMOVE(client, list);
     1957}
     1958#endif
    18741959
    18751960static int cmp1(const char *s1, int n, const char *s2)
     
    19121997    return mask;
    19131998}
    1914 #endif /* !VBOX */
    1915 
    1916 #ifndef VBOX /* VBOX: we have our own routine. */
     1999
    19172000void cpu_abort(CPUState *env, const char *fmt, ...)
    19182001{
     
    19442027    va_end(ap2);
    19452028    va_end(ap);
     2029#if defined(CONFIG_USER_ONLY)
     2030    {
     2031        struct sigaction act;
     2032        sigfillset(&act.sa_mask);
     2033        act.sa_handler = SIG_DFL;
     2034        sigaction(SIGABRT, &act, NULL);
     2035    }
     2036#endif
    19462037    abort();
    19472038}
    1948 #endif /* !VBOX */
    1949 
    1950 #ifndef VBOX /* not needed */
     2039
    19512040CPUState *cpu_copy(CPUState *env)
    19522041{
     
    19822071    return new_env;
    19832072}
     2073
    19842074#endif /* !VBOX */
    1985 
    19862075#if !defined(CONFIG_USER_ONLY)
    19872076
     
    19992088    memset (&env->tb_jmp_cache[i], 0,
    20002089            TB_JMP_PAGE_SIZE * sizeof(TranslationBlock *));
    2001 
    20022090#ifdef VBOX
     2091
    20032092    /* inform raw mode about TLB page flush */
    20042093    remR3FlushPage(env, addr);
     
    20352124    memset (env->tb_jmp_cache, 0, TB_JMP_CACHE_SIZE * sizeof (void *));
    20362125
     2126    env->tlb_flush_addr = -1;
     2127    env->tlb_flush_mask = 0;
     2128    tlb_flush_count++;
    20372129#ifdef VBOX
     2130
    20382131    /* inform raw mode about TLB flush */
    20392132    remR3FlushTLB(env, flush_global);
    2040 #endif
    2041     tlb_flush_count++;
     2133#endif /* VBOX */
    20422134}
    20432135
     
    20622154    printf("tlb_flush_page: " TARGET_FMT_lx "\n", addr);
    20632155#endif
     2156    /* Check if we need to flush due to large pages.  */
     2157    if ((addr & env->tlb_flush_mask) == env->tlb_flush_addr) {
     2158#if defined(DEBUG_TLB)
     2159        printf("tlb_flush_page: forced full flush ("
     2160               TARGET_FMT_lx "/" TARGET_FMT_lx ")\n",
     2161               env->tlb_flush_addr, env->tlb_flush_mask);
     2162#endif
     2163        tlb_flush(env, 1);
     2164        return;
     2165    }
    20642166    /* must reset current TB so that interrupts cannot modify the
    20652167       links while we are modifying them */
     
    20842186    /** @todo Retest this? This function has changed... */
    20852187    remR3ProtectCode(cpu_single_env, ram_addr);
    2086 #endif
     2188#endif /* VBOX */
    20872189}
    20882190
     
    20922194                                    target_ulong vaddr)
    20932195{
    2094 #ifdef VBOX
    2095     if (RT_LIKELY((ram_addr >> TARGET_PAGE_BITS) < phys_ram_dirty_size))
    2096 #endif
    2097     phys_ram_dirty[ram_addr >> TARGET_PAGE_BITS] |= CODE_DIRTY_FLAG;
     2196    cpu_physical_memory_set_dirty_flags(ram_addr, CODE_DIRTY_FLAG);
    20982197}
    20992198
     
    21022201{
    21032202    unsigned long addr;
    2104 
    21052203#ifdef VBOX
     2204
    21062205    if (start & 3)
    21072206        return;
    2108 #endif
     2207#endif /* VBOX */
    21092208    if ((tlb_entry->addr_write & ~TARGET_PAGE_MASK) == IO_MEM_RAM) {
    21102209        addr = (tlb_entry->addr_write & TARGET_PAGE_MASK) + tlb_entry->addend;
     
    21212220    CPUState *env;
    21222221    unsigned long length, start1;
    2123     int i, mask, len;
    2124     uint8_t *p;
     2222    int i;
    21252223
    21262224    start &= TARGET_PAGE_MASK;
     
    21302228    if (length == 0)
    21312229        return;
    2132     len = length >> TARGET_PAGE_BITS;
    2133     mask = ~dirty_flags;
    2134     p = phys_ram_dirty + (start >> TARGET_PAGE_BITS);
    2135 #ifdef VBOX
    2136     if (RT_LIKELY((start >> TARGET_PAGE_BITS) < phys_ram_dirty_size))
    2137 #endif
    2138     for(i = 0; i < len; i++)
    2139         p[i] &= mask;
     2230    cpu_physical_memory_mask_dirty_range(start, length, dirty_flags);
    21402231
    21412232    /* we modify the TLB cache so that the dirty bit will be set again
     
    21662257
    21672258#ifndef VBOX
     2259
    21682260int cpu_physical_memory_set_dirty_tracking(int enable)
    21692261{
     2262    int ret = 0;
    21702263    in_migration = enable;
    2171     if (kvm_enabled()) {
    2172         return kvm_set_migration_log(enable);
    2173     }
    2174     return 0;
     2264    ret = cpu_notify_migration_log(!!enable);
     2265    return ret;
    21752266}
    21762267
     
    21792270    return in_migration;
    21802271}
     2272
    21812273#endif /* !VBOX */
    21822274
     
    21852277{
    21862278#ifndef VBOX
    2187     int ret = 0;
    2188 
    2189     if (kvm_enabled())
    2190         ret = kvm_physical_sync_dirty_bitmap(start_addr, end_addr);
     2279    int ret;
     2280
     2281    ret = cpu_notify_sync_dirty_bitmap(start_addr, end_addr);
    21912282    return ret;
    2192 #else
     2283#else  /* VBOX */
    21932284    return 0;
    2194 #endif
     2285#endif /* VBOX */
    21952286}
    21962287
     
    22552346}
    22562347
    2257 /* add a new TLB entry. At most one entry for a given virtual address
    2258    is permitted. Return 0 if OK or 2 if the page could not be mapped
    2259    (can only happen in non SOFTMMU mode for I/O pages or pages
    2260    conflicting with the host address space). */
    2261 int tlb_set_page_exec(CPUState *env, target_ulong vaddr,
    2262                       target_phys_addr_t paddr, int prot,
    2263                       int mmu_idx, int is_softmmu)
     2348/* Our TLB does not support large pages, so remember the area covered by
     2349   large pages and trigger a full TLB flush if these are invalidated.  */
     2350static void tlb_add_large_page(CPUState *env, target_ulong vaddr,
     2351                               target_ulong size)
     2352{
     2353    target_ulong mask = ~(size - 1);
     2354
     2355    if (env->tlb_flush_addr == (target_ulong)-1) {
     2356        env->tlb_flush_addr = vaddr & mask;
     2357        env->tlb_flush_mask = mask;
     2358        return;
     2359    }
     2360    /* Extend the existing region to include the new page.
     2361       This is a compromise between unnecessary flushes and the cost
     2362       of maintaining a full variable size TLB.  */
     2363    mask &= env->tlb_flush_mask;
     2364    while (((env->tlb_flush_addr ^ vaddr) & mask) != 0) {
     2365        mask <<= 1;
     2366    }
     2367    env->tlb_flush_addr &= mask;
     2368    env->tlb_flush_mask = mask;
     2369}
     2370
     2371/* Add a new TLB entry. At most one entry for a given virtual address
     2372   is permitted. Only a single TARGET_PAGE_SIZE region is mapped, the
     2373   supplied size is only used by tlb_flush_page.  */
     2374void tlb_set_page(CPUState *env, target_ulong vaddr,
     2375                  target_phys_addr_t paddr, int prot,
     2376                  int mmu_idx, target_ulong size)
    22642377{
    22652378    PhysPageDesc *p;
     
    22682381    target_ulong address;
    22692382    target_ulong code_address;
    2270     target_phys_addr_t addend;
    2271     int ret;
     2383    unsigned long addend;
    22722384    CPUTLBEntry *te;
    22732385    CPUWatchpoint *wp;
     
    22772389#endif
    22782390
     2391    assert(size >= TARGET_PAGE_SIZE);
     2392    if (size != TARGET_PAGE_SIZE) {
     2393        tlb_add_large_page(env, vaddr, size);
     2394    }
    22792395    p = phys_page_find(paddr >> TARGET_PAGE_BITS);
    22802396    if (!p) {
     
    22882404#endif
    22892405
    2290     ret = 0;
    22912406    address = vaddr;
    22922407    if ((pd & ~TARGET_PAGE_MASK) > IO_MEM_ROM && !(pd & IO_MEM_ROMD)) {
     
    23572472    QTAILQ_FOREACH(wp, &env->watchpoints, entry) {
    23582473        if (vaddr == (wp->vaddr & TARGET_PAGE_MASK)) {
    2359             iotlb = io_mem_watch + paddr;
    2360             /* TODO: The memory case can be optimized by not trapping
    2361                reads of pages with a write breakpoint.  */
    2362             address |= TLB_MMIO;
     2474            /* Avoid trapping reads of pages with a write breakpoint. */
     2475            if ((prot & PAGE_WRITE) || (wp->flags & BP_MEM_READ)) {
     2476                iotlb = io_mem_watch + paddr;
     2477                address |= TLB_MMIO;
     2478                break;
     2479            }
    23632480        }
    23642481    }
     
    24092526    remR3FlushPage(env, vaddr);
    24102527#endif
    2411     return ret;
    24122528}
    24132529
     
    24212537{
    24222538}
    2423 
    2424 int tlb_set_page_exec(CPUState *env, target_ulong vaddr,
    2425                       target_phys_addr_t paddr, int prot,
    2426                       int mmu_idx, int is_softmmu)
    2427 {
    2428     return 0;
    2429 }
    2430 
    2431 #ifndef VBOX
    24322539
    24332540/*
     
    24352542 * and calls callback function 'fn' for each region.
    24362543 */
    2437 int walk_memory_regions(void *priv,
    2438     int (*fn)(void *, unsigned long, unsigned long, unsigned long))
    2439 {
    2440     unsigned long start, end;
    2441     PageDesc *p = NULL;
    2442     int i, j, prot, prot1;
    2443     int rc = 0;
    2444 
    2445     start = end = -1;
    2446     prot = 0;
    2447 
    2448     for (i = 0; i <= L1_SIZE; i++) {
    2449         p = (i < L1_SIZE) ? l1_map[i] : NULL;
    2450         for (j = 0; j < L2_SIZE; j++) {
    2451             prot1 = (p == NULL) ? 0 : p[j].flags;
    2452             /*
    2453              * "region" is one continuous chunk of memory
    2454              * that has same protection flags set.
    2455              */
    2456             if (prot1 != prot) {
    2457                 end = (i << (32 - L1_BITS)) | (j << TARGET_PAGE_BITS);
    2458                 if (start != -1) {
    2459                     rc = (*fn)(priv, start, end, prot);
    2460                     /* callback can stop iteration by returning != 0 */
    2461                     if (rc != 0)
    2462                         return (rc);
     2544
     2545struct walk_memory_regions_data
     2546{
     2547    walk_memory_regions_fn fn;
     2548    void *priv;
     2549    unsigned long start;
     2550    int prot;
     2551};
     2552
     2553static int walk_memory_regions_end(struct walk_memory_regions_data *data,
     2554                                   abi_ulong end, int new_prot)
     2555{
     2556    if (data->start != -1ul) {
     2557        int rc = data->fn(data->priv, data->start, end, data->prot);
     2558        if (rc != 0) {
     2559            return rc;
     2560        }
     2561    }
     2562
     2563    data->start = (new_prot ? end : -1ul);
     2564    data->prot = new_prot;
     2565
     2566    return 0;
     2567}
     2568
     2569static int walk_memory_regions_1(struct walk_memory_regions_data *data,
     2570                                 abi_ulong base, int level, void **lp)
     2571{
     2572    abi_ulong pa;
     2573    int i, rc;
     2574
     2575    if (*lp == NULL) {
     2576        return walk_memory_regions_end(data, base, 0);
     2577    }
     2578
     2579    if (level == 0) {
     2580        PageDesc *pd = *lp;
     2581        for (i = 0; i < L2_SIZE; ++i) {
     2582            int prot = pd[i].flags;
     2583
     2584            pa = base | (i << TARGET_PAGE_BITS);
     2585            if (prot != data->prot) {
     2586                rc = walk_memory_regions_end(data, pa, prot);
     2587                if (rc != 0) {
     2588                    return rc;
    24632589                }
    2464                 if (prot1 != 0)
    2465                     start = end;
    2466                 else
    2467                     start = -1;
    2468                 prot = prot1;
    24692590            }
    2470             if (p == NULL)
    2471                 break;
    2472         }
    2473     }
    2474     return (rc);
    2475 }
    2476 
    2477 static int dump_region(void *priv, unsigned long start,
    2478     unsigned long end, unsigned long prot)
     2591        }
     2592    } else {
     2593        void **pp = *lp;
     2594        for (i = 0; i < L2_SIZE; ++i) {
     2595            pa = base | ((abi_ulong)i <<
     2596                (TARGET_PAGE_BITS + L2_BITS * level));
     2597            rc = walk_memory_regions_1(data, pa, level - 1, pp + i);
     2598            if (rc != 0) {
     2599                return rc;
     2600            }
     2601        }
     2602    }
     2603
     2604    return 0;
     2605}
     2606
     2607int walk_memory_regions(void *priv, walk_memory_regions_fn fn)
     2608{
     2609    struct walk_memory_regions_data data;
     2610    unsigned long i;
     2611
     2612    data.fn = fn;
     2613    data.priv = priv;
     2614    data.start = -1ul;
     2615    data.prot = 0;
     2616
     2617    for (i = 0; i < V_L1_SIZE; i++) {
     2618        int rc = walk_memory_regions_1(&data, (abi_ulong)i << V_L1_SHIFT,
     2619                                       V_L1_SHIFT / L2_BITS - 1, l1_map + i);
     2620        if (rc != 0) {
     2621            return rc;
     2622        }
     2623    }
     2624
     2625    return walk_memory_regions_end(&data, 0, 0);
     2626}
     2627
     2628static int dump_region(void *priv, abi_ulong start,
     2629    abi_ulong end, unsigned long prot)
    24792630{
    24802631    FILE *f = (FILE *)priv;
    24812632
    2482     (void) fprintf(f, "%08lx-%08lx %08lx %c%c%c\n",
     2633    (void) fprintf(f, TARGET_ABI_FMT_lx"-"TARGET_ABI_FMT_lx
     2634        " "TARGET_ABI_FMT_lx" %c%c%c\n",
    24832635        start, end, end - start,
    24842636        ((prot & PAGE_READ) ? 'r' : '-'),
     
    24972649}
    24982650
    2499 #endif /* !VBOX */
    2500 
    25012651int page_get_flags(target_ulong address)
    25022652{
     
    25092659}
    25102660
    2511 /* modify the flags of a page and invalidate the code if
    2512    necessary. The flag PAGE_WRITE_ORG is positioned automatically
    2513    depending on PAGE_WRITE */
     2661/* Modify the flags of a page and invalidate the code if necessary.
     2662   The flag PAGE_WRITE_ORG is positioned automatically depending
     2663   on PAGE_WRITE.  The mmap_lock should already be held. */
    25142664void page_set_flags(target_ulong start, target_ulong end, int flags)
    25152665{
    2516     PageDesc *p;
    2517     target_ulong addr;
    2518 
    2519     /* mmap_lock should already be held.  */
     2666    target_ulong addr, len;
     2667
     2668    /* This function should never be called with addresses outside the
     2669       guest address space.  If this assert fires, it probably indicates
     2670       a missing call to h2g_valid.  */
     2671#if TARGET_ABI_BITS > L1_MAP_ADDR_SPACE_BITS
     2672    assert(end < ((abi_ulong)1 << L1_MAP_ADDR_SPACE_BITS));
     2673#endif
     2674    assert(start < end);
     2675
    25202676    start = start & TARGET_PAGE_MASK;
    25212677    end = TARGET_PAGE_ALIGN(end);
    2522     if (flags & PAGE_WRITE)
     2678
     2679    if (flags & PAGE_WRITE) {
    25232680        flags |= PAGE_WRITE_ORG;
     2681    }
     2682
    25242683#ifdef VBOX
    25252684    AssertMsgFailed(("We shouldn't be here, and if we should, we must have an env to do the proper locking!\n"));
    25262685#endif
    2527     for(addr = start; addr < end; addr += TARGET_PAGE_SIZE) {
    2528         p = page_find_alloc(addr >> TARGET_PAGE_BITS);
    2529         /* We may be called for host regions that are outside guest
    2530            address space.  */
    2531         if (!p)
    2532             return;
    2533         /* if the write protection is set, then we invalidate the code
    2534            inside */
     2686    for (addr = start, len = end - start;
     2687         len != 0;
     2688         len -= TARGET_PAGE_SIZE, addr += TARGET_PAGE_SIZE) {
     2689        PageDesc *p = page_find_alloc(addr >> TARGET_PAGE_BITS, 1);
     2690
     2691        /* If the write protection bit is set, then we invalidate
     2692           the code inside.  */
    25352693        if (!(p->flags & PAGE_WRITE) &&
    25362694            (flags & PAGE_WRITE) &&
     
    25482706    target_ulong addr;
    25492707
    2550     if (start + len < start)
    2551         /* we've wrapped around */
     2708    /* This function should never be called with addresses outside the
     2709       guest address space.  If this assert fires, it probably indicates
     2710       a missing call to h2g_valid.  */
     2711#if TARGET_ABI_BITS > L1_MAP_ADDR_SPACE_BITS
     2712    assert(start < ((abi_ulong)1 << L1_MAP_ADDR_SPACE_BITS));
     2713#endif
     2714
     2715    if (len == 0) {
     2716        return 0;
     2717    }
     2718    if (start + len - 1 < start) {
     2719        /* We've wrapped around.  */
    25522720        return -1;
     2721    }
    25532722
    25542723    end = TARGET_PAGE_ALIGN(start+len); /* must do before we loose bits in the next step */
    25552724    start = start & TARGET_PAGE_MASK;
    25562725
    2557     for(addr = start; addr < end; addr += TARGET_PAGE_SIZE) {
     2726    for (addr = start, len = end - start;
     2727         len != 0;
     2728         len -= TARGET_PAGE_SIZE, addr += TARGET_PAGE_SIZE) {
    25582729        p = page_find(addr >> TARGET_PAGE_BITS);
    25592730        if( !p )
     
    25832754int page_unprotect(target_ulong address, unsigned long pc, void *puc)
    25842755{
    2585     unsigned int page_index, prot, pindex;
    2586     PageDesc *p, *p1;
     2756    unsigned int prot;
     2757    PageDesc *p;
    25872758    target_ulong host_start, host_end, addr;
    25882759
     
    25922763    mmap_lock();
    25932764
    2594     host_start = address & qemu_host_page_mask;
    2595     page_index = host_start >> TARGET_PAGE_BITS;
    2596     p1 = page_find(page_index);
    2597     if (!p1) {
     2765    p = page_find(address >> TARGET_PAGE_BITS);
     2766    if (!p) {
    25982767        mmap_unlock();
    25992768        return 0;
    26002769    }
    2601     host_end = host_start + qemu_host_page_size;
    2602     p = p1;
    2603     prot = 0;
    2604     for(addr = host_start;addr < host_end; addr += TARGET_PAGE_SIZE) {
    2605         prot |= p->flags;
    2606         p++;
    2607     }
     2770
    26082771    /* if the page was really writable, then we change its
    26092772       protection back to writable */
    2610     if (prot & PAGE_WRITE_ORG) {
    2611         pindex = (address - host_start) >> TARGET_PAGE_BITS;
    2612         if (!(p1[pindex].flags & PAGE_WRITE)) {
    2613             mprotect((void *)g2h(host_start), qemu_host_page_size,
    2614                      (prot & PAGE_BITS) | PAGE_WRITE);
    2615             p1[pindex].flags |= PAGE_WRITE;
     2773    if ((p->flags & PAGE_WRITE_ORG) && !(p->flags & PAGE_WRITE)) {
     2774        host_start = address & qemu_host_page_mask;
     2775        host_end = host_start + qemu_host_page_size;
     2776
     2777        prot = 0;
     2778        for (addr = host_start ; addr < host_end ; addr += TARGET_PAGE_SIZE) {
     2779            p = page_find(addr >> TARGET_PAGE_BITS);
     2780            p->flags |= PAGE_WRITE;
     2781            prot |= p->flags;
     2782
    26162783            /* and since the content will be modified, we must invalidate
    26172784               the corresponding translated code. */
    2618             tb_invalidate_phys_page(address, pc, puc);
     2785            tb_invalidate_phys_page(addr, pc, puc);
    26192786#ifdef DEBUG_TB_CHECK
    2620             tb_invalidate_check(address);
    2621 #endif
    2622             mmap_unlock();
    2623             return 1;
    2624         }
     2787            tb_invalidate_check(addr);
     2788#endif
     2789        }
     2790        mprotect((void *)g2h(host_start), qemu_host_page_size,
     2791                 prot & PAGE_BITS);
     2792
     2793        mmap_unlock();
     2794        return 1;
    26252795    }
    26262796    mmap_unlock();
     
    26362806#if !defined(CONFIG_USER_ONLY)
    26372807
     2808#define SUBPAGE_IDX(addr) ((addr) & ~TARGET_PAGE_MASK)
     2809typedef struct subpage_t {
     2810    target_phys_addr_t base;
     2811    ram_addr_t sub_io_index[TARGET_PAGE_SIZE];
     2812    ram_addr_t region_offset[TARGET_PAGE_SIZE];
     2813} subpage_t;
     2814
    26382815static int subpage_register (subpage_t *mmio, uint32_t start, uint32_t end,
    26392816                             ram_addr_t memory, ram_addr_t region_offset);
    2640 static void *subpage_init (target_phys_addr_t base, ram_addr_t *phys,
    2641                            ram_addr_t orig_memory, ram_addr_t region_offset);
     2817static subpage_t *subpage_init (target_phys_addr_t base, ram_addr_t *phys,
     2818                                ram_addr_t orig_memory,
     2819                                ram_addr_t region_offset);
    26422820#define CHECK_SUBPAGE(addr, start_addr, start_addr2, end_addr, end_addr2, \
    26432821                      need_subpage)                                     \
     
    26772855    CPUState *env;
    26782856    ram_addr_t orig_size = size;
    2679     void *subpage;
    2680 
    2681     if (kvm_enabled())
    2682         kvm_set_phys_mem(start_addr, size, phys_offset);
     2857    subpage_t *subpage;
     2858
     2859#ifndef VBOX
     2860    cpu_notify_set_memory(start_addr, size, phys_offset);
     2861#endif /* !VBOX */
    26832862
    26842863    if (phys_offset == IO_MEM_UNASSIGNED) {
     
    26972876            CHECK_SUBPAGE(addr, start_addr, start_addr2, end_addr, end_addr2,
    26982877                          need_subpage);
    2699             if (need_subpage || phys_offset & IO_MEM_SUBWIDTH) {
     2878            if (need_subpage) {
    27002879                if (!(orig_memory & IO_MEM_SUBPAGE)) {
    27012880                    subpage = subpage_init((addr & TARGET_PAGE_MASK),
     
    27292908                              end_addr2, need_subpage);
    27302909
    2731                 if (need_subpage || phys_offset & IO_MEM_SUBWIDTH) {
     2910                if (need_subpage) {
    27322911                    subpage = subpage_init((addr & TARGET_PAGE_MASK),
    27332912                                           &p->phys_offset, IO_MEM_UNASSIGNED,
     
    27622941
    27632942#ifndef VBOX
     2943
    27642944void qemu_register_coalesced_mmio(target_phys_addr_t addr, ram_addr_t size)
    27652945{
     
    27742954}
    27752955
    2776 ram_addr_t qemu_ram_alloc(ram_addr_t size)
    2777 {
    2778     RAMBlock *new_block;
     2956void qemu_flush_coalesced_mmio_buffer(void)
     2957{
     2958    if (kvm_enabled())
     2959        kvm_flush_coalesced_mmio_buffer();
     2960}
     2961
     2962#if defined(__linux__) && !defined(TARGET_S390X)
     2963
     2964#include <sys/vfs.h>
     2965
     2966#define HUGETLBFS_MAGIC       0x958458f6
     2967
     2968static long gethugepagesize(const char *path)
     2969{
     2970    struct statfs fs;
     2971    int ret;
     2972
     2973    do {
     2974            ret = statfs(path, &fs);
     2975    } while (ret != 0 && errno == EINTR);
     2976
     2977    if (ret != 0) {
     2978            perror(path);
     2979            return 0;
     2980    }
     2981
     2982    if (fs.f_type != HUGETLBFS_MAGIC)
     2983            fprintf(stderr, "Warning: path not on HugeTLBFS: %s\n", path);
     2984
     2985    return fs.f_bsize;
     2986}
     2987
     2988static void *file_ram_alloc(RAMBlock *block,
     2989                            ram_addr_t memory,
     2990                            const char *path)
     2991{
     2992    char *filename;
     2993    void *area;
     2994    int fd;
     2995#ifdef MAP_POPULATE
     2996    int flags;
     2997#endif
     2998    unsigned long hpagesize;
     2999
     3000    hpagesize = gethugepagesize(path);
     3001    if (!hpagesize) {
     3002        return NULL;
     3003    }
     3004
     3005    if (memory < hpagesize) {
     3006        return NULL;
     3007    }
     3008
     3009    if (kvm_enabled() && !kvm_has_sync_mmu()) {
     3010        fprintf(stderr, "host lacks kvm mmu notifiers, -mem-path unsupported\n");
     3011        return NULL;
     3012    }
     3013
     3014    if (asprintf(&filename, "%s/qemu_back_mem.XXXXXX", path) == -1) {
     3015        return NULL;
     3016    }
     3017
     3018    fd = mkstemp(filename);
     3019    if (fd < 0) {
     3020        perror("unable to create backing store for hugepages");
     3021        free(filename);
     3022        return NULL;
     3023    }
     3024    unlink(filename);
     3025    free(filename);
     3026
     3027    memory = (memory+hpagesize-1) & ~(hpagesize-1);
     3028
     3029    /*
     3030     * ftruncate is not supported by hugetlbfs in older
     3031     * hosts, so don't bother bailing out on errors.
     3032     * If anything goes wrong with it under other filesystems,
     3033     * mmap will fail.
     3034     */
     3035    if (ftruncate(fd, memory))
     3036        perror("ftruncate");
     3037
     3038#ifdef MAP_POPULATE
     3039    /* NB: MAP_POPULATE won't exhaustively alloc all phys pages in the case
     3040     * MAP_PRIVATE is requested.  For mem_prealloc we mmap as MAP_SHARED
     3041     * to sidestep this quirk.
     3042     */
     3043    flags = mem_prealloc ? MAP_POPULATE | MAP_SHARED : MAP_PRIVATE;
     3044    area = mmap(0, memory, PROT_READ | PROT_WRITE, flags, fd, 0);
     3045#else
     3046    area = mmap(0, memory, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0);
     3047#endif
     3048    if (area == MAP_FAILED) {
     3049        perror("file_ram_alloc: can't mmap RAM pages");
     3050        close(fd);
     3051        return (NULL);
     3052    }
     3053    block->fd = fd;
     3054    return area;
     3055}
     3056#endif
     3057
     3058static ram_addr_t find_ram_offset(ram_addr_t size)
     3059{
     3060    RAMBlock *block, *next_block;
     3061    ram_addr_t offset = 0, mingap = ULONG_MAX;
     3062
     3063    if (QLIST_EMPTY(&ram_list.blocks))
     3064        return 0;
     3065
     3066    QLIST_FOREACH(block, &ram_list.blocks, next) {
     3067        ram_addr_t end, next = ULONG_MAX;
     3068
     3069        end = block->offset + block->length;
     3070
     3071        QLIST_FOREACH(next_block, &ram_list.blocks, next) {
     3072            if (next_block->offset >= end) {
     3073                next = MIN(next, next_block->offset);
     3074            }
     3075        }
     3076        if (next - end >= size && next - end < mingap) {
     3077            offset =  end;
     3078            mingap = next - end;
     3079        }
     3080    }
     3081    return offset;
     3082}
     3083
     3084static ram_addr_t last_ram_offset(void)
     3085{
     3086    RAMBlock *block;
     3087    ram_addr_t last = 0;
     3088
     3089    QLIST_FOREACH(block, &ram_list.blocks, next)
     3090        last = MAX(last, block->offset + block->length);
     3091
     3092    return last;
     3093}
     3094
     3095ram_addr_t qemu_ram_alloc_from_ptr(DeviceState *dev, const char *name,
     3096                        ram_addr_t size, void *host)
     3097{
     3098    RAMBlock *new_block, *block;
    27793099
    27803100    size = TARGET_PAGE_ALIGN(size);
    2781     new_block = qemu_malloc(sizeof(*new_block));
    2782 
    2783 #if defined(TARGET_S390X) && defined(CONFIG_KVM)
    2784     /* XXX S390 KVM requires the topmost vma of the RAM to be < 256GB */
    2785     new_block->host = mmap((void*)0x1000000, size, PROT_EXEC|PROT_READ|PROT_WRITE,
    2786                            MAP_SHARED | MAP_ANONYMOUS, -1, 0);
    2787 #else
    2788     new_block->host = qemu_vmalloc(size);
    2789 #endif
    2790 #ifdef MADV_MERGEABLE
    2791     madvise(new_block->host, size, MADV_MERGEABLE);
    2792 #endif
    2793     new_block->offset = last_ram_offset;
     3101    new_block = qemu_mallocz(sizeof(*new_block));
     3102
     3103    if (dev && dev->parent_bus && dev->parent_bus->info->get_dev_path) {
     3104        char *id = dev->parent_bus->info->get_dev_path(dev);
     3105        if (id) {
     3106            snprintf(new_block->idstr, sizeof(new_block->idstr), "%s/", id);
     3107            qemu_free(id);
     3108        }
     3109    }
     3110    pstrcat(new_block->idstr, sizeof(new_block->idstr), name);
     3111
     3112    QLIST_FOREACH(block, &ram_list.blocks, next) {
     3113        if (!strcmp(block->idstr, new_block->idstr)) {
     3114            fprintf(stderr, "RAMBlock \"%s\" already registered, abort!\n",
     3115                    new_block->idstr);
     3116            abort();
     3117        }
     3118    }
     3119
     3120    new_block->host = host;
     3121
     3122    new_block->offset = find_ram_offset(size);
    27943123    new_block->length = size;
    27953124
    2796     new_block->next = ram_blocks;
    2797     ram_blocks = new_block;
    2798 
    2799     phys_ram_dirty = qemu_realloc(phys_ram_dirty,
    2800         (last_ram_offset + size) >> TARGET_PAGE_BITS);
    2801     memset(phys_ram_dirty + (last_ram_offset >> TARGET_PAGE_BITS),
     3125    QLIST_INSERT_HEAD(&ram_list.blocks, new_block, next);
     3126
     3127    ram_list.phys_dirty = qemu_realloc(ram_list.phys_dirty,
     3128                                       last_ram_offset() >> TARGET_PAGE_BITS);
     3129    memset(ram_list.phys_dirty + (new_block->offset >> TARGET_PAGE_BITS),
    28023130           0xff, size >> TARGET_PAGE_BITS);
    2803 
    2804     last_ram_offset += size;
    28053131
    28063132    if (kvm_enabled())
     
    28103136}
    28113137
     3138ram_addr_t qemu_ram_alloc(DeviceState *dev, const char *name, ram_addr_t size)
     3139{
     3140    RAMBlock *new_block, *block;
     3141
     3142    size = TARGET_PAGE_ALIGN(size);
     3143    new_block = qemu_mallocz(sizeof(*new_block));
     3144
     3145    if (dev && dev->parent_bus && dev->parent_bus->info->get_dev_path) {
     3146        char *id = dev->parent_bus->info->get_dev_path(dev);
     3147        if (id) {
     3148            snprintf(new_block->idstr, sizeof(new_block->idstr), "%s/", id);
     3149            qemu_free(id);
     3150        }
     3151    }
     3152    pstrcat(new_block->idstr, sizeof(new_block->idstr), name);
     3153
     3154    QLIST_FOREACH(block, &ram_list.blocks, next) {
     3155        if (!strcmp(block->idstr, new_block->idstr)) {
     3156            fprintf(stderr, "RAMBlock \"%s\" already registered, abort!\n",
     3157                    new_block->idstr);
     3158            abort();
     3159        }
     3160    }
     3161
     3162    if (mem_path) {
     3163#if defined (__linux__) && !defined(TARGET_S390X)
     3164        new_block->host = file_ram_alloc(new_block, size, mem_path);
     3165        if (!new_block->host) {
     3166            new_block->host = qemu_vmalloc(size);
     3167#ifdef MADV_MERGEABLE
     3168            madvise(new_block->host, size, MADV_MERGEABLE);
     3169#endif
     3170        }
     3171#else
     3172        fprintf(stderr, "-mem-path option unsupported\n");
     3173        exit(1);
     3174#endif
     3175    } else {
     3176#if defined(TARGET_S390X) && defined(CONFIG_KVM)
     3177        /* XXX S390 KVM requires the topmost vma of the RAM to be < 256GB */
     3178        new_block->host = mmap((void*)0x1000000, size,
     3179                                PROT_EXEC|PROT_READ|PROT_WRITE,
     3180                                MAP_SHARED | MAP_ANONYMOUS, -1, 0);
     3181#else
     3182        new_block->host = qemu_vmalloc(size);
     3183#endif
     3184#ifdef MADV_MERGEABLE
     3185        madvise(new_block->host, size, MADV_MERGEABLE);
     3186#endif
     3187    }
     3188    new_block->offset = find_ram_offset(size);
     3189    new_block->length = size;
     3190
     3191    QLIST_INSERT_HEAD(&ram_list.blocks, new_block, next);
     3192
     3193    ram_list.phys_dirty = qemu_realloc(ram_list.phys_dirty,
     3194                                       last_ram_offset() >> TARGET_PAGE_BITS);
     3195    memset(ram_list.phys_dirty + (new_block->offset >> TARGET_PAGE_BITS),
     3196           0xff, size >> TARGET_PAGE_BITS);
     3197
     3198    if (kvm_enabled())
     3199        kvm_setup_guest_memory(new_block->host, size);
     3200
     3201    return new_block->offset;
     3202}
     3203
    28123204void qemu_ram_free(ram_addr_t addr)
    28133205{
    2814     /* TODO: implement this.  */
     3206    RAMBlock *block;
     3207
     3208    QLIST_FOREACH(block, &ram_list.blocks, next) {
     3209        if (addr == block->offset) {
     3210            QLIST_REMOVE(block, next);
     3211            if (mem_path) {
     3212#if defined (__linux__) && !defined(TARGET_S390X)
     3213                if (block->fd) {
     3214                    munmap(block->host, block->length);
     3215                    close(block->fd);
     3216                } else {
     3217                    qemu_vfree(block->host);
     3218                }
     3219#endif
     3220            } else {
     3221#if defined(TARGET_S390X) && defined(CONFIG_KVM)
     3222                munmap(block->host, block->length);
     3223#else
     3224                qemu_vfree(block->host);
     3225#endif
     3226            }
     3227            qemu_free(block);
     3228            return;
     3229        }
     3230    }
     3231
    28153232}
    28163233
     
    28253242void *qemu_get_ram_ptr(ram_addr_t addr)
    28263243{
    2827     RAMBlock *prev;
    2828     RAMBlock **prevp;
    28293244    RAMBlock *block;
    28303245
    2831     prev = NULL;
    2832     prevp = &ram_blocks;
    2833     block = ram_blocks;
    2834     while (block && (block->offset > addr
    2835                      || block->offset + block->length <= addr)) {
    2836         if (prev)
    2837           prevp = &prev->next;
    2838         prev = block;
    2839         block = block->next;
    2840     }
    2841     if (!block) {
    2842         fprintf(stderr, "Bad ram offset %" PRIx64 "\n", (uint64_t)addr);
    2843         abort();
    2844     }
    2845     /* Move this entry to to start of the list.  */
    2846     if (prev) {
    2847         prev->next = block->next;
    2848         block->next = *prevp;
    2849         *prevp = block;
    2850     }
    2851     return block->host + (addr - block->offset);
     3246    QLIST_FOREACH(block, &ram_list.blocks, next) {
     3247        if (addr - block->offset < block->length) {
     3248            QLIST_REMOVE(block, next);
     3249            QLIST_INSERT_HEAD(&ram_list.blocks, block, next);
     3250            return block->host + (addr - block->offset);
     3251        }
     3252    }
     3253
     3254    fprintf(stderr, "Bad ram offset %" PRIx64 "\n", (uint64_t)addr);
     3255    abort();
     3256
     3257    return NULL;
    28523258}
    28533259
     
    28563262ram_addr_t qemu_ram_addr_from_host(void *ptr)
    28573263{
    2858     RAMBlock *prev;
    2859     RAMBlock **prevp;
    28603264    RAMBlock *block;
    28613265    uint8_t *host = ptr;
    28623266
    2863     prev = NULL;
    2864     prevp = &ram_blocks;
    2865     block = ram_blocks;
    2866     while (block && (block->host > host
    2867                      || block->host + block->length <= host)) {
    2868         if (prev)
    2869           prevp = &prev->next;
    2870         prev = block;
    2871         block = block->next;
    2872     }
    2873     if (!block) {
    2874         fprintf(stderr, "Bad ram pointer %p\n", ptr);
    2875         abort();
    2876     }
    2877     return block->offset + (host - block->host);
     3267    QLIST_FOREACH(block, &ram_list.blocks, next) {
     3268        if (host - block->host < block->length) {
     3269            return block->offset + (host - block->host);
     3270        }
     3271    }
     3272
     3273    fprintf(stderr, "Bad ram pointer %p\n", ptr);
     3274    abort();
     3275
     3276    return 0;
    28783277}
    28793278
     
    29593358{
    29603359    int dirty_flags;
    2961 #ifdef VBOX
    2962     if (RT_UNLIKELY((ram_addr >> TARGET_PAGE_BITS) >= phys_ram_dirty_size))
    2963         dirty_flags = 0xff;
    2964     else
    2965 #endif /* VBOX */
    2966     dirty_flags = phys_ram_dirty[ram_addr >> TARGET_PAGE_BITS];
     3360    dirty_flags = cpu_physical_memory_get_dirty_flags(ram_addr);
    29673361    if (!(dirty_flags & CODE_DIRTY_FLAG)) {
    29683362#if !defined(CONFIG_USER_ONLY)
    29693363        tb_invalidate_phys_page_fast(ram_addr, 1);
    2970 # ifdef VBOX
    2971         if (RT_UNLIKELY((ram_addr >> TARGET_PAGE_BITS) >= phys_ram_dirty_size))
    2972             dirty_flags = 0xff;
    2973         else
    2974 # endif /* VBOX */
    2975         dirty_flags = phys_ram_dirty[ram_addr >> TARGET_PAGE_BITS];
     3364        dirty_flags = cpu_physical_memory_get_dirty_flags(ram_addr);
    29763365#endif
    29773366    }
     
    29813370    stb_p(qemu_get_ram_ptr(ram_addr), val);
    29823371#endif
    2983 #ifdef CONFIG_KQEMU
    2984     if (cpu_single_env->kqemu_enabled &&
    2985         (dirty_flags & KQEMU_MODIFY_PAGE_MASK) != KQEMU_MODIFY_PAGE_MASK)
    2986         kqemu_modify_page(cpu_single_env, ram_addr);
    2987 #endif
    29883372    dirty_flags |= (0xff & ~CODE_DIRTY_FLAG);
    2989 #ifdef VBOX
    2990     if (RT_LIKELY((ram_addr >> TARGET_PAGE_BITS) < phys_ram_dirty_size))
    2991 #endif /* !VBOX */
    2992     phys_ram_dirty[ram_addr >> TARGET_PAGE_BITS] = dirty_flags;
     3373    cpu_physical_memory_set_dirty_flags(ram_addr, dirty_flags);
    29933374    /* we remove the notdirty callback only if the code has been
    29943375       flushed */
     
    30013382{
    30023383    int dirty_flags;
    3003 #ifdef VBOX
    3004     if (RT_UNLIKELY((ram_addr >> TARGET_PAGE_BITS) >= phys_ram_dirty_size))
    3005         dirty_flags = 0xff;
    3006     else
    3007 #endif /* VBOX */
    3008     dirty_flags = phys_ram_dirty[ram_addr >> TARGET_PAGE_BITS];
     3384    dirty_flags = cpu_physical_memory_get_dirty_flags(ram_addr);
    30093385    if (!(dirty_flags & CODE_DIRTY_FLAG)) {
    30103386#if !defined(CONFIG_USER_ONLY)
    30113387        tb_invalidate_phys_page_fast(ram_addr, 2);
    3012 # ifdef VBOX
    3013         if (RT_UNLIKELY((ram_addr >> TARGET_PAGE_BITS) >= phys_ram_dirty_size))
    3014             dirty_flags = 0xff;
    3015         else
    3016 # endif /* VBOX */
    3017         dirty_flags = phys_ram_dirty[ram_addr >> TARGET_PAGE_BITS];
     3388        dirty_flags = cpu_physical_memory_get_dirty_flags(ram_addr);
    30183389#endif
    30193390    }
     
    30243395#endif
    30253396    dirty_flags |= (0xff & ~CODE_DIRTY_FLAG);
    3026 #ifdef VBOX
    3027     if (RT_LIKELY((ram_addr >> TARGET_PAGE_BITS) < phys_ram_dirty_size))
    3028 #endif
    3029     phys_ram_dirty[ram_addr >> TARGET_PAGE_BITS] = dirty_flags;
     3397    cpu_physical_memory_set_dirty_flags(ram_addr, dirty_flags);
    30303398    /* we remove the notdirty callback only if the code has been
    30313399       flushed */
     
    30383406{
    30393407    int dirty_flags;
    3040 #ifdef VBOX
    3041     if (RT_UNLIKELY((ram_addr >> TARGET_PAGE_BITS) >= phys_ram_dirty_size))
    3042         dirty_flags = 0xff;
    3043     else
    3044 #endif /* VBOX */
    3045     dirty_flags = phys_ram_dirty[ram_addr >> TARGET_PAGE_BITS];
     3408    dirty_flags = cpu_physical_memory_get_dirty_flags(ram_addr);
    30463409    if (!(dirty_flags & CODE_DIRTY_FLAG)) {
    30473410#if !defined(CONFIG_USER_ONLY)
    30483411        tb_invalidate_phys_page_fast(ram_addr, 4);
    3049 # ifdef VBOX
    3050         if (RT_UNLIKELY((ram_addr >> TARGET_PAGE_BITS) >= phys_ram_dirty_size))
    3051             dirty_flags = 0xff;
    3052         else
    3053 # endif /* VBOX */
    3054         dirty_flags = phys_ram_dirty[ram_addr >> TARGET_PAGE_BITS];
     3412        dirty_flags = cpu_physical_memory_get_dirty_flags(ram_addr);
    30553413#endif
    30563414    }
     
    30613419#endif
    30623420    dirty_flags |= (0xff & ~CODE_DIRTY_FLAG);
    3063 #ifdef VBOX
    3064     if (RT_LIKELY((ram_addr >> TARGET_PAGE_BITS) < phys_ram_dirty_size))
    3065 #endif
    3066     phys_ram_dirty[ram_addr >> TARGET_PAGE_BITS] = dirty_flags;
     3421    cpu_physical_memory_set_dirty_flags(ram_addr, dirty_flags);
    30673422    /* we remove the notdirty callback only if the code has been
    30683423       flushed */
     
    31823537};
    31833538
    3184 static inline uint32_t subpage_readlen (subpage_t *mmio, target_phys_addr_t addr,
    3185                                  unsigned int len)
    3186 {
    3187     uint32_t ret;
    3188     unsigned int idx;
    3189 
    3190     idx = SUBPAGE_IDX(addr);
     3539static inline uint32_t subpage_readlen (subpage_t *mmio,
     3540                                        target_phys_addr_t addr,
     3541                                        unsigned int len)
     3542{
     3543    unsigned int idx = SUBPAGE_IDX(addr);
    31913544#if defined(DEBUG_SUBPAGE)
    31923545    printf("%s: subpage %p len %d addr " TARGET_FMT_plx " idx %d\n", __func__,
    31933546           mmio, len, addr, idx);
    31943547#endif
    3195     ret = (**mmio->mem_read[idx][len])(mmio->opaque[idx][0][len],
    3196                                        addr + mmio->region_offset[idx][0][len]);
    3197 
    3198     return ret;
     3548
     3549    addr += mmio->region_offset[idx];
     3550    idx = mmio->sub_io_index[idx];
     3551    return io_mem_read[idx][len](io_mem_opaque[idx], addr);
    31993552}
    32003553
    32013554static inline void subpage_writelen (subpage_t *mmio, target_phys_addr_t addr,
    3202                               uint32_t value, unsigned int len)
    3203 {
    3204     unsigned int idx;
    3205 
    3206     idx = SUBPAGE_IDX(addr);
     3555                                     uint32_t value, unsigned int len)
     3556{
     3557    unsigned int idx = SUBPAGE_IDX(addr);
    32073558#if defined(DEBUG_SUBPAGE)
    3208     printf("%s: subpage %p len %d addr " TARGET_FMT_plx " idx %d value %08x\n", __func__,
    3209            mmio, len, addr, idx, value);
    3210 #endif
    3211     (**mmio->mem_write[idx][len])(mmio->opaque[idx][1][len],
    3212                                   addr + mmio->region_offset[idx][1][len],
    3213                                   value);
     3559    printf("%s: subpage %p len %d addr " TARGET_FMT_plx " idx %d value %08x\n",
     3560           __func__, mmio, len, addr, idx, value);
     3561#endif
     3562
     3563    addr += mmio->region_offset[idx];
     3564    idx = mmio->sub_io_index[idx];
     3565    io_mem_write[idx][len](io_mem_opaque[idx], addr, value);
    32143566}
    32153567
    32163568static uint32_t subpage_readb (void *opaque, target_phys_addr_t addr)
    32173569{
    3218 #if defined(DEBUG_SUBPAGE)
    3219     printf("%s: addr " TARGET_FMT_plx "\n", __func__, addr);
    3220 #endif
    3221 
    32223570    return subpage_readlen(opaque, addr, 0);
    32233571}
     
    32263574                            uint32_t value)
    32273575{
    3228 #if defined(DEBUG_SUBPAGE)
    3229     printf("%s: addr " TARGET_FMT_plx " val %08x\n", __func__, addr, value);
    3230 #endif
    32313576    subpage_writelen(opaque, addr, value, 0);
    32323577}
     
    32343579static uint32_t subpage_readw (void *opaque, target_phys_addr_t addr)
    32353580{
    3236 #if defined(DEBUG_SUBPAGE)
    3237     printf("%s: addr " TARGET_FMT_plx "\n", __func__, addr);
    3238 #endif
    3239 
    32403581    return subpage_readlen(opaque, addr, 1);
    32413582}
     
    32443585                            uint32_t value)
    32453586{
    3246 #if defined(DEBUG_SUBPAGE)
    3247     printf("%s: addr " TARGET_FMT_plx " val %08x\n", __func__, addr, value);
    3248 #endif
    32493587    subpage_writelen(opaque, addr, value, 1);
    32503588}
     
    32523590static uint32_t subpage_readl (void *opaque, target_phys_addr_t addr)
    32533591{
    3254 #if defined(DEBUG_SUBPAGE)
    3255     printf("%s: addr " TARGET_FMT_plx "\n", __func__, addr);
    3256 #endif
    3257 
    32583592    return subpage_readlen(opaque, addr, 2);
    32593593}
    32603594
    3261 static void subpage_writel (void *opaque,
    3262                          target_phys_addr_t addr, uint32_t value)
    3263 {
    3264 #if defined(DEBUG_SUBPAGE)
    3265     printf("%s: addr " TARGET_FMT_plx " val %08x\n", __func__, addr, value);
    3266 #endif
     3595static void subpage_writel (void *opaque, target_phys_addr_t addr,
     3596                            uint32_t value)
     3597{
    32673598    subpage_writelen(opaque, addr, value, 2);
    32683599}
     
    32843615{
    32853616    int idx, eidx;
    3286     unsigned int i;
    32873617
    32883618    if (start >= TARGET_PAGE_SIZE || end >= TARGET_PAGE_SIZE)
     
    32943624           mmio, start, end, idx, eidx, memory);
    32953625#endif
    3296     memory >>= IO_MEM_SHIFT;
     3626    memory = (memory >> IO_MEM_SHIFT) & (IO_MEM_NB_ENTRIES - 1);
    32973627    for (; idx <= eidx; idx++) {
    3298         for (i = 0; i < 4; i++) {
    3299             if (io_mem_read[memory][i]) {
    3300                 mmio->mem_read[idx][i] = &io_mem_read[memory][i];
    3301                 mmio->opaque[idx][0][i] = io_mem_opaque[memory];
    3302                 mmio->region_offset[idx][0][i] = region_offset;
    3303             }
    3304             if (io_mem_write[memory][i]) {
    3305                 mmio->mem_write[idx][i] = &io_mem_write[memory][i];
    3306                 mmio->opaque[idx][1][i] = io_mem_opaque[memory];
    3307                 mmio->region_offset[idx][1][i] = region_offset;
    3308             }
    3309         }
     3628        mmio->sub_io_index[idx] = memory;
     3629        mmio->region_offset[idx] = region_offset;
    33103630    }
    33113631
     
    33133633}
    33143634
    3315 static void *subpage_init (target_phys_addr_t base, ram_addr_t *phys,
    3316                            ram_addr_t orig_memory, ram_addr_t region_offset)
     3635static subpage_t *subpage_init (target_phys_addr_t base, ram_addr_t *phys,
     3636                                ram_addr_t orig_memory,
     3637                                ram_addr_t region_offset)
    33173638{
    33183639    subpage_t *mmio;
     
    33283649#endif
    33293650    *phys = subpage_memory | IO_MEM_SUBPAGE;
    3330     subpage_register(mmio, 0, TARGET_PAGE_SIZE - 1, orig_memory,
    3331                          region_offset);
     3651    subpage_register(mmio, 0, TARGET_PAGE_SIZE-1, orig_memory, region_offset);
    33323652
    33333653    return mmio;
     
    33433663            return i;
    33443664        }
    3345 
     3665    fprintf(stderr, "RAN out out io_mem_idx, max %d !\n", IO_MEM_NB_ENTRIES);
    33463666    return -1;
    33473667}
     
    33593679                                        void *opaque)
    33603680{
    3361     int i, subwidth = 0;
     3681    int i;
    33623682
    33633683    if (io_index <= 0) {
     
    33713691    }
    33723692
    3373     for(i = 0;i < 3; i++) {
    3374         if (!mem_read[i] || !mem_write[i])
    3375             subwidth = IO_MEM_SUBWIDTH;
    3376         io_mem_read[io_index][i] = mem_read[i];
    3377         io_mem_write[io_index][i] = mem_write[i];
     3693    for (i = 0; i < 3; ++i) {
     3694        io_mem_read[io_index][i]
     3695            = (mem_read[i] ? mem_read[i] : unassigned_mem_read[i]);
     3696    }
     3697    for (i = 0; i < 3; ++i) {
     3698        io_mem_write[io_index][i]
     3699            = (mem_write[i] ? mem_write[i] : unassigned_mem_write[i]);
    33783700    }
    33793701    io_mem_opaque[io_index] = opaque;
    3380     return (io_index << IO_MEM_SHIFT) | subwidth;
     3702
     3703    return (io_index << IO_MEM_SHIFT);
    33813704}
    33823705
     
    34193742/* physical memory access (slow version, mainly for debug) */
    34203743#if defined(CONFIG_USER_ONLY)
    3421 void cpu_physical_memory_rw(target_phys_addr_t addr, uint8_t *buf,
    3422                             int len, int is_write)
     3744int cpu_memory_rw_debug(CPUState *env, target_ulong addr,
     3745                        uint8_t *buf, int len, int is_write)
    34233746{
    34243747    int l, flags;
     
    34333756        flags = page_get_flags(page);
    34343757        if (!(flags & PAGE_VALID))
    3435             return;
     3758            return -1;
    34363759        if (is_write) {
    34373760            if (!(flags & PAGE_WRITE))
    3438                 return;
     3761                return -1;
    34393762            /* XXX: this code should not depend on lock_user */
    34403763            if (!(p = lock_user(VERIFY_WRITE, addr, l, 0)))
    3441                 /* FIXME - should this return an error rather than just fail? */
    3442                 return;
     3764                return -1;
    34433765            memcpy(p, buf, l);
    34443766            unlock_user(p, addr, l);
    34453767        } else {
    34463768            if (!(flags & PAGE_READ))
    3447                 return;
     3769                return -1;
    34483770            /* XXX: this code should not depend on lock_user */
    34493771            if (!(p = lock_user(VERIFY_READ, addr, l, 1)))
    3450                 /* FIXME - should this return an error rather than just fail? */
    3451                 return;
     3772                return -1;
    34523773            memcpy(buf, p, l);
    34533774            unlock_user(p, addr, 0);
     
    34573778        addr += l;
    34583779    }
     3780    return 0;
    34593781}
    34603782
     
    35323854                    tb_invalidate_phys_page_range(addr1, addr1 + l, 0);
    35333855                    /* set dirty bit */
    3534 #ifdef VBOX
    3535                     if (RT_LIKELY((addr1 >> TARGET_PAGE_BITS) < phys_ram_dirty_size))
    3536 #endif
    3537                     phys_ram_dirty[addr1 >> TARGET_PAGE_BITS] |=
    3538                         (0xff & ~CODE_DIRTY_FLAG);
     3856                    cpu_physical_memory_set_dirty_flags(
     3857                        addr1, (0xff & ~CODE_DIRTY_FLAG));
    35393858                }
    35403859            }
     
    37604079                    tb_invalidate_phys_page_range(addr1, addr1 + l, 0);
    37614080                    /* set dirty bit */
    3762                     phys_ram_dirty[addr1 >> TARGET_PAGE_BITS] |=
    3763                         (0xff & ~CODE_DIRTY_FLAG);
     4081                    cpu_physical_memory_set_dirty_flags(
     4082                        addr1, (0xff & ~CODE_DIRTY_FLAG));
    37644083                }
    37654084                addr1 += l;
     
    38654184}
    38664185
    3867 /* XXX: optimize */
     4186/* warning: addr must be aligned */
    38684187uint32_t lduw_phys(target_phys_addr_t addr)
    38694188{
    3870     uint16_t val;
    3871     cpu_physical_memory_read(addr, (uint8_t *)&val, 2);
    3872     return tswap16(val);
     4189    int io_index;
     4190    uint8_t *ptr;
     4191    uint64_t val;
     4192    unsigned long pd;
     4193    PhysPageDesc *p;
     4194
     4195    p = phys_page_find(addr >> TARGET_PAGE_BITS);
     4196    if (!p) {
     4197        pd = IO_MEM_UNASSIGNED;
     4198    } else {
     4199        pd = p->phys_offset;
     4200    }
     4201
     4202    if ((pd & ~TARGET_PAGE_MASK) > IO_MEM_ROM &&
     4203        !(pd & IO_MEM_ROMD)) {
     4204        /* I/O case */
     4205        io_index = (pd >> IO_MEM_SHIFT) & (IO_MEM_NB_ENTRIES - 1);
     4206        if (p)
     4207            addr = (addr & ~TARGET_PAGE_MASK) + p->region_offset;
     4208        val = io_mem_read[io_index][1](io_mem_opaque[io_index], addr);
     4209    } else {
     4210        /* RAM case */
     4211#ifndef VBOX
     4212        ptr = qemu_get_ram_ptr(pd & TARGET_PAGE_MASK) +
     4213            (addr & ~TARGET_PAGE_MASK);
     4214        val = lduw_p(ptr);
     4215#else
     4216        val = remR3PhysReadU16((pd & TARGET_PAGE_MASK) | (addr & ~TARGET_PAGE_MASK));
     4217#endif
     4218    }
     4219    return val;
    38734220}
    38744221
     
    39104257                tb_invalidate_phys_page_range(addr1, addr1 + 4, 0);
    39114258                /* set dirty bit */
    3912                 phys_ram_dirty[addr1 >> TARGET_PAGE_BITS] |=
    3913                     (0xff & ~CODE_DIRTY_FLAG);
     4259                cpu_physical_memory_set_dirty_flags(
     4260                    addr1, (0xff & ~CODE_DIRTY_FLAG));
    39144261            }
    39154262        }
     
    39884335            tb_invalidate_phys_page_range(addr1, addr1 + 4, 0);
    39894336            /* set dirty bit */
    3990 #ifdef VBOX
    3991             if (RT_LIKELY((addr1 >> TARGET_PAGE_BITS) < phys_ram_dirty_size))
    3992 #endif
    3993             phys_ram_dirty[addr1 >> TARGET_PAGE_BITS] |=
    3994                 (0xff & ~CODE_DIRTY_FLAG);
     4337            cpu_physical_memory_set_dirty_flags(addr1,
     4338                (0xff & ~CODE_DIRTY_FLAG));
    39954339        }
    39964340    }
     
    40044348}
    40054349
    4006 /* XXX: optimize */
     4350/* warning: addr must be aligned */
    40074351void stw_phys(target_phys_addr_t addr, uint32_t val)
    40084352{
    4009     uint16_t v = tswap16(val);
    4010     cpu_physical_memory_write(addr, (const uint8_t *)&v, 2);
     4353    int io_index;
     4354    uint8_t *ptr;
     4355    unsigned long pd;
     4356    PhysPageDesc *p;
     4357
     4358    p = phys_page_find(addr >> TARGET_PAGE_BITS);
     4359    if (!p) {
     4360        pd = IO_MEM_UNASSIGNED;
     4361    } else {
     4362        pd = p->phys_offset;
     4363    }
     4364
     4365    if ((pd & ~TARGET_PAGE_MASK) != IO_MEM_RAM) {
     4366        io_index = (pd >> IO_MEM_SHIFT) & (IO_MEM_NB_ENTRIES - 1);
     4367        if (p)
     4368            addr = (addr & ~TARGET_PAGE_MASK) + p->region_offset;
     4369        io_mem_write[io_index][1](io_mem_opaque[io_index], addr, val);
     4370    } else {
     4371        unsigned long addr1;
     4372        addr1 = (pd & TARGET_PAGE_MASK) + (addr & ~TARGET_PAGE_MASK);
     4373        /* RAM case */
     4374#ifndef VBOX
     4375        ptr = qemu_get_ram_ptr(addr1);
     4376        stw_p(ptr, val);
     4377#else
     4378        remR3PhysWriteU16(addr1, val); NOREF(ptr);
     4379#endif
     4380        if (!cpu_physical_memory_is_dirty(addr1)) {
     4381            /* invalidate code */
     4382            tb_invalidate_phys_page_range(addr1, addr1 + 2, 0);
     4383            /* set dirty bit */
     4384            cpu_physical_memory_set_dirty_flags(addr1,
     4385                (0xff & ~CODE_DIRTY_FLAG));
     4386        }
     4387    }
    40114388}
    40124389
     
    40174394    cpu_physical_memory_write(addr, (const uint8_t *)&val, 8);
    40184395}
    4019 
    4020 #endif
    40214396
    40224397#ifndef VBOX
     
    40394414            l = len;
    40404415        phys_addr += (addr & ~TARGET_PAGE_MASK);
    4041 #if !defined(CONFIG_USER_ONLY)
    40424416        if (is_write)
    40434417            cpu_physical_memory_write_rom(phys_addr, buf, l);
    40444418        else
    4045 #endif
    40464419            cpu_physical_memory_rw(phys_addr, buf, l, is_write);
    40474420        len -= l;
     
    40524425}
    40534426#endif /* !VBOX */
     4427#endif
    40544428
    40554429/* in deterministic execution mode, instructions doing device I/Os
     
    41114485    cpu_resume_from_signal(env, NULL);
    41124486}
     4487
     4488#if !defined(CONFIG_USER_ONLY)
    41134489
    41144490#ifndef VBOX
     
    41674543#endif /* !VBOX */
    41684544
    4169 #if !defined(CONFIG_USER_ONLY)
    4170 
    41714545#define MMUSUFFIX _cmmu
    41724546#define GETPC() NULL
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette