diff options
Diffstat (limited to 'cddl/contrib/opensolaris/lib/libdtrace/i386')
-rw-r--r-- | cddl/contrib/opensolaris/lib/libdtrace/i386/dt_isadep.c | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/cddl/contrib/opensolaris/lib/libdtrace/i386/dt_isadep.c b/cddl/contrib/opensolaris/lib/libdtrace/i386/dt_isadep.c index c1484a4..ad1c032 100644 --- a/cddl/contrib/opensolaris/lib/libdtrace/i386/dt_isadep.c +++ b/cddl/contrib/opensolaris/lib/libdtrace/i386/dt_isadep.c @@ -35,6 +35,12 @@ #include <dis_tables.h> +#if !defined(sun) +#define PR_MODEL_ILP32 1 +#define PR_MODEL_LP64 2 +#include <libproc_compat.h> +#endif + #define DT_POPL_EBP 0x5d #define DT_RET 0xc3 #define DT_RET16 0xc2 @@ -78,8 +84,17 @@ dt_pid_has_jump_table(struct ps_prochandle *P, dtrace_hdl_t *dtp, { ulong_t i; int size; +#if defined(sun) pid_t pid = Pstatus(P)->pr_pid; char dmodel = Pstatus(P)->pr_dmodel; +#else + pid_t pid = proc_getpid(P); +#if __i386__ + char dmodel = PR_MODEL_ILP32; +#elif __amd64__ + char dmodel = PR_MODEL_LP64; +#endif +#endif /* * Take a pass through the function looking for a register-dependant @@ -98,6 +113,7 @@ dt_pid_has_jump_table(struct ps_prochandle *P, dtrace_hdl_t *dtp, return (1); } +#ifdef notyet /* * Register-dependant jmp instructions start with a 0xff byte * and have the modrm.reg field set to 4. They can have an @@ -110,6 +126,7 @@ dt_pid_has_jump_table(struct ps_prochandle *P, dtrace_hdl_t *dtp, ftp->ftps_func, i); return (1); } +#endif } return (0); @@ -123,8 +140,17 @@ dt_pid_create_return_probe(struct ps_prochandle *P, dtrace_hdl_t *dtp, uint8_t *text; ulong_t i, end; int size; +#if defined(sun) pid_t pid = Pstatus(P)->pr_pid; char dmodel = Pstatus(P)->pr_dmodel; +#else + pid_t pid = proc_getpid(P); +#if __i386__ + char dmodel = PR_MODEL_ILP32; +#elif __amd64__ + char dmodel = PR_MODEL_LP64; +#endif +#endif /* * We allocate a few extra bytes at the end so we don't have to check @@ -275,8 +301,17 @@ dt_pid_create_offset_probe(struct ps_prochandle *P, dtrace_hdl_t *dtp, uint8_t *text; ulong_t i; int size; +#if defined(sun) pid_t pid = Pstatus(P)->pr_pid; char dmodel = Pstatus(P)->pr_dmodel; +#else + pid_t pid = proc_getpid(P); +#if __i386__ + char dmodel = PR_MODEL_ILP32; +#elif __amd64__ + char dmodel = PR_MODEL_LP64; +#endif +#endif if ((text = malloc(symp->st_size)) == NULL) { dt_dprintf("mr sparkle: malloc() failed\n"); @@ -349,8 +384,17 @@ dt_pid_create_glob_offset_probes(struct ps_prochandle *P, dtrace_hdl_t *dtp, uint8_t *text; int size; ulong_t i, end = symp->st_size; +#if defined(sun) pid_t pid = Pstatus(P)->pr_pid; char dmodel = Pstatus(P)->pr_dmodel; +#else + pid_t pid = proc_getpid(P); +#if __i386__ + char dmodel = PR_MODEL_ILP32; +#elif __amd64__ + char dmodel = PR_MODEL_LP64; +#endif +#endif ftp->ftps_type = DTFTP_OFFSETS; ftp->ftps_pc = (uintptr_t)symp->st_value; |