/* SPDX-License-Identifier: GPL-2.0-only */ /* * Test the known dependencies for facilities * * Copyright 2019, 2021 IBM Corp. * * Authors: * Christian Borntraeger * Janosch Frank */ #include #include #include #include #include static void test_sclp_missing_sief2_implications(void) { /* Virtualization related facilities */ report(!sclp_facilities.has_64bscao, "!64bscao"); report(!sclp_facilities.has_pfmfi, "!pfmfi"); report(!sclp_facilities.has_gsls, "!gsls"); report(!sclp_facilities.has_cmma, "!cmma"); report(!sclp_facilities.has_esca, "!esca"); report(!sclp_facilities.has_kss, "!kss"); report(!sclp_facilities.has_ibs, "!ibs"); /* Virtualization related facilities reported via CPU entries */ report(!sclp_facilities.has_sigpif, "!sigpif"); report(!sclp_facilities.has_sief2, "!sief2"); report(!sclp_facilities.has_skeyi, "!skeyi"); report(!sclp_facilities.has_siif, "!siif"); report(!sclp_facilities.has_cei, "!cei"); report(!sclp_facilities.has_ib, "!ib"); } static void test_sclp_features_fmt4(void) { /* * STFLE facilities are handled by the Ultravisor but SCLP * facilities are advertised by the hypervisor. */ report_prefix_push("PV guest implies"); /* General facilities */ report(!sclp_facilities.has_diag318, "!diag318"); /* * Virtualization related facilities, all of which are * unavailable because there's no virtualization support in a * protected guest. */ test_sclp_missing_sief2_implications(); report_prefix_pop(); } static void test_sclp_features_fmt2(void) { if (sclp_facilities.has_sief2) return; report_prefix_push("!sief2 implies"); test_sclp_missing_sief2_implications(); report_prefix_pop(); } static void test_sclp_features(void) { report_prefix_push("sclp"); if (uv_os_is_guest()) test_sclp_features_fmt4(); else test_sclp_features_fmt2(); report_prefix_pop(); } static struct { int facility; int implied; bool expected_tcg_fail; } dep[] = { /* from SA22-7832-11 4-98 facility indications */ { 4, 3 }, { 5, 3 }, { 5, 4 }, { 19, 18 }, { 37, 42, true }, /* TCG does not have DFP and won't get it soon */ { 43, 42 }, { 73, 49 }, { 134, 129 }, { 135, 129 }, { 139, 25 }, { 139, 28 }, { 146, 76 }, /* indirectly documented in description */ { 78, 8 }, /* EDAT */ /* new dependencies from gen15 */ { 61, 45 }, { 148, 129 }, { 148, 135 }, { 152, 129 }, { 152, 134 }, { 155, 76 }, { 155, 77 }, }; int main(void) { int i; report_prefix_push("cpumodel"); report_prefix_push("dependency"); for (i = 0; i < ARRAY_SIZE(dep); i++) { report_prefix_pushf("%d implies %d", dep[i].facility, dep[i].implied); if (test_facility(dep[i].facility)) { report_xfail(dep[i].expected_tcg_fail && host_is_tcg(), test_facility(dep[i].implied), "implication not correct"); } else { report_skip("facility %d not present", dep[i].facility); } report_prefix_pop(); } report_prefix_pop(); test_sclp_features(); report_prefix_pop(); return report_summary(); }