VirtualBox

Changeset 53641 in vbox for trunk/src/VBox/ExtPacks


Ignore:
Timestamp:
Jan 2, 2015 12:14:42 PM (10 years ago)
Author:
vboxsync
Message:

VBoxDTrace: Made it to line 11272. (r11)

Location:
trunk/src/VBox/ExtPacks/VBoxDTrace
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/ExtPacks/VBoxDTrace/include/VBoxDTraceTypes.h

    r53640 r53641  
    5858    zoneid_t                cr_zone;
    5959} cred_t;
    60 
    61 typedef struct VBoxDtVMem       vmem_t;
     60#define PRIV_POLICY_ONLY(a_pCred, a_uPriv, a_fAll) (true)
     61#define crgetuid(a_pCred)       ((a_pCred)->cr_uid)
     62#define crgetzoneid(a_pCred)    ((a_pCred)->cr_zone)
     63
     64
    6265typedef struct VBoxDtCyclicId  *cyclic_id_t;
    6366
     
    7881{
    7982    uint32_t                p_flag;
     83    struct dtrace_helpers  *p_dtrace_helpers;
    8084} proc_t;
     85proc_t *VBoxDtGetCurrentProc(void);
     86#define curproc                     (VBoxDtGetCurrentProc())
    8187
    8288#define SNOCD                   RT_BIT(0)
     
    9197    RTSPINLOCK hSpinlock;
    9298} kmutex_t;
     99#define mutex_enter             VBoxDtMutexEnter
     100#define mutex_exit              VBoxDtMutexExit
     101#define MUTEX_HELD(a_pMtx)      VBoxDtMutexIsOwner(a_pMtx)
     102#define mod_lock                g_DummyMtx
     103#define cpu_lock                g_DummyMtx
     104void VBoxDtMutexEnter(struct VBoxDtMutex *pMtx);
     105void VBoxDtMutexExit(struct VBoxDtMutex *pMtx);
     106bool VBoxDtMutexIsOwner(struct VBoxDtMutex *pMtx);
     107extern struct VBoxDtMutex       g_DummyMtx;
     108
    93109
    94110typedef struct VBoxDtCpuCore
     
    125141
    126142#define ASSERT(a_Expr)          Assert(a_Expr)
     143#define panic                   VBoxDtPanic
     144void VBoxDtPanic(const char *psz, ...);
     145#define cmn_err                 VBoxDtCmnErr
     146void VBoxDtCmnErr(int iLevel, const char *pszMsg, ...);
     147#define CE_WARN                 10
     148#define CE_NOTE                 11
     149#define uprintf                 VBoxDtUPrintf
     150#define vuprintf                VBoxDtUPrintfV
     151void VBoxDtUPrintf(const char *pszFormat, ...);
     152void VBoxDtUPrintfV(const char *pszFormat, va_list va);
     153
    127154
    128155#if 1 /* */
     
    137164#define NBBY                    8
    138165#define NCPU                    RTCPUSET_MAX_CPUS
    139 #define P2ROUNDUP(uWhat, uAlign) ( ((uWhat) + (uAlign) - 1) & ~(uAlign - 1) )
     166#define P2ROUNDUP(uWhat, uAlign)    ( ((uWhat) + (uAlign) - 1) & ~(uAlign - 1) )
     167#define roundup(uWhat, uUnit)       ( ( (uWhat) + ((uUnit) - 1)) / (uUnit) * (uUnit) )
     168
    140169#define CPU_ON_INTR(a_pCpu)     (false)
     170
     171#define KERNELBASE              VBoxDtGetKernelBase()
     172uintptr_t VBoxDtGetKernelBase(void);
    141173
    142174
     
    158190 * Avoids lots of \#ifdef VBOX otherwise needed to mark up the changes. */
    159191#define VBDTCAST(a_Type)        (a_Type)
     192/** Mark a type change made when porting the code to VBox.
     193 * This is usually signed -> unsigned type changes that avoids a whole lot of
     194 * comparsion warnings. */
     195#define VBDTTYPE(a_VBox, a_Org) a_VBox
     196
     197/*
     198 * Memory allocation wrappers.
     199 */
     200#define KM_SLEEP                RT_BIT(0)
     201#define KM_NOSLEEP              RT_BIT(1)
     202#define kmem_alloc              VBoxDtKMemAlloc
     203#define kmem_zalloc             VBoxDtKMemAllocZ
     204#define kmem_free               VBoxDtKMemFree
     205void *VBoxDtKMemAlloc(size_t cbMem, uint32_t fFlags);
     206void *VBoxDtKMemAllocZ(size_t cbMem, uint32_t fFlags);
     207void  VBoxDtKMemFree(void *pvMem, size_t cbMem);
     208
     209typedef struct VBoxDtVMem
     210{
     211    size_t                  cbTodo;
     212    void                   *pvTodo;
     213} vmem_t;
     214#define VM_SLEEP                RT_BIT(0)
     215#define VM_BESTFIT              RT_BIT(1)
     216#define vmem_alloc              VBoxDtVMemAlloc
     217#define vmem_free               VBoxDtVMemFree
     218void *VBoxDtVMemAlloc(struct VBoxDtVMem *pVMemArena, size_t cbMem, uint32_t fFlags);
     219void  VBoxDtVMemFree(struct VBoxDtVMem *pVMemArena, void *pvMem, size_t cbMem);
     220
     221
     222/*
     223 * Errno defines compatible with the CRT of the given host...
     224 */
     225#define EINVAL                  (22)
     226#define EBUSY                   (16)
     227#define EFBIG                   (27)
     228#define ENOMEM                  (12)
     229#define ENOSPC                  (28)
     230#define ENOENT                  (2)
     231
     232/*
     233 * string
     234 */
     235#define bcopy(a_pSrc, a_pDst, a_cb) memmove(a_pDst, a_pSrc, a_cb)
     236#define bzero(a_pDst, a_cb)         RT_BZERO(a_pDst, a_cb)
    160237
    161238RT_C_DECLS_END
  • trunk/src/VBox/ExtPacks/VBoxDTrace/onnv/uts/common/dtrace/dtrace.c

    r53640 r53641  
    9696# include <sys/dtrace_impl.h>
    9797# include <iprt/assert.h>
     98# include <iprt/cpuset.h>
    9899# include <iprt/mp.h>
     100# include <iprt/string.h>
    99101# include <iprt/process.h>
    100102# include <iprt/thread.h>
     103# include <limits.h>
    101104
    102105# undef NULL
     
    176179static taskq_t          *dtrace_taskq;          /* task queue */
    177180static dtrace_probe_t   **dtrace_probes;        /* array of all probes */
    178 static int              dtrace_nprobes;         /* number of probes */
     181static VBDTTYPE(uint32_t,int) dtrace_nprobes;           /* number of probes */
    179182static dtrace_provider_t *dtrace_provider;      /* provider list */
    180183static dtrace_meta_t    *dtrace_meta_pid;       /* user-land meta provider */
     
    57035706        hrtime_t now;
    57045707
     5708#ifndef VBOX
    57055709        /*
    57065710         * Kick out immediately if this CPU is still being born (in which case
     
    57105714        if (((uintptr_t)curthread & 1) || (curthread->t_flag & T_DONTDTRACE))
    57115715                return;
     5716#endif
    57125717
    57135718        cookie = dtrace_interrupt_disable();
     
    57265731        }
    57275732
     5733#ifndef VBOX
    57285734        if (panic_quiesce) {
    57295735                /*
     
    57335739                return;
    57345740        }
     5741#endif
    57355742
    57365743        now = dtrace_gethrtime();
     
    58565863                                    s_cr->cr_gid != cr->cr_rgid ||
    58575864                                    s_cr->cr_gid != cr->cr_sgid ||
    5858                                     (proc = ttoproc(curthread)) == NULL ||
     5865                                    (proc = VBDT_GET_PROC()) == NULL ||
    58595866                                    (proc->p_flag & SNOCD))
    58605867                                        continue;
    58615868                        }
    58625869
     5870#ifndef VBOX
    58635871                        if (ecb->dte_cond & DTRACE_COND_ZONEOWNER) {
    58645872                                cred_t *cr;
     
    58735881                                        continue;
    58745882                        }
     5883#endif
    58755884                }
    58765885
     
    60046013
    60056014                                dtrace_getpcstack((pc_t *)(tomax + valoffs),
    6006                                     size / sizeof (pc_t), probe->dtpr_aframes,
     6015                                    VBDTCAST(int)(size / sizeof (pc_t)), probe->dtpr_aframes,
    60076016                                    DTRACE_ANCHORED(probe) ? NULL :
    60086017                                    (uint32_t *)arg0);
     
    61446153                        case DTRACEACT_UMOD:
    61456154                        case DTRACEACT_UADDR: {
     6155#ifndef VBOX
    61466156                                struct pid *pid = curthread->t_procp->p_pidp;
    61476157
     
    61536163                                DTRACE_STORE(uint64_t, tomax,
    61546164                                    valoffs + sizeof (uint64_t), val);
    6155 
     6165#else
     6166                                DTRACE_CPUFLAG_SET(CPU_DTRACE_UPRIV);
     6167#endif
    61566168                                continue;
    61576169                        }
     
    69256937         */
    69266938        if (hash == NULL) {
    6927                 for (i = 0; i < dtrace_nprobes; i++) {
     6939                for (i = 0; i < VBDTCAST(dtrace_id_t)dtrace_nprobes; i++) {
    69286940                        if ((probe = dtrace_probes[i]) == NULL ||
    69296941                            dtrace_match_probe(probe, pkp, priv, uid,
     
    71777189        dtrace_provider_t *old = (dtrace_provider_t *)id;
    71787190        dtrace_provider_t *prev = NULL;
    7179         int i, self = 0;
     7191        VBDTTYPE(uint32_t,int) i, self = 0;
    71807192        dtrace_probe_t *probe, *first = NULL;
    71817193
     
    73617373{
    73627374        dtrace_provider_t *prov = (dtrace_provider_t *)id;
    7363         int i;
     7375        VBDTTYPE(uint32_t,int) i;
    73647376        dtrace_probe_t *probe;
    73657377
     
    76017613dtrace_probe_provide(dtrace_probedesc_t *desc, dtrace_provider_t *prv)
    76027614{
     7615#ifndef VBOX
    76037616        struct modctl *ctl;
     7617#endif
    76047618        int all = 0;
    76057619
     
    76177631                prv->dtpv_pops.dtps_provide(prv->dtpv_arg, desc);
    76187632
     7633#ifndef VBOX
    76197634                /*
    76207635                 * Now call the per-module provide operation.  We will grab
     
    76357650
    76367651                mutex_exit(&mod_lock);
     7652#endif
    76377653        } while (all && (prv = prv->dtpv_next) != NULL);
    76387654}
     
    76497665        dtrace_probe_t *probe;
    76507666        dtrace_icookie_t cookie;
    7651         int i;
     7667        VBDTTYPE(uint32_t,int) i;
    76527668
    76537669        /*
     
    78257841        uintptr_t daddr = (uintptr_t)dhp->dofhp_dof;
    78267842        dof_hdr_t *dof = (dof_hdr_t *)daddr;
    7827         int i;
     7843        VBDTTYPE(uint32_t,int) i;
    78287844
    78297845        ASSERT(MUTEX_HELD(&dtrace_meta_lock));
     
    78827898        uintptr_t daddr = (uintptr_t)dhp->dofhp_dof;
    78837899        dof_hdr_t *dof = (dof_hdr_t *)daddr;
    7884         int i;
     7900        VBDTTYPE(uint32_t,int) i;
    78857901
    78867902        ASSERT(MUTEX_HELD(&dtrace_meta_lock));
     
    79097925        dtrace_meta_t *meta;
    79107926        dtrace_helpers_t *help, *next;
    7911         int i;
     7927        VBDTTYPE(uint32_t,int) i;
    79127928
    79137929        *idp = DTRACE_METAPROVNONE;
     
    80518067    cred_t *cr)
    80528068{
     8069#ifndef VBOX
    80538070        int err = 0, i;
     8071#else
     8072        int err = 0;
     8073        uint_t i;
     8074#endif
    80548075        int (*efunc)(uint_t pc, const char *, ...) = dtrace_difo_err;
    80558076        int kcheckload;
     
    83708391                switch (v->dtdv_scope) {
    83718392                case DIFV_SCOPE_GLOBAL:
    8372                         if (ndx < vstate->dtvs_nglobals) {
     8393                        if (VBDTCAST(int64_t)ndx < vstate->dtvs_nglobals) {
    83738394                                dtrace_statvar_t *svar;
    83748395
     
    83808401
    83818402                case DIFV_SCOPE_THREAD:
    8382                         if (ndx < vstate->dtvs_ntlocals)
     8403                        if (VBDTCAST(int64_t)ndx < vstate->dtvs_ntlocals)
    83838404                                existing = &vstate->dtvs_tlocals[ndx];
    83848405                        break;
    83858406
    83868407                case DIFV_SCOPE_LOCAL:
    8387                         if (ndx < vstate->dtvs_nlocals) {
     8408                        if (VBDTCAST(int64_t)ndx < vstate->dtvs_nlocals) {
    83888409                                dtrace_statvar_t *svar;
    83898410
     
    85978618dtrace_difo_cacheable(dtrace_difo_t *dp)
    85988619{
    8599         int i;
     8620        VBDTTYPE(uint_t,int) i;
    86008621
    86018622        if (dp == NULL)
     
    86428663dtrace_difo_hold(dtrace_difo_t *dp)
    86438664{
    8644         int i;
     8665        VBDTTYPE(uint_t,int) i;
    86458666
    86468667        ASSERT(MUTEX_HELD(&dtrace_lock));
     
    88098830dtrace_difo_init(dtrace_difo_t *dp, dtrace_vstate_t *vstate)
    88108831{
     8832#ifndef VBOX
    88118833        int i, oldsvars, osz, nsz, otlocals, ntlocals;
     8834#else
     8835        int oldsvars, osz, nsz, otlocals, ntlocals;
     8836        uint_t i;
     8837#endif
    88128838        uint_t id;
    88138839
     
    88298855                switch (scope) {
    88308856                case DIFV_SCOPE_THREAD:
    8831                         while (id >= (otlocals = vstate->dtvs_ntlocals)) {
     8857                        while (VBDTCAST(int64_t)id >= (otlocals = vstate->dtvs_ntlocals)) {
    88328858                                dtrace_difv_t *tlocals;
    88338859
     
    88798905                }
    88808906
    8881                 while (id >= (oldsvars = *np)) {
     8907                while (VBDTCAST(int64_t)id >= (oldsvars = *np)) {
    88828908                        dtrace_statvar_t **statics;
    88838909                        int newsvars, oldsize, newsize;
     
    89668992dtrace_difo_destroy(dtrace_difo_t *dp, dtrace_vstate_t *vstate)
    89678993{
    8968         int i;
     8994        VBDTTYPE(uint_t,int) i;
    89698995
    89708996        ASSERT(dp->dtdo_refcnt == 0);
     
    89999025
    90009026                id -= DIF_VAR_OTHER_UBASE;
    9001                 ASSERT(id < *np);
     9027                ASSERT(VBDTCAST(int64_t)id < *np);
    90029028
    90039029                svar = svarp[id];
     
    90299055dtrace_difo_release(dtrace_difo_t *dp, dtrace_vstate_t *vstate)
    90309056{
    9031         int i;
     9057        VBDTTYPE(uint_t,int) i;
    90329058
    90339059        ASSERT(MUTEX_HELD(&dtrace_lock));
     
    90569082{
    90579083        char *fmt, **new;
    9058         uint16_t ndx, len = strlen(str) + 1;
     9084        uint16_t ndx, len = VBDTCAST(uint16_t)strlen(str) + 1;
    90599085
    90609086        fmt = kmem_zalloc(len, KM_SLEEP);
     
    92769302        epid = state->dts_epid++;
    92779303
    9278         if (epid - 1 >= state->dts_necbs) {
     9304        if (VBDTCAST(int64_t)epid - 1 >= state->dts_necbs) {
    92799305                dtrace_ecb_t **oecbs = state->dts_ecbs, **ecbs;
    92809306                int necbs = state->dts_necbs << 1;
     
    95579583        }
    95589584
    9559         agg->dtag_action.dta_rec.dtrd_size = size;
     9585        agg->dtag_action.dta_rec.dtrd_size = VBDTCAST(uint32_t)size;
    95609586
    95619587        if (ntuple == 0)
     
    96079633            VM_BESTFIT | VM_SLEEP);
    96089634
    9609         if (aggid - 1 >= state->dts_naggregations) {
     9635        if (VBDTCAST(int64_t)aggid - 1 >= state->dts_naggregations) {
    96109636                dtrace_aggregation_t **oaggs = state->dts_aggregations;
    96119637                dtrace_aggregation_t **aggs;
     
    97479773                        }
    97489774
    9749                         size = nframes * sizeof (pc_t);
     9775                        size = VBDTCAST(uint32_t)(nframes * sizeof (pc_t));
    97509776                        break;
    97519777
     
    97729798                         * Save a slot for the pid.
    97739799                         */
    9774                         size = (nframes + 1) * sizeof (uint64_t);
     9800                        size = VBDTCAST(uint32_t)((nframes + 1) * sizeof (uint64_t));
    97759801                        size += DTRACE_USTACK_STRSIZE(arg);
    97769802                        size = P2ROUNDUP(size, (uint32_t)(sizeof (uintptr_t)));
     
    1016010186        ASSERT(MUTEX_HELD(&dtrace_lock));
    1016110187
    10162         if (id == 0 || id > state->dts_necbs)
     10188        if (id == 0 || VBDTCAST(int64_t)id > state->dts_necbs)
    1016310189                return (NULL);
    1016410190
     
    1017610202        ASSERT(MUTEX_HELD(&dtrace_lock));
    1017710203
    10178         if (id == 0 || id > state->dts_naggregations)
     10204        if (id == 0 || VBDTCAST(int64_t)id > state->dts_naggregations)
    1017910205                return (NULL);
    1018010206
     
    1025610282    processorid_t cpu)
    1025710283{
     10284#ifndef VBOX
    1025810285        cpu_t *cp;
     10286#else
     10287        RTCPUSET CpuSet;
     10288        unsigned iCpu;
     10289#endif
    1025910290        dtrace_buffer_t *buf;
    1026010291
     
    1026210293        ASSERT(MUTEX_HELD(&dtrace_lock));
    1026310294
    10264         if (size > dtrace_nonroot_maxsize &&
    10265             !PRIV_POLICY_CHOICE(CRED(), PRIV_ALL, B_FALSE))
     10295        if (VBDTCAST(int64_t)size > dtrace_nonroot_maxsize
     10296#ifndef VBOX
     10297            && !PRIV_POLICY_CHOICE(CRED(), PRIV_ALL, B_FALSE)
     10298#endif
     10299            )
    1026610300                return (EFBIG);
    1026710301
     10302#ifndef VBOX
    1026810303        cp = cpu_list;
    10269 
     10304#else
     10305        RTMpGetSet(&CpuSet);
     10306#endif
     10307
     10308#ifndef VBOX
    1027010309        do {
    1027110310                if (cpu != DTRACE_CPUALL && cpu != cp->cpu_id)
     
    1027310312
    1027410313                buf = &bufs[cp->cpu_id];
     10314#else
     10315    for (iCpu = 0; iCpu < RTCPUSET_MAX_CPUS; iCpu++) {
     10316                if (   !RTCpuSetIsMember(&CpuSet, iCpu)
     10317                        || (cpu != DTRACE_CPUALL && cpu != iCpu))
     10318                        continue;
     10319
     10320                buf = &bufs[iCpu];
     10321#endif
    1027510322
    1027610323                /*
     
    1029910346                if ((buf->dtb_xamot = kmem_zalloc(size, KM_NOSLEEP)) == NULL)
    1030010347                        goto err;
     10348#ifndef VBOX
    1030110349        } while ((cp = cp->cpu_next) != cpu_list);
     10350#else
     10351        }
     10352#endif
    1030210353
    1030310354        return (0);
    1030410355
    1030510356err:
     10357#ifndef VBOX
    1030610358        cp = cpu_list;
    1030710359
     
    1031110363
    1031210364                buf = &bufs[cp->cpu_id];
     10365#else
     10366                for (iCpu = 0; iCpu < RTCPUSET_MAX_CPUS; iCpu++) {
     10367                        if (   !RTCpuSetIsMember(&CpuSet, iCpu)
     10368                                || (cpu != DTRACE_CPUALL && cpu != iCpu))
     10369                                continue;
     10370
     10371                        buf = &bufs[iCpu];
     10372#endif
    1031310373
    1031410374                if (buf->dtb_xamot != NULL) {
     
    1032610386                buf->dtb_xamot = NULL;
    1032710387                buf->dtb_size = 0;
     10388#ifndef VBOX
    1032810389        } while ((cp = cp->cpu_next) != cpu_list);
     10390#else
     10391        }
     10392#endif
    1032910393
    1033010394        return (ENOMEM);
     
    1037910443                }
    1038010444
    10381                 if ((soffs = offs + needed) > buf->dtb_size) {
     10445                if (VBDTCAST(uintptr_t)(soffs = offs + needed) > buf->dtb_size) {
    1038210446                        dtrace_buffer_drop(buf);
    1038310447                        return (-1);
     
    1045010514                         * offset to the end (there may be old gunk there).
    1045110515                         */
    10452                         while (offs < buf->dtb_size)
     10516                        while (VBDTCAST(uintptr_t)offs < buf->dtb_size)
    1045310517                                tomax[offs++] = 0;
    1045410518
     
    1048710551                }
    1048810552
    10489                 while (offs + total > woffs) {
     10553                while (VBDTCAST(uintptr_t)offs + total > VBDTCAST(uintptr_t)woffs) {
    1049010554                        dtrace_epid_t epid = *(uint32_t *)(tomax + woffs);
    1049110555                        size_t size;
     
    1049410558                                size = sizeof (uint32_t);
    1049510559                        } else {
    10496                                 ASSERT(epid <= state->dts_necbs);
     10560                                ASSERT(VBDTCAST(int64_t)epid <= state->dts_necbs);
    1049710561                                ASSERT(state->dts_ecbs[epid - 1] != NULL);
    1049810562
     
    1052910593                                        woffs = total;
    1053010594
    10531                                         while (woffs < buf->dtb_size)
     10595                                        while (VBDTCAST(uintptr_t)woffs < buf->dtb_size)
    1053210596                                                tomax[woffs++] = 0;
    1053310597                                }
     
    1101611080                cred_t *cr = enab->dten_vstate->dtvs_state->dts_cred.dcr_cred;
    1101711081
     11082#ifndef VBOX
    1101811083                if (INGLOBALZONE(curproc) ||
    1101911084                    cr != NULL && getzoneid() == crgetzoneid(cr))
     11085#endif
    1102011086                        (void) dtrace_enabling_match(enab, NULL);
    1102111087        }
  • trunk/src/VBox/ExtPacks/VBoxDTrace/onnv/uts/common/sys/dtrace.h

    r53640 r53641  
    625625typedef uint32_t dof_stridx_t;  /* string table index type */
    626626
    627 #define DOF_SECIDX_NONE (-1U)   /* null value for section indices */
    628 #define DOF_STRIDX_NONE (-1U)   /* null value for string indices */
     627#define DOF_SECIDX_NONE (~1U)   /* null value for section indices */
     628#define DOF_STRIDX_NONE (~1U)   /* null value for string indices */
    629629
    630630typedef struct dof_sec {
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