DEVMAP_ACCESS(9E) | Driver Entry Points | DEVMAP_ACCESS(9E) |
devmap_access - device mapping access entry point
#include <sys/ddi.h> #include <sys/sunddi.h> int prefixdevmap_access(devmap_cookie_t dhp, void *pvtp,
offset_t off, size_t len, uint_t type, uint_t rw);
illumos DDI specific (illumos DDI).
dhp
pvtp
off
len
type
DEVMAP_ACCESS
DEVMAP_LOCK
DEVMAP_UNLOCK
rw
DEVMAP_READ
DEVMAP_WRITE
DEVMAP_EXEC
The devmap_access() entry point is an optional routine. It notifies drivers whenever an access is made to a mapping described by dhp that has not been validated or does not have sufficient protection for the access. The system expects devmap_access() to call either devmap_do_ctxmgt(9F) or devmap_default_access(9F) to load the memory address translations before it returns. For mappings that support context switching, device drivers should call devmap_do_ctxmgt(9F). For mappings that do not support context switching, the drivers should call devmap_default_access(9F).
In devmap_access(), drivers perform memory access related operations such as context switching, checking the availability of the memory object, and locking and unlocking the memory object being accessed. The devmap_access() entry point is set to NULL if no operations need to be performed.
pvtp is a pointer to the driver's private mapping data that was allocated and initialized in the devmap_map(9E) entry point.
off and len define the range to be affected by the operations in devmap_access(). type defines the type of operation that device drivers should perform on the memory object. If type is either DEVMAP_LOCK or DEVMAP_UNLOCK, the length passed to either devmap_do_ctxmgt(9F) or devmap_default_access(9F) must be same as len. rw specifies the direction of access on the memory object.
A non-zero return value from devmap_access() may result in a SIGSEGV or SIGBUS signal being delivered to the process.
devmap_access() returns the following values:
0
Non-zero
Example 1 devmap_access() entry point
The following is an example of the devmap_access() entry point. If the mapping supports context switching, devmap_access() calls devmap_do_ctxmgt(9F). Otherwise, devmap_access() calls devmap_default_access(9F).
... #define OFF_DO_CTXMGT 0x40000000 #define OFF_NORMAL 0x40100000 #define CTXMGT_SIZE 0x100000 #define NORMAL_SIZE 0x100000 /*
* Driver devmap_contextmgt(9E) callback function.
*/ static int xx_context_mgt(devmap_cookie_t dhp, void *pvtp, offset_t offset,
size_t length, uint_t type, uint_t rw) {
......
/*
* see devmap_contextmgt(9E) for an example
*/ } /*
* Driver devmap_access(9E) entry point
*/ static int xxdevmap_access(devmap_cookie_t dhp, void *pvtp, offset_t off,
size_t len, uint_t type, uint_t rw) {
offset_t diff;
int err;
/*
* check if off is within the range that supports
* context management.
*/
if ((diff = off - OFF_DO_CTXMG) >= 0 && diff < CTXMGT_SIZE) {
/*
* calculates the length for context switching
*/
if ((len + off) > (OFF_DO_CTXMGT + CTXMGT_SIZE))
return (-1);
/*
* perform context switching
*/
err = devmap_do_ctxmgt(dhp, pvtp, off, len, type,
rw, xx_context_mgt);
/*
* check if off is within the range that does normal
* memory mapping.
*/
} else if ((diff = off - OFF_NORMAL) >= 0 && diff < NORMAL_SIZE) {
if ((len + off) > (OFF_NORMAL + NORMAL_SIZE))
return (-1);
err = devmap_default_access(dhp, pvtp, off, len, type, rw);
} else
return (-1);
return (err); }
devmap_map(9E), devmap_default_access(9F), devmap_do_ctxmgt(9F), devmap_callback_ctl(9S)
Writing Device Drivers
January 17, 1997 | OmniOS |