summaryrefslogtreecommitdiff
path: root/fs/lockd
diff options
context:
space:
mode:
authorMatt Fleming <matt.fleming@intel.com>2013-06-05 18:15:41 +0400
committerBjorn Helgaas <bhelgaas@google.com>2013-06-05 20:50:04 +0400
commit65694c5aaddfedd9da082e4e150cafc6b3fc8a6a (patch)
tree3c549fa9d366f6ae1e5f6347fa67a26e12334853 /fs/lockd
parentf3f011750a18abc389ef1b0d504fbeeacf641919 (diff)
downloadlinux-65694c5aaddfedd9da082e4e150cafc6b3fc8a6a.tar.xz
x86/PCI: Map PCI setup data with ioremap() so it can be in highmem
f9a37be0f0 ("x86: Use PCI setup data") added support for using PCI ROM images from setup_data. This used phys_to_virt(), which is not valid for highmem addresses, and can cause a crash when booting a 32-bit kernel via the EFI boot stub. pcibios_add_device() assumes that the physical addresses stored in setup_data are accessible via the direct kernel mapping, and that calling phys_to_virt() is valid. This isn't guaranteed to be true on x86 where the direct mapping range is much smaller than on x86-64. Calling phys_to_virt() on a highmem address results in the following: BUG: unable to handle kernel paging request at 39a3c198 IP: [<c262be0f>] pcibios_add_device+0x2f/0x90 ... Call Trace: [<c2370c73>] pci_device_add+0xe3/0x130 [<c274640b>] pci_scan_single_device+0x8b/0xb0 [<c2370d08>] pci_scan_slot+0x48/0x100 [<c2371904>] pci_scan_child_bus+0x24/0xc0 [<c262a7b0>] pci_acpi_scan_root+0x2c0/0x490 [<c23b7203>] acpi_pci_root_add+0x312/0x42f ... The solution is to use ioremap() instead of phys_to_virt() to map the setup data into the kernel address space. [bhelgaas: changelog] Tested-by: Jani Nikula <jani.nikula@intel.com> Signed-off-by: Matt Fleming <matt.fleming@intel.com> Signed-off-by: Bjorn Helgaas <bhelgaas@google.com> Cc: Matthew Garrett <mjg59@srcf.ucam.org> Cc: Seth Forshee <seth.forshee@canonical.com> Cc: Jesse Barnes <jbarnes@virtuousgeek.org> Cc: stable@vger.kernel.org # v3.8+
Diffstat (limited to 'fs/lockd')
0 files changed, 0 insertions, 0 deletions