]> git.proxmox.com Git - qemu.git/blame - target-ppc/kvm.c
qxl: create slots on post_load in vga state
[qemu.git] / target-ppc / kvm.c
CommitLineData
d76d1650
AJ
1/*
2 * PowerPC implementation of KVM hooks
3 *
4 * Copyright IBM Corp. 2007
90dc8812 5 * Copyright (C) 2011 Freescale Semiconductor, Inc.
d76d1650
AJ
6 *
7 * Authors:
8 * Jerone Young <jyoung5@us.ibm.com>
9 * Christian Ehrhardt <ehrhardt@linux.vnet.ibm.com>
10 * Hollis Blanchard <hollisb@us.ibm.com>
11 *
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.
14 *
15 */
16
eadaada1 17#include <dirent.h>
d76d1650
AJ
18#include <sys/types.h>
19#include <sys/ioctl.h>
20#include <sys/mman.h>
21
22#include <linux/kvm.h>
23
24#include "qemu-common.h"
25#include "qemu-timer.h"
26#include "sysemu.h"
27#include "kvm.h"
28#include "kvm_ppc.h"
29#include "cpu.h"
30#include "device_tree.h"
31
f61b4bed
AG
32#include "hw/sysbus.h"
33#include "hw/spapr.h"
34#include "hw/spapr_vio.h"
35
d76d1650
AJ
36//#define DEBUG_KVM
37
38#ifdef DEBUG_KVM
39#define dprintf(fmt, ...) \
40 do { fprintf(stderr, fmt, ## __VA_ARGS__); } while (0)
41#else
42#define dprintf(fmt, ...) \
43 do { } while (0)
44#endif
45
eadaada1
AG
46#define PROC_DEVTREE_CPU "/proc/device-tree/cpus/"
47
94a8d39a
JK
48const KVMCapabilityInfo kvm_arch_required_capabilities[] = {
49 KVM_CAP_LAST_INFO
50};
51
fc87e185
AG
52static int cap_interrupt_unset = false;
53static int cap_interrupt_level = false;
90dc8812 54static int cap_segstate;
90dc8812 55static int cap_booke_sregs;
fc87e185 56
c821c2bd
AG
57/* XXX We have a race condition where we actually have a level triggered
58 * interrupt, but the infrastructure can't expose that yet, so the guest
59 * takes but ignores it, goes to sleep and never gets notified that there's
60 * still an interrupt pending.
c6a94ba5 61 *
c821c2bd
AG
62 * As a quick workaround, let's just wake up again 20 ms after we injected
63 * an interrupt. That way we can assure that we're always reinjecting
64 * interrupts in case the guest swallowed them.
c6a94ba5
AG
65 */
66static QEMUTimer *idle_timer;
67
c821c2bd 68static void kvm_kick_env(void *env)
c6a94ba5 69{
c821c2bd 70 qemu_cpu_kick(env);
c6a94ba5
AG
71}
72
cad1e282 73int kvm_arch_init(KVMState *s)
d76d1650 74{
fc87e185 75 cap_interrupt_unset = kvm_check_extension(s, KVM_CAP_PPC_UNSET_IRQ);
fc87e185 76 cap_interrupt_level = kvm_check_extension(s, KVM_CAP_PPC_IRQ_LEVEL);
90dc8812 77 cap_segstate = kvm_check_extension(s, KVM_CAP_PPC_SEGSTATE);
90dc8812 78 cap_booke_sregs = kvm_check_extension(s, KVM_CAP_PPC_BOOKE_SREGS);
fc87e185
AG
79
80 if (!cap_interrupt_level) {
81 fprintf(stderr, "KVM: Couldn't find level irq capability. Expect the "
82 "VM to stall at times!\n");
83 }
84
d76d1650
AJ
85 return 0;
86}
87
5666ca4a 88static int kvm_arch_sync_sregs(CPUState *cenv)
d76d1650 89{
861bbc80 90 struct kvm_sregs sregs;
5666ca4a
SW
91 int ret;
92
93 if (cenv->excp_model == POWERPC_EXCP_BOOKE) {
64e07be5
AG
94 /* What we're really trying to say is "if we're on BookE, we use
95 the native PVR for now". This is the only sane way to check
96 it though, so we potentially confuse users that they can run
97 BookE guests on BookS. Let's hope nobody dares enough :) */
5666ca4a
SW
98 return 0;
99 } else {
90dc8812 100 if (!cap_segstate) {
64e07be5
AG
101 fprintf(stderr, "kvm error: missing PVR setting capability\n");
102 return -ENOSYS;
5666ca4a 103 }
5666ca4a
SW
104 }
105
106 ret = kvm_vcpu_ioctl(cenv, KVM_GET_SREGS, &sregs);
107 if (ret) {
108 return ret;
109 }
861bbc80
AG
110
111 sregs.pvr = cenv->spr[SPR_PVR];
5666ca4a
SW
112 return kvm_vcpu_ioctl(cenv, KVM_SET_SREGS, &sregs);
113}
114
93dd5e85
SW
115/* Set up a shared TLB array with KVM */
116static int kvm_booke206_tlb_init(CPUState *env)
117{
118 struct kvm_book3e_206_tlb_params params = {};
119 struct kvm_config_tlb cfg = {};
120 struct kvm_enable_cap encap = {};
121 unsigned int entries = 0;
122 int ret, i;
123
124 if (!kvm_enabled() ||
125 !kvm_check_extension(env->kvm_state, KVM_CAP_SW_TLB)) {
126 return 0;
127 }
128
129 assert(ARRAY_SIZE(params.tlb_sizes) == BOOKE206_MAX_TLBN);
130
131 for (i = 0; i < BOOKE206_MAX_TLBN; i++) {
132 params.tlb_sizes[i] = booke206_tlb_size(env, i);
133 params.tlb_ways[i] = booke206_tlb_ways(env, i);
134 entries += params.tlb_sizes[i];
135 }
136
137 assert(entries == env->nb_tlb);
138 assert(sizeof(struct kvm_book3e_206_tlb_entry) == sizeof(ppcmas_tlb_t));
139
140 env->tlb_dirty = true;
141
142 cfg.array = (uintptr_t)env->tlb.tlbm;
143 cfg.array_len = sizeof(ppcmas_tlb_t) * entries;
144 cfg.params = (uintptr_t)&params;
145 cfg.mmu_type = KVM_MMU_FSL_BOOKE_NOHV;
146
147 encap.cap = KVM_CAP_SW_TLB;
148 encap.args[0] = (uintptr_t)&cfg;
149
150 ret = kvm_vcpu_ioctl(env, KVM_ENABLE_CAP, &encap);
151 if (ret < 0) {
152 fprintf(stderr, "%s: couldn't enable KVM_CAP_SW_TLB: %s\n",
153 __func__, strerror(-ret));
154 return ret;
155 }
156
157 env->kvm_sw_tlb = true;
158 return 0;
159}
160
5666ca4a
SW
161int kvm_arch_init_vcpu(CPUState *cenv)
162{
163 int ret;
164
165 ret = kvm_arch_sync_sregs(cenv);
166 if (ret) {
167 return ret;
168 }
861bbc80 169
74475455 170 idle_timer = qemu_new_timer_ns(vm_clock, kvm_kick_env, cenv);
c821c2bd 171
93dd5e85
SW
172 /* Some targets support access to KVM's guest TLB. */
173 switch (cenv->mmu_model) {
174 case POWERPC_MMU_BOOKE206:
175 ret = kvm_booke206_tlb_init(cenv);
176 break;
177 default:
178 break;
179 }
180
861bbc80 181 return ret;
d76d1650
AJ
182}
183
caa5af0f
JK
184void kvm_arch_reset_vcpu(CPUState *env)
185{
186}
187
93dd5e85
SW
188static void kvm_sw_tlb_put(CPUState *env)
189{
190 struct kvm_dirty_tlb dirty_tlb;
191 unsigned char *bitmap;
192 int ret;
193
194 if (!env->kvm_sw_tlb) {
195 return;
196 }
197
198 bitmap = g_malloc((env->nb_tlb + 7) / 8);
199 memset(bitmap, 0xFF, (env->nb_tlb + 7) / 8);
200
201 dirty_tlb.bitmap = (uintptr_t)bitmap;
202 dirty_tlb.num_dirty = env->nb_tlb;
203
204 ret = kvm_vcpu_ioctl(env, KVM_DIRTY_TLB, &dirty_tlb);
205 if (ret) {
206 fprintf(stderr, "%s: KVM_DIRTY_TLB: %s\n",
207 __func__, strerror(-ret));
208 }
209
210 g_free(bitmap);
211}
212
ea375f9a 213int kvm_arch_put_registers(CPUState *env, int level)
d76d1650
AJ
214{
215 struct kvm_regs regs;
216 int ret;
217 int i;
218
219 ret = kvm_vcpu_ioctl(env, KVM_GET_REGS, &regs);
220 if (ret < 0)
221 return ret;
222
223 regs.ctr = env->ctr;
224 regs.lr = env->lr;
225 regs.xer = env->xer;
226 regs.msr = env->msr;
227 regs.pc = env->nip;
228
229 regs.srr0 = env->spr[SPR_SRR0];
230 regs.srr1 = env->spr[SPR_SRR1];
231
232 regs.sprg0 = env->spr[SPR_SPRG0];
233 regs.sprg1 = env->spr[SPR_SPRG1];
234 regs.sprg2 = env->spr[SPR_SPRG2];
235 regs.sprg3 = env->spr[SPR_SPRG3];
236 regs.sprg4 = env->spr[SPR_SPRG4];
237 regs.sprg5 = env->spr[SPR_SPRG5];
238 regs.sprg6 = env->spr[SPR_SPRG6];
239 regs.sprg7 = env->spr[SPR_SPRG7];
240
90dc8812
SW
241 regs.pid = env->spr[SPR_BOOKE_PID];
242
d76d1650
AJ
243 for (i = 0;i < 32; i++)
244 regs.gpr[i] = env->gpr[i];
245
246 ret = kvm_vcpu_ioctl(env, KVM_SET_REGS, &regs);
247 if (ret < 0)
248 return ret;
249
93dd5e85
SW
250 if (env->tlb_dirty) {
251 kvm_sw_tlb_put(env);
252 env->tlb_dirty = false;
253 }
254
d76d1650
AJ
255 return ret;
256}
257
258int kvm_arch_get_registers(CPUState *env)
259{
260 struct kvm_regs regs;
ba5e5090 261 struct kvm_sregs sregs;
90dc8812 262 uint32_t cr;
138b38b6 263 int i, ret;
d76d1650
AJ
264
265 ret = kvm_vcpu_ioctl(env, KVM_GET_REGS, &regs);
266 if (ret < 0)
267 return ret;
268
90dc8812
SW
269 cr = regs.cr;
270 for (i = 7; i >= 0; i--) {
271 env->crf[i] = cr & 15;
272 cr >>= 4;
273 }
ba5e5090 274
d76d1650
AJ
275 env->ctr = regs.ctr;
276 env->lr = regs.lr;
277 env->xer = regs.xer;
278 env->msr = regs.msr;
279 env->nip = regs.pc;
280
281 env->spr[SPR_SRR0] = regs.srr0;
282 env->spr[SPR_SRR1] = regs.srr1;
283
284 env->spr[SPR_SPRG0] = regs.sprg0;
285 env->spr[SPR_SPRG1] = regs.sprg1;
286 env->spr[SPR_SPRG2] = regs.sprg2;
287 env->spr[SPR_SPRG3] = regs.sprg3;
288 env->spr[SPR_SPRG4] = regs.sprg4;
289 env->spr[SPR_SPRG5] = regs.sprg5;
290 env->spr[SPR_SPRG6] = regs.sprg6;
291 env->spr[SPR_SPRG7] = regs.sprg7;
292
90dc8812
SW
293 env->spr[SPR_BOOKE_PID] = regs.pid;
294
d76d1650
AJ
295 for (i = 0;i < 32; i++)
296 env->gpr[i] = regs.gpr[i];
297
90dc8812
SW
298 if (cap_booke_sregs) {
299 ret = kvm_vcpu_ioctl(env, KVM_GET_SREGS, &sregs);
300 if (ret < 0) {
301 return ret;
302 }
303
304 if (sregs.u.e.features & KVM_SREGS_E_BASE) {
305 env->spr[SPR_BOOKE_CSRR0] = sregs.u.e.csrr0;
306 env->spr[SPR_BOOKE_CSRR1] = sregs.u.e.csrr1;
307 env->spr[SPR_BOOKE_ESR] = sregs.u.e.esr;
308 env->spr[SPR_BOOKE_DEAR] = sregs.u.e.dear;
309 env->spr[SPR_BOOKE_MCSR] = sregs.u.e.mcsr;
310 env->spr[SPR_BOOKE_TSR] = sregs.u.e.tsr;
311 env->spr[SPR_BOOKE_TCR] = sregs.u.e.tcr;
312 env->spr[SPR_DECR] = sregs.u.e.dec;
313 env->spr[SPR_TBL] = sregs.u.e.tb & 0xffffffff;
314 env->spr[SPR_TBU] = sregs.u.e.tb >> 32;
315 env->spr[SPR_VRSAVE] = sregs.u.e.vrsave;
316 }
317
318 if (sregs.u.e.features & KVM_SREGS_E_ARCH206) {
319 env->spr[SPR_BOOKE_PIR] = sregs.u.e.pir;
320 env->spr[SPR_BOOKE_MCSRR0] = sregs.u.e.mcsrr0;
321 env->spr[SPR_BOOKE_MCSRR1] = sregs.u.e.mcsrr1;
322 env->spr[SPR_BOOKE_DECAR] = sregs.u.e.decar;
323 env->spr[SPR_BOOKE_IVPR] = sregs.u.e.ivpr;
324 }
325
326 if (sregs.u.e.features & KVM_SREGS_E_64) {
327 env->spr[SPR_BOOKE_EPCR] = sregs.u.e.epcr;
328 }
329
330 if (sregs.u.e.features & KVM_SREGS_E_SPRG8) {
331 env->spr[SPR_BOOKE_SPRG8] = sregs.u.e.sprg8;
332 }
333
334 if (sregs.u.e.features & KVM_SREGS_E_IVOR) {
335 env->spr[SPR_BOOKE_IVOR0] = sregs.u.e.ivor_low[0];
336 env->spr[SPR_BOOKE_IVOR1] = sregs.u.e.ivor_low[1];
337 env->spr[SPR_BOOKE_IVOR2] = sregs.u.e.ivor_low[2];
338 env->spr[SPR_BOOKE_IVOR3] = sregs.u.e.ivor_low[3];
339 env->spr[SPR_BOOKE_IVOR4] = sregs.u.e.ivor_low[4];
340 env->spr[SPR_BOOKE_IVOR5] = sregs.u.e.ivor_low[5];
341 env->spr[SPR_BOOKE_IVOR6] = sregs.u.e.ivor_low[6];
342 env->spr[SPR_BOOKE_IVOR7] = sregs.u.e.ivor_low[7];
343 env->spr[SPR_BOOKE_IVOR8] = sregs.u.e.ivor_low[8];
344 env->spr[SPR_BOOKE_IVOR9] = sregs.u.e.ivor_low[9];
345 env->spr[SPR_BOOKE_IVOR10] = sregs.u.e.ivor_low[10];
346 env->spr[SPR_BOOKE_IVOR11] = sregs.u.e.ivor_low[11];
347 env->spr[SPR_BOOKE_IVOR12] = sregs.u.e.ivor_low[12];
348 env->spr[SPR_BOOKE_IVOR13] = sregs.u.e.ivor_low[13];
349 env->spr[SPR_BOOKE_IVOR14] = sregs.u.e.ivor_low[14];
350 env->spr[SPR_BOOKE_IVOR15] = sregs.u.e.ivor_low[15];
351
352 if (sregs.u.e.features & KVM_SREGS_E_SPE) {
353 env->spr[SPR_BOOKE_IVOR32] = sregs.u.e.ivor_high[0];
354 env->spr[SPR_BOOKE_IVOR33] = sregs.u.e.ivor_high[1];
355 env->spr[SPR_BOOKE_IVOR34] = sregs.u.e.ivor_high[2];
356 }
357
358 if (sregs.u.e.features & KVM_SREGS_E_PM) {
359 env->spr[SPR_BOOKE_IVOR35] = sregs.u.e.ivor_high[3];
360 }
361
362 if (sregs.u.e.features & KVM_SREGS_E_PC) {
363 env->spr[SPR_BOOKE_IVOR36] = sregs.u.e.ivor_high[4];
364 env->spr[SPR_BOOKE_IVOR37] = sregs.u.e.ivor_high[5];
365 }
366 }
367
368 if (sregs.u.e.features & KVM_SREGS_E_ARCH206_MMU) {
369 env->spr[SPR_BOOKE_MAS0] = sregs.u.e.mas0;
370 env->spr[SPR_BOOKE_MAS1] = sregs.u.e.mas1;
371 env->spr[SPR_BOOKE_MAS2] = sregs.u.e.mas2;
372 env->spr[SPR_BOOKE_MAS3] = sregs.u.e.mas7_3 & 0xffffffff;
373 env->spr[SPR_BOOKE_MAS4] = sregs.u.e.mas4;
374 env->spr[SPR_BOOKE_MAS6] = sregs.u.e.mas6;
375 env->spr[SPR_BOOKE_MAS7] = sregs.u.e.mas7_3 >> 32;
376 env->spr[SPR_MMUCFG] = sregs.u.e.mmucfg;
377 env->spr[SPR_BOOKE_TLB0CFG] = sregs.u.e.tlbcfg[0];
378 env->spr[SPR_BOOKE_TLB1CFG] = sregs.u.e.tlbcfg[1];
379 }
380
381 if (sregs.u.e.features & KVM_SREGS_EXP) {
382 env->spr[SPR_BOOKE_EPR] = sregs.u.e.epr;
383 }
384
385 if (sregs.u.e.features & KVM_SREGS_E_PD) {
386 env->spr[SPR_BOOKE_EPLC] = sregs.u.e.eplc;
387 env->spr[SPR_BOOKE_EPSC] = sregs.u.e.epsc;
388 }
389
390 if (sregs.u.e.impl_id == KVM_SREGS_E_IMPL_FSL) {
391 env->spr[SPR_E500_SVR] = sregs.u.e.impl.fsl.svr;
392 env->spr[SPR_Exxx_MCAR] = sregs.u.e.impl.fsl.mcar;
393 env->spr[SPR_HID0] = sregs.u.e.impl.fsl.hid0;
394
395 if (sregs.u.e.impl.fsl.features & KVM_SREGS_E_FSL_PIDn) {
396 env->spr[SPR_BOOKE_PID1] = sregs.u.e.impl.fsl.pid1;
397 env->spr[SPR_BOOKE_PID2] = sregs.u.e.impl.fsl.pid2;
398 }
399 }
fafc0b6a 400 }
90dc8812 401
90dc8812
SW
402 if (cap_segstate) {
403 ret = kvm_vcpu_ioctl(env, KVM_GET_SREGS, &sregs);
404 if (ret < 0) {
405 return ret;
406 }
407
bb593904 408 ppc_store_sdr1(env, sregs.u.s.sdr1);
ba5e5090
AG
409
410 /* Sync SLB */
82c09f2f 411#ifdef TARGET_PPC64
ba5e5090
AG
412 for (i = 0; i < 64; i++) {
413 ppc_store_slb(env, sregs.u.s.ppc64.slb[i].slbe,
414 sregs.u.s.ppc64.slb[i].slbv);
415 }
82c09f2f 416#endif
ba5e5090
AG
417
418 /* Sync SRs */
419 for (i = 0; i < 16; i++) {
420 env->sr[i] = sregs.u.s.ppc32.sr[i];
421 }
422
423 /* Sync BATs */
424 for (i = 0; i < 8; i++) {
425 env->DBAT[0][i] = sregs.u.s.ppc32.dbat[i] & 0xffffffff;
426 env->DBAT[1][i] = sregs.u.s.ppc32.dbat[i] >> 32;
427 env->IBAT[0][i] = sregs.u.s.ppc32.ibat[i] & 0xffffffff;
428 env->IBAT[1][i] = sregs.u.s.ppc32.ibat[i] >> 32;
429 }
fafc0b6a 430 }
ba5e5090 431
d76d1650
AJ
432 return 0;
433}
434
fc87e185
AG
435int kvmppc_set_interrupt(CPUState *env, int irq, int level)
436{
437 unsigned virq = level ? KVM_INTERRUPT_SET_LEVEL : KVM_INTERRUPT_UNSET;
438
439 if (irq != PPC_INTERRUPT_EXT) {
440 return 0;
441 }
442
443 if (!kvm_enabled() || !cap_interrupt_unset || !cap_interrupt_level) {
444 return 0;
445 }
446
447 kvm_vcpu_ioctl(env, KVM_INTERRUPT, &virq);
448
449 return 0;
450}
451
16415335
AG
452#if defined(TARGET_PPCEMB)
453#define PPC_INPUT_INT PPC40x_INPUT_INT
454#elif defined(TARGET_PPC64)
455#define PPC_INPUT_INT PPC970_INPUT_INT
456#else
457#define PPC_INPUT_INT PPC6xx_INPUT_INT
458#endif
459
bdcbd3e2 460void kvm_arch_pre_run(CPUState *env, struct kvm_run *run)
d76d1650
AJ
461{
462 int r;
463 unsigned irq;
464
465 /* PowerPC Qemu tracks the various core input pins (interrupt, critical
466 * interrupt, reset, etc) in PPC-specific env->irq_input_state. */
fc87e185
AG
467 if (!cap_interrupt_level &&
468 run->ready_for_interrupt_injection &&
d76d1650 469 (env->interrupt_request & CPU_INTERRUPT_HARD) &&
16415335 470 (env->irq_input_state & (1<<PPC_INPUT_INT)))
d76d1650
AJ
471 {
472 /* For now KVM disregards the 'irq' argument. However, in the
473 * future KVM could cache it in-kernel to avoid a heavyweight exit
474 * when reading the UIC.
475 */
fc87e185 476 irq = KVM_INTERRUPT_SET;
d76d1650
AJ
477
478 dprintf("injected interrupt %d\n", irq);
479 r = kvm_vcpu_ioctl(env, KVM_INTERRUPT, &irq);
480 if (r < 0)
481 printf("cpu %d fail inject %x\n", env->cpu_index, irq);
c821c2bd
AG
482
483 /* Always wake up soon in case the interrupt was level based */
74475455 484 qemu_mod_timer(idle_timer, qemu_get_clock_ns(vm_clock) +
c821c2bd 485 (get_ticks_per_sec() / 50));
d76d1650
AJ
486 }
487
488 /* We don't know if there are more interrupts pending after this. However,
489 * the guest will return to userspace in the course of handling this one
490 * anyways, so we will get a chance to deliver the rest. */
d76d1650
AJ
491}
492
7a39fe58 493void kvm_arch_post_run(CPUState *env, struct kvm_run *run)
d76d1650 494{
d76d1650
AJ
495}
496
99036865 497int kvm_arch_process_async_events(CPUState *env)
0af691d7 498{
bdcbd3e2 499 return 0;
0af691d7
MT
500}
501
d76d1650
AJ
502static int kvmppc_handle_halt(CPUState *env)
503{
504 if (!(env->interrupt_request & CPU_INTERRUPT_HARD) && (msr_ee)) {
505 env->halted = 1;
506 env->exception_index = EXCP_HLT;
507 }
508
bb4ea393 509 return 0;
d76d1650
AJ
510}
511
512/* map dcr access to existing qemu dcr emulation */
513static int kvmppc_handle_dcr_read(CPUState *env, uint32_t dcrn, uint32_t *data)
514{
515 if (ppc_dcr_read(env->dcr_env, dcrn, data) < 0)
516 fprintf(stderr, "Read to unhandled DCR (0x%x)\n", dcrn);
517
bb4ea393 518 return 0;
d76d1650
AJ
519}
520
521static int kvmppc_handle_dcr_write(CPUState *env, uint32_t dcrn, uint32_t data)
522{
523 if (ppc_dcr_write(env->dcr_env, dcrn, data) < 0)
524 fprintf(stderr, "Write to unhandled DCR (0x%x)\n", dcrn);
525
bb4ea393 526 return 0;
d76d1650
AJ
527}
528
529int kvm_arch_handle_exit(CPUState *env, struct kvm_run *run)
530{
bb4ea393 531 int ret;
d76d1650
AJ
532
533 switch (run->exit_reason) {
534 case KVM_EXIT_DCR:
535 if (run->dcr.is_write) {
536 dprintf("handle dcr write\n");
537 ret = kvmppc_handle_dcr_write(env, run->dcr.dcrn, run->dcr.data);
538 } else {
539 dprintf("handle dcr read\n");
540 ret = kvmppc_handle_dcr_read(env, run->dcr.dcrn, &run->dcr.data);
541 }
542 break;
543 case KVM_EXIT_HLT:
544 dprintf("handle halt\n");
545 ret = kvmppc_handle_halt(env);
546 break;
f61b4bed
AG
547#ifdef CONFIG_PSERIES
548 case KVM_EXIT_PAPR_HCALL:
549 dprintf("handle PAPR hypercall\n");
550 run->papr_hcall.ret = spapr_hypercall(env, run->papr_hcall.nr,
551 run->papr_hcall.args);
552 ret = 1;
553 break;
554#endif
73aaec4a
JK
555 default:
556 fprintf(stderr, "KVM: unknown exit reason %d\n", run->exit_reason);
557 ret = -1;
558 break;
d76d1650
AJ
559 }
560
561 return ret;
562}
563
dc333cd6
AG
564static int read_cpuinfo(const char *field, char *value, int len)
565{
566 FILE *f;
567 int ret = -1;
568 int field_len = strlen(field);
569 char line[512];
570
571 f = fopen("/proc/cpuinfo", "r");
572 if (!f) {
573 return -1;
574 }
575
576 do {
577 if(!fgets(line, sizeof(line), f)) {
578 break;
579 }
580 if (!strncmp(line, field, field_len)) {
581 strncpy(value, line, len);
582 ret = 0;
583 break;
584 }
585 } while(*line);
586
587 fclose(f);
588
589 return ret;
590}
591
592uint32_t kvmppc_get_tbfreq(void)
593{
594 char line[512];
595 char *ns;
596 uint32_t retval = get_ticks_per_sec();
597
598 if (read_cpuinfo("timebase", line, sizeof(line))) {
599 return retval;
600 }
601
602 if (!(ns = strchr(line, ':'))) {
603 return retval;
604 }
605
606 ns++;
607
608 retval = atoi(ns);
609 return retval;
610}
4513d923 611
eadaada1
AG
612/* Try to find a device tree node for a CPU with clock-frequency property */
613static int kvmppc_find_cpu_dt(char *buf, int buf_len)
614{
615 struct dirent *dirp;
616 DIR *dp;
617
618 if ((dp = opendir(PROC_DEVTREE_CPU)) == NULL) {
619 printf("Can't open directory " PROC_DEVTREE_CPU "\n");
620 return -1;
621 }
622
623 buf[0] = '\0';
624 while ((dirp = readdir(dp)) != NULL) {
625 FILE *f;
626 snprintf(buf, buf_len, "%s%s/clock-frequency", PROC_DEVTREE_CPU,
627 dirp->d_name);
628 f = fopen(buf, "r");
629 if (f) {
630 snprintf(buf, buf_len, "%s%s", PROC_DEVTREE_CPU, dirp->d_name);
631 fclose(f);
632 break;
633 }
634 buf[0] = '\0';
635 }
636 closedir(dp);
637 if (buf[0] == '\0') {
638 printf("Unknown host!\n");
639 return -1;
640 }
641
642 return 0;
643}
644
645uint64_t kvmppc_get_clockfreq(void)
646{
647 char buf[512];
648 uint32_t tb[2];
649 FILE *f;
650 int len;
651
652 if (kvmppc_find_cpu_dt(buf, sizeof(buf))) {
653 return 0;
654 }
655
656 strncat(buf, "/clock-frequency", sizeof(buf) - strlen(buf));
657
658 f = fopen(buf, "rb");
659 if (!f) {
660 return -1;
661 }
662
663 len = fread(tb, sizeof(tb[0]), 2, f);
664 fclose(f);
665 switch (len) {
666 case 1:
667 /* freq is only a single cell */
668 return tb[0];
669 case 2:
670 return *(uint64_t*)tb;
671 }
672
673 return 0;
674}
675
45024f09
AG
676int kvmppc_get_hypercall(CPUState *env, uint8_t *buf, int buf_len)
677{
678 uint32_t *hc = (uint32_t*)buf;
679
45024f09
AG
680 struct kvm_ppc_pvinfo pvinfo;
681
682 if (kvm_check_extension(env->kvm_state, KVM_CAP_PPC_GET_PVINFO) &&
683 !kvm_vm_ioctl(env->kvm_state, KVM_PPC_GET_PVINFO, &pvinfo)) {
684 memcpy(buf, pvinfo.hcall, buf_len);
685
686 return 0;
687 }
45024f09
AG
688
689 /*
690 * Fallback to always fail hypercalls:
691 *
692 * li r3, -1
693 * nop
694 * nop
695 * nop
696 */
697
698 hc[0] = 0x3860ffff;
699 hc[1] = 0x60000000;
700 hc[2] = 0x60000000;
701 hc[3] = 0x60000000;
702
703 return 0;
704}
705
f61b4bed
AG
706void kvmppc_set_papr(CPUState *env)
707{
94135e81
AG
708 struct kvm_enable_cap cap = {};
709 struct kvm_one_reg reg = {};
710 struct kvm_sregs sregs = {};
f61b4bed
AG
711 int ret;
712
f61b4bed
AG
713 cap.cap = KVM_CAP_PPC_PAPR;
714 ret = kvm_vcpu_ioctl(env, KVM_ENABLE_CAP, &cap);
715
716 if (ret) {
717 goto fail;
718 }
719
720 /*
721 * XXX We set HIOR here. It really should be a qdev property of
722 * the CPU node, but we don't have CPUs converted to qdev yet.
723 *
724 * Once we have qdev CPUs, move HIOR to a qdev property and
725 * remove this chunk.
726 */
94135e81
AG
727 reg.id = KVM_ONE_REG_PPC_HIOR;
728 reg.u.reg64 = env->spr[SPR_HIOR];
729 ret = kvm_vcpu_ioctl(env, KVM_SET_ONE_REG, &reg);
730 if (ret) {
731 goto fail;
732 }
733
734 /* Set SDR1 so kernel space finds the HTAB */
735 ret = kvm_vcpu_ioctl(env, KVM_GET_SREGS, &sregs);
736 if (ret) {
737 goto fail;
738 }
739
740 sregs.u.s.sdr1 = env->spr[SPR_SDR1];
741
742 ret = kvm_vcpu_ioctl(env, KVM_SET_SREGS, &sregs);
743 if (ret) {
744 goto fail;
745 }
f61b4bed
AG
746
747 return;
748
749fail:
750 cpu_abort(env, "This KVM version does not support PAPR\n");
751}
752
4513d923
GN
753bool kvm_arch_stop_on_emulation_error(CPUState *env)
754{
755 return true;
756}
a1b87fe0
JK
757
758int kvm_arch_on_sigbus_vcpu(CPUState *env, int code, void *addr)
759{
760 return 1;
761}
762
763int kvm_arch_on_sigbus(int code, void *addr)
764{
765 return 1;
766}