mirror of
https://github.com/torvalds/linux.git
synced 2024-11-28 07:01:32 +00:00
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: Michael Ellerman <mpe@ellerman.id.au>
This commit is contained in:
parent
e0ddf7a245
commit
24af8c5a52
@ -1,3 +1,4 @@
|
||||
hugetlb_vs_thp_test
|
||||
subpage_prot
|
||||
tempfile
|
||||
prot_sao
|
@ -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:
|
||||
|
42
tools/testing/selftests/powerpc/mm/prot_sao.c
Normal file
42
tools/testing/selftests/powerpc/mm/prot_sao.c
Normal file
@ -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");
|
||||
}
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user