summaryrefslogtreecommitdiff
path: root/usr/src/lib/libdisasm/common/libdisasm.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/lib/libdisasm/common/libdisasm.c')
-rw-r--r--usr/src/lib/libdisasm/common/libdisasm.c12
1 files changed, 12 insertions, 0 deletions
diff --git a/usr/src/lib/libdisasm/common/libdisasm.c b/usr/src/lib/libdisasm/common/libdisasm.c
index ce48a2da8b..057d4facb1 100644
--- a/usr/src/lib/libdisasm/common/libdisasm.c
+++ b/usr/src/lib/libdisasm/common/libdisasm.c
@@ -272,9 +272,21 @@ dis_max_instrlen(dis_handle_t *dhp)
return (dhp->dh_arch->da_max_instrlen(dhp));
}
+static int
+dis_generic_instrlen(dis_handle_t *dhp, uint64_t pc)
+{
+ if (dis_disassemble(dhp, pc, NULL, 0) != 0)
+ return (-1);
+
+ return (dhp->dh_addr - pc);
+}
+
int
dis_instrlen(dis_handle_t *dhp, uint64_t pc)
{
+ if (dhp->dh_arch->da_instrlen == NULL)
+ return (dis_generic_instrlen(dhp, pc));
+
return (dhp->dh_arch->da_instrlen(dhp, pc));
}