blob: e74883a6def075f6f0a71beb2a8b305bd5414b90 [file] [log] [blame]
// Copyright 2016 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package runtime
import (
"syscall/zx"
"unsafe"
)
//go:nosplit
func sysAlloc(n uintptr, sysStat *uint64) unsafe.Pointer {
var p unsafe.Pointer
sysMmap(unsafe.Pointer(&p), n, zx.VMFlagPermRead|zx.VMFlagPermWrite)
if uintptr(p) < 4096 {
println("runtime: sysMmap failed n=", n)
exit(2)
}
mSysStatInc(sysStat, n)
return p
}
func sysUnused(v unsafe.Pointer, n uintptr) {
// TODO(dho): Implement this based on ZX_VMO_OP_DECOMMIT
}
func sysUsed(v unsafe.Pointer, n uintptr) {
// TODO(dho): Maybe implement this based on ZX_VMO_OP_COMMIT
}
//go:nosplit
func sysFree(v unsafe.Pointer, n uintptr, sysStat *uint64) {
mSysStatDec(sysStat, n)
if status := zx.Sys_vmar_unmap(zx.Handle(zx.VMARRoot), zx.Vaddr(v), uint64(n)); status != zx.ErrOk {
println("runtime: zx.Sys_vmar_unmap failed: ", status.String())
}
}
func sysMmap(ptr unsafe.Pointer, sz uintptr, flags zx.VMFlag) {
var h zx.Handle
if status := zx.Sys_vmo_create(uint64(sz), 0, &h); status != zx.ErrOk {
println("runtime: zx.Sys_vmo_create failed: ", status.String())
exit(2)
}
prop := []byte("go-sys-mmap")
if status := zx.Sys_object_set_property(h, zx.PropName, unsafe.Pointer(&prop[0]), uint(len(prop))); status != zx.ErrOk {
println("runtime: zx.Sys_object_set_property failed: ", status.String())
exit(2)
}
if status := zx.Sys_vmar_map(zx.Handle(zx.VMARRoot), 0, h, 0, uint64(sz), uint32(flags), (*zx.Vaddr)(ptr)); status != zx.ErrOk {
println("runtime: zx.Sys_vmar_map failed: ", status.String())
exit(2)
}
if status := zx.Sys_handle_close(h); status != zx.ErrOk {
println("runtime: zx.Sys_handle_close failed: ", status.String())
exit(2)
}
}
func sysReserve(v unsafe.Pointer, n uintptr) unsafe.Pointer {
p := v
sysMmap(unsafe.Pointer(&p), n, 0)
return p
}
func sysFault(v unsafe.Pointer, n uintptr) {
println("TODO sysFault")
}
func sysMap(v unsafe.Pointer, n uintptr, sysStat *uint64) {
mSysStatInc(sysStat, n)
if status := zx.Sys_vmar_protect(zx.Handle(zx.VMARRoot), zx.Vaddr(v), uint64(n), uint32(zx.VMFlagPermRead|zx.VMFlagPermWrite)); status != zx.ErrOk {
println("runtime: zx.Sys_vmar_protect failed: ", status.String())
exit(2)
}
}