|
@@ -329,17 +329,6 @@ EXPORT_SYMBOL(flush_kernel_dcache_page_asm);
|
|
|
EXPORT_SYMBOL(flush_data_cache_local);
|
|
|
EXPORT_SYMBOL(flush_kernel_icache_range_asm);
|
|
|
|
|
|
-void clear_user_page_asm(void *page, unsigned long vaddr)
|
|
|
-{
|
|
|
- unsigned long flags;
|
|
|
- /* This function is implemented in assembly in pacache.S */
|
|
|
- extern void __clear_user_page_asm(void *page, unsigned long vaddr);
|
|
|
-
|
|
|
- purge_tlb_start(flags);
|
|
|
- __clear_user_page_asm(page, vaddr);
|
|
|
- purge_tlb_end(flags);
|
|
|
-}
|
|
|
-
|
|
|
#define FLUSH_THRESHOLD 0x80000 /* 0.5MB */
|
|
|
int parisc_cache_flush_threshold __read_mostly = FLUSH_THRESHOLD;
|
|
|
|
|
@@ -373,20 +362,9 @@ void __init parisc_setup_cache_timing(void)
|
|
|
printk(KERN_INFO "Setting cache flush threshold to %x (%d CPUs online)\n", parisc_cache_flush_threshold, num_online_cpus());
|
|
|
}
|
|
|
|
|
|
-extern void purge_kernel_dcache_page(unsigned long);
|
|
|
-extern void clear_user_page_asm(void *page, unsigned long vaddr);
|
|
|
-
|
|
|
-void clear_user_page(void *page, unsigned long vaddr, struct page *pg)
|
|
|
-{
|
|
|
- unsigned long flags;
|
|
|
-
|
|
|
- purge_kernel_dcache_page((unsigned long)page);
|
|
|
- purge_tlb_start(flags);
|
|
|
- pdtlb_kernel(page);
|
|
|
- purge_tlb_end(flags);
|
|
|
- clear_user_page_asm(page, vaddr);
|
|
|
-}
|
|
|
-EXPORT_SYMBOL(clear_user_page);
|
|
|
+extern void purge_kernel_dcache_page_asm(unsigned long);
|
|
|
+extern void clear_user_page_asm(void *, unsigned long);
|
|
|
+extern void copy_user_page_asm(void *, void *, unsigned long);
|
|
|
|
|
|
void flush_kernel_dcache_page_addr(void *addr)
|
|
|
{
|
|
@@ -399,11 +377,26 @@ void flush_kernel_dcache_page_addr(void *addr)
|
|
|
}
|
|
|
EXPORT_SYMBOL(flush_kernel_dcache_page_addr);
|
|
|
|
|
|
+void clear_user_page(void *vto, unsigned long vaddr, struct page *page)
|
|
|
+{
|
|
|
+ clear_page_asm(vto);
|
|
|
+ if (!parisc_requires_coherency())
|
|
|
+ flush_kernel_dcache_page_asm(vto);
|
|
|
+}
|
|
|
+EXPORT_SYMBOL(clear_user_page);
|
|
|
+
|
|
|
void copy_user_page(void *vto, void *vfrom, unsigned long vaddr,
|
|
|
- struct page *pg)
|
|
|
+ struct page *pg)
|
|
|
{
|
|
|
- /* no coherency needed (all in kmap/kunmap) */
|
|
|
- copy_user_page_asm(vto, vfrom);
|
|
|
+ /* Copy using kernel mapping. No coherency is needed
|
|
|
+ (all in kmap/kunmap) on machines that don't support
|
|
|
+ non-equivalent aliasing. However, the `from' page
|
|
|
+ needs to be flushed before it can be accessed through
|
|
|
+ the kernel mapping. */
|
|
|
+ preempt_disable();
|
|
|
+ flush_dcache_page_asm(__pa(vfrom), vaddr);
|
|
|
+ preempt_enable();
|
|
|
+ copy_page_asm(vto, vfrom);
|
|
|
if (!parisc_requires_coherency())
|
|
|
flush_kernel_dcache_page_asm(vto);
|
|
|
}
|