kvm: ppc: Drop CONFIG_KVM_PPC_PVR
[qemu/stefanha.git] / target-ppc / kvm.c
blob0500e3f7723c819b81b45a4210a1a34796743155
1 /*
2 * PowerPC implementation of KVM hooks
4 * Copyright IBM Corp. 2007
5 * Copyright (C) 2011 Freescale Semiconductor, Inc.
7 * Authors:
8 * Jerone Young <jyoung5@us.ibm.com>
9 * Christian Ehrhardt <ehrhardt@linux.vnet.ibm.com>
10 * Hollis Blanchard <hollisb@us.ibm.com>
12 * This work is licensed under the terms of the GNU GPL, version 2 or later.
13 * See the COPYING file in the top-level directory.
17 #include <sys/types.h>
18 #include <sys/ioctl.h>
19 #include <sys/mman.h>
21 #include <linux/kvm.h>
23 #include "qemu-common.h"
24 #include "qemu-timer.h"
25 #include "sysemu.h"
26 #include "kvm.h"
27 #include "kvm_ppc.h"
28 #include "cpu.h"
29 #include "device_tree.h"
31 //#define DEBUG_KVM
33 #ifdef DEBUG_KVM
34 #define dprintf(fmt, ...) \
35 do { fprintf(stderr, fmt, ## __VA_ARGS__); } while (0)
36 #else
37 #define dprintf(fmt, ...) \
38 do { } while (0)
39 #endif
41 const KVMCapabilityInfo kvm_arch_required_capabilities[] = {
42 KVM_CAP_LAST_INFO
45 static int cap_interrupt_unset = false;
46 static int cap_interrupt_level = false;
47 static int cap_segstate;
48 static int cap_booke_sregs;
50 /* XXX We have a race condition where we actually have a level triggered
51 * interrupt, but the infrastructure can't expose that yet, so the guest
52 * takes but ignores it, goes to sleep and never gets notified that there's
53 * still an interrupt pending.
55 * As a quick workaround, let's just wake up again 20 ms after we injected
56 * an interrupt. That way we can assure that we're always reinjecting
57 * interrupts in case the guest swallowed them.
59 static QEMUTimer *idle_timer;
61 static void kvm_kick_env(void *env)
63 qemu_cpu_kick(env);
66 int kvm_arch_init(KVMState *s)
68 #ifdef KVM_CAP_PPC_UNSET_IRQ
69 cap_interrupt_unset = kvm_check_extension(s, KVM_CAP_PPC_UNSET_IRQ);
70 #endif
71 #ifdef KVM_CAP_PPC_IRQ_LEVEL
72 cap_interrupt_level = kvm_check_extension(s, KVM_CAP_PPC_IRQ_LEVEL);
73 #endif
74 #ifdef KVM_CAP_PPC_SEGSTATE
75 cap_segstate = kvm_check_extension(s, KVM_CAP_PPC_SEGSTATE);
76 #endif
77 #ifdef KVM_CAP_PPC_BOOKE_SREGS
78 cap_booke_sregs = kvm_check_extension(s, KVM_CAP_PPC_BOOKE_SREGS);
79 #endif
81 if (!cap_interrupt_level) {
82 fprintf(stderr, "KVM: Couldn't find level irq capability. Expect the "
83 "VM to stall at times!\n");
86 return 0;
89 static int kvm_arch_sync_sregs(CPUState *cenv)
91 struct kvm_sregs sregs;
92 int ret;
94 if (cenv->excp_model == POWERPC_EXCP_BOOKE) {
95 /* What we're really trying to say is "if we're on BookE, we use
96 the native PVR for now". This is the only sane way to check
97 it though, so we potentially confuse users that they can run
98 BookE guests on BookS. Let's hope nobody dares enough :) */
99 return 0;
100 } else {
101 if (!cap_segstate) {
102 fprintf(stderr, "kvm error: missing PVR setting capability\n");
103 return -ENOSYS;
107 ret = kvm_vcpu_ioctl(cenv, KVM_GET_SREGS, &sregs);
108 if (ret) {
109 return ret;
112 sregs.pvr = cenv->spr[SPR_PVR];
113 return kvm_vcpu_ioctl(cenv, KVM_SET_SREGS, &sregs);
116 int kvm_arch_init_vcpu(CPUState *cenv)
118 int ret;
120 ret = kvm_arch_sync_sregs(cenv);
121 if (ret) {
122 return ret;
125 idle_timer = qemu_new_timer_ns(vm_clock, kvm_kick_env, cenv);
127 return ret;
130 void kvm_arch_reset_vcpu(CPUState *env)
134 int kvm_arch_put_registers(CPUState *env, int level)
136 struct kvm_regs regs;
137 int ret;
138 int i;
140 ret = kvm_vcpu_ioctl(env, KVM_GET_REGS, &regs);
141 if (ret < 0)
142 return ret;
144 regs.ctr = env->ctr;
145 regs.lr = env->lr;
146 regs.xer = env->xer;
147 regs.msr = env->msr;
148 regs.pc = env->nip;
150 regs.srr0 = env->spr[SPR_SRR0];
151 regs.srr1 = env->spr[SPR_SRR1];
153 regs.sprg0 = env->spr[SPR_SPRG0];
154 regs.sprg1 = env->spr[SPR_SPRG1];
155 regs.sprg2 = env->spr[SPR_SPRG2];
156 regs.sprg3 = env->spr[SPR_SPRG3];
157 regs.sprg4 = env->spr[SPR_SPRG4];
158 regs.sprg5 = env->spr[SPR_SPRG5];
159 regs.sprg6 = env->spr[SPR_SPRG6];
160 regs.sprg7 = env->spr[SPR_SPRG7];
162 regs.pid = env->spr[SPR_BOOKE_PID];
164 for (i = 0;i < 32; i++)
165 regs.gpr[i] = env->gpr[i];
167 ret = kvm_vcpu_ioctl(env, KVM_SET_REGS, &regs);
168 if (ret < 0)
169 return ret;
171 return ret;
174 int kvm_arch_get_registers(CPUState *env)
176 struct kvm_regs regs;
177 struct kvm_sregs sregs;
178 uint32_t cr;
179 int i, ret;
181 ret = kvm_vcpu_ioctl(env, KVM_GET_REGS, &regs);
182 if (ret < 0)
183 return ret;
185 cr = regs.cr;
186 for (i = 7; i >= 0; i--) {
187 env->crf[i] = cr & 15;
188 cr >>= 4;
191 env->ctr = regs.ctr;
192 env->lr = regs.lr;
193 env->xer = regs.xer;
194 env->msr = regs.msr;
195 env->nip = regs.pc;
197 env->spr[SPR_SRR0] = regs.srr0;
198 env->spr[SPR_SRR1] = regs.srr1;
200 env->spr[SPR_SPRG0] = regs.sprg0;
201 env->spr[SPR_SPRG1] = regs.sprg1;
202 env->spr[SPR_SPRG2] = regs.sprg2;
203 env->spr[SPR_SPRG3] = regs.sprg3;
204 env->spr[SPR_SPRG4] = regs.sprg4;
205 env->spr[SPR_SPRG5] = regs.sprg5;
206 env->spr[SPR_SPRG6] = regs.sprg6;
207 env->spr[SPR_SPRG7] = regs.sprg7;
209 env->spr[SPR_BOOKE_PID] = regs.pid;
211 for (i = 0;i < 32; i++)
212 env->gpr[i] = regs.gpr[i];
214 if (cap_booke_sregs) {
215 ret = kvm_vcpu_ioctl(env, KVM_GET_SREGS, &sregs);
216 if (ret < 0) {
217 return ret;
220 #ifdef KVM_CAP_PPC_BOOKE_SREGS
221 if (sregs.u.e.features & KVM_SREGS_E_BASE) {
222 env->spr[SPR_BOOKE_CSRR0] = sregs.u.e.csrr0;
223 env->spr[SPR_BOOKE_CSRR1] = sregs.u.e.csrr1;
224 env->spr[SPR_BOOKE_ESR] = sregs.u.e.esr;
225 env->spr[SPR_BOOKE_DEAR] = sregs.u.e.dear;
226 env->spr[SPR_BOOKE_MCSR] = sregs.u.e.mcsr;
227 env->spr[SPR_BOOKE_TSR] = sregs.u.e.tsr;
228 env->spr[SPR_BOOKE_TCR] = sregs.u.e.tcr;
229 env->spr[SPR_DECR] = sregs.u.e.dec;
230 env->spr[SPR_TBL] = sregs.u.e.tb & 0xffffffff;
231 env->spr[SPR_TBU] = sregs.u.e.tb >> 32;
232 env->spr[SPR_VRSAVE] = sregs.u.e.vrsave;
235 if (sregs.u.e.features & KVM_SREGS_E_ARCH206) {
236 env->spr[SPR_BOOKE_PIR] = sregs.u.e.pir;
237 env->spr[SPR_BOOKE_MCSRR0] = sregs.u.e.mcsrr0;
238 env->spr[SPR_BOOKE_MCSRR1] = sregs.u.e.mcsrr1;
239 env->spr[SPR_BOOKE_DECAR] = sregs.u.e.decar;
240 env->spr[SPR_BOOKE_IVPR] = sregs.u.e.ivpr;
243 if (sregs.u.e.features & KVM_SREGS_E_64) {
244 env->spr[SPR_BOOKE_EPCR] = sregs.u.e.epcr;
247 if (sregs.u.e.features & KVM_SREGS_E_SPRG8) {
248 env->spr[SPR_BOOKE_SPRG8] = sregs.u.e.sprg8;
251 if (sregs.u.e.features & KVM_SREGS_E_IVOR) {
252 env->spr[SPR_BOOKE_IVOR0] = sregs.u.e.ivor_low[0];
253 env->spr[SPR_BOOKE_IVOR1] = sregs.u.e.ivor_low[1];
254 env->spr[SPR_BOOKE_IVOR2] = sregs.u.e.ivor_low[2];
255 env->spr[SPR_BOOKE_IVOR3] = sregs.u.e.ivor_low[3];
256 env->spr[SPR_BOOKE_IVOR4] = sregs.u.e.ivor_low[4];
257 env->spr[SPR_BOOKE_IVOR5] = sregs.u.e.ivor_low[5];
258 env->spr[SPR_BOOKE_IVOR6] = sregs.u.e.ivor_low[6];
259 env->spr[SPR_BOOKE_IVOR7] = sregs.u.e.ivor_low[7];
260 env->spr[SPR_BOOKE_IVOR8] = sregs.u.e.ivor_low[8];
261 env->spr[SPR_BOOKE_IVOR9] = sregs.u.e.ivor_low[9];
262 env->spr[SPR_BOOKE_IVOR10] = sregs.u.e.ivor_low[10];
263 env->spr[SPR_BOOKE_IVOR11] = sregs.u.e.ivor_low[11];
264 env->spr[SPR_BOOKE_IVOR12] = sregs.u.e.ivor_low[12];
265 env->spr[SPR_BOOKE_IVOR13] = sregs.u.e.ivor_low[13];
266 env->spr[SPR_BOOKE_IVOR14] = sregs.u.e.ivor_low[14];
267 env->spr[SPR_BOOKE_IVOR15] = sregs.u.e.ivor_low[15];
269 if (sregs.u.e.features & KVM_SREGS_E_SPE) {
270 env->spr[SPR_BOOKE_IVOR32] = sregs.u.e.ivor_high[0];
271 env->spr[SPR_BOOKE_IVOR33] = sregs.u.e.ivor_high[1];
272 env->spr[SPR_BOOKE_IVOR34] = sregs.u.e.ivor_high[2];
275 if (sregs.u.e.features & KVM_SREGS_E_PM) {
276 env->spr[SPR_BOOKE_IVOR35] = sregs.u.e.ivor_high[3];
279 if (sregs.u.e.features & KVM_SREGS_E_PC) {
280 env->spr[SPR_BOOKE_IVOR36] = sregs.u.e.ivor_high[4];
281 env->spr[SPR_BOOKE_IVOR37] = sregs.u.e.ivor_high[5];
285 if (sregs.u.e.features & KVM_SREGS_E_ARCH206_MMU) {
286 env->spr[SPR_BOOKE_MAS0] = sregs.u.e.mas0;
287 env->spr[SPR_BOOKE_MAS1] = sregs.u.e.mas1;
288 env->spr[SPR_BOOKE_MAS2] = sregs.u.e.mas2;
289 env->spr[SPR_BOOKE_MAS3] = sregs.u.e.mas7_3 & 0xffffffff;
290 env->spr[SPR_BOOKE_MAS4] = sregs.u.e.mas4;
291 env->spr[SPR_BOOKE_MAS6] = sregs.u.e.mas6;
292 env->spr[SPR_BOOKE_MAS7] = sregs.u.e.mas7_3 >> 32;
293 env->spr[SPR_MMUCFG] = sregs.u.e.mmucfg;
294 env->spr[SPR_BOOKE_TLB0CFG] = sregs.u.e.tlbcfg[0];
295 env->spr[SPR_BOOKE_TLB1CFG] = sregs.u.e.tlbcfg[1];
298 if (sregs.u.e.features & KVM_SREGS_EXP) {
299 env->spr[SPR_BOOKE_EPR] = sregs.u.e.epr;
302 if (sregs.u.e.features & KVM_SREGS_E_PD) {
303 env->spr[SPR_BOOKE_EPLC] = sregs.u.e.eplc;
304 env->spr[SPR_BOOKE_EPSC] = sregs.u.e.epsc;
307 if (sregs.u.e.impl_id == KVM_SREGS_E_IMPL_FSL) {
308 env->spr[SPR_E500_SVR] = sregs.u.e.impl.fsl.svr;
309 env->spr[SPR_Exxx_MCAR] = sregs.u.e.impl.fsl.mcar;
310 env->spr[SPR_HID0] = sregs.u.e.impl.fsl.hid0;
312 if (sregs.u.e.impl.fsl.features & KVM_SREGS_E_FSL_PIDn) {
313 env->spr[SPR_BOOKE_PID1] = sregs.u.e.impl.fsl.pid1;
314 env->spr[SPR_BOOKE_PID2] = sregs.u.e.impl.fsl.pid2;
317 #endif
320 if (cap_segstate) {
321 ret = kvm_vcpu_ioctl(env, KVM_GET_SREGS, &sregs);
322 if (ret < 0) {
323 return ret;
326 #ifdef KVM_CAP_PPC_SEGSTATE
327 ppc_store_sdr1(env, sregs.u.s.sdr1);
329 /* Sync SLB */
330 #ifdef TARGET_PPC64
331 for (i = 0; i < 64; i++) {
332 ppc_store_slb(env, sregs.u.s.ppc64.slb[i].slbe,
333 sregs.u.s.ppc64.slb[i].slbv);
335 #endif
337 /* Sync SRs */
338 for (i = 0; i < 16; i++) {
339 env->sr[i] = sregs.u.s.ppc32.sr[i];
342 /* Sync BATs */
343 for (i = 0; i < 8; i++) {
344 env->DBAT[0][i] = sregs.u.s.ppc32.dbat[i] & 0xffffffff;
345 env->DBAT[1][i] = sregs.u.s.ppc32.dbat[i] >> 32;
346 env->IBAT[0][i] = sregs.u.s.ppc32.ibat[i] & 0xffffffff;
347 env->IBAT[1][i] = sregs.u.s.ppc32.ibat[i] >> 32;
349 #endif
352 return 0;
355 int kvmppc_set_interrupt(CPUState *env, int irq, int level)
357 unsigned virq = level ? KVM_INTERRUPT_SET_LEVEL : KVM_INTERRUPT_UNSET;
359 if (irq != PPC_INTERRUPT_EXT) {
360 return 0;
363 if (!kvm_enabled() || !cap_interrupt_unset || !cap_interrupt_level) {
364 return 0;
367 kvm_vcpu_ioctl(env, KVM_INTERRUPT, &virq);
369 return 0;
372 #if defined(TARGET_PPCEMB)
373 #define PPC_INPUT_INT PPC40x_INPUT_INT
374 #elif defined(TARGET_PPC64)
375 #define PPC_INPUT_INT PPC970_INPUT_INT
376 #else
377 #define PPC_INPUT_INT PPC6xx_INPUT_INT
378 #endif
380 void kvm_arch_pre_run(CPUState *env, struct kvm_run *run)
382 int r;
383 unsigned irq;
385 /* PowerPC Qemu tracks the various core input pins (interrupt, critical
386 * interrupt, reset, etc) in PPC-specific env->irq_input_state. */
387 if (!cap_interrupt_level &&
388 run->ready_for_interrupt_injection &&
389 (env->interrupt_request & CPU_INTERRUPT_HARD) &&
390 (env->irq_input_state & (1<<PPC_INPUT_INT)))
392 /* For now KVM disregards the 'irq' argument. However, in the
393 * future KVM could cache it in-kernel to avoid a heavyweight exit
394 * when reading the UIC.
396 irq = KVM_INTERRUPT_SET;
398 dprintf("injected interrupt %d\n", irq);
399 r = kvm_vcpu_ioctl(env, KVM_INTERRUPT, &irq);
400 if (r < 0)
401 printf("cpu %d fail inject %x\n", env->cpu_index, irq);
403 /* Always wake up soon in case the interrupt was level based */
404 qemu_mod_timer(idle_timer, qemu_get_clock_ns(vm_clock) +
405 (get_ticks_per_sec() / 50));
408 /* We don't know if there are more interrupts pending after this. However,
409 * the guest will return to userspace in the course of handling this one
410 * anyways, so we will get a chance to deliver the rest. */
413 void kvm_arch_post_run(CPUState *env, struct kvm_run *run)
417 int kvm_arch_process_async_events(CPUState *env)
419 return 0;
422 static int kvmppc_handle_halt(CPUState *env)
424 if (!(env->interrupt_request & CPU_INTERRUPT_HARD) && (msr_ee)) {
425 env->halted = 1;
426 env->exception_index = EXCP_HLT;
429 return 0;
432 /* map dcr access to existing qemu dcr emulation */
433 static int kvmppc_handle_dcr_read(CPUState *env, uint32_t dcrn, uint32_t *data)
435 if (ppc_dcr_read(env->dcr_env, dcrn, data) < 0)
436 fprintf(stderr, "Read to unhandled DCR (0x%x)\n", dcrn);
438 return 0;
441 static int kvmppc_handle_dcr_write(CPUState *env, uint32_t dcrn, uint32_t data)
443 if (ppc_dcr_write(env->dcr_env, dcrn, data) < 0)
444 fprintf(stderr, "Write to unhandled DCR (0x%x)\n", dcrn);
446 return 0;
449 int kvm_arch_handle_exit(CPUState *env, struct kvm_run *run)
451 int ret;
453 switch (run->exit_reason) {
454 case KVM_EXIT_DCR:
455 if (run->dcr.is_write) {
456 dprintf("handle dcr write\n");
457 ret = kvmppc_handle_dcr_write(env, run->dcr.dcrn, run->dcr.data);
458 } else {
459 dprintf("handle dcr read\n");
460 ret = kvmppc_handle_dcr_read(env, run->dcr.dcrn, &run->dcr.data);
462 break;
463 case KVM_EXIT_HLT:
464 dprintf("handle halt\n");
465 ret = kvmppc_handle_halt(env);
466 break;
467 default:
468 fprintf(stderr, "KVM: unknown exit reason %d\n", run->exit_reason);
469 ret = -1;
470 break;
473 return ret;
476 static int read_cpuinfo(const char *field, char *value, int len)
478 FILE *f;
479 int ret = -1;
480 int field_len = strlen(field);
481 char line[512];
483 f = fopen("/proc/cpuinfo", "r");
484 if (!f) {
485 return -1;
488 do {
489 if(!fgets(line, sizeof(line), f)) {
490 break;
492 if (!strncmp(line, field, field_len)) {
493 strncpy(value, line, len);
494 ret = 0;
495 break;
497 } while(*line);
499 fclose(f);
501 return ret;
504 uint32_t kvmppc_get_tbfreq(void)
506 char line[512];
507 char *ns;
508 uint32_t retval = get_ticks_per_sec();
510 if (read_cpuinfo("timebase", line, sizeof(line))) {
511 return retval;
514 if (!(ns = strchr(line, ':'))) {
515 return retval;
518 ns++;
520 retval = atoi(ns);
521 return retval;
524 int kvmppc_get_hypercall(CPUState *env, uint8_t *buf, int buf_len)
526 uint32_t *hc = (uint32_t*)buf;
528 #ifdef KVM_CAP_PPC_GET_PVINFO
529 struct kvm_ppc_pvinfo pvinfo;
531 if (kvm_check_extension(env->kvm_state, KVM_CAP_PPC_GET_PVINFO) &&
532 !kvm_vm_ioctl(env->kvm_state, KVM_PPC_GET_PVINFO, &pvinfo)) {
533 memcpy(buf, pvinfo.hcall, buf_len);
535 return 0;
537 #endif
540 * Fallback to always fail hypercalls:
542 * li r3, -1
543 * nop
544 * nop
545 * nop
548 hc[0] = 0x3860ffff;
549 hc[1] = 0x60000000;
550 hc[2] = 0x60000000;
551 hc[3] = 0x60000000;
553 return 0;
556 bool kvm_arch_stop_on_emulation_error(CPUState *env)
558 return true;
561 int kvm_arch_on_sigbus_vcpu(CPUState *env, int code, void *addr)
563 return 1;
566 int kvm_arch_on_sigbus(int code, void *addr)
568 return 1;