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 {
