From 0d7c6eedc7b59842d36e59f0eebb583e9569958a Mon Sep 17 00:00:00 2001 From: Emma Anholt Date: Thu, 4 Nov 2021 16:03:13 -0700 Subject: [PATCH] freedreno/cffdump: Fix 64-bit reg decode in script mode. Part-of: --- src/freedreno/decode/rnnutil.c | 2 +- src/freedreno/decode/rnnutil.h | 7 +++---- src/freedreno/decode/script.c | 9 ++++++--- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/freedreno/decode/rnnutil.c b/src/freedreno/decode/rnnutil.c index 5178f676e7a..d280389eafc 100644 --- a/src/freedreno/decode/rnnutil.c +++ b/src/freedreno/decode/rnnutil.c @@ -201,7 +201,7 @@ rnn_regoff(struct rnn *rnn, uint32_t offset) } enum rnnttype -rnn_decodelem(struct rnn *rnn, struct rnntypeinfo *info, uint32_t regval, +rnn_decodelem(struct rnn *rnn, struct rnntypeinfo *info, uint64_t regval, union rnndecval *val) { val->u = regval; diff --git a/src/freedreno/decode/rnnutil.h b/src/freedreno/decode/rnnutil.h index b6c65b306a4..b2883235da6 100644 --- a/src/freedreno/decode/rnnutil.h +++ b/src/freedreno/decode/rnnutil.h @@ -44,9 +44,8 @@ struct rnn { }; union rnndecval { - uint32_t u; - int32_t i; - float f; + uint64_t u; + int64_t i; }; void _rnn_init(struct rnn *rnn, int nocolor); @@ -61,6 +60,6 @@ const char *rnn_enumname(struct rnn *rnn, const char *name, uint32_t val); struct rnndelem *rnn_regelem(struct rnn *rnn, const char *name); struct rnndelem *rnn_regoff(struct rnn *rnn, uint32_t offset); enum rnnttype rnn_decodelem(struct rnn *rnn, struct rnntypeinfo *info, - uint32_t regval, union rnndecval *val); + uint64_t regval, union rnndecval *val); #endif /* RNNUTIL_H_ */ diff --git a/src/freedreno/decode/script.c b/src/freedreno/decode/script.c index c32c37aad09..52962dfef9f 100644 --- a/src/freedreno/decode/script.c +++ b/src/freedreno/decode/script.c @@ -35,6 +35,7 @@ #include #include #include +#include "util/u_math.h" #include "cffdec.h" #include "rnnutil.h" @@ -181,7 +182,7 @@ static int l_rnn_etype_reg(lua_State *L, struct rnn *rnn, struct rnndelem *elem, uint64_t offset); static int -pushdecval(struct lua_State *L, struct rnn *rnn, uint32_t regval, +pushdecval(struct lua_State *L, struct rnn *rnn, uint64_t regval, struct rnntypeinfo *info) { union rnndecval val; @@ -198,7 +199,7 @@ pushdecval(struct lua_State *L, struct rnn *rnn, uint32_t regval, lua_pushunsigned(L, val.u); return 1; case RNN_TTYPE_FLOAT: - lua_pushnumber(L, val.f); + lua_pushnumber(L, uif(val.u)); return 1; case RNN_TTYPE_BOOLEAN: lua_pushboolean(L, val.u); @@ -214,7 +215,7 @@ l_rnn_etype(lua_State *L, struct rnn *rnn, struct rnndelem *elem, uint64_t offset) { int ret; - uint32_t regval; + uint64_t regval; DBG("elem=%p (%d), offset=%lu", elem, elem->type, offset); switch (elem->type) { case RNN_ETYPE_REG: @@ -222,6 +223,8 @@ l_rnn_etype(lua_State *L, struct rnn *rnn, struct rnndelem *elem, * the raw value: */ regval = rnn_val(rnn, offset); + if (elem->width == 64) + regval |= (uint64_t)rnn_val(rnn, offset + 1) << 32; regval <<= elem->typeinfo.shr; ret = pushdecval(L, rnn, regval, &elem->typeinfo); if (ret)