Changeset 3225 in vbox for trunk/src/VBox/Runtime/r0drv
- Timestamp:
- Jun 22, 2007 4:37:40 AM (18 years ago)
- svn:sync-xref-src-repo-rev:
- 22198
- Location:
- trunk/src/VBox/Runtime/r0drv
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Runtime/r0drv/memobj-r0drv.cpp
r2981 r3225 580 580 * @param fProt Combination of RTMEM_PROT_* flags (except RTMEM_PROT_NONE). 581 581 */ 582 RTR0DECL(int) RTR0MemObjMapKernel(PRTR0MEMOBJ pMemObj, PRTR0MEMOBJ MemObjToMap, void *pvFixed, size_t uAlignment, unsigned fProt)582 RTR0DECL(int) RTR0MemObjMapKernel(PRTR0MEMOBJ pMemObj, RTR0MEMOBJ MemObjToMap, void *pvFixed, size_t uAlignment, unsigned fProt) 583 583 { 584 584 /* sanity checks. */ -
trunk/src/VBox/Runtime/r0drv/os2/memobj-r0drv-os2.cpp
r2981 r3225 80 80 if (!pMemOs2->Core.pv) 81 81 break; 82 83 case RTR0MEMOBJTYPE_MAPPING: 84 if (pMemOs2->Core.u.Mapping.R0Process == NIL_RTR0PROCESS) 85 break; 86 87 /* fall thru */ 82 88 case RTR0MEMOBJTYPE_PAGE: 83 89 case RTR0MEMOBJTYPE_LOW: 84 90 case RTR0MEMOBJTYPE_CONT: 85 case RTR0MEMOBJTYPE_MAPPING:86 91 rc = KernVMFree(pMemOs2->Core.pv); 87 92 AssertMsg(!rc, ("rc=%d type=%d pv=%p cb=%#zx\n", rc, pMemOs2->Core.enmType, pMemOs2->Core.pv, pMemOs2->Core.cb)); … … 289 294 int rtR0MemObjNativeMapKernel(PPRTR0MEMOBJINTERNAL ppMem, RTR0MEMOBJ pMemToMap, void *pvFixed, size_t uAlignment, unsigned fProt) 290 295 { 291 return VERR_NOT_IMPLEMENTED;292 }293 294 295 int rtR0MemObjNativeMapUser(PPRTR0MEMOBJINTERNAL ppMem, RTR0MEMOBJ pMemToMap, void *pvFixed, size_t uAlignment, unsigned fProt, RTR0PROCESS R0Process)296 {297 AssertMsgReturn(R0Process == RTR0ProcHandleSelf(), ("%p != %p\n", R0Process, RTR0ProcHandleSelf()), VERR_NOT_SUPPORTED);298 296 AssertMsgReturn(pvFixed == (void *)-1, ("%p\n", pvFixed), VERR_NOT_SUPPORTED); 299 297 298 /** @todo finish the implementation. */ 299 300 300 int rc; 301 void *pvR0; 302 void *pvR3 = NULL; 301 void *pvR0 = NULL; 303 302 PRTR0MEMOBJOS2 pMemToMapOs2 = (PRTR0MEMOBJOS2)pMemToMap; 304 303 switch (pMemToMapOs2->Core.enmType) … … 315 314 case RTR0MEMOBJTYPE_PHYS: 316 315 pvR0 = pMemToMapOs2->Core.pv; 316 if (!pvR0) 317 { 318 /* no ring-0 mapping, so allocate a mapping in the process. */ 319 AssertMsgReturn(uAlignment == PAGE_SIZE, ("%#zx\n", uAlignment), VERR_NOT_SUPPORTED); 320 AssertMsgReturn(fProt & RTMEM_PROT_WRITE, ("%#x\n", fProt), VERR_NOT_SUPPORTED); 321 Assert(!pMemToMapOs2->Core.u.Phys.fAllocated); 322 ULONG ulPhys = pMemToMapOs2->Core.u.Phys.PhysBase; 323 rc = KernVMAlloc(pMemToMapOs2->Core.cb, VMDHA_PHYS/* | VMDHA_SHARED?*/, &pvR0, (PPVOID)&ulPhys, NULL); 324 if (rc) 325 return RTErrConvertFromOS2(rc); 326 pMemToMapOs2->Core.pv = pvR0; 327 } 328 break; 329 330 case RTR0MEMOBJTYPE_LOCK: 331 if (pMemToMapOs2->Core.u.Lock.R0Process != NIL_RTR0PROCESS) 332 return VERR_NOT_SUPPORTED; /** @todo implement this... */ 333 pvR0 = pMemToMapOs2->Core.pv; 334 break; 335 336 case RTR0MEMOBJTYPE_RES_VIRT: 337 case RTR0MEMOBJTYPE_MAPPING: 338 default: 339 AssertMsgFailed(("enmType=%d\n", pMemToMapOs2->Core.enmType)); 340 return VERR_INTERNAL_ERROR; 341 } 342 343 /* 344 * Create a dummy mapping object for it. 345 * 346 * All mappings are read/write/execute in OS/2 and there isn't 347 * any cache options, so sharing is ok. And the main memory object 348 * isn't actually freed until all the mappings have been freed up 349 * (reference counting). 350 */ 351 PRTR0MEMOBJOS2 pMemOs2 = (PRTR0MEMOBJOS2)rtR0MemObjNew(RT_OFFSETOF(RTR0MEMOBJOS2, Lock), RTR0MEMOBJTYPE_MAPPING, pvR0, pMemToMapOs2->Core.cb); 352 if (pMemOs2) 353 { 354 pMemOs2->Core.u.Mapping.R0Process = NIL_RTR0PROCESS; 355 *ppMem = &pMemOs2->Core; 356 return VINF_SUCCESS; 357 } 358 return VERR_NO_MEMORY; 359 } 360 361 362 int rtR0MemObjNativeMapUser(PPRTR0MEMOBJINTERNAL ppMem, RTR0MEMOBJ pMemToMap, void *pvFixed, size_t uAlignment, unsigned fProt, RTR0PROCESS R0Process) 363 { 364 AssertMsgReturn(R0Process == RTR0ProcHandleSelf(), ("%p != %p\n", R0Process, RTR0ProcHandleSelf()), VERR_NOT_SUPPORTED); 365 AssertMsgReturn(pvFixed == (void *)-1, ("%p\n", pvFixed), VERR_NOT_SUPPORTED); 366 367 int rc; 368 void *pvR0; 369 void *pvR3 = NULL; 370 PRTR0MEMOBJOS2 pMemToMapOs2 = (PRTR0MEMOBJOS2)pMemToMap; 371 switch (pMemToMapOs2->Core.enmType) 372 { 373 /* 374 * These has kernel mappings. 375 */ 376 case RTR0MEMOBJTYPE_PAGE: 377 case RTR0MEMOBJTYPE_LOW: 378 case RTR0MEMOBJTYPE_CONT: 379 pvR0 = pMemToMapOs2->Core.pv; 380 break; 381 382 case RTR0MEMOBJTYPE_PHYS: 383 pvR0 = pMemToMapOs2->Core.pv; 384 #if 0/* this is wrong. */ 317 385 if (!pvR0) 318 386 { … … 327 395 } 328 396 break; 397 #endif 398 return VERR_NOT_SUPPORTED; 329 399 330 400 case RTR0MEMOBJTYPE_LOCK: … … 364 434 if (pMemOs2) 365 435 { 366 Assert(pMemOs2->Core.pv == pvR3);436 Assert(pMemOs2->Core.pv == pvR3); 367 437 pMemOs2->Core.u.Mapping.R0Process = R0Process; 368 438 *ppMem = &pMemOs2->Core;
Note:
See TracChangeset
for help on using the changeset viewer.