On Wed, Aug 28, 2019 at 02:38:23PM +0100, Alexandru Elisei wrote: > When the MMU is off, all addresses are physical addresses. If the stack > pointer is not an identity mapped address (the virtual address is not the > same as the physical address), then we end up trying to access an invalid > memory region. This can happen if we call mmu_disable from a secondary CPU, > which has its stack allocated from the vmalloc region. > > Signed-off-by: Alexandru Elisei <alexandru.elisei@xxxxxxx> > --- > lib/arm/mmu.c | 4 ++++ > 1 file changed, 4 insertions(+) > > diff --git a/lib/arm/mmu.c b/lib/arm/mmu.c > index 3d38c8397f5a..161f7a8e607c 100644 > --- a/lib/arm/mmu.c > +++ b/lib/arm/mmu.c > @@ -66,8 +66,12 @@ void mmu_enable(pgd_t *pgtable) > extern void asm_mmu_disable(void); > void mmu_disable(void) > { > + unsigned long sp = current_stack_pointer; > int cpu = current_thread_info()->cpu; > > + assert_msg(__virt_to_phys(sp) == sp, > + "Attempting to disable MMU with non-identity mapped stack"); > + > mmu_mark_disabled(cpu); > > asm_mmu_disable(); > -- > 2.7.4 > Reviewed-by: Andrew Jones <drjones@xxxxxxxxxx>