• James Hogan's avatar
    MIPS: c-r4k: Sync icache when it fills from dcache · b2a3c5be
    James Hogan authored
    It is still necessary to handle icache coherency in flush_cache_range()
    and copy_to_user_page() when the icache fills from the dcache, even
    though the dcache does not need to be written back. However when this
    handling was added in commit 2eaa7ec2 ("[MIPS] Handle I-cache
    coherency in flush_cache_range()"), it did not do any icache flushing
    when it fills from dcache.
    
    Therefore fix r4k_flush_cache_range() to run
    local_r4k_flush_cache_range() without taking into account whether icache
    fills from dcache, so that the icache coherency gets handled. Checks are
    also added in local_r4k_flush_cache_range() so that the dcache blast
    doesn't take place when icache fills from dcache.
    
    A test to mmap a page PROT_READ|PROT_WRITE, modify code in it, and
    mprotect it to VM_READ|VM_EXEC (similar to case described in above
    commit) can hit this case quite easily to verify the fix.
    
    A similar check was added in commit f8829cae ("[MIPS] Fix aliasing
    bug in copy_to_user_page / copy_from_user_page"), so also fix
    copy_to_user_page() similarly, to call flush_cache_page() without taking
    into account whether icache fills from dcache, since flush_cache_page()
    already takes that into account to avoid performing a dcache flush.
    Signed-off-by: default avatarJames Hogan <james.hogan@imgtec.com>
    Cc: Leonid Yegoshin <leonid.yegoshin@imgtec.com>
    Cc: Manuel Lauss <manuel.lauss@gmail.com>
    Cc: linux-mips@linux-mips.org
    Patchwork: https://patchwork.linux-mips.org/patch/12179/Signed-off-by: default avatarRalf Baechle <ralf@linux-mips.org>
    b2a3c5be
c-r4k.c 46.2 KB