vm_mmap.c (210548) | vm_mmap.c (210923) |
---|---|
1/*- 2 * Copyright (c) 1988 University of Utah. 3 * Copyright (c) 1991, 1993 4 * The Regents of the University of California. 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. --- 27 unchanged lines hidden (view full) --- 36 * @(#)vm_mmap.c 8.4 (Berkeley) 1/12/94 37 */ 38 39/* 40 * Mapped file (mmap) interface to VM 41 */ 42 43#include <sys/cdefs.h> | 1/*- 2 * Copyright (c) 1988 University of Utah. 3 * Copyright (c) 1991, 1993 4 * The Regents of the University of California. 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. --- 27 unchanged lines hidden (view full) --- 36 * @(#)vm_mmap.c 8.4 (Berkeley) 1/12/94 37 */ 38 39/* 40 * Mapped file (mmap) interface to VM 41 */ 42 43#include <sys/cdefs.h> |
44__FBSDID("$FreeBSD: head/sys/vm/vm_mmap.c 210548 2010-07-27 19:26:18Z trasz $"); | 44__FBSDID("$FreeBSD: head/sys/vm/vm_mmap.c 210923 2010-08-06 09:42:15Z kib $"); |
45 46#include "opt_compat.h" 47#include "opt_hwpmc_hooks.h" 48 49#include <sys/param.h> 50#include <sys/systm.h> 51#include <sys/kernel.h> 52#include <sys/lock.h> --- 1234 unchanged lines hidden (view full) --- 1287 */ 1288int 1289vm_mmap_cdev(struct thread *td, vm_size_t objsize, 1290 vm_prot_t prot, vm_prot_t *maxprotp, int *flagsp, 1291 struct cdev *cdev, vm_ooffset_t *foff, vm_object_t *objp) 1292{ 1293 vm_object_t obj; 1294 struct cdevsw *dsw; | 45 46#include "opt_compat.h" 47#include "opt_hwpmc_hooks.h" 48 49#include <sys/param.h> 50#include <sys/systm.h> 51#include <sys/kernel.h> 52#include <sys/lock.h> --- 1234 unchanged lines hidden (view full) --- 1287 */ 1288int 1289vm_mmap_cdev(struct thread *td, vm_size_t objsize, 1290 vm_prot_t prot, vm_prot_t *maxprotp, int *flagsp, 1291 struct cdev *cdev, vm_ooffset_t *foff, vm_object_t *objp) 1292{ 1293 vm_object_t obj; 1294 struct cdevsw *dsw; |
1295 int error, flags; | 1295 int error, flags, ref; |
1296 1297 flags = *flagsp; 1298 | 1296 1297 flags = *flagsp; 1298 |
1299 dsw = dev_refthread(cdev); | 1299 dsw = dev_refthread(cdev, &ref); |
1300 if (dsw == NULL) 1301 return (ENXIO); 1302 if (dsw->d_flags & D_MMAP_ANON) { | 1300 if (dsw == NULL) 1301 return (ENXIO); 1302 if (dsw->d_flags & D_MMAP_ANON) { |
1303 dev_relthread(cdev); | 1303 dev_relthread(cdev, ref); |
1304 *maxprotp = VM_PROT_ALL; 1305 *flagsp |= MAP_ANON; 1306 return (0); 1307 } 1308 /* 1309 * cdevs do not provide private mappings of any kind. 1310 */ 1311 if ((*maxprotp & VM_PROT_WRITE) == 0 && 1312 (prot & PROT_WRITE) != 0) { | 1304 *maxprotp = VM_PROT_ALL; 1305 *flagsp |= MAP_ANON; 1306 return (0); 1307 } 1308 /* 1309 * cdevs do not provide private mappings of any kind. 1310 */ 1311 if ((*maxprotp & VM_PROT_WRITE) == 0 && 1312 (prot & PROT_WRITE) != 0) { |
1313 dev_relthread(cdev); | 1313 dev_relthread(cdev, ref); |
1314 return (EACCES); 1315 } 1316 if (flags & (MAP_PRIVATE|MAP_COPY)) { | 1314 return (EACCES); 1315 } 1316 if (flags & (MAP_PRIVATE|MAP_COPY)) { |
1317 dev_relthread(cdev); | 1317 dev_relthread(cdev, ref); |
1318 return (EINVAL); 1319 } 1320 /* 1321 * Force device mappings to be shared. 1322 */ 1323 flags |= MAP_SHARED; 1324#ifdef MAC_XXX 1325 error = mac_cdev_check_mmap(td->td_ucred, cdev, prot); 1326 if (error != 0) { | 1318 return (EINVAL); 1319 } 1320 /* 1321 * Force device mappings to be shared. 1322 */ 1323 flags |= MAP_SHARED; 1324#ifdef MAC_XXX 1325 error = mac_cdev_check_mmap(td->td_ucred, cdev, prot); 1326 if (error != 0) { |
1327 dev_relthread(cdev); | 1327 dev_relthread(cdev, ref); |
1328 return (error); 1329 } 1330#endif 1331 /* 1332 * First, try d_mmap_single(). If that is not implemented 1333 * (returns ENODEV), fall back to using the device pager. 1334 * Note that d_mmap_single() must return a reference to the 1335 * object (it needs to bump the reference count of the object 1336 * it returns somehow). 1337 * 1338 * XXX assumes VM_PROT_* == PROT_* 1339 */ 1340 error = dsw->d_mmap_single(cdev, foff, objsize, objp, (int)prot); | 1328 return (error); 1329 } 1330#endif 1331 /* 1332 * First, try d_mmap_single(). If that is not implemented 1333 * (returns ENODEV), fall back to using the device pager. 1334 * Note that d_mmap_single() must return a reference to the 1335 * object (it needs to bump the reference count of the object 1336 * it returns somehow). 1337 * 1338 * XXX assumes VM_PROT_* == PROT_* 1339 */ 1340 error = dsw->d_mmap_single(cdev, foff, objsize, objp, (int)prot); |
1341 dev_relthread(cdev); | 1341 dev_relthread(cdev, ref); |
1342 if (error != ENODEV) 1343 return (error); 1344 obj = vm_pager_allocate(OBJT_DEVICE, cdev, objsize, prot, *foff, 1345 td->td_ucred); 1346 if (obj == NULL) 1347 return (EINVAL); 1348 *objp = obj; 1349 *flagsp = flags; --- 178 unchanged lines hidden --- | 1342 if (error != ENODEV) 1343 return (error); 1344 obj = vm_pager_allocate(OBJT_DEVICE, cdev, objsize, prot, *foff, 1345 td->td_ucred); 1346 if (obj == NULL) 1347 return (EINVAL); 1348 *objp = obj; 1349 *flagsp = flags; --- 178 unchanged lines hidden --- |