VirtualBox

Ignore:
Timestamp:
May 26, 2010 9:13:49 PM (15 years ago)
Author:
vboxsync
Message:

alloc-r0drv-freebsd.c: Simplify the allocation of executable memory for amd64. We have to use a vm object or vm_map_remove doesn't free the allocated pages

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Runtime/r0drv/freebsd/alloc-r0drv-freebsd.c

    r29765 r29831  
    6262    if (fFlags & RTMEMHDR_FLAG_EXEC)
    6363    {
     64# if USE_KMEM_ALLOC_PROT
     65        pHdr = (PRTMEMHDR)kmem_alloc_prot(kernel_map, cb + sizeof(*pHdr),
     66                                          VM_PROT_ALL, VM_PROT_ALL, KERNBASE);
     67# else
     68        vm_object_t pVmObject = NULL;
    6469        vm_offset_t Addr = KERNBASE;
    6570        cbAllocated = RT_ALIGN_Z(cb + sizeof(*pHdr), PAGE_SIZE);
    6671
     72        pVmObject = vm_object_allocate(OBJT_DEFAULT, cbAllocated >> PAGE_SHIFT);
     73        if (!pVmObject)
     74            return NULL;
     75
    6776        /* Addr contains a start address vm_map_find will start searching for suitable space at. */
    68         int rc = vm_map_find(kernel_map, NULL, 0, &Addr,
    69                              cbAllocated,
    70                              TRUE, VM_PROT_ALL, VM_PROT_ALL, 0);
     77        int rc = vm_map_find(kernel_map, pVmObject, 0, &Addr,
     78                             cbAllocated, TRUE, VM_PROT_ALL, VM_PROT_ALL, 0);
    7179        if (rc == KERN_SUCCESS)
    7280        {
    73             /* Add the pages. */
    74             vm_offset_t AddressDst = Addr;
    75             bool fSuccess = true;
    76 
    77             do
    78             {
    79                 vm_page_t pPage;
    80 
    81                 pPage = vm_page_alloc(NULL, 0,
    82                                       VM_ALLOC_NOBUSY | VM_ALLOC_SYSTEM |
    83                                       VM_ALLOC_WIRED  | VM_ALLOC_NOOBJ);
    84                 if (pPage)
    85                 {
    86                     /* Put the page into the page table now. */
    87                     MY_PMAP_ENTER(kernel_map->pmap, AddressDst, pPage, VM_PROT_ALL,
    88                                   TRUE);
    89                 }
    90                 else
    91                 {
    92                     /*
    93                      * Allocation failed. vm_map_remove will remove any
    94                      * page already allocated.
    95                      */
    96                     fSuccess = false;
    97                     break;
    98                 }
    99                 AddressDst += PAGE_SIZE;
    100             } while(AddressDst < (Addr + cbAllocated));
    101 
    102             if (fSuccess)
     81            rc = vm_map_wire(kernel_map, Addr, Addr + cbAllocated,
     82                             VM_MAP_WIRE_SYSTEM | VM_MAP_WIRE_NOHOLES);
     83            if (rc == KERN_SUCCESS)
    10384            {
    10485                pHdr = (PRTMEMHDR)Addr;
     
    11091                vm_map_remove(kernel_map,
    11192                              Addr,
    112                               Addr + cb);
     93                              Addr + cbAllocated);
    11394        }
     95        else
     96            vm_object_deallocate(pVmObject);
     97# endif
    11498    }
    11599    else
     
    138122#ifdef RT_ARCH_AMD64
    139123    if (pHdr->fFlags & RTMEMHDR_FLAG_EXEC)
     124# if USE_KMEM_ALLOC_PROT
     125        kmem_free(kernel_map, (vm_offset_t)pHdr, pHdr->cb);
     126# else
    140127        vm_map_remove(kernel_map, (vm_offset_t)pHdr, ((vm_offset_t)pHdr) + pHdr->cb);
     128# endif
    141129    else
    142130#endif
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette