]> git.baikalelectronics.ru Git - kernel.git/commit
iscsi_ibft: fix crash due to KASLR physical memory remapping
authorMaurizio Lombardi <mlombard@redhat.com>
Thu, 29 Jul 2021 13:52:50 +0000 (15:52 +0200)
committerKonrad Rzeszutek Wilk <konrad@kernel.org>
Sun, 1 Aug 2021 02:20:24 +0000 (22:20 -0400)
commit3d810c0c53fbac5d8879ed6d81b494f44d9e4131
tree7446ef49a573aebac15135fd4c23631d4d650958
parentff259b4d6fed4bd42e9279ce210ec985caf37e5b
iscsi_ibft: fix crash due to KASLR physical memory remapping

Starting with commit 89f8aa88fbbb
("x86/setup: Consolidate early memory reservations")
memory reservations have been moved earlier during the boot process,
before the execution of the Kernel Address Space Layout Randomization code.

setup_arch() calls the iscsi_ibft's find_ibft_region() function
to find and reserve the memory dedicated to the iBFT and this function
also saves a virtual pointer to the iBFT table for later use.

The problem is that if KALSR is active, the physical memory gets
remapped somewhere else in the virtual address space and the pointer is
no longer valid, this will cause a kernel panic when the iscsi driver tries
to dereference it.

 iBFT detected.
 BUG: unable to handle page fault for address: ffff888000099fd8
 #PF: supervisor read access in kernel mode
 #PF: error_code(0x0000) - not-present page
 PGD 0 P4D 0
 Oops: 0000 [#1] SMP PTI

..snip..

 Call Trace:
  ? ibft_create_kobject+0x1d2/0x1d2 [iscsi_ibft]
  do_one_initcall+0x44/0x1d0
  ? kmem_cache_alloc_trace+0x119/0x220
  do_init_module+0x5c/0x270
  __do_sys_init_module+0x12e/0x1b0
  do_syscall_64+0x40/0x80
  entry_SYSCALL_64_after_hwframe+0x44/0xae

Fix this bug by saving the address of the physical location
of the ibft; later the driver will use isa_bus_to_virt() to get
the correct virtual address.

N.B. On each reboot KASLR randomizes the virtual addresses so
assuming phys_to_virt before KASLR does its deed is incorrect.

Simplify the code by renaming find_ibft_region()
to reserve_ibft_region() and remove all the wrappers.

Signed-off-by: Maurizio Lombardi <mlombard@redhat.com>
Reviewed-by: Mike Rapoport <rppt@linux.ibm.com>
Signed-off-by: Konrad Rzeszutek Wilk <konrad@kernel.org>
arch/x86/kernel/setup.c
drivers/firmware/iscsi_ibft.c
drivers/firmware/iscsi_ibft_find.c
include/linux/iscsi_ibft.h