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) { |