diff options
Diffstat (limited to 'arch/sh/mm/pg-sh4.c')
-rw-r--r-- | arch/sh/mm/pg-sh4.c | 35 |
1 files changed, 8 insertions, 27 deletions
diff --git a/arch/sh/mm/pg-sh4.c b/arch/sh/mm/pg-sh4.c index 07371ed7a313..3f98d2a4f936 100644 --- a/arch/sh/mm/pg-sh4.c +++ b/arch/sh/mm/pg-sh4.c | |||
@@ -6,22 +6,12 @@ | |||
6 | * | 6 | * |
7 | * Released under the terms of the GNU GPL v2.0. | 7 | * Released under the terms of the GNU GPL v2.0. |
8 | */ | 8 | */ |
9 | #include <linux/init.h> | ||
10 | #include <linux/mman.h> | ||
11 | #include <linux/mm.h> | 9 | #include <linux/mm.h> |
12 | #include <linux/threads.h> | 10 | #include <linux/mutex.h> |
13 | #include <asm/addrspace.h> | ||
14 | #include <asm/page.h> | ||
15 | #include <asm/pgtable.h> | ||
16 | #include <asm/processor.h> | ||
17 | #include <asm/cache.h> | ||
18 | #include <asm/io.h> | ||
19 | #include <asm/uaccess.h> | ||
20 | #include <asm/pgalloc.h> | ||
21 | #include <asm/mmu_context.h> | 11 | #include <asm/mmu_context.h> |
22 | #include <asm/cacheflush.h> | 12 | #include <asm/cacheflush.h> |
23 | 13 | ||
24 | extern struct semaphore p3map_sem[]; | 14 | extern struct mutex p3map_mutex[]; |
25 | 15 | ||
26 | #define CACHE_ALIAS (cpu_data->dcache.alias_mask) | 16 | #define CACHE_ALIAS (cpu_data->dcache.alias_mask) |
27 | 17 | ||
@@ -37,10 +27,6 @@ void clear_user_page(void *to, unsigned long address, struct page *page) | |||
37 | if (((address ^ (unsigned long)to) & CACHE_ALIAS) == 0) | 27 | if (((address ^ (unsigned long)to) & CACHE_ALIAS) == 0) |
38 | clear_page(to); | 28 | clear_page(to); |
39 | else { | 29 | else { |
40 | pgprot_t pgprot = __pgprot(_PAGE_PRESENT | | ||
41 | _PAGE_RW | _PAGE_CACHABLE | | ||
42 | _PAGE_DIRTY | _PAGE_ACCESSED | | ||
43 | _PAGE_HW_SHARED | _PAGE_FLAGS_HARD); | ||
44 | unsigned long phys_addr = PHYSADDR(to); | 30 | unsigned long phys_addr = PHYSADDR(to); |
45 | unsigned long p3_addr = P3SEG + (address & CACHE_ALIAS); | 31 | unsigned long p3_addr = P3SEG + (address & CACHE_ALIAS); |
46 | pgd_t *pgd = pgd_offset_k(p3_addr); | 32 | pgd_t *pgd = pgd_offset_k(p3_addr); |
@@ -50,8 +36,8 @@ void clear_user_page(void *to, unsigned long address, struct page *page) | |||
50 | pte_t entry; | 36 | pte_t entry; |
51 | unsigned long flags; | 37 | unsigned long flags; |
52 | 38 | ||
53 | entry = pfn_pte(phys_addr >> PAGE_SHIFT, pgprot); | 39 | entry = pfn_pte(phys_addr >> PAGE_SHIFT, PAGE_KERNEL); |
54 | down(&p3map_sem[(address & CACHE_ALIAS)>>12]); | 40 | mutex_lock(&p3map_mutex[(address & CACHE_ALIAS)>>12]); |
55 | set_pte(pte, entry); | 41 | set_pte(pte, entry); |
56 | local_irq_save(flags); | 42 | local_irq_save(flags); |
57 | __flush_tlb_page(get_asid(), p3_addr); | 43 | __flush_tlb_page(get_asid(), p3_addr); |
@@ -59,7 +45,7 @@ void clear_user_page(void *to, unsigned long address, struct page *page) | |||
59 | update_mmu_cache(NULL, p3_addr, entry); | 45 | update_mmu_cache(NULL, p3_addr, entry); |
60 | __clear_user_page((void *)p3_addr, to); | 46 | __clear_user_page((void *)p3_addr, to); |
61 | pte_clear(&init_mm, p3_addr, pte); | 47 | pte_clear(&init_mm, p3_addr, pte); |
62 | up(&p3map_sem[(address & CACHE_ALIAS)>>12]); | 48 | mutex_unlock(&p3map_mutex[(address & CACHE_ALIAS)>>12]); |
63 | } | 49 | } |
64 | } | 50 | } |
65 | 51 | ||
@@ -77,10 +63,6 @@ void copy_user_page(void *to, void *from, unsigned long address, | |||
77 | if (((address ^ (unsigned long)to) & CACHE_ALIAS) == 0) | 63 | if (((address ^ (unsigned long)to) & CACHE_ALIAS) == 0) |
78 | copy_page(to, from); | 64 | copy_page(to, from); |
79 | else { | 65 | else { |
80 | pgprot_t pgprot = __pgprot(_PAGE_PRESENT | | ||
81 | _PAGE_RW | _PAGE_CACHABLE | | ||
82 | _PAGE_DIRTY | _PAGE_ACCESSED | | ||
83 | _PAGE_HW_SHARED | _PAGE_FLAGS_HARD); | ||
84 | unsigned long phys_addr = PHYSADDR(to); | 66 | unsigned long phys_addr = PHYSADDR(to); |
85 | unsigned long p3_addr = P3SEG + (address & CACHE_ALIAS); | 67 | unsigned long p3_addr = P3SEG + (address & CACHE_ALIAS); |
86 | pgd_t *pgd = pgd_offset_k(p3_addr); | 68 | pgd_t *pgd = pgd_offset_k(p3_addr); |
@@ -90,8 +72,8 @@ void copy_user_page(void *to, void *from, unsigned long address, | |||
90 | pte_t entry; | 72 | pte_t entry; |
91 | unsigned long flags; | 73 | unsigned long flags; |
92 | 74 | ||
93 | entry = pfn_pte(phys_addr >> PAGE_SHIFT, pgprot); | 75 | entry = pfn_pte(phys_addr >> PAGE_SHIFT, PAGE_KERNEL); |
94 | down(&p3map_sem[(address & CACHE_ALIAS)>>12]); | 76 | mutex_lock(&p3map_mutex[(address & CACHE_ALIAS)>>12]); |
95 | set_pte(pte, entry); | 77 | set_pte(pte, entry); |
96 | local_irq_save(flags); | 78 | local_irq_save(flags); |
97 | __flush_tlb_page(get_asid(), p3_addr); | 79 | __flush_tlb_page(get_asid(), p3_addr); |
@@ -99,7 +81,7 @@ void copy_user_page(void *to, void *from, unsigned long address, | |||
99 | update_mmu_cache(NULL, p3_addr, entry); | 81 | update_mmu_cache(NULL, p3_addr, entry); |
100 | __copy_user_page((void *)p3_addr, from, to); | 82 | __copy_user_page((void *)p3_addr, from, to); |
101 | pte_clear(&init_mm, p3_addr, pte); | 83 | pte_clear(&init_mm, p3_addr, pte); |
102 | up(&p3map_sem[(address & CACHE_ALIAS)>>12]); | 84 | mutex_unlock(&p3map_mutex[(address & CACHE_ALIAS)>>12]); |
103 | } | 85 | } |
104 | } | 86 | } |
105 | 87 | ||
@@ -122,4 +104,3 @@ inline pte_t ptep_get_and_clear(struct mm_struct *mm, unsigned long addr, pte_t | |||
122 | } | 104 | } |
123 | return pte; | 105 | return pte; |
124 | } | 106 | } |
125 | |||