Skip to content

Commit 1a9893a

Browse files
bradfitzgopherbot
authored andcommitted
runtime: expose auxv for use by x/sys/cpu
Updates #57336 Change-Id: I181885f59bac59360b855d3990326ea2b268bd28 Reviewed-on: https://go-review.googlesource.com/c/go/+/458256 Reviewed-by: Michael Pratt <mpratt@google.com> TryBot-Result: Gopher Robot <gobot@golang.org> Auto-Submit: Brad Fitzpatrick <bradfitz@golang.org> Reviewed-by: Austin Clements <austin@google.com> Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org> Reviewed-by: Ian Lance Taylor <iant@golang.org>
1 parent 518889b commit 1a9893a

File tree

6 files changed

+49
-23
lines changed

6 files changed

+49
-23
lines changed

src/runtime/os3_solaris.go

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -601,8 +601,9 @@ func sysargs(argc int32, argv **byte) {
601601
n++
602602

603603
// now argv+n is auxv
604-
auxv := (*[1 << 28]uintptr)(add(unsafe.Pointer(argv), uintptr(n)*goarch.PtrSize))
605-
sysauxv(auxv[:])
604+
auxvp := (*[1 << 28]uintptr)(add(unsafe.Pointer(argv), uintptr(n)*goarch.PtrSize))
605+
pairs := sysauxv(auxvp[:])
606+
auxv = auxvp[: pairs*2 : pairs*2]
606607
}
607608

608609
const (
@@ -611,8 +612,9 @@ const (
611612
_AT_SUN_EXECNAME = 2014 // exec() path name
612613
)
613614

614-
func sysauxv(auxv []uintptr) {
615-
for i := 0; auxv[i] != _AT_NULL; i += 2 {
615+
func sysauxv(auxv []uintptr) (pairs int) {
616+
var i int
617+
for i = 0; auxv[i] != _AT_NULL; i += 2 {
616618
tag, val := auxv[i], auxv[i+1]
617619
switch tag {
618620
case _AT_PAGESZ:
@@ -621,6 +623,7 @@ func sysauxv(auxv []uintptr) {
621623
executablePath = gostringnocopy((*byte)(unsafe.Pointer(val)))
622624
}
623625
}
626+
return i / 2
624627
}
625628

626629
// sigPerThreadSyscall is only used on linux, so we assign a bogus signal

src/runtime/os_dragonfly.go

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -296,23 +296,26 @@ func sysargs(argc int32, argv **byte) {
296296
// skip NULL separator
297297
n++
298298

299-
auxv := (*[1 << 28]uintptr)(add(unsafe.Pointer(argv), uintptr(n)*goarch.PtrSize))
300-
sysauxv(auxv[:])
299+
auxvp := (*[1 << 28]uintptr)(add(unsafe.Pointer(argv), uintptr(n)*goarch.PtrSize))
300+
pairs := sysauxv(auxvp[:])
301+
auxv = auxvp[: pairs*2 : pairs*2]
301302
}
302303

303304
const (
304305
_AT_NULL = 0
305306
_AT_PAGESZ = 6
306307
)
307308

308-
func sysauxv(auxv []uintptr) {
309-
for i := 0; auxv[i] != _AT_NULL; i += 2 {
309+
func sysauxv(auxv []uintptr) (pairs int) {
310+
var i int
311+
for i = 0; auxv[i] != _AT_NULL; i += 2 {
310312
tag, val := auxv[i], auxv[i+1]
311313
switch tag {
312314
case _AT_PAGESZ:
313315
physPageSize = val
314316
}
315317
}
318+
return i / 2
316319
}
317320

318321
// raise sends a signal to the calling thread.

src/runtime/os_freebsd.go

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -409,8 +409,9 @@ func sysargs(argc int32, argv **byte) {
409409
n++
410410

411411
// now argv+n is auxv
412-
auxv := (*[1 << 28]uintptr)(add(unsafe.Pointer(argv), uintptr(n)*goarch.PtrSize))
413-
sysauxv(auxv[:])
412+
auxvp := (*[1 << 28]uintptr)(add(unsafe.Pointer(argv), uintptr(n)*goarch.PtrSize))
413+
pairs := sysauxv(auxvp[:])
414+
auxv = auxvp[: pairs*2 : pairs*2]
414415
}
415416

416417
const (
@@ -421,8 +422,9 @@ const (
421422
_AT_HWCAP2 = 26 // CPU feature flags 2
422423
)
423424

424-
func sysauxv(auxv []uintptr) {
425-
for i := 0; auxv[i] != _AT_NULL; i += 2 {
425+
func sysauxv(auxv []uintptr) (pairs int) {
426+
var i int
427+
for i = 0; auxv[i] != _AT_NULL; i += 2 {
426428
tag, val := auxv[i], auxv[i+1]
427429
switch tag {
428430
// _AT_NCPUS from auxv shouldn't be used due to golang.org/issue/15206
@@ -434,6 +436,7 @@ func sysauxv(auxv []uintptr) {
434436

435437
archauxv(tag, val)
436438
}
439+
return i / 2
437440
}
438441

439442
// sysSigaction calls the sigaction system call.

src/runtime/os_linux.go

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,8 @@ var addrspace_vec [1]byte
226226

227227
func mincore(addr unsafe.Pointer, n uintptr, dst *byte) int32
228228

229+
var auxvreadbuf [128]uintptr
230+
229231
func sysargs(argc int32, argv **byte) {
230232
n := argc + 1
231233

@@ -238,8 +240,10 @@ func sysargs(argc int32, argv **byte) {
238240
n++
239241

240242
// now argv+n is auxv
241-
auxv := (*[1 << 28]uintptr)(add(unsafe.Pointer(argv), uintptr(n)*goarch.PtrSize))
242-
if sysauxv(auxv[:]) != 0 {
243+
auxvp := (*[1 << 28]uintptr)(add(unsafe.Pointer(argv), uintptr(n)*goarch.PtrSize))
244+
245+
if pairs := sysauxv(auxvp[:]); pairs != 0 {
246+
auxv = auxvp[: pairs*2 : pairs*2]
243247
return
244248
}
245249
// In some situations we don't get a loader-provided
@@ -269,23 +273,24 @@ func sysargs(argc int32, argv **byte) {
269273
munmap(p, size)
270274
return
271275
}
272-
var buf [128]uintptr
273-
n = read(fd, noescape(unsafe.Pointer(&buf[0])), int32(unsafe.Sizeof(buf)))
276+
277+
n = read(fd, noescape(unsafe.Pointer(&auxvreadbuf[0])), int32(unsafe.Sizeof(auxvreadbuf)))
274278
closefd(fd)
275279
if n < 0 {
276280
return
277281
}
278282
// Make sure buf is terminated, even if we didn't read
279283
// the whole file.
280-
buf[len(buf)-2] = _AT_NULL
281-
sysauxv(buf[:])
284+
auxvreadbuf[len(auxvreadbuf)-2] = _AT_NULL
285+
pairs := sysauxv(auxvreadbuf[:])
286+
auxv = auxvreadbuf[: pairs*2 : pairs*2]
282287
}
283288

284289
// startupRandomData holds random bytes initialized at startup. These come from
285290
// the ELF AT_RANDOM auxiliary vector.
286291
var startupRandomData []byte
287292

288-
func sysauxv(auxv []uintptr) int {
293+
func sysauxv(auxv []uintptr) (pairs int) {
289294
var i int
290295
for ; auxv[i] != _AT_NULL; i += 2 {
291296
tag, val := auxv[i], auxv[i+1]

src/runtime/os_netbsd.go

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -402,23 +402,26 @@ func sysargs(argc int32, argv **byte) {
402402
n++
403403

404404
// now argv+n is auxv
405-
auxv := (*[1 << 28]uintptr)(add(unsafe.Pointer(argv), uintptr(n)*goarch.PtrSize))
406-
sysauxv(auxv[:])
405+
auxvp := (*[1 << 28]uintptr)(add(unsafe.Pointer(argv), uintptr(n)*goarch.PtrSize))
406+
pairs := sysauxv(auxvp[:])
407+
auxv = auxvp[: pairs*2 : pairs*2]
407408
}
408409

409410
const (
410411
_AT_NULL = 0 // Terminates the vector
411412
_AT_PAGESZ = 6 // Page size in bytes
412413
)
413414

414-
func sysauxv(auxv []uintptr) {
415-
for i := 0; auxv[i] != _AT_NULL; i += 2 {
415+
func sysauxv(auxv []uintptr) (pairs int) {
416+
var i int
417+
for i = 0; auxv[i] != _AT_NULL; i += 2 {
416418
tag, val := auxv[i], auxv[i+1]
417419
switch tag {
418420
case _AT_PAGESZ:
419421
physPageSize = val
420422
}
421423
}
424+
return i / 2
422425
}
423426

424427
// raise sends signal to the calling thread.

src/runtime/runtime.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,3 +151,12 @@ func syscall_runtimeUnsetenv(key string) {
151151
func writeErrStr(s string) {
152152
write(2, unsafe.Pointer(unsafe.StringData(s)), int32(len(s)))
153153
}
154+
155+
// auxv is populated on relevant platforms but defined here for all platforms
156+
// so x/sys/cpu can assume the getAuxv symbol exists without keeping its list
157+
// of auxv-using GOOS build tags in sync.
158+
//
159+
// It contains an even number of elements, (tag, value) pairs.
160+
var auxv []uintptr
161+
162+
func getAuxv() []uintptr { return auxv } // accessed from x/sys/cpu; see issue 57336

0 commit comments

Comments
 (0)