Module Name: src
Committed By: matt
Date: Wed Jan 26 08:52:27 UTC 2011
Modified Files:
src/sys/arch/macppc/macppc [matt-nb5-pq3]: rbus_machdep.c
src/sys/arch/powerpc/include/oea [matt-nb5-pq3]: bat.h
src/sys/arch/powerpc/oea [matt-nb5-pq3]: genassym.cf oea_machdep.c
ofw_rascons.c pmap.c
src/sys/arch/powerpc/powerpc [matt-nb5-pq3]: trap_subr.S
Log Message:
Change battable to have a granularity of 8MB.
To generate a diff of this commit:
cvs rdiff -u -r1.14 -r1.14.42.1 src/sys/arch/macppc/macppc/rbus_machdep.c
cvs rdiff -u -r1.12 -r1.12.22.1 src/sys/arch/powerpc/include/oea/bat.h
cvs rdiff -u -r1.14.26.2 -r1.14.26.3 src/sys/arch/powerpc/oea/genassym.cf
cvs rdiff -u -r1.46.18.2 -r1.46.18.3 src/sys/arch/powerpc/oea/oea_machdep.c
cvs rdiff -u -r1.2 -r1.2.26.1 src/sys/arch/powerpc/oea/ofw_rascons.c
cvs rdiff -u -r1.61.12.2 -r1.61.12.3 src/sys/arch/powerpc/oea/pmap.c
cvs rdiff -u -r1.65.16.2 -r1.65.16.3 src/sys/arch/powerpc/powerpc/trap_subr.S
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/arch/macppc/macppc/rbus_machdep.c
diff -u src/sys/arch/macppc/macppc/rbus_machdep.c:1.14 src/sys/arch/macppc/macppc/rbus_machdep.c:1.14.42.1
--- src/sys/arch/macppc/macppc/rbus_machdep.c:1.14 Wed Oct 17 19:55:34 2007
+++ src/sys/arch/macppc/macppc/rbus_machdep.c Wed Jan 26 08:52:26 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: rbus_machdep.c,v 1.14 2007/10/17 19:55:34 garbled Exp $ */
+/* $NetBSD: rbus_machdep.c,v 1.14.42.1 2011/01/26 08:52:26 matt Exp $ */
/*
* Copyright (c) 1999
@@ -28,7 +28,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rbus_machdep.c,v 1.14 2007/10/17 19:55:34 garbled Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rbus_machdep.c,v 1.14.42.1 2011/01/26 08:52:26 matt Exp $");
#include <sys/param.h>
#include <sys/device.h>
@@ -95,8 +95,7 @@
size = 0x10000000;
}
- battable[start >> 28].batl = BATL(start, BAT_I, BAT_PP_RW);
- battable[start >> 28].batu = BATU(start, BAT_BL_256M, BAT_Vs);
+ oea_iobat_add(start, BAT_BL_256M);
return rbus_new_root_delegate(pa->pa_memt, start, size, 0);
}
Index: src/sys/arch/powerpc/include/oea/bat.h
diff -u src/sys/arch/powerpc/include/oea/bat.h:1.12 src/sys/arch/powerpc/include/oea/bat.h:1.12.22.1
--- src/sys/arch/powerpc/include/oea/bat.h:1.12 Mon Apr 28 20:23:32 2008
+++ src/sys/arch/powerpc/include/oea/bat.h Wed Jan 26 08:52:26 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: bat.h,v 1.12 2008/04/28 20:23:32 martin Exp $ */
+/* $NetBSD: bat.h,v 1.12.22.1 2011/01/26 08:52:26 matt Exp $ */
/*-
* Copyright (c) 1999 The NetBSD Foundation, Inc.
@@ -194,7 +194,8 @@
#define BAT601_VALID_P(batl) \
((batl) & BAT601_V)
-#define BAT_VA2IDX(va) ((va) >> ADDR_SR_SHFT)
+#define BAT_VA2IDX(va) ((va) / (8*1024*1024))
+#define BAT_IDX2VA(i) ((i) * (8*1024*1024))
#ifdef _KERNEL
#ifndef _LOCORE
Index: src/sys/arch/powerpc/oea/genassym.cf
diff -u src/sys/arch/powerpc/oea/genassym.cf:1.14.26.2 src/sys/arch/powerpc/oea/genassym.cf:1.14.26.3
--- src/sys/arch/powerpc/oea/genassym.cf:1.14.26.2 Mon Jan 17 07:45:59 2011
+++ src/sys/arch/powerpc/oea/genassym.cf Wed Jan 26 08:52:26 2011
@@ -1,4 +1,4 @@
-# $NetBSD: genassym.cf,v 1.14.26.2 2011/01/17 07:45:59 matt Exp $
+# $NetBSD: genassym.cf,v 1.14.26.3 2011/01/26 08:52:26 matt Exp $
#
# Copyright (C) 1995, 1996 Wolfgang Solfrank.
@@ -41,6 +41,7 @@
include <sys/mutex.h>
include <sys/rwlock.h>
include <sys/proc.h>
+include <sys/bitops.h>
include <uvm/uvm_extern.h>
@@ -48,7 +49,9 @@
include <machine/pmap.h>
include <powerpc/cpu.h>
+include <powerpc/psl.h>
include <powerpc/oea/cpufeat.h>
+include <powerpc/oea/bat.h>
define FRAMELEN FRAMELEN
define FRAME_TF offsetof(struct ktrapframe, ktf_tf)
@@ -211,6 +214,9 @@
define VREG_VRSAVE offsetof(struct vreg, vrsave)
define VREG_VSCR offsetof(struct vreg, vscr)
+define MSR_PR 31-ilog2(PSL_PR)
+define BAT_ADDR_SHIFT ilog2(BAT_IDX2VA(1))
+
define L_PCB offsetof(struct lwp, l_addr)
define L_ADDR offsetof(struct lwp, l_addr)
define L_CPU offsetof(struct lwp, l_cpu)
Index: src/sys/arch/powerpc/oea/oea_machdep.c
diff -u src/sys/arch/powerpc/oea/oea_machdep.c:1.46.18.2 src/sys/arch/powerpc/oea/oea_machdep.c:1.46.18.3
--- src/sys/arch/powerpc/oea/oea_machdep.c:1.46.18.2 Mon Jan 17 07:45:59 2011
+++ src/sys/arch/powerpc/oea/oea_machdep.c Wed Jan 26 08:52:26 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: oea_machdep.c,v 1.46.18.2 2011/01/17 07:45:59 matt Exp $ */
+/* $NetBSD: oea_machdep.c,v 1.46.18.3 2011/01/26 08:52:26 matt Exp $ */
/*
* Copyright (C) 2002 Matt Thomas
@@ -33,7 +33,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: oea_machdep.c,v 1.46.18.2 2011/01/17 07:45:59 matt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: oea_machdep.c,v 1.46.18.3 2011/01/26 08:52:26 matt Exp $");
#include "opt_ppcarch.h"
#include "opt_compat_netbsd.h"
@@ -101,7 +101,7 @@
static void trap0(void *);
/* XXXSL: The battable is not initialized to non-zero for PPC_OEA64 and PPC_OEA64_BRIDGE */
-struct bat battable[512];
+struct bat battable[BAT_VA2IDX(0xffffffff)+1];
register_t iosrtable[16]; /* I/O segments, for kernel_pmap setup */
paddr_t msgbuf_paddr;
@@ -456,32 +456,39 @@
void
oea_iobat_add(paddr_t pa, register_t len)
{
- static int n = 1;
- const u_int i = pa >> 28;
+ static int z = 1;
+ const u_int i = BAT_VA2IDX(pa);
+ const u_int n = __SHIFTOUT(len, (BAT_XBL|BAT_BL) & ~BAT_BL_8M);
+
+ KASSERT(len >= BAT_BL_8M);
+
battable[i].batl = BATL(pa, BAT_I|BAT_G, BAT_PP_RW);
battable[i].batu = BATU(pa, len, BAT_Vs);
+ for (u_int j = 0; j < n; j++) {
+ battable[i + j] = battable[i];
+ }
/*
* Let's start loading the BAT registers.
*/
- switch (n) {
+ switch (z) {
case 1:
__asm volatile ("mtdbatl 1,%0; mtdbatu 1,%1;"
:: "r"(battable[i].batl),
"r"(battable[i].batu));
- n = 2;
+ z = 2;
break;
case 2:
__asm volatile ("mtdbatl 2,%0; mtdbatu 2,%1;"
:: "r"(battable[i].batl),
"r"(battable[i].batu));
- n = 3;
+ z = 3;
break;
case 3:
__asm volatile ("mtdbatl 3,%0; mtdbatu 3,%1;"
:: "r"(battable[i].batl),
"r"(battable[i].batu));
- n = 4;
+ z = 4;
break;
default:
break;
@@ -491,21 +498,25 @@
void
oea_iobat_remove(paddr_t pa)
{
- register_t batu;
- int i, n;
+ const u_int i = BAT_VA2IDX(pa);
- n = pa >> ADDR_SR_SHFT;
- if (!BAT_VA_MATCH_P(battable[n].batu, pa) ||
- !BAT_VALID_P(battable[n].batu, PSL_PR))
+ if (!BAT_VA_MATCH_P(battable[i].batu, pa) ||
+ !BAT_VALID_P(battable[i].batu, PSL_PR))
return;
- battable[n].batl = 0;
- battable[n].batu = 0;
+ const int n =
+ __SHIFTOUT(battable[i].batu, (BAT_XBL|BAT_BL) & ~BAT_BL_8M) + 1;
+ KASSERT((n & (n-1)) == 0); /* power of 2 */
+ KASSERT((i & (n-1)) == 0); /* multiple of n */
+
+ memset(&battable[i], 0, n*sizeof(battable[0]));
+
#define BAT_RESET(n) \
__asm volatile("mtdbatu %0,%1; mtdbatl %0,%1" :: "n"(n), "r"(0))
#define BATU_GET(n, r) __asm volatile("mfdbatu %0,%1" : "=r"(r) : "n"(n))
- for (i=1 ; i<4 ; i++) {
- switch (i) {
+ for (u_int k = 1 ; k < 4; k++) {
+ register_t batu;
+ switch (k) {
case 1:
BATU_GET(1, batu);
if (BAT_VA_MATCH_P(batu, pa) &&
@@ -674,18 +685,34 @@
#endif
{
for (mp = allmem; mp->size; mp++) {
- paddr_t paddr = mp->start & 0xf0000000;
- paddr_t end = mp->start + mp->size;
-
- do {
- u_int ix = paddr >> 28;
-
- battable[ix].batl =
- BATL(paddr, BAT_M, BAT_PP_RW);
- battable[ix].batu =
- BATU(paddr, BAT_BL_256M, BAT_Vs);
- paddr += SEGMENT_LENGTH;
- } while (paddr < end);
+ paddr_t paddr = mp->start & -BAT_IDX2VA(1);
+ paddr_t end =
+ roundup2(mp->start + mp->size, BAT_IDX2VA(1));
+
+ while (paddr < end) {
+ psize_t size = 256*1024*1024;
+ register_t bl = BAT_BL_256M;
+ u_int n = BAT_VA2IDX(size);
+ u_int i = BAT_VA2IDX(paddr);
+
+ while ((paddr & (size - 1))
+ || paddr + size > end) {
+ size >>= 1;
+ bl = (bl >> 1) & BAT_BL;
+ n >>= 1;
+ }
+ KASSERT(size >= BAT_IDX2VA(1));
+ KASSERT(n >= 1);
+ KASSERT(bl >= BAT_BL_8M);
+
+ for (; n-- > 0; i++) {
+ battable[i].batl =
+ BATL(paddr, BAT_M, BAT_PP_RW);
+ battable[i].batu =
+ BATU(paddr, bl, BAT_Vs);
+ }
+ paddr += size;
+ }
}
}
}
Index: src/sys/arch/powerpc/oea/ofw_rascons.c
diff -u src/sys/arch/powerpc/oea/ofw_rascons.c:1.2 src/sys/arch/powerpc/oea/ofw_rascons.c:1.2.26.1
--- src/sys/arch/powerpc/oea/ofw_rascons.c:1.2 Mon Mar 3 17:15:57 2008
+++ src/sys/arch/powerpc/oea/ofw_rascons.c Wed Jan 26 08:52:27 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: ofw_rascons.c,v 1.2 2008/03/03 17:15:57 phx Exp $ */
+/* $NetBSD: ofw_rascons.c,v 1.2.26.1 2011/01/26 08:52:27 matt Exp $ */
/*
* Copyright (c) 1995, 1996 Carnegie-Mellon University.
@@ -28,7 +28,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ofw_rascons.c,v 1.2 2008/03/03 17:15:57 phx Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ofw_rascons.c,v 1.2.26.1 2011/01/26 08:52:27 matt Exp $");
#include <sys/param.h>
#include <sys/buf.h>
@@ -199,17 +199,26 @@
if (rascons_enable_cache) {
vaddr_t va;
/*
- * Let's try to find an empty BAT to use
+ * Let's try to find an empty 256M BAT to use
*/
for (va = SEGMENT_LENGTH; va < (USER_SR << ADDR_SR_SHFT);
va += SEGMENT_LENGTH) {
- if (battable[va >> ADDR_SR_SHFT].batu == 0) {
- battable[va >> ADDR_SR_SHFT].batl =
- BATL(fbaddr & 0xf0000000,
- BAT_G | BAT_W | BAT_M, BAT_PP_RW);
- battable[va >> ADDR_SR_SHFT].batu =
- BATL(va, BAT_BL_256M, BAT_Vs);
- fbaddr &= 0x0fffffff;
+ const u_int i = BAT_VA2IDX(va);
+ const u_int n = BAT_VA2IDX(SEGMENT_LENGTH);
+ for (u_int j = 0; j < n; j++) {
+ if (battable[i+j].batu != 0) {
+ break;
+ }
+ }
+ if (j == n) {
+ register_t batl = BATL(fbaddr & 0xf0000000,
+ BAT_G | BAT_W | BAT_M, BAT_PP_RW);
+ register_t batu = BATL(va, BAT_BL_256M, BAT_Vs);
+ for (u_int j = 0; j < n; j++) {
+ battable[i+j].batl = batl;
+ battable[i+j].batu = batu;
+ }
+ fbaddr &= SEGMASK_MASK;
fbaddr |= va;
break;
}
Index: src/sys/arch/powerpc/oea/pmap.c
diff -u src/sys/arch/powerpc/oea/pmap.c:1.61.12.2 src/sys/arch/powerpc/oea/pmap.c:1.61.12.3
--- src/sys/arch/powerpc/oea/pmap.c:1.61.12.2 Mon Jan 17 07:45:59 2011
+++ src/sys/arch/powerpc/oea/pmap.c Wed Jan 26 08:52:27 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: pmap.c,v 1.61.12.2 2011/01/17 07:45:59 matt Exp $ */
+/* $NetBSD: pmap.c,v 1.61.12.3 2011/01/26 08:52:27 matt Exp $ */
/*-
* Copyright (c) 2001 The NetBSD Foundation, Inc.
* All rights reserved.
@@ -63,7 +63,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.61.12.2 2011/01/17 07:45:59 matt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.61.12.3 2011/01/26 08:52:27 matt Exp $");
#define PMAP_NOOPNAMES
@@ -2151,10 +2151,10 @@
} else
#endif /* PPC_OEA601 */
{
- register_t batu = battable[va >> ADDR_SR_SHFT].batu;
+ register_t batu = battable[BAT_VA2IDX(va)].batu;
if (BAT_VALID_P(batu,0) && BAT_VA_MATCH_P(batu,va)) {
register_t batl =
- battable[va >> ADDR_SR_SHFT].batl;
+ battable[BAT_VA2IDX(va)].batl;
register_t mask =
(~(batu & BAT_BL) << 15) & ~0x1ffffL;
if (pap)
Index: src/sys/arch/powerpc/powerpc/trap_subr.S
diff -u src/sys/arch/powerpc/powerpc/trap_subr.S:1.65.16.2 src/sys/arch/powerpc/powerpc/trap_subr.S:1.65.16.3
--- src/sys/arch/powerpc/powerpc/trap_subr.S:1.65.16.2 Mon Jan 17 07:46:00 2011
+++ src/sys/arch/powerpc/powerpc/trap_subr.S Wed Jan 26 08:52:25 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: trap_subr.S,v 1.65.16.2 2011/01/17 07:46:00 matt Exp $ */
+/* $NetBSD: trap_subr.S,v 1.65.16.3 2011/01/26 08:52:25 matt Exp $ */
/*
* Copyright (C) 1995, 1996 Wolfgang Solfrank.
@@ -236,9 +236,10 @@
mtsprg2 %r30 /* in SPRG2 */
mfsrr1 %r31 /* test kernel mode */
mtcr %r31
- bt 17,1f /* branch if PSL_PR is set */
+ bt MSR_PR,1f /* branch if PSL_PR is set */
mfdar %r31 /* get fault address */
- rlwinm %r31,%r31,7,25,28 /* get segment * 8 */
+ rlwinm %r31,%r31,3+(32-BAT_ADDR_SHIFT),BAT_ADDR_SHIFT-3,28
+ /* get segment * 8 */
/* get batu */
addis %r31,%r31,_C_LABEL(battable)@ha
@@ -304,7 +305,7 @@
mtsprg2 %r30 /* in SPRG2 */
mfsrr1 %r31 /* test kernel mode */
mtcr %r31
- bt 17,1f /* branch if PSL_PR is set */
+ bt MSR_PR,1f /* branch if PSL_PR is set */
mfdar %r31 /* get fault address */
rlwinm %r31,%r31,12,20,28 /* get "segment" battable offset */
@@ -365,13 +366,13 @@
streg %r29,(CI_TEMPSAVE+CPUSAVE_R29)(%r1) /* save r29 */
streg %r30,(CI_TEMPSAVE+CPUSAVE_R30)(%r1) /* save r30 */
streg %r31,(CI_TEMPSAVE+CPUSAVE_R31)(%r1) /* save r31 */
+ mfsprg1 %r1 /* get old SP */
mflr %r28 /* save LR */
mfcr %r29 /* save CR */
mfsrr1 %r31
mtcr %r31
- mr %r30,%r1
- mfsprg1 %r1 /* get old SP */
- bf 17,1f /* branch if PSL_PR is true */
+ bf MSR_PR,1f /* branch if PSL_PR is true */
+ GET_CPUINFO(%r30)
ldptr %r1,CI_CURPCB(%r30) /* get kernel stack */
addi %r1,%r1,USPACE-CALLFRAMELEN /* stack is top of user struct */
RESTORE_KERN_SRS(%r30, %r31)
@@ -398,13 +399,13 @@
streg %r29,(CI_TEMPSAVE+CPUSAVE_R29)(%r1) /* save r29 */
streg %r30,(CI_TEMPSAVE+CPUSAVE_R30)(%r1) /* save r30 */
streg %r31,(CI_TEMPSAVE+CPUSAVE_R31)(%r1) /* save r31 */
+ mfsprg1 %r1 /* get old SP */
mflr %r28 /* save LR */
mfcr %r29 /* save CR */
mfsrr1 %r31
mtcr %r31
- mr %r30,%r1
- mfsprg1 %r1 /* yes, get old SP */
- bf 17,1f /* branch if PSL_PR is true */
+ bf MSR_PR,1f /* branch if PSL_PR is true */
+ GET_CPUINFO(%r30)
ldptr %r1,CI_CURPCB(%r30) /* get kernel stack */
addi %r1,%r1,USPACE-CALLFRAMELEN /* stack is top of user struct */
RESTORE_KERN_SRS(%r30, %r31)
@@ -630,7 +631,7 @@
* In case of DDB we want a separate trap catcher for it
*/
.local ddbstk
- .comm ddbstk,INTSTK,8 /* ddb stack */
+ .comm ddbstk,INTSTK,16 /* ddb stack */
/* LINTSTUB: Var: int ddblow[1], ddbsize[1]; */
.globl _C_LABEL(ddblow),_C_LABEL(ddbsize)
@@ -641,7 +642,7 @@
mfsrr1 %r1
mtcr %r1
GET_CPUINFO(%r1)
- bf 17,1f /* branch if privileged */
+ bf MSR_PR,1f /* branch if privileged */
streg %r28,(CI_TEMPSAVE+CPUSAVE_R28)(%r1) /* free r28 */
mfsprg2 %r28
streg %r28,(CI_TEMPSAVE+CPUSAVE_R29)(%r1) /* free r29 */
@@ -685,7 +686,7 @@
*/
.local ipkdbstk
- .comm ipkdbstk,INTSTK,8 /* ipkdb stack */
+ .comm ipkdbstk,INTSTK,16 /* ipkdb stack */
/* LINTSTUB: Var: int ipkdblow[1], ipkdbsize[1]; */
.globl _C_LABEL(ipkdblow),_C_LABEL(ipkdbsize)
@@ -856,7 +857,7 @@
GET_CPUINFO(%r2); \
ldreg %r3,(savearea+CPUSAVE_SRR1)(%r2); \
mtcr %r3; \
- bf 17,1f; /* branch if PSL_PR is false */ \
+ bf MSR_PR,1f; /* branch if PSL_PR is false */ \
/* Restore user SRs */ \
RESTORE_USER_SRS(%r2,%r3); \
1: mfsprg1 %r2; /* restore cr */ \
@@ -890,7 +891,7 @@
#ifdef DDB
mfsrr1 %r31
mtcr %r31
- bt 17,trapstart /* branch is user mode */
+ bt MSR_PR,trapstart /* branch is user mode */
mfsprg1 %r31 /* get old SP */
#if 0
subf %r30,%r30,%r31 /* subtract DAR from it */
@@ -926,7 +927,7 @@
mfsprg1 %r1 /* restore SP (might have been
overwritten) */
s_trap:
- bf 17,k_trap /* branch if PSL_PR is false */
+ bf MSR_PR,k_trap /* branch if PSL_PR is false */
GET_CPUINFO(%r1) /* get cpu_info for this cpu */
u_trap:
ldptr %r1,CI_CURPCB(%r1)
@@ -961,7 +962,7 @@
/* Test AST pending: */
ldreg %r5,FRAME_SRR1(%r1)
mtcr %r5
- bf 17,trapleave /* branch if PSL_PR is false */
+ bf MSR_PR,trapleave /* branch if PSL_PR is false */
GET_CPUINFO(%r3)
ldint %r4,CI_ASTPENDING(%r3)
andi. %r4,%r4,1
@@ -1126,7 +1127,7 @@
/* Returning to user mode? */
ldreg %r8,FRAME_SRR1(%r1)
mtcr %r8 /* saved SRR1 */
- bf 17,intrleave /* branch if PSL_PR is false */
+ bf MSR_PR,intrleave /* branch if PSL_PR is false */
ldint %r3,CI_ASTPENDING(%r5) /* Test AST pending */
andi. %r3,%r3,1