[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;
! }
}
/*