• David Howells's avatar
    MN10300: Fix flush_icache_range() · 57cf4f78
    David Howells authored
    flush_icache_range() is given virtual addresses to describe the region.  It
    deals with these by attempting to translate them through the current set of
    page tables.
    
    This is fine for userspace memory and vmalloc()'d areas as they are governed by
    page tables.  However, since the regions above 0x80000000 aren't translated
    through the page tables by the MMU, the kernel doesn't bother to set up page
    tables for them (see paging_init()).
    
    This means flush_icache_range() as it stands cannot be used to flush regions of
    the VM area between 0x80000000 and 0x9fffffff where the kernel resides if the
    data cache is operating in WriteBack mode.
    
    To fix this, make flush_icache_range() first check for addresses in the upper
    half of VM space and deal with them appropriately, before dealing with any
    range in the page table mapped area.
    
    Ordinarily, this is not a problem, but it has the capacity to make kprobes and
    kgdb malfunction.  It should not affect gdbstub, signal frame setup or module
    loading as gdb has its own flush functions, and the others take place in the
    page table mapped area only.
    Signed-off-by: default avatarDavid Howells <dhowells@redhat.com>
    Acked-by: default avatarAkira Takeuchi <takeuchi.akr@jp.panasonic.com>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    57cf4f78
cache.c 3.43 KB