|
24 | 24 | #include <vdso/vsyscall.h> |
25 | 25 |
|
26 | 26 |
|
| 27 | +#define EXT_KEY(isa_arg, ext, pv, missing) \ |
| 28 | + do { \ |
| 29 | + if (__riscv_isa_extension_available(isa_arg, RISCV_ISA_EXT_##ext)) \ |
| 30 | + pv |= RISCV_HWPROBE_EXT_##ext; \ |
| 31 | + else \ |
| 32 | + missing |= RISCV_HWPROBE_EXT_##ext; \ |
| 33 | + } while (false) |
| 34 | + |
27 | 35 | static void hwprobe_arch_id(struct riscv_hwprobe *pair, |
28 | 36 | const struct cpumask *cpus) |
29 | 37 | { |
@@ -93,90 +101,109 @@ static void hwprobe_isa_ext0(struct riscv_hwprobe *pair, |
93 | 101 | for_each_cpu(cpu, cpus) { |
94 | 102 | struct riscv_isainfo *isainfo = &hart_isa[cpu]; |
95 | 103 |
|
96 | | -#define EXT_KEY(ext) \ |
97 | | - do { \ |
98 | | - if (__riscv_isa_extension_available(isainfo->isa, RISCV_ISA_EXT_##ext)) \ |
99 | | - pair->value |= RISCV_HWPROBE_EXT_##ext; \ |
100 | | - else \ |
101 | | - missing |= RISCV_HWPROBE_EXT_##ext; \ |
102 | | - } while (false) |
103 | | - |
104 | 104 | /* |
105 | 105 | * Only use EXT_KEY() for extensions which can be exposed to userspace, |
106 | 106 | * regardless of the kernel's configuration, as no other checks, besides |
107 | 107 | * presence in the hart_isa bitmap, are made. |
108 | 108 | */ |
109 | | - EXT_KEY(ZAAMO); |
110 | | - EXT_KEY(ZABHA); |
111 | | - EXT_KEY(ZACAS); |
112 | | - EXT_KEY(ZALASR); |
113 | | - EXT_KEY(ZALRSC); |
114 | | - EXT_KEY(ZAWRS); |
115 | | - EXT_KEY(ZBA); |
116 | | - EXT_KEY(ZBB); |
117 | | - EXT_KEY(ZBC); |
118 | | - EXT_KEY(ZBKB); |
119 | | - EXT_KEY(ZBKC); |
120 | | - EXT_KEY(ZBKX); |
121 | | - EXT_KEY(ZBS); |
122 | | - EXT_KEY(ZCA); |
123 | | - EXT_KEY(ZCB); |
124 | | - EXT_KEY(ZCLSD); |
125 | | - EXT_KEY(ZCMOP); |
126 | | - EXT_KEY(ZICBOM); |
127 | | - EXT_KEY(ZICBOP); |
128 | | - EXT_KEY(ZICBOZ); |
129 | | - EXT_KEY(ZICNTR); |
130 | | - EXT_KEY(ZICOND); |
131 | | - EXT_KEY(ZIHINTNTL); |
132 | | - EXT_KEY(ZIHINTPAUSE); |
133 | | - EXT_KEY(ZIHPM); |
134 | | - EXT_KEY(ZILSD); |
135 | | - EXT_KEY(ZIMOP); |
136 | | - EXT_KEY(ZKND); |
137 | | - EXT_KEY(ZKNE); |
138 | | - EXT_KEY(ZKNH); |
139 | | - EXT_KEY(ZKSED); |
140 | | - EXT_KEY(ZKSH); |
141 | | - EXT_KEY(ZKT); |
142 | | - EXT_KEY(ZTSO); |
| 109 | + EXT_KEY(isainfo->isa, ZAAMO, pair->value, missing); |
| 110 | + EXT_KEY(isainfo->isa, ZABHA, pair->value, missing); |
| 111 | + EXT_KEY(isainfo->isa, ZACAS, pair->value, missing); |
| 112 | + EXT_KEY(isainfo->isa, ZALASR, pair->value, missing); |
| 113 | + EXT_KEY(isainfo->isa, ZALRSC, pair->value, missing); |
| 114 | + EXT_KEY(isainfo->isa, ZAWRS, pair->value, missing); |
| 115 | + EXT_KEY(isainfo->isa, ZBA, pair->value, missing); |
| 116 | + EXT_KEY(isainfo->isa, ZBB, pair->value, missing); |
| 117 | + EXT_KEY(isainfo->isa, ZBC, pair->value, missing); |
| 118 | + EXT_KEY(isainfo->isa, ZBKB, pair->value, missing); |
| 119 | + EXT_KEY(isainfo->isa, ZBKC, pair->value, missing); |
| 120 | + EXT_KEY(isainfo->isa, ZBKX, pair->value, missing); |
| 121 | + EXT_KEY(isainfo->isa, ZBS, pair->value, missing); |
| 122 | + EXT_KEY(isainfo->isa, ZCA, pair->value, missing); |
| 123 | + EXT_KEY(isainfo->isa, ZCB, pair->value, missing); |
| 124 | + EXT_KEY(isainfo->isa, ZCLSD, pair->value, missing); |
| 125 | + EXT_KEY(isainfo->isa, ZCMOP, pair->value, missing); |
| 126 | + EXT_KEY(isainfo->isa, ZICBOM, pair->value, missing); |
| 127 | + EXT_KEY(isainfo->isa, ZICBOP, pair->value, missing); |
| 128 | + EXT_KEY(isainfo->isa, ZICBOZ, pair->value, missing); |
| 129 | + EXT_KEY(isainfo->isa, ZICNTR, pair->value, missing); |
| 130 | + EXT_KEY(isainfo->isa, ZICOND, pair->value, missing); |
| 131 | + EXT_KEY(isainfo->isa, ZIHINTNTL, pair->value, missing); |
| 132 | + EXT_KEY(isainfo->isa, ZIHINTPAUSE, pair->value, missing); |
| 133 | + EXT_KEY(isainfo->isa, ZIHPM, pair->value, missing); |
| 134 | + EXT_KEY(isainfo->isa, ZILSD, pair->value, missing); |
| 135 | + EXT_KEY(isainfo->isa, ZIMOP, pair->value, missing); |
| 136 | + EXT_KEY(isainfo->isa, ZKND, pair->value, missing); |
| 137 | + EXT_KEY(isainfo->isa, ZKNE, pair->value, missing); |
| 138 | + EXT_KEY(isainfo->isa, ZKNH, pair->value, missing); |
| 139 | + EXT_KEY(isainfo->isa, ZKSED, pair->value, missing); |
| 140 | + EXT_KEY(isainfo->isa, ZKSH, pair->value, missing); |
| 141 | + EXT_KEY(isainfo->isa, ZKT, pair->value, missing); |
| 142 | + EXT_KEY(isainfo->isa, ZTSO, pair->value, missing); |
143 | 143 |
|
144 | 144 | /* |
145 | 145 | * All the following extensions must depend on the kernel |
146 | 146 | * support of V. |
147 | 147 | */ |
148 | 148 | if (has_vector()) { |
149 | | - EXT_KEY(ZVBB); |
150 | | - EXT_KEY(ZVBC); |
151 | | - EXT_KEY(ZVE32F); |
152 | | - EXT_KEY(ZVE32X); |
153 | | - EXT_KEY(ZVE64D); |
154 | | - EXT_KEY(ZVE64F); |
155 | | - EXT_KEY(ZVE64X); |
156 | | - EXT_KEY(ZVFBFMIN); |
157 | | - EXT_KEY(ZVFBFWMA); |
158 | | - EXT_KEY(ZVFH); |
159 | | - EXT_KEY(ZVFHMIN); |
160 | | - EXT_KEY(ZVKB); |
161 | | - EXT_KEY(ZVKG); |
162 | | - EXT_KEY(ZVKNED); |
163 | | - EXT_KEY(ZVKNHA); |
164 | | - EXT_KEY(ZVKNHB); |
165 | | - EXT_KEY(ZVKSED); |
166 | | - EXT_KEY(ZVKSH); |
167 | | - EXT_KEY(ZVKT); |
| 149 | + EXT_KEY(isainfo->isa, ZVBB, pair->value, missing); |
| 150 | + EXT_KEY(isainfo->isa, ZVBC, pair->value, missing); |
| 151 | + EXT_KEY(isainfo->isa, ZVE32F, pair->value, missing); |
| 152 | + EXT_KEY(isainfo->isa, ZVE32X, pair->value, missing); |
| 153 | + EXT_KEY(isainfo->isa, ZVE64D, pair->value, missing); |
| 154 | + EXT_KEY(isainfo->isa, ZVE64F, pair->value, missing); |
| 155 | + EXT_KEY(isainfo->isa, ZVE64X, pair->value, missing); |
| 156 | + EXT_KEY(isainfo->isa, ZVFBFMIN, pair->value, missing); |
| 157 | + EXT_KEY(isainfo->isa, ZVFBFWMA, pair->value, missing); |
| 158 | + EXT_KEY(isainfo->isa, ZVFH, pair->value, missing); |
| 159 | + EXT_KEY(isainfo->isa, ZVFHMIN, pair->value, missing); |
| 160 | + EXT_KEY(isainfo->isa, ZVKB, pair->value, missing); |
| 161 | + EXT_KEY(isainfo->isa, ZVKG, pair->value, missing); |
| 162 | + EXT_KEY(isainfo->isa, ZVKNED, pair->value, missing); |
| 163 | + EXT_KEY(isainfo->isa, ZVKNHA, pair->value, missing); |
| 164 | + EXT_KEY(isainfo->isa, ZVKNHB, pair->value, missing); |
| 165 | + EXT_KEY(isainfo->isa, ZVKSED, pair->value, missing); |
| 166 | + EXT_KEY(isainfo->isa, ZVKSH, pair->value, missing); |
| 167 | + EXT_KEY(isainfo->isa, ZVKT, pair->value, missing); |
168 | 168 | } |
169 | 169 |
|
170 | | - EXT_KEY(ZCD); |
171 | | - EXT_KEY(ZCF); |
172 | | - EXT_KEY(ZFA); |
173 | | - EXT_KEY(ZFBFMIN); |
174 | | - EXT_KEY(ZFH); |
175 | | - EXT_KEY(ZFHMIN); |
| 170 | + EXT_KEY(isainfo->isa, ZCD, pair->value, missing); |
| 171 | + EXT_KEY(isainfo->isa, ZCF, pair->value, missing); |
| 172 | + EXT_KEY(isainfo->isa, ZFA, pair->value, missing); |
| 173 | + EXT_KEY(isainfo->isa, ZFBFMIN, pair->value, missing); |
| 174 | + EXT_KEY(isainfo->isa, ZFH, pair->value, missing); |
| 175 | + EXT_KEY(isainfo->isa, ZFHMIN, pair->value, missing); |
176 | 176 |
|
177 | 177 | if (IS_ENABLED(CONFIG_RISCV_ISA_SUPM)) |
178 | | - EXT_KEY(SUPM); |
179 | | -#undef EXT_KEY |
| 178 | + EXT_KEY(isainfo->isa, SUPM, pair->value, missing); |
| 179 | + } |
| 180 | + |
| 181 | + /* Now turn off reporting features if any CPU is missing it. */ |
| 182 | + pair->value &= ~missing; |
| 183 | +} |
| 184 | + |
| 185 | +static void hwprobe_isa_ext1(struct riscv_hwprobe *pair, |
| 186 | + const struct cpumask *cpus) |
| 187 | +{ |
| 188 | + int cpu; |
| 189 | + u64 missing = 0; |
| 190 | + |
| 191 | + pair->value = 0; |
| 192 | + |
| 193 | + /* |
| 194 | + * Loop through and record extensions that 1) anyone has, and 2) anyone |
| 195 | + * doesn't have. |
| 196 | + */ |
| 197 | + for_each_cpu(cpu, cpus) { |
| 198 | + /* struct riscv_isainfo *isainfo = &hart_isa[cpu]; */ |
| 199 | + |
| 200 | + /* |
| 201 | + * Only use EXT_KEY() for extensions which can be |
| 202 | + * exposed to userspace, regardless of the kernel's |
| 203 | + * configuration, as no other checks, besides presence |
| 204 | + * in the hart_isa bitmap, are made. |
| 205 | + */ |
| 206 | + /* Nothing here yet */ |
180 | 207 | } |
181 | 208 |
|
182 | 209 | /* Now turn off reporting features if any CPU is missing it. */ |
@@ -287,6 +314,10 @@ static void hwprobe_one_pair(struct riscv_hwprobe *pair, |
287 | 314 | hwprobe_isa_ext0(pair, cpus); |
288 | 315 | break; |
289 | 316 |
|
| 317 | + case RISCV_HWPROBE_KEY_IMA_EXT_1: |
| 318 | + hwprobe_isa_ext1(pair, cpus); |
| 319 | + break; |
| 320 | + |
290 | 321 | case RISCV_HWPROBE_KEY_CPUPERF_0: |
291 | 322 | case RISCV_HWPROBE_KEY_MISALIGNED_SCALAR_PERF: |
292 | 323 | pair->value = hwprobe_misaligned(cpus); |
|
0 commit comments