Skip to content
Snippets Groups Projects
Commit a25bbe12 authored by Stuart Menefy's avatar Stuart Menefy Committed by Paul Mundt
Browse files

sh: Flush executable pages in copy_user_highpage


This resolves a problem seen when using the Android dynamic linker.
Sometimes the dynamic linker would seg-fault at start up and this
was eventually traced to the handling of a COW fault for a page which
was being modified by the linker. If there was no cache aliasing between
the kernel and the user page, the page was not flushed, leaving the
newly copied data in the D-cache. However when executing instructions
from that page, the I-cache is filled directly from external memory,
rather than the D-cache, and causing garbage to be executed.

Signed-off-by: default avatarStuart Menefy <stuart.menefy@st.com>
Signed-off-by: default avatarPaul Mundt <lethal@linux-sh.org>
parent a0865368
No related branches found
No related tags found
No related merge requests found
...@@ -108,7 +108,8 @@ void copy_user_highpage(struct page *to, struct page *from, ...@@ -108,7 +108,8 @@ void copy_user_highpage(struct page *to, struct page *from,
kunmap_atomic(vfrom, KM_USER0); kunmap_atomic(vfrom, KM_USER0);
} }
if (pages_do_alias((unsigned long)vto, vaddr & PAGE_MASK)) if (pages_do_alias((unsigned long)vto, vaddr & PAGE_MASK) ||
(vma->vm_flags & VM_EXEC))
__flush_purge_region(vto, PAGE_SIZE); __flush_purge_region(vto, PAGE_SIZE);
kunmap_atomic(vto, KM_USER1); kunmap_atomic(vto, KM_USER1);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment