mirror of
https://github.com/clearlinux/kvmtool.git
synced 2026-09-04 04:31:27 +00:00
In commit 06e6648 "move kvm_cpus into struct kvm", kvm_cpu__init() became kvm_cpu__arch_init() called from a new kvm_cpu__init(), and the call was moved from the end of the init sequence to much earlier, and in particular prior to irq__init(). This leads to a segfault on powerpc, because kvm_cpu__arch_init() calls into xics_cpu_register(), which dereferences vcpu->kvm.icp which is uninitialised until irq__init(). Later in commit a48488d "use init/exit where possible", irq__init() was pulled out of the init sequence and made a dev_base_init() routine, on x86. On powerpc the call to irq__init() was dropped entirely. Finally, we now have a circular dependency between kvm_cpu__init() (which needs kvm->arch.icp), and irq__init() (which needs kvm->nrcpus). This is caused by the combination of commit 89f40a7 "move nrcpus into struct kvm_config", which moved the global nrcpus into kvm->cfg, and commit 06e6648 "move kvm_cpus into struct kvm", which moved the setup of kvm->nrcpus from kvm->cfg into kvm_cpu__init(). To fix it we drop irq__init() entirely, if we ever have a non xics irq option we can bring it back. We turn xics_system_init() into xics_init(), and have it do the allocation and setup of the icp/ics, including the per-vcpu setup, removing the dependency from kvm_cpu__init() (via kvm_cpu__arch_init()). xics_init() is a base_init() routine, it can't be core, which should be early enough, fingers crossed. Finally drop irq__exit(), it does nothing and is never called. Signed-off-by: Michael Ellerman <michael@ellerman.id.au> Signed-off-by: Pekka Enberg <penberg@kernel.org>
19 lines
422 B
C
19 lines
422 B
C
/*
|
|
* PAPR Virtualized Interrupt System, aka ICS/ICP aka xics
|
|
*
|
|
* Copyright 2011 Matt Evans <matt@ozlabs.org>, IBM Corporation.
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify it
|
|
* under the terms of the GNU General Public License version 2 as published
|
|
* by the Free Software Foundation.
|
|
*/
|
|
|
|
#ifndef XICS_H
|
|
#define XICS_H
|
|
|
|
#define XICS_IPI 0x2
|
|
|
|
int xics_alloc_irqnum(void);
|
|
|
|
#endif
|