Messages in this thread Patch in this message |  | | Date | Fri, 13 Oct 2000 20:15:46 +0400 | From | Ivan Kokshaysky <> | Subject | Re: test10-pre2 |
| |
On Thu, Oct 12, 2000 at 01:18:53PM -0700, Linus Torvalds wrote: > See the arch/x86/mm/fault.c changes to see what arch-specific changes this > can entail. > This patch works for me...
Ivan.
--- linux/include/asm-alpha/bitops.h.orig Wed Oct 4 17:06:59 2000 +++ linux/include/asm-alpha/bitops.h Fri Oct 13 13:41:02 2000 @@ -2,7 +2,6 @@ #define _ALPHA_BITOPS_H #include <linux/config.h> -#include <linux/kernel.h> /* * Copyright 1994, Linus Torvalds. --- linux/include/asm-alpha/pgalloc.h.orig Mon Aug 14 17:32:04 2000 +++ linux/include/asm-alpha/pgalloc.h Fri Oct 13 13:44:44 2000 @@ -378,20 +378,4 @@ extern inline pmd_t * pmd_alloc(pgd_t *p extern int do_check_pgt_cache(int, int); -extern inline void set_pgdir(unsigned long address, pgd_t entry) -{ - struct task_struct * p; - pgd_t *pgd; - - read_lock(&tasklist_lock); - for_each_task(p) { - if (!p->mm) - continue; - *pgd_offset(p->mm,address) = entry; - } - read_unlock(&tasklist_lock); - for (pgd = (pgd_t *)pgd_quicklist; pgd; pgd = (pgd_t *)*(unsigned long *)pgd) - pgd[(address >> PGDIR_SHIFT) & (PTRS_PER_PAGE - 1)] = entry; -} - #endif /* _ALPHA_PGALLOC_H */ --- linux/arch/alpha/mm/fault.c.orig Wed Oct 4 17:06:45 2000 +++ linux/arch/alpha/mm/fault.c Fri Oct 13 19:52:43 2000 @@ -108,6 +108,9 @@ do_page_fault(unsigned long address, uns if (!mm || in_interrupt()) goto no_context; + if (address >= TASK_SIZE) + goto vmalloc_fault; + down(&mm->mmap_sem); vma = find_vma(mm, address); if (!vma) @@ -157,6 +160,7 @@ good_area: bad_area: up(&mm->mmap_sem); +bad_area_nosemaphore: if (user_mode(regs)) { force_sig(SIGSEGV, current); return; @@ -204,4 +208,33 @@ do_sigbus: if (!user_mode(regs)) goto no_context; return; + +vmalloc_fault: + { + /* + * Synchronize this task's top level page-table + * with the 'reference' page table. + */ + int offset = __pgd_offset(address); + pgd_t *pgd, *pgd_k; + pmd_t *pmd, *pmd_k; + + pgd = current->active_mm->pgd + offset; + pgd_k = init_mm.pgd + offset; + + if (!pgd_present(*pgd)) { + if (!pgd_present(*pgd_k)) + goto bad_area_nosemaphore; + pgd_val(*pgd) = pgd_val(*pgd_k); + return; + } + + pmd = pmd_offset(pgd, address); + pmd_k = pmd_offset(pgd_k, address); + + if (pmd_present(*pmd) || !pmd_present(*pmd_k)) + goto bad_area_nosemaphore; + pmd_val(*pmd) = pmd_val(*pmd_k); + return; + } } - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org Please read the FAQ at http://www.tux.org/lkml/
|  |