summaryrefslogtreecommitdiff
path: root/src/pkg/runtime/os_linux_386.c
blob: ad72814649991424a945e3e1cee3f7cdad2f61fa (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
// Copyright 2009 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

#include "runtime.h"
#include "defs_GOOS_GOARCH.h"
#include "os_GOOS.h"
#include "../../cmd/ld/textflag.h"

#define AT_NULL		0
#define AT_RANDOM	25
#define AT_SYSINFO	32
extern uint32 runtime·_vdso;

#pragma textflag NOSPLIT
void
runtime·linux_setup_vdso(int32 argc, byte **argv)
{
	byte **envp;
	uint32 *auxv;

	// skip envp to get to ELF auxiliary vector.
	for(envp = &argv[argc+1]; *envp != nil; envp++)
		;
	envp++;
	
	for(auxv=(uint32*)envp; auxv[0] != AT_NULL; auxv += 2) {
		if(auxv[0] == AT_SYSINFO) {
			runtime·_vdso = auxv[1];
			continue;
		}
		if(auxv[0] == AT_RANDOM) {
			runtime·startup_random_data = (byte*)auxv[1];
			runtime·startup_random_data_len = 16;
			continue;
		}
	}
}