Eric Pouech : winedbg: Correctly store integers into a bitfield.
Alexandre Julliard
julliard at winehq.org
Fri Dec 10 15:07:51 CST 2021
Module: wine
Branch: master
Commit: 0ed8cac2cd7ccda76ce20d6e06d6caf398656b3f
URL: https://source.winehq.org/git/wine.git/?a=commit;h=0ed8cac2cd7ccda76ce20d6e06d6caf398656b3f
Author: Eric Pouech <eric.pouech at gmail.com>
Date: Wed Dec 8 14:44:32 2021 +0100
winedbg: Correctly store integers into a bitfield.
Signed-off-by: Eric Pouech <eric.pouech at gmail.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
programs/winedbg/memory.c | 17 +++++++++++++++++
1 file changed, 17 insertions(+)
diff --git a/programs/winedbg/memory.c b/programs/winedbg/memory.c
index 1cf8726f467..6dffcc9db45 100644
--- a/programs/winedbg/memory.c
+++ b/programs/winedbg/memory.c
@@ -317,6 +317,23 @@ BOOL memory_store_integer(const struct dbg_lvalue* lvalue, dbg_lgint_t val)
{
DWORD64 size;
if (!types_get_info(&lvalue->type, TI_GET_LENGTH, &size)) return FALSE;
+ if (lvalue->bitlen)
+ {
+ struct dbg_lvalue alt_lvalue = *lvalue;
+ dbg_lguint_t mask, dst;
+
+ /* FIXME: this test isn't sufficient, depending on start of bitfield
+ * (ie a 64 bit field can spread across 9 bytes)
+ */
+ if (lvalue->bitlen > 8 * sizeof(dbg_lgint_t)) return FALSE;
+ /* mask is 1 where bitfield is present, 0 outside */
+ mask = (~(dbg_lguint_t)0 >> (sizeof(val) * 8 - lvalue->bitlen)) << (lvalue->bitstart & 7);
+ alt_lvalue.addr.Offset += lvalue->bitstart >> 3;
+ val <<= lvalue->bitstart & 7;
+ if (!memory_read_value(&alt_lvalue, (unsigned)size, &dst)) return FALSE;
+ val = (dst & ~mask) | (val & mask);
+ return memory_write_value(&alt_lvalue, (unsigned)size, &val);
+ }
/* this is simple if we're on a little endian CPU */
return memory_write_value(lvalue, (unsigned)size, &val);
}
More information about the wine-cvs
mailing list