n++
// now argv+n is auxv
- auxv := (*[1 << 28]uintptr)(add(unsafe.Pointer(argv), uintptr(n)*goarch.PtrSize))
- sysauxv(auxv[:])
+ auxvp := (*[1 << 28]uintptr)(add(unsafe.Pointer(argv), uintptr(n)*goarch.PtrSize))
+ pairs := sysauxv(auxvp[:])
+ auxv = auxvp[: pairs*2 : pairs*2]
}
const (
_AT_SUN_EXECNAME = 2014 // exec() path name
)
-func sysauxv(auxv []uintptr) {
- for i := 0; auxv[i] != _AT_NULL; i += 2 {
+func sysauxv(auxv []uintptr) (pairs int) {
+ var i int
+ for i = 0; auxv[i] != _AT_NULL; i += 2 {
tag, val := auxv[i], auxv[i+1]
switch tag {
case _AT_PAGESZ:
executablePath = gostringnocopy((*byte)(unsafe.Pointer(val)))
}
}
+ return i / 2
}
// sigPerThreadSyscall is only used on linux, so we assign a bogus signal
// skip NULL separator
n++
- auxv := (*[1 << 28]uintptr)(add(unsafe.Pointer(argv), uintptr(n)*goarch.PtrSize))
- sysauxv(auxv[:])
+ auxvp := (*[1 << 28]uintptr)(add(unsafe.Pointer(argv), uintptr(n)*goarch.PtrSize))
+ pairs := sysauxv(auxvp[:])
+ auxv = auxvp[: pairs*2 : pairs*2]
}
const (
_AT_PAGESZ = 6
)
-func sysauxv(auxv []uintptr) {
- for i := 0; auxv[i] != _AT_NULL; i += 2 {
+func sysauxv(auxv []uintptr) (pairs int) {
+ var i int
+ for i = 0; auxv[i] != _AT_NULL; i += 2 {
tag, val := auxv[i], auxv[i+1]
switch tag {
case _AT_PAGESZ:
physPageSize = val
}
}
+ return i / 2
}
// raise sends a signal to the calling thread.
n++
// now argv+n is auxv
- auxv := (*[1 << 28]uintptr)(add(unsafe.Pointer(argv), uintptr(n)*goarch.PtrSize))
- sysauxv(auxv[:])
+ auxvp := (*[1 << 28]uintptr)(add(unsafe.Pointer(argv), uintptr(n)*goarch.PtrSize))
+ pairs := sysauxv(auxvp[:])
+ auxv = auxvp[: pairs*2 : pairs*2]
}
const (
_AT_HWCAP2 = 26 // CPU feature flags 2
)
-func sysauxv(auxv []uintptr) {
- for i := 0; auxv[i] != _AT_NULL; i += 2 {
+func sysauxv(auxv []uintptr) (pairs int) {
+ var i int
+ for i = 0; auxv[i] != _AT_NULL; i += 2 {
tag, val := auxv[i], auxv[i+1]
switch tag {
// _AT_NCPUS from auxv shouldn't be used due to golang.org/issue/15206
archauxv(tag, val)
}
+ return i / 2
}
// sysSigaction calls the sigaction system call.
func mincore(addr unsafe.Pointer, n uintptr, dst *byte) int32
+var auxvreadbuf [128]uintptr
+
func sysargs(argc int32, argv **byte) {
n := argc + 1
n++
// now argv+n is auxv
- auxv := (*[1 << 28]uintptr)(add(unsafe.Pointer(argv), uintptr(n)*goarch.PtrSize))
- if sysauxv(auxv[:]) != 0 {
+ auxvp := (*[1 << 28]uintptr)(add(unsafe.Pointer(argv), uintptr(n)*goarch.PtrSize))
+
+ if pairs := sysauxv(auxvp[:]); pairs != 0 {
+ auxv = auxvp[: pairs*2 : pairs*2]
return
}
// In some situations we don't get a loader-provided
munmap(p, size)
return
}
- var buf [128]uintptr
- n = read(fd, noescape(unsafe.Pointer(&buf[0])), int32(unsafe.Sizeof(buf)))
+
+ n = read(fd, noescape(unsafe.Pointer(&auxvreadbuf[0])), int32(unsafe.Sizeof(auxvreadbuf)))
closefd(fd)
if n < 0 {
return
}
// Make sure buf is terminated, even if we didn't read
// the whole file.
- buf[len(buf)-2] = _AT_NULL
- sysauxv(buf[:])
+ auxvreadbuf[len(auxvreadbuf)-2] = _AT_NULL
+ pairs := sysauxv(auxvreadbuf[:])
+ auxv = auxvreadbuf[: pairs*2 : pairs*2]
}
// startupRandomData holds random bytes initialized at startup. These come from
// the ELF AT_RANDOM auxiliary vector.
var startupRandomData []byte
-func sysauxv(auxv []uintptr) int {
+func sysauxv(auxv []uintptr) (pairs int) {
var i int
for ; auxv[i] != _AT_NULL; i += 2 {
tag, val := auxv[i], auxv[i+1]
n++
// now argv+n is auxv
- auxv := (*[1 << 28]uintptr)(add(unsafe.Pointer(argv), uintptr(n)*goarch.PtrSize))
- sysauxv(auxv[:])
+ auxvp := (*[1 << 28]uintptr)(add(unsafe.Pointer(argv), uintptr(n)*goarch.PtrSize))
+ pairs := sysauxv(auxvp[:])
+ auxv = auxvp[: pairs*2 : pairs*2]
}
const (
_AT_PAGESZ = 6 // Page size in bytes
)
-func sysauxv(auxv []uintptr) {
- for i := 0; auxv[i] != _AT_NULL; i += 2 {
+func sysauxv(auxv []uintptr) (pairs int) {
+ var i int
+ for i = 0; auxv[i] != _AT_NULL; i += 2 {
tag, val := auxv[i], auxv[i+1]
switch tag {
case _AT_PAGESZ:
physPageSize = val
}
}
+ return i / 2
}
// raise sends signal to the calling thread.
func writeErrStr(s string) {
write(2, unsafe.Pointer(unsafe.StringData(s)), int32(len(s)))
}
+
+// auxv is populated on relevant platforms but defined here for all platforms
+// so x/sys/cpu can assume the getAuxv symbol exists without keeping its list
+// of auxv-using GOOS build tags in sync.
+//
+// It contains an even number of elements, (tag, value) pairs.
+var auxv []uintptr
+
+func getAuxv() []uintptr { return auxv } // accessed from x/sys/cpu; see issue 57336