Changeset 37575 in vbox
- Timestamp:
- Jun 21, 2011 12:40:01 PM (14 years ago)
- svn:sync-xref-src-repo-rev:
- 72417
- Location:
- trunk/src/VBox/Runtime/r0drv/darwin
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Runtime/r0drv/darwin/initterm-r0drv-darwin.cpp
r36555 r37575 34 34 #include <iprt/err.h> 35 35 #include <iprt/assert.h> 36 #include <iprt/darwin/machkernel.h> 36 37 #include "internal/initterm.h" 38 37 39 38 40 … … 41 43 *******************************************************************************/ 42 44 /** Pointer to the lock group used by IPRT. */ 43 lck_grp_t *g_pDarwinLockGroup = NULL; 45 lck_grp_t *g_pDarwinLockGroup = NULL; 46 /** Pointer to the ast_pending function, if found. */ 47 PFNR0DARWINASTPENDING g_pfnR0DarwinAstPending = NULL; 48 /** Pointer to the cpu_interrupt function, if found. */ 49 PFNR0DARWINCPUINTERRUPT g_pfnR0DarwinCpuInterrupt = NULL; 44 50 45 51 … … 56 62 */ 57 63 int rc = rtThreadPreemptDarwinInit(); 64 if (RT_SUCCESS(rc)) 65 { 66 /* 67 * Try resolve kernel symbols we need but apple don't wish to give us. 68 */ 69 RTR0MACHKERNEL hKernel; 70 rc = RTR0MachKernelOpen("/mach_kernel", &hKernel); 71 if (RT_SUCCESS(rc)) 72 { 73 RTR0MachKernelGetSymbol(hKernel, "ast_pending", (void **)&g_pfnR0DarwinAstPending); 74 printf("ast_pending=%p\n", g_pfnR0DarwinAstPending); 75 RTR0MachKernelGetSymbol(hKernel, "cpu_interrupt", (void **)&g_pfnR0DarwinCpuInterrupt); 76 printf("cpu_interrupt=%p\n", g_pfnR0DarwinCpuInterrupt); 77 RTR0MachKernelClose(hKernel); 78 } 79 if (RT_FAILURE(rc)) 80 { 81 printf("rtR0InitNative: warning! failed to resolve special kernel symbols\n"); 82 rc = VINF_SUCCESS; 83 } 84 } 58 85 if (RT_FAILURE(rc)) 59 86 rtR0TermNative(); -
trunk/src/VBox/Runtime/r0drv/darwin/mach_kernel-r0drv-darwin.cpp
r37573 r37575 36 36 # include <sys/kpi_mbuf.h> 37 37 # include <net/kpi_interfacefilter.h> 38 # include <sys/kpi_socket.h> 39 # include <sys/kpi_socketfilter.h> 38 40 RT_C_DECLS_END 41 # include <sys/buf.h> 42 # include <sys/vm.h> 43 # include <sys/vnode_if.h> 44 /*# include <sys/sysctl.h>*/ 45 # include <sys/systm.h> 46 # include <vfs/vfs_support.h> 47 /*# include <miscfs/specfs/specdev.h>*/ 39 48 #endif 40 49 … … 51 60 # define NIL_RTFILE ((RTFILENEW)-1) 52 61 #endif 62 53 63 #include <iprt/asm.h> 54 64 #include <iprt/assert.h> … … 278 288 RTFILENEWINT *pThis = hFile; 279 289 AssertPtrReturn(pThis, VERR_INVALID_HANDLE); 280 AssertReturn(pThis->u32Magic != RTFILE_MAGIC, VERR_INVALID_HANDLE);290 AssertReturn(pThis->u32Magic == RTFILE_MAGIC, VERR_INVALID_HANDLE); 281 291 pThis->u32Magic = ~RTFILE_MAGIC; 282 292 … … 292 302 RTFILENEWINT *pThis = hFile; 293 303 AssertPtrReturn(pThis, VERR_INVALID_HANDLE); 294 AssertReturn(pThis->u32Magic != RTFILE_MAGIC, VERR_INVALID_HANDLE);304 AssertReturn(pThis->u32Magic == RTFILE_MAGIC, VERR_INVALID_HANDLE); 295 305 296 306 off_t offNative = (off_t)off; … … 454 464 455 465 /* BSDKernel: */ 456 //KNOWN_ENTRY(buf_size),466 KNOWN_ENTRY(buf_size), 457 467 KNOWN_ENTRY(copystr), 458 //KNOWN_ENTRY(current_proc),468 KNOWN_ENTRY(current_proc), 459 469 KNOWN_ENTRY(ifnet_hdrlen), 460 470 KNOWN_ENTRY(ifnet_set_promiscuous), … … 465 475 KNOWN_ENTRY(kauth_cred_rele), 466 476 #endif 467 //KNOWN_ENTRY(mbuf_data),477 KNOWN_ENTRY(mbuf_data), 468 478 KNOWN_ENTRY(msleep), 469 479 KNOWN_ENTRY(nanotime), 470 //KNOWN_ENTRY(nop_close),480 KNOWN_ENTRY(nop_close), 471 481 KNOWN_ENTRY(proc_pid), 472 //KNOWN_ENTRY(sock_accept),473 //KNOWN_ENTRY(sockopt_name),482 KNOWN_ENTRY(sock_accept), 483 KNOWN_ENTRY(sockopt_name), 474 484 //KNOWN_ENTRY(spec_write), 475 //KNOWN_ENTRY(suword),485 KNOWN_ENTRY(suword), 476 486 //KNOWN_ENTRY(sysctl_int), 477 487 KNOWN_ENTRY(uio_rw), 478 //KNOWN_ENTRY(vfs_flags),479 //KNOWN_ENTRY(vfs_name),480 //KNOWN_ENTRY(vfs_statfs),481 //KNOWN_ENTRY(vn_rdwr),482 //KNOWN_ENTRY(vnode_get),483 //KNOWN_ENTRY(vnode_open),484 //KNOWN_ENTRY(vnode_ref),485 //KNOWN_ENTRY(vnode_rele),486 //KNOWN_ENTRY(vnop_close_desc),488 KNOWN_ENTRY(vfs_flags), 489 KNOWN_ENTRY(vfs_name), 490 KNOWN_ENTRY(vfs_statfs), 491 KNOWN_ENTRY(vn_rdwr), 492 KNOWN_ENTRY(vnode_get), 493 KNOWN_ENTRY(vnode_open), 494 KNOWN_ENTRY(vnode_ref), 495 KNOWN_ENTRY(vnode_rele), 496 KNOWN_ENTRY(vnop_close_desc), 487 497 KNOWN_ENTRY(wakeup), 488 498 KNOWN_ENTRY(wakeup_one), -
trunk/src/VBox/Runtime/r0drv/darwin/mp-r0drv-darwin.cpp
r37054 r37575 265 265 RT_ASSERT_INTS_ON(); 266 266 267 /* no unicast IPI */ 268 return VERR_NOT_SUPPORTED; 269 } 270 267 if (g_pfnR0DarwinCpuInterrupt == NULL) 268 return VERR_NOT_SUPPORTED; 269 g_pfnR0DarwinCpuInterrupt(idCpu); 270 return VINF_SUCCESS; 271 } 272 -
trunk/src/VBox/Runtime/r0drv/darwin/the-darwin-kernel.h
r37569 r37575 5 5 6 6 /* 7 * Copyright (C) 2006-20 07Oracle Corporation7 * Copyright (C) 2006-2011 Oracle Corporation 8 8 * 9 9 * This file is part of VirtualBox Open Source Edition (OSE), as … … 152 152 * Internals of the Darwin Ring-0 IPRT. 153 153 */ 154 RT_C_DECLS_BEGIN 154 155 155 RT_C_DECLS_BEGIN 156 extern lck_grp_t *g_pDarwinLockGroup; 156 /* initterm-r0drv-darwin.cpp. */ 157 typedef uint32_t * (*PFNR0DARWINASTPENDING)(void); 158 typedef void (*PFNR0DARWINCPUINTERRUPT)(int); 159 extern lck_grp_t *g_pDarwinLockGroup; 160 extern PFNR0DARWINASTPENDING g_pfnR0DarwinAstPending; 161 extern PFNR0DARWINCPUINTERRUPT g_pfnR0DarwinCpuInterrupt; 162 163 /* threadpreempt-r0drv-darwin.cpp */ 157 164 int rtThreadPreemptDarwinInit(void); 158 165 void rtThreadPreemptDarwinTerm(void); 166 159 167 RT_C_DECLS_END 160 168 -
trunk/src/VBox/Runtime/r0drv/darwin/threadpreempt-r0drv-darwin.cpp
r37055 r37575 105 105 RTDECL(bool) RTThreadPreemptIsPending(RTTHREAD hThread) 106 106 { 107 Assert(hThread == NIL_RTTHREAD); 107 if (!g_pfnR0DarwinAstPending) 108 return false; 109 uint32_t volatile *pfAstPending = g_pfnR0DarwinAstPending(); AssertPtr(pfAstPending); 110 uint32_t const fAstPending = *pfAstPending; 108 111 109 /* HACK ALERT! This ASSUMES that the cpu_pending_ast member of cpu_data_t doesn't move. */ 110 uint32_t ast_pending; 111 #if defined(RT_ARCH_X86) || defined(RT_ARCH_AMD64) 112 __asm__ volatile("movl %%gs:%P1,%0\n\t" 113 : "=r" (ast_pending) 114 : "i" (__builtin_offsetof(struct my_cpu_data_x86, cpu_pending_ast)) ); 115 #else 116 # error "Port me" 117 #endif 118 AssertMsg(!(ast_pending & UINT32_C(0xfffff000)),("%#x\n", ast_pending)); 119 return (ast_pending & (AST_PREEMPT | AST_URGENT)) != 0; 112 AssertMsg(!(fAstPending & UINT32_C(0xfffff000)), ("%#x\n", fAstPending)); 113 return (fAstPending & (AST_PREEMPT | AST_URGENT)) != 0; 120 114 } 121 115 … … 124 118 { 125 119 /* yes, we think that RTThreadPreemptIsPending is reliable... */ 126 return true;120 return g_pfnR0DarwinAstPending != NULL; 127 121 } 128 122
Note:
See TracChangeset
for help on using the changeset viewer.