Revision 141ac468 exec.c

b/exec.c
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
#if defined(__arm__)
93
/* The prologue must be reachable with a direct jump. ARM has a
94
 limited branch range (possibly also PPC and SPARC?) so place it in a
92
#if defined(__arm__) || defined(__sparc_v9__)
93
/* The prologue must be reachable with a direct jump. ARM and Sparc64
94
 have limited branch ranges (possibly also PPC) so place it in a
95 95
 section close to code segment. */
96 96
#define code_gen_section                                \
97 97
    __attribute__((__section__(".gen_code")))           \
......
410 410
#if defined(__linux__) 
411 411
    {
412 412
        int flags;
413
        void *start = NULL;
414

  
413 415
        flags = MAP_PRIVATE | MAP_ANONYMOUS;
414 416
#if defined(__x86_64__)
415 417
        flags |= MAP_32BIT;
416 418
        /* Cannot map more than that */
417 419
        if (code_gen_buffer_size > (800 * 1024 * 1024))
418 420
            code_gen_buffer_size = (800 * 1024 * 1024);
419
#endif
420
        code_gen_buffer = mmap(NULL, code_gen_buffer_size,
421
                               PROT_WRITE | PROT_READ | PROT_EXEC, 
421
#elif defined(__sparc_v9__)
422
        // Map the buffer below 2G, so we can use direct calls and branches
423
        flags |= MAP_FIXED;
424
        start = (void *) 0x60000000UL;
425
        if (code_gen_buffer_size > (512 * 1024 * 1024))
426
            code_gen_buffer_size = (512 * 1024 * 1024);
427
#endif
428
        code_gen_buffer = mmap(start, code_gen_buffer_size,
429
                               PROT_WRITE | PROT_READ | PROT_EXEC,
422 430
                               flags, -1, 0);
423 431
        if (code_gen_buffer == MAP_FAILED) {
424 432
            fprintf(stderr, "Could not allocate dynamic translator buffer\n");

Also available in: Unified diff