Commit 3372f5a7d005dd42e754490fed6a0171c4a018c6
Committed by
Greg Ungerer
1 parent
57e00098cc
Exists in
smarc-l5.0.0_1.0.0-ga
and in
5 other branches
m68k: Do not set global share for non-kernel shared pages
If the SG bit is set in MMUTR the page is accessible for all userspace processes (ignoring the ASID). So a process might randomly access a page from a different process which had a shared page (from shared memory) in its context. Signed-off-by: Alexander Stein <alexander.stein@systec-electronic.com> Signed-off-by: Greg Ungerer <gerg@uclinux.org>
Showing 1 changed file with 5 additions and 4 deletions Side-by-side Diff
arch/m68k/mm/mcfmmu.c
... | ... | @@ -87,7 +87,7 @@ |
87 | 87 | |
88 | 88 | int cf_tlb_miss(struct pt_regs *regs, int write, int dtlb, int extension_word) |
89 | 89 | { |
90 | - unsigned long flags, mmuar; | |
90 | + unsigned long flags, mmuar, mmutr; | |
91 | 91 | struct mm_struct *mm; |
92 | 92 | pgd_t *pgd; |
93 | 93 | pmd_t *pmd; |
... | ... | @@ -137,9 +137,10 @@ |
137 | 137 | if (!pte_dirty(*pte) && !KMAPAREA(mmuar)) |
138 | 138 | set_pte(pte, pte_wrprotect(*pte)); |
139 | 139 | |
140 | - mmu_write(MMUTR, (mmuar & PAGE_MASK) | (asid << MMUTR_IDN) | | |
141 | - (((int)(pte->pte) & (int)CF_PAGE_MMUTR_MASK) | |
142 | - >> CF_PAGE_MMUTR_SHIFT) | MMUTR_V); | |
140 | + mmutr = (mmuar & PAGE_MASK) | (asid << MMUTR_IDN) | MMUTR_V; | |
141 | + if ((mmuar < TASK_UNMAPPED_BASE) || (mmuar >= TASK_SIZE)) | |
142 | + mmutr |= (pte->pte & CF_PAGE_MMUTR_MASK) >> CF_PAGE_MMUTR_SHIFT; | |
143 | + mmu_write(MMUTR, mmutr); | |
143 | 144 | |
144 | 145 | mmu_write(MMUDR, (pte_val(*pte) & PAGE_MASK) | |
145 | 146 | ((pte->pte) & CF_PAGE_MMUDR_MASK) | MMUDR_SZ_8KB | MMUDR_X); |