summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorToomas Soome <tsoome@me.com>2017-02-14 11:39:51 +0200
committerDan McDonald <danmcd@omniti.com>2017-03-03 08:34:21 -0500
commite3ed3d332db66cf933650481f47832aaadb70ec3 (patch)
treea27ee038c04551c70511d7cad7067d0eb1a6d479
parenta536a2a3182b56eef2630fb4b4509c9e106655e6 (diff)
downloadillumos-joyent-e3ed3d332db66cf933650481f47832aaadb70ec3.tar.gz
7862 libdisasm: left shift of negative value
Reviewed by: Vitaliy Gusev <gusev.vitaliy@icloud.com> Reviewed by: Marcel Telka <marcel@telka.sk> Reviewed by: Yuri Pankov <yuri.pankov@gmail.com> Reviewed by: Robert Mustacchi <rm@joyent.com> Reviewed by: Dale Ghent <daleg@omniti.com> Reviewed by: Jason King <jason.brian.king@gmail.com> Reviewed by: Andrew Stormont <andyjstormont@gmail.com> Approved by: Dan McDonald <danmcd@omniti.com>
-rw-r--r--usr/src/lib/libdisasm/common/dis_sparc_fmt.c12
1 files changed, 7 insertions, 5 deletions
diff --git a/usr/src/lib/libdisasm/common/dis_sparc_fmt.c b/usr/src/lib/libdisasm/common/dis_sparc_fmt.c
index 017c056477..ceaafa47fe 100644
--- a/usr/src/lib/libdisasm/common/dis_sparc_fmt.c
+++ b/usr/src/lib/libdisasm/common/dis_sparc_fmt.c
@@ -32,6 +32,7 @@
#include <sys/byteorder.h>
+#include <sys/debug.h>
#include <stdarg.h>
#if !defined(DIS_STANDALONE)
@@ -647,7 +648,7 @@ static const char *prefetch_str[32] = {
static void prt_field(const char *, uint32_t, int);
static const char *get_regname(dis_handle_t *, int, uint32_t);
-static int32_t sign_extend(int32_t, int32_t);
+static int32_t sign_extend(int32_t, uint32_t);
static void prt_name(dis_handle_t *, const char *, int);
@@ -2203,12 +2204,13 @@ prt_field(const char *field, uint32_t val, int len)
* integer
*/
static int32_t
-sign_extend(int32_t val, int32_t bits)
+sign_extend(int32_t val, uint32_t bits)
{
- if ((val & (1L << (bits - 1))) == 0)
- return (val);
+ uint32_t mask;
- return ((-1L << bits) | val);
+ ASSERT(bits > 0);
+ mask = 1L << (bits - 1); /* 2**(bits - 1) */
+ return (-(val & mask) + (val & ~mask));
}
/*