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

Commit 24af8c5a authored by Michael Ellerman's avatar Michael Ellerman
Browse files

selftests/powerpc: Add a test for PROT_SAO



PROT_SAO is a powerpc-specific flag to mmap(), and we rely on arch
specific logic to allow it to be passed to mmap().

Add a small test to ensure mmap() accepts PROT_SAO. We don't have a good
way to test that it actually causes the mapping to be created with the
right flags, so for now we just touch the mapping so it's faulted in. In
future we might be able to do something better.

Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
parent e0ddf7a2
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
hugetlb_vs_thp_test
subpage_prot
tempfile
prot_sao
 No newline at end of file
+3 −1
Original line number Diff line number Diff line
noarg:
	$(MAKE) -C ../

TEST_PROGS := hugetlb_vs_thp_test subpage_prot
TEST_PROGS := hugetlb_vs_thp_test subpage_prot prot_sao
TEST_FILES := tempfile

all: $(TEST_PROGS) $(TEST_FILES)

$(TEST_PROGS): ../harness.c

prot_sao: ../utils.c

include ../../lib.mk

tempfile:
+42 −0
Original line number Diff line number Diff line
/*
 * Copyright 2016, Michael Ellerman, IBM Corp.
 * Licensed under GPLv2.
 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/mman.h>

#include <asm/cputable.h>

#include "utils.h"

#define SIZE (64 * 1024)

int test_prot_sao(void)
{
	char *p;

	/* 2.06 or later should support SAO */
	SKIP_IF(!have_hwcap(PPC_FEATURE_ARCH_2_06));

	/*
	 * Ensure we can ask for PROT_SAO.
	 * We can't really verify that it does the right thing, but at least we
	 * confirm the kernel will accept it.
	 */
	p = mmap(NULL, SIZE, PROT_READ | PROT_WRITE | PROT_SAO,
		 MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
	FAIL_IF(p == MAP_FAILED);

	/* Write to the mapping, to at least cause a fault */
	memset(p, 0xaa, SIZE);

	return 0;
}

int main(void)
{
	return test_harness(test_prot_sao, "prot-sao");
}
+5 −0
Original line number Diff line number Diff line
@@ -27,6 +27,11 @@ int test_harness(int (test_function)(void), char *name);
extern void *get_auxv_entry(int type);
int pick_online_cpu(void);

static inline bool have_hwcap(unsigned long ftr)
{
	return ((unsigned long)get_auxv_entry(AT_HWCAP) & ftr) == ftr;
}

static inline bool have_hwcap2(unsigned long ftr2)
{
	return ((unsigned long)get_auxv_entry(AT_HWCAP2) & ftr2) == ftr2;