diff options
| author | Alexander Stein <alexander.stein@systec-electronic.com> | 2012-01-23 09:45:56 -0500 |
|---|---|---|
| committer | Greg Ungerer <gerg@uclinux.org> | 2012-02-06 20:25:57 -0500 |
| commit | 3372f5a7d005dd42e754490fed6a0171c4a018c6 (patch) | |
| tree | 8f3bba690f3c674383e9c30ea14a087c44a95dec | |
| parent | 57e00098cc0e43d001c9c8a018a1f8396faa0d16 (diff) | |
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>
| -rw-r--r-- | arch/m68k/mm/mcfmmu.c | 9 |
1 files changed, 5 insertions, 4 deletions
diff --git a/arch/m68k/mm/mcfmmu.c b/arch/m68k/mm/mcfmmu.c index babd5a97cdcb..875b800ef0dd 100644 --- a/arch/m68k/mm/mcfmmu.c +++ b/arch/m68k/mm/mcfmmu.c | |||
| @@ -87,7 +87,7 @@ void __init paging_init(void) | |||
| 87 | 87 | ||
| 88 | int cf_tlb_miss(struct pt_regs *regs, int write, int dtlb, int extension_word) | 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 | struct mm_struct *mm; | 91 | struct mm_struct *mm; |
| 92 | pgd_t *pgd; | 92 | pgd_t *pgd; |
| 93 | pmd_t *pmd; | 93 | pmd_t *pmd; |
| @@ -137,9 +137,10 @@ int cf_tlb_miss(struct pt_regs *regs, int write, int dtlb, int extension_word) | |||
| 137 | if (!pte_dirty(*pte) && !KMAPAREA(mmuar)) | 137 | if (!pte_dirty(*pte) && !KMAPAREA(mmuar)) |
| 138 | set_pte(pte, pte_wrprotect(*pte)); | 138 | set_pte(pte, pte_wrprotect(*pte)); |
| 139 | 139 | ||
| 140 | mmu_write(MMUTR, (mmuar & PAGE_MASK) | (asid << MMUTR_IDN) | | 140 | mmutr = (mmuar & PAGE_MASK) | (asid << MMUTR_IDN) | MMUTR_V; |
| 141 | (((int)(pte->pte) & (int)CF_PAGE_MMUTR_MASK) | 141 | if ((mmuar < TASK_UNMAPPED_BASE) || (mmuar >= TASK_SIZE)) |
| 142 | >> CF_PAGE_MMUTR_SHIFT) | MMUTR_V); | 142 | mmutr |= (pte->pte & CF_PAGE_MMUTR_MASK) >> CF_PAGE_MMUTR_SHIFT; |
| 143 | mmu_write(MMUTR, mmutr); | ||
| 143 | 144 | ||
| 144 | mmu_write(MMUDR, (pte_val(*pte) & PAGE_MASK) | | 145 | mmu_write(MMUDR, (pte_val(*pte) & PAGE_MASK) | |
| 145 | ((pte->pte) & CF_PAGE_MMUDR_MASK) | MMUDR_SZ_8KB | MMUDR_X); | 146 | ((pte->pte) & CF_PAGE_MMUDR_MASK) | MMUDR_SZ_8KB | MMUDR_X); |
