.. | .. |
---|
29 | 29 | |
---|
30 | 30 | #include <asm/cacheflush.h> |
---|
31 | 31 | #include <asm/tlbflush.h> |
---|
32 | | -#include <asm/pgalloc.h> |
---|
33 | 32 | #include <asm/vaddrs.h> |
---|
34 | | - |
---|
35 | | -pgprot_t kmap_prot; |
---|
36 | 33 | |
---|
37 | 34 | static pte_t *kmap_pte; |
---|
38 | 35 | |
---|
39 | 36 | void __init kmap_init(void) |
---|
40 | 37 | { |
---|
41 | | - unsigned long address; |
---|
42 | | - pmd_t *dir; |
---|
43 | | - |
---|
44 | | - address = __fix_to_virt(FIX_KMAP_BEGIN); |
---|
45 | | - dir = pmd_offset(pgd_offset_k(address), address); |
---|
| 38 | + unsigned long address = __fix_to_virt(FIX_KMAP_BEGIN); |
---|
46 | 39 | |
---|
47 | 40 | /* cache the first kmap pte */ |
---|
48 | | - kmap_pte = pte_offset_kernel(dir, address); |
---|
49 | | - kmap_prot = __pgprot(SRMMU_ET_PTE | SRMMU_PRIV | SRMMU_CACHE); |
---|
| 41 | + kmap_pte = virt_to_kpte(address); |
---|
50 | 42 | } |
---|
51 | 43 | |
---|
52 | | -void *kmap_atomic(struct page *page) |
---|
| 44 | +void *kmap_atomic_high_prot(struct page *page, pgprot_t prot) |
---|
53 | 45 | { |
---|
54 | 46 | unsigned long vaddr; |
---|
55 | 47 | long idx, type; |
---|
56 | | - |
---|
57 | | - preempt_disable(); |
---|
58 | | - pagefault_disable(); |
---|
59 | | - if (!PageHighMem(page)) |
---|
60 | | - return page_address(page); |
---|
61 | 48 | |
---|
62 | 49 | type = kmap_atomic_idx_push(); |
---|
63 | 50 | idx = type + KM_TYPE_NR*smp_processor_id(); |
---|
.. | .. |
---|
73 | 60 | #ifdef CONFIG_DEBUG_HIGHMEM |
---|
74 | 61 | BUG_ON(!pte_none(*(kmap_pte-idx))); |
---|
75 | 62 | #endif |
---|
76 | | - set_pte(kmap_pte-idx, mk_pte(page, kmap_prot)); |
---|
| 63 | + set_pte(kmap_pte-idx, mk_pte(page, prot)); |
---|
77 | 64 | /* XXX Fix - Anton */ |
---|
78 | 65 | #if 0 |
---|
79 | 66 | __flush_tlb_one(vaddr); |
---|
.. | .. |
---|
83 | 70 | |
---|
84 | 71 | return (void*) vaddr; |
---|
85 | 72 | } |
---|
86 | | -EXPORT_SYMBOL(kmap_atomic); |
---|
| 73 | +EXPORT_SYMBOL(kmap_atomic_high_prot); |
---|
87 | 74 | |
---|
88 | | -void __kunmap_atomic(void *kvaddr) |
---|
| 75 | +void kunmap_atomic_high(void *kvaddr) |
---|
89 | 76 | { |
---|
90 | 77 | unsigned long vaddr = (unsigned long) kvaddr & PAGE_MASK; |
---|
91 | 78 | int type; |
---|
92 | 79 | |
---|
93 | | - if (vaddr < FIXADDR_START) { // FIXME |
---|
94 | | - pagefault_enable(); |
---|
95 | | - preempt_enable(); |
---|
| 80 | + if (vaddr < FIXADDR_START) |
---|
96 | 81 | return; |
---|
97 | | - } |
---|
98 | 82 | |
---|
99 | 83 | type = kmap_atomic_idx(); |
---|
100 | 84 | |
---|
.. | .. |
---|
127 | 111 | #endif |
---|
128 | 112 | |
---|
129 | 113 | kmap_atomic_idx_pop(); |
---|
130 | | - pagefault_enable(); |
---|
131 | | - preempt_enable(); |
---|
132 | 114 | } |
---|
133 | | -EXPORT_SYMBOL(__kunmap_atomic); |
---|
| 115 | +EXPORT_SYMBOL(kunmap_atomic_high); |
---|