1132956Smarkm/*- 2132956Smarkm * Copyright (c) 2004 Mark R V Murray 3132956Smarkm * All rights reserved. 4132956Smarkm * 5132956Smarkm * Redistribution and use in source and binary forms, with or without 6132956Smarkm * modification, are permitted provided that the following conditions 7132956Smarkm * are met: 8132956Smarkm * 1. Redistributions of source code must retain the above copyright 9132956Smarkm * notice, this list of conditions and the following disclaimer 10132956Smarkm * in this position and unchanged. 11132956Smarkm * 2. Redistributions in binary form must reproduce the above copyright 12132956Smarkm * notice, this list of conditions and the following disclaimer in the 13132956Smarkm * documentation and/or other materials provided with the distribution. 14132956Smarkm * 15132956Smarkm * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR 16132956Smarkm * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 17132956Smarkm * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 18132956Smarkm * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 19132956Smarkm * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 20132956Smarkm * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 21132956Smarkm * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 22132956Smarkm * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23132956Smarkm * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 24132956Smarkm * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25132956Smarkm * 26132956Smarkm */ 27132956Smarkm 28132956Smarkm#include <sys/cdefs.h> 29132956Smarkm__FBSDID("$FreeBSD: releng/10.3/sys/dev/mem/memdev.c 278746 2015-02-14 08:44:12Z kib $"); 30132956Smarkm 31132956Smarkm#include <sys/param.h> 32132956Smarkm#include <sys/conf.h> 33132956Smarkm#include <sys/fcntl.h> 34132956Smarkm#include <sys/kernel.h> 35132956Smarkm#include <sys/lock.h> 36132956Smarkm#include <sys/malloc.h> 37217515Sjkim#include <sys/memrange.h> 38132956Smarkm#include <sys/module.h> 39132956Smarkm#include <sys/mutex.h> 40252841Sjamie#include <sys/priv.h> 41132956Smarkm#include <sys/proc.h> 42132956Smarkm#include <sys/signalvar.h> 43132956Smarkm#include <sys/systm.h> 44132956Smarkm#include <sys/uio.h> 45132956Smarkm 46132956Smarkm#include <vm/vm.h> 47132956Smarkm#include <vm/pmap.h> 48132956Smarkm 49132956Smarkm#include <machine/memdev.h> 50132956Smarkm 51132956Smarkmstatic struct cdev *memdev, *kmemdev; 52132956Smarkm 53132956Smarkmstatic struct cdevsw mem_cdevsw = { 54132956Smarkm .d_version = D_VERSION, 55278746Skib .d_flags = D_MEM, 56132956Smarkm .d_open = memopen, 57132956Smarkm .d_read = memrw, 58132956Smarkm .d_write = memrw, 59132956Smarkm .d_ioctl = memioctl, 60132956Smarkm .d_mmap = memmmap, 61132956Smarkm .d_name = "mem", 62132956Smarkm}; 63132956Smarkm 64132956Smarkm/* ARGSUSED */ 65132956Smarkmint 66132956Smarkmmemopen(struct cdev *dev __unused, int flags, int fmt __unused, 67132956Smarkm struct thread *td) 68132956Smarkm{ 69132956Smarkm int error = 0; 70132956Smarkm 71252841Sjamie if (flags & FREAD) 72252841Sjamie error = priv_check(td, PRIV_KMEM_READ); 73252841Sjamie if (flags & FWRITE) { 74252841Sjamie if (error == 0) 75252841Sjamie error = priv_check(td, PRIV_KMEM_WRITE); 76252841Sjamie if (error == 0) 77252841Sjamie error = securelevel_gt(td->td_ucred, 0); 78252841Sjamie } 79132956Smarkm 80132956Smarkm return (error); 81132956Smarkm} 82132956Smarkm 83132956Smarkm/* ARGSUSED */ 84132956Smarkmstatic int 85132956Smarkmmem_modevent(module_t mod __unused, int type, void *data __unused) 86132956Smarkm{ 87132956Smarkm switch(type) { 88132956Smarkm case MOD_LOAD: 89132956Smarkm if (bootverbose) 90132956Smarkm printf("mem: <memory>\n"); 91217515Sjkim mem_range_init(); 92132956Smarkm memdev = make_dev(&mem_cdevsw, CDEV_MINOR_MEM, 93132956Smarkm UID_ROOT, GID_KMEM, 0640, "mem"); 94132956Smarkm kmemdev = make_dev(&mem_cdevsw, CDEV_MINOR_KMEM, 95132956Smarkm UID_ROOT, GID_KMEM, 0640, "kmem"); 96132956Smarkm break; 97132956Smarkm 98132956Smarkm case MOD_UNLOAD: 99217515Sjkim mem_range_destroy(); 100132956Smarkm destroy_dev(memdev); 101132956Smarkm destroy_dev(kmemdev); 102132956Smarkm break; 103132956Smarkm 104132956Smarkm case MOD_SHUTDOWN: 105132956Smarkm break; 106132956Smarkm 107132956Smarkm default: 108132956Smarkm return(EOPNOTSUPP); 109132956Smarkm 110132956Smarkm } 111132956Smarkm 112132956Smarkm return (0); 113132956Smarkm} 114132956Smarkm 115132956SmarkmDEV_MODULE(mem, mem_modevent, NULL); 116133036SmarkmMODULE_VERSION(mem, 1); 117