Commit 7cb69cae2053e0fbba5b9ac50bd31bd1a4f8f8cb
1 parent
b03cce8e
initial global prologue/epilogue implementation
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4407 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
2 changed files
with
31 additions
and
78 deletions
cpu-exec.c
| ... | ... | @@ -18,8 +18,10 @@ |
| 18 | 18 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
| 19 | 19 | */ |
| 20 | 20 | #include "config.h" |
| 21 | +#define CPU_NO_GLOBAL_REGS | |
| 21 | 22 | #include "exec.h" |
| 22 | 23 | #include "disas.h" |
| 24 | +#include "tcg.h" | |
| 23 | 25 | |
| 24 | 26 | #if !defined(CONFIG_SOFTMMU) |
| 25 | 27 | #undef EAX |
| ... | ... | @@ -292,7 +294,6 @@ int cpu_exec(CPUState *env1) |
| 292 | 294 | #endif |
| 293 | 295 | #endif |
| 294 | 296 | int ret, interrupt_request; |
| 295 | - unsigned long (*gen_func)(void); | |
| 296 | 297 | TranslationBlock *tb; |
| 297 | 298 | uint8_t *tc_ptr; |
| 298 | 299 | |
| ... | ... | @@ -652,67 +653,7 @@ int cpu_exec(CPUState *env1) |
| 652 | 653 | tc_ptr = tb->tc_ptr; |
| 653 | 654 | env->current_tb = tb; |
| 654 | 655 | /* execute the generated code */ |
| 655 | - gen_func = (void *)tc_ptr; | |
| 656 | -#if defined(__sparc__) | |
| 657 | - __asm__ __volatile__("call %0\n\t" | |
| 658 | - "mov %%o7,%%i0" | |
| 659 | - : /* no outputs */ | |
| 660 | - : "r" (gen_func) | |
| 661 | - : "i0", "i1", "i2", "i3", "i4", "i5", | |
| 662 | - "o0", "o1", "o2", "o3", "o4", "o5", | |
| 663 | - "l0", "l1", "l2", "l3", "l4", "l5", | |
| 664 | - "l6", "l7"); | |
| 665 | -#elif defined(__hppa__) | |
| 666 | - asm volatile ("ble 0(%%sr4,%1)\n" | |
| 667 | - "copy %%r31,%%r18\n" | |
| 668 | - "copy %%r28,%0\n" | |
| 669 | - : "=r" (next_tb) | |
| 670 | - : "r" (gen_func) | |
| 671 | - : "r1", "r2", "r3", "r4", "r5", "r6", "r7", | |
| 672 | - "r8", "r9", "r10", "r11", "r12", "r13", | |
| 673 | - "r18", "r19", "r20", "r21", "r22", "r23", | |
| 674 | - "r24", "r25", "r26", "r27", "r28", "r29", | |
| 675 | - "r30", "r31"); | |
| 676 | -#elif defined(__arm__) | |
| 677 | - asm volatile ("mov pc, %0\n\t" | |
| 678 | - ".global exec_loop\n\t" | |
| 679 | - "exec_loop:\n\t" | |
| 680 | - : /* no outputs */ | |
| 681 | - : "r" (gen_func) | |
| 682 | - : "r1", "r2", "r3", "r8", "r9", "r10", "r12", "r14"); | |
| 683 | -#elif defined(__ia64) | |
| 684 | - struct fptr { | |
| 685 | - void *ip; | |
| 686 | - void *gp; | |
| 687 | - } fp; | |
| 688 | - | |
| 689 | - fp.ip = tc_ptr; | |
| 690 | - fp.gp = code_gen_buffer + 2 * (1 << 20); | |
| 691 | - (*(void (*)(void)) &fp)(); | |
| 692 | -#elif defined(__i386) | |
| 693 | - asm volatile ("sub $12, %%esp\n\t" | |
| 694 | - "push %%ebp\n\t" | |
| 695 | - "call *%1\n\t" | |
| 696 | - "pop %%ebp\n\t" | |
| 697 | - "add $12, %%esp\n\t" | |
| 698 | - : "=a" (next_tb) | |
| 699 | - : "a" (gen_func) | |
| 700 | - : "ebx", "ecx", "edx", "esi", "edi", "cc", | |
| 701 | - "memory"); | |
| 702 | -#elif defined(__x86_64__) | |
| 703 | - asm volatile ("sub $8, %%rsp\n\t" | |
| 704 | - "push %%rbp\n\t" | |
| 705 | - "call *%1\n\t" | |
| 706 | - "pop %%rbp\n\t" | |
| 707 | - "add $8, %%rsp\n\t" | |
| 708 | - : "=a" (next_tb) | |
| 709 | - : "a" (gen_func) | |
| 710 | - : "rbx", "rcx", "rdx", "rsi", "rdi", "r8", "r9", | |
| 711 | - "r10", "r11", "r12", "r13", "r14", "r15", "cc", | |
| 712 | - "memory"); | |
| 713 | -#else | |
| 714 | - next_tb = gen_func(); | |
| 715 | -#endif | |
| 656 | + next_tb = tcg_qemu_tb_exec(tc_ptr); | |
| 716 | 657 | env->current_tb = NULL; |
| 717 | 658 | /* reset soft MMU for next block (it can currently |
| 718 | 659 | only be set by a memory fault) */ | ... | ... |
exec.c
| ... | ... | @@ -89,6 +89,7 @@ int nb_tbs; |
| 89 | 89 | /* any access to the tbs or the page table must use this lock */ |
| 90 | 90 | spinlock_t tb_lock = SPIN_LOCK_UNLOCKED; |
| 91 | 91 | |
| 92 | +uint8_t code_gen_prologue[1024] __attribute__((aligned (32))); | |
| 92 | 93 | uint8_t code_gen_buffer[CODE_GEN_BUFFER_SIZE] __attribute__((aligned (32))); |
| 93 | 94 | uint8_t *code_gen_ptr; |
| 94 | 95 | |
| ... | ... | @@ -173,6 +174,31 @@ typedef struct subpage_t { |
| 173 | 174 | void *opaque[TARGET_PAGE_SIZE][2][4]; |
| 174 | 175 | } subpage_t; |
| 175 | 176 | |
| 177 | +#ifdef _WIN32 | |
| 178 | +static void map_exec(void *addr, long size) | |
| 179 | +{ | |
| 180 | + DWORD old_protect; | |
| 181 | + VirtualProtect(addr, size, | |
| 182 | + PAGE_EXECUTE_READWRITE, &old_protect); | |
| 183 | + | |
| 184 | +} | |
| 185 | +#else | |
| 186 | +static void map_exec(void *addr, long size) | |
| 187 | +{ | |
| 188 | + unsigned long start, end; | |
| 189 | + | |
| 190 | + start = (unsigned long)addr; | |
| 191 | + start &= ~(qemu_real_host_page_size - 1); | |
| 192 | + | |
| 193 | + end = (unsigned long)addr + size; | |
| 194 | + end += qemu_real_host_page_size - 1; | |
| 195 | + end &= ~(qemu_real_host_page_size - 1); | |
| 196 | + | |
| 197 | + mprotect((void *)start, end - start, | |
| 198 | + PROT_READ | PROT_WRITE | PROT_EXEC); | |
| 199 | +} | |
| 200 | +#endif | |
| 201 | + | |
| 176 | 202 | static void page_init(void) |
| 177 | 203 | { |
| 178 | 204 | /* NOTE: we can always suppose that qemu_host_page_size >= |
| ... | ... | @@ -184,26 +210,12 @@ static void page_init(void) |
| 184 | 210 | |
| 185 | 211 | GetSystemInfo(&system_info); |
| 186 | 212 | qemu_real_host_page_size = system_info.dwPageSize; |
| 187 | - | |
| 188 | - VirtualProtect(code_gen_buffer, sizeof(code_gen_buffer), | |
| 189 | - PAGE_EXECUTE_READWRITE, &old_protect); | |
| 190 | 213 | } |
| 191 | 214 | #else |
| 192 | 215 | qemu_real_host_page_size = getpagesize(); |
| 193 | - { | |
| 194 | - unsigned long start, end; | |
| 195 | - | |
| 196 | - start = (unsigned long)code_gen_buffer; | |
| 197 | - start &= ~(qemu_real_host_page_size - 1); | |
| 198 | - | |
| 199 | - end = (unsigned long)code_gen_buffer + sizeof(code_gen_buffer); | |
| 200 | - end += qemu_real_host_page_size - 1; | |
| 201 | - end &= ~(qemu_real_host_page_size - 1); | |
| 202 | - | |
| 203 | - mprotect((void *)start, end - start, | |
| 204 | - PROT_READ | PROT_WRITE | PROT_EXEC); | |
| 205 | - } | |
| 206 | 216 | #endif |
| 217 | + map_exec(code_gen_buffer, sizeof(code_gen_buffer)); | |
| 218 | + map_exec(code_gen_prologue, sizeof(code_gen_prologue)); | |
| 207 | 219 | |
| 208 | 220 | if (qemu_host_page_size == 0) |
| 209 | 221 | qemu_host_page_size = qemu_real_host_page_size; | ... | ... |