X-Git-Url: http://vcs.maemo.org/git/?a=blobdiff_plain;f=exec-all.h;h=8167d1a271a075769c7db56a62aeadc6cea94e56;hb=7587cf44019d593bb12703e7046bd7738996c55c;hp=9c7e5ed83f390f2fcf36e887218c7ce9c6eefc0c;hpb=35b66fc4f9dd2c4c3fb8e26c5c1480965b81bbd4;p=qemu diff --git a/exec-all.h b/exec-all.h index 9c7e5ed..8167d1a 100644 --- a/exec-all.h +++ b/exec-all.h @@ -79,14 +79,23 @@ void dump_ops(const uint16_t *opc_buf, const uint32_t *opparam_buf); int cpu_gen_code(CPUState *env, struct TranslationBlock *tb, int max_code_size, int *gen_code_size_ptr); int cpu_restore_state(struct TranslationBlock *tb, - CPUState *env, unsigned long searched_pc); + CPUState *env, unsigned long searched_pc, + void *puc); +int cpu_gen_code_copy(CPUState *env, struct TranslationBlock *tb, + int max_code_size, int *gen_code_size_ptr); +int cpu_restore_state_copy(struct TranslationBlock *tb, + CPUState *env, unsigned long searched_pc, + void *puc); +void cpu_resume_from_signal(CPUState *env1, void *puc); void cpu_exec_init(void); -int page_unprotect(unsigned long address); +int page_unprotect(unsigned long address, unsigned long pc, void *puc); +void tb_invalidate_phys_page_range(target_ulong start, target_ulong end, + int is_cpu_write_access); void tb_invalidate_page_range(target_ulong start, target_ulong end); -void tlb_flush_page(CPUState *env, uint32_t addr); -void tlb_flush_page_write(CPUState *env, uint32_t addr); -void tlb_flush(CPUState *env); -int tlb_set_page(CPUState *env, uint32_t vaddr, uint32_t paddr, int prot, +void tlb_flush_page(CPUState *env, target_ulong addr); +void tlb_flush(CPUState *env, int flush_global); +int tlb_set_page(CPUState *env, target_ulong vaddr, + target_phys_addr_t paddr, int prot, int is_user, int is_softmmu); #define CODE_GEN_MAX_SIZE 65536 @@ -135,16 +144,22 @@ int tlb_set_page(CPUState *env, uint32_t vaddr, uint32_t paddr, int prot, #if defined(__powerpc__) #define USE_DIRECT_JUMP #endif -#if defined(__i386__) +#if defined(__i386__) && !defined(_WIN32) #define USE_DIRECT_JUMP #endif typedef struct TranslationBlock { - unsigned long pc; /* simulated PC corresponding to this block (EIP + CS base) */ - unsigned long cs_base; /* CS base for this block */ + target_ulong pc; /* simulated PC corresponding to this block (EIP + CS base) */ + target_ulong cs_base; /* CS base for this block */ unsigned int flags; /* flags defining in which context the code was generated */ uint16_t size; /* size of target code for this block (1 <= size <= TARGET_PAGE_SIZE) */ + uint16_t cflags; /* compile flags */ +#define CF_CODE_COPY 0x0001 /* block was generated in code copy mode */ +#define CF_TB_FP_USED 0x0002 /* fp ops are used in the TB */ +#define CF_FP_USED 0x0004 /* fp ops are used in the TB or in a chained TB */ +#define CF_SINGLE_INSN 0x0008 /* compile only a single instruction */ + uint8_t *tc_ptr; /* pointer to the translated code */ struct TranslationBlock *hash_next; /* next matching tb for virtual address */ /* next matching tb for physical address. */ @@ -195,8 +210,8 @@ extern uint8_t *code_gen_ptr; /* find a translation block in the translation cache. If not found, return NULL and the pointer to the last element of the list in pptb */ static inline TranslationBlock *tb_find(TranslationBlock ***pptb, - unsigned long pc, - unsigned long cs_base, + target_ulong pc, + target_ulong cs_base, unsigned int flags) { TranslationBlock **ptb, *tb; @@ -311,13 +326,19 @@ do {\ #elif defined(__i386__) && defined(USE_DIRECT_JUMP) +#ifdef _WIN32 +#define ASM_PREVIOUS_SECTION ".section .text\n" +#else +#define ASM_PREVIOUS_SECTION ".previous\n" +#endif + /* we patch the jump instruction directly */ #define JUMP_TB(opname, tbparam, n, eip)\ do {\ - asm volatile (".section \".data\"\n"\ + asm volatile (".section .data\n"\ "__op_label" #n "." stringify(opname) ":\n"\ ".long 1f\n"\ - ".previous\n"\ + ASM_PREVIOUS_SECTION \ "jmp __op_jmp" #n "\n"\ "1:\n");\ T0 = (long)(tbparam) + (n);\ @@ -356,6 +377,7 @@ do {\ extern CPUWriteMemoryFunc *io_mem_write[IO_MEM_NB_ENTRIES][4]; extern CPUReadMemoryFunc *io_mem_read[IO_MEM_NB_ENTRIES][4]; +extern void *io_mem_opaque[IO_MEM_NB_ENTRIES]; #ifdef __powerpc__ static inline int testandset (int *p) @@ -389,6 +411,20 @@ static inline int testandset (int *p) } #endif +#ifdef __x86_64__ +static inline int testandset (int *p) +{ + char ret; + int readval; + + __asm__ __volatile__ ("lock; cmpxchgl %3, %1; sete %0" + : "=q" (ret), "=m" (*p), "=a" (readval) + : "r" (1), "m" (*p), "a" (0) + : "memory"); + return ret; +} +#endif + #ifdef __s390__ static inline int testandset (int *p) { @@ -530,6 +566,8 @@ static inline target_ulong get_phys_addr_code(CPUState *env, target_ulong addr) } #else /* NOTE: this function can trigger an exception */ +/* NOTE2: the returned address is not exactly the physical address: it + is the offset relative to phys_ram_base */ /* XXX: i386 target specific */ static inline target_ulong get_phys_addr_code(CPUState *env, target_ulong addr) { @@ -545,9 +583,14 @@ static inline target_ulong get_phys_addr_code(CPUState *env, target_ulong addr) #endif if (__builtin_expect(env->tlb_read[is_user][index].address != (addr & TARGET_PAGE_MASK), 0)) { +#if defined (TARGET_PPC) + env->access_type = ACCESS_CODE; + ldub_code((void *)addr); + env->access_type = ACCESS_INT; +#else ldub_code((void *)addr); +#endif } return addr + env->tlb_read[is_user][index].addend - (unsigned long)phys_ram_base; } #endif -