diff options
author | Toomas Soome <tsoome@me.com> | 2017-02-14 11:39:51 +0200 |
---|---|---|
committer | Dan McDonald <danmcd@omniti.com> | 2017-03-03 08:34:21 -0500 |
commit | e3ed3d332db66cf933650481f47832aaadb70ec3 (patch) | |
tree | a27ee038c04551c70511d7cad7067d0eb1a6d479 | |
parent | a536a2a3182b56eef2630fb4b4509c9e106655e6 (diff) | |
download | illumos-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.c | 12 |
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)); } /* |