Skip to content

Commit 4f3965a

Browse files
committed
main: Retry trampoline allocation if failed
Signed-off-by: Akira Moroo <[email protected]>
1 parent e6c02cb commit 4f3965a

File tree

1 file changed

+11
-4
lines changed

1 file changed

+11
-4
lines changed

main.c

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -506,13 +506,20 @@ static void setup_trampoline(void) {
506506
assert(entry->trampoline == NULL);
507507

508508
/* allocate memory at the aligned reachable address */
509-
entry->trampoline =
510-
mmap((void *)range_min, mem_size, PROT_READ | PROT_WRITE | PROT_EXEC,
511-
MAP_ANONYMOUS | MAP_PRIVATE | MAP_FIXED, -1, 0);
512-
if (entry->trampoline == MAP_FAILED) {
509+
void *trampoline = MAP_FAILED;
510+
for (uintptr_t addr = range_min; addr < range_max; addr += PAGE_SIZE) {
511+
trampoline = mmap((void *)addr, mem_size, PROT_READ | PROT_WRITE,
512+
MAP_ANONYMOUS | MAP_PRIVATE | MAP_FIXED, -1, 0);
513+
if (trampoline != MAP_FAILED) {
514+
break;
515+
}
516+
}
517+
518+
if (trampoline == MAP_FAILED) {
513519
fprintf(stderr, "map failed\n");
514520
exit(1);
515521
}
522+
entry->trampoline = trampoline;
516523

517524
/*
518525
* The trampoline code uses the following temporary registers:

0 commit comments

Comments
 (0)