summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libhurd-mm/as.c15
1 files changed, 12 insertions, 3 deletions
diff --git a/libhurd-mm/as.c b/libhurd-mm/as.c
index b899e46..a966814 100644
--- a/libhurd-mm/as.c
+++ b/libhurd-mm/as.c
@@ -213,9 +213,18 @@ as_alloc (int width, uint64_t count, bool data_mappable)
vg_addr_t addr = VG_ADDR_VOID;
struct free_space *free_space;
- for (free_space = hurd_btree_free_space_first (&free_spaces);
- free_space;
- free_space = hurd_btree_free_space_next (free_space))
+#if __WORDSIZE == 64
+ /* Prefer virtual addresses above 1 Gb. */
+ struct region region;
+ region.start = 1024 * 1024 * 1024;
+ region.end = DATA_ADDR_MAX;
+
+ free_space = hurd_btree_free_space_find_first (&free_spaces, &region);
+#else
+ free_space = hurd_btree_free_space_first (&free_spaces);
+#endif
+
+ for (; free_space; free_space = hurd_btree_free_space_next (free_space))
{
uint64_t start;
start = (free_space->region.start + align - 1) & ~(align - 1);