uvm_pagealloc(9) can fail, so handle that case in pmap_enter(9).
This commit is contained in:
parent
08d26dfcb7
commit
5011ef47f2
|
@ -1,4 +1,4 @@
|
||||||
/* $NetBSD: pmap.c,v 1.54 2006/03/04 01:13:35 uwe Exp $ */
|
/* $NetBSD: pmap.c,v 1.55 2006/08/07 23:19:36 tsutsui Exp $ */
|
||||||
|
|
||||||
/*-
|
/*-
|
||||||
* Copyright (c) 2002 The NetBSD Foundation, Inc.
|
* Copyright (c) 2002 The NetBSD Foundation, Inc.
|
||||||
|
@ -37,7 +37,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <sys/cdefs.h>
|
#include <sys/cdefs.h>
|
||||||
__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.54 2006/03/04 01:13:35 uwe Exp $");
|
__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.55 2006/08/07 23:19:36 tsutsui Exp $");
|
||||||
|
|
||||||
#include <sys/param.h>
|
#include <sys/param.h>
|
||||||
#include <sys/systm.h>
|
#include <sys/systm.h>
|
||||||
|
@ -310,7 +310,7 @@ pmap_enter(pmap_t pmap, vaddr_t va, paddr_t pa, vm_prot_t prot, int flags)
|
||||||
{
|
{
|
||||||
struct vm_page *pg;
|
struct vm_page *pg;
|
||||||
struct vm_page_md *pvh;
|
struct vm_page_md *pvh;
|
||||||
pt_entry_t entry;
|
pt_entry_t entry, *pte;
|
||||||
boolean_t kva = (pmap == pmap_kernel());
|
boolean_t kva = (pmap == pmap_kernel());
|
||||||
|
|
||||||
/* "flags" never exceed "prot" */
|
/* "flags" never exceed "prot" */
|
||||||
|
@ -368,7 +368,18 @@ pmap_enter(pmap_t pmap, vaddr_t va, paddr_t pa, vm_prot_t prot, int flags)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Register to page table */
|
/* Register to page table */
|
||||||
*__pmap_pte_alloc(pmap, va) = entry;
|
if (kva)
|
||||||
|
pte = __pmap_kpte_lookup(va);
|
||||||
|
else {
|
||||||
|
pte = __pmap_pte_alloc(pmap, va);
|
||||||
|
if (pte == NULL) {
|
||||||
|
if (flags & PMAP_CANFAIL)
|
||||||
|
return ENOMEM;
|
||||||
|
panic("pmap_enter: cannot allocate pte");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
*pte = entry;
|
||||||
|
|
||||||
if (pmap->pm_asid != -1)
|
if (pmap->pm_asid != -1)
|
||||||
sh_tlb_update(pmap->pm_asid, va, entry);
|
sh_tlb_update(pmap->pm_asid, va, entry);
|
||||||
|
@ -892,6 +903,8 @@ __pmap_pte_alloc(pmap_t pmap, vaddr_t va)
|
||||||
|
|
||||||
/* Allocate page table (not managed page) */
|
/* Allocate page table (not managed page) */
|
||||||
pg = uvm_pagealloc(NULL, 0, NULL, UVM_PGA_USERESERVE | UVM_PGA_ZERO);
|
pg = uvm_pagealloc(NULL, 0, NULL, UVM_PGA_USERESERVE | UVM_PGA_ZERO);
|
||||||
|
if (pg == NULL)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
ptp = (pt_entry_t *)SH3_PHYS_TO_P1SEG(VM_PAGE_TO_PHYS(pg));
|
ptp = (pt_entry_t *)SH3_PHYS_TO_P1SEG(VM_PAGE_TO_PHYS(pg));
|
||||||
pmap->pm_ptp[__PMAP_PTP_INDEX(va)] = ptp;
|
pmap->pm_ptp[__PMAP_PTP_INDEX(va)] = ptp;
|
||||||
|
|
Loading…
Reference in New Issue