1b7cf0f10SNico Boehr /* SPDX-License-Identifier: GPL-2.0-only */ 2b7cf0f10SNico Boehr /* 3b7cf0f10SNico Boehr * TEST PROTECTION tests 4b7cf0f10SNico Boehr * 5b7cf0f10SNico Boehr * Copyright IBM Corp. 2022 6b7cf0f10SNico Boehr * 7b7cf0f10SNico Boehr * Authors: 8b7cf0f10SNico Boehr * Nico Boehr <nrb@linux.ibm.com> 9b7cf0f10SNico Boehr */ 10b7cf0f10SNico Boehr 11b7cf0f10SNico Boehr #include <libcflat.h> 12b7cf0f10SNico Boehr #include <bitops.h> 13b7cf0f10SNico Boehr #include <asm/pgtable.h> 14b7cf0f10SNico Boehr #include <asm/interrupt.h> 15e3505801SNico Boehr #include <mmu.h> 16b7cf0f10SNico Boehr #include <vmalloc.h> 17b7cf0f10SNico Boehr #include <sclp.h> 18b7cf0f10SNico Boehr 19b7cf0f10SNico Boehr static uint8_t pagebuf[PAGE_SIZE] __attribute__((aligned(PAGE_SIZE))); 20b7cf0f10SNico Boehr 21b7cf0f10SNico Boehr static void test_tprot_rw(void) 22b7cf0f10SNico Boehr { 23*b5b28387SJanis Schoetterl-Glausch enum tprot_permission permission; 24b7cf0f10SNico Boehr 25b7cf0f10SNico Boehr report_prefix_push("Page read/writeable"); 26b7cf0f10SNico Boehr 27*b5b28387SJanis Schoetterl-Glausch permission = tprot((unsigned long)pagebuf, 0); 28*b5b28387SJanis Schoetterl-Glausch report(permission == TPROT_READ_WRITE, "CC = 0"); 29b7cf0f10SNico Boehr 30b7cf0f10SNico Boehr report_prefix_pop(); 31b7cf0f10SNico Boehr } 32b7cf0f10SNico Boehr 33b7cf0f10SNico Boehr static void test_tprot_ro(void) 34b7cf0f10SNico Boehr { 35*b5b28387SJanis Schoetterl-Glausch enum tprot_permission permission; 36b7cf0f10SNico Boehr 37b7cf0f10SNico Boehr report_prefix_push("Page readonly"); 38b7cf0f10SNico Boehr 39b7cf0f10SNico Boehr protect_dat_entry(pagebuf, PAGE_ENTRY_P, 5); 40b7cf0f10SNico Boehr 41*b5b28387SJanis Schoetterl-Glausch permission = tprot((unsigned long)pagebuf, 0); 42*b5b28387SJanis Schoetterl-Glausch report(permission == TPROT_READ, "CC = 1"); 43b7cf0f10SNico Boehr 44b7cf0f10SNico Boehr unprotect_dat_entry(pagebuf, PAGE_ENTRY_P, 5); 45b7cf0f10SNico Boehr 46b7cf0f10SNico Boehr report_prefix_pop(); 47b7cf0f10SNico Boehr } 48b7cf0f10SNico Boehr 49b7cf0f10SNico Boehr static void test_tprot_low_addr_prot(void) 50b7cf0f10SNico Boehr { 51*b5b28387SJanis Schoetterl-Glausch enum tprot_permission permission; 52b7cf0f10SNico Boehr 53b7cf0f10SNico Boehr report_prefix_push("low-address protection"); 54b7cf0f10SNico Boehr 55b7cf0f10SNico Boehr low_prot_enable(); 56*b5b28387SJanis Schoetterl-Glausch permission = tprot(0, 0); 57b7cf0f10SNico Boehr low_prot_disable(); 58*b5b28387SJanis Schoetterl-Glausch report(permission == TPROT_READ, "CC = 1"); 59b7cf0f10SNico Boehr 60b7cf0f10SNico Boehr report_prefix_pop(); 61b7cf0f10SNico Boehr } 62b7cf0f10SNico Boehr 63b7cf0f10SNico Boehr static void test_tprot_transl_unavail(void) 64b7cf0f10SNico Boehr { 65*b5b28387SJanis Schoetterl-Glausch enum tprot_permission permission; 66b7cf0f10SNico Boehr 67b7cf0f10SNico Boehr report_prefix_push("Page translation unavailable"); 68b7cf0f10SNico Boehr 69b7cf0f10SNico Boehr protect_dat_entry(pagebuf, PAGE_ENTRY_I, 5); 70b7cf0f10SNico Boehr 71*b5b28387SJanis Schoetterl-Glausch permission = tprot((unsigned long)pagebuf, 0); 72*b5b28387SJanis Schoetterl-Glausch report(permission == TPROT_TRANSL_UNAVAIL, "CC = 3"); 73b7cf0f10SNico Boehr 74b7cf0f10SNico Boehr unprotect_dat_entry(pagebuf, PAGE_ENTRY_I, 5); 75b7cf0f10SNico Boehr 76b7cf0f10SNico Boehr report_prefix_pop(); 77b7cf0f10SNico Boehr } 78b7cf0f10SNico Boehr 79b7cf0f10SNico Boehr static void test_tprot_transl_pte_bit52_set(void) 80b7cf0f10SNico Boehr { 81b7cf0f10SNico Boehr report_prefix_push("PTE Bit 52 set"); 82b7cf0f10SNico Boehr 83b7cf0f10SNico Boehr protect_dat_entry(pagebuf, BIT(63 - 52), 5); 84b7cf0f10SNico Boehr 85b7cf0f10SNico Boehr expect_pgm_int(); 86b7cf0f10SNico Boehr tprot((unsigned long)pagebuf, 0); 87b7cf0f10SNico Boehr check_pgm_int_code(PGM_INT_CODE_TRANSLATION_SPEC); 88b7cf0f10SNico Boehr 89b7cf0f10SNico Boehr unprotect_dat_entry(pagebuf, BIT(63 - 52), 5); 90b7cf0f10SNico Boehr 91b7cf0f10SNico Boehr report_prefix_pop(); 92b7cf0f10SNico Boehr } 93b7cf0f10SNico Boehr 94b7cf0f10SNico Boehr int main(void) 95b7cf0f10SNico Boehr { 96b7cf0f10SNico Boehr report_prefix_push("tprot"); 97b7cf0f10SNico Boehr 98b7cf0f10SNico Boehr setup_vm(); 99b7cf0f10SNico Boehr 100b7cf0f10SNico Boehr test_tprot_rw(); 101b7cf0f10SNico Boehr test_tprot_ro(); 102b7cf0f10SNico Boehr test_tprot_low_addr_prot(); 103b7cf0f10SNico Boehr test_tprot_transl_unavail(); 104b7cf0f10SNico Boehr test_tprot_transl_pte_bit52_set(); 105b7cf0f10SNico Boehr 106b7cf0f10SNico Boehr report_prefix_pop(); 107b7cf0f10SNico Boehr return report_summary(); 108b7cf0f10SNico Boehr } 109