[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: UVM (Re: MNN)



>とりあえず、UVMと、tsubaiさんのMACHINE_NEW_NONCONTIG、kcopy、pmap bug fixを
>まとめてpowerpcにcommitしてしまってよろしいでしょうか?
>currentへのpatchを最後に付けます。

手元の状態と比べてみました。

* uvm_fault の arg3 は 0 (他の port はそうなっている気がする)
* uvm_pagealloc の arg2 は 0 (同)
* なんとなく kmem_alloc は全部 uvm_km_zalloc (なんとなく:-)
* なくても動くけど、#include <uvm/...> (一応)

あと MNN まわりをもうちょっといじったので diff をつけておきます。
#ifdef とかしてるけど実際は #define しないと動きません。MNN の
追加というよりは MNN への移行になっちゃってます。

じゃあ、あとはよろしく。:-)


> > # こういう時、メモリーが多すぎて困る。:-)
>
>メモリーを抜きませう :-)

64MB * 1 なんです。:-)


# diff とったあとで不要な部分を手で削除したので、行番号などずれています。

diff -cr ./pmap.c /a/src/sys/arch/powerpc/powerpc/pmap.c
*** ./pmap.c	Fri Jun  5 16:53:50 1998
--- /a/src/sys/arch/powerpc/powerpc/pmap.c	Fri Jun  5 17:11:31 1998
***************
*** 30,35 ****
--- 30,36 ----
   * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
   * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
   */
+ 
  #include "opt_uvm.h"
  
  #include <sys/param.h>
***************
*** 42,47 ****
--- 43,52 ----
  #include <vm/vm.h>
  #include <vm/vm_kern.h>
  
+ #if defined(UVM)
+ #include <uvm/uvm.h>
+ #endif
+ 
  #include <machine/pcb.h>
  #include <machine/powerpc.h>
  
***************
*** 1059,1065 ****
  	int idx, i, s;
  	pte_t pte;
  	struct pte_ovfl *po;
! 	int bank;
  
  	/*
  	 * Have to remove any existing mapping first.
--- 1071,1080 ----
  	int idx, i, s;
  	pte_t pte;
  	struct pte_ovfl *po;
! 	int managed;
! #if !defined(MACHINE_NEW_NONCONTIG)
! 	struct mem_region *mp;
! #endif
  
  	/*
  	 * Have to remove any existing mapping first.
***************
*** 1079,1088 ****
  		| ((va & ADDR_PIDX) >> ADDR_API_SHFT);
  	pte.pte_lo = (pa & PTE_RPGN) | PTE_M | PTE_I | PTE_G;
  
! 	bank = vm_physseg_find(atop(pa), NULL);
! 	if (bank != -1)
  		pte.pte_lo &= ~(PTE_I | PTE_G);
! 
  	if (prot & VM_PROT_WRITE)
  		pte.pte_lo |= PTE_RW;
  	else
--- 1094,1114 ----
  		| ((va & ADDR_PIDX) >> ADDR_API_SHFT);
  	pte.pte_lo = (pa & PTE_RPGN) | PTE_M | PTE_I | PTE_G;
  
! 	managed = 0;
! #if defined(MACHINE_NEW_NONCONTIG)
! 	if (vm_physseg_find(atop(pa), NULL) != -1) {
! 		managed = 1;
  		pte.pte_lo &= ~(PTE_I | PTE_G);
! 	}
! #else
! 	for (mp = mem; mp->size; mp++) {
! 		if (pa >= mp->start && pa < mp->start + mp->size) {
! 			managed = 1;
! 			pte.pte_lo &= ~(PTE_I | PTE_G);
! 			break;
! 		}
! 	}
! #endif
  	if (prot & VM_PROT_WRITE)
  		pte.pte_lo |= PTE_RW;
  	else
***************
*** 1091,1097 ****
  	/*
  	 * Now record mapping for later back-translation.
  	 */
! 	if (pmap_initialized && bank != -1)
  		if (pmap_enter_pv(idx, va, pa)) {
  			/* 
  			 * Flush the real memory from the cache.
--- 1117,1123 ----
  	/*
  	 * Now record mapping for later back-translation.
  	 */
! 	if (pmap_initialized && managed)
  		if (pmap_enter_pv(idx, va, pa)) {
  			/* 
  			 * Flush the real memory from the cache.
***************
*** 1131,1137 ****
  	sr_t sr;
  	pte_t *ptp;
  	struct pte_ovfl *po, *npo;
! 	
  	s = splimp();
  	while (va < endva) {
  		idx = pteidx(sr = ptesr(pm->pm_sr, va), va);
--- 1157,1163 ----
  	sr_t sr;
  	pte_t *ptp;
  	struct pte_ovfl *po, *npo;
! 
  	s = splimp();
  	while (va < endva) {
  		idx = pteidx(sr = ptesr(pm->pm_sr, va), va);
diff -cr ./trap.c /a/src/sys/arch/powerpc/powerpc/trap.c
*** ./trap.c	Fri Jun  5 16:53:50 1998
--- /a/src/sys/arch/powerpc/powerpc/trap.c	Fri Jun  5 17:13:21 1998
***************
*** 30,35 ****
--- 30,36 ----
   * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
   * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
   */
+ 
  #include "opt_uvm.h"
  
  #include <sys/param.h>
***************
*** 43,48 ****
--- 44,53 ----
  #include <vm/vm.h>
  #include <vm/vm_kern.h>
  
+ #if defined(UVM)
+ #include <uvm/uvm_extern.h>
+ #endif
+ 
  #include <machine/cpu.h>
  #include <machine/frame.h>
  #include <machine/pcb.h>
***************
*** 435,440 ****
--- 436,442 ----
  	return 0;
  }
  
+ #if defined(UVM)
  /*
   * kcopy(const void *src, void *dst, size_t len);
   *
***************
*** 463,465 ****
--- 465,468 ----
  	curpcb->pcb_onfault = 0;
  	return 0;
  }
+ #endif
diff -cr ./vm_machdep.c /a/src/sys/arch/powerpc/powerpc/vm_machdep.c
*** ./vm_machdep.c	Fri Jun  5 16:53:50 1998
--- /a/src/sys/arch/powerpc/powerpc/vm_machdep.c	Fri Jun  5 17:03:25 1998
***************
*** 30,35 ****
--- 30,36 ----
   * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
   * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
   */
+ 
  #include "opt_uvm.h"
  
  #include <sys/param.h>
***************
*** 41,46 ****
--- 42,51 ----
  
  #include <vm/vm.h>
  #include <vm/vm_kern.h>
+ 
+ #if defined(UVM)
+ #include <uvm/uvm_extern.h>
+ #endif
  
  #include <machine/pcb.h>
  

ついでに。冗談のつもりで試してみたんですが、
pmap.c でこれをやるとちょっと速くなります。:-)
604e@200MHz で 5% ぐらい。
bzero をちゃんと書き直すのが筋ですね。

***************
*** 806,812 ****
  pmap_zero_page(pa)
  	vm_offset_t pa;
  {
! 	bzero((caddr_t)pa, NBPG);
  }
  
  /*
--- 811,824 ----
  pmap_zero_page(pa)
  	vm_offset_t pa;
  {
! //	bzero((caddr_t)pa, NBPG);
! 
! 	int i;
! 
! 	for (i = 0; i < NBPG / CACHELINESIZE; i++) {
! 		__asm __volatile ("dcbz 0,%0" :: "r"(pa));
! 		pa += CACHELINESIZE;
! 	}
  }
  
  /*