Commit 06e67a82da7b0d2bb2bdada0ec7122032a330312
1 parent
a876e289
Allocate code gen buffer properly on FreeBSD
Signed-off-by: Juergen Lock <nox@jelal.kn-bremen.de> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com> git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@5331 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
22 additions
and
0 deletions
exec.c
@@ -443,6 +443,28 @@ static void code_gen_alloc(unsigned long tb_size) | @@ -443,6 +443,28 @@ static void code_gen_alloc(unsigned long tb_size) | ||
443 | exit(1); | 443 | exit(1); |
444 | } | 444 | } |
445 | } | 445 | } |
446 | +#elif defined(__FreeBSD__) | ||
447 | + { | ||
448 | + int flags; | ||
449 | + void *addr = NULL; | ||
450 | + flags = MAP_PRIVATE | MAP_ANONYMOUS; | ||
451 | +#if defined(__x86_64__) | ||
452 | + /* FreeBSD doesn't have MAP_32BIT, use MAP_FIXED and assume | ||
453 | + * 0x40000000 is free */ | ||
454 | + flags |= MAP_FIXED; | ||
455 | + addr = (void *)0x40000000; | ||
456 | + /* Cannot map more than that */ | ||
457 | + if (code_gen_buffer_size > (800 * 1024 * 1024)) | ||
458 | + code_gen_buffer_size = (800 * 1024 * 1024); | ||
459 | +#endif | ||
460 | + code_gen_buffer = mmap(addr, code_gen_buffer_size, | ||
461 | + PROT_WRITE | PROT_READ | PROT_EXEC, | ||
462 | + flags, -1, 0); | ||
463 | + if (code_gen_buffer == MAP_FAILED) { | ||
464 | + fprintf(stderr, "Could not allocate dynamic translator buffer\n"); | ||
465 | + exit(1); | ||
466 | + } | ||
467 | + } | ||
446 | #else | 468 | #else |
447 | code_gen_buffer = qemu_malloc(code_gen_buffer_size); | 469 | code_gen_buffer = qemu_malloc(code_gen_buffer_size); |
448 | if (!code_gen_buffer) { | 470 | if (!code_gen_buffer) { |