From 4ff4e5072590ca885f807d1619106d4d8a52217c Mon Sep 17 00:00:00 2001 From: Tobias Klauser Date: Tue, 27 Mar 2018 13:33:32 +0000 Subject: [PATCH] runtime: parse auxv for page size on netbsd Decode AT_PAGESZ to determine physPageSize on netbsd. Also rename vdso_none.go to auxv_none.go which matches its purpose more closely. Akin to CL 99780 which did the same for freebsd. Change-Id: Iea4322f861ff0f3515e9051585dbb442f024326b Reviewed-on: https://go-review.googlesource.com/102677 Run-TryBot: Tobias Klauser TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- src/runtime/{vdso_none.go => auxv_none.go} | 1 + src/runtime/os_netbsd.go | 36 +++++++++++++++++++++- 2 files changed, 36 insertions(+), 1 deletion(-) rename src/runtime/{vdso_none.go => auxv_none.go} (93%) diff --git a/src/runtime/vdso_none.go b/src/runtime/auxv_none.go similarity index 93% rename from src/runtime/vdso_none.go rename to src/runtime/auxv_none.go index a709758f641..96fcbdc2feb 100644 --- a/src/runtime/vdso_none.go +++ b/src/runtime/auxv_none.go @@ -5,6 +5,7 @@ // +build !linux // +build !darwin // +build !freebsd +// +build !netbsd package runtime diff --git a/src/runtime/os_netbsd.go b/src/runtime/os_netbsd.go index abd6512dc3a..4a4dfa56bf4 100644 --- a/src/runtime/os_netbsd.go +++ b/src/runtime/os_netbsd.go @@ -6,6 +6,7 @@ package runtime import ( "runtime/internal/atomic" + "runtime/internal/sys" "unsafe" ) @@ -223,7 +224,9 @@ func netbsdMstart() { func osinit() { ncpu = getncpu() - physPageSize = getPageSize() + if physPageSize == 0 { + physPageSize = getPageSize() + } } var urandom_dev = []byte("/dev/urandom\x00") @@ -325,3 +328,34 @@ 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++ + + // now argv+n is auxv + auxv := (*[1 << 28]uintptr)(add(unsafe.Pointer(argv), uintptr(n)*sys.PtrSize)) + sysauxv(auxv[:]) +} + +const ( + _AT_NULL = 0 // Terminates the vector + _AT_PAGESZ = 6 // Page size in bytes +) + +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 + } + } +}