ZXFoundation™ 26h2
Loading...
Searching...
No Matches
features.cxxm
1/// SPDX-License-Identifier: Apache-2.0
2/// @file arch/s390x/cpu/features.cxxm
3/// @brief Centralized CPU facility registry — every facility bit the kernel
4/// cares about, cached from STFLE and queryable via has() / has_raw().
5
6export module arch.s390x.cpu.features;
7import zxfoundation.base.types;
8import lib.error;
9import std;
10
11export {
12
13namespace arch::s390x::cpu::features {
14
15 /// @brief Named CPU facility identifiers — STFLE bit numbers per
16 /// IBM z/Architecture PoP Appendix B (Figure 4-36).
17 enum class facility : u32 {
18 n3 = 0, ///< N3 instructions installed.
19 zarch_installed = 1, ///< z/Architecture architectural mode installed.
20 zarch_active = 2, ///< z/Architecture architectural mode active.
21 dat_enhancement = 3, ///< DAT-enhancement (IDTE, CSPG).
22 idte_segment_clear = 4, ///< IDTE selectively clears seg-table entries.
23 idte_region_clear = 5, ///< IDTE selectively clears region-table entries.
24 asn_lx_reuse = 6, ///< ASN-and-LX-Reuse (PC/PT).
25 stfle = 7, ///< STFLE instruction.
26 edat1 = 8, ///< Enhanced-DAT-1 (1 MiB large pages).
27 sense_run_status = 9, ///< Sense-Running-Status facility.
28 cond_sske = 10, ///< Conditional-SSKE facility.
29 configuration_topology = 11, ///< Configuration-topology facility.
30 ap_query_info = 12, ///< AP Query Configuration Information
31 ipte_range = 13, ///< IPTE-range facility.
32 nonquiescing_key_setting = 14, ///< Nonquiescing-key-setting facility.
33 ap_facility_test = 15, ///< AP Facilities Test
34 extended_translation_2 = 16, ///< Extended Translation facility 2
35 msa = 17, ///< Message-Security-Assist (KIMD/KLMD/KM).
36 long_displacement = 18, ///< Long-displacement facility.
37 long_displacement_hi_perf = 19, ///< Long-displacement facility high performance. (If )
38 hfp_madd_sub = 20, ///< HFP-multiply-and-add/subtract.
39 eimm = 21, ///< Extended-immediate facility.
40 extended_translation_3 = 22, ///< Extended-translation facility 3.
41 hfp_unnorm_ext = 23, ///< HFP-unnormalized-extension facility.
42 etf2_enhancement = 24, ///< ETF2-Enhancement facility.
43 store_clock_fast = 25, ///< Store-clock-fast (STCKF).
44 parsing_enhancement = 26, ///< Parsing-Enhancement facility.
45 mvcos = 27, ///< Move-with-Optional-Specifications.
46 tod_clock_steering = 28, ///< TOD-clock-steering facility.
47 etf3_enhancement = 30, ///< ETF3-Enhancement facility
48 extract_cpu_time = 31, ///< Extract CPU Time facility.
49 cmp_swap_and_store = 32, ///< Compare-and-Swap-and-Store facility.
50 cmp_swap_and_store_2 = 33, ///< Compare-and-Swap-and-Store facility 2.
51 gen_inst_ext = 34, ///< General-instructions-extension facility.
52 execute_ext = 35, ///< Execute-extensions facility.
53 enhanced_monitor = 36, ///< Enhanced Monitor facility.
54 fp_extension = 37, ///< Floating-point-extension facility.
55 order_preserving_compression= 38, ///< Order-Preserving-Compression facility.
56 load_program_params = 40, ///< Load-program-parameters facility.
57 fp_support_enh = 41, ///< Floating-point-support-enhancement facilities.
58 dfp = 42, ///< DFP (decimal-floating-point) facility.
59 dfp_high_performance = 43, ///< DFP facility has high performance.
60 pfpo = 44, ///< PFPO instruction.
61 distinct_operands = 45, ///< Distinct-operands, fast-BCR, highword, popcount, interlocked-access 1, load/store-on-cond 1.
62 cmpsc_enhancement = 47, ///< CMPSC-Enhancement facility.
63 decimal_fp_zoned_conversion = 48, ///< Decimal-Floating-Point Zoned-Conversion facility.
64 misc_inst_ext1 = 49, ///< Miscellaneous-instruction-extensions 1 (exec-hint, load-and-trap, PAI).
65 constr_te = 50, ///< Constrained Transactional-Execution.
66 local_tlb_clearing = 51, ///< Local-TLB-clearing facility.
67 interlocked_access_2 = 52, ///< Interlocked-Access facility 2.
68 load_store_on_cond_2 = 53, ///< Load/store-on-condition 2 + load-and-zero-rightmost-byte.
69 entropy_encoding_compression= 54, ///< Entropy-Encoding Compression facility.
70 msa_ext5 = 57, ///< MSA extension 5.
71 misc_inst_ext2 = 58, ///< Miscellaneous-instruction-extensions 2.
72 misc_inst_ext3 = 61, ///< Miscellaneous-instruction-extensions 3.
73 reset_ref_bits_multiple = 66, ///< Reset-Reference-Bits-Multiple facility.
74 cpu_meas_counter = 67, ///< CPU-measurement counter facility.
75 cpu_meas_sampling = 68, ///< CPU-measurement sampling facility.
76 transactional_exec = 73, ///< Transactional-Execution.
77 store_hypervisor_info = 74, ///< Store-hypervisor-information facility.
78 access_exc_fetch_store_ind = 75, ///< Access-exception-fetch/store indication
79 msa_ext3 = 76, ///< MSA extension 3.
80 msa_ext4 = 77, ///< MSA extension 4.
81 edat2 = 78, ///< Enhanced-DAT-2 (2 GiB large pages).
82 dfp_packed_conversion = 80, ///< Decimal-floating-point packed-conversion facility.
83 ppa_in_order = 81, ///< PPA-in-order facility.
84 misc_inst_ext4 = 84, ///< Miscellaneous-instruction-extensions 4.
85 sequential_inst_fetching = 85, ///< Sequential-Instruction-Fetching facility.
86 msa_ext12 = 86, ///< Message-Security-Assist Extension 12
87 plo_ext = 87, ///< PLO-Extension facility.
88 vector = 129, ///< Vector facility for z/Architecture.
89 instruction_exec_protection = 130, ///< Instruction-Execution-Protection facility
90 side_effect_access = 131, ///< Side-Effect-Access facility and Enhanced-Suppression-On-Protection facility.
91 guarded_storage = 133, ///< Guarded-storage facility.
92 vector_packed_decimal = 134, ///< Vector-Packed-Decimal facility (implies 129).
93 vector_enh1 = 135, ///< Vector-Enhancements facility 1 (implies 129).
94 config_zarch_arch_mode = 138, ///< Configuration-z/Architecture-architectural-mode.
95 multiple_epoch = 139, ///< Multiple-epoch facility (implies 25, 28).
96 store_cpu_counter_multiple = 142, ///< Store-CPU-counter-multiple facility.
97 test_pending_ext_int = 144, ///< Test-pending-external-interruption facility.
98 insert_ref_bits_multiple = 145, ///< Insert-Reference-Bits-Multiple facility.
99 msa_ext8 = 146, ///< Message-Security-Assist Extension 8.
100 vector_enh2 = 148, ///< Vector-Enhancements facility 2 (implies 129, 135).
101 move_page_and_set_key = 149, ///< Move-Page-and-Set-Key facility (implies bit 14).
102 enhanced_sort = 150, ///< Enhanced sort facility.
103 deflate_conversion = 151, ///< DEFLATE-conversion facility.
104 vector_packed_decimal_enh = 152, ///< Vector-Packed-Decimal-Enhancement (implies 129, 134).
105 msa_ext9 = 155, ///< MSA extension 9 (implies 76, 77).
106 ultravisor_call = 158, ///< Ultravisor-Call facility.
107 secure_execution_unpack = 161, ///< Secure-Execution-Unpack facility.
108 nnpa = 165, ///< Neural-Network-Processing-Assist.
109 esa390_compat_mode = 168, ///< ESA/390-Compatibility-Mode facility.
110 skey_removal = 169, ///< Storage-Key Removal facility.
111 ineff_nonconstrained_transaction = 170, ///< Ineffective-nonconstrained-transaction facility
112 vector_packed_decimal_2 = 192, ///< Vector-Packed-Decimal Enhancement facility 2
113 bear = 193, ///< Bare enhancement facility.
114 reset_dat_protection = 194, ///< Reset-Dat-Protection facility.
115 proc_activity_inst = 196, ///< Processor-Activity-Instrumentation facility.
116 proc_activity_inst_ext1 = 197, ///< Processor-Activity-Instrumentation-Extension 1 facility.
117 vector_enhancements_3 = 198, ///< Vector-Enhancements facility 3.
118 vector_packed_decimal_3 = 199, ///< Vector-Packed-Decimal Enhancement facility 3
119 concurrent_funcs = 201, ///< concurrent-functions facility.
120 };
121
122 constexpr auto STFLE_MAX_DWORDS = 32;
123
124 /// @brief Detect CPU facilities using STFLE.
125 /// @param fac_list A span pointing to the output buffer.
126 /// @return Actual number of doublewords stored, or a kernel error.
127 template <usize Extent = STFLE_MAX_DWORDS>
128 requires (Extent > 0 && Extent <= STFLE_MAX_DWORDS)
129 auto detect(std::span<u64, Extent> fac_list) noexcept -> std::expected<u32, lib::kernel_error> {
130
131 std::fill(fac_list.begin(), fac_list.end(), 0ULL);
132
133 register u64 r0 __asm__("0") = fac_list.size() - 1U;
134 register u64 r1 __asm__("1") = reinterpret_cast<u64>(fac_list.data());
135 condition_code cc;
136
137 __asm__ volatile (
138 " .insn s,0xb2b00000,0(%[addr])\n"
139 " ipm %[cc]\n"
140 " srl %[cc],28\n"
141 : [cc] "=d" (cc), "+d" (r0)
142 : [addr] "a" (r1)
143 : "cc", "memory"
144 );
145
146 if (cc == 3) [[unlikely]] {
147 return std::unexpected(lib::kernel_error::from_arch(lib::arch_error::code::stfle_failed));
148 }
149
150 return static_cast<u32>(r0 + 1U);
151 }
152
153 /// @brief Initialize the CPU features cache.
154 /// @param[in] stfle_fac Pointer to the STFLE doubleword array
155 auto init(std::optional<const u64*> stfle_fac) noexcept -> void;
156
157 /// @brief Query whether a specific named facility is available.
158 [[nodiscard]] auto has(facility f) noexcept -> bool;
159
160 /// @brief Query a raw STFLE bit by number (for facility bits not in the enum).
161 [[nodiscard]] auto has_raw(u32 bit) noexcept -> bool;
162
163 /// @brief Enable hardware facilities (AFP, Vector) in CR0 for the current CPU.
164 auto enable_hardware_facilities() noexcept -> void;
165
166} // namespace arch::s390x::cpu::features
167
168} // end export