diff options
| author | sakamoto <sakamoto@NetBSD.org> | 1998-06-09 05:41:19 +0000 |
|---|---|---|
| committer | sakamoto <sakamoto@NetBSD.org> | 1998-06-09 05:41:19 +0000 |
| commit | 040581ceeda19cfbd6cff7c12289dfcb8d137552 (patch) | |
| tree | 19a964a6cf9993d5c39adb5e1865b5dc24470e66 | |
| parent | a5550009e654db0b91245e088b661a89d37459b5 (diff) | |
Add UVM support.
| -rw-r--r-- | sys/arch/bebox/bebox/bus_dma.c | 48 | ||||
| -rw-r--r-- | sys/arch/bebox/bebox/extintr.c | 5 | ||||
| -rw-r--r-- | sys/arch/bebox/bebox/locore.s | 10 | ||||
| -rw-r--r-- | sys/arch/bebox/bebox/machdep.c | 90 | ||||
| -rw-r--r-- | sys/arch/bebox/conf/GENERIC | 4 | ||||
| -rw-r--r-- | sys/arch/bebox/include/vmparam.h | 22 |
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_ */ |
