Statistics
| Branch: | Revision:

root / target-ppc / kvm.c @ dcfd14b3

History | View | Annotate | Download (15.5 kB)

1 d76d1650 aurel32
/*
2 d76d1650 aurel32
 * PowerPC implementation of KVM hooks
3 d76d1650 aurel32
 *
4 d76d1650 aurel32
 * Copyright IBM Corp. 2007
5 90dc8812 Scott Wood
 * Copyright (C) 2011 Freescale Semiconductor, Inc.
6 d76d1650 aurel32
 *
7 d76d1650 aurel32
 * Authors:
8 d76d1650 aurel32
 *  Jerone Young <jyoung5@us.ibm.com>
9 d76d1650 aurel32
 *  Christian Ehrhardt <ehrhardt@linux.vnet.ibm.com>
10 d76d1650 aurel32
 *  Hollis Blanchard <hollisb@us.ibm.com>
11 d76d1650 aurel32
 *
12 d76d1650 aurel32
 * This work is licensed under the terms of the GNU GPL, version 2 or later.
13 d76d1650 aurel32
 * See the COPYING file in the top-level directory.
14 d76d1650 aurel32
 *
15 d76d1650 aurel32
 */
16 d76d1650 aurel32
17 d76d1650 aurel32
#include <sys/types.h>
18 d76d1650 aurel32
#include <sys/ioctl.h>
19 d76d1650 aurel32
#include <sys/mman.h>
20 d76d1650 aurel32
21 d76d1650 aurel32
#include <linux/kvm.h>
22 d76d1650 aurel32
23 d76d1650 aurel32
#include "qemu-common.h"
24 d76d1650 aurel32
#include "qemu-timer.h"
25 d76d1650 aurel32
#include "sysemu.h"
26 d76d1650 aurel32
#include "kvm.h"
27 d76d1650 aurel32
#include "kvm_ppc.h"
28 d76d1650 aurel32
#include "cpu.h"
29 d76d1650 aurel32
#include "device_tree.h"
30 d76d1650 aurel32
31 d76d1650 aurel32
//#define DEBUG_KVM
32 d76d1650 aurel32
33 d76d1650 aurel32
#ifdef DEBUG_KVM
34 d76d1650 aurel32
#define dprintf(fmt, ...) \
35 d76d1650 aurel32
    do { fprintf(stderr, fmt, ## __VA_ARGS__); } while (0)
36 d76d1650 aurel32
#else
37 d76d1650 aurel32
#define dprintf(fmt, ...) \
38 d76d1650 aurel32
    do { } while (0)
39 d76d1650 aurel32
#endif
40 d76d1650 aurel32
41 94a8d39a Jan Kiszka
const KVMCapabilityInfo kvm_arch_required_capabilities[] = {
42 94a8d39a Jan Kiszka
    KVM_CAP_LAST_INFO
43 94a8d39a Jan Kiszka
};
44 94a8d39a Jan Kiszka
45 fc87e185 Alexander Graf
static int cap_interrupt_unset = false;
46 fc87e185 Alexander Graf
static int cap_interrupt_level = false;
47 90dc8812 Scott Wood
static int cap_segstate;
48 90dc8812 Scott Wood
#ifdef KVM_CAP_PPC_BOOKE_SREGS
49 90dc8812 Scott Wood
static int cap_booke_sregs;
50 90dc8812 Scott Wood
#endif
51 fc87e185 Alexander Graf
52 c821c2bd Alexander Graf
/* XXX We have a race condition where we actually have a level triggered
53 c821c2bd Alexander Graf
 *     interrupt, but the infrastructure can't expose that yet, so the guest
54 c821c2bd Alexander Graf
 *     takes but ignores it, goes to sleep and never gets notified that there's
55 c821c2bd Alexander Graf
 *     still an interrupt pending.
56 c6a94ba5 Alexander Graf
 *
57 c821c2bd Alexander Graf
 *     As a quick workaround, let's just wake up again 20 ms after we injected
58 c821c2bd Alexander Graf
 *     an interrupt. That way we can assure that we're always reinjecting
59 c821c2bd Alexander Graf
 *     interrupts in case the guest swallowed them.
60 c6a94ba5 Alexander Graf
 */
61 c6a94ba5 Alexander Graf
static QEMUTimer *idle_timer;
62 c6a94ba5 Alexander Graf
63 c821c2bd Alexander Graf
static void kvm_kick_env(void *env)
64 c6a94ba5 Alexander Graf
{
65 c821c2bd Alexander Graf
    qemu_cpu_kick(env);
66 c6a94ba5 Alexander Graf
}
67 c6a94ba5 Alexander Graf
68 cad1e282 Jan Kiszka
int kvm_arch_init(KVMState *s)
69 d76d1650 aurel32
{
70 fc87e185 Alexander Graf
#ifdef KVM_CAP_PPC_UNSET_IRQ
71 fc87e185 Alexander Graf
    cap_interrupt_unset = kvm_check_extension(s, KVM_CAP_PPC_UNSET_IRQ);
72 fc87e185 Alexander Graf
#endif
73 fc87e185 Alexander Graf
#ifdef KVM_CAP_PPC_IRQ_LEVEL
74 fc87e185 Alexander Graf
    cap_interrupt_level = kvm_check_extension(s, KVM_CAP_PPC_IRQ_LEVEL);
75 fc87e185 Alexander Graf
#endif
76 90dc8812 Scott Wood
#ifdef KVM_CAP_PPC_SEGSTATE
77 90dc8812 Scott Wood
    cap_segstate = kvm_check_extension(s, KVM_CAP_PPC_SEGSTATE);
78 90dc8812 Scott Wood
#endif
79 90dc8812 Scott Wood
#ifdef KVM_CAP_PPC_BOOKE_SREGS
80 90dc8812 Scott Wood
    cap_booke_sregs = kvm_check_extension(s, KVM_CAP_PPC_BOOKE_SREGS);
81 90dc8812 Scott Wood
#endif
82 fc87e185 Alexander Graf
83 fc87e185 Alexander Graf
    if (!cap_interrupt_level) {
84 fc87e185 Alexander Graf
        fprintf(stderr, "KVM: Couldn't find level irq capability. Expect the "
85 fc87e185 Alexander Graf
                        "VM to stall at times!\n");
86 fc87e185 Alexander Graf
    }
87 fc87e185 Alexander Graf
88 d76d1650 aurel32
    return 0;
89 d76d1650 aurel32
}
90 d76d1650 aurel32
91 5666ca4a Scott Wood
static int kvm_arch_sync_sregs(CPUState *cenv)
92 d76d1650 aurel32
{
93 861bbc80 Alexander Graf
    struct kvm_sregs sregs;
94 5666ca4a Scott Wood
    int ret;
95 5666ca4a Scott Wood
96 5666ca4a Scott Wood
    if (cenv->excp_model == POWERPC_EXCP_BOOKE) {
97 64e07be5 Alexander Graf
        /* What we're really trying to say is "if we're on BookE, we use
98 64e07be5 Alexander Graf
           the native PVR for now". This is the only sane way to check
99 64e07be5 Alexander Graf
           it though, so we potentially confuse users that they can run
100 64e07be5 Alexander Graf
           BookE guests on BookS. Let's hope nobody dares enough :) */
101 5666ca4a Scott Wood
        return 0;
102 5666ca4a Scott Wood
    } else {
103 90dc8812 Scott Wood
        if (!cap_segstate) {
104 64e07be5 Alexander Graf
            fprintf(stderr, "kvm error: missing PVR setting capability\n");
105 64e07be5 Alexander Graf
            return -ENOSYS;
106 5666ca4a Scott Wood
        }
107 5666ca4a Scott Wood
    }
108 5666ca4a Scott Wood
109 64e07be5 Alexander Graf
#if !defined(CONFIG_KVM_PPC_PVR)
110 64e07be5 Alexander Graf
    if (1) {
111 64e07be5 Alexander Graf
        fprintf(stderr, "kvm error: missing PVR setting capability\n");
112 64e07be5 Alexander Graf
        return -ENOSYS;
113 64e07be5 Alexander Graf
    }
114 64e07be5 Alexander Graf
#endif
115 64e07be5 Alexander Graf
116 5666ca4a Scott Wood
    ret = kvm_vcpu_ioctl(cenv, KVM_GET_SREGS, &sregs);
117 5666ca4a Scott Wood
    if (ret) {
118 5666ca4a Scott Wood
        return ret;
119 5666ca4a Scott Wood
    }
120 861bbc80 Alexander Graf
121 64e07be5 Alexander Graf
#ifdef CONFIG_KVM_PPC_PVR
122 861bbc80 Alexander Graf
    sregs.pvr = cenv->spr[SPR_PVR];
123 64e07be5 Alexander Graf
#endif
124 5666ca4a Scott Wood
    return kvm_vcpu_ioctl(cenv, KVM_SET_SREGS, &sregs);
125 5666ca4a Scott Wood
}
126 5666ca4a Scott Wood
127 5666ca4a Scott Wood
int kvm_arch_init_vcpu(CPUState *cenv)
128 5666ca4a Scott Wood
{
129 5666ca4a Scott Wood
    int ret;
130 5666ca4a Scott Wood
131 5666ca4a Scott Wood
    ret = kvm_arch_sync_sregs(cenv);
132 5666ca4a Scott Wood
    if (ret) {
133 5666ca4a Scott Wood
        return ret;
134 5666ca4a Scott Wood
    }
135 861bbc80 Alexander Graf
136 74475455 Paolo Bonzini
    idle_timer = qemu_new_timer_ns(vm_clock, kvm_kick_env, cenv);
137 c821c2bd Alexander Graf
138 861bbc80 Alexander Graf
    return ret;
139 d76d1650 aurel32
}
140 d76d1650 aurel32
141 caa5af0f Jan Kiszka
void kvm_arch_reset_vcpu(CPUState *env)
142 caa5af0f Jan Kiszka
{
143 caa5af0f Jan Kiszka
}
144 caa5af0f Jan Kiszka
145 ea375f9a Jan Kiszka
int kvm_arch_put_registers(CPUState *env, int level)
146 d76d1650 aurel32
{
147 d76d1650 aurel32
    struct kvm_regs regs;
148 d76d1650 aurel32
    int ret;
149 d76d1650 aurel32
    int i;
150 d76d1650 aurel32
151 d76d1650 aurel32
    ret = kvm_vcpu_ioctl(env, KVM_GET_REGS, &regs);
152 d76d1650 aurel32
    if (ret < 0)
153 d76d1650 aurel32
        return ret;
154 d76d1650 aurel32
155 d76d1650 aurel32
    regs.ctr = env->ctr;
156 d76d1650 aurel32
    regs.lr  = env->lr;
157 d76d1650 aurel32
    regs.xer = env->xer;
158 d76d1650 aurel32
    regs.msr = env->msr;
159 d76d1650 aurel32
    regs.pc = env->nip;
160 d76d1650 aurel32
161 d76d1650 aurel32
    regs.srr0 = env->spr[SPR_SRR0];
162 d76d1650 aurel32
    regs.srr1 = env->spr[SPR_SRR1];
163 d76d1650 aurel32
164 d76d1650 aurel32
    regs.sprg0 = env->spr[SPR_SPRG0];
165 d76d1650 aurel32
    regs.sprg1 = env->spr[SPR_SPRG1];
166 d76d1650 aurel32
    regs.sprg2 = env->spr[SPR_SPRG2];
167 d76d1650 aurel32
    regs.sprg3 = env->spr[SPR_SPRG3];
168 d76d1650 aurel32
    regs.sprg4 = env->spr[SPR_SPRG4];
169 d76d1650 aurel32
    regs.sprg5 = env->spr[SPR_SPRG5];
170 d76d1650 aurel32
    regs.sprg6 = env->spr[SPR_SPRG6];
171 d76d1650 aurel32
    regs.sprg7 = env->spr[SPR_SPRG7];
172 d76d1650 aurel32
173 90dc8812 Scott Wood
    regs.pid = env->spr[SPR_BOOKE_PID];
174 90dc8812 Scott Wood
175 d76d1650 aurel32
    for (i = 0;i < 32; i++)
176 d76d1650 aurel32
        regs.gpr[i] = env->gpr[i];
177 d76d1650 aurel32
178 d76d1650 aurel32
    ret = kvm_vcpu_ioctl(env, KVM_SET_REGS, &regs);
179 d76d1650 aurel32
    if (ret < 0)
180 d76d1650 aurel32
        return ret;
181 d76d1650 aurel32
182 d76d1650 aurel32
    return ret;
183 d76d1650 aurel32
}
184 d76d1650 aurel32
185 d76d1650 aurel32
int kvm_arch_get_registers(CPUState *env)
186 d76d1650 aurel32
{
187 d76d1650 aurel32
    struct kvm_regs regs;
188 ba5e5090 Alexander Graf
    struct kvm_sregs sregs;
189 90dc8812 Scott Wood
    uint32_t cr;
190 138b38b6 Alexander Graf
    int i, ret;
191 d76d1650 aurel32
192 d76d1650 aurel32
    ret = kvm_vcpu_ioctl(env, KVM_GET_REGS, &regs);
193 d76d1650 aurel32
    if (ret < 0)
194 d76d1650 aurel32
        return ret;
195 d76d1650 aurel32
196 90dc8812 Scott Wood
    cr = regs.cr;
197 90dc8812 Scott Wood
    for (i = 7; i >= 0; i--) {
198 90dc8812 Scott Wood
        env->crf[i] = cr & 15;
199 90dc8812 Scott Wood
        cr >>= 4;
200 90dc8812 Scott Wood
    }
201 ba5e5090 Alexander Graf
202 d76d1650 aurel32
    env->ctr = regs.ctr;
203 d76d1650 aurel32
    env->lr = regs.lr;
204 d76d1650 aurel32
    env->xer = regs.xer;
205 d76d1650 aurel32
    env->msr = regs.msr;
206 d76d1650 aurel32
    env->nip = regs.pc;
207 d76d1650 aurel32
208 d76d1650 aurel32
    env->spr[SPR_SRR0] = regs.srr0;
209 d76d1650 aurel32
    env->spr[SPR_SRR1] = regs.srr1;
210 d76d1650 aurel32
211 d76d1650 aurel32
    env->spr[SPR_SPRG0] = regs.sprg0;
212 d76d1650 aurel32
    env->spr[SPR_SPRG1] = regs.sprg1;
213 d76d1650 aurel32
    env->spr[SPR_SPRG2] = regs.sprg2;
214 d76d1650 aurel32
    env->spr[SPR_SPRG3] = regs.sprg3;
215 d76d1650 aurel32
    env->spr[SPR_SPRG4] = regs.sprg4;
216 d76d1650 aurel32
    env->spr[SPR_SPRG5] = regs.sprg5;
217 d76d1650 aurel32
    env->spr[SPR_SPRG6] = regs.sprg6;
218 d76d1650 aurel32
    env->spr[SPR_SPRG7] = regs.sprg7;
219 d76d1650 aurel32
220 90dc8812 Scott Wood
    env->spr[SPR_BOOKE_PID] = regs.pid;
221 90dc8812 Scott Wood
222 d76d1650 aurel32
    for (i = 0;i < 32; i++)
223 d76d1650 aurel32
        env->gpr[i] = regs.gpr[i];
224 d76d1650 aurel32
225 90dc8812 Scott Wood
#ifdef KVM_CAP_PPC_BOOKE_SREGS
226 90dc8812 Scott Wood
    if (cap_booke_sregs) {
227 90dc8812 Scott Wood
        ret = kvm_vcpu_ioctl(env, KVM_GET_SREGS, &sregs);
228 90dc8812 Scott Wood
        if (ret < 0) {
229 90dc8812 Scott Wood
            return ret;
230 90dc8812 Scott Wood
        }
231 90dc8812 Scott Wood
232 90dc8812 Scott Wood
        if (sregs.u.e.features & KVM_SREGS_E_BASE) {
233 90dc8812 Scott Wood
            env->spr[SPR_BOOKE_CSRR0] = sregs.u.e.csrr0;
234 90dc8812 Scott Wood
            env->spr[SPR_BOOKE_CSRR1] = sregs.u.e.csrr1;
235 90dc8812 Scott Wood
            env->spr[SPR_BOOKE_ESR] = sregs.u.e.esr;
236 90dc8812 Scott Wood
            env->spr[SPR_BOOKE_DEAR] = sregs.u.e.dear;
237 90dc8812 Scott Wood
            env->spr[SPR_BOOKE_MCSR] = sregs.u.e.mcsr;
238 90dc8812 Scott Wood
            env->spr[SPR_BOOKE_TSR] = sregs.u.e.tsr;
239 90dc8812 Scott Wood
            env->spr[SPR_BOOKE_TCR] = sregs.u.e.tcr;
240 90dc8812 Scott Wood
            env->spr[SPR_DECR] = sregs.u.e.dec;
241 90dc8812 Scott Wood
            env->spr[SPR_TBL] = sregs.u.e.tb & 0xffffffff;
242 90dc8812 Scott Wood
            env->spr[SPR_TBU] = sregs.u.e.tb >> 32;
243 90dc8812 Scott Wood
            env->spr[SPR_VRSAVE] = sregs.u.e.vrsave;
244 90dc8812 Scott Wood
        }
245 90dc8812 Scott Wood
246 90dc8812 Scott Wood
        if (sregs.u.e.features & KVM_SREGS_E_ARCH206) {
247 90dc8812 Scott Wood
            env->spr[SPR_BOOKE_PIR] = sregs.u.e.pir;
248 90dc8812 Scott Wood
            env->spr[SPR_BOOKE_MCSRR0] = sregs.u.e.mcsrr0;
249 90dc8812 Scott Wood
            env->spr[SPR_BOOKE_MCSRR1] = sregs.u.e.mcsrr1;
250 90dc8812 Scott Wood
            env->spr[SPR_BOOKE_DECAR] = sregs.u.e.decar;
251 90dc8812 Scott Wood
            env->spr[SPR_BOOKE_IVPR] = sregs.u.e.ivpr;
252 90dc8812 Scott Wood
        }
253 90dc8812 Scott Wood
254 90dc8812 Scott Wood
        if (sregs.u.e.features & KVM_SREGS_E_64) {
255 90dc8812 Scott Wood
            env->spr[SPR_BOOKE_EPCR] = sregs.u.e.epcr;
256 90dc8812 Scott Wood
        }
257 90dc8812 Scott Wood
258 90dc8812 Scott Wood
        if (sregs.u.e.features & KVM_SREGS_E_SPRG8) {
259 90dc8812 Scott Wood
            env->spr[SPR_BOOKE_SPRG8] = sregs.u.e.sprg8;
260 90dc8812 Scott Wood
        }
261 90dc8812 Scott Wood
262 90dc8812 Scott Wood
        if (sregs.u.e.features & KVM_SREGS_E_IVOR) {
263 90dc8812 Scott Wood
            env->spr[SPR_BOOKE_IVOR0] = sregs.u.e.ivor_low[0];
264 90dc8812 Scott Wood
            env->spr[SPR_BOOKE_IVOR1] = sregs.u.e.ivor_low[1];
265 90dc8812 Scott Wood
            env->spr[SPR_BOOKE_IVOR2] = sregs.u.e.ivor_low[2];
266 90dc8812 Scott Wood
            env->spr[SPR_BOOKE_IVOR3] = sregs.u.e.ivor_low[3];
267 90dc8812 Scott Wood
            env->spr[SPR_BOOKE_IVOR4] = sregs.u.e.ivor_low[4];
268 90dc8812 Scott Wood
            env->spr[SPR_BOOKE_IVOR5] = sregs.u.e.ivor_low[5];
269 90dc8812 Scott Wood
            env->spr[SPR_BOOKE_IVOR6] = sregs.u.e.ivor_low[6];
270 90dc8812 Scott Wood
            env->spr[SPR_BOOKE_IVOR7] = sregs.u.e.ivor_low[7];
271 90dc8812 Scott Wood
            env->spr[SPR_BOOKE_IVOR8] = sregs.u.e.ivor_low[8];
272 90dc8812 Scott Wood
            env->spr[SPR_BOOKE_IVOR9] = sregs.u.e.ivor_low[9];
273 90dc8812 Scott Wood
            env->spr[SPR_BOOKE_IVOR10] = sregs.u.e.ivor_low[10];
274 90dc8812 Scott Wood
            env->spr[SPR_BOOKE_IVOR11] = sregs.u.e.ivor_low[11];
275 90dc8812 Scott Wood
            env->spr[SPR_BOOKE_IVOR12] = sregs.u.e.ivor_low[12];
276 90dc8812 Scott Wood
            env->spr[SPR_BOOKE_IVOR13] = sregs.u.e.ivor_low[13];
277 90dc8812 Scott Wood
            env->spr[SPR_BOOKE_IVOR14] = sregs.u.e.ivor_low[14];
278 90dc8812 Scott Wood
            env->spr[SPR_BOOKE_IVOR15] = sregs.u.e.ivor_low[15];
279 90dc8812 Scott Wood
280 90dc8812 Scott Wood
            if (sregs.u.e.features & KVM_SREGS_E_SPE) {
281 90dc8812 Scott Wood
                env->spr[SPR_BOOKE_IVOR32] = sregs.u.e.ivor_high[0];
282 90dc8812 Scott Wood
                env->spr[SPR_BOOKE_IVOR33] = sregs.u.e.ivor_high[1];
283 90dc8812 Scott Wood
                env->spr[SPR_BOOKE_IVOR34] = sregs.u.e.ivor_high[2];
284 90dc8812 Scott Wood
            }
285 90dc8812 Scott Wood
286 90dc8812 Scott Wood
            if (sregs.u.e.features & KVM_SREGS_E_PM) {
287 90dc8812 Scott Wood
                env->spr[SPR_BOOKE_IVOR35] = sregs.u.e.ivor_high[3];
288 90dc8812 Scott Wood
            }
289 90dc8812 Scott Wood
290 90dc8812 Scott Wood
            if (sregs.u.e.features & KVM_SREGS_E_PC) {
291 90dc8812 Scott Wood
                env->spr[SPR_BOOKE_IVOR36] = sregs.u.e.ivor_high[4];
292 90dc8812 Scott Wood
                env->spr[SPR_BOOKE_IVOR37] = sregs.u.e.ivor_high[5];
293 90dc8812 Scott Wood
            }
294 90dc8812 Scott Wood
        }
295 90dc8812 Scott Wood
296 90dc8812 Scott Wood
        if (sregs.u.e.features & KVM_SREGS_E_ARCH206_MMU) {
297 90dc8812 Scott Wood
            env->spr[SPR_BOOKE_MAS0] = sregs.u.e.mas0;
298 90dc8812 Scott Wood
            env->spr[SPR_BOOKE_MAS1] = sregs.u.e.mas1;
299 90dc8812 Scott Wood
            env->spr[SPR_BOOKE_MAS2] = sregs.u.e.mas2;
300 90dc8812 Scott Wood
            env->spr[SPR_BOOKE_MAS3] = sregs.u.e.mas7_3 & 0xffffffff;
301 90dc8812 Scott Wood
            env->spr[SPR_BOOKE_MAS4] = sregs.u.e.mas4;
302 90dc8812 Scott Wood
            env->spr[SPR_BOOKE_MAS6] = sregs.u.e.mas6;
303 90dc8812 Scott Wood
            env->spr[SPR_BOOKE_MAS7] = sregs.u.e.mas7_3 >> 32;
304 90dc8812 Scott Wood
            env->spr[SPR_MMUCFG] = sregs.u.e.mmucfg;
305 90dc8812 Scott Wood
            env->spr[SPR_BOOKE_TLB0CFG] = sregs.u.e.tlbcfg[0];
306 90dc8812 Scott Wood
            env->spr[SPR_BOOKE_TLB1CFG] = sregs.u.e.tlbcfg[1];
307 90dc8812 Scott Wood
        }
308 90dc8812 Scott Wood
309 90dc8812 Scott Wood
        if (sregs.u.e.features & KVM_SREGS_EXP) {
310 90dc8812 Scott Wood
            env->spr[SPR_BOOKE_EPR] = sregs.u.e.epr;
311 90dc8812 Scott Wood
        }
312 90dc8812 Scott Wood
313 90dc8812 Scott Wood
        if (sregs.u.e.features & KVM_SREGS_E_PD) {
314 90dc8812 Scott Wood
            env->spr[SPR_BOOKE_EPLC] = sregs.u.e.eplc;
315 90dc8812 Scott Wood
            env->spr[SPR_BOOKE_EPSC] = sregs.u.e.epsc;
316 90dc8812 Scott Wood
        }
317 90dc8812 Scott Wood
318 90dc8812 Scott Wood
        if (sregs.u.e.impl_id == KVM_SREGS_E_IMPL_FSL) {
319 90dc8812 Scott Wood
            env->spr[SPR_E500_SVR] = sregs.u.e.impl.fsl.svr;
320 90dc8812 Scott Wood
            env->spr[SPR_Exxx_MCAR] = sregs.u.e.impl.fsl.mcar;
321 90dc8812 Scott Wood
            env->spr[SPR_HID0] = sregs.u.e.impl.fsl.hid0;
322 90dc8812 Scott Wood
323 90dc8812 Scott Wood
            if (sregs.u.e.impl.fsl.features & KVM_SREGS_E_FSL_PIDn) {
324 90dc8812 Scott Wood
                env->spr[SPR_BOOKE_PID1] = sregs.u.e.impl.fsl.pid1;
325 90dc8812 Scott Wood
                env->spr[SPR_BOOKE_PID2] = sregs.u.e.impl.fsl.pid2;
326 90dc8812 Scott Wood
            }
327 90dc8812 Scott Wood
        }
328 90dc8812 Scott Wood
    }
329 90dc8812 Scott Wood
#endif
330 90dc8812 Scott Wood
331 ba5e5090 Alexander Graf
#ifdef KVM_CAP_PPC_SEGSTATE
332 90dc8812 Scott Wood
    if (cap_segstate) {
333 90dc8812 Scott Wood
        ret = kvm_vcpu_ioctl(env, KVM_GET_SREGS, &sregs);
334 90dc8812 Scott Wood
        if (ret < 0) {
335 90dc8812 Scott Wood
            return ret;
336 90dc8812 Scott Wood
        }
337 90dc8812 Scott Wood
338 bb593904 David Gibson
        ppc_store_sdr1(env, sregs.u.s.sdr1);
339 ba5e5090 Alexander Graf
340 ba5e5090 Alexander Graf
        /* Sync SLB */
341 82c09f2f Alexander Graf
#ifdef TARGET_PPC64
342 ba5e5090 Alexander Graf
        for (i = 0; i < 64; i++) {
343 ba5e5090 Alexander Graf
            ppc_store_slb(env, sregs.u.s.ppc64.slb[i].slbe,
344 ba5e5090 Alexander Graf
                               sregs.u.s.ppc64.slb[i].slbv);
345 ba5e5090 Alexander Graf
        }
346 82c09f2f Alexander Graf
#endif
347 ba5e5090 Alexander Graf
348 ba5e5090 Alexander Graf
        /* Sync SRs */
349 ba5e5090 Alexander Graf
        for (i = 0; i < 16; i++) {
350 ba5e5090 Alexander Graf
            env->sr[i] = sregs.u.s.ppc32.sr[i];
351 ba5e5090 Alexander Graf
        }
352 ba5e5090 Alexander Graf
353 ba5e5090 Alexander Graf
        /* Sync BATs */
354 ba5e5090 Alexander Graf
        for (i = 0; i < 8; i++) {
355 ba5e5090 Alexander Graf
            env->DBAT[0][i] = sregs.u.s.ppc32.dbat[i] & 0xffffffff;
356 ba5e5090 Alexander Graf
            env->DBAT[1][i] = sregs.u.s.ppc32.dbat[i] >> 32;
357 ba5e5090 Alexander Graf
            env->IBAT[0][i] = sregs.u.s.ppc32.ibat[i] & 0xffffffff;
358 ba5e5090 Alexander Graf
            env->IBAT[1][i] = sregs.u.s.ppc32.ibat[i] >> 32;
359 ba5e5090 Alexander Graf
        }
360 ba5e5090 Alexander Graf
    }
361 ba5e5090 Alexander Graf
#endif
362 ba5e5090 Alexander Graf
363 d76d1650 aurel32
    return 0;
364 d76d1650 aurel32
}
365 d76d1650 aurel32
366 fc87e185 Alexander Graf
int kvmppc_set_interrupt(CPUState *env, int irq, int level)
367 fc87e185 Alexander Graf
{
368 fc87e185 Alexander Graf
    unsigned virq = level ? KVM_INTERRUPT_SET_LEVEL : KVM_INTERRUPT_UNSET;
369 fc87e185 Alexander Graf
370 fc87e185 Alexander Graf
    if (irq != PPC_INTERRUPT_EXT) {
371 fc87e185 Alexander Graf
        return 0;
372 fc87e185 Alexander Graf
    }
373 fc87e185 Alexander Graf
374 fc87e185 Alexander Graf
    if (!kvm_enabled() || !cap_interrupt_unset || !cap_interrupt_level) {
375 fc87e185 Alexander Graf
        return 0;
376 fc87e185 Alexander Graf
    }
377 fc87e185 Alexander Graf
378 fc87e185 Alexander Graf
    kvm_vcpu_ioctl(env, KVM_INTERRUPT, &virq);
379 fc87e185 Alexander Graf
380 fc87e185 Alexander Graf
    return 0;
381 fc87e185 Alexander Graf
}
382 fc87e185 Alexander Graf
383 16415335 Alexander Graf
#if defined(TARGET_PPCEMB)
384 16415335 Alexander Graf
#define PPC_INPUT_INT PPC40x_INPUT_INT
385 16415335 Alexander Graf
#elif defined(TARGET_PPC64)
386 16415335 Alexander Graf
#define PPC_INPUT_INT PPC970_INPUT_INT
387 16415335 Alexander Graf
#else
388 16415335 Alexander Graf
#define PPC_INPUT_INT PPC6xx_INPUT_INT
389 16415335 Alexander Graf
#endif
390 16415335 Alexander Graf
391 bdcbd3e2 Jan Kiszka
void kvm_arch_pre_run(CPUState *env, struct kvm_run *run)
392 d76d1650 aurel32
{
393 d76d1650 aurel32
    int r;
394 d76d1650 aurel32
    unsigned irq;
395 d76d1650 aurel32
396 d76d1650 aurel32
    /* PowerPC Qemu tracks the various core input pins (interrupt, critical
397 d76d1650 aurel32
     * interrupt, reset, etc) in PPC-specific env->irq_input_state. */
398 fc87e185 Alexander Graf
    if (!cap_interrupt_level &&
399 fc87e185 Alexander Graf
        run->ready_for_interrupt_injection &&
400 d76d1650 aurel32
        (env->interrupt_request & CPU_INTERRUPT_HARD) &&
401 16415335 Alexander Graf
        (env->irq_input_state & (1<<PPC_INPUT_INT)))
402 d76d1650 aurel32
    {
403 d76d1650 aurel32
        /* For now KVM disregards the 'irq' argument. However, in the
404 d76d1650 aurel32
         * future KVM could cache it in-kernel to avoid a heavyweight exit
405 d76d1650 aurel32
         * when reading the UIC.
406 d76d1650 aurel32
         */
407 fc87e185 Alexander Graf
        irq = KVM_INTERRUPT_SET;
408 d76d1650 aurel32
409 d76d1650 aurel32
        dprintf("injected interrupt %d\n", irq);
410 d76d1650 aurel32
        r = kvm_vcpu_ioctl(env, KVM_INTERRUPT, &irq);
411 d76d1650 aurel32
        if (r < 0)
412 d76d1650 aurel32
            printf("cpu %d fail inject %x\n", env->cpu_index, irq);
413 c821c2bd Alexander Graf
414 c821c2bd Alexander Graf
        /* Always wake up soon in case the interrupt was level based */
415 74475455 Paolo Bonzini
        qemu_mod_timer(idle_timer, qemu_get_clock_ns(vm_clock) +
416 c821c2bd Alexander Graf
                       (get_ticks_per_sec() / 50));
417 d76d1650 aurel32
    }
418 d76d1650 aurel32
419 d76d1650 aurel32
    /* We don't know if there are more interrupts pending after this. However,
420 d76d1650 aurel32
     * the guest will return to userspace in the course of handling this one
421 d76d1650 aurel32
     * anyways, so we will get a chance to deliver the rest. */
422 d76d1650 aurel32
}
423 d76d1650 aurel32
424 7a39fe58 Jan Kiszka
void kvm_arch_post_run(CPUState *env, struct kvm_run *run)
425 d76d1650 aurel32
{
426 d76d1650 aurel32
}
427 d76d1650 aurel32
428 99036865 Jan Kiszka
int kvm_arch_process_async_events(CPUState *env)
429 0af691d7 Marcelo Tosatti
{
430 bdcbd3e2 Jan Kiszka
    return 0;
431 0af691d7 Marcelo Tosatti
}
432 0af691d7 Marcelo Tosatti
433 d76d1650 aurel32
static int kvmppc_handle_halt(CPUState *env)
434 d76d1650 aurel32
{
435 d76d1650 aurel32
    if (!(env->interrupt_request & CPU_INTERRUPT_HARD) && (msr_ee)) {
436 d76d1650 aurel32
        env->halted = 1;
437 d76d1650 aurel32
        env->exception_index = EXCP_HLT;
438 d76d1650 aurel32
    }
439 d76d1650 aurel32
440 bb4ea393 Jan Kiszka
    return 0;
441 d76d1650 aurel32
}
442 d76d1650 aurel32
443 d76d1650 aurel32
/* map dcr access to existing qemu dcr emulation */
444 d76d1650 aurel32
static int kvmppc_handle_dcr_read(CPUState *env, uint32_t dcrn, uint32_t *data)
445 d76d1650 aurel32
{
446 d76d1650 aurel32
    if (ppc_dcr_read(env->dcr_env, dcrn, data) < 0)
447 d76d1650 aurel32
        fprintf(stderr, "Read to unhandled DCR (0x%x)\n", dcrn);
448 d76d1650 aurel32
449 bb4ea393 Jan Kiszka
    return 0;
450 d76d1650 aurel32
}
451 d76d1650 aurel32
452 d76d1650 aurel32
static int kvmppc_handle_dcr_write(CPUState *env, uint32_t dcrn, uint32_t data)
453 d76d1650 aurel32
{
454 d76d1650 aurel32
    if (ppc_dcr_write(env->dcr_env, dcrn, data) < 0)
455 d76d1650 aurel32
        fprintf(stderr, "Write to unhandled DCR (0x%x)\n", dcrn);
456 d76d1650 aurel32
457 bb4ea393 Jan Kiszka
    return 0;
458 d76d1650 aurel32
}
459 d76d1650 aurel32
460 d76d1650 aurel32
int kvm_arch_handle_exit(CPUState *env, struct kvm_run *run)
461 d76d1650 aurel32
{
462 bb4ea393 Jan Kiszka
    int ret;
463 d76d1650 aurel32
464 d76d1650 aurel32
    switch (run->exit_reason) {
465 d76d1650 aurel32
    case KVM_EXIT_DCR:
466 d76d1650 aurel32
        if (run->dcr.is_write) {
467 d76d1650 aurel32
            dprintf("handle dcr write\n");
468 d76d1650 aurel32
            ret = kvmppc_handle_dcr_write(env, run->dcr.dcrn, run->dcr.data);
469 d76d1650 aurel32
        } else {
470 d76d1650 aurel32
            dprintf("handle dcr read\n");
471 d76d1650 aurel32
            ret = kvmppc_handle_dcr_read(env, run->dcr.dcrn, &run->dcr.data);
472 d76d1650 aurel32
        }
473 d76d1650 aurel32
        break;
474 d76d1650 aurel32
    case KVM_EXIT_HLT:
475 d76d1650 aurel32
        dprintf("handle halt\n");
476 d76d1650 aurel32
        ret = kvmppc_handle_halt(env);
477 d76d1650 aurel32
        break;
478 73aaec4a Jan Kiszka
    default:
479 73aaec4a Jan Kiszka
        fprintf(stderr, "KVM: unknown exit reason %d\n", run->exit_reason);
480 73aaec4a Jan Kiszka
        ret = -1;
481 73aaec4a Jan Kiszka
        break;
482 d76d1650 aurel32
    }
483 d76d1650 aurel32
484 d76d1650 aurel32
    return ret;
485 d76d1650 aurel32
}
486 d76d1650 aurel32
487 dc333cd6 Alexander Graf
static int read_cpuinfo(const char *field, char *value, int len)
488 dc333cd6 Alexander Graf
{
489 dc333cd6 Alexander Graf
    FILE *f;
490 dc333cd6 Alexander Graf
    int ret = -1;
491 dc333cd6 Alexander Graf
    int field_len = strlen(field);
492 dc333cd6 Alexander Graf
    char line[512];
493 dc333cd6 Alexander Graf
494 dc333cd6 Alexander Graf
    f = fopen("/proc/cpuinfo", "r");
495 dc333cd6 Alexander Graf
    if (!f) {
496 dc333cd6 Alexander Graf
        return -1;
497 dc333cd6 Alexander Graf
    }
498 dc333cd6 Alexander Graf
499 dc333cd6 Alexander Graf
    do {
500 dc333cd6 Alexander Graf
        if(!fgets(line, sizeof(line), f)) {
501 dc333cd6 Alexander Graf
            break;
502 dc333cd6 Alexander Graf
        }
503 dc333cd6 Alexander Graf
        if (!strncmp(line, field, field_len)) {
504 dc333cd6 Alexander Graf
            strncpy(value, line, len);
505 dc333cd6 Alexander Graf
            ret = 0;
506 dc333cd6 Alexander Graf
            break;
507 dc333cd6 Alexander Graf
        }
508 dc333cd6 Alexander Graf
    } while(*line);
509 dc333cd6 Alexander Graf
510 dc333cd6 Alexander Graf
    fclose(f);
511 dc333cd6 Alexander Graf
512 dc333cd6 Alexander Graf
    return ret;
513 dc333cd6 Alexander Graf
}
514 dc333cd6 Alexander Graf
515 dc333cd6 Alexander Graf
uint32_t kvmppc_get_tbfreq(void)
516 dc333cd6 Alexander Graf
{
517 dc333cd6 Alexander Graf
    char line[512];
518 dc333cd6 Alexander Graf
    char *ns;
519 dc333cd6 Alexander Graf
    uint32_t retval = get_ticks_per_sec();
520 dc333cd6 Alexander Graf
521 dc333cd6 Alexander Graf
    if (read_cpuinfo("timebase", line, sizeof(line))) {
522 dc333cd6 Alexander Graf
        return retval;
523 dc333cd6 Alexander Graf
    }
524 dc333cd6 Alexander Graf
525 dc333cd6 Alexander Graf
    if (!(ns = strchr(line, ':'))) {
526 dc333cd6 Alexander Graf
        return retval;
527 dc333cd6 Alexander Graf
    }
528 dc333cd6 Alexander Graf
529 dc333cd6 Alexander Graf
    ns++;
530 dc333cd6 Alexander Graf
531 dc333cd6 Alexander Graf
    retval = atoi(ns);
532 dc333cd6 Alexander Graf
    return retval;
533 dc333cd6 Alexander Graf
}
534 4513d923 Gleb Natapov
535 45024f09 Alexander Graf
int kvmppc_get_hypercall(CPUState *env, uint8_t *buf, int buf_len)
536 45024f09 Alexander Graf
{
537 45024f09 Alexander Graf
    uint32_t *hc = (uint32_t*)buf;
538 45024f09 Alexander Graf
539 45024f09 Alexander Graf
#ifdef KVM_CAP_PPC_GET_PVINFO
540 45024f09 Alexander Graf
    struct kvm_ppc_pvinfo pvinfo;
541 45024f09 Alexander Graf
542 45024f09 Alexander Graf
    if (kvm_check_extension(env->kvm_state, KVM_CAP_PPC_GET_PVINFO) &&
543 45024f09 Alexander Graf
        !kvm_vm_ioctl(env->kvm_state, KVM_PPC_GET_PVINFO, &pvinfo)) {
544 45024f09 Alexander Graf
        memcpy(buf, pvinfo.hcall, buf_len);
545 45024f09 Alexander Graf
546 45024f09 Alexander Graf
        return 0;
547 45024f09 Alexander Graf
    }
548 45024f09 Alexander Graf
#endif
549 45024f09 Alexander Graf
550 45024f09 Alexander Graf
    /*
551 45024f09 Alexander Graf
     * Fallback to always fail hypercalls:
552 45024f09 Alexander Graf
     *
553 45024f09 Alexander Graf
     *     li r3, -1
554 45024f09 Alexander Graf
     *     nop
555 45024f09 Alexander Graf
     *     nop
556 45024f09 Alexander Graf
     *     nop
557 45024f09 Alexander Graf
     */
558 45024f09 Alexander Graf
559 45024f09 Alexander Graf
    hc[0] = 0x3860ffff;
560 45024f09 Alexander Graf
    hc[1] = 0x60000000;
561 45024f09 Alexander Graf
    hc[2] = 0x60000000;
562 45024f09 Alexander Graf
    hc[3] = 0x60000000;
563 45024f09 Alexander Graf
564 45024f09 Alexander Graf
    return 0;
565 45024f09 Alexander Graf
}
566 45024f09 Alexander Graf
567 4513d923 Gleb Natapov
bool kvm_arch_stop_on_emulation_error(CPUState *env)
568 4513d923 Gleb Natapov
{
569 4513d923 Gleb Natapov
    return true;
570 4513d923 Gleb Natapov
}
571 a1b87fe0 Jan Kiszka
572 a1b87fe0 Jan Kiszka
int kvm_arch_on_sigbus_vcpu(CPUState *env, int code, void *addr)
573 a1b87fe0 Jan Kiszka
{
574 a1b87fe0 Jan Kiszka
    return 1;
575 a1b87fe0 Jan Kiszka
}
576 a1b87fe0 Jan Kiszka
577 a1b87fe0 Jan Kiszka
int kvm_arch_on_sigbus(int code, void *addr)
578 a1b87fe0 Jan Kiszka
{
579 a1b87fe0 Jan Kiszka
    return 1;
580 a1b87fe0 Jan Kiszka
}