From: Fan WenJie fanwj@mail.ustc.edu.cn
Signed-off-by: Fan WenJie fanwj@mail.ustc.edu.cn --- server/mapping.c | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-)
diff --git a/server/mapping.c b/server/mapping.c index a795dc4b38b..9d402ade5b0 100644 --- a/server/mapping.c +++ b/server/mapping.c @@ -229,9 +229,24 @@ static struct addr_range ranges64;
void init_memory(void) { - page_mask = sysconf( _SC_PAGESIZE ) - 1; + size_t page_size = sysconf( _SC_PAGESIZE ); +#ifdef __LP64__ + size_t limit = 1LLU << 48U; + while(limit > 0x100000000LLU) + { + void* addr = (void*)(limit - page_size); + void* ret = mmap(addr, page_size, PROT_NONE, MAP_PRIVATE | MAP_ANON, -1, 0); + size_t next = limit >> 1U; + if (ret == (void*)-1) ret = NULL; + if (ret) munmap(ret, page_size); + if (ret >= (void*)next) break; + limit = next; + } + free_map_addr( limit - (limit >> 4U), limit >> 4U ); +#endif + page_mask = page_size - 1; free_map_addr( 0x60000000, 0x1c000000 ); - free_map_addr( 0x600000000000, 0x100000000000 ); + }
static void ranges_dump( struct object *obj, int verbose )