Lines Matching +full:cs +full:- +full:0

1 /* SPDX-License-Identifier: GPL-2.0-or-later */
11 #include "asm-loongarch/kvm_para.h"
14 #include "qemu/error-report.h"
15 #include "qemu/main-loop.h"
21 #include "exec/address-spaces.h"
28 #include "cpu-csr.h"
38 static int kvm_get_stealtime(CPUState *cs) in kvm_get_stealtime() argument
40 CPULoongArchState *env = cpu_env(cs); in kvm_get_stealtime()
45 .addr = (uint64_t)&env->stealtime.guest_addr, in kvm_get_stealtime()
48 err = kvm_vcpu_ioctl(cs, KVM_HAS_DEVICE_ATTR, attr); in kvm_get_stealtime()
50 return 0; in kvm_get_stealtime()
53 err = kvm_vcpu_ioctl(cs, KVM_GET_DEVICE_ATTR, attr); in kvm_get_stealtime()
59 return 0; in kvm_get_stealtime()
62 static int kvm_set_stealtime(CPUState *cs) in kvm_set_stealtime() argument
64 CPULoongArchState *env = cpu_env(cs); in kvm_set_stealtime()
69 .addr = (uint64_t)&env->stealtime.guest_addr, in kvm_set_stealtime()
72 err = kvm_vcpu_ioctl(cs, KVM_HAS_DEVICE_ATTR, attr); in kvm_set_stealtime()
74 return 0; in kvm_set_stealtime()
77 err = kvm_vcpu_ioctl(cs, KVM_SET_DEVICE_ATTR, attr); in kvm_set_stealtime()
80 strerror(errno), env->stealtime.guest_addr); in kvm_set_stealtime()
84 return 0; in kvm_set_stealtime()
87 static int kvm_set_pv_features(CPUState *cs) in kvm_set_pv_features() argument
89 CPULoongArchState *env = cpu_env(cs); in kvm_set_pv_features()
98 err = kvm_vcpu_ioctl(cs, KVM_HAS_DEVICE_ATTR, attr); in kvm_set_pv_features()
100 return 0; in kvm_set_pv_features()
103 val = env->pv_features; in kvm_set_pv_features()
104 err = kvm_vcpu_ioctl(cs, KVM_SET_DEVICE_ATTR, attr); in kvm_set_pv_features()
111 return 0; in kvm_set_pv_features()
114 static int kvm_loongarch_get_regs_core(CPUState *cs) in kvm_loongarch_get_regs_core() argument
116 int ret = 0; in kvm_loongarch_get_regs_core()
119 CPULoongArchState *env = cpu_env(cs); in kvm_loongarch_get_regs_core()
122 ret = kvm_vcpu_ioctl(cs, KVM_GET_REGS, &regs); in kvm_loongarch_get_regs_core()
123 if (ret < 0) { in kvm_loongarch_get_regs_core()
127 /* gpr[0] value is always 0 */ in kvm_loongarch_get_regs_core()
128 env->gpr[0] = 0; in kvm_loongarch_get_regs_core()
130 env->gpr[i] = regs.gpr[i]; in kvm_loongarch_get_regs_core()
133 env->pc = regs.pc; in kvm_loongarch_get_regs_core()
137 static int kvm_loongarch_put_regs_core(CPUState *cs) in kvm_loongarch_put_regs_core() argument
139 int ret = 0; in kvm_loongarch_put_regs_core()
142 CPULoongArchState *env = cpu_env(cs); in kvm_loongarch_put_regs_core()
145 for (i = 0; i < 32; i++) { in kvm_loongarch_put_regs_core()
146 regs.gpr[i] = env->gpr[i]; in kvm_loongarch_put_regs_core()
149 regs.pc = env->pc; in kvm_loongarch_put_regs_core()
150 ret = kvm_vcpu_ioctl(cs, KVM_SET_REGS, &regs); in kvm_loongarch_put_regs_core()
151 if (ret < 0) { in kvm_loongarch_put_regs_core()
158 static int kvm_loongarch_get_csr(CPUState *cs) in kvm_loongarch_get_csr() argument
160 int ret = 0; in kvm_loongarch_get_csr()
161 CPULoongArchState *env = cpu_env(cs); in kvm_loongarch_get_csr()
163 ret |= kvm_get_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_CRMD), in kvm_loongarch_get_csr()
164 &env->CSR_CRMD); in kvm_loongarch_get_csr()
166 ret |= kvm_get_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_PRMD), in kvm_loongarch_get_csr()
167 &env->CSR_PRMD); in kvm_loongarch_get_csr()
169 ret |= kvm_get_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_EUEN), in kvm_loongarch_get_csr()
170 &env->CSR_EUEN); in kvm_loongarch_get_csr()
172 ret |= kvm_get_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_MISC), in kvm_loongarch_get_csr()
173 &env->CSR_MISC); in kvm_loongarch_get_csr()
175 ret |= kvm_get_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_ECFG), in kvm_loongarch_get_csr()
176 &env->CSR_ECFG); in kvm_loongarch_get_csr()
178 ret |= kvm_get_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_ESTAT), in kvm_loongarch_get_csr()
179 &env->CSR_ESTAT); in kvm_loongarch_get_csr()
181 ret |= kvm_get_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_ERA), in kvm_loongarch_get_csr()
182 &env->CSR_ERA); in kvm_loongarch_get_csr()
184 ret |= kvm_get_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_BADV), in kvm_loongarch_get_csr()
185 &env->CSR_BADV); in kvm_loongarch_get_csr()
187 ret |= kvm_get_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_BADI), in kvm_loongarch_get_csr()
188 &env->CSR_BADI); in kvm_loongarch_get_csr()
190 ret |= kvm_get_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_EENTRY), in kvm_loongarch_get_csr()
191 &env->CSR_EENTRY); in kvm_loongarch_get_csr()
193 ret |= kvm_get_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_TLBIDX), in kvm_loongarch_get_csr()
194 &env->CSR_TLBIDX); in kvm_loongarch_get_csr()
196 ret |= kvm_get_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_TLBEHI), in kvm_loongarch_get_csr()
197 &env->CSR_TLBEHI); in kvm_loongarch_get_csr()
199 ret |= kvm_get_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_TLBELO0), in kvm_loongarch_get_csr()
200 &env->CSR_TLBELO0); in kvm_loongarch_get_csr()
202 ret |= kvm_get_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_TLBELO1), in kvm_loongarch_get_csr()
203 &env->CSR_TLBELO1); in kvm_loongarch_get_csr()
205 ret |= kvm_get_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_ASID), in kvm_loongarch_get_csr()
206 &env->CSR_ASID); in kvm_loongarch_get_csr()
208 ret |= kvm_get_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_PGDL), in kvm_loongarch_get_csr()
209 &env->CSR_PGDL); in kvm_loongarch_get_csr()
211 ret |= kvm_get_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_PGDH), in kvm_loongarch_get_csr()
212 &env->CSR_PGDH); in kvm_loongarch_get_csr()
214 ret |= kvm_get_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_PGD), in kvm_loongarch_get_csr()
215 &env->CSR_PGD); in kvm_loongarch_get_csr()
217 ret |= kvm_get_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_PWCL), in kvm_loongarch_get_csr()
218 &env->CSR_PWCL); in kvm_loongarch_get_csr()
220 ret |= kvm_get_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_PWCH), in kvm_loongarch_get_csr()
221 &env->CSR_PWCH); in kvm_loongarch_get_csr()
223 ret |= kvm_get_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_STLBPS), in kvm_loongarch_get_csr()
224 &env->CSR_STLBPS); in kvm_loongarch_get_csr()
226 ret |= kvm_get_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_RVACFG), in kvm_loongarch_get_csr()
227 &env->CSR_RVACFG); in kvm_loongarch_get_csr()
229 ret |= kvm_get_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_CPUID), in kvm_loongarch_get_csr()
230 &env->CSR_CPUID); in kvm_loongarch_get_csr()
232 ret |= kvm_get_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_PRCFG1), in kvm_loongarch_get_csr()
233 &env->CSR_PRCFG1); in kvm_loongarch_get_csr()
235 ret |= kvm_get_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_PRCFG2), in kvm_loongarch_get_csr()
236 &env->CSR_PRCFG2); in kvm_loongarch_get_csr()
238 ret |= kvm_get_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_PRCFG3), in kvm_loongarch_get_csr()
239 &env->CSR_PRCFG3); in kvm_loongarch_get_csr()
241 ret |= kvm_get_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_SAVE(0)), in kvm_loongarch_get_csr()
242 &env->CSR_SAVE[0]); in kvm_loongarch_get_csr()
244 ret |= kvm_get_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_SAVE(1)), in kvm_loongarch_get_csr()
245 &env->CSR_SAVE[1]); in kvm_loongarch_get_csr()
247 ret |= kvm_get_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_SAVE(2)), in kvm_loongarch_get_csr()
248 &env->CSR_SAVE[2]); in kvm_loongarch_get_csr()
250 ret |= kvm_get_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_SAVE(3)), in kvm_loongarch_get_csr()
251 &env->CSR_SAVE[3]); in kvm_loongarch_get_csr()
253 ret |= kvm_get_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_SAVE(4)), in kvm_loongarch_get_csr()
254 &env->CSR_SAVE[4]); in kvm_loongarch_get_csr()
256 ret |= kvm_get_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_SAVE(5)), in kvm_loongarch_get_csr()
257 &env->CSR_SAVE[5]); in kvm_loongarch_get_csr()
259 ret |= kvm_get_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_SAVE(6)), in kvm_loongarch_get_csr()
260 &env->CSR_SAVE[6]); in kvm_loongarch_get_csr()
262 ret |= kvm_get_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_SAVE(7)), in kvm_loongarch_get_csr()
263 &env->CSR_SAVE[7]); in kvm_loongarch_get_csr()
265 ret |= kvm_get_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_TID), in kvm_loongarch_get_csr()
266 &env->CSR_TID); in kvm_loongarch_get_csr()
268 ret |= kvm_get_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_CNTC), in kvm_loongarch_get_csr()
269 &env->CSR_CNTC); in kvm_loongarch_get_csr()
271 ret |= kvm_get_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_TICLR), in kvm_loongarch_get_csr()
272 &env->CSR_TICLR); in kvm_loongarch_get_csr()
274 ret |= kvm_get_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_LLBCTL), in kvm_loongarch_get_csr()
275 &env->CSR_LLBCTL); in kvm_loongarch_get_csr()
277 ret |= kvm_get_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_IMPCTL1), in kvm_loongarch_get_csr()
278 &env->CSR_IMPCTL1); in kvm_loongarch_get_csr()
280 ret |= kvm_get_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_IMPCTL2), in kvm_loongarch_get_csr()
281 &env->CSR_IMPCTL2); in kvm_loongarch_get_csr()
283 ret |= kvm_get_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_TLBRENTRY), in kvm_loongarch_get_csr()
284 &env->CSR_TLBRENTRY); in kvm_loongarch_get_csr()
286 ret |= kvm_get_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_TLBRBADV), in kvm_loongarch_get_csr()
287 &env->CSR_TLBRBADV); in kvm_loongarch_get_csr()
289 ret |= kvm_get_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_TLBRERA), in kvm_loongarch_get_csr()
290 &env->CSR_TLBRERA); in kvm_loongarch_get_csr()
292 ret |= kvm_get_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_TLBRSAVE), in kvm_loongarch_get_csr()
293 &env->CSR_TLBRSAVE); in kvm_loongarch_get_csr()
295 ret |= kvm_get_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_TLBRELO0), in kvm_loongarch_get_csr()
296 &env->CSR_TLBRELO0); in kvm_loongarch_get_csr()
298 ret |= kvm_get_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_TLBRELO1), in kvm_loongarch_get_csr()
299 &env->CSR_TLBRELO1); in kvm_loongarch_get_csr()
301 ret |= kvm_get_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_TLBREHI), in kvm_loongarch_get_csr()
302 &env->CSR_TLBREHI); in kvm_loongarch_get_csr()
304 ret |= kvm_get_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_TLBRPRMD), in kvm_loongarch_get_csr()
305 &env->CSR_TLBRPRMD); in kvm_loongarch_get_csr()
307 ret |= kvm_get_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_DMW(0)), in kvm_loongarch_get_csr()
308 &env->CSR_DMW[0]); in kvm_loongarch_get_csr()
310 ret |= kvm_get_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_DMW(1)), in kvm_loongarch_get_csr()
311 &env->CSR_DMW[1]); in kvm_loongarch_get_csr()
313 ret |= kvm_get_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_DMW(2)), in kvm_loongarch_get_csr()
314 &env->CSR_DMW[2]); in kvm_loongarch_get_csr()
316 ret |= kvm_get_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_DMW(3)), in kvm_loongarch_get_csr()
317 &env->CSR_DMW[3]); in kvm_loongarch_get_csr()
319 ret |= kvm_get_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_TVAL), in kvm_loongarch_get_csr()
320 &env->CSR_TVAL); in kvm_loongarch_get_csr()
322 ret |= kvm_get_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_TCFG), in kvm_loongarch_get_csr()
323 &env->CSR_TCFG); in kvm_loongarch_get_csr()
328 static int kvm_loongarch_put_csr(CPUState *cs, int level) in kvm_loongarch_put_csr() argument
330 int ret = 0; in kvm_loongarch_put_csr()
331 CPULoongArchState *env = cpu_env(cs); in kvm_loongarch_put_csr()
333 ret |= kvm_set_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_CRMD), in kvm_loongarch_put_csr()
334 &env->CSR_CRMD); in kvm_loongarch_put_csr()
336 ret |= kvm_set_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_PRMD), in kvm_loongarch_put_csr()
337 &env->CSR_PRMD); in kvm_loongarch_put_csr()
339 ret |= kvm_set_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_EUEN), in kvm_loongarch_put_csr()
340 &env->CSR_EUEN); in kvm_loongarch_put_csr()
342 ret |= kvm_set_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_MISC), in kvm_loongarch_put_csr()
343 &env->CSR_MISC); in kvm_loongarch_put_csr()
345 ret |= kvm_set_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_ECFG), in kvm_loongarch_put_csr()
346 &env->CSR_ECFG); in kvm_loongarch_put_csr()
348 ret |= kvm_set_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_ESTAT), in kvm_loongarch_put_csr()
349 &env->CSR_ESTAT); in kvm_loongarch_put_csr()
351 ret |= kvm_set_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_ERA), in kvm_loongarch_put_csr()
352 &env->CSR_ERA); in kvm_loongarch_put_csr()
354 ret |= kvm_set_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_BADV), in kvm_loongarch_put_csr()
355 &env->CSR_BADV); in kvm_loongarch_put_csr()
357 ret |= kvm_set_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_BADI), in kvm_loongarch_put_csr()
358 &env->CSR_BADI); in kvm_loongarch_put_csr()
360 ret |= kvm_set_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_EENTRY), in kvm_loongarch_put_csr()
361 &env->CSR_EENTRY); in kvm_loongarch_put_csr()
363 ret |= kvm_set_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_TLBIDX), in kvm_loongarch_put_csr()
364 &env->CSR_TLBIDX); in kvm_loongarch_put_csr()
366 ret |= kvm_set_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_TLBEHI), in kvm_loongarch_put_csr()
367 &env->CSR_TLBEHI); in kvm_loongarch_put_csr()
369 ret |= kvm_set_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_TLBELO0), in kvm_loongarch_put_csr()
370 &env->CSR_TLBELO0); in kvm_loongarch_put_csr()
372 ret |= kvm_set_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_TLBELO1), in kvm_loongarch_put_csr()
373 &env->CSR_TLBELO1); in kvm_loongarch_put_csr()
375 ret |= kvm_set_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_ASID), in kvm_loongarch_put_csr()
376 &env->CSR_ASID); in kvm_loongarch_put_csr()
378 ret |= kvm_set_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_PGDL), in kvm_loongarch_put_csr()
379 &env->CSR_PGDL); in kvm_loongarch_put_csr()
381 ret |= kvm_set_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_PGDH), in kvm_loongarch_put_csr()
382 &env->CSR_PGDH); in kvm_loongarch_put_csr()
384 ret |= kvm_set_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_PGD), in kvm_loongarch_put_csr()
385 &env->CSR_PGD); in kvm_loongarch_put_csr()
387 ret |= kvm_set_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_PWCL), in kvm_loongarch_put_csr()
388 &env->CSR_PWCL); in kvm_loongarch_put_csr()
390 ret |= kvm_set_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_PWCH), in kvm_loongarch_put_csr()
391 &env->CSR_PWCH); in kvm_loongarch_put_csr()
393 ret |= kvm_set_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_STLBPS), in kvm_loongarch_put_csr()
394 &env->CSR_STLBPS); in kvm_loongarch_put_csr()
396 ret |= kvm_set_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_RVACFG), in kvm_loongarch_put_csr()
397 &env->CSR_RVACFG); in kvm_loongarch_put_csr()
401 ret |= kvm_set_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_CPUID), in kvm_loongarch_put_csr()
402 &env->CSR_CPUID); in kvm_loongarch_put_csr()
405 ret |= kvm_set_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_PRCFG1), in kvm_loongarch_put_csr()
406 &env->CSR_PRCFG1); in kvm_loongarch_put_csr()
408 ret |= kvm_set_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_PRCFG2), in kvm_loongarch_put_csr()
409 &env->CSR_PRCFG2); in kvm_loongarch_put_csr()
411 ret |= kvm_set_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_PRCFG3), in kvm_loongarch_put_csr()
412 &env->CSR_PRCFG3); in kvm_loongarch_put_csr()
414 ret |= kvm_set_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_SAVE(0)), in kvm_loongarch_put_csr()
415 &env->CSR_SAVE[0]); in kvm_loongarch_put_csr()
417 ret |= kvm_set_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_SAVE(1)), in kvm_loongarch_put_csr()
418 &env->CSR_SAVE[1]); in kvm_loongarch_put_csr()
420 ret |= kvm_set_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_SAVE(2)), in kvm_loongarch_put_csr()
421 &env->CSR_SAVE[2]); in kvm_loongarch_put_csr()
423 ret |= kvm_set_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_SAVE(3)), in kvm_loongarch_put_csr()
424 &env->CSR_SAVE[3]); in kvm_loongarch_put_csr()
426 ret |= kvm_set_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_SAVE(4)), in kvm_loongarch_put_csr()
427 &env->CSR_SAVE[4]); in kvm_loongarch_put_csr()
429 ret |= kvm_set_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_SAVE(5)), in kvm_loongarch_put_csr()
430 &env->CSR_SAVE[5]); in kvm_loongarch_put_csr()
432 ret |= kvm_set_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_SAVE(6)), in kvm_loongarch_put_csr()
433 &env->CSR_SAVE[6]); in kvm_loongarch_put_csr()
435 ret |= kvm_set_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_SAVE(7)), in kvm_loongarch_put_csr()
436 &env->CSR_SAVE[7]); in kvm_loongarch_put_csr()
438 ret |= kvm_set_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_TID), in kvm_loongarch_put_csr()
439 &env->CSR_TID); in kvm_loongarch_put_csr()
441 ret |= kvm_set_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_CNTC), in kvm_loongarch_put_csr()
442 &env->CSR_CNTC); in kvm_loongarch_put_csr()
444 ret |= kvm_set_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_TICLR), in kvm_loongarch_put_csr()
445 &env->CSR_TICLR); in kvm_loongarch_put_csr()
447 ret |= kvm_set_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_LLBCTL), in kvm_loongarch_put_csr()
448 &env->CSR_LLBCTL); in kvm_loongarch_put_csr()
450 ret |= kvm_set_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_IMPCTL1), in kvm_loongarch_put_csr()
451 &env->CSR_IMPCTL1); in kvm_loongarch_put_csr()
453 ret |= kvm_set_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_IMPCTL2), in kvm_loongarch_put_csr()
454 &env->CSR_IMPCTL2); in kvm_loongarch_put_csr()
456 ret |= kvm_set_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_TLBRENTRY), in kvm_loongarch_put_csr()
457 &env->CSR_TLBRENTRY); in kvm_loongarch_put_csr()
459 ret |= kvm_set_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_TLBRBADV), in kvm_loongarch_put_csr()
460 &env->CSR_TLBRBADV); in kvm_loongarch_put_csr()
462 ret |= kvm_set_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_TLBRERA), in kvm_loongarch_put_csr()
463 &env->CSR_TLBRERA); in kvm_loongarch_put_csr()
465 ret |= kvm_set_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_TLBRSAVE), in kvm_loongarch_put_csr()
466 &env->CSR_TLBRSAVE); in kvm_loongarch_put_csr()
468 ret |= kvm_set_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_TLBRELO0), in kvm_loongarch_put_csr()
469 &env->CSR_TLBRELO0); in kvm_loongarch_put_csr()
471 ret |= kvm_set_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_TLBRELO1), in kvm_loongarch_put_csr()
472 &env->CSR_TLBRELO1); in kvm_loongarch_put_csr()
474 ret |= kvm_set_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_TLBREHI), in kvm_loongarch_put_csr()
475 &env->CSR_TLBREHI); in kvm_loongarch_put_csr()
477 ret |= kvm_set_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_TLBRPRMD), in kvm_loongarch_put_csr()
478 &env->CSR_TLBRPRMD); in kvm_loongarch_put_csr()
480 ret |= kvm_set_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_DMW(0)), in kvm_loongarch_put_csr()
481 &env->CSR_DMW[0]); in kvm_loongarch_put_csr()
483 ret |= kvm_set_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_DMW(1)), in kvm_loongarch_put_csr()
484 &env->CSR_DMW[1]); in kvm_loongarch_put_csr()
486 ret |= kvm_set_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_DMW(2)), in kvm_loongarch_put_csr()
487 &env->CSR_DMW[2]); in kvm_loongarch_put_csr()
489 ret |= kvm_set_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_DMW(3)), in kvm_loongarch_put_csr()
490 &env->CSR_DMW[3]); in kvm_loongarch_put_csr()
495 ret |= kvm_set_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_TVAL), in kvm_loongarch_put_csr()
496 &env->CSR_TVAL); in kvm_loongarch_put_csr()
498 ret |= kvm_set_one_reg(cs, KVM_IOC_CSRID(LOONGARCH_CSR_TCFG), in kvm_loongarch_put_csr()
499 &env->CSR_TCFG); in kvm_loongarch_put_csr()
503 static int kvm_loongarch_get_regs_fp(CPUState *cs) in kvm_loongarch_get_regs_fp() argument
507 CPULoongArchState *env = cpu_env(cs); in kvm_loongarch_get_regs_fp()
509 ret = kvm_vcpu_ioctl(cs, KVM_GET_FPU, &fpu); in kvm_loongarch_get_regs_fp()
510 if (ret < 0) { in kvm_loongarch_get_regs_fp()
515 env->fcsr0 = fpu.fcsr; in kvm_loongarch_get_regs_fp()
516 for (i = 0; i < 32; i++) { in kvm_loongarch_get_regs_fp()
517 env->fpr[i].vreg.UD[0] = fpu.fpr[i].val64[0]; in kvm_loongarch_get_regs_fp()
518 env->fpr[i].vreg.UD[1] = fpu.fpr[i].val64[1]; in kvm_loongarch_get_regs_fp()
519 env->fpr[i].vreg.UD[2] = fpu.fpr[i].val64[2]; in kvm_loongarch_get_regs_fp()
520 env->fpr[i].vreg.UD[3] = fpu.fpr[i].val64[3]; in kvm_loongarch_get_regs_fp()
522 for (i = 0; i < 8; i++) { in kvm_loongarch_get_regs_fp()
523 env->cf[i] = fpu.fcc & 0xFF; in kvm_loongarch_get_regs_fp()
530 static int kvm_loongarch_put_regs_fp(CPUState *cs) in kvm_loongarch_put_regs_fp() argument
534 CPULoongArchState *env = cpu_env(cs); in kvm_loongarch_put_regs_fp()
536 fpu.fcsr = env->fcsr0; in kvm_loongarch_put_regs_fp()
537 fpu.fcc = 0; in kvm_loongarch_put_regs_fp()
538 for (i = 0; i < 32; i++) { in kvm_loongarch_put_regs_fp()
539 fpu.fpr[i].val64[0] = env->fpr[i].vreg.UD[0]; in kvm_loongarch_put_regs_fp()
540 fpu.fpr[i].val64[1] = env->fpr[i].vreg.UD[1]; in kvm_loongarch_put_regs_fp()
541 fpu.fpr[i].val64[2] = env->fpr[i].vreg.UD[2]; in kvm_loongarch_put_regs_fp()
542 fpu.fpr[i].val64[3] = env->fpr[i].vreg.UD[3]; in kvm_loongarch_put_regs_fp()
545 for (i = 0; i < 8; i++) { in kvm_loongarch_put_regs_fp()
546 fpu.fcc |= env->cf[i] << (8 * i); in kvm_loongarch_put_regs_fp()
549 ret = kvm_vcpu_ioctl(cs, KVM_SET_FPU, &fpu); in kvm_loongarch_put_regs_fp()
550 if (ret < 0) { in kvm_loongarch_put_regs_fp()
557 static int kvm_loongarch_put_lbt(CPUState *cs) in kvm_loongarch_put_lbt() argument
559 CPULoongArchState *env = cpu_env(cs); in kvm_loongarch_put_lbt()
564 if (FIELD_EX32(env->cpucfg[2], CPUCFG2, LBT_ALL) != 7) { in kvm_loongarch_put_lbt()
565 return 0; in kvm_loongarch_put_lbt()
568 /* set six LBT registers including scr0-scr3, eflags, ftop */ in kvm_loongarch_put_lbt()
569 ret = kvm_set_one_reg(cs, KVM_REG_LOONGARCH_LBT_SCR0, &env->lbt.scr0); in kvm_loongarch_put_lbt()
570 ret |= kvm_set_one_reg(cs, KVM_REG_LOONGARCH_LBT_SCR1, &env->lbt.scr1); in kvm_loongarch_put_lbt()
571 ret |= kvm_set_one_reg(cs, KVM_REG_LOONGARCH_LBT_SCR2, &env->lbt.scr2); in kvm_loongarch_put_lbt()
572 ret |= kvm_set_one_reg(cs, KVM_REG_LOONGARCH_LBT_SCR3, &env->lbt.scr3); in kvm_loongarch_put_lbt()
574 * Be cautious, KVM_REG_LOONGARCH_LBT_FTOP is defined as 64-bit however in kvm_loongarch_put_lbt()
575 * lbt.ftop is 32-bit; the same with KVM_REG_LOONGARCH_LBT_EFLAGS register in kvm_loongarch_put_lbt()
577 val = env->lbt.eflags; in kvm_loongarch_put_lbt()
578 ret |= kvm_set_one_reg(cs, KVM_REG_LOONGARCH_LBT_EFLAGS, &val); in kvm_loongarch_put_lbt()
579 val = env->lbt.ftop; in kvm_loongarch_put_lbt()
580 ret |= kvm_set_one_reg(cs, KVM_REG_LOONGARCH_LBT_FTOP, &val); in kvm_loongarch_put_lbt()
585 static int kvm_loongarch_get_lbt(CPUState *cs) in kvm_loongarch_get_lbt() argument
587 CPULoongArchState *env = cpu_env(cs); in kvm_loongarch_get_lbt()
592 if (FIELD_EX32(env->cpucfg[2], CPUCFG2, LBT_ALL) != 7) { in kvm_loongarch_get_lbt()
593 return 0; in kvm_loongarch_get_lbt()
596 /* get six LBT registers including scr0-scr3, eflags, ftop */ in kvm_loongarch_get_lbt()
597 ret = kvm_get_one_reg(cs, KVM_REG_LOONGARCH_LBT_SCR0, &env->lbt.scr0); in kvm_loongarch_get_lbt()
598 ret |= kvm_get_one_reg(cs, KVM_REG_LOONGARCH_LBT_SCR1, &env->lbt.scr1); in kvm_loongarch_get_lbt()
599 ret |= kvm_get_one_reg(cs, KVM_REG_LOONGARCH_LBT_SCR2, &env->lbt.scr2); in kvm_loongarch_get_lbt()
600 ret |= kvm_get_one_reg(cs, KVM_REG_LOONGARCH_LBT_SCR3, &env->lbt.scr3); in kvm_loongarch_get_lbt()
601 ret |= kvm_get_one_reg(cs, KVM_REG_LOONGARCH_LBT_EFLAGS, &val); in kvm_loongarch_get_lbt()
602 env->lbt.eflags = (uint32_t)val; in kvm_loongarch_get_lbt()
603 ret |= kvm_get_one_reg(cs, KVM_REG_LOONGARCH_LBT_FTOP, &val); in kvm_loongarch_get_lbt()
604 env->lbt.ftop = (uint32_t)val; in kvm_loongarch_get_lbt()
609 void kvm_arch_reset_vcpu(CPUState *cs) in kvm_arch_reset_vcpu() argument
611 CPULoongArchState *env = cpu_env(cs); in kvm_arch_reset_vcpu()
612 int ret = 0; in kvm_arch_reset_vcpu()
613 uint64_t unused = 0; in kvm_arch_reset_vcpu()
615 env->mp_state = KVM_MP_STATE_RUNNABLE; in kvm_arch_reset_vcpu()
616 ret = kvm_set_one_reg(cs, KVM_REG_LOONGARCH_VCPU_RESET, &unused); in kvm_arch_reset_vcpu()
624 static int kvm_loongarch_get_mpstate(CPUState *cs) in kvm_loongarch_get_mpstate() argument
626 int ret = 0; in kvm_loongarch_get_mpstate()
628 CPULoongArchState *env = cpu_env(cs); in kvm_loongarch_get_mpstate()
631 ret = kvm_vcpu_ioctl(cs, KVM_GET_MP_STATE, &mp_state); in kvm_loongarch_get_mpstate()
636 env->mp_state = mp_state.mp_state; in kvm_loongarch_get_mpstate()
642 static int kvm_loongarch_put_mpstate(CPUState *cs) in kvm_loongarch_put_mpstate() argument
644 int ret = 0; in kvm_loongarch_put_mpstate()
646 .mp_state = cpu_env(cs)->mp_state in kvm_loongarch_put_mpstate()
650 ret = kvm_vcpu_ioctl(cs, KVM_SET_MP_STATE, &mp_state); in kvm_loongarch_put_mpstate()
659 static int kvm_loongarch_get_cpucfg(CPUState *cs) in kvm_loongarch_get_cpucfg() argument
661 int i, ret = 0; in kvm_loongarch_get_cpucfg()
663 CPULoongArchState *env = cpu_env(cs); in kvm_loongarch_get_cpucfg()
665 for (i = 0; i < 21; i++) { in kvm_loongarch_get_cpucfg()
666 ret = kvm_get_one_reg(cs, KVM_IOC_CPUCFG(i), &val); in kvm_loongarch_get_cpucfg()
667 if (ret < 0) { in kvm_loongarch_get_cpucfg()
670 env->cpucfg[i] = (uint32_t)val; in kvm_loongarch_get_cpucfg()
675 static int kvm_check_cpucfg2(CPUState *cs) in kvm_check_cpucfg2() argument
684 CPULoongArchState *env = cpu_env(cs); in kvm_check_cpucfg2()
686 ret = kvm_vcpu_ioctl(cs, KVM_HAS_DEVICE_ATTR, &attr); in kvm_check_cpucfg2()
689 kvm_vcpu_ioctl(cs, KVM_GET_DEVICE_ATTR, &attr); in kvm_check_cpucfg2()
690 env->cpucfg[2] &= val; in kvm_check_cpucfg2()
692 if (FIELD_EX32(env->cpucfg[2], CPUCFG2, FP)) { in kvm_check_cpucfg2()
694 env->cpucfg[2] = FIELD_DP32(env->cpucfg[2], CPUCFG2, FP_VER, 1); in kvm_check_cpucfg2()
697 if (FIELD_EX32(env->cpucfg[2], CPUCFG2, LLFTP)) { in kvm_check_cpucfg2()
699 env->cpucfg[2] = FIELD_DP32(env->cpucfg[2], CPUCFG2, LLFTP_VER, 1); in kvm_check_cpucfg2()
706 static int kvm_loongarch_put_cpucfg(CPUState *cs) in kvm_loongarch_put_cpucfg() argument
708 int i, ret = 0; in kvm_loongarch_put_cpucfg()
709 CPULoongArchState *env = cpu_env(cs); in kvm_loongarch_put_cpucfg()
712 for (i = 0; i < 21; i++) { in kvm_loongarch_put_cpucfg()
714 ret = kvm_check_cpucfg2(cs); in kvm_loongarch_put_cpucfg()
719 val = env->cpucfg[i]; in kvm_loongarch_put_cpucfg()
720 ret = kvm_set_one_reg(cs, KVM_IOC_CPUCFG(i), &val); in kvm_loongarch_put_cpucfg()
721 if (ret < 0) { in kvm_loongarch_put_cpucfg()
728 int kvm_arch_get_registers(CPUState *cs, Error **errp) in kvm_arch_get_registers() argument
732 ret = kvm_loongarch_get_regs_core(cs); in kvm_arch_get_registers()
737 ret = kvm_loongarch_get_cpucfg(cs); in kvm_arch_get_registers()
742 ret = kvm_loongarch_get_csr(cs); in kvm_arch_get_registers()
747 ret = kvm_loongarch_get_regs_fp(cs); in kvm_arch_get_registers()
752 ret = kvm_loongarch_get_lbt(cs); in kvm_arch_get_registers()
757 ret = kvm_get_stealtime(cs); in kvm_arch_get_registers()
762 ret = kvm_loongarch_get_mpstate(cs); in kvm_arch_get_registers()
766 int kvm_arch_put_registers(CPUState *cs, int level, Error **errp) in kvm_arch_put_registers() argument
771 ret = kvm_loongarch_put_regs_core(cs); in kvm_arch_put_registers()
776 ret = kvm_loongarch_put_cpucfg(cs); in kvm_arch_put_registers()
781 ret = kvm_loongarch_put_csr(cs, level); in kvm_arch_put_registers()
786 ret = kvm_loongarch_put_regs_fp(cs); in kvm_arch_put_registers()
791 ret = kvm_loongarch_put_lbt(cs); in kvm_arch_put_registers()
797 ret = kvm_set_pv_features(cs); in kvm_arch_put_registers()
809 ret = kvm_set_stealtime(cs); in kvm_arch_put_registers()
815 ret = kvm_loongarch_put_mpstate(cs); in kvm_arch_put_registers()
823 CPUState *cs = opaque; in kvm_loongarch_vm_stage_change() local
824 LoongArchCPU *cpu = LOONGARCH_CPU(cs); in kvm_loongarch_vm_stage_change()
827 ret = kvm_set_one_reg(cs, KVM_REG_LOONGARCH_COUNTER, in kvm_loongarch_vm_stage_change()
828 &cpu->kvm_state_counter); in kvm_loongarch_vm_stage_change()
829 if (ret < 0) { in kvm_loongarch_vm_stage_change()
833 ret = kvm_get_one_reg(cs, KVM_REG_LOONGARCH_COUNTER, in kvm_loongarch_vm_stage_change()
834 &cpu->kvm_state_counter); in kvm_loongarch_vm_stage_change()
835 if (ret < 0) { in kvm_loongarch_vm_stage_change()
841 static bool kvm_feature_supported(CPUState *cs, enum loongarch_features feature) in kvm_feature_supported() argument
852 if (ret == 0) { in kvm_feature_supported()
857 val = 0; in kvm_feature_supported()
862 ret = kvm_vcpu_ioctl(cs, KVM_HAS_DEVICE_ATTR, &attr); in kvm_feature_supported()
864 ret = kvm_vcpu_ioctl(cs, KVM_GET_DEVICE_ATTR, &attr); in kvm_feature_supported()
870 return (ret != 0); in kvm_feature_supported()
878 if (ret == 0) { in kvm_feature_supported()
883 val = 0; in kvm_feature_supported()
888 ret = kvm_vcpu_ioctl(cs, KVM_HAS_DEVICE_ATTR, &attr); in kvm_feature_supported()
890 ret = kvm_vcpu_ioctl(cs, KVM_GET_DEVICE_ATTR, &attr); in kvm_feature_supported()
896 return (ret != 0); in kvm_feature_supported()
914 return (ret == 0); in kvm_feature_supported()
920 return (ret == 0); in kvm_feature_supported()
926 return (ret == 0); in kvm_feature_supported()
932 return (ret == 0); in kvm_feature_supported()
941 static int kvm_cpu_check_lsx(CPUState *cs, Error **errp) in kvm_cpu_check_lsx() argument
943 CPULoongArchState *env = cpu_env(cs); in kvm_cpu_check_lsx()
944 LoongArchCPU *cpu = LOONGARCH_CPU(cs); in kvm_cpu_check_lsx()
947 kvm_supported = kvm_feature_supported(cs, LOONGARCH_FEATURE_LSX); in kvm_cpu_check_lsx()
948 env->cpucfg[2] = FIELD_DP32(env->cpucfg[2], CPUCFG2, LSX, 0); in kvm_cpu_check_lsx()
949 if (cpu->lsx == ON_OFF_AUTO_ON) { in kvm_cpu_check_lsx()
951 env->cpucfg[2] = FIELD_DP32(env->cpucfg[2], CPUCFG2, LSX, 1); in kvm_cpu_check_lsx()
954 return -ENOTSUP; in kvm_cpu_check_lsx()
956 } else if ((cpu->lsx == ON_OFF_AUTO_AUTO) && kvm_supported) { in kvm_cpu_check_lsx()
957 env->cpucfg[2] = FIELD_DP32(env->cpucfg[2], CPUCFG2, LSX, 1); in kvm_cpu_check_lsx()
960 return 0; in kvm_cpu_check_lsx()
963 static int kvm_cpu_check_lasx(CPUState *cs, Error **errp) in kvm_cpu_check_lasx() argument
965 CPULoongArchState *env = cpu_env(cs); in kvm_cpu_check_lasx()
966 LoongArchCPU *cpu = LOONGARCH_CPU(cs); in kvm_cpu_check_lasx()
969 kvm_supported = kvm_feature_supported(cs, LOONGARCH_FEATURE_LASX); in kvm_cpu_check_lasx()
970 env->cpucfg[2] = FIELD_DP32(env->cpucfg[2], CPUCFG2, LASX, 0); in kvm_cpu_check_lasx()
971 if (cpu->lasx == ON_OFF_AUTO_ON) { in kvm_cpu_check_lasx()
973 env->cpucfg[2] = FIELD_DP32(env->cpucfg[2], CPUCFG2, LASX, 1); in kvm_cpu_check_lasx()
976 return -ENOTSUP; in kvm_cpu_check_lasx()
978 } else if ((cpu->lasx == ON_OFF_AUTO_AUTO) && kvm_supported) { in kvm_cpu_check_lasx()
979 env->cpucfg[2] = FIELD_DP32(env->cpucfg[2], CPUCFG2, LASX, 1); in kvm_cpu_check_lasx()
982 return 0; in kvm_cpu_check_lasx()
985 static int kvm_cpu_check_lbt(CPUState *cs, Error **errp) in kvm_cpu_check_lbt() argument
987 CPULoongArchState *env = cpu_env(cs); in kvm_cpu_check_lbt()
988 LoongArchCPU *cpu = LOONGARCH_CPU(cs); in kvm_cpu_check_lbt()
991 kvm_supported = kvm_feature_supported(cs, LOONGARCH_FEATURE_LBT); in kvm_cpu_check_lbt()
992 if (cpu->lbt == ON_OFF_AUTO_ON) { in kvm_cpu_check_lbt()
994 env->cpucfg[2] = FIELD_DP32(env->cpucfg[2], CPUCFG2, LBT_ALL, 7); in kvm_cpu_check_lbt()
997 return -ENOTSUP; in kvm_cpu_check_lbt()
999 } else if ((cpu->lbt == ON_OFF_AUTO_AUTO) && kvm_supported) { in kvm_cpu_check_lbt()
1000 env->cpucfg[2] = FIELD_DP32(env->cpucfg[2], CPUCFG2, LBT_ALL, 7); in kvm_cpu_check_lbt()
1003 return 0; in kvm_cpu_check_lbt()
1006 static int kvm_cpu_check_pmu(CPUState *cs, Error **errp) in kvm_cpu_check_pmu() argument
1008 LoongArchCPU *cpu = LOONGARCH_CPU(cs); in kvm_cpu_check_pmu()
1009 CPULoongArchState *env = cpu_env(cs); in kvm_cpu_check_pmu()
1012 kvm_supported = kvm_feature_supported(cs, LOONGARCH_FEATURE_PMU); in kvm_cpu_check_pmu()
1013 if (cpu->pmu == ON_OFF_AUTO_ON) { in kvm_cpu_check_pmu()
1016 return -ENOTSUP; in kvm_cpu_check_pmu()
1018 } else if (cpu->pmu != ON_OFF_AUTO_AUTO) { in kvm_cpu_check_pmu()
1024 env->cpucfg[6] = FIELD_DP32(env->cpucfg[6], CPUCFG6, PMP, 1); in kvm_cpu_check_pmu()
1025 env->cpucfg[6] = FIELD_DP32(env->cpucfg[6], CPUCFG6, PMNUM, 3); in kvm_cpu_check_pmu()
1026 env->cpucfg[6] = FIELD_DP32(env->cpucfg[6], CPUCFG6, PMBITS, 63); in kvm_cpu_check_pmu()
1027 env->cpucfg[6] = FIELD_DP32(env->cpucfg[6], CPUCFG6, UPM, 1); in kvm_cpu_check_pmu()
1029 return 0; in kvm_cpu_check_pmu()
1032 static int kvm_cpu_check_pv_features(CPUState *cs, Error **errp) in kvm_cpu_check_pv_features() argument
1035 LoongArchCPU *cpu = LOONGARCH_CPU(cs); in kvm_cpu_check_pv_features()
1036 CPULoongArchState *env = cpu_env(cs); in kvm_cpu_check_pv_features()
1039 kvm_supported = kvm_feature_supported(cs, LOONGARCH_FEATURE_PV_IPI); in kvm_cpu_check_pv_features()
1040 if (cpu->kvm_pv_ipi == ON_OFF_AUTO_ON) { in kvm_cpu_check_pv_features()
1043 return -ENOTSUP; in kvm_cpu_check_pv_features()
1045 } else if (cpu->kvm_pv_ipi != ON_OFF_AUTO_AUTO) { in kvm_cpu_check_pv_features()
1050 env->pv_features |= BIT(KVM_FEATURE_IPI); in kvm_cpu_check_pv_features()
1053 kvm_supported = kvm_feature_supported(cs, LOONGARCH_FEATURE_STEALTIME); in kvm_cpu_check_pv_features()
1054 if (cpu->kvm_steal_time == ON_OFF_AUTO_ON) { in kvm_cpu_check_pv_features()
1057 return -ENOTSUP; in kvm_cpu_check_pv_features()
1059 } else if (cpu->kvm_steal_time != ON_OFF_AUTO_AUTO) { in kvm_cpu_check_pv_features()
1064 env->pv_features |= BIT(KVM_FEATURE_STEAL_TIME); in kvm_cpu_check_pv_features()
1071 env->pv_features |= BIT(KVM_FEATURE_VIRT_EXTIOI); in kvm_cpu_check_pv_features()
1075 return 0; in kvm_cpu_check_pv_features()
1078 int kvm_arch_init_vcpu(CPUState *cs) in kvm_arch_init_vcpu() argument
1083 LoongArchCPU *cpu = LOONGARCH_CPU(cs); in kvm_arch_init_vcpu()
1085 cpu->vmsentry = qemu_add_vm_change_state_handler( in kvm_arch_init_vcpu()
1086 kvm_loongarch_vm_stage_change, cs); in kvm_arch_init_vcpu()
1088 if (!kvm_get_one_reg(cs, KVM_REG_LOONGARCH_DEBUG_INST, &val)) { in kvm_arch_init_vcpu()
1092 ret = kvm_cpu_check_lsx(cs, &local_err); in kvm_arch_init_vcpu()
1093 if (ret < 0) { in kvm_arch_init_vcpu()
1098 ret = kvm_cpu_check_lasx(cs, &local_err); in kvm_arch_init_vcpu()
1099 if (ret < 0) { in kvm_arch_init_vcpu()
1104 ret = kvm_cpu_check_lbt(cs, &local_err); in kvm_arch_init_vcpu()
1105 if (ret < 0) { in kvm_arch_init_vcpu()
1110 ret = kvm_cpu_check_pmu(cs, &local_err); in kvm_arch_init_vcpu()
1111 if (ret < 0) { in kvm_arch_init_vcpu()
1116 ret = kvm_cpu_check_pv_features(cs, &local_err); in kvm_arch_init_vcpu()
1117 if (ret < 0) { in kvm_arch_init_vcpu()
1122 return 0; in kvm_arch_init_vcpu()
1127 return LOONGARCH_CPU(obj)->lbt != ON_OFF_AUTO_OFF; in loongarch_get_lbt()
1134 cpu->lbt = value ? ON_OFF_AUTO_ON : ON_OFF_AUTO_OFF; in loongarch_set_lbt()
1139 return LOONGARCH_CPU(obj)->pmu != ON_OFF_AUTO_OFF; in loongarch_get_pmu()
1146 cpu->pmu = value ? ON_OFF_AUTO_ON : ON_OFF_AUTO_OFF; in loongarch_set_pmu()
1151 return LOONGARCH_CPU(obj)->kvm_pv_ipi != ON_OFF_AUTO_OFF; in kvm_pv_ipi_get()
1158 cpu->kvm_pv_ipi = value ? ON_OFF_AUTO_ON : ON_OFF_AUTO_OFF; in kvm_pv_ipi_set()
1163 return LOONGARCH_CPU(obj)->kvm_steal_time != ON_OFF_AUTO_OFF; in kvm_steal_time_get()
1170 cpu->kvm_steal_time = value ? ON_OFF_AUTO_ON : ON_OFF_AUTO_OFF; in kvm_steal_time_set()
1175 cpu->lbt = ON_OFF_AUTO_AUTO; in kvm_loongarch_cpu_post_init()
1181 cpu->pmu = ON_OFF_AUTO_AUTO; in kvm_loongarch_cpu_post_init()
1187 cpu->kvm_pv_ipi = ON_OFF_AUTO_AUTO; in kvm_loongarch_cpu_post_init()
1188 object_property_add_bool(OBJECT(cpu), "kvm-pv-ipi", kvm_pv_ipi_get, in kvm_loongarch_cpu_post_init()
1190 object_property_set_description(OBJECT(cpu), "kvm-pv-ipi", in kvm_loongarch_cpu_post_init()
1193 cpu->kvm_steal_time = ON_OFF_AUTO_AUTO; in kvm_loongarch_cpu_post_init()
1194 object_property_add_bool(OBJECT(cpu), "kvm-steal-time", kvm_steal_time_get, in kvm_loongarch_cpu_post_init()
1196 object_property_set_description(OBJECT(cpu), "kvm-steal-time", in kvm_loongarch_cpu_post_init()
1200 int kvm_arch_destroy_vcpu(CPUState *cs) in kvm_arch_destroy_vcpu() argument
1202 LoongArchCPU *cpu = LOONGARCH_CPU(cs); in kvm_arch_destroy_vcpu()
1204 qemu_del_vm_change_state_handler(cpu->vmsentry); in kvm_arch_destroy_vcpu()
1205 return 0; in kvm_arch_destroy_vcpu()
1208 unsigned long kvm_arch_vcpu_id(CPUState *cs) in kvm_arch_vcpu_id() argument
1210 return cs->cpu_index; in kvm_arch_vcpu_id()
1215 return 0; in kvm_arch_release_virq_post()
1226 return 0; in kvm_arch_fixup_msi_route()
1232 return 0; in kvm_arch_add_msi_route_post()
1241 return 0; in kvm_arch_get_default_type()
1247 return 0; in kvm_arch_init()
1252 return 0; in kvm_arch_irqchip_create()
1255 void kvm_arch_pre_run(CPUState *cs, struct kvm_run *run) in kvm_arch_pre_run() argument
1259 MemTxAttrs kvm_arch_post_run(CPUState *cs, struct kvm_run *run) in kvm_arch_post_run() argument
1264 int kvm_arch_process_async_events(CPUState *cs) in kvm_arch_process_async_events() argument
1266 return cs->halted; in kvm_arch_process_async_events()
1269 bool kvm_arch_stop_on_emulation_error(CPUState *cs) in kvm_arch_stop_on_emulation_error() argument
1277 dbg->control |= KVM_GUESTDBG_ENABLE | KVM_GUESTDBG_USE_SW_BP; in kvm_arch_update_guest_debug()
1281 int kvm_arch_insert_sw_breakpoint(CPUState *cs, struct kvm_sw_breakpoint *bp) in kvm_arch_insert_sw_breakpoint() argument
1283 if (cpu_memory_rw_debug(cs, bp->pc, (uint8_t *)&bp->saved_insn, 4, 0) || in kvm_arch_insert_sw_breakpoint()
1284 cpu_memory_rw_debug(cs, bp->pc, (uint8_t *)&brk_insn, 4, 1)) { in kvm_arch_insert_sw_breakpoint()
1286 return -EINVAL; in kvm_arch_insert_sw_breakpoint()
1288 return 0; in kvm_arch_insert_sw_breakpoint()
1291 int kvm_arch_remove_sw_breakpoint(CPUState *cs, struct kvm_sw_breakpoint *bp) in kvm_arch_remove_sw_breakpoint() argument
1295 if (cpu_memory_rw_debug(cs, bp->pc, (uint8_t *)&brk, 4, 0) || in kvm_arch_remove_sw_breakpoint()
1297 cpu_memory_rw_debug(cs, bp->pc, (uint8_t *)&bp->saved_insn, 4, 1)) { in kvm_arch_remove_sw_breakpoint()
1299 return -EINVAL; in kvm_arch_remove_sw_breakpoint()
1301 return 0; in kvm_arch_remove_sw_breakpoint()
1306 return -ENOSYS; in kvm_arch_insert_hw_breakpoint()
1311 return -ENOSYS; in kvm_arch_remove_hw_breakpoint()
1318 static bool kvm_loongarch_handle_debug(CPUState *cs, struct kvm_run *run) in kvm_loongarch_handle_debug() argument
1320 LoongArchCPU *cpu = LOONGARCH_CPU(cs); in kvm_loongarch_handle_debug()
1321 CPULoongArchState *env = &cpu->env; in kvm_loongarch_handle_debug()
1323 kvm_cpu_synchronize_state(cs); in kvm_loongarch_handle_debug()
1324 if (cs->singlestep_enabled) { in kvm_loongarch_handle_debug()
1328 if (kvm_find_sw_breakpoint(cs, env->pc)) { in kvm_loongarch_handle_debug()
1335 int kvm_arch_handle_exit(CPUState *cs, struct kvm_run *run) in kvm_arch_handle_exit() argument
1337 int ret = 0; in kvm_arch_handle_exit()
1338 CPULoongArchState *env = cpu_env(cs); in kvm_arch_handle_exit()
1341 attrs.requester_id = env_cpu(env)->cpu_index; in kvm_arch_handle_exit()
1343 trace_kvm_arch_handle_exit(run->exit_reason); in kvm_arch_handle_exit()
1344 switch (run->exit_reason) { in kvm_arch_handle_exit()
1346 address_space_rw(env->address_space_iocsr, in kvm_arch_handle_exit()
1347 run->iocsr_io.phys_addr, in kvm_arch_handle_exit()
1349 run->iocsr_io.data, in kvm_arch_handle_exit()
1350 run->iocsr_io.len, in kvm_arch_handle_exit()
1351 run->iocsr_io.is_write); in kvm_arch_handle_exit()
1355 if (kvm_loongarch_handle_debug(cs, run)) { in kvm_arch_handle_exit()
1361 ret = -1; in kvm_arch_handle_exit()
1362 warn_report("KVM: unknown exit reason %d", run->exit_reason); in kvm_arch_handle_exit()
1371 CPUState *cs = CPU(cpu); in kvm_loongarch_set_interrupt() local
1376 intr.irq = -irq; in kvm_loongarch_set_interrupt()
1380 return kvm_vcpu_ioctl(cs, KVM_INTERRUPT, &intr); in kvm_loongarch_set_interrupt()