mem.c (12662) | mem.c (12675) |
---|---|
1/*- 2 * Copyright (c) 1988 University of Utah. 3 * Copyright (c) 1982, 1986, 1990 The Regents of the University of California. 4 * All rights reserved. 5 * 6 * This code is derived from software contributed to Berkeley by 7 * the Systems Programming Group of the University of Utah Computer 8 * Science Department, and code derived from software contributed to --- 24 unchanged lines hidden (view full) --- 33 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 34 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 35 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 36 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 37 * SUCH DAMAGE. 38 * 39 * from: Utah $Hdr: mem.c 1.13 89/10/08$ 40 * from: @(#)mem.c 7.2 (Berkeley) 5/9/91 | 1/*- 2 * Copyright (c) 1988 University of Utah. 3 * Copyright (c) 1982, 1986, 1990 The Regents of the University of California. 4 * All rights reserved. 5 * 6 * This code is derived from software contributed to Berkeley by 7 * the Systems Programming Group of the University of Utah Computer 8 * Science Department, and code derived from software contributed to --- 24 unchanged lines hidden (view full) --- 33 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 34 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 35 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 36 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 37 * SUCH DAMAGE. 38 * 39 * from: Utah $Hdr: mem.c 1.13 89/10/08$ 40 * from: @(#)mem.c 7.2 (Berkeley) 5/9/91 |
41 * $Id: mem.c,v 1.21 1995/11/29 14:39:26 julian Exp $ | 41 * $Id: mem.c,v 1.22 1995/12/07 12:45:34 davidg Exp $ |
42 */ 43 44/* 45 * Memory special file 46 */ 47 48#include <sys/param.h> 49#include <sys/conf.h> 50#include <sys/buf.h> | 42 */ 43 44/* 45 * Memory special file 46 */ 47 48#include <sys/param.h> 49#include <sys/conf.h> 50#include <sys/buf.h> |
51#ifdef DEVFS 52#include <sys/devfsext.h> 53#endif /* DEVFS */ 54#include <sys/kernel.h> |
|
51#include <sys/systm.h> 52#include <sys/uio.h> 53#include <sys/malloc.h> 54#include <sys/proc.h> 55 56#include <machine/cpu.h> 57#include <machine/random.h> 58#include <machine/psl.h> 59 60#include <vm/vm.h> 61#include <vm/vm_param.h> 62#include <vm/lock.h> 63#include <vm/vm_prot.h> 64#include <vm/pmap.h> 65#include <vm/vm_extern.h> 66 | 55#include <sys/systm.h> 56#include <sys/uio.h> 57#include <sys/malloc.h> 58#include <sys/proc.h> 59 60#include <machine/cpu.h> 61#include <machine/random.h> 62#include <machine/psl.h> 63 64#include <vm/vm.h> 65#include <vm/vm_param.h> 66#include <vm/lock.h> 67#include <vm/vm_prot.h> 68#include <vm/pmap.h> 69#include <vm/vm_extern.h> 70 |
67#ifdef JREMOD 68#include <sys/kernel.h> | 71 72 73static d_open_t mmopen; 74static d_close_t mmclose; 75static d_rdwr_t mmrw; 76static d_ioctl_t mmioctl; 77static d_mmap_t memmmap; 78 |
69#define CDEV_MAJOR 2 | 79#define CDEV_MAJOR 2 |
70#endif /*JREMOD*/ | 80struct cdevsw mem_cdevsw = 81 { mmopen, mmclose, mmrw, mmrw, /*2*/ 82 mmioctl, nullstop, nullreset, nodevtotty,/* memory */ 83 seltrue, memmmap, NULL, "mem", NULL, -1 }; |
71 72#ifdef DEVFS | 84 85#ifdef DEVFS |
73#include <sys/devfsext.h> | 86static void *mem_devfs_token; 87static void *kmem_devfs_token; 88static void *null_devfs_token; 89static void *random_devfs_token; 90static void *urandom_devfs_token; 91static void *zero_devfs_token; 92static void *io_devfs_token; |
74 | 93 |
75static void 76memdevfs_init(dev_t dev) | 94static void 95memdevfs_init() |
77{ | 96{ |
78 void * x; 79 int maj = major(dev); 80/* path name major minor type uid gid perm*/ 81 x=devfs_add_devsw("/misc", "mem", maj, 0, DV_CHR, 0, 2, 0640); 82 x=devfs_add_devsw("/misc", "kmem", maj, 1, DV_CHR, 0, 2, 0640); 83 x=devfs_add_devsw("/misc", "null", maj, 2, DV_CHR, 0, 0, 0666); 84 x=devfs_add_devsw("/misc", "random", maj, 3, DV_CHR, 0, 0, 0666); 85 x=devfs_add_devsw("/misc", "urandom", maj, 4, DV_CHR, 0, 0, 0666); 86 x=devfs_add_devsw("/misc", "zero", maj, 12, DV_CHR, 0, 0, 0666); 87 x=devfs_add_devsw("/misc", "io", maj, 14, DV_CHR, 0, 2, 0640); | 97/* path name cdevsw minor type uid gid perm*/ 98 mem_devfs_token = devfs_add_devsw( 99 "/", "mem", &mem_cdevsw, 0, DV_CHR, 0, 2, 0640); 100 kmem_devfs_token = devfs_add_devsw( 101 "/", "kmem", &mem_cdevsw, 1, DV_CHR, 0, 2, 0640); 102 null_devfs_token = devfs_add_devsw( 103 "/", "null", &mem_cdevsw, 2, DV_CHR, 0, 0, 0666); 104 random_devfs_token = devfs_add_devsw( 105 "/", "random", &mem_cdevsw, 3, DV_CHR, 0, 0, 0666); 106 urandom_devfs_token = devfs_add_devsw( 107 "/", "urandom", &mem_cdevsw, 4, DV_CHR, 0, 0, 0666); 108 zero_devfs_token = devfs_add_devsw( 109 "/", "zero", &mem_cdevsw, 12, DV_CHR, 0, 0, 0666); 110 io_devfs_token = devfs_add_devsw( 111 "/", "io", &mem_cdevsw, 14, DV_CHR, 0, 2, 0640); |
88} 89#endif /* DEVFS */ 90 91extern char *ptvmmap; /* poor name! */ 92 | 112} 113#endif /* DEVFS */ 114 115extern char *ptvmmap; /* poor name! */ 116 |
93int | 117static int |
94mmclose(dev, flags, fmt, p) 95 dev_t dev; 96 int flags; 97 int fmt; 98 struct proc *p; 99{ 100 struct trapframe *fp; 101 102 switch (minor(dev)) { 103 case 14: 104 fp = (struct trapframe *)curproc->p_md.md_regs; 105 fp->tf_eflags &= ~PSL_IOPL; 106 break; 107 default: 108 break; 109 } 110 return(0); 111} 112 | 118mmclose(dev, flags, fmt, p) 119 dev_t dev; 120 int flags; 121 int fmt; 122 struct proc *p; 123{ 124 struct trapframe *fp; 125 126 switch (minor(dev)) { 127 case 14: 128 fp = (struct trapframe *)curproc->p_md.md_regs; 129 fp->tf_eflags &= ~PSL_IOPL; 130 break; 131 default: 132 break; 133 } 134 return(0); 135} 136 |
113int | 137static int |
114mmopen(dev, flags, fmt, p) 115 dev_t dev; 116 int flags; 117 int fmt; 118 struct proc *p; 119{ 120 struct trapframe *fp; 121 122 switch (minor(dev)) { 123 case 14: 124 fp = (struct trapframe *)curproc->p_md.md_regs; 125 fp->tf_eflags |= PSL_IOPL; 126 break; 127 default: 128 break; 129 } 130 return(0); 131} 132 | 138mmopen(dev, flags, fmt, p) 139 dev_t dev; 140 int flags; 141 int fmt; 142 struct proc *p; 143{ 144 struct trapframe *fp; 145 146 switch (minor(dev)) { 147 case 14: 148 fp = (struct trapframe *)curproc->p_md.md_regs; 149 fp->tf_eflags |= PSL_IOPL; 150 break; 151 default: 152 break; 153 } 154 return(0); 155} 156 |
133int | 157static int |
134mmrw(dev, uio, flags) 135 dev_t dev; 136 struct uio *uio; 137 int flags; 138{ 139 register int o; 140 register u_int c, v; 141 u_int poolsize; --- 170 unchanged lines hidden (view full) --- 312 313 314 315 316/*******************************************************\ 317* allow user processes to MMAP some memory sections * 318* instead of going through read/write * 319\*******************************************************/ | 158mmrw(dev, uio, flags) 159 dev_t dev; 160 struct uio *uio; 161 int flags; 162{ 163 register int o; 164 register u_int c, v; 165 u_int poolsize; --- 170 unchanged lines hidden (view full) --- 336 337 338 339 340/*******************************************************\ 341* allow user processes to MMAP some memory sections * 342* instead of going through read/write * 343\*******************************************************/ |
320int memmmap(dev_t dev, int offset, int nprot) | 344static int 345memmmap(dev_t dev, int offset, int nprot) |
321{ 322 switch (minor(dev)) 323 { 324 325/* minor device 0 is physical memory */ 326 case 0: 327 return i386_btop(offset); 328 --- 5 unchanged lines hidden (view full) --- 334 return -1; 335 } 336} 337 338/* 339 * Allow userland to select which interrupts will be used in the muck 340 * gathering business. 341 */ | 346{ 347 switch (minor(dev)) 348 { 349 350/* minor device 0 is physical memory */ 351 case 0: 352 return i386_btop(offset); 353 --- 5 unchanged lines hidden (view full) --- 359 return -1; 360 } 361} 362 363/* 364 * Allow userland to select which interrupts will be used in the muck 365 * gathering business. 366 */ |
342int | 367static int |
343mmioctl(dev, cmd, cmdarg, flags, p) 344 dev_t dev; 345 int cmd; 346 caddr_t cmdarg; 347 int flags; 348 struct proc *p; 349{ 350 int error; --- 27 unchanged lines hidden (view full) --- 378 default: 379 return (ENOTTY); 380 } 381 return (0); 382} 383 384 385 | 368mmioctl(dev, cmd, cmdarg, flags, p) 369 dev_t dev; 370 int cmd; 371 caddr_t cmdarg; 372 int flags; 373 struct proc *p; 374{ 375 int error; --- 27 unchanged lines hidden (view full) --- 403 default: 404 return (ENOTTY); 405 } 406 return (0); 407} 408 409 410 |
386#ifdef JREMOD 387struct cdevsw mem_cdevsw = 388 { mmopen, mmclose, mmrw, mmrw, /*2*/ 389 mmioctl, nullstop, nullreset, nodevtotty,/* memory */ 390 seltrue, memmmap, NULL }; 391 | |
392static mem_devsw_installed = 0; 393 | 411static mem_devsw_installed = 0; 412 |
394static void mem_drvinit(void *unused) | 413static void 414mem_drvinit(void *unused) |
395{ 396 dev_t dev; 397 398 if( ! mem_devsw_installed ) { | 415{ 416 dev_t dev; 417 418 if( ! mem_devsw_installed ) { |
399 dev = makedev(CDEV_MAJOR,0); 400 cdevsw_add(&dev,&mem_cdevsw,NULL); | 419 dev = makedev(CDEV_MAJOR, 0); 420 cdevsw_add(&dev,&mem_cdevsw, NULL); |
401 mem_devsw_installed = 1; 402#ifdef DEVFS | 421 mem_devsw_installed = 1; 422#ifdef DEVFS |
403 memdevfs_init(dev); | 423 memdevfs_init(); |
404#endif 405 } 406} 407 408SYSINIT(memdev,SI_SUB_DRIVERS,SI_ORDER_MIDDLE+CDEV_MAJOR,mem_drvinit,NULL) 409 | 424#endif 425 } 426} 427 428SYSINIT(memdev,SI_SUB_DRIVERS,SI_ORDER_MIDDLE+CDEV_MAJOR,mem_drvinit,NULL) 429 |
410#endif /* JREMOD */ 411 | |