xref: /qemu/hw/intc/xics_kvm.c (revision de86eccc0c836adfa8dbb94848096720177f5ccb)
1 /*
2  * QEMU PowerPC pSeries Logical Partition (aka sPAPR) hardware System Emulator
3  *
4  * PAPR Virtualized Interrupt System, aka ICS/ICP aka xics, in-kernel emulation
5  *
6  * Copyright (c) 2013 David Gibson, IBM Corporation.
7  *
8  * Permission is hereby granted, free of charge, to any person obtaining a copy
9  * of this software and associated documentation files (the "Software"), to deal
10  * in the Software without restriction, including without limitation the rights
11  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12  * copies of the Software, and to permit persons to whom the Software is
13  * furnished to do so, subject to the following conditions:
14  *
15  * The above copyright notice and this permission notice shall be included in
16  * all copies or substantial portions of the Software.
17  *
18  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
21  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24  * THE SOFTWARE.
25  *
26  */
27 
28 #include "qemu/osdep.h"
29 #include "qapi/error.h"
30 #include "qemu-common.h"
31 #include "cpu.h"
32 #include "hw/hw.h"
33 #include "trace.h"
34 #include "sysemu/kvm.h"
35 #include "hw/ppc/spapr.h"
36 #include "hw/ppc/xics.h"
37 #include "kvm_ppc.h"
38 #include "qemu/config-file.h"
39 #include "qemu/error-report.h"
40 
41 #include <sys/ioctl.h>
42 
43 static int kernel_xics_fd = -1;
44 
45 typedef struct KVMEnabledICP {
46     unsigned long vcpu_id;
47     QLIST_ENTRY(KVMEnabledICP) node;
48 } KVMEnabledICP;
49 
50 static QLIST_HEAD(, KVMEnabledICP)
51     kvm_enabled_icps = QLIST_HEAD_INITIALIZER(&kvm_enabled_icps);
52 
53 /*
54  * ICP-KVM
55  */
56 static void icp_get_kvm_state(ICPState *icp)
57 {
58     uint64_t state;
59     struct kvm_one_reg reg = {
60         .id = KVM_REG_PPC_ICP_STATE,
61         .addr = (uintptr_t)&state,
62     };
63     int ret;
64 
65     /* ICP for this CPU thread is not in use, exiting */
66     if (!icp->cs) {
67         return;
68     }
69 
70     ret = kvm_vcpu_ioctl(icp->cs, KVM_GET_ONE_REG, &reg);
71     if (ret != 0) {
72         error_report("Unable to retrieve KVM interrupt controller state"
73                 " for CPU %ld: %s", kvm_arch_vcpu_id(icp->cs), strerror(errno));
74         exit(1);
75     }
76 
77     icp->xirr = state >> KVM_REG_PPC_ICP_XISR_SHIFT;
78     icp->mfrr = (state >> KVM_REG_PPC_ICP_MFRR_SHIFT)
79         & KVM_REG_PPC_ICP_MFRR_MASK;
80     icp->pending_priority = (state >> KVM_REG_PPC_ICP_PPRI_SHIFT)
81         & KVM_REG_PPC_ICP_PPRI_MASK;
82 }
83 
84 static int icp_set_kvm_state(ICPState *icp, int version_id)
85 {
86     uint64_t state;
87     struct kvm_one_reg reg = {
88         .id = KVM_REG_PPC_ICP_STATE,
89         .addr = (uintptr_t)&state,
90     };
91     int ret;
92 
93     /* ICP for this CPU thread is not in use, exiting */
94     if (!icp->cs) {
95         return 0;
96     }
97 
98     state = ((uint64_t)icp->xirr << KVM_REG_PPC_ICP_XISR_SHIFT)
99         | ((uint64_t)icp->mfrr << KVM_REG_PPC_ICP_MFRR_SHIFT)
100         | ((uint64_t)icp->pending_priority << KVM_REG_PPC_ICP_PPRI_SHIFT);
101 
102     ret = kvm_vcpu_ioctl(icp->cs, KVM_SET_ONE_REG, &reg);
103     if (ret != 0) {
104         error_report("Unable to restore KVM interrupt controller state (0x%"
105                 PRIx64 ") for CPU %ld: %s", state, kvm_arch_vcpu_id(icp->cs),
106                 strerror(errno));
107         return ret;
108     }
109 
110     return 0;
111 }
112 
113 static void icp_kvm_reset(void *dev)
114 {
115     ICPState *icp = ICP(dev);
116 
117     icp->xirr = 0;
118     icp->pending_priority = 0xff;
119     icp->mfrr = 0xff;
120 
121     /* Make all outputs as deasserted only if the CPU thread is in use */
122     if (icp->output) {
123         qemu_set_irq(icp->output, 0);
124     }
125 
126     icp_set_kvm_state(icp, 1);
127 }
128 
129 static void icp_kvm_cpu_setup(ICPState *icp, PowerPCCPU *cpu)
130 {
131     CPUState *cs = CPU(cpu);
132     KVMEnabledICP *enabled_icp;
133     unsigned long vcpu_id = kvm_arch_vcpu_id(cs);
134     int ret;
135 
136     if (kernel_xics_fd == -1) {
137         abort();
138     }
139 
140     /*
141      * If we are reusing a parked vCPU fd corresponding to the CPU
142      * which was hot-removed earlier we don't have to renable
143      * KVM_CAP_IRQ_XICS capability again.
144      */
145     QLIST_FOREACH(enabled_icp, &kvm_enabled_icps, node) {
146         if (enabled_icp->vcpu_id == vcpu_id) {
147             return;
148         }
149     }
150 
151     ret = kvm_vcpu_enable_cap(cs, KVM_CAP_IRQ_XICS, 0, kernel_xics_fd, vcpu_id);
152     if (ret < 0) {
153         error_report("Unable to connect CPU%ld to kernel XICS: %s", vcpu_id,
154                      strerror(errno));
155         exit(1);
156     }
157     enabled_icp = g_malloc(sizeof(*enabled_icp));
158     enabled_icp->vcpu_id = vcpu_id;
159     QLIST_INSERT_HEAD(&kvm_enabled_icps, enabled_icp, node);
160 }
161 
162 static void icp_kvm_realize(DeviceState *dev, Error **errp)
163 {
164     qemu_register_reset(icp_kvm_reset, dev);
165 }
166 
167 static void icp_kvm_class_init(ObjectClass *klass, void *data)
168 {
169     DeviceClass *dc = DEVICE_CLASS(klass);
170     ICPStateClass *icpc = ICP_CLASS(klass);
171 
172     dc->realize = icp_kvm_realize;
173     icpc->pre_save = icp_get_kvm_state;
174     icpc->post_load = icp_set_kvm_state;
175     icpc->cpu_setup = icp_kvm_cpu_setup;
176 }
177 
178 static const TypeInfo icp_kvm_info = {
179     .name = TYPE_KVM_ICP,
180     .parent = TYPE_ICP,
181     .instance_size = sizeof(ICPState),
182     .class_init = icp_kvm_class_init,
183     .class_size = sizeof(ICPStateClass),
184 };
185 
186 /*
187  * ICS-KVM
188  */
189 static void ics_get_kvm_state(ICSState *ics)
190 {
191     uint64_t state;
192     struct kvm_device_attr attr = {
193         .flags = 0,
194         .group = KVM_DEV_XICS_GRP_SOURCES,
195         .addr = (uint64_t)(uintptr_t)&state,
196     };
197     int i;
198 
199     for (i = 0; i < ics->nr_irqs; i++) {
200         ICSIRQState *irq = &ics->irqs[i];
201         int ret;
202 
203         attr.attr = i + ics->offset;
204 
205         ret = ioctl(kernel_xics_fd, KVM_GET_DEVICE_ATTR, &attr);
206         if (ret != 0) {
207             error_report("Unable to retrieve KVM interrupt controller state"
208                     " for IRQ %d: %s", i + ics->offset, strerror(errno));
209             exit(1);
210         }
211 
212         irq->server = state & KVM_XICS_DESTINATION_MASK;
213         irq->saved_priority = (state >> KVM_XICS_PRIORITY_SHIFT)
214             & KVM_XICS_PRIORITY_MASK;
215         /*
216          * To be consistent with the software emulation in xics.c, we
217          * split out the masked state + priority that we get from the
218          * kernel into 'current priority' (0xff if masked) and
219          * 'saved priority' (if masked, this is the priority the
220          * interrupt had before it was masked).  Masking and unmasking
221          * are done with the ibm,int-off and ibm,int-on RTAS calls.
222          */
223         if (state & KVM_XICS_MASKED) {
224             irq->priority = 0xff;
225         } else {
226             irq->priority = irq->saved_priority;
227         }
228 
229         irq->status = 0;
230         if (state & KVM_XICS_PENDING) {
231             if (state & KVM_XICS_LEVEL_SENSITIVE) {
232                 irq->status |= XICS_STATUS_ASSERTED;
233             } else {
234                 /*
235                  * A pending edge-triggered interrupt (or MSI)
236                  * must have been rejected previously when we
237                  * first detected it and tried to deliver it,
238                  * so mark it as pending and previously rejected
239                  * for consistency with how xics.c works.
240                  */
241                 irq->status |= XICS_STATUS_MASKED_PENDING
242                     | XICS_STATUS_REJECTED;
243             }
244         }
245         if (state & KVM_XICS_PRESENTED) {
246                 irq->status |= XICS_STATUS_PRESENTED;
247         }
248         if (state & KVM_XICS_QUEUED) {
249                 irq->status |= XICS_STATUS_QUEUED;
250         }
251     }
252 }
253 
254 static int ics_set_kvm_state(ICSState *ics, int version_id)
255 {
256     uint64_t state;
257     struct kvm_device_attr attr = {
258         .flags = 0,
259         .group = KVM_DEV_XICS_GRP_SOURCES,
260         .addr = (uint64_t)(uintptr_t)&state,
261     };
262     int i;
263 
264     for (i = 0; i < ics->nr_irqs; i++) {
265         ICSIRQState *irq = &ics->irqs[i];
266         int ret;
267 
268         attr.attr = i + ics->offset;
269 
270         state = irq->server;
271         state |= (uint64_t)(irq->saved_priority & KVM_XICS_PRIORITY_MASK)
272             << KVM_XICS_PRIORITY_SHIFT;
273         if (irq->priority != irq->saved_priority) {
274             assert(irq->priority == 0xff);
275             state |= KVM_XICS_MASKED;
276         }
277 
278         if (ics->irqs[i].flags & XICS_FLAGS_IRQ_LSI) {
279             state |= KVM_XICS_LEVEL_SENSITIVE;
280             if (irq->status & XICS_STATUS_ASSERTED) {
281                 state |= KVM_XICS_PENDING;
282             }
283         } else {
284             if (irq->status & XICS_STATUS_MASKED_PENDING) {
285                 state |= KVM_XICS_PENDING;
286             }
287         }
288         if (irq->status & XICS_STATUS_PRESENTED) {
289                 state |= KVM_XICS_PRESENTED;
290         }
291         if (irq->status & XICS_STATUS_QUEUED) {
292                 state |= KVM_XICS_QUEUED;
293         }
294 
295         ret = ioctl(kernel_xics_fd, KVM_SET_DEVICE_ATTR, &attr);
296         if (ret != 0) {
297             error_report("Unable to restore KVM interrupt controller state"
298                     " for IRQs %d: %s", i + ics->offset, strerror(errno));
299             return ret;
300         }
301     }
302 
303     return 0;
304 }
305 
306 static void ics_kvm_set_irq(void *opaque, int srcno, int val)
307 {
308     ICSState *ics = opaque;
309     struct kvm_irq_level args;
310     int rc;
311 
312     args.irq = srcno + ics->offset;
313     if (ics->irqs[srcno].flags & XICS_FLAGS_IRQ_MSI) {
314         if (!val) {
315             return;
316         }
317         args.level = KVM_INTERRUPT_SET;
318     } else {
319         args.level = val ? KVM_INTERRUPT_SET_LEVEL : KVM_INTERRUPT_UNSET;
320     }
321     rc = kvm_vm_ioctl(kvm_state, KVM_IRQ_LINE, &args);
322     if (rc < 0) {
323         perror("kvm_irq_line");
324     }
325 }
326 
327 static void ics_kvm_reset(void *dev)
328 {
329     ICSState *ics = ICS_SIMPLE(dev);
330     int i;
331     uint8_t flags[ics->nr_irqs];
332 
333     for (i = 0; i < ics->nr_irqs; i++) {
334         flags[i] = ics->irqs[i].flags;
335     }
336 
337     memset(ics->irqs, 0, sizeof(ICSIRQState) * ics->nr_irqs);
338 
339     for (i = 0; i < ics->nr_irqs; i++) {
340         ics->irqs[i].priority = 0xff;
341         ics->irqs[i].saved_priority = 0xff;
342         ics->irqs[i].flags = flags[i];
343     }
344 
345     ics_set_kvm_state(ics, 1);
346 }
347 
348 static void ics_kvm_realize(DeviceState *dev, Error **errp)
349 {
350     ICSState *ics = ICS_SIMPLE(dev);
351 
352     if (!ics->nr_irqs) {
353         error_setg(errp, "Number of interrupts needs to be greater 0");
354         return;
355     }
356     ics->irqs = g_malloc0(ics->nr_irqs * sizeof(ICSIRQState));
357     ics->qirqs = qemu_allocate_irqs(ics_kvm_set_irq, ics, ics->nr_irqs);
358 
359     qemu_register_reset(ics_kvm_reset, dev);
360 }
361 
362 static void ics_kvm_class_init(ObjectClass *klass, void *data)
363 {
364     ICSStateClass *icsc = ICS_BASE_CLASS(klass);
365 
366     icsc->realize = ics_kvm_realize;
367     icsc->pre_save = ics_get_kvm_state;
368     icsc->post_load = ics_set_kvm_state;
369 }
370 
371 static const TypeInfo ics_kvm_info = {
372     .name = TYPE_ICS_KVM,
373     .parent = TYPE_ICS_SIMPLE,
374     .instance_size = sizeof(ICSState),
375     .class_init = ics_kvm_class_init,
376 };
377 
378 /*
379  * XICS-KVM
380  */
381 
382 static void rtas_dummy(PowerPCCPU *cpu, sPAPRMachineState *spapr,
383                        uint32_t token,
384                        uint32_t nargs, target_ulong args,
385                        uint32_t nret, target_ulong rets)
386 {
387     error_report("pseries: %s must never be called for in-kernel XICS",
388                  __func__);
389 }
390 
391 int xics_kvm_init(sPAPRMachineState *spapr, Error **errp)
392 {
393     int rc;
394     struct kvm_create_device xics_create_device = {
395         .type = KVM_DEV_TYPE_XICS,
396         .flags = 0,
397     };
398 
399     if (!kvm_enabled() || !kvm_check_extension(kvm_state, KVM_CAP_IRQ_XICS)) {
400         error_setg(errp,
401                    "KVM and IRQ_XICS capability must be present for in-kernel XICS");
402         goto fail;
403     }
404 
405     spapr_rtas_register(RTAS_IBM_SET_XIVE, "ibm,set-xive", rtas_dummy);
406     spapr_rtas_register(RTAS_IBM_GET_XIVE, "ibm,get-xive", rtas_dummy);
407     spapr_rtas_register(RTAS_IBM_INT_OFF, "ibm,int-off", rtas_dummy);
408     spapr_rtas_register(RTAS_IBM_INT_ON, "ibm,int-on", rtas_dummy);
409 
410     rc = kvmppc_define_rtas_kernel_token(RTAS_IBM_SET_XIVE, "ibm,set-xive");
411     if (rc < 0) {
412         error_setg(errp, "kvmppc_define_rtas_kernel_token: ibm,set-xive");
413         goto fail;
414     }
415 
416     rc = kvmppc_define_rtas_kernel_token(RTAS_IBM_GET_XIVE, "ibm,get-xive");
417     if (rc < 0) {
418         error_setg(errp, "kvmppc_define_rtas_kernel_token: ibm,get-xive");
419         goto fail;
420     }
421 
422     rc = kvmppc_define_rtas_kernel_token(RTAS_IBM_INT_ON, "ibm,int-on");
423     if (rc < 0) {
424         error_setg(errp, "kvmppc_define_rtas_kernel_token: ibm,int-on");
425         goto fail;
426     }
427 
428     rc = kvmppc_define_rtas_kernel_token(RTAS_IBM_INT_OFF, "ibm,int-off");
429     if (rc < 0) {
430         error_setg(errp, "kvmppc_define_rtas_kernel_token: ibm,int-off");
431         goto fail;
432     }
433 
434     /* Create the kernel ICP */
435     rc = kvm_vm_ioctl(kvm_state, KVM_CREATE_DEVICE, &xics_create_device);
436     if (rc < 0) {
437         error_setg_errno(errp, -rc, "Error on KVM_CREATE_DEVICE for XICS");
438         goto fail;
439     }
440 
441     kernel_xics_fd = xics_create_device.fd;
442 
443     kvm_kernel_irqchip = true;
444     kvm_msi_via_irqfd_allowed = true;
445     kvm_gsi_direct_mapping = true;
446 
447     return rc;
448 
449 fail:
450     kvmppc_define_rtas_kernel_token(0, "ibm,set-xive");
451     kvmppc_define_rtas_kernel_token(0, "ibm,get-xive");
452     kvmppc_define_rtas_kernel_token(0, "ibm,int-on");
453     kvmppc_define_rtas_kernel_token(0, "ibm,int-off");
454     return -1;
455 }
456 
457 static void xics_kvm_register_types(void)
458 {
459     type_register_static(&ics_kvm_info);
460     type_register_static(&icp_kvm_info);
461 }
462 
463 type_init(xics_kvm_register_types)
464