VirtualBox

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

VBoxDTrace: implemented a bunch of glue and reduced the required solaris glue. (r44)

Location:
trunk/src/VBox/ExtPacks/VBoxDTrace/onnv/uts/common
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/ExtPacks/VBoxDTrace/onnv/uts/common/dtrace/dtrace.c

    r53666 r53667  
    206206 * DTrace Internal Variables
    207207 */
     208#ifndef VBOX
    208209static dev_info_t       *dtrace_devi;           /* device info */
     210#endif
    209211static vmem_t           *dtrace_arena;          /* probe ID arena */
     212#ifndef VBOX
    210213static vmem_t           *dtrace_minor;          /* minor number arena */
    211 #ifndef VBOX
    212214static taskq_t          *dtrace_taskq;          /* task queue */
    213215#endif
     
    218220static int              dtrace_opens;           /* number of opens */
    219221static int              dtrace_helpers;         /* number of helpers */
     222#ifndef VBOX
    220223static void             *dtrace_softstate;      /* softstate pointer */
     224#endif
    221225static dtrace_hash_t    *dtrace_bymod;          /* probes hashed by module */
    222226static dtrace_hash_t    *dtrace_byfunc;         /* probes hashed by function */
     
    518522static void dtrace_enabling_matchall(void);
    519523static dtrace_state_t *dtrace_anon_grab(void);
     524#ifndef VBOX
    520525static uint64_t dtrace_helper(int, dtrace_mstate_t *,
    521526    dtrace_state_t *, uint64_t, uint64_t);
    522527static dtrace_helpers_t *dtrace_helpers_create(proc_t *);
     528#endif
    523529static void dtrace_buffer_drop(dtrace_buffer_t *);
    524530static intptr_t dtrace_buffer_reserve(dtrace_buffer_t *, size_t, size_t,
     
    11521158dtrace_priv_proc_common_nocd(VBDTVOID)
    11531159{
     1160#ifndef VBOX
    11541161        proc_t *proc;
    11551162
     
    11591166
    11601167        return (0);
     1168#else
     1169        return (1);
     1170#endif
    11611171}
    11621172
     
    25192529}
    25202530
     2531#ifdef VBOX
     2532/** */
     2533static DECLCALLBACK(void) dtrace_speculation_clean_here_wrapper(RTCPUID idCpu, void *pvUser1, void *pvUser2)
     2534{
     2535    dtrace_speculation_clean_here((dtrace_state_t *)pvUser1);
     2536    NOREF(pvUser2); NOREF(idCpu);
     2537}
     2538#endif
     2539
    25212540/*
    25222541 * Note:  not called from probe context.  This function is called
     
    25492568                return;
    25502569
     2570#ifndef VBOX
    25512571        dtrace_xcall(DTRACE_CPUALL,
    25522572            (dtrace_xcall_t)dtrace_speculation_clean_here, state);
     2573#else
     2574        RTMpOnAll(dtrace_speculation_clean_here_wrapper, state, NULL);
     2575#endif
    25532576
    25542577        /*
     
    56925715                        break;
    56935716
     5717#ifndef VBOX
    56945718                sym = (char *)(uintptr_t)dtrace_helper(
    56955719                    DTRACE_HELPER_ACTION_USTACK,
    56965720                    mstate, state, pcs[i], fps[i]);
     5721#else
     5722                sym = NULL;
     5723#endif
    56975724
    56985725                /*
     
    59295956                                    s_cr->cr_gid != cr->cr_rgid ||
    59305957                                    s_cr->cr_gid != cr->cr_sgid ||
     5958#ifndef VBOX
    59315959                                    (proc = VBDT_GET_PROC()) == NULL ||
    59325960                                    (proc->p_flag & SNOCD))
     5961#else
     5962                                    0)
     5963
     5964#endif
    59335965                                        continue;
    59345966                        }
     
    61056137                                }
    61066138
     6139#ifndef VBOX /* no helpers */
    61076140                                if (DTRACE_USTACK_STRSIZE(rec->dtrd_arg) != 0 &&
    61086141                                    curproc->p_dtrace_helpers != NULL) {
     
    61196152                                        continue;
    61206153                                }
     6154#endif
    61216155
    61226156                                DTRACE_CPUFLAG_SET(CPU_DTRACE_NOFAULT);
     
    72777311                 */
    72787312                ASSERT(old == dtrace_provider);
     7313#ifndef VBOX
    72797314                ASSERT(dtrace_devi != NULL);
     7315#endif
    72807316                ASSERT(MUTEX_HELD(&dtrace_provider_lock));
    72817317                ASSERT(MUTEX_HELD(&dtrace_lock));
     
    73807416
    73817417        if ((prev = dtrace_provider) == old) {
     7418#ifndef VBOX
    73827419                ASSERT(self || dtrace_devi == NULL);
    73837420                ASSERT(old->dtpv_next == NULL || dtrace_devi == NULL);
     7421#endif
    73847422                dtrace_provider = old->dtpv_next;
    73857423        } else {
     
    1034810386}
    1034910387
     10388#ifdef VBOX
     10389static DECLCALLBACK(void) dtrace_buffer_switch_wrapper(RTCPUID idCpu, void *pvUser1, void *pvUser2)
     10390{
     10391    dtrace_buffer_switch((dtrace_buffer_t *)pvUser1);
     10392    NOREF(pvUser2); NOREF(idCpu);
     10393}
     10394#endif
     10395
    1035010396/*
    1035110397 * Note:  called from cross call context.  This function activates a buffer
     
    1037410420        dtrace_interrupt_enable(cookie);
    1037510421}
     10422
     10423#ifdef VBOX
     10424static DECLCALLBACK(void) dtrace_buffer_activate_wrapper(RTCPUID idCpu, void *pvUser1, void *pvUser2)
     10425{
     10426    dtrace_buffer_activate((dtrace_state_t *)pvUser1);
     10427    NOREF(pvUser2); NOREF(idCpu);
     10428}
     10429#endif
    1037610430
    1037710431static int
     
    1245112505
    1245212506VBDTSTATIC dtrace_state_t *
     12507#ifdef VBOX
     12508dtrace_state_create(cred_t *cr)
     12509#else
    1245312510dtrace_state_create(dev_t *devp, cred_t *cr)
     12511#endif
    1245412512{
    1245512513        minor_t minor;
     
    1246312521        ASSERT(MUTEX_HELD(&cpu_lock));
    1246412522
     12523#ifndef VBOX
    1246512524        minor = (minor_t)(uintptr_t)vmem_alloc(dtrace_minor, 1,
    1246612525            VM_BESTFIT | VM_SLEEP);
     
    1247212531
    1247312532        state = ddi_get_soft_state(dtrace_softstate, minor);
     12533#else
     12534        state = kmem_alloc(sizeof (*state), KM_SLEEP);
     12535        if (!state) {
     12536            return (NULL);
     12537        }
     12538#endif
    1247412539        state->dts_epid = DTRACE_EPIDNONE + 1;
    1247512540
     
    1247812543            NULL, NULL, NULL, 0, VM_SLEEP | VMC_IDENTIFIER);
    1247912544
     12545#ifndef VBOX
    1248012546        if (devp != NULL) {
    1248112547                major = getemajor(*devp);
     
    1248812554        if (devp != NULL)
    1248912555                *devp = state->dts_dev;
     12556#endif
    1249012557
    1249112558        /*
     
    1303113098         * processing all of them.
    1303213099         */
     13100#ifndef VBOX
    1303313101        dtrace_xcall(DTRACE_CPUALL,
    1303413102            (dtrace_xcall_t)dtrace_buffer_activate, state);
     13103#else
     13104        RTMpOnAll(dtrace_buffer_activate_wrapper, state, NULL);
     13105#endif
    1303513106        goto out;
    1303613107
     
    1317813249        dtrace_ecb_t *ecb;
    1317913250        dtrace_vstate_t *vstate = &state->dts_vstate;
     13251#ifndef VBOX
    1318013252        minor_t minor = getminor(state->dts_dev);
     13253#endif
    1318113254        int i, bufsize = NCPU * sizeof (dtrace_buffer_t);
    1318213255        dtrace_speculation_t *spec = state->dts_speculations;
     
    1328513358
    1328613359        vmem_destroy(state->dts_aggid_arena);
     13360#ifndef VBOX
    1328713361        ddi_soft_state_free(dtrace_softstate, minor);
    1328813362        vmem_free(dtrace_minor, (void *)(uintptr_t)minor, 1);
     13363#else
     13364        kmem_free(state, sizeof (*state));
     13365#endif
    1328913366}
    1329013367
     
    1342013497 * DTrace Helper Functions
    1342113498 */
     13499#ifndef VBOX /* No helper stuff */
    1342213500static void
    1342313501dtrace_helper_trace(dtrace_helper_action_t *helper,
     
    1441514493}
    1441614494
    14417 #ifndef VBOX
    14418 
    1441914495/*
    1442014496 * DTrace Hook Functions
     
    1469714773 * DTrace Driver Cookbook Functions
    1469814774 */
    14699 #ifndef VBOX
     14775#ifdef VBOX
     14776int dtrace_attach(ddi_attach_cmd_t cmd)
     14777#else
    1470014778/*ARGSUSED*/
    1470114779static int
    1470214780dtrace_attach(dev_info_t *devi, ddi_attach_cmd_t cmd)
    14703 #else
    14704 int dtrace_attach(dev_info_t *devi, ddi_attach_cmd_t cmd)
    1470514781#endif
    1470614782{
     
    1471314789        mutex_enter(&dtrace_lock);
    1471414790
     14791#ifndef VBOX
    1471514792        if (ddi_soft_state_init(&dtrace_softstate,
    1471614793            sizeof (dtrace_state_t), 0) != 0) {
     
    1472214799        }
    1472314800
    14724 #ifndef VBOX
    1472514801        if (ddi_create_minor_node(devi, DTRACEMNR_DTRACE, S_IFCHR,
    1472614802            DTRACEMNRN_DTRACE, DDI_PSEUDO, NULL) == DDI_FAILURE ||
     
    1473514811                return (DDI_FAILURE);
    1473614812        }
    14737 #endif
    1473814813
    1473914814        ddi_report_dev(devi);
    1474014815        dtrace_devi = devi;
    1474114816
    14742 #ifndef VBOX
    1474314817        dtrace_modload = dtrace_module_loaded;
    1474414818        dtrace_modunload = dtrace_module_unloaded;
     
    1476014834        dtrace_arena = vmem_create("dtrace", (void *)1, UINT32_MAX, 1,
    1476114835            NULL, NULL, NULL, 0, VM_SLEEP | VMC_IDENTIFIER);
     14836#ifndef VBOX
    1476214837        dtrace_minor = vmem_create("dtrace_minor", (void *)DTRACEMNRN_CLONE,
    1476314838            UINT32_MAX - DTRACEMNRN_CLONE, 1, NULL, NULL, NULL, 0,
    1476414839            VM_SLEEP | VMC_IDENTIFIER);
    14765 #ifndef VBOX
    1476614840        dtrace_taskq = taskq_create("dtrace_taskq", 1, maxclsyspri,
    1476714841            1, INT_MAX, 0);
     
    1487814952}
    1487914953
     14954#ifdef VBOX
     14955int dtrace_open(dtrace_state_t **ppState, cred_t *cred_p)
     14956#else
    1488014957/*ARGSUSED*/
    1488114958static int
    1488214959dtrace_open(dev_t *devp, int flag, int otyp, cred_t *cred_p)
     14960#endif
    1488314961{
    1488414962        dtrace_state_t *state;
     
    1488714965        zoneid_t zoneid;
    1488814966
     14967#ifndef VBOX
    1488914968        if (getminor(*devp) == DTRACEMNRN_HELPER)
    1489014969                return (0);
     
    1489614975        if (getminor(*devp) != DTRACEMNRN_DTRACE)
    1489714976                return (ENXIO);
     14977#endif /* !VBOX */
    1489814978
    1489914979        /*
     
    1493015010#endif
    1493115011
     15012#ifndef VBOX
    1493215013        state = dtrace_state_create(devp, cred_p);
     15014#else
     15015        state = dtrace_state_create(cred_p);
     15016#endif
    1493315017        mutex_exit(&cpu_lock);
    1493415018
     
    1494415028        mutex_exit(&dtrace_lock);
    1494515029
     15030#ifdef VBOX
     15031        *ppState = state;
     15032#endif
    1494615033        return (0);
    1494715034}
    1494815035
     15036#ifdef VBOX
     15037int dtrace_close(dtrace_state_t *state)
     15038#else
    1494915039/*ARGSUSED*/
    1495015040static int
    1495115041dtrace_close(dev_t dev, int flag, int otyp, cred_t *cred_p)
    14952 {
     15042#endif
     15043{
     15044#ifndef VBOX
    1495315045        minor_t minor = getminor(dev);
    1495415046        dtrace_state_t *state;
     
    1495815050
    1495915051        state = ddi_get_soft_state(dtrace_softstate, minor);
     15052#endif
    1496015053
    1496115054        mutex_enter(&cpu_lock);
     
    1504615139#endif /* !VBOX */
    1504715140
     15141#ifdef VBOX
     15142int dtrace_ioctl(dtrace_state_t *state, int cmd, intptr_t arg, int32_t *rv)
     15143#else
    1504815144/*ARGSUSED*/
    15049 #ifndef VBOX
    1505015145static int
    1505115146dtrace_ioctl(dev_t dev, int cmd, intptr_t arg, int md, cred_t *cr, int *rv)
    15052 #else
    15053 int dtrace_ioctl(dev_t dev, int cmd, intptr_t arg, int md, cred_t *cr, int *rv)
    1505415147#endif
    1505515148{
     15149#ifndef VBOX
    1505615150        minor_t minor = getminor(dev);
    1505715151        dtrace_state_t *state;
     15152#endif
    1505815153        int rval;
    1505915154
     
    1506115156        if (minor == DTRACEMNRN_HELPER)
    1506215157                return (dtrace_ioctl_helper(cmd, arg, rv));
     15158
     15159        state = ddi_get_soft_state(dtrace_softstate, minor);
    1506315160#endif
    15064 
    15065         state = ddi_get_soft_state(dtrace_softstate, minor);
    1506615161
    1506715162        if (state->dts_anon) {
     
    1528115376                dtrace_vstate_t *vstate;
    1528215377                int err = 0;
     15378#ifdef VBOX
     15379                cred_t *cr = CRED();
     15380#endif
    1528315381
    1528415382                *rv = 0;
     
    1537215470                uid_t uid;
    1537315471                zoneid_t zoneid;
     15472#ifdef VBOX
     15473                cred_t *cr = CRED();
     15474#endif
    1537415475
    1537515476                if (copyin((void *)arg, &desc, sizeof (desc)) != 0)
     
    1562915730                ASSERT(!(buf->dtb_flags & DTRACEBUF_NOSWITCH));
    1563015731
     15732#ifndef VBOX
    1563115733                dtrace_xcall(desc.dtbd_cpu,
    1563215734                    (dtrace_xcall_t)dtrace_buffer_switch, buf);
     15735#else
     15736                if ((int32_t)desc.dtbd_cpu == DTRACE_CPUALL)
     15737                    RTMpOnAll(dtrace_buffer_switch_wrapper, buf, NULL);
     15738                else
     15739                    RTMpOnSpecific(desc.dtbd_cpu, dtrace_buffer_switch_wrapper, buf, NULL);
     15740#endif
    1563315741
    1563415742                state->dts_errors += buf->dtb_xamot_errors;
     
    1580915917}
    1581015918
    15811 #ifndef VBOX
     15919#ifdef VBOX
     15920int dtrace_detach(ddi_detach_cmd_t cmd)
     15921#else
    1581215922/*ARGSUSED*/
    1581315923static int
    1581415924dtrace_detach(dev_info_t *dip, ddi_detach_cmd_t cmd)
    15815 #else
    15816 int dtrace_detach(dev_info_t *dip, ddi_detach_cmd_t cmd)
    1581715925#endif
    1581815926{
     
    1590316011
    1590416012        kmem_cache_destroy(dtrace_state_cache);
     16013#ifndef VBOX
    1590516014        vmem_destroy(dtrace_minor);
     16015#endif
    1590616016        vmem_destroy(dtrace_arena);
    1590716017
     
    1591616026#ifndef VBOX
    1591716027        ddi_remove_minor_node(dtrace_devi, NULL);
     16028        dtrace_devi = NULL;
     16029
     16030        ddi_soft_state_fini(&dtrace_softstate);
    1591816031#endif
    15919         dtrace_devi = NULL;
    15920 
    15921         ddi_soft_state_fini(&dtrace_softstate);
    1592216032
    1592316033        ASSERT(dtrace_vtime_references == 0);
  • trunk/src/VBox/ExtPacks/VBoxDTrace/onnv/uts/common/sys/dtrace_impl.h

    r53642 r53667  
    11021102 */
    11031103struct dtrace_state {
     1104#ifndef VBOX
    11041105        dev_t dts_dev;                          /* device */
     1106#endif
    11051107        int dts_necbs;                          /* total number of ECBs */
    11061108        dtrace_ecb_t **dts_ecbs;                /* array of ECBs */
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