linux/arch/arm
Mark Rutland 7cbb87d67e arm64: KVM: fix unmapping with 48-bit VAs
Currently if using a 48-bit VA, tearing down the hyp page tables (which
can happen in the absence of a GICH or GICV resource) results in the
rather nasty splat below, evidently becasue we access a table that
doesn't actually exist.

Commit 38f791a4e4 (arm64: KVM: Implement 48 VA support for KVM EL2
and Stage-2) added a pgd_none check to __create_hyp_mappings to account
for the additional level of tables, but didn't add a corresponding check
to unmap_range, and this seems to be the source of the problem.

This patch adds the missing pgd_none check, ensuring we don't try to
access tables that don't exist.

Original splat below:

kvm [1]: Using HYP init bounce page @83fe94a000
kvm [1]: Cannot obtain GICH resource
Unable to handle kernel paging request at virtual address ffff7f7fff000000
pgd = ffff800000770000
[ffff7f7fff000000] *pgd=0000000000000000
Internal error: Oops: 96000004 [#1] PREEMPT SMP
Modules linked in:
CPU: 1 PID: 1 Comm: swapper/0 Not tainted 3.18.0-rc2+ #89
task: ffff8003eb500000 ti: ffff8003eb45c000 task.ti: ffff8003eb45c000
PC is at unmap_range+0x120/0x580
LR is at free_hyp_pgds+0xac/0xe4
pc : [<ffff80000009b768>] lr : [<ffff80000009cad8>] pstate: 80000045
sp : ffff8003eb45fbf0
x29: ffff8003eb45fbf0 x28: ffff800000736000
x27: ffff800000735000 x26: ffff7f7fff000000
x25: 0000000040000000 x24: ffff8000006f5000
x23: 0000000000000000 x22: 0000007fffffffff
x21: 0000800000000000 x20: 0000008000000000
x19: 0000000000000000 x18: ffff800000648000
x17: ffff800000537228 x16: 0000000000000000
x15: 000000000000001f x14: 0000000000000000
x13: 0000000000000001 x12: 0000000000000020
x11: 0000000000000062 x10: 0000000000000006
x9 : 0000000000000000 x8 : 0000000000000063
x7 : 0000000000000018 x6 : 00000003ff000000
x5 : ffff800000744188 x4 : 0000000000000001
x3 : 0000000040000000 x2 : ffff800000000000
x1 : 0000007fffffffff x0 : 000000003fffffff

Process swapper/0 (pid: 1, stack limit = 0xffff8003eb45c058)
Stack: (0xffff8003eb45fbf0 to 0xffff8003eb460000)
fbe0:                                     eb45fcb0 ffff8003 0009cad8 ffff8000
fc00: 00000000 00000080 00736140 ffff8000 00736000 ffff8000 00000000 00007c80
fc20: 00000000 00000080 006f5000 ffff8000 00000000 00000080 00743000 ffff8000
fc40: 00735000 ffff8000 006d3030 ffff8000 006fe7b8 ffff8000 00000000 00000080
fc60: ffffffff 0000007f fdac1000 ffff8003 fd94b000 ffff8003 fda47000 ffff8003
fc80: 00502b40 ffff8000 ff000000 ffff7f7f fdec6000 00008003 fdac1630 ffff8003
fca0: eb45fcb0 ffff8003 ffffffff 0000007f eb45fd00 ffff8003 0009b378 ffff8000
fcc0: ffffffea 00000000 006fe000 ffff8000 00736728 ffff8000 00736120 ffff8000
fce0: 00000040 00000000 00743000 ffff8000 006fe7b8 ffff8000 0050cd48 00000000
fd00: eb45fd60 ffff8003 00096070 ffff8000 006f06e0 ffff8000 006f06e0 ffff8000
fd20: fd948b40 ffff8003 0009a320 ffff8000 00000000 00000000 00000000 00000000
fd40: 00000ae0 00000000 006aa25c ffff8000 eb45fd60 ffff8003 0017ca44 00000002
fd60: eb45fdc0 ffff8003 0009a33c ffff8000 006f06e0 ffff8000 006f06e0 ffff8000
fd80: fd948b40 ffff8003 0009a320 ffff8000 00000000 00000000 00735000 ffff8000
fda0: 006d3090 ffff8000 006aa25c ffff8000 00735000 ffff8000 006d3030 ffff8000
fdc0: eb45fdd0 ffff8003 000814c0 ffff8000 eb45fe50 ffff8003 006aaac4 ffff8000
fde0: 006ddd90 ffff8000 00000006 00000000 006d3000 ffff8000 00000095 00000000
fe00: 006a1e90 ffff8000 00735000 ffff8000 006d3000 ffff8000 006aa25c ffff8000
fe20: 00735000 ffff8000 006d3030 ffff8000 eb45fe50 ffff8003 006fac68 ffff8000
fe40: 00000006 00000006 fe293ee6 ffff8003 eb45feb0 ffff8003 004f8ee8 ffff8000
fe60: 004f8ed4 ffff8000 00735000 ffff8000 00000000 00000000 00000000 00000000
fe80: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
fea0: 00000000 00000000 00000000 00000000 00000000 00000000 000843d0 ffff8000
fec0: 004f8ed4 ffff8000 00000000 00000000 00000000 00000000 00000000 00000000
fee0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
ff00: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
ff20: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
ff40: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
ff60: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
ff80: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
ffa0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
ffc0: 00000000 00000000 00000000 00000000 00000000 00000000 00000005 00000000
ffe0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
Call trace:
[<ffff80000009b768>] unmap_range+0x120/0x580
[<ffff80000009cad4>] free_hyp_pgds+0xa8/0xe4
[<ffff80000009b374>] kvm_arch_init+0x268/0x44c
[<ffff80000009606c>] kvm_init+0x24/0x260
[<ffff80000009a338>] arm_init+0x18/0x24
[<ffff8000000814bc>] do_one_initcall+0x88/0x1a0
[<ffff8000006aaac0>] kernel_init_freeable+0x148/0x1e8
[<ffff8000004f8ee4>] kernel_init+0x10/0xd4
Code: 8b000263 92628479 d1000720 eb01001f (f9400340)
---[ end trace 3bc230562e926fa4 ]---
Kernel panic - not syncing: Attempted to kill init! exitcode=0x0000000b

Signed-off-by: Mark Rutland <mark.rutland@arm.com>
Cc: Catalin Marinas <catalin.marinas@arm.com>
Cc: Jungseok Lee <jungseoklee85@gmail.com>
Acked-by: Marc Zyngier <marc.zyngier@arm.com>
Acked-by: Christoffer Dall <christoffer.dall@linaro.org>
Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
2014-11-26 14:40:42 +01:00
..
boot ARM: tegra: Device tree fixes for v3.18-rc5 2014-11-19 17:35:30 +01:00
common dma: edma: move device registration to platform code 2014-11-05 18:26:10 -08:00
configs ARM: multi_v7_defconfig: fix failure setting CPU voltage by enabling dependent I2C controller 2014-11-19 09:35:17 -08:00
crypto
firmware
include ARM: enable bpf syscall 2014-10-29 00:18:20 +00:00
kernel Merge branch 'fixes' of git://ftp.arm.linux.org.uk/~rmk/linux-arm 2014-11-02 12:56:20 -08:00
kvm arm64: KVM: fix unmapping with 48-bit VAs 2014-11-26 14:40:42 +01:00
lib
mach-at91 Merge branch 'kbuild' of git://git.kernel.org/pub/scm/linux/kernel/git/mmarek/kbuild 2014-10-14 09:22:26 +02:00
mach-axxia
mach-bcm Merge tag 'bcm63138-v4' of http://github.com/brcm/linux into next/soc 2014-09-25 23:50:02 +02:00
mach-berlin
mach-clps711x ARM: SoC platform changes for 3.18 2014-10-08 17:13:04 -04:00
mach-cns3xxx CNS3xxx: Fix PCIe read size limit. 2014-09-25 23:35:01 +02:00
mach-davinci ARM: SoC DT updates for 3.18 2014-10-08 17:22:23 -04:00
mach-dove
mach-ebsa110 kbuild: remove unnecessary variable initializaions 2014-10-02 13:55:02 +02:00
mach-efm32
mach-ep93xx kbuild: remove unnecessary variable initializaions 2014-10-02 13:55:02 +02:00
mach-exynos Samsung fixes for v3.18 2014-10-14 23:31:13 -07:00
mach-footbridge kbuild: remove unnecessary variable initializaions 2014-10-02 13:55:02 +02:00
mach-gemini
mach-highbank mailbox: rename pl320-ipc specific mailbox.h 2014-10-08 10:39:33 +05:30
mach-hisi ARM: hisi: depend on ARCH_MULTI_V7 2014-10-02 16:40:10 +02:00
mach-imx ARM: imx: clk-vf610: define PLL's clock tree 2014-11-04 13:40:14 +08:00
mach-integrator PCI changes for the v3.18 merge window: 2014-10-09 15:03:49 -04:00
mach-iop13xx kbuild: remove unnecessary variable initializaions 2014-10-02 13:55:02 +02:00
mach-iop32x kbuild: remove unnecessary variable initializaions 2014-10-02 13:55:02 +02:00
mach-iop33x kbuild: remove unnecessary variable initializaions 2014-10-02 13:55:02 +02:00
mach-ixp4xx ARM: ixp4xx: remove compilation warnings in io.h 2014-10-28 22:04:01 +01:00
mach-keystone
mach-ks8695 kbuild: remove unnecessary variable initializaions 2014-10-02 13:55:02 +02:00
mach-lpc32xx
mach-mediatek
mach-meson ARM: meson: add basic support for MesonX SoCs 2014-09-25 17:34:42 +02:00
mach-mmp
mach-moxart
mach-msm
mach-mv78xx0
mach-mvebu ARM: mvebu: armada xp: Generalize use of i2c quirk 2014-11-01 22:07:44 +00:00
mach-mxs
mach-netx
mach-nomadik
mach-nspire
mach-omap1
mach-omap2 The i.MX fixes for 3.18, 2nd round: 2014-11-04 20:37:25 -08:00
mach-orion5x
mach-picoxcell
mach-prima2
mach-pxa ARM: pxa: fix hang on startup with DEBUG_LL 2014-10-20 21:11:40 +02:00
mach-qcom
mach-realview
mach-rockchip
mach-rpc kbuild: remove unnecessary variable initializaions 2014-10-02 13:55:02 +02:00
mach-s3c24xx Merge branch 'kbuild' of git://git.kernel.org/pub/scm/linux/kernel/git/mmarek/kbuild 2014-10-14 09:22:26 +02:00
mach-s3c64xx Merge branch 'kbuild' of git://git.kernel.org/pub/scm/linux/kernel/git/mmarek/kbuild 2014-10-14 09:22:26 +02:00
mach-s5pv210 Merge branch 'kbuild' of git://git.kernel.org/pub/scm/linux/kernel/git/mmarek/kbuild 2014-10-14 09:22:26 +02:00
mach-sa1100 Merge branch 'kbuild' of git://git.kernel.org/pub/scm/linux/kernel/git/mmarek/kbuild 2014-10-14 09:22:26 +02:00
mach-shmobile Renesas ARM Based SoC Clock Fixes for v3.18 2014-11-19 17:26:52 +01:00
mach-socfpga arm: socfpga: fix fetching cpu1start_addr for SMP 2014-10-21 14:04:14 -05:00
mach-spear
mach-sti
mach-sunxi
mach-tegra
mach-u300 kbuild: remove unnecessary variable initializaions 2014-10-02 13:55:02 +02:00
mach-ux500
mach-versatile
mach-vexpress
mach-vt8500 arm, vt8500, LLVMLlinux: Use mcr instead of mcr% for mach-vt8500 2014-09-26 01:49:03 +02:00
mach-w90x900
mach-zynq ACPI and power management updates for 3.18-rc1 2014-10-09 16:07:43 -04:00
mm Merge branch 'fixes' of git://ftp.arm.linux.org.uk/~rmk/linux-arm 2014-11-15 15:45:07 -08:00
net net: bpf: arm: make hole-faulting more robust 2014-09-23 12:40:22 -04:00
nwfpe
oprofile
plat-iop kbuild: remove unnecessary variable initializaions 2014-10-02 13:55:02 +02:00
plat-omap Merge branch 'kbuild' of git://git.kernel.org/pub/scm/linux/kernel/git/mmarek/kbuild 2014-10-14 09:22:26 +02:00
plat-orion ARM: orion: Fix for certain sequence of request_irq can cause irq storm 2014-11-01 22:07:45 +00:00
plat-pxa ARM: pxa: ssp: provide platform_device_id for PXA3xx 2014-09-19 01:56:02 +08:00
plat-samsung Samsung fixes for v3.18 2014-10-14 23:31:13 -07:00
plat-versatile
tools
vfp
xen
Kconfig xen: features and fixes for 3.18-rc0 2014-10-11 20:29:01 -04:00
Kconfig-nommu
Kconfig.debug ARM: pxa: fix hang on startup with DEBUG_LL 2014-10-20 21:11:40 +02:00
Makefile Merge branch 'kbuild' of git://git.kernel.org/pub/scm/linux/kernel/git/mmarek/kbuild 2014-10-14 09:22:26 +02:00