diff options
Diffstat (limited to 'arch/i386/kernel/vm86.c')
| -rw-r--r-- | arch/i386/kernel/vm86.c | 17 |
1 files changed, 7 insertions, 10 deletions
diff --git a/arch/i386/kernel/vm86.c b/arch/i386/kernel/vm86.c index 16b485009622..fc1993564f98 100644 --- a/arch/i386/kernel/vm86.c +++ b/arch/i386/kernel/vm86.c | |||
| @@ -134,17 +134,16 @@ struct pt_regs * fastcall save_v86_state(struct kernel_vm86_regs * regs) | |||
| 134 | return ret; | 134 | return ret; |
| 135 | } | 135 | } |
| 136 | 136 | ||
| 137 | static void mark_screen_rdonly(struct task_struct * tsk) | 137 | static void mark_screen_rdonly(struct mm_struct *mm) |
| 138 | { | 138 | { |
| 139 | pgd_t *pgd; | 139 | pgd_t *pgd; |
| 140 | pud_t *pud; | 140 | pud_t *pud; |
| 141 | pmd_t *pmd; | 141 | pmd_t *pmd; |
| 142 | pte_t *pte, *mapped; | 142 | pte_t *pte; |
| 143 | spinlock_t *ptl; | ||
| 143 | int i; | 144 | int i; |
| 144 | 145 | ||
| 145 | preempt_disable(); | 146 | pgd = pgd_offset(mm, 0xA0000); |
| 146 | spin_lock(&tsk->mm->page_table_lock); | ||
| 147 | pgd = pgd_offset(tsk->mm, 0xA0000); | ||
| 148 | if (pgd_none_or_clear_bad(pgd)) | 147 | if (pgd_none_or_clear_bad(pgd)) |
| 149 | goto out; | 148 | goto out; |
| 150 | pud = pud_offset(pgd, 0xA0000); | 149 | pud = pud_offset(pgd, 0xA0000); |
| @@ -153,16 +152,14 @@ static void mark_screen_rdonly(struct task_struct * tsk) | |||
| 153 | pmd = pmd_offset(pud, 0xA0000); | 152 | pmd = pmd_offset(pud, 0xA0000); |
| 154 | if (pmd_none_or_clear_bad(pmd)) | 153 | if (pmd_none_or_clear_bad(pmd)) |
| 155 | goto out; | 154 | goto out; |
| 156 | pte = mapped = pte_offset_map(pmd, 0xA0000); | 155 | pte = pte_offset_map_lock(mm, pmd, 0xA0000, &ptl); |
| 157 | for (i = 0; i < 32; i++) { | 156 | for (i = 0; i < 32; i++) { |
| 158 | if (pte_present(*pte)) | 157 | if (pte_present(*pte)) |
| 159 | set_pte(pte, pte_wrprotect(*pte)); | 158 | set_pte(pte, pte_wrprotect(*pte)); |
| 160 | pte++; | 159 | pte++; |
| 161 | } | 160 | } |
| 162 | pte_unmap(mapped); | 161 | pte_unmap_unlock(pte, ptl); |
| 163 | out: | 162 | out: |
| 164 | spin_unlock(&tsk->mm->page_table_lock); | ||
| 165 | preempt_enable(); | ||
| 166 | flush_tlb(); | 163 | flush_tlb(); |
| 167 | } | 164 | } |
| 168 | 165 | ||
| @@ -306,7 +303,7 @@ static void do_sys_vm86(struct kernel_vm86_struct *info, struct task_struct *tsk | |||
| 306 | 303 | ||
| 307 | tsk->thread.screen_bitmap = info->screen_bitmap; | 304 | tsk->thread.screen_bitmap = info->screen_bitmap; |
| 308 | if (info->flags & VM86_SCREEN_BITMAP) | 305 | if (info->flags & VM86_SCREEN_BITMAP) |
| 309 | mark_screen_rdonly(tsk); | 306 | mark_screen_rdonly(tsk->mm); |
| 310 | __asm__ __volatile__( | 307 | __asm__ __volatile__( |
| 311 | "xorl %%eax,%%eax; movl %%eax,%%fs; movl %%eax,%%gs\n\t" | 308 | "xorl %%eax,%%eax; movl %%eax,%%fs; movl %%eax,%%gs\n\t" |
| 312 | "movl %0,%%esp\n\t" | 309 | "movl %0,%%esp\n\t" |
