Changeset 4135 in vbox for trunk/src/VBox/Runtime/r0drv/freebsd
- Timestamp:
- Aug 14, 2007 1:29:43 AM (18 years ago)
- svn:sync-xref-src-repo-rev:
- 23614
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Runtime/r0drv/freebsd/memobj-r0drv-freebsd.c
r4049 r4135 55 55 /** The core structure. */ 56 56 RTR0MEMOBJINTERNAL Core; 57 /** The VM object associated with the allocation. */ 57 /** The VM object associated with the allocation. */ 58 58 vm_object_t pObject; 59 59 /** the VM object associated with the mapping. … … 83 83 { 84 84 rc = vm_map_remove(kernel_map, 85 (vm_offset_t)pMemFreeBSD->Core.pv, 85 (vm_offset_t)pMemFreeBSD->Core.pv, 86 86 (vm_offset_t)pMemFreeBSD->Core.pv + pMemFreeBSD->Core.cb); 87 87 AssertMsg(rc == KERN_SUCCESS, ("%#x", rc)); … … 93 93 { 94 94 rc = vm_map_remove(kernel_map, 95 (vm_offset_t)pMemFreeBSD->Core.pv, 95 (vm_offset_t)pMemFreeBSD->Core.pv, 96 96 (vm_offset_t)pMemFreeBSD->Core.pv + pMemFreeBSD->Core.cb); 97 97 AssertMsg(rc == KERN_SUCCESS, ("%#x", rc)); … … 103 103 { 104 104 rc = vm_map_remove(kernel_map, 105 (vm_offset_t)pMemFreeBSD->Core.pv, 105 (vm_offset_t)pMemFreeBSD->Core.pv, 106 106 (vm_offset_t)pMemFreeBSD->Core.pv + pMemFreeBSD->Core.cb); 107 107 AssertMsg(rc == KERN_SUCCESS, ("%#x", rc)); … … 115 115 if (pMemFreeBSD->Core.u.Lock.R0Process != NIL_RTR0PROCESS) 116 116 pMap = &((struct proc *)pMemFreeBSD->Core.u.Lock.R0Process)->p_vmspace->vm_map; 117 rc = vm_map_unwire(pMap, 118 (vm_offset_t)pMemFreeBSD->Core.pv, 119 (vm_offset_t)pMemFreeBSD->Core.pv + pMemFreeBSD->Core.cb, 117 rc = vm_map_unwire(pMap, 118 (vm_offset_t)pMemFreeBSD->Core.pv, 119 (vm_offset_t)pMemFreeBSD->Core.pv + pMemFreeBSD->Core.cb, 120 120 VM_MAP_WIRE_SYSTEM | VM_MAP_WIRE_NOHOLES); 121 121 AssertMsg(rc == KERN_SUCCESS, ("%#x", rc)); … … 129 129 pMap = &((struct proc *)pMemFreeBSD->Core.u.Lock.R0Process)->p_vmspace->vm_map; 130 130 rc = vm_map_remove(pMap, 131 (vm_offset_t)pMemFreeBSD->Core.pv, 131 (vm_offset_t)pMemFreeBSD->Core.pv, 132 132 (vm_offset_t)pMemFreeBSD->Core.pv + pMemFreeBSD->Core.cb); 133 133 AssertMsg(rc == KERN_SUCCESS, ("%#x", rc)); 134 134 break; 135 135 } 136 136 137 137 case RTR0MEMOBJTYPE_MAPPING: 138 138 { 139 139 /** @todo Figure out mapping... */ 140 140 } 141 142 /* unused: */ 141 142 /* unused: */ 143 143 case RTR0MEMOBJTYPE_LOW: 144 144 case RTR0MEMOBJTYPE_PHYS: … … 147 147 return VERR_INTERNAL_ERROR; 148 148 } 149 149 150 150 Assert(!pMemFreeBSD->pMappingObject); 151 151 … … 162 162 if (!pMemFreeBSD) 163 163 return VERR_NO_MEMORY; 164 165 /* 166 * We've two options here both expressed nicely by how kld allocates 167 * memory for the module bits: 168 * http://fxr.watson.org/fxr/source/kern/link_elf.c?v=RELENG62#L701 164 165 /* 166 * We've two options here both expressed nicely by how kld allocates 167 * memory for the module bits: 168 * http://fxr.watson.org/fxr/source/kern/link_elf.c?v=RELENG62#L701 169 169 */ 170 170 #if 0 … … 183 183 { 184 184 vm_offset_t MapAddress = vm_map_min(kernel_map); 185 rc = vm_map_find(kernel_map, /* map */ 185 rc = vm_map_find(kernel_map, /* map */ 186 186 pMemFreeBSD->pObject, /* object */ 187 187 0, /* offset */ … … 206 206 return VINF_SUCCESS; 207 207 } 208 208 209 209 vm_map_remove(kernel_map, 210 210 MapAddress, … … 218 218 rc = VERR_NO_MEMORY; 219 219 #endif 220 220 221 221 rtR0MemObjDelete(&pMemFreeBSD->Core); 222 222 return rc; … … 228 228 /* 229 229 * Try a Alloc first and see if we get luck, if not try contigmalloc. 230 * Might wish to try find our own pages or something later if this 231 * turns into a problemspot on AMD64 boxes. 230 * Might wish to try find our own pages or something later if this 231 * turns into a problemspot on AMD64 boxes. 232 232 */ 233 233 int rc = rtR0MemObjNativeAllocPage(ppMem, cb, fExecutable); … … 271 271 return VINF_SUCCESS; 272 272 } 273 273 274 274 NOREF(fExecutable); 275 275 rtR0MemObjDelete(&pMemFreeBSD->Core); … … 281 281 { 282 282 /** @todo check if there is a more appropriate API somewhere.. */ 283 283 284 284 /* create the object. */ 285 285 PRTR0MEMOBJFREEBSD pMemFreeBSD = (PRTR0MEMOBJFREEBSD)rtR0MemObjNew(sizeof(*pMemFreeBSD), RTR0MEMOBJTYPE_CONT, NULL, cb); … … 301 301 return VINF_SUCCESS; 302 302 } 303 303 304 304 rtR0MemObjDelete(&pMemFreeBSD->Core); 305 305 return VERR_NO_MEMORY; … … 330 330 if (!pMemFreeBSD) 331 331 return VERR_NO_MEMORY; 332 333 /* 334 * We could've used vslock here, but we don't wish to be subject to 332 333 /* 334 * We could've used vslock here, but we don't wish to be subject to 335 335 * resource usage restrictions, so we'll call vm_map_wire directly. 336 336 */ 337 rc = vm_map_wire(&((struct proc *)R0Process)->p_vmspace->vm_map, /* the map */ 337 rc = vm_map_wire(&((struct proc *)R0Process)->p_vmspace->vm_map, /* the map */ 338 338 (vm_offset_t)pv, /* start */ 339 339 (vm_offset_t)pv + cb, /* end */ … … 360 360 361 361 /* lock the memory */ 362 rc = vm_map_wire(kernel_map, /* the map */ 362 rc = vm_map_wire(kernel_map, /* the map */ 363 363 (vm_offset_t)pv, /* start */ 364 364 (vm_offset_t)pv + cb, /* end */ … … 377 377 /** 378 378 * Worker for the two virtual address space reservers. 379 * 379 * 380 380 * We're leaning on the examples provided by mmap and vm_mmap in vm_mmap.c here. 381 381 */ … … 383 383 { 384 384 int rc; 385 386 /* 385 386 /* 387 387 * The pvFixed address range must be within the VM space when specified. 388 388 */ … … 391 391 || (vm_offset_t)pvFixed + cb > vm_map_max(pMap))) 392 392 return VERR_INVALID_PARAMETER; 393 394 /* 395 * Create the object. 393 394 /* 395 * Create the object. 396 396 */ 397 397 PRTR0MEMOBJFREEBSD pMemFreeBSD = (PRTR0MEMOBJFREEBSD)rtR0MemObjNew(sizeof(*pMemFreeBSD), RTR0MEMOBJTYPE_RES_VIRT, NULL, cb); … … 412 412 MapAddress, 413 413 MapAddress + cb); 414 415 rc = vm_map_find(pMap, /* map */ 414 415 rc = vm_map_find(pMap, /* map */ 416 416 pMemFreeBSD->pObject, /* object */ 417 417 0, /* offset */ … … 425 425 { 426 426 if (R0Process != NIL_RTR0PROCESS) 427 { 427 { 428 428 rc = vm_map_inherit(pMap, 429 429 MapAddress, … … 444 444 rtR0MemObjDelete(&pMemFreeBSD->Core); 445 445 return rc; 446 446 447 447 } 448 448 … … 465 465 466 466 /* Phys: see pmap_mapdev in i386/i386/pmap.c (http://fxr.watson.org/fxr/source/i386/i386/pmap.c?v=RELENG62#L2860) */ 467 467 468 468 #if 0 469 469 /** @todo finish the implementation. */ … … 515 515 * Create a dummy mapping object for it. 516 516 * 517 * All mappings are read/write/execute in OS/2 and there isn't 517 * All mappings are read/write/execute in OS/2 and there isn't 518 518 * any cache options, so sharing is ok. And the main memory object 519 519 * isn't actually freed until all the mappings have been freed up … … 569 569 } 570 570 break; 571 #endif 571 #endif 572 572 return VERR_NOT_SUPPORTED; 573 573 … … 620 620 621 621 622 RTHCPHYS rtR0MemObjNativeGetPagePhysAddr(PRTR0MEMOBJINTERNAL pMem, unsignediPage)622 RTHCPHYS rtR0MemObjNativeGetPagePhysAddr(PRTR0MEMOBJINTERNAL pMem, size_t iPage) 623 623 { 624 624 PRTR0MEMOBJFREEBSD pMemFreeBSD = (PRTR0MEMOBJFREEBSD)pMem; … … 633 633 /* later */ 634 634 return NIL_RTHCPHYS; 635 } 635 } 636 636 } 637 637 case RTR0MEMOBJTYPE_PAGE: … … 640 640 return vtophys(pb); 641 641 } 642 642 643 643 case RTR0MEMOBJTYPE_CONT: 644 644 return pMemFreeBSD->Core.u.Cont.Phys + (iPage << PAGE_SHIFT);
Note:
See TracChangeset
for help on using the changeset viewer.