From e7f2d7de9e939bc2af98cc831af49f5e9e09654b Mon Sep 17 00:00:00 2001 From: Matthew Dillon Date: Mon, 8 Jan 2007 19:45:39 +0000 Subject: [PATCH] Use CBREAK mode for the console. Adjust code for new vm_fault_page*() semantics (it now marks the page as referenced and dirties it automatically so the caller doesn't have to). Fix a VPTE_W or VPTE_WIRED snafu. FIx a PG_MANAGED vs VPTE_MANAGED snafu. Add additional VPTE_ bit definitions. --- sys/platform/vkernel/platform/console.c | 17 ++++-- sys/platform/vkernel/platform/copyio.c | 5 +- sys/platform/vkernel/platform/pmap.c | 76 ++++++++++++------------- sys/sys/vkernel.h | 13 +++-- 4 files changed, 57 insertions(+), 54 deletions(-) diff --git a/sys/platform/vkernel/platform/console.c b/sys/platform/vkernel/platform/console.c index 7076b5c567..67df0ab8d7 100644 --- a/sys/platform/vkernel/platform/console.c +++ b/sys/platform/vkernel/platform/console.c @@ -31,7 +31,7 @@ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $DragonFly: src/sys/platform/vkernel/platform/console.c,v 1.4 2007/01/08 08:17:17 dillon Exp $ + * $DragonFly: src/sys/platform/vkernel/platform/console.c,v 1.5 2007/01/08 19:45:38 dillon Exp $ */ #include @@ -42,6 +42,7 @@ #include #include #include +#include static int console_stolen_by_kernel; static struct callout console_callout; @@ -223,9 +224,17 @@ CONS_DRIVER(vcons, vconsprobe, vconsinit, vconsterm, vconsgetc, static void vconsprobe(struct consdev *cp) { - cp->cn_pri = CN_NORMAL; - cp->cn_dev = make_dev(&vcons_ops, 255, - UID_ROOT, GID_WHEEL, 0600, "vconsolectl"); + struct termios tio; + + cp->cn_pri = CN_NORMAL; + cp->cn_dev = make_dev(&vcons_ops, 255, + UID_ROOT, GID_WHEEL, 0600, "vconsolectl"); + + if (tcgetattr(0, &tio) == 0) { + cfmakeraw(&tio); + tio.c_lflag |= ISIG; + tcsetattr(0, TCSAFLUSH, &tio); + } } static void diff --git a/sys/platform/vkernel/platform/copyio.c b/sys/platform/vkernel/platform/copyio.c index a30822aded..3af09ef74c 100644 --- a/sys/platform/vkernel/platform/copyio.c +++ b/sys/platform/vkernel/platform/copyio.c @@ -31,7 +31,7 @@ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $DragonFly: src/sys/platform/vkernel/platform/copyio.c,v 1.5 2007/01/07 05:45:06 dillon Exp $ + * $DragonFly: src/sys/platform/vkernel/platform/copyio.c,v 1.6 2007/01/08 19:45:38 dillon Exp $ */ #include @@ -143,7 +143,6 @@ copyin(const void *udaddr, void *kaddr, size_t len) len -= n; udaddr = (const char *)udaddr + n; kaddr = (char *)kaddr + n; - vm_page_flag_set(m, PG_REFERENCED); vm_page_unhold(m); sf_buf_free(sf); } @@ -179,8 +178,6 @@ copyout(const void *kaddr, void *udaddr, size_t len) len -= n; udaddr = (char *)udaddr + n; kaddr = (const char *)kaddr + n; - vm_page_flag_set(m, PG_REFERENCED); - vm_page_dirty(m); vm_page_unhold(m); sf_buf_free(sf); } diff --git a/sys/platform/vkernel/platform/pmap.c b/sys/platform/vkernel/platform/pmap.c index 98d80e3be7..7edb330c47 100644 --- a/sys/platform/vkernel/platform/pmap.c +++ b/sys/platform/vkernel/platform/pmap.c @@ -38,7 +38,7 @@ * * from: @(#)pmap.c 7.7 (Berkeley) 5/12/91 * $FreeBSD: src/sys/i386/i386/pmap.c,v 1.250.2.18 2002/03/06 22:48:53 silby Exp $ - * $DragonFly: src/sys/platform/vkernel/platform/pmap.c,v 1.8 2007/01/08 16:03:25 dillon Exp $ + * $DragonFly: src/sys/platform/vkernel/platform/pmap.c,v 1.9 2007/01/08 19:45:38 dillon Exp $ */ #include @@ -295,6 +295,8 @@ pmap_release(struct pmap *pmap) } crit_exit(); } while (info.error); + pmap->pm_pdir = NULL; + pmap->pm_pdirpte = 0; } static int @@ -1312,8 +1314,9 @@ pmap_remove_pte(struct pmap *pmap, vpte_t *ptq, vm_offset_t va, pmap_inval_add(info, pmap, va); oldpte = loadandclear(ptq); - if (oldpte & VPTE_W) - pmap->pm_stats.wired_count -= 1; + if (oldpte & VPTE_WIRED) + --pmap->pm_stats.wired_count; + KKASSERT(pmap->pm_stats.wired_count >= 0); /* * Machines that don't support invlpg, also don't support * VPTE_G. XXX VPTE_G is disabled for SMP so don't worry about @@ -1322,7 +1325,7 @@ pmap_remove_pte(struct pmap *pmap, vpte_t *ptq, vm_offset_t va, if (oldpte & VPTE_G) madvise((void *)va, PAGE_SIZE, MADV_INVAL); pmap->pm_stats.resident_count -= 1; - if (oldpte & PG_MANAGED) { + if (oldpte & VPTE_MANAGED) { m = PHYS_TO_VM_PAGE(oldpte); if (oldpte & VPTE_M) { #if defined(PMAP_DIAGNOSTIC) @@ -1454,9 +1457,8 @@ pmap_remove(struct pmap *pmap, vm_offset_t sva, vm_offset_t eva) * by the current page table page, or to the end of the * range being removed. */ - if (pdnxt > eindex) { + if (pdnxt > eindex) pdnxt = eindex; - } for (; sindex != pdnxt; sindex++) { vm_offset_t va; @@ -1503,9 +1505,12 @@ pmap_remove_all(vm_page_t m) pte = pmap_pte(pv->pv_pmap, pv->pv_va); pmap_inval_add(&info, pv->pv_pmap, pv->pv_va); + KKASSERT(pte != NULL); + tpte = loadandclear(pte); - if (tpte & VPTE_W) - pv->pv_pmap->pm_stats.wired_count--; + if (tpte & VPTE_WIRED) + --pv->pv_pmap->pm_stats.wired_count; + KKASSERT(pv->pv_pmap->pm_stats.wired_count >= 0); if (tpte & VPTE_A) vm_page_flag_set(m, PG_REFERENCED); @@ -1607,7 +1612,7 @@ pmap_protect(pmap_t pmap, vm_offset_t sva, vm_offset_t eva, vm_prot_t prot) pmap_inval_add(&info, pmap, i386_ptob(sindex)); pbits = ptbase[sindex - sbase]; - if (pbits & PG_MANAGED) { + if (pbits & VPTE_MANAGED) { m = NULL; if (pbits & VPTE_A) { m = PHYS_TO_VM_PAGE(pbits); @@ -1705,10 +1710,11 @@ pmap_enter(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot, * are valid mappings in them. Hence, if a user page is wired, * the PT page will be also. */ - if (wired && ((origpte & VPTE_W) == 0)) - pmap->pm_stats.wired_count++; - else if (!wired && (origpte & VPTE_W)) - pmap->pm_stats.wired_count--; + if (wired && ((origpte & VPTE_WIRED) == 0)) + ++pmap->pm_stats.wired_count; + else if (!wired && (origpte & VPTE_WIRED)) + --pmap->pm_stats.wired_count; + KKASSERT(pmap->pm_stats.wired_count >= 0); #if defined(PMAP_DIAGNOSTIC) if (pmap_nw_modified((pt_entry_t) origpte)) { @@ -1731,13 +1737,13 @@ pmap_enter(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot, * We might be turning off write access to the page, * so we go ahead and sense modify status. */ - if (origpte & PG_MANAGED) { + if (origpte & VPTE_MANAGED) { if ((origpte & VPTE_M) && pmap_track_modified(va)) { vm_page_t om; om = PHYS_TO_VM_PAGE(opa); vm_page_dirty(om); } - pa |= PG_MANAGED; + pa |= VPTE_MANAGED; } goto validate; } @@ -1760,7 +1766,7 @@ pmap_enter(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot, if (pmap_initialized && (m->flags & (PG_FICTITIOUS|PG_UNMANAGED)) == 0) { pmap_insert_entry(pmap, va, mpte, m); - pa |= PG_MANAGED; + pa |= VPTE_MANAGED; } /* @@ -1777,7 +1783,7 @@ validate: newpte = (vm_offset_t) (pa | pte_prot(pmap, prot) | VPTE_V); if (wired) - newpte |= VPTE_W; + newpte |= VPTE_WIRED; newpte |= VPTE_U; /* @@ -1893,6 +1899,10 @@ retry: return mpte; } +/* + * Extract the physical address for the translation at the specified + * virtual address in the pmap. + */ vm_paddr_t pmap_extract(pmap_t pmap, vm_offset_t va) { @@ -2144,10 +2154,11 @@ pmap_change_wiring(pmap_t pmap, vm_offset_t va, boolean_t wired) pte = get_ptbase(pmap, va); - if (wired && (*pte & VPTE_W) == 0) - pmap->pm_stats.wired_count++; - else if (!wired && (*pte & VPTE_W)) - pmap->pm_stats.wired_count--; + if (wired && (*pte & VPTE_WIRED) == 0) + ++pmap->pm_stats.wired_count; + else if (!wired && (*pte & VPTE_WIRED)) + --pmap->pm_stats.wired_count; + KKASSERT(pmap->pm_stats.wired_count >= 0); /* * Wiring is not a hardware characteristic so there is no need to @@ -2156,17 +2167,10 @@ pmap_change_wiring(pmap_t pmap, vm_offset_t va, boolean_t wired) * the pmap_inval_*() API that is)... it's ok to do this for simple * wiring changes. */ -#ifdef SMP if (wired) - atomic_set_int(pte, VPTE_W); + atomic_set_int(pte, VPTE_WIRED); else - atomic_clear_int(pte, VPTE_W); -#else - if (wired) - atomic_set_int_nonlocked(pte, VPTE_W); - else - atomic_clear_int_nonlocked(pte, VPTE_W); -#endif + atomic_clear_int(pte, VPTE_WIRED); } /* @@ -2260,7 +2264,7 @@ pmap_copy(pmap_t dst_pmap, pmap_t src_pmap, vm_offset_t dst_addr, /* * we only virtual copy managed pages */ - if ((ptetemp & PG_MANAGED) != 0) { + if ((ptetemp & VPTE_MANAGED) != 0) { /* * We have to check after allocpte for the * pte still being around... allocpte can @@ -2503,7 +2507,7 @@ pmap_remove_pages(pmap_t pmap, vm_offset_t sva, vm_offset_t eva) * We cannot remove wired pages from a process' mapping * at this time */ - if (tpte & VPTE_W) { + if (tpte & VPTE_WIRED) { npv = TAILQ_NEXT(pv, pv_plist); continue; } @@ -2643,17 +2647,9 @@ pmap_changebit(vm_page_t m, int bit, boolean_t setem) if (pbits & VPTE_M) { vm_page_dirty(m); } -#ifdef SMP atomic_clear_int(pte, VPTE_M|VPTE_W); -#else - atomic_clear_int_nonlocked(pte, VPTE_M|VPTE_W); -#endif } else { -#ifdef SMP atomic_clear_int(pte, bit); -#else - atomic_clear_int_nonlocked(pte, bit); -#endif } } } diff --git a/sys/sys/vkernel.h b/sys/sys/vkernel.h index a948287421..f37266cf48 100644 --- a/sys/sys/vkernel.h +++ b/sys/sys/vkernel.h @@ -31,7 +31,7 @@ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $DragonFly: src/sys/sys/vkernel.h,v 1.7 2007/01/08 03:33:43 dillon Exp $ + * $DragonFly: src/sys/sys/vkernel.h,v 1.8 2007/01/08 19:45:39 dillon Exp $ */ #ifndef _SYS_VKERNEL_H_ @@ -124,16 +124,17 @@ typedef u_int32_t vpte_t; #define VPTE_PAGE_MASK ((1 << VPTE_PAGE_BITS) - 1) #define VPTE_PAGETABLE_SIZE PAGE_SIZE -#define VPTE_V 0x00000001 -#define VPTE_PS 0x00000002 -#define VPTE_R 0x00000004 -#define VPTE_W 0x00000008 -#define VPTE_X 0x00000010 +#define VPTE_V 0x00000001 /* valid */ +#define VPTE_PS 0x00000002 /* page directory direct mapping */ +#define VPTE_R 0x00000004 /* readable */ +#define VPTE_W 0x00000008 /* writable */ +#define VPTE_X 0x00000010 /* executable */ #define VPTE_A 0x00000020 /* page accessed bit */ #define VPTE_M 0x00000040 /* page modified bit */ #define VPTE_U 0x00000080 /* user access bit if managed vmspace */ #define VPTE_MANAGED 0x00000100 /* managed bit ?? */ #define VPTE_G 0x00000200 /* global bit ?? */ +#define VPTE_WIRED 0x00000400 /* wired */ #define VPTE_FRAME 0xFFFFF000 -- 2.41.0