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: Michael Ellerman <mpe@ellerman.id.au>
This commit is contained in:
parent
cabed14891
commit
e3028437cb
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue