]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: parse auxv for page size on netbsd
authorTobias Klauser <tklauser@distanz.ch>
Tue, 27 Mar 2018 13:33:32 +0000 (13:33 +0000)
committerTobias Klauser <tobias.klauser@gmail.com>
Tue, 27 Mar 2018 15:21:51 +0000 (15:21 +0000)
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 <tobias.klauser@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
src/runtime/auxv_none.go [moved from src/runtime/vdso_none.go with 93% similarity]
src/runtime/os_netbsd.go

similarity index 93%
rename from src/runtime/vdso_none.go
rename to src/runtime/auxv_none.go
index a709758f641e9b35f78333742b92016c96904f5a..96fcbdc2feb45f25674e627078f5c431f0c735e8 100644 (file)
@@ -5,6 +5,7 @@
 // +build !linux
 // +build !darwin
 // +build !freebsd
+// +build !netbsd
 
 package runtime
 
index abd6512dc3a7cc3aa62b0fcaaea4cd9c42395368..4a4dfa56bf4c26425e35d2a49d561c1f15672f15 100644 (file)
@@ -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
+               }
+       }
+}