]> Git Repo - qemu.git/blame - target-mips/kvm.c
mips/kvm: Support signed 64-bit KVM registers
[qemu.git] / target-mips / kvm.c
CommitLineData
e2132e0b
SL
1/*
2 * This file is subject to the terms and conditions of the GNU General Public
3 * License. See the file "COPYING" in the main directory of this archive
4 * for more details.
5 *
6 * KVM/MIPS: MIPS specific KVM APIs
7 *
8 * Copyright (C) 2012-2014 Imagination Technologies Ltd.
9 * Authors: Sanjay Lal <[email protected]>
10*/
11
c684822a 12#include "qemu/osdep.h"
e2132e0b
SL
13#include <sys/ioctl.h>
14#include <sys/mman.h>
15
16#include <linux/kvm.h>
17
18#include "qemu-common.h"
19#include "qemu/error-report.h"
20#include "qemu/timer.h"
21#include "sysemu/sysemu.h"
22#include "sysemu/kvm.h"
23#include "cpu.h"
24#include "sysemu/cpus.h"
25#include "kvm_mips.h"
4c663752 26#include "exec/memattrs.h"
e2132e0b
SL
27
28#define DEBUG_KVM 0
29
30#define DPRINTF(fmt, ...) \
31 do { if (DEBUG_KVM) { fprintf(stderr, fmt, ## __VA_ARGS__); } } while (0)
32
33const KVMCapabilityInfo kvm_arch_required_capabilities[] = {
34 KVM_CAP_LAST_INFO
35};
36
37static void kvm_mips_update_state(void *opaque, int running, RunState state);
38
39unsigned long kvm_arch_vcpu_id(CPUState *cs)
40{
41 return cs->cpu_index;
42}
43
b16565b3 44int kvm_arch_init(MachineState *ms, KVMState *s)
e2132e0b
SL
45{
46 /* MIPS has 128 signals */
47 kvm_set_sigmask_len(s, 16);
48
49 DPRINTF("%s\n", __func__);
50 return 0;
51}
52
53int kvm_arch_init_vcpu(CPUState *cs)
54{
55 int ret = 0;
56
57 qemu_add_vm_change_state_handler(kvm_mips_update_state, cs);
58
59 DPRINTF("%s\n", __func__);
60 return ret;
61}
62
63void kvm_mips_reset_vcpu(MIPSCPU *cpu)
64{
0e928b12
JH
65 CPUMIPSState *env = &cpu->env;
66
67 if (env->CP0_Config1 & (1 << CP0C1_FP)) {
68 fprintf(stderr, "Warning: FPU not supported with KVM, disabling\n");
69 env->CP0_Config1 &= ~(1 << CP0C1_FP);
70 }
71
e2132e0b
SL
72 DPRINTF("%s\n", __func__);
73}
74
75int kvm_arch_insert_sw_breakpoint(CPUState *cs, struct kvm_sw_breakpoint *bp)
76{
77 DPRINTF("%s\n", __func__);
78 return 0;
79}
80
81int kvm_arch_remove_sw_breakpoint(CPUState *cs, struct kvm_sw_breakpoint *bp)
82{
83 DPRINTF("%s\n", __func__);
84 return 0;
85}
86
87static inline int cpu_mips_io_interrupts_pending(MIPSCPU *cpu)
88{
89 CPUMIPSState *env = &cpu->env;
90
e2132e0b
SL
91 return env->CP0_Cause & (0x1 << (2 + CP0Ca_IP));
92}
93
94
95void kvm_arch_pre_run(CPUState *cs, struct kvm_run *run)
96{
97 MIPSCPU *cpu = MIPS_CPU(cs);
98 int r;
99 struct kvm_mips_interrupt intr;
100
4b8523ee
JK
101 qemu_mutex_lock_iothread();
102
e2132e0b
SL
103 if ((cs->interrupt_request & CPU_INTERRUPT_HARD) &&
104 cpu_mips_io_interrupts_pending(cpu)) {
105 intr.cpu = -1;
106 intr.irq = 2;
107 r = kvm_vcpu_ioctl(cs, KVM_INTERRUPT, &intr);
108 if (r < 0) {
109 error_report("%s: cpu %d: failed to inject IRQ %x",
110 __func__, cs->cpu_index, intr.irq);
111 }
112 }
4b8523ee
JK
113
114 qemu_mutex_unlock_iothread();
e2132e0b
SL
115}
116
4c663752 117MemTxAttrs kvm_arch_post_run(CPUState *cs, struct kvm_run *run)
e2132e0b 118{
4c663752 119 return MEMTXATTRS_UNSPECIFIED;
e2132e0b
SL
120}
121
122int kvm_arch_process_async_events(CPUState *cs)
123{
124 return cs->halted;
125}
126
127int kvm_arch_handle_exit(CPUState *cs, struct kvm_run *run)
128{
129 int ret;
130
131 DPRINTF("%s\n", __func__);
132 switch (run->exit_reason) {
133 default:
134 error_report("%s: unknown exit reason %d",
135 __func__, run->exit_reason);
136 ret = -1;
137 break;
138 }
139
140 return ret;
141}
142
143bool kvm_arch_stop_on_emulation_error(CPUState *cs)
144{
145 DPRINTF("%s\n", __func__);
146 return true;
147}
148
149int kvm_arch_on_sigbus_vcpu(CPUState *cs, int code, void *addr)
150{
151 DPRINTF("%s\n", __func__);
152 return 1;
153}
154
155int kvm_arch_on_sigbus(int code, void *addr)
156{
157 DPRINTF("%s\n", __func__);
158 return 1;
159}
160
161void kvm_arch_init_irq_routing(KVMState *s)
162{
163}
164
165int kvm_mips_set_interrupt(MIPSCPU *cpu, int irq, int level)
166{
167 CPUState *cs = CPU(cpu);
168 struct kvm_mips_interrupt intr;
169
170 if (!kvm_enabled()) {
171 return 0;
172 }
173
174 intr.cpu = -1;
175
176 if (level) {
177 intr.irq = irq;
178 } else {
179 intr.irq = -irq;
180 }
181
182 kvm_vcpu_ioctl(cs, KVM_INTERRUPT, &intr);
183
184 return 0;
185}
186
187int kvm_mips_set_ipi_interrupt(MIPSCPU *cpu, int irq, int level)
188{
189 CPUState *cs = current_cpu;
190 CPUState *dest_cs = CPU(cpu);
191 struct kvm_mips_interrupt intr;
192
193 if (!kvm_enabled()) {
194 return 0;
195 }
196
197 intr.cpu = dest_cs->cpu_index;
198
199 if (level) {
200 intr.irq = irq;
201 } else {
202 intr.irq = -irq;
203 }
204
205 DPRINTF("%s: CPU %d, IRQ: %d\n", __func__, intr.cpu, intr.irq);
206
207 kvm_vcpu_ioctl(cs, KVM_INTERRUPT, &intr);
208
209 return 0;
210}
211
212#define MIPS_CP0_32(_R, _S) \
5a2db896 213 (KVM_REG_MIPS_CP0 | KVM_REG_SIZE_U32 | (8 * (_R) + (_S)))
e2132e0b
SL
214
215#define MIPS_CP0_64(_R, _S) \
5a2db896 216 (KVM_REG_MIPS_CP0 | KVM_REG_SIZE_U64 | (8 * (_R) + (_S)))
e2132e0b
SL
217
218#define KVM_REG_MIPS_CP0_INDEX MIPS_CP0_32(0, 0)
219#define KVM_REG_MIPS_CP0_CONTEXT MIPS_CP0_64(4, 0)
220#define KVM_REG_MIPS_CP0_USERLOCAL MIPS_CP0_64(4, 2)
221#define KVM_REG_MIPS_CP0_PAGEMASK MIPS_CP0_32(5, 0)
222#define KVM_REG_MIPS_CP0_WIRED MIPS_CP0_32(6, 0)
223#define KVM_REG_MIPS_CP0_HWRENA MIPS_CP0_32(7, 0)
224#define KVM_REG_MIPS_CP0_BADVADDR MIPS_CP0_64(8, 0)
225#define KVM_REG_MIPS_CP0_COUNT MIPS_CP0_32(9, 0)
226#define KVM_REG_MIPS_CP0_ENTRYHI MIPS_CP0_64(10, 0)
227#define KVM_REG_MIPS_CP0_COMPARE MIPS_CP0_32(11, 0)
228#define KVM_REG_MIPS_CP0_STATUS MIPS_CP0_32(12, 0)
229#define KVM_REG_MIPS_CP0_CAUSE MIPS_CP0_32(13, 0)
230#define KVM_REG_MIPS_CP0_EPC MIPS_CP0_64(14, 0)
461a1582 231#define KVM_REG_MIPS_CP0_PRID MIPS_CP0_32(15, 0)
03cbfd7b
JH
232#define KVM_REG_MIPS_CP0_CONFIG MIPS_CP0_32(16, 0)
233#define KVM_REG_MIPS_CP0_CONFIG1 MIPS_CP0_32(16, 1)
234#define KVM_REG_MIPS_CP0_CONFIG2 MIPS_CP0_32(16, 2)
235#define KVM_REG_MIPS_CP0_CONFIG3 MIPS_CP0_32(16, 3)
236#define KVM_REG_MIPS_CP0_CONFIG4 MIPS_CP0_32(16, 4)
237#define KVM_REG_MIPS_CP0_CONFIG5 MIPS_CP0_32(16, 5)
e2132e0b
SL
238#define KVM_REG_MIPS_CP0_ERROREPC MIPS_CP0_64(30, 0)
239
e2132e0b
SL
240static inline int kvm_mips_put_one_reg(CPUState *cs, uint64_t reg_id,
241 int32_t *addr)
242{
e2132e0b
SL
243 struct kvm_one_reg cp0reg = {
244 .id = reg_id,
f8b3e48b 245 .addr = (uintptr_t)addr
e2132e0b
SL
246 };
247
248 return kvm_vcpu_ioctl(cs, KVM_SET_ONE_REG, &cp0reg);
249}
250
0759487b
JH
251static inline int kvm_mips_put_one_ureg(CPUState *cs, uint64_t reg_id,
252 uint32_t *addr)
253{
254 struct kvm_one_reg cp0reg = {
255 .id = reg_id,
256 .addr = (uintptr_t)addr
257 };
258
259 return kvm_vcpu_ioctl(cs, KVM_SET_ONE_REG, &cp0reg);
260}
261
e2132e0b
SL
262static inline int kvm_mips_put_one_ulreg(CPUState *cs, uint64_t reg_id,
263 target_ulong *addr)
264{
265 uint64_t val64 = *addr;
266 struct kvm_one_reg cp0reg = {
267 .id = reg_id,
268 .addr = (uintptr_t)&val64
269 };
270
271 return kvm_vcpu_ioctl(cs, KVM_SET_ONE_REG, &cp0reg);
272}
273
274static inline int kvm_mips_put_one_reg64(CPUState *cs, uint64_t reg_id,
d319f83f
JH
275 int64_t *addr)
276{
277 struct kvm_one_reg cp0reg = {
278 .id = reg_id,
279 .addr = (uintptr_t)addr
280 };
281
282 return kvm_vcpu_ioctl(cs, KVM_SET_ONE_REG, &cp0reg);
283}
284
285static inline int kvm_mips_put_one_ureg64(CPUState *cs, uint64_t reg_id,
286 uint64_t *addr)
e2132e0b
SL
287{
288 struct kvm_one_reg cp0reg = {
289 .id = reg_id,
290 .addr = (uintptr_t)addr
291 };
292
293 return kvm_vcpu_ioctl(cs, KVM_SET_ONE_REG, &cp0reg);
294}
295
296static inline int kvm_mips_get_one_reg(CPUState *cs, uint64_t reg_id,
297 int32_t *addr)
298{
e2132e0b
SL
299 struct kvm_one_reg cp0reg = {
300 .id = reg_id,
f8b3e48b 301 .addr = (uintptr_t)addr
e2132e0b
SL
302 };
303
f8b3e48b 304 return kvm_vcpu_ioctl(cs, KVM_GET_ONE_REG, &cp0reg);
e2132e0b
SL
305}
306
0759487b
JH
307static inline int kvm_mips_get_one_ureg(CPUState *cs, uint64_t reg_id,
308 uint32_t *addr)
309{
310 struct kvm_one_reg cp0reg = {
311 .id = reg_id,
312 .addr = (uintptr_t)addr
313 };
314
315 return kvm_vcpu_ioctl(cs, KVM_GET_ONE_REG, &cp0reg);
316}
317
182f42fd 318static inline int kvm_mips_get_one_ulreg(CPUState *cs, uint64_t reg_id,
e2132e0b
SL
319 target_ulong *addr)
320{
321 int ret;
322 uint64_t val64 = 0;
323 struct kvm_one_reg cp0reg = {
324 .id = reg_id,
325 .addr = (uintptr_t)&val64
326 };
327
328 ret = kvm_vcpu_ioctl(cs, KVM_GET_ONE_REG, &cp0reg);
329 if (ret >= 0) {
330 *addr = val64;
331 }
332 return ret;
333}
334
182f42fd 335static inline int kvm_mips_get_one_reg64(CPUState *cs, uint64_t reg_id,
d319f83f
JH
336 int64_t *addr)
337{
338 struct kvm_one_reg cp0reg = {
339 .id = reg_id,
340 .addr = (uintptr_t)addr
341 };
342
343 return kvm_vcpu_ioctl(cs, KVM_GET_ONE_REG, &cp0reg);
344}
345
346static inline int kvm_mips_get_one_ureg64(CPUState *cs, uint64_t reg_id,
347 uint64_t *addr)
e2132e0b
SL
348{
349 struct kvm_one_reg cp0reg = {
350 .id = reg_id,
351 .addr = (uintptr_t)addr
352 };
353
354 return kvm_vcpu_ioctl(cs, KVM_GET_ONE_REG, &cp0reg);
355}
356
03cbfd7b
JH
357#define KVM_REG_MIPS_CP0_CONFIG_MASK (1U << CP0C0_M)
358#define KVM_REG_MIPS_CP0_CONFIG1_MASK (1U << CP0C1_M)
359#define KVM_REG_MIPS_CP0_CONFIG2_MASK (1U << CP0C2_M)
360#define KVM_REG_MIPS_CP0_CONFIG3_MASK (1U << CP0C3_M)
361#define KVM_REG_MIPS_CP0_CONFIG4_MASK (1U << CP0C4_M)
362#define KVM_REG_MIPS_CP0_CONFIG5_MASK 0
363
364static inline int kvm_mips_change_one_reg(CPUState *cs, uint64_t reg_id,
365 int32_t *addr, int32_t mask)
366{
367 int err;
368 int32_t tmp, change;
369
370 err = kvm_mips_get_one_reg(cs, reg_id, &tmp);
371 if (err < 0) {
372 return err;
373 }
374
375 /* only change bits in mask */
376 change = (*addr ^ tmp) & mask;
377 if (!change) {
378 return 0;
379 }
380
381 tmp = tmp ^ change;
382 return kvm_mips_put_one_reg(cs, reg_id, &tmp);
383}
384
e2132e0b
SL
385/*
386 * We freeze the KVM timer when either the VM clock is stopped or the state is
387 * saved (the state is dirty).
388 */
389
390/*
391 * Save the state of the KVM timer when VM clock is stopped or state is synced
392 * to QEMU.
393 */
394static int kvm_mips_save_count(CPUState *cs)
395{
396 MIPSCPU *cpu = MIPS_CPU(cs);
397 CPUMIPSState *env = &cpu->env;
398 uint64_t count_ctl;
399 int err, ret = 0;
400
401 /* freeze KVM timer */
d319f83f 402 err = kvm_mips_get_one_ureg64(cs, KVM_REG_MIPS_COUNT_CTL, &count_ctl);
e2132e0b
SL
403 if (err < 0) {
404 DPRINTF("%s: Failed to get COUNT_CTL (%d)\n", __func__, err);
405 ret = err;
406 } else if (!(count_ctl & KVM_REG_MIPS_COUNT_CTL_DC)) {
407 count_ctl |= KVM_REG_MIPS_COUNT_CTL_DC;
d319f83f 408 err = kvm_mips_put_one_ureg64(cs, KVM_REG_MIPS_COUNT_CTL, &count_ctl);
e2132e0b
SL
409 if (err < 0) {
410 DPRINTF("%s: Failed to set COUNT_CTL.DC=1 (%d)\n", __func__, err);
411 ret = err;
412 }
413 }
414
415 /* read CP0_Cause */
416 err = kvm_mips_get_one_reg(cs, KVM_REG_MIPS_CP0_CAUSE, &env->CP0_Cause);
417 if (err < 0) {
418 DPRINTF("%s: Failed to get CP0_CAUSE (%d)\n", __func__, err);
419 ret = err;
420 }
421
422 /* read CP0_Count */
423 err = kvm_mips_get_one_reg(cs, KVM_REG_MIPS_CP0_COUNT, &env->CP0_Count);
424 if (err < 0) {
425 DPRINTF("%s: Failed to get CP0_COUNT (%d)\n", __func__, err);
426 ret = err;
427 }
428
429 return ret;
430}
431
432/*
433 * Restore the state of the KVM timer when VM clock is restarted or state is
434 * synced to KVM.
435 */
436static int kvm_mips_restore_count(CPUState *cs)
437{
438 MIPSCPU *cpu = MIPS_CPU(cs);
439 CPUMIPSState *env = &cpu->env;
440 uint64_t count_ctl;
441 int err_dc, err, ret = 0;
442
443 /* check the timer is frozen */
d319f83f 444 err_dc = kvm_mips_get_one_ureg64(cs, KVM_REG_MIPS_COUNT_CTL, &count_ctl);
e2132e0b
SL
445 if (err_dc < 0) {
446 DPRINTF("%s: Failed to get COUNT_CTL (%d)\n", __func__, err_dc);
447 ret = err_dc;
448 } else if (!(count_ctl & KVM_REG_MIPS_COUNT_CTL_DC)) {
449 /* freeze timer (sets COUNT_RESUME for us) */
450 count_ctl |= KVM_REG_MIPS_COUNT_CTL_DC;
d319f83f 451 err = kvm_mips_put_one_ureg64(cs, KVM_REG_MIPS_COUNT_CTL, &count_ctl);
e2132e0b
SL
452 if (err < 0) {
453 DPRINTF("%s: Failed to set COUNT_CTL.DC=1 (%d)\n", __func__, err);
454 ret = err;
455 }
456 }
457
458 /* load CP0_Cause */
459 err = kvm_mips_put_one_reg(cs, KVM_REG_MIPS_CP0_CAUSE, &env->CP0_Cause);
460 if (err < 0) {
461 DPRINTF("%s: Failed to put CP0_CAUSE (%d)\n", __func__, err);
462 ret = err;
463 }
464
465 /* load CP0_Count */
466 err = kvm_mips_put_one_reg(cs, KVM_REG_MIPS_CP0_COUNT, &env->CP0_Count);
467 if (err < 0) {
468 DPRINTF("%s: Failed to put CP0_COUNT (%d)\n", __func__, err);
469 ret = err;
470 }
471
472 /* resume KVM timer */
473 if (err_dc >= 0) {
474 count_ctl &= ~KVM_REG_MIPS_COUNT_CTL_DC;
d319f83f 475 err = kvm_mips_put_one_ureg64(cs, KVM_REG_MIPS_COUNT_CTL, &count_ctl);
e2132e0b
SL
476 if (err < 0) {
477 DPRINTF("%s: Failed to set COUNT_CTL.DC=0 (%d)\n", __func__, err);
478 ret = err;
479 }
480 }
481
482 return ret;
483}
484
485/*
486 * Handle the VM clock being started or stopped
487 */
488static void kvm_mips_update_state(void *opaque, int running, RunState state)
489{
490 CPUState *cs = opaque;
491 int ret;
492 uint64_t count_resume;
493
494 /*
495 * If state is already dirty (synced to QEMU) then the KVM timer state is
496 * already saved and can be restored when it is synced back to KVM.
497 */
498 if (!running) {
499 if (!cs->kvm_vcpu_dirty) {
500 ret = kvm_mips_save_count(cs);
501 if (ret < 0) {
502 fprintf(stderr, "Failed saving count\n");
503 }
504 }
505 } else {
506 /* Set clock restore time to now */
906b53a2 507 count_resume = qemu_clock_get_ns(QEMU_CLOCK_REALTIME);
d319f83f
JH
508 ret = kvm_mips_put_one_ureg64(cs, KVM_REG_MIPS_COUNT_RESUME,
509 &count_resume);
e2132e0b
SL
510 if (ret < 0) {
511 fprintf(stderr, "Failed setting COUNT_RESUME\n");
512 return;
513 }
514
515 if (!cs->kvm_vcpu_dirty) {
516 ret = kvm_mips_restore_count(cs);
517 if (ret < 0) {
518 fprintf(stderr, "Failed restoring count\n");
519 }
520 }
521 }
522}
523
524static int kvm_mips_put_cp0_registers(CPUState *cs, int level)
525{
526 MIPSCPU *cpu = MIPS_CPU(cs);
527 CPUMIPSState *env = &cpu->env;
528 int err, ret = 0;
529
530 (void)level;
531
532 err = kvm_mips_put_one_reg(cs, KVM_REG_MIPS_CP0_INDEX, &env->CP0_Index);
533 if (err < 0) {
534 DPRINTF("%s: Failed to put CP0_INDEX (%d)\n", __func__, err);
535 ret = err;
536 }
537 err = kvm_mips_put_one_ulreg(cs, KVM_REG_MIPS_CP0_CONTEXT,
538 &env->CP0_Context);
539 if (err < 0) {
540 DPRINTF("%s: Failed to put CP0_CONTEXT (%d)\n", __func__, err);
541 ret = err;
542 }
543 err = kvm_mips_put_one_ulreg(cs, KVM_REG_MIPS_CP0_USERLOCAL,
544 &env->active_tc.CP0_UserLocal);
545 if (err < 0) {
546 DPRINTF("%s: Failed to put CP0_USERLOCAL (%d)\n", __func__, err);
547 ret = err;
548 }
549 err = kvm_mips_put_one_reg(cs, KVM_REG_MIPS_CP0_PAGEMASK,
550 &env->CP0_PageMask);
551 if (err < 0) {
552 DPRINTF("%s: Failed to put CP0_PAGEMASK (%d)\n", __func__, err);
553 ret = err;
554 }
555 err = kvm_mips_put_one_reg(cs, KVM_REG_MIPS_CP0_WIRED, &env->CP0_Wired);
556 if (err < 0) {
557 DPRINTF("%s: Failed to put CP0_WIRED (%d)\n", __func__, err);
558 ret = err;
559 }
560 err = kvm_mips_put_one_reg(cs, KVM_REG_MIPS_CP0_HWRENA, &env->CP0_HWREna);
561 if (err < 0) {
562 DPRINTF("%s: Failed to put CP0_HWRENA (%d)\n", __func__, err);
563 ret = err;
564 }
565 err = kvm_mips_put_one_ulreg(cs, KVM_REG_MIPS_CP0_BADVADDR,
566 &env->CP0_BadVAddr);
567 if (err < 0) {
568 DPRINTF("%s: Failed to put CP0_BADVADDR (%d)\n", __func__, err);
569 ret = err;
570 }
571
572 /* If VM clock stopped then state will be restored when it is restarted */
573 if (runstate_is_running()) {
574 err = kvm_mips_restore_count(cs);
575 if (err < 0) {
576 ret = err;
577 }
578 }
579
580 err = kvm_mips_put_one_ulreg(cs, KVM_REG_MIPS_CP0_ENTRYHI,
581 &env->CP0_EntryHi);
582 if (err < 0) {
583 DPRINTF("%s: Failed to put CP0_ENTRYHI (%d)\n", __func__, err);
584 ret = err;
585 }
586 err = kvm_mips_put_one_reg(cs, KVM_REG_MIPS_CP0_COMPARE,
587 &env->CP0_Compare);
588 if (err < 0) {
589 DPRINTF("%s: Failed to put CP0_COMPARE (%d)\n", __func__, err);
590 ret = err;
591 }
592 err = kvm_mips_put_one_reg(cs, KVM_REG_MIPS_CP0_STATUS, &env->CP0_Status);
593 if (err < 0) {
594 DPRINTF("%s: Failed to put CP0_STATUS (%d)\n", __func__, err);
595 ret = err;
596 }
597 err = kvm_mips_put_one_ulreg(cs, KVM_REG_MIPS_CP0_EPC, &env->CP0_EPC);
598 if (err < 0) {
599 DPRINTF("%s: Failed to put CP0_EPC (%d)\n", __func__, err);
600 ret = err;
601 }
461a1582
JH
602 err = kvm_mips_put_one_reg(cs, KVM_REG_MIPS_CP0_PRID, &env->CP0_PRid);
603 if (err < 0) {
604 DPRINTF("%s: Failed to put CP0_PRID (%d)\n", __func__, err);
605 ret = err;
606 }
03cbfd7b
JH
607 err = kvm_mips_change_one_reg(cs, KVM_REG_MIPS_CP0_CONFIG,
608 &env->CP0_Config0,
609 KVM_REG_MIPS_CP0_CONFIG_MASK);
610 if (err < 0) {
611 DPRINTF("%s: Failed to change CP0_CONFIG (%d)\n", __func__, err);
612 ret = err;
613 }
614 err = kvm_mips_change_one_reg(cs, KVM_REG_MIPS_CP0_CONFIG1,
615 &env->CP0_Config1,
616 KVM_REG_MIPS_CP0_CONFIG1_MASK);
617 if (err < 0) {
618 DPRINTF("%s: Failed to change CP0_CONFIG1 (%d)\n", __func__, err);
619 ret = err;
620 }
621 err = kvm_mips_change_one_reg(cs, KVM_REG_MIPS_CP0_CONFIG2,
622 &env->CP0_Config2,
623 KVM_REG_MIPS_CP0_CONFIG2_MASK);
624 if (err < 0) {
625 DPRINTF("%s: Failed to change CP0_CONFIG2 (%d)\n", __func__, err);
626 ret = err;
627 }
628 err = kvm_mips_change_one_reg(cs, KVM_REG_MIPS_CP0_CONFIG3,
629 &env->CP0_Config3,
630 KVM_REG_MIPS_CP0_CONFIG3_MASK);
631 if (err < 0) {
632 DPRINTF("%s: Failed to change CP0_CONFIG3 (%d)\n", __func__, err);
633 ret = err;
634 }
635 err = kvm_mips_change_one_reg(cs, KVM_REG_MIPS_CP0_CONFIG4,
636 &env->CP0_Config4,
637 KVM_REG_MIPS_CP0_CONFIG4_MASK);
638 if (err < 0) {
639 DPRINTF("%s: Failed to change CP0_CONFIG4 (%d)\n", __func__, err);
640 ret = err;
641 }
642 err = kvm_mips_change_one_reg(cs, KVM_REG_MIPS_CP0_CONFIG5,
643 &env->CP0_Config5,
644 KVM_REG_MIPS_CP0_CONFIG5_MASK);
645 if (err < 0) {
646 DPRINTF("%s: Failed to change CP0_CONFIG5 (%d)\n", __func__, err);
647 ret = err;
648 }
e2132e0b
SL
649 err = kvm_mips_put_one_ulreg(cs, KVM_REG_MIPS_CP0_ERROREPC,
650 &env->CP0_ErrorEPC);
651 if (err < 0) {
652 DPRINTF("%s: Failed to put CP0_ERROREPC (%d)\n", __func__, err);
653 ret = err;
654 }
655
656 return ret;
657}
658
659static int kvm_mips_get_cp0_registers(CPUState *cs)
660{
661 MIPSCPU *cpu = MIPS_CPU(cs);
662 CPUMIPSState *env = &cpu->env;
663 int err, ret = 0;
664
665 err = kvm_mips_get_one_reg(cs, KVM_REG_MIPS_CP0_INDEX, &env->CP0_Index);
666 if (err < 0) {
667 DPRINTF("%s: Failed to get CP0_INDEX (%d)\n", __func__, err);
668 ret = err;
669 }
670 err = kvm_mips_get_one_ulreg(cs, KVM_REG_MIPS_CP0_CONTEXT,
671 &env->CP0_Context);
672 if (err < 0) {
673 DPRINTF("%s: Failed to get CP0_CONTEXT (%d)\n", __func__, err);
674 ret = err;
675 }
676 err = kvm_mips_get_one_ulreg(cs, KVM_REG_MIPS_CP0_USERLOCAL,
677 &env->active_tc.CP0_UserLocal);
678 if (err < 0) {
679 DPRINTF("%s: Failed to get CP0_USERLOCAL (%d)\n", __func__, err);
680 ret = err;
681 }
682 err = kvm_mips_get_one_reg(cs, KVM_REG_MIPS_CP0_PAGEMASK,
683 &env->CP0_PageMask);
684 if (err < 0) {
685 DPRINTF("%s: Failed to get CP0_PAGEMASK (%d)\n", __func__, err);
686 ret = err;
687 }
688 err = kvm_mips_get_one_reg(cs, KVM_REG_MIPS_CP0_WIRED, &env->CP0_Wired);
689 if (err < 0) {
690 DPRINTF("%s: Failed to get CP0_WIRED (%d)\n", __func__, err);
691 ret = err;
692 }
693 err = kvm_mips_get_one_reg(cs, KVM_REG_MIPS_CP0_HWRENA, &env->CP0_HWREna);
694 if (err < 0) {
695 DPRINTF("%s: Failed to get CP0_HWRENA (%d)\n", __func__, err);
696 ret = err;
697 }
698 err = kvm_mips_get_one_ulreg(cs, KVM_REG_MIPS_CP0_BADVADDR,
699 &env->CP0_BadVAddr);
700 if (err < 0) {
701 DPRINTF("%s: Failed to get CP0_BADVADDR (%d)\n", __func__, err);
702 ret = err;
703 }
704 err = kvm_mips_get_one_ulreg(cs, KVM_REG_MIPS_CP0_ENTRYHI,
705 &env->CP0_EntryHi);
706 if (err < 0) {
707 DPRINTF("%s: Failed to get CP0_ENTRYHI (%d)\n", __func__, err);
708 ret = err;
709 }
710 err = kvm_mips_get_one_reg(cs, KVM_REG_MIPS_CP0_COMPARE,
711 &env->CP0_Compare);
712 if (err < 0) {
713 DPRINTF("%s: Failed to get CP0_COMPARE (%d)\n", __func__, err);
714 ret = err;
715 }
716 err = kvm_mips_get_one_reg(cs, KVM_REG_MIPS_CP0_STATUS, &env->CP0_Status);
717 if (err < 0) {
718 DPRINTF("%s: Failed to get CP0_STATUS (%d)\n", __func__, err);
719 ret = err;
720 }
721
722 /* If VM clock stopped then state was already saved when it was stopped */
723 if (runstate_is_running()) {
724 err = kvm_mips_save_count(cs);
725 if (err < 0) {
726 ret = err;
727 }
728 }
729
730 err = kvm_mips_get_one_ulreg(cs, KVM_REG_MIPS_CP0_EPC, &env->CP0_EPC);
731 if (err < 0) {
732 DPRINTF("%s: Failed to get CP0_EPC (%d)\n", __func__, err);
733 ret = err;
734 }
461a1582
JH
735 err = kvm_mips_get_one_reg(cs, KVM_REG_MIPS_CP0_PRID, &env->CP0_PRid);
736 if (err < 0) {
737 DPRINTF("%s: Failed to get CP0_PRID (%d)\n", __func__, err);
738 ret = err;
739 }
03cbfd7b
JH
740 err = kvm_mips_get_one_reg(cs, KVM_REG_MIPS_CP0_CONFIG, &env->CP0_Config0);
741 if (err < 0) {
742 DPRINTF("%s: Failed to get CP0_CONFIG (%d)\n", __func__, err);
743 ret = err;
744 }
745 err = kvm_mips_get_one_reg(cs, KVM_REG_MIPS_CP0_CONFIG1, &env->CP0_Config1);
746 if (err < 0) {
747 DPRINTF("%s: Failed to get CP0_CONFIG1 (%d)\n", __func__, err);
748 ret = err;
749 }
750 err = kvm_mips_get_one_reg(cs, KVM_REG_MIPS_CP0_CONFIG2, &env->CP0_Config2);
751 if (err < 0) {
752 DPRINTF("%s: Failed to get CP0_CONFIG2 (%d)\n", __func__, err);
753 ret = err;
754 }
755 err = kvm_mips_get_one_reg(cs, KVM_REG_MIPS_CP0_CONFIG3, &env->CP0_Config3);
756 if (err < 0) {
757 DPRINTF("%s: Failed to get CP0_CONFIG3 (%d)\n", __func__, err);
758 ret = err;
759 }
760 err = kvm_mips_get_one_reg(cs, KVM_REG_MIPS_CP0_CONFIG4, &env->CP0_Config4);
761 if (err < 0) {
762 DPRINTF("%s: Failed to get CP0_CONFIG4 (%d)\n", __func__, err);
763 ret = err;
764 }
765 err = kvm_mips_get_one_reg(cs, KVM_REG_MIPS_CP0_CONFIG5, &env->CP0_Config5);
766 if (err < 0) {
767 DPRINTF("%s: Failed to get CP0_CONFIG5 (%d)\n", __func__, err);
768 ret = err;
769 }
e2132e0b
SL
770 err = kvm_mips_get_one_ulreg(cs, KVM_REG_MIPS_CP0_ERROREPC,
771 &env->CP0_ErrorEPC);
772 if (err < 0) {
773 DPRINTF("%s: Failed to get CP0_ERROREPC (%d)\n", __func__, err);
774 ret = err;
775 }
776
777 return ret;
778}
779
780int kvm_arch_put_registers(CPUState *cs, int level)
781{
782 MIPSCPU *cpu = MIPS_CPU(cs);
783 CPUMIPSState *env = &cpu->env;
784 struct kvm_regs regs;
785 int ret;
786 int i;
787
788 /* Set the registers based on QEMU's view of things */
789 for (i = 0; i < 32; i++) {
02dae26a 790 regs.gpr[i] = (int64_t)(target_long)env->active_tc.gpr[i];
e2132e0b
SL
791 }
792
02dae26a
JH
793 regs.hi = (int64_t)(target_long)env->active_tc.HI[0];
794 regs.lo = (int64_t)(target_long)env->active_tc.LO[0];
795 regs.pc = (int64_t)(target_long)env->active_tc.PC;
e2132e0b
SL
796
797 ret = kvm_vcpu_ioctl(cs, KVM_SET_REGS, &regs);
798
799 if (ret < 0) {
800 return ret;
801 }
802
803 ret = kvm_mips_put_cp0_registers(cs, level);
804 if (ret < 0) {
805 return ret;
806 }
807
808 return ret;
809}
810
811int kvm_arch_get_registers(CPUState *cs)
812{
813 MIPSCPU *cpu = MIPS_CPU(cs);
814 CPUMIPSState *env = &cpu->env;
815 int ret = 0;
816 struct kvm_regs regs;
817 int i;
818
819 /* Get the current register set as KVM seems it */
820 ret = kvm_vcpu_ioctl(cs, KVM_GET_REGS, &regs);
821
822 if (ret < 0) {
823 return ret;
824 }
825
826 for (i = 0; i < 32; i++) {
827 env->active_tc.gpr[i] = regs.gpr[i];
828 }
829
830 env->active_tc.HI[0] = regs.hi;
831 env->active_tc.LO[0] = regs.lo;
832 env->active_tc.PC = regs.pc;
833
834 kvm_mips_get_cp0_registers(cs);
835
836 return ret;
837}
9e03a040
FB
838
839int kvm_arch_fixup_msi_route(struct kvm_irq_routing_entry *route,
dc9f06ca 840 uint64_t address, uint32_t data, PCIDevice *dev)
9e03a040
FB
841{
842 return 0;
843}
1850b6b7
EA
844
845int kvm_arch_msi_data_to_gsi(uint32_t data)
846{
847 abort();
848}
This page took 0.209085 seconds and 4 git commands to generate.