/* SPDX-License-Identifier: GPL-2.0-only */ /* * CMM tests (ESSA) * * Copyright (c) 2018 IBM Corp * * Authors: * Janosch Frank */ #include #include #include #include #include #include #include static uint8_t pagebuf[PAGE_SIZE] __attribute__((aligned(PAGE_SIZE))); extern int diag308_load_reset(u64); static void test_params(void) { report_prefix_push("invalid ORC 8"); expect_pgm_int(); essa(8, (unsigned long)pagebuf); check_pgm_int_code(PGM_INT_CODE_SPECIFICATION); report_prefix_pop(); } static void test_priv(void) { report_prefix_push("privileged"); expect_pgm_int(); enter_pstate(); essa(ESSA_GET_STATE, (unsigned long)pagebuf); check_pgm_int_code(PGM_INT_CODE_PRIVILEGED_OPERATION); report_prefix_pop(); } static void test_reset_no_translate(void) { const uint64_t mask_no_translate = BIT(63 - 58); unsigned long state; if (!test_facility(147)) { report_prefix_push("no-translate unavailable"); expect_pgm_int(); essa(ESSA_SET_STABLE_NODAT, (unsigned long)pagebuf); check_pgm_int_code(PGM_INT_CODE_SPECIFICATION); report_prefix_pop(); return; } report_prefix_push("reset no-translate"); essa(ESSA_SET_STABLE_NODAT, (unsigned long)pagebuf); state = essa(ESSA_GET_STATE, (unsigned long)pagebuf); report(state & mask_no_translate, "no-translate bit set before reset"); /* Load normal reset - includes subsystem reset */ diag308_load_reset(1); state = essa(ESSA_GET_STATE, (unsigned long)pagebuf); report(!(state & mask_no_translate), "no-translate bit unset after reset"); report_prefix_pop(); } int main(void) { bool has_essa = check_essa_available(); report_prefix_push("cmm"); if (!has_essa) { report_skip("ESSA is not available"); goto done; } test_priv(); test_params(); test_reset_no_translate(); done: report_prefix_pop(); return report_summary(); }