1*fcb45ec0SMichael Ellerman /* 2*fcb45ec0SMichael Ellerman * Copyright 2013-2015, Michael Ellerman, IBM Corp. 3*fcb45ec0SMichael Ellerman * Licensed under GPLv2. 4*fcb45ec0SMichael Ellerman */ 5*fcb45ec0SMichael Ellerman 6*fcb45ec0SMichael Ellerman #include <elf.h> 7*fcb45ec0SMichael Ellerman #include <errno.h> 8*fcb45ec0SMichael Ellerman #include <fcntl.h> 9*fcb45ec0SMichael Ellerman #include <link.h> 10*fcb45ec0SMichael Ellerman #include <stdio.h> 11*fcb45ec0SMichael Ellerman #include <sys/stat.h> 12*fcb45ec0SMichael Ellerman #include <sys/types.h> 13*fcb45ec0SMichael Ellerman #include <unistd.h> 14*fcb45ec0SMichael Ellerman 15*fcb45ec0SMichael Ellerman #include "utils.h" 16*fcb45ec0SMichael Ellerman 17*fcb45ec0SMichael Ellerman static char auxv[4096]; 18*fcb45ec0SMichael Ellerman 19*fcb45ec0SMichael Ellerman void *get_auxv_entry(int type) 20*fcb45ec0SMichael Ellerman { 21*fcb45ec0SMichael Ellerman ElfW(auxv_t) *p; 22*fcb45ec0SMichael Ellerman void *result; 23*fcb45ec0SMichael Ellerman ssize_t num; 24*fcb45ec0SMichael Ellerman int fd; 25*fcb45ec0SMichael Ellerman 26*fcb45ec0SMichael Ellerman fd = open("/proc/self/auxv", O_RDONLY); 27*fcb45ec0SMichael Ellerman if (fd == -1) { 28*fcb45ec0SMichael Ellerman perror("open"); 29*fcb45ec0SMichael Ellerman return NULL; 30*fcb45ec0SMichael Ellerman } 31*fcb45ec0SMichael Ellerman 32*fcb45ec0SMichael Ellerman result = NULL; 33*fcb45ec0SMichael Ellerman 34*fcb45ec0SMichael Ellerman num = read(fd, auxv, sizeof(auxv)); 35*fcb45ec0SMichael Ellerman if (num < 0) { 36*fcb45ec0SMichael Ellerman perror("read"); 37*fcb45ec0SMichael Ellerman goto out; 38*fcb45ec0SMichael Ellerman } 39*fcb45ec0SMichael Ellerman 40*fcb45ec0SMichael Ellerman if (num > sizeof(auxv)) { 41*fcb45ec0SMichael Ellerman printf("Overflowed auxv buffer\n"); 42*fcb45ec0SMichael Ellerman goto out; 43*fcb45ec0SMichael Ellerman } 44*fcb45ec0SMichael Ellerman 45*fcb45ec0SMichael Ellerman p = (ElfW(auxv_t) *)auxv; 46*fcb45ec0SMichael Ellerman 47*fcb45ec0SMichael Ellerman while (p->a_type != AT_NULL) { 48*fcb45ec0SMichael Ellerman if (p->a_type == type) { 49*fcb45ec0SMichael Ellerman result = (void *)p->a_un.a_val; 50*fcb45ec0SMichael Ellerman break; 51*fcb45ec0SMichael Ellerman } 52*fcb45ec0SMichael Ellerman 53*fcb45ec0SMichael Ellerman p++; 54*fcb45ec0SMichael Ellerman } 55*fcb45ec0SMichael Ellerman out: 56*fcb45ec0SMichael Ellerman close(fd); 57*fcb45ec0SMichael Ellerman return result; 58*fcb45ec0SMichael Ellerman } 59