Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/arch/um/os-Linux/elf_aux.c
26424 views
1
// SPDX-License-Identifier: GPL-2.0
2
/*
3
* arch/um/kernel/elf_aux.c
4
*
5
* Scan the ELF auxiliary vector provided by the host to extract
6
* information about vsyscall-page, etc.
7
*
8
* Copyright (C) 2004 Fujitsu Siemens Computers GmbH
9
* Author: Bodo Stroesser ([email protected])
10
*/
11
#include <elf.h>
12
#include <stddef.h>
13
#include <init.h>
14
#include <elf_user.h>
15
#include <mem_user.h>
16
#include "internal.h"
17
18
typedef Elf32_auxv_t elf_auxv_t;
19
20
/* These are initialized very early in boot and never changed */
21
char * elf_aux_platform;
22
extern long elf_aux_hwcap;
23
unsigned long vsyscall_ehdr;
24
unsigned long vsyscall_end;
25
unsigned long __kernel_vsyscall;
26
27
__init void scan_elf_aux( char **envp)
28
{
29
long page_size = 0;
30
elf_auxv_t * auxv;
31
32
while ( *envp++ != NULL) ;
33
34
for ( auxv = (elf_auxv_t *)envp; auxv->a_type != AT_NULL; auxv++) {
35
switch ( auxv->a_type ) {
36
case AT_SYSINFO:
37
__kernel_vsyscall = auxv->a_un.a_val;
38
/* See if the page is under TASK_SIZE */
39
if (__kernel_vsyscall < (unsigned long) envp)
40
__kernel_vsyscall = 0;
41
break;
42
case AT_SYSINFO_EHDR:
43
vsyscall_ehdr = auxv->a_un.a_val;
44
/* See if the page is under TASK_SIZE */
45
if (vsyscall_ehdr < (unsigned long) envp)
46
vsyscall_ehdr = 0;
47
break;
48
case AT_HWCAP:
49
elf_aux_hwcap = auxv->a_un.a_val;
50
break;
51
case AT_PLATFORM:
52
/* elf.h removed the pointer elements from
53
* a_un, so we have to use a_val, which is
54
* all that's left.
55
*/
56
elf_aux_platform =
57
(char *) (long) auxv->a_un.a_val;
58
break;
59
case AT_PAGESZ:
60
page_size = auxv->a_un.a_val;
61
break;
62
}
63
}
64
if ( ! __kernel_vsyscall || ! vsyscall_ehdr ||
65
! elf_aux_hwcap || ! elf_aux_platform ||
66
! page_size || (vsyscall_ehdr % page_size) ) {
67
__kernel_vsyscall = 0;
68
vsyscall_ehdr = 0;
69
elf_aux_hwcap = 0;
70
elf_aux_platform = "i586";
71
}
72
else {
73
vsyscall_end = vsyscall_ehdr + page_size;
74
}
75
}
76
77