Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
arch
um
os-Linux
elf_aux.c
Go to the documentation of this file.
1
/*
2
* arch/um/kernel/elf_aux.c
3
*
4
* Scan the Elf auxiliary vector provided by the host to extract
5
* information about vsyscall-page, etc.
6
*
7
* Copyright (C) 2004 Fujitsu Siemens Computers GmbH
8
* Author: Bodo Stroesser (
[email protected]
)
9
*/
10
#include <elf.h>
11
#include <stddef.h>
12
#include <init.h>
13
#include <
elf_user.h
>
14
#include <
mem_user.h
>
15
16
typedef
Elf32_auxv_t
elf_auxv_t
;
17
18
/* These are initialized very early in boot and never changed */
19
char
*
elf_aux_platform
;
20
extern
long
elf_aux_hwcap
;
21
unsigned
long
vsyscall_ehdr
;
22
unsigned
long
vsyscall_end
;
23
unsigned
long
__kernel_vsyscall
;
24
25
__init
void
scan_elf_aux
(
char
**envp)
26
{
27
long
page_size
= 0;
28
elf_auxv_t
* auxv;
29
30
while
( *envp++ !=
NULL
) ;
31
32
for
( auxv = (
elf_auxv_t
*)envp; auxv->a_type !=
AT_NULL
; auxv++) {
33
switch
( auxv->a_type ) {
34
case
AT_SYSINFO
:
35
__kernel_vsyscall
= auxv->a_un.a_val;
36
/* See if the page is under TASK_SIZE */
37
if
(
__kernel_vsyscall
< (
unsigned
long
) envp)
38
__kernel_vsyscall
= 0;
39
break
;
40
case
AT_SYSINFO_EHDR
:
41
vsyscall_ehdr
= auxv->a_un.a_val;
42
/* See if the page is under TASK_SIZE */
43
if
(
vsyscall_ehdr
< (
unsigned
long
) envp)
44
vsyscall_ehdr
= 0;
45
break
;
46
case
AT_HWCAP
:
47
elf_aux_hwcap
= auxv->a_un.a_val;
48
break
;
49
case
AT_PLATFORM
:
50
/* elf.h removed the pointer elements from
51
* a_un, so we have to use a_val, which is
52
* all that's left.
53
*/
54
elf_aux_platform
=
55
(
char
*) (
long
) auxv->a_un.a_val;
56
break
;
57
case
AT_PAGESZ
:
58
page_size = auxv->a_un.a_val;
59
break
;
60
}
61
}
62
if
( !
__kernel_vsyscall
|| !
vsyscall_ehdr
||
63
!
elf_aux_hwcap
|| !
elf_aux_platform
||
64
! page_size || (
vsyscall_ehdr
% page_size) ) {
65
__kernel_vsyscall
= 0;
66
vsyscall_ehdr
= 0;
67
elf_aux_hwcap
= 0;
68
elf_aux_platform
=
"i586"
;
69
}
70
else
{
71
vsyscall_end
=
vsyscall_ehdr
+
page_size
;
72
}
73
}
Generated on Thu Jan 10 2013 13:19:35 for Linux Kernel by
1.8.2