Changeset 41146 in vbox for trunk/src/VBox/Runtime/r0drv/solaris
- Timestamp:
- May 3, 2012 8:14:02 PM (13 years ago)
- svn:sync-xref-src-repo-rev:
- 77763
- Location:
- trunk/src/VBox/Runtime/r0drv/solaris
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Runtime/r0drv/solaris/memobj-r0drv-solaris.c
r41081 r41146 43 43 #include "memobj-r0drv-solaris.h" 44 44 45 /******************************************************************************* 46 * Defined Constants And Macros * 47 *******************************************************************************/ 45 48 #define SOL_IS_KRNL_ADDR(vx) ((uintptr_t)(vx) >= kernelbase) 46 static vnode_t s_PageVnode; 49 47 50 48 51 /******************************************************************************* … … 68 71 69 72 73 /******************************************************************************* 74 * Global Variables * 75 *******************************************************************************/ 76 static vnode_t g_PageVnode; 77 78 70 79 /** 71 80 * Returns the physical address for a virtual address. … … 125 134 seg_t KernelSeg; 126 135 KernelSeg.s_as = &kas; 127 page_t *pPage = page_get_freelist(& s_PageVnode, 0 /* offset */, &KernelSeg, virtAddr,136 page_t *pPage = page_get_freelist(&g_PageVnode, 0 /* offset */, &KernelSeg, virtAddr, 128 137 cbPage, 0 /* flags */, NULL /* NUMA group */); 129 138 if ( !pPage 130 139 && g_frtSolUseKflt) 131 140 { 132 pPage = page_get_freelist(& s_PageVnode, 0 /* offset */, &KernelSeg, virtAddr,141 pPage = page_get_freelist(&g_PageVnode, 0 /* offset */, &KernelSeg, virtAddr, 133 142 cbPage, PG_KFLT, NULL /* NUMA group */); 134 143 } … … 150 159 seg_t KernelSeg; 151 160 KernelSeg.s_as = &kas; 152 page_t *pPage = page_get_cachelist(& s_PageVnode, 0 /* offset */, &KernelSeg, virtAddr,161 page_t *pPage = page_get_cachelist(&g_PageVnode, 0 /* offset */, &KernelSeg, virtAddr, 153 162 0 /* flags */, NULL /* NUMA group */); 154 163 if ( !pPage 155 164 && g_frtSolUseKflt) 156 165 { 157 pPage = page_get_cachelist(& s_PageVnode, 0 /* offset */, &KernelSeg, virtAddr,166 pPage = page_get_cachelist(&g_PageVnode, 0 /* offset */, &KernelSeg, virtAddr, 158 167 PG_KFLT, NULL /* NUMA group */); 159 168 } … … 917 926 unsigned fProt, size_t offSub, size_t cbSub) 918 927 { 919 /** @todo rtR0MemObjNativeMapKernel / Solaris - Should be fairly simple alloc kernel memory and memload it. */ 920 return VERR_NOT_SUPPORTED; 928 /* Fail if requested to do something we can't. */ 929 AssertMsgReturn(pvFixed == (void *)-1, ("%p\n", pvFixed), VERR_NOT_SUPPORTED); 930 if (uAlignment > PAGE_SIZE) 931 return VERR_NOT_SUPPORTED; 932 933 /* 934 * Use xalloc to get address space. 935 */ 936 if (!cbSub) 937 cbSub = pMemToMap->cb; 938 void *pv = vmem_xalloc(heap_arena, cbSub, uAlignment, 0 /* phase */, 0 /* nocross */, 939 NULL /* minaddr */, NULL /* maxaddr */, VM_SLEEP); 940 if (RT_UNLIKELY(!pv)) 941 return VERR_MAP_FAILED; 942 943 /* 944 * Load the pages from the other object into it. 945 */ 946 uint32_t fAttr = HAT_UNORDERED_OK | HAT_MERGING_OK | HAT_LOADCACHING_OK | HAT_STORECACHING_OK; 947 if (fProt & RTMEM_PROT_READ) 948 fAttr |= PROT_READ; 949 if (fProt & RTMEM_PROT_EXEC) 950 fAttr |= PROT_EXEC; 951 if (fProt & RTMEM_PROT_WRITE) 952 fAttr |= PROT_WRITE; 953 fAttr |= HAT_NOSYNC; 954 955 int rc = VINF_SUCCESS; 956 size_t off = 0; 957 while (off < cbSub) 958 { 959 RTHCPHYS HCPhys = rtR0MemObjNativeGetPagePhysAddr(pMemToMap, (offSub + offSub) >> PAGE_SHIFT); 960 AssertBreakStmt(HCPhys != NIL_RTHCPHYS, rc = VERR_INTERNAL_ERROR_2); 961 pfn_t pfn = HCPhys >> PAGESHIFT; 962 AssertBreakStmt(((RTHCPHYS)pfn << PAGESHIFT) == HCPhys, rc = VERR_INTERNAL_ERROR_3); 963 964 hat_devload(kas.a_hat, (uint8_t *)pv + off, PAGE_SIZE, pfn, fAttr, HAT_LOAD_LOCK); 965 966 /* Advance. */ 967 off += PAGE_SIZE; 968 } 969 if (RT_SUCCESS(rc)) 970 { 971 /* 972 * Create a memory object for the mapping. 973 */ 974 PRTR0MEMOBJSOL pMemSolaris = (PRTR0MEMOBJSOL)rtR0MemObjNew(sizeof(*pMemSolaris), RTR0MEMOBJTYPE_MAPPING, pv, cbSub); 975 if (pMemSolaris) 976 { 977 pMemSolaris->Core.u.Mapping.R0Process = NIL_RTR0PROCESS; 978 *ppMem = &pMemSolaris->Core; 979 return VINF_SUCCESS; 980 } 981 982 LogRel(("rtR0MemObjNativeMapKernel failed to alloc memory object.\n")); 983 rc = VERR_NO_MEMORY; 984 } 985 986 if (off) 987 hat_unload(kas.a_hat, pv, off, HAT_UNLOAD | HAT_UNLOAD_UNLOCK); 988 vmem_xfree(heap_arena, pv, cbSub); 989 return rc; 921 990 } 922 991 -
trunk/src/VBox/Runtime/r0drv/solaris/memobj-r0drv-solaris.h
r40968 r41146 293 293 }; 294 294 295 #endif /* ___r0drv_solaris_memobj_r0drv_solaris_h */ 296 295 #endif /* !___r0drv_solaris_memobj_r0drv_solaris_h */ 296 297
Note:
See TracChangeset
for help on using the changeset viewer.