Skip to content

Commit

Permalink
selftests/powerpc: Add a test for PROT_SAO
Browse files Browse the repository at this point in the history
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: Michael Ellerman <[email protected]>
  • Loading branch information
mpe committed Jul 14, 2016
1 parent e0ddf7a commit 24af8c5
Show file tree
Hide file tree
Showing 4 changed files with 51 additions and 1 deletion.
1 change: 1 addition & 0 deletions tools/testing/selftests/powerpc/mm/.gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
hugetlb_vs_thp_test
subpage_prot
tempfile
prot_sao
4 changes: 3 additions & 1 deletion tools/testing/selftests/powerpc/mm/Makefile
Original file line number Diff line number Diff line change
@@ -1,13 +1,15 @@
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:
Expand Down
42 changes: 42 additions & 0 deletions tools/testing/selftests/powerpc/mm/prot_sao.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
/*
* 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 changes: 5 additions & 0 deletions tools/testing/selftests/powerpc/utils.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down

0 comments on commit 24af8c5

Please sign in to comment.