Index: arch/amigappc/conf/std.amigappc =================================================================== RCS file: /cvsroot/src/sys/arch/amigappc/conf/std.amigappc,v retrieving revision 1.8 diff -u -u -r1.8 std.amigappc --- arch/amigappc/conf/std.amigappc 5 Mar 2010 17:58:15 -0000 1.8 +++ arch/amigappc/conf/std.amigappc 5 Dec 2010 13:47:40 -0000 @@ -10,6 +10,15 @@ options PPC_HIGH_VEC # Exception vectors at 0xfff00000 options DISTANT_KERNEL # Kernel not in range for ba/bla calls +# Disable use of M bit in PTE entries. For bppc. +options PMAP_NOMEMORYCOHERENCE + +# Don't use dcbz in kernel. For bppc. +options PMAP_NODCBZ + +# Allow pmap to use memory beyond first segment. For bppc. +options PMAP_INTERNALMEMLIMIT=0x80000000 + options EXEC_ELF32 # exec ELF binaries options EXEC_SCRIPT # exec #! scripts Index: arch/powerpc/conf/files.powerpc =================================================================== RCS file: /cvsroot/src/sys/arch/powerpc/conf/files.powerpc,v retrieving revision 1.72 diff -u -u -r1.72 files.powerpc --- arch/powerpc/conf/files.powerpc 9 Mar 2010 22:35:12 -0000 1.72 +++ arch/powerpc/conf/files.powerpc 5 Dec 2010 13:47:43 -0000 @@ -6,6 +6,8 @@ defflag opt_ppcarch.h PPC_OEA PPC_OEA601 PPC_OEA64 PPC_OEA64_BRIDGE PPC_MPC8XX PPC_IBM4XX PPC_IBM403 PPC_BOOKE defflag opt_pmap.h PMAPDEBUG PMAPCHECK PMAPCOUNTERS defparam opt_pmap.h PTEGCOUNT PMAP_MEMLIMIT +defparam opt_pmap.h PMAP_INTERNALMEMLIMIT +defflag opt_pmap.h PMAP_NOMEMORYCOHERENCE PMAP_NODCBZ file arch/powerpc/powerpc/copystr.c file arch/powerpc/powerpc/core_machdep.c coredump Index: arch/powerpc/include/oea/vmparam.h =================================================================== RCS file: /cvsroot/src/sys/arch/powerpc/include/oea/vmparam.h,v retrieving revision 1.16 diff -u -u -r1.16 vmparam.h --- arch/powerpc/include/oea/vmparam.h 14 Nov 2010 13:33:22 -0000 1.16 +++ arch/powerpc/include/oea/vmparam.h 5 Dec 2010 13:47:43 -0000 @@ -190,7 +190,7 @@ #define VM_NFREELIST 16 /* 16 distinct memory segments */ #define VM_FREELIST_DEFAULT 0 -#define VM_FREELIST_FIRST256 1 +#define VM_FREELIST_PMAP 1 #define VM_FREELIST_FIRST16 2 #define VM_FREELIST_MAX 3 Index: arch/powerpc/oea/pmap.c =================================================================== RCS file: /cvsroot/src/sys/arch/powerpc/oea/pmap.c,v retrieving revision 1.74 diff -u -u -r1.74 pmap.c --- arch/powerpc/oea/pmap.c 12 Nov 2010 07:59:26 -0000 1.74 +++ arch/powerpc/oea/pmap.c 5 Dec 2010 13:47:44 -0000 @@ -104,6 +104,13 @@ static paddr_t pmap_memlimit = -PAGE_SIZE; /* there is no limit */ #endif +/* Control what memory can be added to VM_FREELIST_PMAP */ +#ifdef PMAP_INTERNALMEMLIMIT +static paddr_t pmap_internalmemlimit = PMAP_INTERNALMEMLIMIT; +#else +static paddr_t pmap_internalmemlimit = SEGMENT_LENGTH; +#endif + struct pmap kernel_pmap_; unsigned int pmap_pages_stolen; u_long pmap_pte_valid; @@ -759,7 +766,11 @@ #if defined(PMAP_OEA) pt->pte_hi = (va_to_vsid(pm, va) << PTE_VSID_SHFT) | (((va & ADDR_PIDX) >> (ADDR_API_SHFT - PTE_API_SHFT)) & PTE_API); +#if defined(PMAP_NOMEMORYCOHERENCE) + pt->pte_lo = pte_lo & ~PTE_M; +#else pt->pte_lo = pte_lo; +#endif #elif defined (PMAP_OEA64_BRIDGE) pt->pte_hi = ((u_int64_t)va_to_vsid(pm, va) << PTE_VSID_SHFT) | (((va & ADDR_PIDX) >> (ADDR_API_SHFT - PTE_API_SHFT)) & PTE_API); @@ -1407,7 +1418,7 @@ TAILQ_FOREACH(pvo, &pmap_pvo_table[ptegidx], pvo_olink) { #if defined(DIAGNOSTIC) || defined(DEBUG) || defined(PMAPCHECK) - if ((uintptr_t) pvo >= SEGMENT_LENGTH) + if ((uintptr_t) pvo >= pmap_internalmemlimit) panic("pmap_pvo_find_va: invalid pvo %p on " "list %#x (%p)", pvo, ptegidx, &pmap_pvo_table[ptegidx]); @@ -1435,23 +1446,23 @@ PMAP_LOCK(); - if ((uintptr_t)(pvo+1) >= SEGMENT_LENGTH) + if ((uintptr_t)(pvo+1) >= pmap_internalmemlimit) panic("pmap_pvo_check: pvo %p: invalid address", pvo); - if ((uintptr_t)(pvo->pvo_pmap+1) >= SEGMENT_LENGTH) { + if ((uintptr_t)(pvo->pvo_pmap+1) >= pmap_internalmemlimit) { printf("pmap_pvo_check: pvo %p: invalid pmap address %p\n", pvo, pvo->pvo_pmap); failed = 1; } - if ((uintptr_t)TAILQ_NEXT(pvo, pvo_olink) >= SEGMENT_LENGTH || + if ((uintptr_t)TAILQ_NEXT(pvo, pvo_olink) >= pmap_internalmemlimit || (((uintptr_t)TAILQ_NEXT(pvo, pvo_olink)) & 0x1f) != 0) { printf("pmap_pvo_check: pvo %p: invalid ovlink address %p\n", pvo, TAILQ_NEXT(pvo, pvo_olink)); failed = 1; } - if ((uintptr_t)LIST_NEXT(pvo, pvo_vlink) >= SEGMENT_LENGTH || + if ((uintptr_t)LIST_NEXT(pvo, pvo_vlink) >= pmap_internalmemlimit || (((uintptr_t)LIST_NEXT(pvo, pvo_vlink)) & 0x1f) != 0) { printf("pmap_pvo_check: pvo %p: invalid ovlink address %p\n", pvo, LIST_NEXT(pvo, pvo_vlink)); @@ -2798,7 +2809,7 @@ for (ptegidx = 0; ptegidx < pmap_pteg_cnt; ptegidx++) { struct pvo_entry *pvo; TAILQ_FOREACH(pvo, &pmap_pvo_table[ptegidx], pvo_olink) { - if ((uintptr_t) pvo >= SEGMENT_LENGTH) + if ((uintptr_t) pvo >= pmap_internalmemlimit) panic("pmap_pvo_verify: invalid pvo %p " "on list %#x", pvo, ptegidx); pmap_pvo_check(pvo); @@ -2847,7 +2858,7 @@ PMAP_UNLOCK(); again: pg = uvm_pagealloc_strat(NULL, 0, NULL, UVM_PGA_USERESERVE, - UVM_PGA_STRAT_ONLY, VM_FREELIST_FIRST256); + UVM_PGA_STRAT_ONLY, VM_FREELIST_PMAP); if (__predict_false(pg == NULL)) { if (flags & PR_WAITOK) { uvm_wait("plpg"); @@ -2925,7 +2936,7 @@ */ for (bank = 0; bank < vm_nphysseg; bank++) { ps = VM_PHYSMEM_PTR(bank); - if (ps->free_list == VM_FREELIST_FIRST256 && + if (ps->free_list == VM_FREELIST_PMAP && ps->avail_end - ps->avail_start >= npgs) { pa = ptoa(ps->avail_start); break; @@ -3332,7 +3343,7 @@ #if defined(DIAGNOSTIC) || defined(DEBUG) || defined(PMAPCHECK) - if ( (uintptr_t) pmap_pteg_table + size > SEGMENT_LENGTH) + if ( (uintptr_t) pmap_pteg_table + size > pmap_internalmemlimit) panic("pmap_bootstrap: pmap_pteg_table end (%p + %#" _PRIxpa ") > 256MB", pmap_pteg_table, size); #endif @@ -3348,7 +3359,7 @@ size = sizeof(pmap_pvo_table[0]) * pmap_pteg_cnt; pmap_pvo_table = (void *)(uintptr_t) pmap_boot_find_memory(size, PAGE_SIZE, 0); #if defined(DIAGNOSTIC) || defined(DEBUG) || defined(PMAPCHECK) - if ( (uintptr_t) pmap_pvo_table + size > SEGMENT_LENGTH) + if ( (uintptr_t) pmap_pvo_table + size > pmap_internalmemlimit) panic("pmap_bootstrap: pmap_pvo_table end (%p + %#" _PRIxpa ") > 256MB", pmap_pvo_table, size); #endif @@ -3368,16 +3379,16 @@ paddr_t pfend = atop(mp->start + mp->size); if (mp->size == 0) continue; - if (mp->start + mp->size <= SEGMENT_LENGTH) { + if (mp->start + mp->size <= pmap_internalmemlimit) { uvm_page_physload(pfstart, pfend, pfstart, pfend, - VM_FREELIST_FIRST256); - } else if (mp->start >= SEGMENT_LENGTH) { + VM_FREELIST_PMAP); + } else if (mp->start >= pmap_internalmemlimit) { uvm_page_physload(pfstart, pfend, pfstart, pfend, VM_FREELIST_DEFAULT); } else { pfend = atop(SEGMENT_LENGTH); uvm_page_physload(pfstart, pfend, pfstart, pfend, - VM_FREELIST_FIRST256); + VM_FREELIST_PMAP); pfstart = atop(SEGMENT_LENGTH); pfend = atop(mp->start + mp->size); uvm_page_physload(pfstart, pfend, pfstart, pfend, Index: arch/powerpc/powerpc/pmap_subr.c =================================================================== RCS file: /cvsroot/src/sys/arch/powerpc/powerpc/pmap_subr.c,v retrieving revision 1.25 diff -u -u -r1.25 pmap_subr.c --- arch/powerpc/powerpc/pmap_subr.c 12 Nov 2010 07:59:27 -0000 1.25 +++ arch/powerpc/powerpc/pmap_subr.c 5 Dec 2010 13:47:44 -0000 @@ -330,7 +330,11 @@ * valid but we know that UVM will never pass a uncacheable page. * Don't use dcbz if we don't know the cache width. */ +#ifdef PMAP_NODCBZ + if (1) { +#else if ((linewidth = curcpu()->ci_ci.dcache_line_size) == 0) { +#endif long *dp = (long *)pa; long * const ep = dp + PAGE_SIZE/sizeof(dp[0]); do {