From 9364c13d09fb0df5a2f8cb4c86af9d37af857f20 Mon Sep 17 00:00:00 2001 From: Tobias Klauser Date: Thu, 29 Mar 2018 07:38:14 +0000 Subject: [PATCH] runtime: parse auxv for page size on dragonfly Decode AT_PAGESZ to determine physPageSize on dragonfly. Change-Id: I7236d7cbe43433f16dffddad19c1655bc0c7f31d Reviewed-on: https://go-review.googlesource.com/103257 Run-TryBot: Tobias Klauser Reviewed-by: Ian Lance Taylor --- src/runtime/auxv_none.go | 1 + src/runtime/os_dragonfly.go | 39 +++++++++++++++++++++++++++++++++++-- 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/src/runtime/auxv_none.go b/src/runtime/auxv_none.go index 96fcbdc2fe..9cb8da285b 100644 --- a/src/runtime/auxv_none.go +++ b/src/runtime/auxv_none.go @@ -4,6 +4,7 @@ // +build !linux // +build !darwin +// +build !dragonfly // +build !freebsd // +build !netbsd diff --git a/src/runtime/os_dragonfly.go b/src/runtime/os_dragonfly.go index 681057f3d5..85927b4026 100644 --- a/src/runtime/os_dragonfly.go +++ b/src/runtime/os_dragonfly.go @@ -4,7 +4,10 @@ package runtime -import "unsafe" +import ( + "runtime/internal/sys" + "unsafe" +) const ( _NSIG = 33 @@ -149,7 +152,9 @@ func newosproc(mp *m, stk unsafe.Pointer) { func osinit() { ncpu = getncpu() - physPageSize = getPageSize() + if physPageSize == 0 { + physPageSize = getPageSize() + } } var urandom_dev = []byte("/dev/urandom\x00") @@ -242,3 +247,33 @@ func sigdelset(mask *sigset, i int) { func (c *sigctxt) fixsigcode(sig uint32) { } + +func sysargs(argc int32, argv **byte) { + n := argc + 1 + + // skip over argv, envp to get to auxv + for argv_index(argv, n) != nil { + n++ + } + + // skip NULL separator + n++ + + auxv := (*[1 << 28]uintptr)(add(unsafe.Pointer(argv), uintptr(n)*sys.PtrSize)) + sysauxv(auxv[:]) +} + +const ( + _AT_NULL = 0 + _AT_PAGESZ = 6 +) + +func sysauxv(auxv []uintptr) { + for i := 0; auxv[i] != _AT_NULL; i += 2 { + tag, val := auxv[i], auxv[i+1] + switch tag { + case _AT_PAGESZ: + physPageSize = val + } + } +}