Hallo, dies ist ein Test.
PWD: /www/data-lst1/unixsoft/unixsoft/kaempfer/.public_html
Running in File Mode
Relative path: ./../../../../../../usr/man/man9e/devmap_contextmgt.9e
Real path: /usr/share/man/man9e/devmap_contextmgt.9e
Zurück
'\" te .\" Copyright (c) 1996, 1997, Oracle and/or its affiliates. All rights reserved. .TH devmap_contextmgt 9E "16 Jan 1997" "Oracle Solaris 11.4" "Driver Entry Points" .SH NAME devmap_contextmgt \- driver callback function for context management .SH SYNOPSIS .LP .nf #include <sys/ddi.h> #include <sys/sunddi.h> \fBint\fR \fBdevmap_contextmgt\fR(\fBdevmap_cookie_t\fR \fIdhp\fR, \fBvoid *\fR\fIpvtp\fR, \fBoffset_t\fR \fIoff\fR, \fBsize_t\fR \fIlen\fR, \fBuint_t\fR \fItype\fR, \fBuint_t\fR \fIrw\fR); .fi .SH INTERFACE LEVEL .sp .LP Solaris DDI specific (Solaris DDI). .SH ARGUMENTS .sp .ne 2 .mk .na \fB\fIdhp\fR \fR .ad .RS 8n .rt An opaque mapping handle that the system uses to describe the mapping. .RE .sp .ne 2 .mk .na \fB\fIpvtp\fR \fR .ad .RS 8n .rt Driver private mapping data. .RE .sp .ne 2 .mk .na \fB\fIoff\fR \fR .ad .RS 8n .rt User offset within the logical device memory at which the access begins. .RE .sp .ne 2 .mk .na \fB\fIlen\fR \fR .ad .RS 8n .rt Length (in bytes) of the memory being accessed. .RE .sp .ne 2 .mk .na \fB\fItype\fR \fR .ad .RS 8n .rt Type of access operation. Possible values are: .sp .ne 2 .mk .na \fB\fBDEVMAP_ACCESS\fR \fR .ad .RS 17n .rt Memory access. .RE .sp .ne 2 .mk .na \fB\fBDEVMAP_LOCK\fR \fR .ad .RS 17n .rt Lock the memory being accessed. .RE .sp .ne 2 .mk .na \fB\fBDEVMAP_UNLOCK\fR \fR .ad .RS 17n .rt Unlock the memory being accessed. .RE .RE .sp .ne 2 .mk .na \fB\fIrw\fR \fR .ad .RS 8n .rt Direction of access. Possible values are: .sp .ne 2 .mk .na \fB\fBDEVMAP_READ\fR \fR .ad .RS 16n .rt Read access attempted. .RE .sp .ne 2 .mk .na \fB\fBDEVMAP_WRITE\fR \fR .ad .RS 16n .rt Write access attempted. .RE .RE .SH DESCRIPTION .sp .LP \fBdevmap_contextmgt()\fR is a driver-supplied function that performs device context switching on a mapping. Device drivers pass \fBdevmap_contextmgt()\fR as an argument to \fBdevmap_do_ctxmgt\fR(9F) in the \fBdevmap_access\fR(9E) entry point. The system will call \fBdevmap_contextmgt()\fR when memory is accessed. The system expects \fBdevmap_contextmgt()\fR to load the memory address translations of the mapping by calling \fBdevmap_load\fR(9F) before returning. .sp .LP \fIdhp\fR uniquely identifies the mapping and is used as an argument to \fBdevmap_load\fR(9F) to validate the mapping. \fIoff\fR and \fIlen\fR define the range to be affected by the operations in \fBdevmap_contextmgt()\fR. .sp .LP The driver must check if there is already a mapping established at \fIoff\fR that needs to be unloaded. If a mapping exists at \fIoff\fR, \fBdevmap_contextmgt()\fR must call \fBdevmap_unload\fR(9F) on the current mapping. \fBdevmap_unload\fR(9F) must be followed by \fBdevmap_load()\fR on the mapping that generated this call to \fBdevmap_contextmgt()\fR. \fBdevmap_unload\fR(9F) unloads the current mapping so that a call to \fBdevmap_access\fR(9E), which causes the system to call \fBdevmap_contextmgt()\fR, will be generated the next time the mapping is accessed. .sp .LP \fIpvtp\fR is a pointer to the driver's private mapping data that was allocated and initialized in the \fBdevmap_map\fR(9E) entry point. \fItype\fR defines the type of operation that device drivers should perform on the memory object. If \fItype\fR is either \fBDEVMAP_LOCK\fR or \fBDEVMAP_UNLOCK\fR, the length passed to either \fBdevmap_unload\fR(9F) or \fBdevmap_load\fR(9F) must be same as \fIlen\fR. \fIrw\fR specifies the access direction on the memory object. .sp .LP A non-zero return value from \fBdevmap_contextmgt()\fR will be returned to \fBdevmap_access\fR(9E) and will cause the corresponding operation to fail. The failure may result in a \fBSIGSEGV\fR or \fBSIGBUS\fR signal being delivered to the process. .SH RETURN VALUES .sp .ne 2 .mk .na \fB\fB0\fR \fR .ad .RS 12n .rt Successful completion. .RE .sp .ne 2 .mk .na \fBNon-zero\fR .ad .RS 12n .rt An error occurred. .RE .SH EXAMPLES .LP \fBExample 1\fR managing a device context .sp .LP The following shows an example of managing a device context. .sp .in +2 .nf struct xxcontext cur_ctx; static int xxdevmap_contextmgt(devmap_cookie_t dhp, void *pvtp, offset_t off, size_t len, uint_t type, uint_t rw) { devmap_cookie_t cur_dhp; struct xxpvtdata *p; struct xxpvtdata *pvp = (struct xxpvtdata *)pvtp; struct xx_softc *softc = pvp->softc; int err; mutex_enter(&softc->mutex); /* * invalidate the translations of current context before * switching context. */ if (cur_ctx != NULL && cur_ctx != pvp->ctx) { p = cur_ctx->pvt; cur_dhp = p->dhp; if ((err = devmap_unload(cur_dhp, off, len)) != 0) return (err); } /* Switch device context - device dependent*/ ... /* Make handle the new current mapping */ cur_ctx = pvp->ctx; /* * Load the address translations of the calling context. */ err = devmap_load(pvp->dhp, off, len, type, rw); mutex_exit(&softc->mutex); return (err); } .fi .in -2 .sp .SH SEE ALSO .sp .LP \fBdevmap_access\fR(9E), \fBdevmap_do_ctxmgt\fR(9F) \fBdevmap_load\fR(9F), \fBdevmap_unload\fR(9F) .sp .LP \fIWriting Device Drivers in Oracle Solaris 11.4\fR