Changeset 42203 in vbox for trunk/src/VBox
- Timestamp:
- Jul 18, 2012 10:13:39 AM (13 years ago)
- svn:sync-xref-src-repo-rev:
- 79211
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Additions/solaris/Mouse/vboxmouse.c
r42043 r42203 559 559 if (canput(pReadQueue->q_next)) 560 560 putnext(pReadQueue, pMBlk); 561 //else562 //putq(pReadQueue, pMBlk);561 else 562 putq(pReadQueue, pMBlk); 563 563 } 564 564 … … 625 625 626 626 /* Helper for vbmsSolWPut. */ 627 static int vbmsSolDispatchIOCtl( queue_t *pWriteQueue, mblk_t *pMBlk);627 static int vbmsSolDispatchIOCtl(PVBMSSTATE pState, mblk_t *pMBlk); 628 628 629 629 /** … … 633 633 int vbmsSolWPut(queue_t *pWriteQueue, mblk_t *pMBlk) 634 634 { 635 LogRelFlowFunc((DEVICE_NAME ":: \n"));635 LogRelFlowFunc((DEVICE_NAME "::")); 636 636 switch (pMBlk->b_datap->db_type) 637 637 { 638 638 case M_FLUSH: 639 LogRelFlow(("M_FLUSH, FLUSHW=%RTbool, FLUSHR=%RTbool\n", 640 *pMBlk->b_rptr & FLUSHW, *pMBlk->b_rptr & FLUSHR)); 639 641 /* Flush the write queue if so requested. */ 640 642 if (*pMBlk->b_rptr & FLUSHW) … … 653 655 case M_IOCDATA: 654 656 { 655 int err = vbmsSolDispatchIOCtl(pWriteQueue, pMBlk); 657 PVBMSSTATE pState = (PVBMSSTATE)pWriteQueue->q_ptr; 658 int err; 659 660 LogRelFlow(( pMBlk->b_datap->db_type == M_IOCTL 661 ? "M_IOCTL\n" : "M_IOCDATA\n")); 662 err = vbmsSolDispatchIOCtl(pState, pMBlk); 656 663 if (!err) 657 664 qreply(pWriteQueue, pMBlk); … … 660 667 break; 661 668 } 669 default: 670 LogRelFlow(("Unknown command, not acknowledging.\n")); 662 671 } 663 672 return 0; … … 1021 1030 1022 1031 /* Helpers for vbmsSolDispatchIOCtl. */ 1023 static int vbmsSolHandleIOCtl( queue_t *pWriteQueue, mblk_t *pMBlk,1032 static int vbmsSolHandleIOCtl(PVBMSSTATE pState, mblk_t *pMBlk, 1024 1033 PFNVBMSSOLIOCTL pfnHandler, 1025 int iCmd, size_t cb Transparent,1034 int iCmd, size_t cbCmd, 1026 1035 enum IOCTLDIRECTION enmDirection); 1027 1036 static int vbmsSolVUIDIOCtl(PVBMSSTATE pState, int iCmd, void *pvData, … … 1061 1070 * respectively. 1062 1071 * @returns 0 on success or the IOCtl error code on failure. 1063 * @param p WriteQueue pointer to the STREAMS write queue structure.1072 * @param pState pointer to the state structure. 1064 1073 * @param pMBlk pointer to the STREAMS message block structure. 1065 1074 */ 1066 static int vbmsSolDispatchIOCtl( queue_t *pWriteQueue, mblk_t *pMBlk)1075 static int vbmsSolDispatchIOCtl(PVBMSSTATE pState, mblk_t *pMBlk) 1067 1076 { 1068 1077 struct iocblk *pIOCBlk = (struct iocblk *)pMBlk->b_rptr; … … 1071 1080 enum IOCTLDIRECTION enmDirection; 1072 1081 1073 LogRelFlowFunc((DEVICE_NAME ":: iCmdType=%c, iCmd=0x%x\n",1074 (char) (iCmdType >> 8), (unsigned)iCmd));1082 LogRelFlowFunc((DEVICE_NAME "::pIOCBlk=%p, iCmdType=%c, iCmd=0x%x\n", 1083 pIOCBlk, (char) (iCmdType >> 8), (unsigned)iCmd)); 1075 1084 switch (iCmdType) 1076 1085 { … … 1085 1094 cbBuffer = g_aVUIDIOCtlDescriptions[i].cbBuffer; 1086 1095 enmDirection = g_aVUIDIOCtlDescriptions[i].enmDirection; 1087 return vbmsSolHandleIOCtl(p WriteQueue, pMBlk,1088 1089 1096 return vbmsSolHandleIOCtl(pState, pMBlk, 1097 vbmsSolVUIDIOCtl, iCmd, 1098 cbBuffer, enmDirection); 1090 1099 } 1091 1100 return EINVAL; … … 1098 1107 1099 1108 /* Helpers for vbmsSolHandleIOCtl. */ 1100 static int vbmsSolHandleIOCtlData( queue_t *pWriteQueue, mblk_t *pMBlk,1101 1102 size_t cbTransparent,1103 1104 1105 static int vbmsSolHandleTransparentIOCtl( queue_t *pWriteQueue, mblk_t *pMBlk,1106 1107 int iCmd, size_t cbTransparent,1108 1109 1110 static int vbmsSolHandleIStrIOCtl( queue_t *pWriteQueue, mblk_t *pMBlk,1109 static int vbmsSolHandleIOCtlData(PVBMSSTATE pState, mblk_t *pMBlk, 1110 PFNVBMSSOLIOCTL pfnHandler, int iCmd, 1111 size_t cbCmd, 1112 enum IOCTLDIRECTION enmDirection); 1113 1114 static int vbmsSolHandleTransparentIOCtl(PVBMSSTATE pState, mblk_t *pMBlk, 1115 PFNVBMSSOLIOCTL pfnHandler, 1116 int iCmd, size_t cbCmd, 1117 enum IOCTLDIRECTION enmDirection); 1118 1119 static int vbmsSolHandleIStrIOCtl(PVBMSSTATE pState, mblk_t *pMBlk, 1111 1120 PFNVBMSSOLIOCTL pfnHandler, int iCmd); 1121 1122 static void vbmsSolAcknowledgeIOCtl(mblk_t *pMBlk, int cbData, int rc) 1123 { 1124 struct iocblk *pIOCBlk = (struct iocblk *)pMBlk->b_rptr; 1125 1126 pMBlk->b_datap->db_type = M_IOCACK; 1127 pIOCBlk->ioc_count = cbData; 1128 pIOCBlk->ioc_rval = rc; 1129 pIOCBlk->ioc_error = 0; 1130 } 1112 1131 1113 1132 /** … … 1120 1139 * buffer anyway, but the caller can choose the buffer size). 1121 1140 * @returns 0 on success or the IOCtl error code on failure. 1122 * @param p WriteQueue pointer to the STREAMS write queue structure.1141 * @param pState pointer to the state structure. 1123 1142 * @param pMBlk pointer to the STREAMS message block structure. 1124 1143 * @param pfnHandler pointer to the right IOCtl handler function for this 1125 1144 * IOCtl number. 1126 1145 * @param iCmd IOCtl command number. 1127 * @param cb Transparentsize of the user space buffer for this IOCtl number,1146 * @param cbCmd size of the user space buffer for this IOCtl number, 1128 1147 * used for processing transparent IOCtls. Pass zero 1129 1148 * for IOCtls with no maximum buffer size (which will … … 1132 1151 * @param enmDirection data transfer direction of the IOCtl. 1133 1152 */ 1134 static int vbmsSolHandleIOCtl(queue_t *pWriteQueue, mblk_t *pMBlk, 1135 PFNVBMSSOLIOCTL pfnHandler, int iCmd, 1136 size_t cbTransparent, 1137 enum IOCTLDIRECTION enmDirection) 1153 static int vbmsSolHandleIOCtl(PVBMSSTATE pState, mblk_t *pMBlk, 1154 PFNVBMSSOLIOCTL pfnHandler, int iCmd, 1155 size_t cbCmd, enum IOCTLDIRECTION enmDirection) 1138 1156 { 1139 1157 struct iocblk *pIOCBlk = (struct iocblk *)pMBlk->b_rptr; 1140 1158 1141 1159 LogFlowFunc(("iCmd=0x%x, cbBuffer=%d, enmDirection=%d\n", 1142 (unsigned)iCmd, (int)cb Transparent, (int)enmDirection));1160 (unsigned)iCmd, (int)cbCmd, (int)enmDirection)); 1143 1161 if (pMBlk->b_datap->db_type == M_IOCDATA) 1144 return vbmsSolHandleIOCtlData(p WriteQueue, pMBlk, pfnHandler, iCmd,1145 cbTransparent, enmDirection);1162 return vbmsSolHandleIOCtlData(pState, pMBlk, pfnHandler, iCmd, 1163 cbCmd, enmDirection); 1146 1164 else if ( pMBlk->b_datap->db_type == M_IOCTL 1147 1165 && pIOCBlk->ioc_count == TRANSPARENT) 1148 return vbmsSolHandleTransparentIOCtl(pWriteQueue, pMBlk, pfnHandler, 1149 iCmd, cbTransparent, 1150 enmDirection); 1166 return vbmsSolHandleTransparentIOCtl(pState, pMBlk, pfnHandler, 1167 iCmd, cbCmd, enmDirection); 1151 1168 else if (pMBlk->b_datap->db_type == M_IOCTL) 1152 return vbmsSolHandleIStrIOCtl(p WriteQueue, pMBlk, pfnHandler, iCmd);1169 return vbmsSolHandleIStrIOCtl(pState, pMBlk, pfnHandler, iCmd); 1153 1170 return EINVAL; 1154 1171 } … … 1161 1178 * @copydoc vbmsSolHandleIOCtl 1162 1179 */ 1163 static int vbmsSolHandleIOCtlData( queue_t *pWriteQueue, mblk_t *pMBlk,1164 1165 size_t cbTransparent,1166 1180 static int vbmsSolHandleIOCtlData(PVBMSSTATE pState, mblk_t *pMBlk, 1181 PFNVBMSSOLIOCTL pfnHandler, int iCmd, 1182 size_t cbCmd, 1183 enum IOCTLDIRECTION enmDirection) 1167 1184 { 1168 1185 struct copyresp *pCopyResp = (struct copyresp *)pMBlk->b_rptr; 1169 PVBMSSTATE pState = (PVBMSSTATE)pWriteQueue->q_ptr;1170 1186 1171 1187 LogFlowFunc(("iCmd=0x%x, cbBuffer=%d, enmDirection=%d, cp_rval=%d, cp_private=%p\n", 1172 (unsigned)iCmd, (int)cb Transparent, (int)enmDirection,1188 (unsigned)iCmd, (int)cbCmd, (int)enmDirection, 1173 1189 (int)(uintptr_t)pCopyResp->cp_rval, 1174 1190 (void *)pCopyResp->cp_private)); … … 1189 1205 return EINVAL; 1190 1206 pvData = pMBlk->b_cont->b_rptr; 1191 err = pfnHandler(pState, iCmd, pvData, cb Transparent, &cbData, NULL);1207 err = pfnHandler(pState, iCmd, pvData, cbCmd, &cbData, NULL); 1192 1208 if (!err && enmDirection == BOTH) 1193 1209 mcopyout(pMBlk, NULL, cbData, pCopyResp->cp_private, NULL); 1194 1210 else if (!err && enmDirection == IN) 1195 miocack(pWriteQueue,pMBlk, 0, 0);1211 vbmsSolAcknowledgeIOCtl(pMBlk, 0, 0); 1196 1212 return err; 1197 1213 } … … 1199 1215 { 1200 1216 AssertReturn(enmDirection == OUT || enmDirection == BOTH, EINVAL); 1201 miocack(pWriteQueue,pMBlk, 0, 0);1217 vbmsSolAcknowledgeIOCtl(pMBlk, 0, 0); 1202 1218 return 0; 1203 1219 } … … 1210 1226 * @copydoc vbmsSolHandleIOCtl 1211 1227 */ 1212 int vbmsSolHandleTransparentIOCtl( queue_t *pWriteQueue, mblk_t *pMBlk,1213 1214 size_t cbTransparent,1215 1228 int vbmsSolHandleTransparentIOCtl(PVBMSSTATE pState, mblk_t *pMBlk, 1229 PFNVBMSSOLIOCTL pfnHandler, int iCmd, 1230 size_t cbCmd, 1231 enum IOCTLDIRECTION enmDirection) 1216 1232 { 1217 1233 int err = 0, rc = 0; 1218 1234 size_t cbData = 0; 1219 PVBMSSTATE pState = (PVBMSSTATE)pWriteQueue->q_ptr;1220 1235 1221 1236 LogFlowFunc(("iCmd=0x%x, cbBuffer=%d, enmDirection=%d\n", 1222 (unsigned)iCmd, (int)cb Transparent, (int)enmDirection));1237 (unsigned)iCmd, (int)cbCmd, (int)enmDirection)); 1223 1238 if ( (enmDirection != NONE && !pMBlk->b_cont) 1224 1239 || enmDirection == UNSPECIFIED) … … 1230 1245 if (enmDirection == BOTH) 1231 1246 pUserAddr = *(void **)pMBlk->b_cont->b_rptr; 1232 mcopyin(pMBlk, pUserAddr /* state data */, cb Transparent, NULL);1247 mcopyin(pMBlk, pUserAddr /* state data */, cbCmd, NULL); 1233 1248 } 1234 1249 else if (enmDirection == OUT) 1235 1250 { 1236 mblk_t *pMBlkOut = allocb(cb Transparent, BPRI_MED);1251 mblk_t *pMBlkOut = allocb(cbCmd, BPRI_MED); 1237 1252 void *pvData; 1238 1253 … … 1240 1255 return EAGAIN; 1241 1256 pvData = pMBlkOut->b_rptr; 1242 err = pfnHandler(pState, iCmd, pvData, cb Transparent, &cbData, NULL);1257 err = pfnHandler(pState, iCmd, pvData, cbCmd, &cbData, NULL); 1243 1258 if (!err) 1244 1259 mcopyout(pMBlk, NULL, cbData, NULL, pMBlkOut); … … 1251 1266 err = pfnHandler(pState, iCmd, NULL, 0, NULL, &rc); 1252 1267 if (!err) 1253 miocack(pWriteQueue,pMBlk, 0, rc);1268 vbmsSolAcknowledgeIOCtl(pMBlk, 0, rc); 1254 1269 } 1255 1270 return err; … … 1261 1276 * @copydoc vbmsSolHandleIOCtl 1262 1277 */ 1263 static int vbmsSolHandleIStrIOCtl( queue_t *pWriteQueue, mblk_t *pMBlk,1264 1278 static int vbmsSolHandleIStrIOCtl(PVBMSSTATE pState, mblk_t *pMBlk, 1279 PFNVBMSSOLIOCTL pfnHandler, int iCmd) 1265 1280 { 1266 1281 struct iocblk *pIOCBlk = (struct iocblk *)pMBlk->b_rptr; 1267 PVBMSSTATE pState = (PVBMSSTATE)pWriteQueue->q_ptr;1268 1282 uint_t cbBuffer = pIOCBlk->ioc_count; 1269 1283 void *pvData = NULL; … … 1281 1295 if (err) 1282 1296 return err; 1283 }1284 if (pMBlk->b_cont) /* consms forgets to set ioc_count. */1285 {1286 1297 pvData = pMBlk->b_cont->b_rptr; 1287 cbBuffer = pMBlk->b_cont->b_wptr - pMBlk->b_cont->b_rptr; 1298 } 1299 else if (pMBlk->b_cont) /* consms forgets to set ioc_count. */ 1300 { 1301 pvData = pMBlk->b_cont->b_rptr; 1302 cbBuffer = pMBlk->b_cont->b_datap->db_lim 1303 - pMBlk->b_cont->b_datap->db_base; 1288 1304 } 1289 1305 err = pfnHandler(pState, iCmd, pvData, cbBuffer, &cbData, &rc); 1290 1306 if (!err) 1291 miocack(pWriteQueue, pMBlk, cbData, rc); 1307 { 1308 LogRelFlowFunc(("pMBlk=%p, pMBlk->b_datap=%p, pMBlk->b_rptr=%p\n", 1309 pMBlk, pMBlk->b_datap, pMBlk->b_rptr)); 1310 vbmsSolAcknowledgeIOCtl(pMBlk, cbData, rc); 1311 } 1292 1312 return err; 1293 1313 } … … 1301 1321 size_t cbBuffer, size_t *pcbData, int *prc) 1302 1322 { 1303 LogRelFlowFunc((DEVICE_NAME ":: " /* no '\n' */));1323 LogRelFlowFunc((DEVICE_NAME "::pvData=%p " /* no '\n' */, pvData)); 1304 1324 switch (iCmd) 1305 1325 {
Note:
See TracChangeset
for help on using the changeset viewer.