| .. | .. |
|---|
| 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 | } |
|---|