diff options
-rw-r--r-- | cddl/contrib/opensolaris/lib/libdtrace/common/dt_subr.c | 65 |
1 files changed, 63 insertions, 2 deletions
diff --git a/cddl/contrib/opensolaris/lib/libdtrace/common/dt_subr.c b/cddl/contrib/opensolaris/lib/libdtrace/common/dt_subr.c index b2163e6..12f186a 100644 --- a/cddl/contrib/opensolaris/lib/libdtrace/common/dt_subr.c +++ b/cddl/contrib/opensolaris/lib/libdtrace/common/dt_subr.c @@ -26,7 +26,9 @@ #pragma ident "%Z%%M% %I% %E% SMI" +#if defined(sun) #include <sys/sysmacros.h> +#endif #include <strings.h> #include <unistd.h> @@ -36,7 +38,11 @@ #include <stdio.h> #include <errno.h> #include <ctype.h> +#if defined(sun) #include <alloca.h> +#else +#include <sys/sysctl.h> +#endif #include <assert.h> #include <libgen.h> #include <limits.h> @@ -467,10 +473,19 @@ dt_dprintf(const char *format, ...) } int +#if defined(sun) dt_ioctl(dtrace_hdl_t *dtp, int val, void *arg) +#else +dt_ioctl(dtrace_hdl_t *dtp, u_long val, void *arg) +#endif { const dtrace_vector_t *v = dtp->dt_vector; +#if !defined(sun) + /* Avoid sign extension. */ + val &= 0xffffffff; +#endif + if (v != NULL) return (v->dtv_ioctl(dtp->dt_varg, val, arg)); @@ -486,8 +501,18 @@ dt_status(dtrace_hdl_t *dtp, processorid_t cpu) { const dtrace_vector_t *v = dtp->dt_vector; - if (v == NULL) + if (v == NULL) { +#if defined(sun) return (p_online(cpu, P_STATUS)); +#else + int maxid = 0; + size_t len = sizeof(maxid); + if (sysctlbyname("kern.smp.maxid", &maxid, &len, NULL, 0) != 0) + return (cpu == 0 ? 1 : -1); + else + return (cpu <= maxid ? 1 : -1); +#endif + } return (v->dtv_status(dtp->dt_varg, cpu)); } @@ -554,6 +579,16 @@ dt_printf(dtrace_hdl_t *dtp, FILE *fp, const char *format, ...) va_list ap; int n; +#if !defined(sun) + /* + * On FreeBSD, check if output is currently being re-directed + * to another file. If so, output to that file instead of the + * one the caller has specified. + */ + if (dtp->dt_freopen_fp != NULL) + fp = dtp->dt_freopen_fp; +#endif + va_start(ap, format); if (dtp->dt_sprintf_buflen != 0) { @@ -644,6 +679,7 @@ dt_printf(dtrace_hdl_t *dtp, FILE *fp, const char *format, ...) } n = vfprintf(fp, format, ap); + fflush(fp); va_end(ap); if (n < 0) { @@ -693,6 +729,11 @@ dt_zalloc(dtrace_hdl_t *dtp, size_t size) { void *data; + if (size > 16 * 1024 * 1024) { + (void) dt_set_errno(dtp, EDT_NOMEM); + return (NULL); + } + if ((data = malloc(size)) == NULL) (void) dt_set_errno(dtp, EDT_NOMEM); else @@ -706,6 +747,11 @@ dt_alloc(dtrace_hdl_t *dtp, size_t size) { void *data; + if (size > 16 * 1024 * 1024) { + (void) dt_set_errno(dtp, EDT_NOMEM); + return (NULL); + } + if ((data = malloc(size)) == NULL) (void) dt_set_errno(dtp, EDT_NOMEM); @@ -803,6 +849,7 @@ dt_popcb(const ulong_t *bp, ulong_t n) return (popc + dt_popc(bp[maxw] & ((1UL << maxb) - 1))); } +#if defined(sun) struct _rwlock; struct _lwp_mutex; @@ -819,12 +866,17 @@ dt_rw_write_held(pthread_rwlock_t *lock) extern int _rw_write_held(struct _rwlock *); return (_rw_write_held((struct _rwlock *)lock)); } +#endif int dt_mutex_held(pthread_mutex_t *lock) { +#if defined(sun) extern int _mutex_held(struct _lwp_mutex *); return (_mutex_held((struct _lwp_mutex *)lock)); +#else + return (1); +#endif } static int @@ -911,8 +963,13 @@ dtrace_uaddr2str(dtrace_hdl_t *dtp, pid_t pid, dt_proc_lock(dtp, P); +#if defined(sun) if (Plookup_by_addr(P, addr, name, sizeof (name), &sym) == 0) { (void) Pobjname(P, addr, objname, sizeof (objname)); +#else + if (proc_addr2sym(P, addr, name, sizeof (name), &sym) == 0) { + (void) proc_objname(P, addr, objname, sizeof (objname)); +#endif obj = dt_basename(objname); @@ -922,7 +979,11 @@ dtrace_uaddr2str(dtrace_hdl_t *dtp, pid_t pid, } else { (void) snprintf(c, sizeof (c), "%s`%s", obj, name); } - } else if (Pobjname(P, addr, objname, sizeof (objname)) != NULL) { +#if defined(sun) + } else if (Pobjname(P, addr, objname, sizeof (objname)) != 0) { +#else + } else if (proc_objname(P, addr, objname, sizeof (objname)) != 0) { +#endif (void) snprintf(c, sizeof (c), "%s`0x%llx", dt_basename(objname), addr); } else { |