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 (bodo.stroesser@fujitsu-siemens.com)
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