diff --git a/core/mem/virtual/virtual.odin b/core/mem/virtual/virtual.odin index 9d1c45d25..a97e00731 100644 --- a/core/mem/virtual/virtual.odin +++ b/core/mem/virtual/virtual.odin @@ -16,8 +16,8 @@ platform_memory_init :: proc "contextless" () { Allocator_Error :: mem.Allocator_Error @(require_results, no_sanitize_address) -reserve :: proc "contextless" (size: uint) -> (data: []byte, err: Allocator_Error) { - return _reserve(size) +reserve :: proc "contextless" (size: uint, address_hint := uintptr(0)) -> (data: []byte, err: Allocator_Error) { + return _reserve(size, address_hint) } @(no_sanitize_address) diff --git a/core/mem/virtual/virtual_darwin.odin b/core/mem/virtual/virtual_darwin.odin index 0635c83d4..ac952494a 100644 --- a/core/mem/virtual/virtual_darwin.odin +++ b/core/mem/virtual/virtual_darwin.odin @@ -2,8 +2,8 @@ package mem_virtual import "core:sys/posix" -_reserve :: proc "contextless" (size: uint) -> (data: []byte, err: Allocator_Error) { - result := posix.mmap(nil, size, {}, {.ANONYMOUS, .PRIVATE}) +_reserve :: proc "contextless" (size: uint, address_hint := uintptr(0)) -> (data: []byte, err: Allocator_Error) { + result := posix.mmap(rawptr(address_hint), size, {}, {.ANONYMOUS, .PRIVATE}) if result == posix.MAP_FAILED { assert_contextless(posix.errno() == .ENOMEM) return nil, .Out_Of_Memory diff --git a/core/mem/virtual/virtual_freebsd.odin b/core/mem/virtual/virtual_freebsd.odin index af0f31733..00b5b6e6a 100644 --- a/core/mem/virtual/virtual_freebsd.odin +++ b/core/mem/virtual/virtual_freebsd.odin @@ -2,14 +2,14 @@ package mem_virtual import "core:sys/posix" -_reserve :: proc "contextless" (size: uint) -> (data: []byte, err: Allocator_Error) { +_reserve :: proc "contextless" (size: uint, address_hint := uintptr(0)) -> (data: []byte, err: Allocator_Error) { PROT_MAX :: proc "contextless" (flags: posix.Prot_Flags) -> posix.Prot_Flags { _PROT_MAX_SHIFT :: 16 return transmute(posix.Prot_Flags)(transmute(i32)flags << _PROT_MAX_SHIFT) } - result := posix.mmap(nil, size, PROT_MAX({.READ, .WRITE, .EXEC}), {.ANONYMOUS, .PRIVATE}) + result := posix.mmap(rawptr(address_hint), size, PROT_MAX({.READ, .WRITE, .EXEC}), {.ANONYMOUS, .PRIVATE}) if result == posix.MAP_FAILED { assert_contextless(posix.errno() == .ENOMEM) return nil, .Out_Of_Memory diff --git a/core/mem/virtual/virtual_linux.odin b/core/mem/virtual/virtual_linux.odin index 144a8dc59..380f2f8f7 100644 --- a/core/mem/virtual/virtual_linux.odin +++ b/core/mem/virtual/virtual_linux.odin @@ -4,8 +4,8 @@ package mem_virtual import "core:sys/linux" -_reserve :: proc "contextless" (size: uint) -> (data: []byte, err: Allocator_Error) { - addr, errno := linux.mmap(0, size, {}, {.PRIVATE, .ANONYMOUS}) +_reserve :: proc "contextless" (size: uint, address_hint := uintptr(0)) -> (data: []byte, err: Allocator_Error) { + addr, errno := linux.mmap(address_hint, size, {}, {.PRIVATE, .ANONYMOUS}) if errno == .ENOMEM { return nil, .Out_Of_Memory } else if errno == .EINVAL { @@ -68,4 +68,4 @@ _map_file :: proc "contextless" (fd: uintptr, size: i64, flags: Map_File_Flags) _unmap_file :: proc "contextless" (data: []byte) { _release(raw_data(data), uint(len(data))) -} \ No newline at end of file +} diff --git a/core/mem/virtual/virtual_netbsd.odin b/core/mem/virtual/virtual_netbsd.odin index 588625cc7..ef5de1b82 100644 --- a/core/mem/virtual/virtual_netbsd.odin +++ b/core/mem/virtual/virtual_netbsd.odin @@ -2,13 +2,13 @@ package mem_virtual import "core:sys/posix" -_reserve :: proc "contextless" (size: uint) -> (data: []byte, err: Allocator_Error) { +_reserve :: proc "contextless" (size: uint, address_hint := uintptr(0)) -> (data: []byte, err: Allocator_Error) { PROT_MPROTECT :: proc "contextless" (flags: posix.Prot_Flags) -> posix.Prot_Flags { return transmute(posix.Prot_Flags)(transmute(i32)flags << 3) } - result := posix.mmap(nil, size, PROT_MPROTECT({.READ, .WRITE, .EXEC}), {.ANONYMOUS, .PRIVATE}) + result := posix.mmap(rawptr(address_hint), size, PROT_MPROTECT({.READ, .WRITE, .EXEC}), {.ANONYMOUS, .PRIVATE}) if result == posix.MAP_FAILED { assert_contextless(posix.errno() == .ENOMEM) return nil, .Out_Of_Memory diff --git a/core/mem/virtual/virtual_openbsd.odin b/core/mem/virtual/virtual_openbsd.odin index 83f7ca9ca..3669c05da 100644 --- a/core/mem/virtual/virtual_openbsd.odin +++ b/core/mem/virtual/virtual_openbsd.odin @@ -2,8 +2,8 @@ package mem_virtual import "core:sys/posix" -_reserve :: proc "contextless" (size: uint) -> (data: []byte, err: Allocator_Error) { - result := posix.mmap(nil, size, {}, {.ANONYMOUS, .PRIVATE}) +_reserve :: proc "contextless" (size: uint, address_hint := uintptr(0)) -> (data: []byte, err: Allocator_Error) { + result := posix.mmap(rawptr(address_hint), size, {}, {.ANONYMOUS, .PRIVATE}) if result == posix.MAP_FAILED { assert_contextless(posix.errno() == .ENOMEM) return nil, .Out_Of_Memory diff --git a/core/mem/virtual/virtual_other.odin b/core/mem/virtual/virtual_other.odin index 8a2e1a61d..1f562cc8e 100644 --- a/core/mem/virtual/virtual_other.odin +++ b/core/mem/virtual/virtual_other.odin @@ -7,7 +7,7 @@ #+build !windows package mem_virtual -_reserve :: proc "contextless" (size: uint) -> (data: []byte, err: Allocator_Error) { +_reserve :: proc "contextless" (size: uint, address_hint := uintptr(0)) -> (data: []byte, err: Allocator_Error) { return nil, nil } @@ -35,4 +35,4 @@ _map_file :: proc "contextless" (f: any, size: i64, flags: Map_File_Flags) -> (d _unmap_file :: proc "contextless" (data: []byte) { -} \ No newline at end of file +} diff --git a/core/mem/virtual/virtual_windows.odin b/core/mem/virtual/virtual_windows.odin index 0866ebfa1..9c2565dd6 100644 --- a/core/mem/virtual/virtual_windows.odin +++ b/core/mem/virtual/virtual_windows.odin @@ -87,8 +87,8 @@ foreign Kernel32 { } @(no_sanitize_address) -_reserve :: proc "contextless" (size: uint) -> (data: []byte, err: Allocator_Error) { - result := VirtualAlloc(nil, size, MEM_RESERVE, PAGE_READWRITE) +_reserve :: proc "contextless" (size: uint, address_hint := uintptr(0)) -> (data: []byte, err: Allocator_Error) { + result := VirtualAlloc(rawptr(address_hint), size, MEM_RESERVE, PAGE_READWRITE) if result == nil { err = .Out_Of_Memory return @@ -191,4 +191,4 @@ _map_file :: proc "contextless" (fd: uintptr, size: i64, flags: Map_File_Flags) @(no_sanitize_address) _unmap_file :: proc "contextless" (data: []byte) { UnmapViewOfFile(raw_data(data)) -} \ No newline at end of file +}