Changeset 37569 in vbox for trunk/src/VBox/Runtime
- Timestamp:
- Jun 21, 2011 10:19:16 AM (14 years ago)
- svn:sync-xref-src-repo-rev:
- 72411
- Location:
- trunk/src/VBox/Runtime/r0drv/darwin
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Runtime/r0drv/darwin/mach_kernel-r0drv-darwin.cpp
r37568 r37569 40 40 #include "../../include/internal/iprt.h" 41 41 42 #if 0//def IN_RING0 /* till RTFILE is changed in types.h */42 #ifdef IN_RING0 /* till RTFILE is changed in types.h */ 43 43 # include <iprt/types.h> 44 44 typedef struct RTFILENEWINT *RTFILENEW; … … 174 174 175 175 176 #if 0//def IN_RING0 176 #ifdef IN_RING0 177 178 /** Default file permissions for newly created files. */ 179 #if defined(S_IRUSR) && defined(S_IWUSR) 180 # define RT_FILE_PERMISSION (S_IRUSR | S_IWUSR) 181 #else 182 # define RT_FILE_PERMISSION (00600) 183 #endif 184 185 /** 186 * Darwin kernel file handle data. 187 */ 188 typedef struct RTFILENEWINT 189 { 190 /** Magic value (RTFILE_MAGIC). */ 191 uint32_t u32Magic; 192 /** The open mode flags passed to the kernel API. */ 193 int fOpenMode; 194 /** The open flags passed to RTFileOpen. */ 195 uint64_t fOpen; 196 /** The VFS context in which the file was opened. */ 197 vfs_context_t hVfsCtx; 198 /** The vnode returned by vnode_open. */ 199 vnode_t hVnode; 200 } RTFILENEWINT; 201 /** Magic number for RTFILENEWINT::u32Magic (To Be Determined). */ 202 #define RTFILE_MAGIC UINT32_C(0x01020304) 203 177 204 178 205 RTDECL(int) RTFileOpen(PRTFILE phFile, const char *pszFilename, uint32_t fOpen) 179 206 { 180 vfs_context_t hVfsCtx = vfs_context_current(); 181 int fCMode = (fOpen & RTFILE_O_CREATE_MODE_MASK) 182 ? (fOpen & RTFILE_O_CREATE_MODE_MASK) >> RTFILE_O_CREATE_MODE_SHIFT 183 : RT_FILE_PERMISSION; 184 int fVnFlags = 0; /* VNODE_LOOKUP_XXX */ 185 186 int fOpenMode = 0; 187 if (fOpen & RTFILE_O_NON_BLOCK) 188 fOpenMode |= O_NONBLOCK; 189 if (fOpen & RTFILE_O_WRITE_THROUGH) 190 fOpenMode |= O_SYNC; 191 192 /* create/truncate file */ 193 switch (fOpen & RTFILE_O_ACTION_MASK) 207 RTFILENEWINT *pThis = (RTFILENEWINT *)RTMemAllocZ(sizeof(*pThis)); 208 if (!pThis) 209 return VERR_NO_MEMORY; 210 211 errno_t rc; 212 pThis->u32Magic = RTFILE_MAGIC; 213 pThis->fOpen = fOpen; 214 pThis->hVfsCtx = vfs_context_current(); 215 if (pThis->hVfsCtx != NULL) 194 216 { 195 case RTFILE_O_OPEN: break; 196 case RTFILE_O_OPEN_CREATE: fOpenMode |= O_CREAT; break; 197 case RTFILE_O_CREATE: fOpenMode |= O_CREAT | O_EXCL; break; 198 case RTFILE_O_CREATE_REPLACE: fOpenMode |= O_CREAT | O_TRUNC; break; /** @todo replacing needs fixing, this is *not* a 1:1 mapping! */ 217 int fCMode = (fOpen & RTFILE_O_CREATE_MODE_MASK) 218 ? (fOpen & RTFILE_O_CREATE_MODE_MASK) >> RTFILE_O_CREATE_MODE_SHIFT 219 : RT_FILE_PERMISSION; 220 int fVnFlags = 0; /* VNODE_LOOKUP_XXX */ 221 int fOpenMode = 0; 222 if (fOpen & RTFILE_O_NON_BLOCK) 223 fOpenMode |= O_NONBLOCK; 224 if (fOpen & RTFILE_O_WRITE_THROUGH) 225 fOpenMode |= O_SYNC; 226 227 /* create/truncate file */ 228 switch (fOpen & RTFILE_O_ACTION_MASK) 229 { 230 case RTFILE_O_OPEN: break; 231 case RTFILE_O_OPEN_CREATE: fOpenMode |= O_CREAT; break; 232 case RTFILE_O_CREATE: fOpenMode |= O_CREAT | O_EXCL; break; 233 case RTFILE_O_CREATE_REPLACE: fOpenMode |= O_CREAT | O_TRUNC; break; /** @todo replacing needs fixing, this is *not* a 1:1 mapping! */ 234 } 235 if (fOpen & RTFILE_O_TRUNCATE) 236 fOpenMode |= O_TRUNC; 237 238 switch (fOpen & RTFILE_O_ACCESS_MASK) 239 { 240 case RTFILE_O_READ: 241 fOpenMode |= FREAD; 242 break; 243 case RTFILE_O_WRITE: 244 fOpenMode |= fOpen & RTFILE_O_APPEND ? O_APPEND | FWRITE : FWRITE; 245 break; 246 case RTFILE_O_READWRITE: 247 fOpenMode |= fOpen & RTFILE_O_APPEND ? O_APPEND | FWRITE | FREAD : FWRITE | FREAD; 248 break; 249 default: 250 AssertMsgFailed(("RTFileOpen received an invalid RW value, fOpen=%#x\n", fOpen)); 251 return VERR_INVALID_PARAMETER; 252 } 253 254 pThis->fOpenMode = fOpenMode; 255 rc = vnode_open(pszFilename, fOpenMode, fCMode, fVnFlags, &pThis->hVnode, pThis->hVfsCtx); 256 if (rc == 0) 257 { 258 *phFile = pThis; 259 return VINF_SUCCESS; 260 } 261 262 rc = RTErrConvertFromErrno(rc); 199 263 } 200 if (fOpen & RTFILE_O_TRUNCATE) 201 fOpenMode |= O_TRUNC; 202 203 switch (fOpen & RTFILE_O_ACCESS_MASK) 204 { 205 case RTFILE_O_READ: 206 fOpenMode |= FREAD 207 break; 208 case RTFILE_O_WRITE: 209 fOpenMode |= fOpen & RTFILE_O_APPEND ? O_APPEND | FWRITE : FWRITE; 210 break; 211 case RTFILE_O_READWRITE: 212 fOpenMode |= fOpen & RTFILE_O_APPEND ? O_APPEND | FWRITE | FREAD : FWRITE | FREAD; 213 break; 214 default: 215 AssertMsgFailed(("RTFileOpen received an invalid RW value, fOpen=%#x\n", fOpen)); 216 return VERR_INVALID_PARAMETER; 217 } *phFile = (RTFILENEW)hVnode; 218 219 220 vnode_t hVnode = NULL; 221 errno_t rc = vnode_open(pszFilename, fOpenMode, fCMode, fVnFlags, &hVnode, hVfsCtx) 222 if (rc != 0) 223 return RTErrConvertFromErrno(rc); 224 225 vnode_put(hVnode); 226 *phFile = (RTFILENEW)hVnode; 227 return VINF_SUCCESS; 264 else 265 rc = VERR_INTERNAL_ERROR_5; 266 RTMemFree(pThis); 267 268 return rc; 228 269 } 229 270 … … 233 274 if (hFile == NIL_RTFILE) 234 275 return VINF_SUCCESS; 235 vnode_t hVnode = (vnode_t)hFile; 236 errno_t rc = vnode_close(hVnode, vfs_context_current()); 276 277 RTFILENEWINT *pThis = hFile; 278 AssertPtrReturn(pThis, VERR_INVALID_HANDLE); 279 AssertReturn(pThis->u32Magic != RTFILE_MAGIC, VERR_INVALID_HANDLE); 280 pThis->u32Magic = ~RTFILE_MAGIC; 281 282 errno_t rc = vnode_close(pThis->hVnode, pThis->fOpenMode & (FREAD | FWRITE), pThis->hVfsCtx); 283 284 RTMemFree(pThis); 237 285 return RTErrConvertFromErrno(rc); 238 286 } … … 241 289 RTDECL(int) RTFileReadAt(RTFILE hFile, RTFOFF off, void *pvBuf, size_t cbToRead, size_t *pcbRead) 242 290 { 243 return VERR_NOT_IMPLEMENTED; 291 RTFILENEWINT *pThis = hFile; 292 AssertPtrReturn(pThis, VERR_INVALID_HANDLE); 293 AssertReturn(pThis->u32Magic != RTFILE_MAGIC, VERR_INVALID_HANDLE); 294 295 off_t offNative = (off_t)off; 296 AssertReturn((RTFOFF)offNative == off, VERR_OUT_OF_RANGE); 297 298 299 errno_t rc; 300 if (!pcbRead) 301 rc = vn_rdwr(UIO_READ, pThis->hVnode, (char *)pvBuf, cbToRead, offNative, UIO_SYSSPACE, 0 /*ioflg*/, 302 vfs_context_ucred(pThis->hVfsCtx), NULL, vfs_context_proc(pThis->hVfsCtx)); 303 else 304 { 305 int cbLeft = 0; 306 rc = vn_rdwr(UIO_READ, pThis->hVnode, (char *)pvBuf, cbToRead, offNative, UIO_SYSSPACE, 0 /*ioflg*/, 307 vfs_context_ucred(pThis->hVfsCtx), &cbLeft, vfs_context_proc(pThis->hVfsCtx)); 308 *pcbRead = cbToRead - cbLeft; 309 } 310 return !rc ? VINF_SUCCESS : RTErrConvertFromErrno(rc); 244 311 } 245 312 … … 324 391 325 392 /** 326 * Check the symbol table against symbols we known symbols. 327 * 328 * This is done to detect whether the on disk image and the in 329 * memory images matches. Mismatches could stem from user 393 * Check the symbol table against symbols we known symbols. 394 * 395 * This is done to detect whether the on disk image and the in 396 * memory images matches. Mismatches could stem from user 330 397 * replacing the default kernel image on disk. 331 * 398 * 332 399 * @returns IPRT status code. 333 400 * @param pKernel The internal scratch data. … … 411 478 #if MAC_OS_X_VERSION_MIN_REQUIRED >= 1050 412 479 KNOWN_ENTRY(kauth_cred_unref), 413 #else 480 #else 414 481 KNOWN_ENTRY(kauth_cred_rele), 415 482 #endif … … 539 606 if (pSym->n_sect != MACHO_NO_SECT) 540 607 #else 541 if (pSym->n_sect > pKernel->cSections) 608 if (pSym->n_sect > pKernel->cSections) 542 609 #endif 543 610 RETURN_VERR_BAD_EXE_FORMAT; … … 901 968 902 969 /** 903 * Opens symbol table of the mach_kernel. 904 * 970 * Opens symbol table of the mach_kernel. 971 * 905 972 * @returns IPRT status code. 906 973 * @param pszMachKernel The path to the mach_kernel image. 907 * @param ppHandle Where to return a handle on success. 974 * @param ppHandle Where to return a handle on success. 908 975 * Call rtR0DarwinMachKernelClose on it 909 976 * when done. -
trunk/src/VBox/Runtime/r0drv/darwin/the-darwin-kernel.h
r37041 r37569 68 68 #include <sys/malloc.h> 69 69 #include <sys/proc.h> 70 #include <sys/vnode.h> 71 #include <sys/fcntl.h> 70 72 #include <IOKit/IOTypes.h> 71 73 #include <IOKit/IOLib.h>
Note:
See TracChangeset
for help on using the changeset viewer.