Commit e3028437 authored by Michael Ellerman's avatar Michael Ellerman

selftests/powerpc: Refactor the AUXV routines

Refactor the AUXV routines so they are more composable. In a future test
we want to look for many AUXV entries and we don't want to have to read
/proc/self/auxv each time.
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
parent cabed148
......@@ -24,7 +24,11 @@ typedef uint8_t u8;
void test_harness_set_timeout(uint64_t time);
int test_harness(int (test_function)(void), char *name);
extern void *get_auxv_entry(int type);
int read_auxv(char *buf, ssize_t buf_size);
void *find_auxv_entry(int type, char *auxv);
void *get_auxv_entry(int type);
int pick_online_cpu(void);
static inline bool have_hwcap(unsigned long ftr)
......
......@@ -19,45 +19,64 @@
static char auxv[4096];
void *get_auxv_entry(int type)
int read_auxv(char *buf, ssize_t buf_size)
{
ElfW(auxv_t) *p;
void *result;
ssize_t num;
int fd;
int rc, fd;
fd = open("/proc/self/auxv", O_RDONLY);
if (fd == -1) {
perror("open");
return NULL;
return -errno;
}
result = NULL;
num = read(fd, auxv, sizeof(auxv));
num = read(fd, buf, buf_size);
if (num < 0) {
perror("read");
rc = -EIO;
goto out;
}
if (num > sizeof(auxv)) {
printf("Overflowed auxv buffer\n");
if (num > buf_size) {
printf("overflowed auxv buffer\n");
rc = -EOVERFLOW;
goto out;
}
rc = 0;
out:
close(fd);
return rc;
}
void *find_auxv_entry(int type, char *auxv)
{
ElfW(auxv_t) *p;
p = (ElfW(auxv_t) *)auxv;
while (p->a_type != AT_NULL) {
if (p->a_type == type) {
result = (void *)p->a_un.a_val;
break;
}
if (p->a_type == type)
return p;
p++;
}
out:
close(fd);
return result;
return NULL;
}
void *get_auxv_entry(int type)
{
ElfW(auxv_t) *p;
if (read_auxv(auxv, sizeof(auxv)))
return NULL;
p = find_auxv_entry(type, auxv);
if (p)
return (void *)p->a_un.a_val;
return NULL;
}
int pick_online_cpu(void)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment