| // 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), flags, 0, h, 0, uint64(sz), (*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.VMFlagPermRead|zx.VMFlagPermWrite, zx.Vaddr(v), uint64(n)); status != zx.ErrOk { |
| println("runtime: zx.Sys_vmar_protect failed: ", status.String()) |
| exit(2) |
| } |
| } |