162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright 2016, Michael Ellerman, IBM Corp. 462306a36Sopenharmony_ci */ 562306a36Sopenharmony_ci 662306a36Sopenharmony_ci#include <stdio.h> 762306a36Sopenharmony_ci#include <stdlib.h> 862306a36Sopenharmony_ci#include <string.h> 962306a36Sopenharmony_ci#include <sys/mman.h> 1062306a36Sopenharmony_ci#include <unistd.h> 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_ci#include <asm/cputable.h> 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_ci#include "utils.h" 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ci#define SIZE (64 * 1024) 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_ciint test_prot_sao(void) 1962306a36Sopenharmony_ci{ 2062306a36Sopenharmony_ci char *p; 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_ci /* 2362306a36Sopenharmony_ci * SAO was introduced in 2.06 and removed in 3.1. It's disabled in 2462306a36Sopenharmony_ci * guests/LPARs by default, so also skip if we are running in a guest. 2562306a36Sopenharmony_ci */ 2662306a36Sopenharmony_ci SKIP_IF(!have_hwcap(PPC_FEATURE_ARCH_2_06) || 2762306a36Sopenharmony_ci have_hwcap2(PPC_FEATURE2_ARCH_3_1) || 2862306a36Sopenharmony_ci access("/proc/device-tree/rtas/ibm,hypertas-functions", F_OK) == 0); 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_ci /* 3162306a36Sopenharmony_ci * Ensure we can ask for PROT_SAO. 3262306a36Sopenharmony_ci * We can't really verify that it does the right thing, but at least we 3362306a36Sopenharmony_ci * confirm the kernel will accept it. 3462306a36Sopenharmony_ci */ 3562306a36Sopenharmony_ci p = mmap(NULL, SIZE, PROT_READ | PROT_WRITE | PROT_SAO, 3662306a36Sopenharmony_ci MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); 3762306a36Sopenharmony_ci FAIL_IF(p == MAP_FAILED); 3862306a36Sopenharmony_ci 3962306a36Sopenharmony_ci /* Write to the mapping, to at least cause a fault */ 4062306a36Sopenharmony_ci memset(p, 0xaa, SIZE); 4162306a36Sopenharmony_ci 4262306a36Sopenharmony_ci return 0; 4362306a36Sopenharmony_ci} 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_ciint main(void) 4662306a36Sopenharmony_ci{ 4762306a36Sopenharmony_ci return test_harness(test_prot_sao, "prot-sao"); 4862306a36Sopenharmony_ci} 49