VirtualBox

Changeset 37575 in vbox


Ignore:
Timestamp:
Jun 21, 2011 12:40:01 PM (14 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
72417
Message:

IPRT/darwin-r0drv: Implemented RTMpPokeCpu and RTThreadPreemptIsPending/Trusty using the right kernel APIs.

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  
    3434#include <iprt/err.h>
    3535#include <iprt/assert.h>
     36#include <iprt/darwin/machkernel.h>
    3637#include "internal/initterm.h"
     38
    3739
    3840
     
    4143*******************************************************************************/
    4244/** Pointer to the lock group used by IPRT. */
    43 lck_grp_t *g_pDarwinLockGroup = NULL;
     45lck_grp_t                  *g_pDarwinLockGroup = NULL;
     46/** Pointer to the ast_pending function, if found. */
     47PFNR0DARWINASTPENDING       g_pfnR0DarwinAstPending = NULL;
     48/** Pointer to the cpu_interrupt function, if found. */
     49PFNR0DARWINCPUINTERRUPT     g_pfnR0DarwinCpuInterrupt = NULL;
    4450
    4551
     
    5662     */
    5763    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    }
    5885    if (RT_FAILURE(rc))
    5986        rtR0TermNative();
  • trunk/src/VBox/Runtime/r0drv/darwin/mach_kernel-r0drv-darwin.cpp

    r37573 r37575  
    3636# include <sys/kpi_mbuf.h>
    3737# include <net/kpi_interfacefilter.h>
     38# include <sys/kpi_socket.h>
     39# include <sys/kpi_socketfilter.h>
    3840RT_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>*/
    3948#endif
    4049
     
    5160# define NIL_RTFILE     ((RTFILENEW)-1)
    5261#endif
     62
    5363#include <iprt/asm.h>
    5464#include <iprt/assert.h>
     
    278288    RTFILENEWINT *pThis = hFile;
    279289    AssertPtrReturn(pThis, VERR_INVALID_HANDLE);
    280     AssertReturn(pThis->u32Magic != RTFILE_MAGIC, VERR_INVALID_HANDLE);
     290    AssertReturn(pThis->u32Magic == RTFILE_MAGIC, VERR_INVALID_HANDLE);
    281291    pThis->u32Magic = ~RTFILE_MAGIC;
    282292
     
    292302    RTFILENEWINT *pThis = hFile;
    293303    AssertPtrReturn(pThis, VERR_INVALID_HANDLE);
    294     AssertReturn(pThis->u32Magic != RTFILE_MAGIC, VERR_INVALID_HANDLE);
     304    AssertReturn(pThis->u32Magic == RTFILE_MAGIC, VERR_INVALID_HANDLE);
    295305
    296306    off_t offNative = (off_t)off;
     
    454464
    455465        /* BSDKernel: */
    456         //KNOWN_ENTRY(buf_size),
     466        KNOWN_ENTRY(buf_size),
    457467        KNOWN_ENTRY(copystr),
    458         //KNOWN_ENTRY(current_proc),
     468        KNOWN_ENTRY(current_proc),
    459469        KNOWN_ENTRY(ifnet_hdrlen),
    460470        KNOWN_ENTRY(ifnet_set_promiscuous),
     
    465475        KNOWN_ENTRY(kauth_cred_rele),
    466476#endif
    467         //KNOWN_ENTRY(mbuf_data),
     477        KNOWN_ENTRY(mbuf_data),
    468478        KNOWN_ENTRY(msleep),
    469479        KNOWN_ENTRY(nanotime),
    470         //KNOWN_ENTRY(nop_close),
     480        KNOWN_ENTRY(nop_close),
    471481        KNOWN_ENTRY(proc_pid),
    472         //KNOWN_ENTRY(sock_accept),
    473         //KNOWN_ENTRY(sockopt_name),
     482        KNOWN_ENTRY(sock_accept),
     483        KNOWN_ENTRY(sockopt_name),
    474484        //KNOWN_ENTRY(spec_write),
    475         //KNOWN_ENTRY(suword),
     485        KNOWN_ENTRY(suword),
    476486        //KNOWN_ENTRY(sysctl_int),
    477487        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),
    487497        KNOWN_ENTRY(wakeup),
    488498        KNOWN_ENTRY(wakeup_one),
  • trunk/src/VBox/Runtime/r0drv/darwin/mp-r0drv-darwin.cpp

    r37054 r37575  
    265265    RT_ASSERT_INTS_ON();
    266266
    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  
    55
    66/*
    7  * Copyright (C) 2006-2007 Oracle Corporation
     7 * Copyright (C) 2006-2011 Oracle Corporation
    88 *
    99 * This file is part of VirtualBox Open Source Edition (OSE), as
     
    152152 * Internals of the Darwin Ring-0 IPRT.
    153153 */
     154RT_C_DECLS_BEGIN
    154155
    155 RT_C_DECLS_BEGIN
    156 extern lck_grp_t *g_pDarwinLockGroup;
     156/* initterm-r0drv-darwin.cpp. */
     157typedef uint32_t *  (*PFNR0DARWINASTPENDING)(void);
     158typedef void        (*PFNR0DARWINCPUINTERRUPT)(int);
     159extern lck_grp_t                  *g_pDarwinLockGroup;
     160extern PFNR0DARWINASTPENDING       g_pfnR0DarwinAstPending;
     161extern PFNR0DARWINCPUINTERRUPT     g_pfnR0DarwinCpuInterrupt;
     162
     163/* threadpreempt-r0drv-darwin.cpp */
    157164int  rtThreadPreemptDarwinInit(void);
    158165void rtThreadPreemptDarwinTerm(void);
     166
    159167RT_C_DECLS_END
    160168
  • trunk/src/VBox/Runtime/r0drv/darwin/threadpreempt-r0drv-darwin.cpp

    r37055 r37575  
    105105RTDECL(bool) RTThreadPreemptIsPending(RTTHREAD hThread)
    106106{
    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;
    108111
    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;
    120114}
    121115
     
    124118{
    125119    /* yes, we think that RTThreadPreemptIsPending is reliable... */
    126     return true;
     120    return g_pfnR0DarwinAstPending != NULL;
    127121}
    128122
Note: See TracChangeset for help on using the changeset viewer.

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