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 {