• Russell King's avatar
    ARM: kexec: fix oops after TLB are invalidated · 4d62e81b
    Russell King authored
    Giancarlo Ferrari reports the following oops while trying to use kexec:
    
     Unable to handle kernel paging request at virtual address 80112f38
     pgd = fd7ef03e
     [80112f38] *pgd=0001141e(bad)
     Internal error: Oops: 80d [#1] PREEMPT SMP ARM
     ...
    
    This is caused by machine_kexec() trying to set the kernel text to be
    read/write, so it can poke values into the relocation code before
    copying it - and an interrupt occuring which changes the page tables.
    The subsequent writes then hit read-only sections that trigger a
    data abort resulting in the above oops.
    
    Fix this by copying the relocation code, and then writing the variables
    into the destination, thereby avoiding the need to make the kernel text
    read/write.
    Reported-by: default avatarGiancarlo Ferrari <giancarlo.ferrari89@gmail.com>
    Tested-by: default avatarGiancarlo Ferrari <giancarlo.ferrari89@gmail.com>
    Signed-off-by: default avatarRussell King <rmk+kernel@armlinux.org.uk>
    4d62e81b
machine_kexec.c 4.83 KB