xref: /openbmc/linux/tools/testing/selftests/powerpc/utils.c (revision fcb45ec074725baeb3aaa1b1854b9f44c3eebacf)
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