1 // SPDX-License-Identifier: GPL-2.0
3 * arch/um/kernel/elf_aux.c
5 * Scan the ELF auxiliary vector provided by the host to extract
6 * information about vsyscall-page, etc.
8 * Copyright (C) 2004 Fujitsu Siemens Computers GmbH
9 * Author: Bodo Stroesser (bodo.stroesser@fujitsu-siemens.com)
18 typedef Elf32_auxv_t elf_auxv_t
;
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
;
27 __init
void scan_elf_aux( char **envp
)
32 while ( *envp
++ != NULL
) ;
34 for ( auxv
= (elf_auxv_t
*)envp
; auxv
->a_type
!= AT_NULL
; auxv
++) {
35 switch ( auxv
->a_type
) {
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;
43 vsyscall_ehdr
= auxv
->a_un
.a_val
;
44 /* See if the page is under TASK_SIZE */
45 if (vsyscall_ehdr
< (unsigned long) envp
)
49 elf_aux_hwcap
= auxv
->a_un
.a_val
;
52 /* elf.h removed the pointer elements from
53 * a_un, so we have to use a_val, which is
57 (char *) (long) auxv
->a_un
.a_val
;
60 page_size
= auxv
->a_un
.a_val
;
64 if ( ! __kernel_vsyscall
|| ! vsyscall_ehdr
||
65 ! elf_aux_hwcap
|| ! elf_aux_platform
||
66 ! page_size
|| (vsyscall_ehdr
% page_size
) ) {
67 __kernel_vsyscall
= 0;
70 elf_aux_platform
= "i586";
73 vsyscall_end
= vsyscall_ehdr
+ page_size
;