Changeset 4717 in vbox
- Timestamp:
- Sep 12, 2007 6:44:18 AM (17 years ago)
- svn:sync-xref-src-repo-rev:
- 24390
- Location:
- trunk/src/VBox
- Files:
-
- 1 added
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/HostDrivers/Support/solaris/SUPDrv-solaris.c
r4550 r4717 47 47 /** The module name. */ 48 48 #define DEVICE_NAME "vboxdrv" 49 /** The module description as seen in 'modinfo'. */ 49 50 #define DEVICE_DESC "VirtualBox Driver" 51 /** Maximum number of driver instances. */ 50 52 #define DEVICE_MAXINSTANCES 16 51 53 … … 54 56 * Internal Functions * 55 57 *******************************************************************************/ 56 static int VBoxDrvSolarisOpen(dev_t * pDev, int fFlag, int fType, cred_t*pCred);57 static int VBoxDrvSolarisClose(dev_t Dev, int fFlag, int fType, cred_t *pCred);58 static int VBoxDrvSolarisRead(dev_t Dev, struct uio * pUio, cred_t*pCred);59 static int VBoxDrvSolarisWrite(dev_t Dev, struct uio * pUio, cred_t*pCred);60 static int VBoxDrvSolarisIOCtl (dev_t Dev, int Cmd, intptr_t pArgs, int mode, cred_t * pCred, int*pVal);61 62 static int VBoxDrvSolarisAttach(dev_info_t *pDip, ddi_attach_cmd_t Cmd);63 static int VBoxDrvSolarisDetach(dev_info_t *pDip, ddi_detach_cmd_t Cmd);58 static int VBoxDrvSolarisOpen(dev_t *pDev, int fFlag, int fType, cred_t *pCred); 59 static int VBoxDrvSolarisClose(dev_t Dev, int fFlag, int fType, cred_t *pCred); 60 static int VBoxDrvSolarisRead(dev_t Dev, struct uio *pUio, cred_t *pCred); 61 static int VBoxDrvSolarisWrite(dev_t Dev, struct uio *pUio, cred_t *pCred); 62 static int VBoxDrvSolarisIOCtl (dev_t Dev, int Cmd, intptr_t pArgs, int mode, cred_t *pCred, int *pVal); 63 64 static int VBoxDrvSolarisAttach(dev_info_t *pDip, ddi_attach_cmd_t Cmd); 65 static int VBoxDrvSolarisDetach(dev_info_t *pDip, ddi_detach_cmd_t Cmd); 64 66 65 67 static int VBoxSupDrvErr2SolarisErr(int rc); … … 131 133 }; 132 134 133 /** State info. each our kernel module instances*/135 /** State info. for each driver instance. */ 134 136 typedef struct 135 137 { 136 dev_info_t *pDip; /* Device handle */138 dev_info_t *pDip; /* Device handle */ 137 139 } vbox_devstate_t; 138 140 139 141 /** Opaque pointer to state */ 140 static void *g_pVBoxDrvSolarisState;142 static void *g_pVBoxDrvSolarisState; 141 143 142 144 /** Device extention & session data association structure */ … … 207 209 if (RT_SUCCESS(rc)) 208 210 { 209 cmn_err(CE_NOTE,"supdrvCreateSession success");210 211 RTSPINLOCKTMP Tmp = RTSPINLOCKTMP_INITIALIZER; 211 212 unsigned iHash; … … 237 238 if (instance >= DEVICE_MAXINSTANCES) 238 239 { 239 cmn_err(CE_NOTE, " All instances exhausted\n");240 cmn_err(CE_NOTE, "VBoxDrvSolarisOpen: All instances exhausted\n"); 240 241 return ENXIO; 241 242 } … … 301 302 } 302 303 303 static int VBoxDrvSolarisRead(dev_t dev, struct uio* pUio, cred_t* credp)304 static int VBoxDrvSolarisRead(dev_t Dev, struct uio *pUio, cred_t *pCred) 304 305 { 305 306 cmn_err(CE_CONT, "VBoxDrvSolarisRead"); … … 307 308 } 308 309 309 static int VBoxDrvSolarisWrite(dev_t dev, struct uio* pUio, cred_t* credp)310 static int VBoxDrvSolarisWrite(dev_t Dev, struct uio *pUio, cred_t *pCred) 310 311 { 311 312 cmn_err(CE_CONT, "VBoxDrvSolarisWrite"); … … 321 322 * @return corresponding solaris error code. 322 323 */ 323 static int VBoxDrvSolarisAttach(dev_info_t *pDip, ddi_attach_cmd_t enmCmd)324 static int VBoxDrvSolarisAttach(dev_info_t *pDip, ddi_attach_cmd_t enmCmd) 324 325 { 325 326 cmn_err(CE_CONT, "VBoxDrvSolarisAttach"); 326 327 int rc = VINF_SUCCESS; 327 328 int instance = 0; 328 vbox_devstate_t *pState;329 vbox_devstate_t *pState; 329 330 330 331 switch (enmCmd) … … 412 413 int rc = VINF_SUCCESS; 413 414 int instance; 414 register vbox_devstate_t *pState;415 register vbox_devstate_t *pState; 415 416 416 417 cmn_err(CE_CONT, "VBoxDrvSolarisDetach"); … … 557 558 { 558 559 OSDBGPRINT(("VBoxDrvSolarisIOCtlSlow: ddi_copyout(,%p,%d) failed.\n", pArgData->pvOut, cbBuf)); 559 560 /** @todo r=bird: why this extra return? setting rc = EFAULT; should do the trick, shouldn't it? */ 561 RTMemTmpFree(pvBuf); 562 return EFAULT; 560 rc = EFAULT; 563 561 } 564 562 } … … 573 571 RTMemTmpFree(pvBuf); 574 572 575 OSDBGPRINT(("VBoxDrvSolarisIOCtlSlow: returns %d cbOut=%d\n", rc, cbOut));576 573 return rc; 577 574 } … … 633 630 } 634 631 632 635 633 RTDECL(int) SUPR0Printf(const char *pszFormat, ...) 636 634 { … … 643 641 644 642 szMsg[sizeof(szMsg) - 1] = '\0'; 645 printf("%s", szMsg);643 uprintf("%s", szMsg); 646 644 return 0; 647 645 } -
trunk/src/VBox/Runtime/Makefile.kmk
r4713 r4717 876 876 generic/RTTimerCreate-generic.cpp 877 877 878 # SOLARISTODO - Todo for Solaris879 878 RuntimeR0Drv_SOURCES.solaris = \ 880 879 generic/RTAssertDoBreakpoint-generic.cpp \ … … 891 890 r0drv/solaris/process-r0drv-solaris.c \ 892 891 r0drv/solaris/semevent-r0drv-solaris.c \ 892 r0drv/solaris/semeventmulti-r0drv-solaris.c \ 893 893 r0drv/solaris/semfastmutex-r0drv-solaris.c \ 894 894 r0drv/solaris/spinlock-r0drv-solaris.c \ … … 898 898 r0drv/solaris/timer-r0drv-solaris.c 899 899 900 ## @todo r0drv/solaris/semeventmulti-r0drv-solaris.c901 900 902 901 ## PORTME: Porters create and add their selection of platform specific Ring-0 Driver files here. -
trunk/src/VBox/Runtime/r0drv/solaris/assert-r0drv-solaris.c
r4071 r4717 37 37 #endif 38 38 39 printf("\r\n!!Assertion Failed!!\r\n"40 "Expression: %s\r\n"41 "Location : %s(%d) %s\r\n",42 pszExpr, pszFile, uLine, pszFunction);39 uprintf("\r\n!!Assertion Failed!!\r\n" 40 "Expression: %s\r\n" 41 "Location : %s(%d) %s\r\n", 42 pszExpr, pszFile, uLine, pszFunction); 43 43 } 44 44 … … 59 59 szMsg[sizeof(szMsg) - 1] = '\0'; 60 60 va_end(va); 61 printf("%s", szMsg);61 uprintf("%s", szMsg); 62 62 } 63 63 -
trunk/src/VBox/Runtime/r0drv/solaris/memobj-r0drv-solaris.c
r4474 r4717 101 101 102 102 case RTR0MEMOBJTYPE_PAGE: 103 kmem_free(pMemSolaris->Core.pv, pMemSolaris->Core.cb);103 ddi_umem_free(pMemSolaris->Cookie); 104 104 break; 105 105 … … 107 107 { 108 108 cmn_err(CE_NOTE, "rtR0MemObjNativeFree: LOCK\n"); 109 struct as *addrSpace;109 struct as *addrSpace; 110 110 if (pMemSolaris->Core.u.Lock.R0Process == NIL_RTR0PROCESS) 111 111 addrSpace = &kas; … … 119 119 case RTR0MEMOBJTYPE_MAPPING: 120 120 { 121 struct hat *hatSpace;122 struct as *addrSpace;121 struct hat *hatSpace; 122 struct as *addrSpace; 123 123 cmn_err(CE_NOTE, "rtR0MemObjNativeFree: MAPPING\n"); 124 124 if (pMemSolaris->Core.u.Mapping.R0Process == NIL_RTR0PROCESS) … … 164 164 return VERR_NO_MEMORY; 165 165 166 /** @todo r=bird: The man page says: "The allocated memory is at least double-word aligned, so it can hold any C data structure. No greater alignment can be assumed." */ 167 void* virtAddr = kmem_alloc(cb, KM_SLEEP); 166 void *virtAddr = ddi_umem_alloc(cb, DDI_UMEM_SLEEP, &pMemSolaris->Cookie); 168 167 if (!virtAddr) 169 168 { 170 169 rtR0MemObjDelete(&pMemSolaris->Core); 171 return VERR_NO_ MEMORY;170 return VERR_NO_PAGE_MEMORY; 172 171 } 173 172 … … 215 214 { 216 215 rtR0MemObjDelete(&pMemSolaris->Core); 217 return VERR_NO_ MEMORY;216 return VERR_NO_CONT_MEMORY; 218 217 } 219 218 … … 258 257 int rtR0MemObjNativeLockUser(PPRTR0MEMOBJINTERNAL ppMem, RTR3PTR R3Ptr, size_t cb, RTR0PROCESS R0Process) 259 258 { 260 /* Create the object */259 /* Create the locking object */ 261 260 PRTR0MEMOBJSOLARIS pMemSolaris = (PRTR0MEMOBJSOLARIS)rtR0MemObjNew(sizeof(*pMemSolaris), RTR0MEMOBJTYPE_LOCK, (void *)R3Ptr, cb); 262 261 if (!pMemSolaris) … … 270 269 page_t **ppl; 271 270 271 /* Lock down user pages */ 272 272 int rc = as_pagelock(useras, &ppl, (caddr_t)R3Ptr, cb, S_WRITE); 273 273 if (rc != 0) 274 274 { 275 275 cmn_err(CE_NOTE,"rtR0MemObjNativeLockUser: as_pagelock failed rc=%d\n", rc); 276 return VERR_ NO_MEMORY;276 return VERR_LOCK_FAILED; 277 277 } 278 278 … … 281 281 as_pageunlock(useras, ppl, (caddr_t)R3Ptr, cb, S_WRITE); 282 282 cmn_err(CE_NOTE, "rtR0MemObjNativeLockUser: as_pagelock failed to get shadow pages\n"); 283 return VERR_ NO_MEMORY;283 return VERR_LOCK_FAILED; 284 284 } 285 285 … … 293 293 int rtR0MemObjNativeLockKernel(PPRTR0MEMOBJINTERNAL ppMem, void *pv, size_t cb) 294 294 { 295 /* Create the object */295 /* Create the locking object */ 296 296 PRTR0MEMOBJSOLARIS pMemSolaris = (PRTR0MEMOBJSOLARIS)rtR0MemObjNew(sizeof(*pMemSolaris), RTR0MEMOBJTYPE_LOCK, pv, cb); 297 297 if (!pMemSolaris) … … 301 301 page_t **ppl; 302 302 303 /* Lock down kernel pages */ 303 304 int rc = as_pagelock(&kas, &ppl, virtAddr, cb, S_WRITE); 304 305 if (rc != 0) 305 return VERR_NO_MEMORY; 306 { 307 cmn_err(CE_NOTE,"rtR0MemObjNativeLockKernel: as_pagelock failed rc=%d\n", rc); 308 return VERR_LOCK_FAILED; 309 } 306 310 307 311 if (!ppl) 308 312 { 309 313 as_pageunlock(&kas, ppl, virtAddr, cb, S_WRITE); 310 cmn_err(CE_NOTE, "rtR0MemObjNativeLock User: failed to get shadow pages\n");311 return VERR_ NO_MEMORY;314 cmn_err(CE_NOTE, "rtR0MemObjNativeLockKernel: failed to get shadow pages\n"); 315 return VERR_LOCK_FAILED; 312 316 } 313 317 … … 333 337 { 334 338 PRTR0MEMOBJSOLARIS pMemToMapSolaris = (PRTR0MEMOBJSOLARIS)pMemToMap; 335 size_t size = P2ROUNDUP(pMemToMapSolaris->Core.cb, PAGE_SIZE); /* r=bird: not necessary, see the specs / caller implementation. */339 size_t size = pMemToMapSolaris->Core.cb; 336 340 void *pv = pMemToMapSolaris->Core.pv; 337 341 pgcnt_t cPages = btop(size); … … 364 368 return VERR_NO_MEMORY; 365 369 } 366 /** @todo r=bird: check address against uAlignment, just fail if it's not matching. */ 370 371 /* Check address against alignment, fail if it doesn't match */ 372 if ((uintptr_t)addr & (uAlignment - 1)) 373 { 374 as_rangeunlock(&kas); 375 cmn_err(CE_NOTE, "rtR0MemObjNativeMapKernel: map_addr alignment(%ld) failed.\n", uAlignment); 376 return VERR_MAP_FAILED; 377 } 367 378 } 368 379 … … 401 412 { 402 413 PRTR0MEMOBJSOLARIS pMemToMapSolaris = (PRTR0MEMOBJSOLARIS)pMemToMap; 403 size_t size = P2ROUNDUP(pMemToMapSolaris->Core.cb, PAGE_SIZE); /** @todo r=bird: this isn't necessary, see the specs. */414 size_t size = pMemToMapSolaris->Core.cb; 404 415 proc_t *userproc = (proc_t *)R0Process; 405 416 struct as *useras = userproc->p_as; … … 441 452 as_rangeunlock(useras); 442 453 cmn_err(CE_NOTE, "rtR0MemObjNativeMapUser: map_addr failed\n"); 443 return VERR_NO_MEMORY; 444 } 445 446 /** @todo r=bird: check address against uAlignment, just fail if it's not matching. */ 454 return VERR_MAP_FAILED; 455 } 456 457 /* Check address against alignment, fail if it doesn't match */ 458 if ((uintptr_t)addr & (uAlignment - 1)) 459 { 460 as_rangeunlock(useras); 461 cmn_err(CE_NOTE, "rtR0MemObjNativeMapUser: map_addr alignment(%ld) failed.\n", uAlignment); 462 return VERR_MAP_FAILED; 463 } 447 464 } 448 465 … … 456 473 { 457 474 cmn_err(CE_NOTE, "rtR0MemObjNativeMapUser: as_map failure.\n"); 458 return VERR_ NO_MEMORY;475 return VERR_MAP_FAILED; 459 476 } 460 477
Note:
See TracChangeset
for help on using the changeset viewer.