18ab2f5ecSMark Murray /*- 28ab2f5ecSMark Murray * Copyright (c) 2004 Mark R V Murray 38ab2f5ecSMark Murray * All rights reserved. 48ab2f5ecSMark Murray * 58ab2f5ecSMark Murray * Redistribution and use in source and binary forms, with or without 68ab2f5ecSMark Murray * modification, are permitted provided that the following conditions 78ab2f5ecSMark Murray * are met: 88ab2f5ecSMark Murray * 1. Redistributions of source code must retain the above copyright 98ab2f5ecSMark Murray * notice, this list of conditions and the following disclaimer 108ab2f5ecSMark Murray * in this position and unchanged. 118ab2f5ecSMark Murray * 2. Redistributions in binary form must reproduce the above copyright 128ab2f5ecSMark Murray * notice, this list of conditions and the following disclaimer in the 138ab2f5ecSMark Murray * documentation and/or other materials provided with the distribution. 148ab2f5ecSMark Murray * 158ab2f5ecSMark Murray * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR 168ab2f5ecSMark Murray * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 178ab2f5ecSMark Murray * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 188ab2f5ecSMark Murray * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 198ab2f5ecSMark Murray * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 208ab2f5ecSMark Murray * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 218ab2f5ecSMark Murray * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 228ab2f5ecSMark Murray * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 238ab2f5ecSMark Murray * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 248ab2f5ecSMark Murray * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 258ab2f5ecSMark Murray * 268ab2f5ecSMark Murray */ 278ab2f5ecSMark Murray 288ab2f5ecSMark Murray #include <sys/cdefs.h> 298ab2f5ecSMark Murray __FBSDID("$FreeBSD$"); 308ab2f5ecSMark Murray 318ab2f5ecSMark Murray #include <sys/param.h> 328ab2f5ecSMark Murray #include <sys/conf.h> 338ab2f5ecSMark Murray #include <sys/fcntl.h> 348ab2f5ecSMark Murray #include <sys/kernel.h> 358ab2f5ecSMark Murray #include <sys/lock.h> 368ab2f5ecSMark Murray #include <sys/malloc.h> 378ab2f5ecSMark Murray #include <sys/memrange.h> 388ab2f5ecSMark Murray #include <sys/module.h> 398ab2f5ecSMark Murray #include <sys/mutex.h> 408ab2f5ecSMark Murray #include <sys/proc.h> 418ab2f5ecSMark Murray #include <sys/signalvar.h> 428ab2f5ecSMark Murray #include <sys/systm.h> 438ab2f5ecSMark Murray #include <sys/uio.h> 448ab2f5ecSMark Murray 458ab2f5ecSMark Murray #include <vm/vm.h> 468ab2f5ecSMark Murray #include <vm/pmap.h> 478ab2f5ecSMark Murray 488ab2f5ecSMark Murray #include <machine/memdev.h> 498ab2f5ecSMark Murray 508ab2f5ecSMark Murray static struct cdev *memdev, *kmemdev; 518ab2f5ecSMark Murray 528ab2f5ecSMark Murray static struct cdevsw mem_cdevsw = { 538ab2f5ecSMark Murray .d_version = D_VERSION, 548ab2f5ecSMark Murray .d_flags = D_MEM|D_NEEDGIANT, 558ab2f5ecSMark Murray .d_open = memopen, 568ab2f5ecSMark Murray .d_read = memrw, 578ab2f5ecSMark Murray .d_write = memrw, 588ab2f5ecSMark Murray .d_ioctl = memioctl, 598ab2f5ecSMark Murray .d_mmap = memmmap, 608ab2f5ecSMark Murray .d_name = "mem", 618ab2f5ecSMark Murray }; 628ab2f5ecSMark Murray 638ab2f5ecSMark Murray /* ARGSUSED */ 648ab2f5ecSMark Murray int 658ab2f5ecSMark Murray memopen(struct cdev *dev __unused, int flags, int fmt __unused, 668ab2f5ecSMark Murray struct thread *td) 678ab2f5ecSMark Murray { 688ab2f5ecSMark Murray int error = 0; 698ab2f5ecSMark Murray 708ab2f5ecSMark Murray if (flags & FWRITE) 718ab2f5ecSMark Murray error = securelevel_gt(td->td_ucred, 0); 728ab2f5ecSMark Murray 738ab2f5ecSMark Murray return (error); 748ab2f5ecSMark Murray } 758ab2f5ecSMark Murray 768ab2f5ecSMark Murray /* ARGSUSED */ 778ab2f5ecSMark Murray static int 788ab2f5ecSMark Murray mem_modevent(module_t mod __unused, int type, void *data __unused) 798ab2f5ecSMark Murray { 808ab2f5ecSMark Murray switch(type) { 818ab2f5ecSMark Murray case MOD_LOAD: 828ab2f5ecSMark Murray if (bootverbose) 838ab2f5ecSMark Murray printf("mem: <memory>\n"); 848ab2f5ecSMark Murray dev_mem_md_init(); /* Machine dependant bit */ 858ab2f5ecSMark Murray memdev = make_dev(&mem_cdevsw, CDEV_MINOR_MEM, 868ab2f5ecSMark Murray UID_ROOT, GID_KMEM, 0640, "mem"); 878ab2f5ecSMark Murray kmemdev = make_dev(&mem_cdevsw, CDEV_MINOR_KMEM, 888ab2f5ecSMark Murray UID_ROOT, GID_KMEM, 0640, "kmem"); 898ab2f5ecSMark Murray break; 908ab2f5ecSMark Murray 918ab2f5ecSMark Murray case MOD_UNLOAD: 928ab2f5ecSMark Murray destroy_dev(memdev); 938ab2f5ecSMark Murray destroy_dev(kmemdev); 948ab2f5ecSMark Murray break; 958ab2f5ecSMark Murray 968ab2f5ecSMark Murray case MOD_SHUTDOWN: 978ab2f5ecSMark Murray break; 988ab2f5ecSMark Murray 998ab2f5ecSMark Murray default: 1008ab2f5ecSMark Murray return(EOPNOTSUPP); 1018ab2f5ecSMark Murray break; 1028ab2f5ecSMark Murray 1038ab2f5ecSMark Murray } 1048ab2f5ecSMark Murray 1058ab2f5ecSMark Murray return (0); 1068ab2f5ecSMark Murray } 1078ab2f5ecSMark Murray 1088ab2f5ecSMark Murray DEV_MODULE(mem, mem_modevent, NULL); 109ce46e205SMark Murray MODULE_VERSION(mem, 1); 110