Sun Microsystems, Inc.
spacer | | |  
black dot
A   B   C   D   E   F   G   H   I   J   K   L   M   N   O   P   Q   R   S   T   U   V   W   X   Y   Z
Driver Entry Pointsmapdev_access(9E)


 mapdev_access - device mapping access entry point


#include <sys/sunddi.h>
int prefixmapdev_access(ddi_mapdev_handle_t handle, void *devprivate, off_t offset);



Solaris DDI specific (Solaris DDI).


An opaque pointer to a device mapping.
Driver private mapping data from ddi_mapdev(9F).
The offset within device memory at which the access occurred.



Future releases of Solaris will provide this function for binary and source compatibility. However, for increased functionality, use devmap_access(9E) or devmap_contextmgt(9E) instead. See devmap_access(9E) or devmap_contextmgt(9E) for details.

mapdev_access() is called when an access is made to a mapping that has either been newly created with ddi_mapdev(9F) or that has been enabled with a call to ddi_mapdev_intercept(9F).

mapdev_access() is passed the handle of the mapped object on which an access has occurred. This handle uniquely identifies the mapping and is used as an argument to ddi_mapdev_intercept(9F) or ddi_mapdev_nointercept(9F) to control whether or not future accesses to the mapping will cause mapdev_access() to be called. In general, mapdev_access() should call ddi_mapdev_intercept() on the mapping that is currently in use and then call ddi_mapdev_nointercept() on the mapping that generated this call to mapdev_access(). This will ensure that a call to mapdev_access() will be generated for the current mapping next time it is accessed.

mapdev_access() must at least call ddi_mapdev_nointercept() with offset passed in in order for the access to succeed. A request to allow accesses affects the entire page containing the offset.

Accesses to portions of mappings that have been disabled by a call to ddi_mapdev_nointercept() will not generate a call to mapdev_access(). A subsequent call to ddi_mapdev_intercept() will enable mapdev_access() to be called again.

A non-zero return value from mapdev_access() will cause the corresponding operation to fail. The failure may result in a SIGSEGV or SIGBUS signal being delivered to the process.



mapdev_access() should return 0 on success, -1 if there was a hardware error, or the return value from ddi_mapdev_intercept() or ddi_mapdev_nointercept().



This function is called from user context only.


 Example 1. Managing a One Page Device Context

The following shows an example of managing a device context that is one page in length.
ddi_mapdev_handle_t cur_hdl;
static int
xxmapdev_access(ddi_mapdev_handle_t handle, void *devprivate,
    off_t offset)
	          int	err;
	          /* enable calls to mapdev_access for the current mapping */
  	       if (cur_hdl != NULL) {
		               if ((err = ddi_mapdev_intercept(cur_hdl, off, 0)) != 0)
			                       return (err);
	          /* Switch device context - device dependent*/
          /* Make handle the new current mapping */
	          cur_hdl = handle;

	           * Disable callbacks and complete the access for the
	           * mapping that generated this callback.
           return (ddi_mapdev_nointercept(handle, off, 0));



mmap(2), mapdev_dup(9E), mapdev_free(9E), segmap(9E), ddi_mapdev(9F), ddi_mapdev_intercept(9F), ddi_mapdev_nointercept(9F), ddi_mapdev_ctl(9S)

Writing Device Drivers

SunOS 5.9Go To TopLast Changed 17 Jan 1997

Copyright 2002 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms.