.. | .. |
---|
19 | 19 | #include <linux/ksm.h> |
---|
20 | 20 | #include <linux/mman.h> |
---|
21 | 21 | |
---|
22 | | -#include <asm/pgtable.h> |
---|
23 | | -#include <asm/pgalloc.h> |
---|
24 | 22 | #include <asm/tlb.h> |
---|
25 | 23 | #include <asm/tlbflush.h> |
---|
26 | 24 | #include <asm/mmu_context.h> |
---|
27 | 25 | #include <asm/page-states.h> |
---|
| 26 | + |
---|
| 27 | +pgprot_t pgprot_writecombine(pgprot_t prot) |
---|
| 28 | +{ |
---|
| 29 | + /* |
---|
| 30 | + * mio_wb_bit_mask may be set on a different CPU, but it is only set |
---|
| 31 | + * once at init and only read afterwards. |
---|
| 32 | + */ |
---|
| 33 | + return __pgprot(pgprot_val(prot) | mio_wb_bit_mask); |
---|
| 34 | +} |
---|
| 35 | +EXPORT_SYMBOL_GPL(pgprot_writecombine); |
---|
| 36 | + |
---|
| 37 | +pgprot_t pgprot_writethrough(pgprot_t prot) |
---|
| 38 | +{ |
---|
| 39 | + /* |
---|
| 40 | + * mio_wb_bit_mask may be set on a different CPU, but it is only set |
---|
| 41 | + * once at init and only read afterwards. |
---|
| 42 | + */ |
---|
| 43 | + return __pgprot(pgprot_val(prot) & ~mio_wb_bit_mask); |
---|
| 44 | +} |
---|
| 45 | +EXPORT_SYMBOL_GPL(pgprot_writethrough); |
---|
28 | 46 | |
---|
29 | 47 | static inline void ptep_ipte_local(struct mm_struct *mm, unsigned long addr, |
---|
30 | 48 | pte_t *ptep, int nodat) |
---|
.. | .. |
---|
301 | 319 | } |
---|
302 | 320 | EXPORT_SYMBOL(ptep_xchg_lazy); |
---|
303 | 321 | |
---|
304 | | -pte_t ptep_modify_prot_start(struct mm_struct *mm, unsigned long addr, |
---|
| 322 | +pte_t ptep_modify_prot_start(struct vm_area_struct *vma, unsigned long addr, |
---|
305 | 323 | pte_t *ptep) |
---|
306 | 324 | { |
---|
307 | 325 | pgste_t pgste; |
---|
308 | 326 | pte_t old; |
---|
309 | 327 | int nodat; |
---|
| 328 | + struct mm_struct *mm = vma->vm_mm; |
---|
310 | 329 | |
---|
311 | 330 | preempt_disable(); |
---|
312 | 331 | pgste = ptep_xchg_start(mm, addr, ptep); |
---|
.. | .. |
---|
318 | 337 | } |
---|
319 | 338 | return old; |
---|
320 | 339 | } |
---|
321 | | -EXPORT_SYMBOL(ptep_modify_prot_start); |
---|
322 | 340 | |
---|
323 | | -void ptep_modify_prot_commit(struct mm_struct *mm, unsigned long addr, |
---|
324 | | - pte_t *ptep, pte_t pte) |
---|
| 341 | +void ptep_modify_prot_commit(struct vm_area_struct *vma, unsigned long addr, |
---|
| 342 | + pte_t *ptep, pte_t old_pte, pte_t pte) |
---|
325 | 343 | { |
---|
326 | 344 | pgste_t pgste; |
---|
| 345 | + struct mm_struct *mm = vma->vm_mm; |
---|
327 | 346 | |
---|
328 | 347 | if (!MACHINE_HAS_NX) |
---|
329 | 348 | pte_val(pte) &= ~_PAGE_NOEXEC; |
---|
.. | .. |
---|
337 | 356 | } |
---|
338 | 357 | preempt_enable(); |
---|
339 | 358 | } |
---|
340 | | -EXPORT_SYMBOL(ptep_modify_prot_commit); |
---|
341 | 359 | |
---|
342 | 360 | static inline void pmdp_idte_local(struct mm_struct *mm, |
---|
343 | 361 | unsigned long addr, pmd_t *pmdp) |
---|
.. | .. |
---|
716 | 734 | pgste_val(pgste) |= PGSTE_GR_BIT | PGSTE_GC_BIT; |
---|
717 | 735 | ptev = pte_val(*ptep); |
---|
718 | 736 | if (!(ptev & _PAGE_INVALID) && (ptev & _PAGE_WRITE)) |
---|
719 | | - page_set_storage_key(ptev & PAGE_MASK, PAGE_DEFAULT_KEY, 1); |
---|
| 737 | + page_set_storage_key(ptev & PAGE_MASK, PAGE_DEFAULT_KEY, 0); |
---|
720 | 738 | pgste_set_unlock(ptep, pgste); |
---|
721 | 739 | preempt_enable(); |
---|
722 | 740 | } |
---|