Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e3028437 authored by Michael Ellerman's avatar Michael Ellerman
Browse files

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
Loading
Loading
Loading
Loading
+5 −1
Original line number Diff line number Diff line
@@ -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)
+36 −17
Original line number Diff line number Diff line
@@ -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)