cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

elf_aux.c (2014B)


      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 (bodo.stroesser@fujitsu-siemens.com)
     10 */
     11#include <elf.h>
     12#include <stddef.h>
     13#include <init.h>
     14#include <elf_user.h>
     15#include <mem_user.h>
     16
     17typedef Elf32_auxv_t elf_auxv_t;
     18
     19/* These are initialized very early in boot and never changed */
     20char * elf_aux_platform;
     21extern long elf_aux_hwcap;
     22unsigned long vsyscall_ehdr;
     23unsigned long vsyscall_end;
     24unsigned long __kernel_vsyscall;
     25
     26__init void scan_elf_aux( char **envp)
     27{
     28	long page_size = 0;
     29	elf_auxv_t * auxv;
     30
     31	while ( *envp++ != NULL) ;
     32
     33	for ( auxv = (elf_auxv_t *)envp; auxv->a_type != AT_NULL; auxv++) {
     34		switch ( auxv->a_type ) {
     35			case AT_SYSINFO:
     36				__kernel_vsyscall = auxv->a_un.a_val;
     37				/* See if the page is under TASK_SIZE */
     38				if (__kernel_vsyscall < (unsigned long) envp)
     39					__kernel_vsyscall = 0;
     40				break;
     41			case AT_SYSINFO_EHDR:
     42				vsyscall_ehdr = auxv->a_un.a_val;
     43				/* See if the page is under TASK_SIZE */
     44				if (vsyscall_ehdr < (unsigned long) envp)
     45					vsyscall_ehdr = 0;
     46				break;
     47			case AT_HWCAP:
     48				elf_aux_hwcap = auxv->a_un.a_val;
     49				break;
     50			case AT_PLATFORM:
     51                                /* elf.h removed the pointer elements from
     52                                 * a_un, so we have to use a_val, which is
     53                                 * all that's left.
     54                                 */
     55				elf_aux_platform =
     56					(char *) (long) auxv->a_un.a_val;
     57				break;
     58			case AT_PAGESZ:
     59				page_size = auxv->a_un.a_val;
     60				break;
     61		}
     62	}
     63	if ( ! __kernel_vsyscall || ! vsyscall_ehdr ||
     64	     ! elf_aux_hwcap || ! elf_aux_platform ||
     65	     ! page_size || (vsyscall_ehdr % page_size) ) {
     66		__kernel_vsyscall = 0;
     67		vsyscall_ehdr = 0;
     68		elf_aux_hwcap = 0;
     69		elf_aux_platform = "i586";
     70	}
     71	else {
     72		vsyscall_end = vsyscall_ehdr + page_size;
     73	}
     74}