summaryrefslogtreecommitdiff
path: root/usr/src/lib/libdisasm
diff options
context:
space:
mode:
authorJosef 'Jeff' Sipek <jeffpc@josefsipek.net>2015-10-16 01:22:30 -0400
committerDan McDonald <danmcd@omniti.com>2015-11-09 16:56:23 -0500
commitcfc41e72a4f85ff48430f435531264fca458f55d (patch)
treed0ef8ecd0a2d9e695176301899624b7cb1ac8d31 /usr/src/lib/libdisasm
parent038db8fb497789ea9b367f771544442507cede18 (diff)
downloadillumos-joyent-cfc41e72a4f85ff48430f435531264fca458f55d.tar.gz
6069 libdisasm: instrlen arch op should have a sane default
Reviewed by: Robert Mustacchi <rm@joyent.com> Approved by: Dan McDonald <danmcd@omniti.com>
Diffstat (limited to 'usr/src/lib/libdisasm')
-rw-r--r--usr/src/lib/libdisasm/common/dis_i386.c10
-rw-r--r--usr/src/lib/libdisasm/common/libdisasm.c12
2 files changed, 12 insertions, 10 deletions
diff --git a/usr/src/lib/libdisasm/common/dis_i386.c b/usr/src/lib/libdisasm/common/dis_i386.c
index beb66cdc0d..90a45f5618 100644
--- a/usr/src/lib/libdisasm/common/dis_i386.c
+++ b/usr/src/lib/libdisasm/common/dis_i386.c
@@ -184,15 +184,6 @@ dis_i386_supports_flags(int flags)
return (0);
}
-static int
-dis_i386_instrlen(dis_handle_t *dhp, uint64_t pc)
-{
- if (dis_disassemble(dhp, pc, NULL, 0) != 0)
- return (-1);
-
- return (dhp->dh_addr - pc);
-}
-
dis_arch_t dis_arch_i386 = {
.da_supports_flags = dis_i386_supports_flags,
.da_handle_attach = dis_i386_handle_attach,
@@ -200,5 +191,4 @@ dis_arch_t dis_arch_i386 = {
.da_disassemble = dis_i386_disassemble,
.da_min_instrlen = dis_i386_min_instrlen,
.da_max_instrlen = dis_i386_max_instrlen,
- .da_instrlen = dis_i386_instrlen,
};
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));
}