Revision c27004ec exec-all.h
b/exec-all.h | ||
---|---|---|
55 | 55 |
|
56 | 56 |
extern uint16_t gen_opc_buf[OPC_BUF_SIZE]; |
57 | 57 |
extern uint32_t gen_opparam_buf[OPPARAM_BUF_SIZE]; |
58 |
extern uint32_t gen_opc_pc[OPC_BUF_SIZE]; |
|
59 |
extern uint32_t gen_opc_npc[OPC_BUF_SIZE]; |
|
58 |
extern long gen_labels[OPC_BUF_SIZE]; |
|
59 |
extern int nb_gen_labels; |
|
60 |
extern target_ulong gen_opc_pc[OPC_BUF_SIZE]; |
|
61 |
extern target_ulong gen_opc_npc[OPC_BUF_SIZE]; |
|
60 | 62 |
extern uint8_t gen_opc_cc_op[OPC_BUF_SIZE]; |
61 | 63 |
extern uint8_t gen_opc_instr_start[OPC_BUF_SIZE]; |
62 | 64 |
|
... | ... | |
186 | 188 |
struct TranslationBlock *jmp_first; |
187 | 189 |
} TranslationBlock; |
188 | 190 |
|
189 |
static inline unsigned int tb_hash_func(unsigned long pc)
|
|
191 |
static inline unsigned int tb_hash_func(target_ulong pc)
|
|
190 | 192 |
{ |
191 | 193 |
return pc & (CODE_GEN_HASH_SIZE - 1); |
192 | 194 |
} |
... | ... | |
196 | 198 |
return pc & (CODE_GEN_PHYS_HASH_SIZE - 1); |
197 | 199 |
} |
198 | 200 |
|
199 |
TranslationBlock *tb_alloc(unsigned long pc);
|
|
201 |
TranslationBlock *tb_alloc(target_ulong pc);
|
|
200 | 202 |
void tb_flush(CPUState *env); |
201 | 203 |
void tb_link(TranslationBlock *tb); |
202 | 204 |
void tb_link_phys(TranslationBlock *tb, |
... | ... | |
329 | 331 |
"b " ASM_NAME(__op_jmp) #n "\n"\ |
330 | 332 |
"1:\n");\ |
331 | 333 |
T0 = (long)(tbparam) + (n);\ |
332 |
EIP = eip;\ |
|
334 |
EIP = (int32_t)eip;\
|
|
333 | 335 |
EXIT_TB();\ |
334 | 336 |
} while (0) |
335 | 337 |
|
... | ... | |
341 | 343 |
#elif defined(__i386__) && defined(USE_DIRECT_JUMP) |
342 | 344 |
|
343 | 345 |
/* we patch the jump instruction directly */ |
346 |
#define GOTO_TB(opname, n)\ |
|
347 |
do {\ |
|
348 |
asm volatile (".section .data\n"\ |
|
349 |
ASM_NAME(__op_label) #n "." ASM_NAME(opname) ":\n"\ |
|
350 |
".long 1f\n"\ |
|
351 |
ASM_PREVIOUS_SECTION \ |
|
352 |
"jmp " ASM_NAME(__op_jmp) #n "\n"\ |
|
353 |
"1:\n");\ |
|
354 |
} while (0) |
|
355 |
|
|
344 | 356 |
#define JUMP_TB(opname, tbparam, n, eip)\ |
345 | 357 |
do {\ |
346 | 358 |
asm volatile (".section .data\n"\ |
... | ... | |
350 | 362 |
"jmp " ASM_NAME(__op_jmp) #n "\n"\ |
351 | 363 |
"1:\n");\ |
352 | 364 |
T0 = (long)(tbparam) + (n);\ |
353 |
EIP = eip;\ |
|
365 |
EIP = (int32_t)eip;\
|
|
354 | 366 |
EXIT_TB();\ |
355 | 367 |
} while (0) |
356 | 368 |
|
... | ... | |
370 | 382 |
goto *(void *)(((TranslationBlock *)tbparam)->tb_next[n]);\ |
371 | 383 |
label ## n:\ |
372 | 384 |
T0 = (long)(tbparam) + (n);\ |
373 |
EIP = eip;\ |
|
385 |
EIP = (int32_t)eip;\
|
|
374 | 386 |
dummy_label ## n:\ |
375 | 387 |
EXIT_TB();\ |
376 | 388 |
} while (0) |
... | ... | |
544 | 556 |
|
545 | 557 |
#if !defined(CONFIG_USER_ONLY) |
546 | 558 |
|
547 |
void tlb_fill(unsigned long addr, int is_write, int is_user,
|
|
559 |
void tlb_fill(target_ulong addr, int is_write, int is_user,
|
|
548 | 560 |
void *retaddr); |
549 | 561 |
|
550 | 562 |
#define ACCESS_TYPE 3 |
... | ... | |
560 | 572 |
#define DATA_SIZE 4 |
561 | 573 |
#include "softmmu_header.h" |
562 | 574 |
|
575 |
#define DATA_SIZE 8 |
|
576 |
#include "softmmu_header.h" |
|
577 |
|
|
563 | 578 |
#undef ACCESS_TYPE |
564 | 579 |
#undef MEMSUFFIX |
565 | 580 |
#undef env |
... | ... | |
578 | 593 |
/* XXX: i386 target specific */ |
579 | 594 |
static inline target_ulong get_phys_addr_code(CPUState *env, target_ulong addr) |
580 | 595 |
{ |
581 |
int is_user, index; |
|
596 |
int is_user, index, pd;
|
|
582 | 597 |
|
583 | 598 |
index = (addr >> TARGET_PAGE_BITS) & (CPU_TLB_SIZE - 1); |
584 | 599 |
#if defined(TARGET_I386) |
... | ... | |
592 | 607 |
#endif |
593 | 608 |
if (__builtin_expect(env->tlb_read[is_user][index].address != |
594 | 609 |
(addr & TARGET_PAGE_MASK), 0)) { |
595 |
ldub_code((void *)addr); |
|
610 |
ldub_code(addr); |
|
611 |
} |
|
612 |
pd = env->tlb_read[is_user][index].address & ~TARGET_PAGE_MASK; |
|
613 |
if (pd > IO_MEM_ROM) { |
|
614 |
cpu_abort(env, "Trying to execute code outside RAM or ROM at 0x%08lx\n", addr); |
|
596 | 615 |
} |
597 | 616 |
return addr + env->tlb_read[is_user][index].addend - (unsigned long)phys_ram_base; |
598 | 617 |
} |
Also available in: Unified diff