]> git.karo-electronics.de Git - karo-tx-linux.git/commit
kvm tools: Fix segfault on powerpc in xics_register()
authorMichael Ellerman <michael@ellerman.id.au>
Fri, 5 Oct 2012 01:15:18 +0000 (11:15 +1000)
committerPekka Enberg <penberg@kernel.org>
Fri, 5 Oct 2012 06:29:18 +0000 (09:29 +0300)
commitea9b027e890785a5ddcc15c3b1d25e383c0f31e8
treee6517411f2e5816159656d5729661fde46dd4b0e
parentfc51703a5925fc25be101b1d245b7bd347664772
kvm tools: Fix segfault on powerpc in xics_register()

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>
tools/kvm/powerpc/irq.c
tools/kvm/powerpc/kvm-cpu.c
tools/kvm/powerpc/xics.c
tools/kvm/powerpc/xics.h