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
test_tprot_rw(void)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
test_tprot_ro(void)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
test_tprot_low_addr_prot(void)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
test_tprot_transl_unavail(void)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
test_tprot_transl_pte_bit52_set(void)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
main(void)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