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> 372fea6431SJung-uk Kim #include <sys/memrange.h> 388ab2f5ecSMark Murray #include <sys/module.h> 398ab2f5ecSMark Murray #include <sys/mutex.h> 40c71e3362SJamie Gritton #include <sys/priv.h> 418ab2f5ecSMark Murray #include <sys/proc.h> 428ab2f5ecSMark Murray #include <sys/signalvar.h> 438ab2f5ecSMark Murray #include <sys/systm.h> 448ab2f5ecSMark Murray #include <sys/uio.h> 458ab2f5ecSMark Murray 468ab2f5ecSMark Murray #include <vm/vm.h> 478ab2f5ecSMark Murray #include <vm/pmap.h> 488ab2f5ecSMark Murray 498ab2f5ecSMark Murray #include <machine/memdev.h> 508ab2f5ecSMark Murray 518ab2f5ecSMark Murray static struct cdev *memdev, *kmemdev; 528ab2f5ecSMark Murray 538ab2f5ecSMark Murray static struct cdevsw mem_cdevsw = { 548ab2f5ecSMark Murray .d_version = D_VERSION, 55*8f4548ffSKonstantin Belousov .d_flags = D_MEM, 568ab2f5ecSMark Murray .d_open = memopen, 578ab2f5ecSMark Murray .d_read = memrw, 588ab2f5ecSMark Murray .d_write = memrw, 598ab2f5ecSMark Murray .d_ioctl = memioctl, 608ab2f5ecSMark Murray .d_mmap = memmmap, 618ab2f5ecSMark Murray .d_name = "mem", 628ab2f5ecSMark Murray }; 638ab2f5ecSMark Murray 648ab2f5ecSMark Murray /* ARGSUSED */ 658ab2f5ecSMark Murray int 668ab2f5ecSMark Murray memopen(struct cdev *dev __unused, int flags, int fmt __unused, 678ab2f5ecSMark Murray struct thread *td) 688ab2f5ecSMark Murray { 698ab2f5ecSMark Murray int error = 0; 708ab2f5ecSMark Murray 71c71e3362SJamie Gritton if (flags & FREAD) 72c71e3362SJamie Gritton error = priv_check(td, PRIV_KMEM_READ); 73c71e3362SJamie Gritton if (flags & FWRITE) { 74c71e3362SJamie Gritton if (error == 0) 75c71e3362SJamie Gritton error = priv_check(td, PRIV_KMEM_WRITE); 76c71e3362SJamie Gritton if (error == 0) 778ab2f5ecSMark Murray error = securelevel_gt(td->td_ucred, 0); 78c71e3362SJamie Gritton } 798ab2f5ecSMark Murray 808ab2f5ecSMark Murray return (error); 818ab2f5ecSMark Murray } 828ab2f5ecSMark Murray 838ab2f5ecSMark Murray /* ARGSUSED */ 848ab2f5ecSMark Murray static int 858ab2f5ecSMark Murray mem_modevent(module_t mod __unused, int type, void *data __unused) 868ab2f5ecSMark Murray { 878ab2f5ecSMark Murray switch(type) { 888ab2f5ecSMark Murray case MOD_LOAD: 898ab2f5ecSMark Murray if (bootverbose) 908ab2f5ecSMark Murray printf("mem: <memory>\n"); 912fea6431SJung-uk Kim mem_range_init(); 928ab2f5ecSMark Murray memdev = make_dev(&mem_cdevsw, CDEV_MINOR_MEM, 938ab2f5ecSMark Murray UID_ROOT, GID_KMEM, 0640, "mem"); 948ab2f5ecSMark Murray kmemdev = make_dev(&mem_cdevsw, CDEV_MINOR_KMEM, 958ab2f5ecSMark Murray UID_ROOT, GID_KMEM, 0640, "kmem"); 968ab2f5ecSMark Murray break; 978ab2f5ecSMark Murray 988ab2f5ecSMark Murray case MOD_UNLOAD: 992fea6431SJung-uk Kim mem_range_destroy(); 1008ab2f5ecSMark Murray destroy_dev(memdev); 1018ab2f5ecSMark Murray destroy_dev(kmemdev); 1028ab2f5ecSMark Murray break; 1038ab2f5ecSMark Murray 1048ab2f5ecSMark Murray case MOD_SHUTDOWN: 1058ab2f5ecSMark Murray break; 1068ab2f5ecSMark Murray 1078ab2f5ecSMark Murray default: 1088ab2f5ecSMark Murray return(EOPNOTSUPP); 1098ab2f5ecSMark Murray 1108ab2f5ecSMark Murray } 1118ab2f5ecSMark Murray 1128ab2f5ecSMark Murray return (0); 1138ab2f5ecSMark Murray } 1148ab2f5ecSMark Murray 1158ab2f5ecSMark Murray DEV_MODULE(mem, mem_modevent, NULL); 116ce46e205SMark Murray MODULE_VERSION(mem, 1); 117