Deleted Added
full compact
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 ---