FROMGIT: KVM: arm64: Unregister HYP sections from kmemleak in protected mode
Booting a KVM host in protected mode with kmemleak quickly results in a pretty bad crash, as kmemleak doesn't know that the HYP sections have been taken away. This is specially true for the BSS section, which is part of the kernel BSS section and registered at boot time by kmemleak itself. Unregister the HYP part of the BSS before making that section HYP-private. The rest of the HYP-specific data is obtained via the page allocator or lives in other sections, none of which is subjected to kmemleak. Fixes: 90134ac9cabb ("KVM: arm64: Protect the .hyp sections from the host") Reviewed-by: Quentin Perret <qperret@google.com> Reviewed-by: Catalin Marinas <catalin.marinas@arm.com> Signed-off-by: Marc Zyngier <maz@kernel.org> Cc: stable@vger.kernel.org # 5.13 Link: https://lore.kernel.org/r/20210802123830.2195174-3-maz@kernel.org (cherry picked from commit 47e6223c841e029bfc23c3ce594dac5525cebaf8 git://git.kernel.org/pub/scm/linux/kernel/git/kvmarm/kvmarm.git next) Signed-off-by: Marc Zyngier <mzyngier@google.com> Bug: 194868924 Change-Id: I2881fc146d8a8dd8c9ad9bd9da3a8356968be794
This commit is contained in:

committed by
Will Deacon

parent
21e59d0563
commit
045204b080
@@ -15,6 +15,7 @@
|
|||||||
#include <linux/fs.h>
|
#include <linux/fs.h>
|
||||||
#include <linux/mman.h>
|
#include <linux/mman.h>
|
||||||
#include <linux/sched.h>
|
#include <linux/sched.h>
|
||||||
|
#include <linux/kmemleak.h>
|
||||||
#include <linux/kvm.h>
|
#include <linux/kvm.h>
|
||||||
#include <linux/kvm_irqfd.h>
|
#include <linux/kvm_irqfd.h>
|
||||||
#include <linux/irqbypass.h>
|
#include <linux/irqbypass.h>
|
||||||
@@ -1945,6 +1946,12 @@ static int finalize_hyp_mode(void)
|
|||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Exclude HYP BSS from kmemleak so that it doesn't get peeked
|
||||||
|
* at, which would end badly once the section is inaccessible.
|
||||||
|
* None of other sections should ever be introspected.
|
||||||
|
*/
|
||||||
|
kmemleak_free_part(__hyp_bss_start, __hyp_bss_end - __hyp_bss_start);
|
||||||
ret = pkvm_mark_hyp_section(__hyp_bss);
|
ret = pkvm_mark_hyp_section(__hyp_bss);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
Reference in New Issue
Block a user