Commit 90addd3d authored by Austin Clements's avatar Austin Clements

runtime: common handling of _AT_RANDOM auxv

The Linux kernel provides 16 bytes of random data via the auxv vector
at startup. Currently we consume this separately on 386, amd64, arm,
and arm64. Now that we have a common auxv parser, handle _AT_RANDOM in
the common path.

Change-Id: Ib69549a1d37e2d07a351cf0f44007bcd24f0d20d
Reviewed-on: https://go-review.googlesource.com/22062Reviewed-by: default avatarBrad Fitzpatrick <bradfitz@golang.org>
parent c955bb20
...@@ -177,7 +177,8 @@ var failallocatestack = []byte("runtime: failed to allocate stack for the new OS ...@@ -177,7 +177,8 @@ var failallocatestack = []byte("runtime: failed to allocate stack for the new OS
var failthreadcreate = []byte("runtime: failed to create new OS thread\n") var failthreadcreate = []byte("runtime: failed to create new OS thread\n")
const ( const (
_AT_NULL = 0 // End of vector _AT_NULL = 0 // End of vector
_AT_RANDOM = 25 // introduced in 2.6.29
) )
func sysargs(argc int32, argv **byte) { func sysargs(argc int32, argv **byte) {
...@@ -195,6 +196,12 @@ func sysargs(argc int32, argv **byte) { ...@@ -195,6 +196,12 @@ func sysargs(argc int32, argv **byte) {
auxv := (*[1 << 28]uintptr)(add(unsafe.Pointer(argv), uintptr(n)*sys.PtrSize)) auxv := (*[1 << 28]uintptr)(add(unsafe.Pointer(argv), uintptr(n)*sys.PtrSize))
for i := 0; auxv[i] != _AT_NULL; i += 2 { for i := 0; auxv[i] != _AT_NULL; i += 2 {
tag, val := auxv[i], auxv[i+1] tag, val := auxv[i], auxv[i+1]
switch tag {
case _AT_RANDOM:
// The kernel provides a pointer to 16-bytes
// worth of random data.
startupRandomData = (*[16]byte)(unsafe.Pointer(val))[:]
}
archauxv(tag, val) archauxv(tag, val)
} }
} }
......
...@@ -4,16 +4,9 @@ ...@@ -4,16 +4,9 @@
package runtime package runtime
import "unsafe"
const ( const (
_AT_RANDOM = 25
_AT_SYSINFO = 32 _AT_SYSINFO = 32
) )
func archauxv(tag, val uintptr) { func archauxv(tag, val uintptr) {
switch tag {
case _AT_RANDOM:
startupRandomData = (*[16]byte)(unsafe.Pointer(val))[:]
}
} }
...@@ -9,7 +9,6 @@ import "unsafe" ...@@ -9,7 +9,6 @@ import "unsafe"
const ( const (
_AT_PLATFORM = 15 // introduced in at least 2.6.11 _AT_PLATFORM = 15 // introduced in at least 2.6.11
_AT_HWCAP = 16 // introduced in at least 2.6.11 _AT_HWCAP = 16 // introduced in at least 2.6.11
_AT_RANDOM = 25 // introduced in 2.6.29
_HWCAP_VFP = 1 << 6 // introduced in at least 2.6.11 _HWCAP_VFP = 1 << 6 // introduced in at least 2.6.11
_HWCAP_VFPv3 = 1 << 13 // introduced in 2.6.30 _HWCAP_VFPv3 = 1 << 13 // introduced in 2.6.30
...@@ -34,10 +33,10 @@ func checkgoarm() { ...@@ -34,10 +33,10 @@ func checkgoarm() {
func archauxv(tag, val uintptr) { func archauxv(tag, val uintptr) {
switch tag { switch tag {
case _AT_RANDOM: // kernel provides a pointer to 16-bytes worth of random data case _AT_RANDOM:
startupRandomData = (*[16]byte)(unsafe.Pointer(val))[:] // sysargs filled in startupRandomData, but that
// the pointer provided may not be word aligned, so we must treat it // pointer may not be word aligned, so we must treat
// as a byte array. // it as a byte array.
randomNumber = uint32(startupRandomData[4]) | uint32(startupRandomData[5])<<8 | randomNumber = uint32(startupRandomData[4]) | uint32(startupRandomData[5])<<8 |
uint32(startupRandomData[6])<<16 | uint32(startupRandomData[7])<<24 uint32(startupRandomData[6])<<16 | uint32(startupRandomData[7])<<24
......
...@@ -4,20 +4,14 @@ ...@@ -4,20 +4,14 @@
package runtime package runtime
import "unsafe"
const (
_AT_RANDOM = 25 // introduced in 2.6.29
)
var randomNumber uint32 var randomNumber uint32
func archauxv(tag, val uintptr) { func archauxv(tag, val uintptr) {
switch tag { switch tag {
case _AT_RANDOM: // kernel provides a pointer to 16-bytes worth of random data case _AT_RANDOM:
startupRandomData = (*[16]byte)(unsafe.Pointer(val))[:] // sysargs filled in startupRandomData, but that
// the pointer provided may not be word aligned, so we must treat it // pointer may not be word aligned, so we must treat
// as a byte array. // it as a byte array.
randomNumber = uint32(startupRandomData[4]) | uint32(startupRandomData[5])<<8 | randomNumber = uint32(startupRandomData[4]) | uint32(startupRandomData[5])<<8 |
uint32(startupRandomData[6])<<16 | uint32(startupRandomData[7])<<24 uint32(startupRandomData[6])<<16 | uint32(startupRandomData[7])<<24
} }
......
...@@ -18,7 +18,6 @@ import "unsafe" ...@@ -18,7 +18,6 @@ import "unsafe"
// http://refspecs.linuxfoundation.org/LSB_3.2.0/LSB-Core-generic/LSB-Core-generic/symversion.html // http://refspecs.linuxfoundation.org/LSB_3.2.0/LSB-Core-generic/LSB-Core-generic/symversion.html
const ( const (
_AT_RANDOM = 25
_AT_SYSINFO_EHDR = 33 _AT_SYSINFO_EHDR = 33
_PT_LOAD = 1 /* Loadable program segment */ _PT_LOAD = 1 /* Loadable program segment */
...@@ -303,8 +302,5 @@ func archauxv(tag, val uintptr) { ...@@ -303,8 +302,5 @@ func archauxv(tag, val uintptr) {
info1 := (*vdso_info)(noescape(unsafe.Pointer(&info))) info1 := (*vdso_info)(noescape(unsafe.Pointer(&info)))
vdso_init_from_sysinfo_ehdr(info1, (*elf64Ehdr)(unsafe.Pointer(val))) vdso_init_from_sysinfo_ehdr(info1, (*elf64Ehdr)(unsafe.Pointer(val)))
vdso_parse_symbols(info1, vdso_find_version(info1, &linux26)) vdso_parse_symbols(info1, vdso_find_version(info1, &linux26))
case _AT_RANDOM:
startupRandomData = (*[16]byte)(unsafe.Pointer(val))[:]
} }
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment