summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsakamoto <sakamoto@NetBSD.org>1998-06-09 05:41:19 +0000
committersakamoto <sakamoto@NetBSD.org>1998-06-09 05:41:19 +0000
commit040581ceeda19cfbd6cff7c12289dfcb8d137552 (patch)
tree19a964a6cf9993d5c39adb5e1865b5dc24470e66
parenta5550009e654db0b91245e088b661a89d37459b5 (diff)
Add UVM support.
-rw-r--r--sys/arch/bebox/bebox/bus_dma.c48
-rw-r--r--sys/arch/bebox/bebox/extintr.c5
-rw-r--r--sys/arch/bebox/bebox/locore.s10
-rw-r--r--sys/arch/bebox/bebox/machdep.c90
-rw-r--r--sys/arch/bebox/conf/GENERIC4
-rw-r--r--sys/arch/bebox/include/vmparam.h22
6 files changed, 152 insertions, 27 deletions
diff --git a/sys/arch/bebox/bebox/bus_dma.c b/sys/arch/bebox/bebox/bus_dma.c
index cbadc8272bb..28066c02886 100644
--- a/sys/arch/bebox/bebox/bus_dma.c
+++ b/sys/arch/bebox/bebox/bus_dma.c
@@ -1,4 +1,4 @@
-/* $NetBSD: bus_dma.c,v 1.12 1998/06/03 06:41:51 thorpej Exp $ */
+/* $NetBSD: bus_dma.c,v 1.13 1998/06/09 05:41:19 sakamoto Exp $ */
/*-
* Copyright (c) 1996, 1997, 1998 The NetBSD Foundation, Inc.
@@ -76,6 +76,7 @@
*
* @(#)machdep.c 7.4 (Berkeley) 6/3/91
*/
+#include "opt_uvm.h"
#include <sys/param.h>
#include <sys/systm.h>
@@ -112,6 +113,10 @@
#include <vm/vm_kern.h>
#include <vm/vm_page.h>
+#if defined(UVM)
+#include <uvm/uvm_extern.h>
+#endif
+
#include <sys/sysctl.h>
#define _BEBOX_BUS_DMA_PRIVATE
@@ -376,15 +381,20 @@ _bus_dmamem_free(t, segs, nsegs)
*/
TAILQ_INIT(&mlist);
for (curseg = 0; curseg < nsegs; curseg++) {
- for (addr = segs[curseg].ds_addr;
- addr < (segs[curseg].ds_addr + segs[curseg].ds_len);
+ for (addr = PCI_MEM_TO_PHYS(segs[curseg].ds_addr);
+ addr < (PCI_MEM_TO_PHYS(segs[curseg].ds_addr)
+ + segs[curseg].ds_len);
addr += PAGE_SIZE) {
m = PHYS_TO_VM_PAGE(addr);
TAILQ_INSERT_TAIL(&mlist, m, pageq);
}
}
+#if defined(UVM)
+ uvm_pglistfree(&mlist);
+#else
vm_page_free_memory(&mlist);
+#endif
}
/*
@@ -406,7 +416,11 @@ _bus_dmamem_map(t, segs, nsegs, size, kvap, flags)
size = round_page(size);
s = splimp();
+#if defined(UVM)
+ va = uvm_km_valloc(kmem_map, size);
+#else
va = kmem_alloc_pageable(kmem_map, size);
+#endif
splx(s);
if (va == 0)
@@ -415,8 +429,9 @@ _bus_dmamem_map(t, segs, nsegs, size, kvap, flags)
*kvap = (caddr_t)va;
for (curseg = 0; curseg < nsegs; curseg++) {
- for (addr = segs[curseg].ds_addr;
- addr < (segs[curseg].ds_addr + segs[curseg].ds_len);
+ for (addr = PCI_MEM_TO_PHYS(segs[curseg].ds_addr);
+ addr < (PCI_MEM_TO_PHYS(segs[curseg].ds_addr)
+ + segs[curseg].ds_len);
addr += NBPG, va += NBPG, size -= NBPG) {
if (size == 0)
panic("_bus_dmamem_map: size botch");
@@ -453,7 +468,11 @@ _bus_dmamem_unmap(t, kva, size)
size = round_page(size);
s = splimp();
+#if defined(UVM)
+ uvm_km_free(kmem_map, (vm_offset_t)kva, size);
+#else
kmem_free(kmem_map, (vm_offset_t)kva, size);
+#endif
splx(s);
}
@@ -473,7 +492,7 @@ _bus_dmamem_mmap(t, segs, nsegs, off, prot, flags)
#ifdef DIAGNOSTIC
if (off & PGOFSET)
panic("_bus_dmamem_mmap: offset unaligned");
- if (segs[i].ds_addr & PGOFSET)
+ if (PCI_MEM_TO_PHYS(segs[i].ds_addr) & PGOFSET)
panic("_bus_dmamem_mmap: segment unaligned");
if (segs[i].ds_len & PGOFSET)
panic("_bus_dmamem_mmap: segment size not multiple"
@@ -484,7 +503,7 @@ _bus_dmamem_mmap(t, segs, nsegs, off, prot, flags)
continue;
}
- return (vtophys((caddr_t)segs[i].ds_addr + off));
+ return (PCI_MEM_TO_PHYS((int)segs[i].ds_addr + off));
}
/* Page not found. */
@@ -562,7 +581,7 @@ _bus_dmamap_load_buffer(map, buf, buflen, p, flags, bounce_thresh, lastaddrp,
* previous segment if possible.
*/
if (first) {
- map->dm_segs[seg].ds_addr = curaddr;
+ map->dm_segs[seg].ds_addr = PHYS_TO_PCI_MEM(curaddr);
map->dm_segs[seg].ds_len = sgsize;
first = 0;
} else {
@@ -576,7 +595,8 @@ _bus_dmamap_load_buffer(map, buf, buflen, p, flags, bounce_thresh, lastaddrp,
else {
if (++seg >= map->_dm_segcnt)
break;
- map->dm_segs[seg].ds_addr = curaddr;
+ map->dm_segs[seg].ds_addr =
+ PHYS_TO_PCI_MEM(curaddr);
map->dm_segs[seg].ds_len = sgsize;
}
}
@@ -625,8 +645,13 @@ _bus_dmamem_alloc_range(t, size, alignment, boundary, segs, nsegs, rsegs,
* Allocate pages from the VM system.
*/
TAILQ_INIT(&mlist);
+#if defined(UVM)
+ error = uvm_pglistalloc(size, low, high,
+ alignment, boundary, &mlist, nsegs, (flags & BUS_DMA_NOWAIT) == 0);
+#else
error = vm_page_alloc_memory(size, low, high,
alignment, boundary, &mlist, nsegs, (flags & BUS_DMA_NOWAIT) == 0);
+#endif
if (error)
return (error);
@@ -636,7 +661,8 @@ _bus_dmamem_alloc_range(t, size, alignment, boundary, segs, nsegs, rsegs,
*/
m = mlist.tqh_first;
curseg = 0;
- lastaddr = segs[curseg].ds_addr = VM_PAGE_TO_PHYS(m);
+ lastaddr = VM_PAGE_TO_PHYS(m);
+ segs[curseg].ds_addr = PHYS_TO_PCI_MEM(lastaddr);
segs[curseg].ds_len = PAGE_SIZE;
m = m->pageq.tqe_next;
@@ -653,7 +679,7 @@ _bus_dmamem_alloc_range(t, size, alignment, boundary, segs, nsegs, rsegs,
segs[curseg].ds_len += PAGE_SIZE;
else {
curseg++;
- segs[curseg].ds_addr = curaddr;
+ segs[curseg].ds_addr = PHYS_TO_PCI_MEM(curaddr);
segs[curseg].ds_len = PAGE_SIZE;
}
lastaddr = curaddr;
diff --git a/sys/arch/bebox/bebox/extintr.c b/sys/arch/bebox/bebox/extintr.c
index fadb9ee53cf..35c0c0efd5a 100644
--- a/sys/arch/bebox/bebox/extintr.c
+++ b/sys/arch/bebox/bebox/extintr.c
@@ -1,4 +1,4 @@
-/* $NetBSD: extintr.c,v 1.6 1998/05/28 08:44:57 sakamoto Exp $ */
+/* $NetBSD: extintr.c,v 1.7 1998/06/09 05:41:19 sakamoto Exp $ */
/* $OpenBSD: isabus.c,v 1.1 1997/10/11 11:53:00 pefo Exp $ */
/*-
@@ -390,9 +390,6 @@ do_pending_int()
pcpl = splhigh(); /* Turn off all */
hwpend = ipending & ~pcpl; /* Do now unmasked pendings */
-#if 0
- hwpend &= ~SINT_MASK;
-#endif
imen &= ~hwpend;
while (hwpend) {
irq = ffs(hwpend) - 1;
diff --git a/sys/arch/bebox/bebox/locore.s b/sys/arch/bebox/bebox/locore.s
index 6731b0430e0..1edcdf5c099 100644
--- a/sys/arch/bebox/bebox/locore.s
+++ b/sys/arch/bebox/bebox/locore.s
@@ -1,4 +1,4 @@
-/* $NetBSD: locore.s,v 1.5 1998/02/19 00:30:38 thorpej Exp $ */
+/* $NetBSD: locore.s,v 1.6 1998/06/09 05:41:19 sakamoto Exp $ */
/* $OpenBSD: locore.S,v 1.4 1997/01/26 09:06:38 rahnds Exp $ */
/*
@@ -31,11 +31,9 @@
* 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 "fs_kernfs.h"
-
#include "ipkdb.h"
-
#include "assym.h"
#include <sys/syscall.h>
@@ -206,7 +204,11 @@ ENTRY(switchexit)
stw 6,_C_LABEL(curpcb)@l(7)
addi 1,6,USPACE-16 /* 16 bytes are reserved at stack top */
/* Now free the old user structure (args are already in r3, r4, r5) */
+#if defined(UVM)
+ bl _C_LABEL(uvm_km_free)
+#else
bl _C_LABEL(kmem_free)
+#endif
/* Fall through to cpu_switch to actually select another proc */
li 3,0 /* indicate exited process */
diff --git a/sys/arch/bebox/bebox/machdep.c b/sys/arch/bebox/bebox/machdep.c
index 73c419b9d05..68c6924b011 100644
--- a/sys/arch/bebox/bebox/machdep.c
+++ b/sys/arch/bebox/bebox/machdep.c
@@ -1,4 +1,4 @@
-/* $NetBSD: machdep.c,v 1.15 1998/05/28 16:59:31 drochner Exp $ */
+/* $NetBSD: machdep.c,v 1.16 1998/06/09 05:41:20 sakamoto Exp $ */
/*
* Copyright (C) 1995, 1996 Wolfgang Solfrank.
@@ -30,6 +30,7 @@
* 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 "ipkdb.h"
#include <sys/param.h>
@@ -54,6 +55,10 @@
#include <vm/vm.h>
#include <vm/vm_kern.h>
+#if defined(UVM)
+#include <uvm/uvm_extern.h>
+#endif
+
#include <net/netisr.h>
#include <machine/bat.h>
@@ -99,6 +104,12 @@
/*
* Global variables used here and there
*/
+#if defined(UVM)
+vm_map_t exec_map = NULL;
+vm_map_t mb_map = NULL;
+vm_map_t phys_map = NULL;
+#endif
+
char bootinfo[BOOTINFO_MAXSIZE];
char machine[] = MACHINE; /* machine */
@@ -319,7 +330,11 @@ initppc(startkernel, endkernel, args, btinfo)
/*
* Set the page size.
*/
+#if defined(UVM)
+ uvm_setpagesize();
+#else
vm_set_page_size();
+#endif
/*
* Initialize pmap module.
@@ -437,16 +452,26 @@ cpu_startup()
/*
* BeBox Mother Board's Register Mapping
*/
- if (!(bebox_mb_reg = kmem_alloc(kernel_map, round_page(NBPG))))
+#if defined(UVM)
+ if (!(bebox_mb_reg = uvm_km_valloc(kernel_map, round_page(NBPG))))
+ panic("initppc: no room for interrupt register");
+#else
+ if (!(bebox_mb_reg = kmem_alloc_pageable(kernel_map, round_page(NBPG))))
panic("initppc: no room for interrupt register");
+#endif
pmap_enter(pmap_kernel(), bebox_mb_reg, MOTHER_BOARD_REG,
VM_PROT_ALL, TRUE);
/*
* Initialize error message buffer (at end of core).
*/
+#if defined(UVM)
+ if (!(msgbuf_vaddr = uvm_km_alloc(kernel_map, round_page(MSGBUFSIZE))))
+ panic("startup: no room for message buffer");
+#else
if (!(msgbuf_vaddr = kmem_alloc(kernel_map, round_page(MSGBUFSIZE))))
panic("startup: no room for message buffer");
+#endif
for (i = 0; i < btoc(MSGBUFSIZE); i++)
pmap_enter(pmap_kernel(), msgbuf_vaddr + i * NBPG,
msgbuf_paddr + i * NBPG, VM_PROT_ALL, TRUE);
@@ -463,8 +488,13 @@ cpu_startup()
* and then give everything true virtual addresses.
*/
sz = (int)allocsys((caddr_t)0);
+#if defined(UVM)
+ if ((v = (caddr_t)uvm_km_zalloc(kernel_map, round_page(sz))) == 0)
+ panic("startup: no room for tables");
+#else
if ((v = (caddr_t)kmem_alloc(kernel_map, round_page(sz))) == 0)
panic("startup: no room for tables");
+#endif
if (allocsys(v) - v != sz)
panic("startup: table size inconsistency");
@@ -473,11 +503,19 @@ cpu_startup()
* in that they usually occupy more virtual memory than physical.
*/
sz = MAXBSIZE * nbuf;
+#if defined(UVM)
+ if (uvm_map(kernel_map, (vm_offset_t *)&buffers, round_page(sz),
+ NULL, UVM_UNKNOWN_OFFSET,
+ UVM_MAPFLAG(UVM_PROT_NONE, UVM_PROT_NONE, UVM_INH_NONE,
+ UVM_ADV_NORMAL, 0)) != KERN_SUCCESS)
+ panic("startup: cannot allocate VM for buffers");
+#else
buffer_map = kmem_suballoc(kernel_map, &minaddr, &maxaddr, sz, TRUE);
buffers = (char *)minaddr;
if (vm_map_find(buffer_map, vm_object_allocate(sz), (vm_offset_t)0,
&minaddr, sz, FALSE) != KERN_SUCCESS)
panic("startup: cannot allocate buffers");
+#endif
base = bufpages / nbuf;
residual = bufpages % nbuf;
if (base >= MAXBSIZE) {
@@ -486,6 +524,31 @@ cpu_startup()
residual = 0;
}
for (i = 0; i < nbuf; i++) {
+#if defined(UVM)
+ vm_size_t curbufsize;
+ vm_offset_t curbuf;
+ struct vm_page *pg;
+
+ /*
+ * Each buffer has MAXBSIZE bytes of VM space allocated. Of
+ * that MAXBSIZE space, we allocate and map (base+1) pages
+ * for the first "residual" buffers, and then we allocate
+ * "base" pages for the rest.
+ */
+ curbuf = (vm_offset_t) buffers + (i * MAXBSIZE);
+ curbufsize = CLBYTES * ((i < residual) ? (base+1) : base);
+
+ while (curbufsize) {
+ pg = uvm_pagealloc(NULL, 0, NULL);
+ if (pg == NULL)
+ panic("startup: not enough memory for "
+ "buffer cache");
+ pmap_enter(kernel_map->pmap, curbuf,
+ VM_PAGE_TO_PHYS(pg), VM_PROT_ALL, TRUE);
+ curbuf += PAGE_SIZE;
+ curbufsize -= PAGE_SIZE;
+ }
+#else
vm_size_t curbufsize;
vm_offset_t curbuf;
@@ -493,26 +556,42 @@ cpu_startup()
curbufsize = CLBYTES * (i < residual ? base + 1 : base);
vm_map_pageable(buffer_map, curbuf, curbuf + curbufsize, FALSE);
vm_map_simplify(buffer_map, curbuf);
+#endif
}
/*
* Allocate a submap for exec arguments. This map effectively
* limits the number of processes exec'ing at any time.
*/
+#if defined(UVM)
+ exec_map = uvm_km_suballoc(kernel_map, &minaddr, &maxaddr,
+ 16*NCARGS, TRUE, FALSE, NULL);
+#else
exec_map = kmem_suballoc(kernel_map, &minaddr, &maxaddr,
16*NCARGS, TRUE);
+#endif
/*
* Allocate a submap for physio
*/
+#if defined(UVM)
+ phys_map = uvm_km_suballoc(kernel_map, &minaddr, &maxaddr,
+ VM_PHYS_SIZE, TRUE, FALSE, NULL);
+#else
phys_map = kmem_suballoc(kernel_map, &minaddr, &maxaddr,
VM_PHYS_SIZE, TRUE);
+#endif
/*
* Finally, allocate mbuf cluster submap.
*/
+#if defined(UVM)
+ mb_map = uvm_km_suballoc(kernel_map, (vm_offset_t *)&mbutl, &maxaddr,
+ VM_MBUF_SIZE, FALSE, FALSE, NULL);
+#else
mb_map = kmem_suballoc(kernel_map, (vm_offset_t *)&mbutl, &maxaddr,
VM_MBUF_SIZE, FALSE);
+#endif
/*
* Initialize callouts.
@@ -521,8 +600,13 @@ cpu_startup()
for (i = 1; i < ncallout; i++)
callout[i - 1].c_next = &callout[i];
+#if defined(UVM)
+ printf("avail memory = %d (%dK bytes)\n",
+ ptoa(uvmexp.free), ptoa(uvmexp.free) / 1024);
+#else
printf("avail memory = %d (%dK bytes)\n",
ptoa(cnt.v_free_count), ptoa(cnt.v_free_count) / 1024);
+#endif
printf("using %d buffers containing %d bytes of memory\n",
nbuf, bufpages * CLBYTES);
@@ -589,7 +673,9 @@ allocsys(v)
if (nswbuf > 256)
nswbuf = 256;
}
+#if !defined(UVM)
valloc(swbuf, struct buf, nswbuf);
+#endif
valloc(buf, struct buf, nbuf);
return v;
diff --git a/sys/arch/bebox/conf/GENERIC b/sys/arch/bebox/conf/GENERIC
index 086d08a7341..675f54eafd0 100644
--- a/sys/arch/bebox/conf/GENERIC
+++ b/sys/arch/bebox/conf/GENERIC
@@ -1,4 +1,4 @@
-# $NetBSD: GENERIC,v 1.10 1998/05/28 08:44:59 sakamoto Exp $
+# $NetBSD: GENERIC,v 1.11 1998/06/09 05:41:20 sakamoto Exp $
#
# First try for BEBOX config file
#
@@ -7,6 +7,8 @@ include "arch/bebox/conf/std.bebox"
maxusers 32
+#options UVM
+
#options IPKDBUSERHACK # Allow access to mapped memory via kgdb
#options DEBUG_BY_TOOLS # Allow debugging from toolsnet
# HMAC key to be used for debugging sessions
diff --git a/sys/arch/bebox/include/vmparam.h b/sys/arch/bebox/include/vmparam.h
index 258bf2f2505..32e9f268887 100644
--- a/sys/arch/bebox/include/vmparam.h
+++ b/sys/arch/bebox/include/vmparam.h
@@ -1,4 +1,4 @@
-/* $NetBSD: vmparam.h,v 1.3 1998/02/18 11:11:24 mycroft Exp $ */
+/* $NetBSD: vmparam.h,v 1.4 1998/06/09 05:41:19 sakamoto Exp $ */
/*-
* Copyright (C) 1995, 1996 Wolfgang Solfrank.
@@ -31,6 +31,9 @@
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
+#ifndef _MACHINE_VMPARAM_H_
+#define _MACHINE_VMPARAM_H_
+
#define USRTEXT CLBYTES
#define USRSTACK VM_MAXUSER_ADDRESS
@@ -84,12 +87,21 @@
#define VM_MAXUSER_ADDRESS ((vm_offset_t)0xfffff000)
#define VM_MAX_ADDRESS VM_MAXUSER_ADDRESS
#define VM_MIN_KERNEL_ADDRESS ((vm_offset_t)(KERNEL_SR << ADDR_SR_SHFT))
+#define VM_MAX_KERNEL_ADDRESS (VM_MIN_KERNEL_ADDRESS + SEGMENT_LENGTH - 1)
#define VM_KMEM_SIZE (NKMEMCLUSTERS * CLBYTES)
#define VM_MBUF_SIZE (NMBCLUSTERS * CLBYTES)
#define VM_PHYS_SIZE (USRIOSIZE * CLBYTES)
-/*
- * MACHINE_NONCONTIG is necessary for NetBSD/powerpc.
- */
-#define MACHINE_NONCONTIG
+#define MACHINE_NEW_NONCONTIG
+
+struct pmap_physseg {
+ struct pv_entry *pvent;
+ char *attrs;
+};
+
+#define VM_PHYSSEG_MAX 32
+#define VM_PHYSSEG_STRAT VM_PSTRAT_BSEARCH
+#define VM_PHYSSEG_NOADD /* can't add RAM after vm_mem_init */
+
+#endif /* _MACHINE_VMPARAM_H_ */