Hi,
On 8/3/26 23:34, Philippe Mathieu-Daudé wrote:
From: Chad Jablonski <[email protected]>
Implement read and write operations on SC_TOP_LEFT, SC_BOTTOM_RIGHT,
and SRC_SC_BOTTOM_RIGHT registers. These registers are also updated
when the src and/or dst clipping fields on DP_GUI_MASTER_CNTL are set
to default clipping.
Scissor clipping is used when rendering text in X.org. The r128 driver
sends host data much wider than is necessary to draw a glyph and cuts it
down to size using clipping before rendering. The actual clipping
implementation follows in a future patch.
This also includes a very minor refactor of the combined
default_sc_bottom_right field in the registers struct to
default_sc_bottom and default_sc_right. This was done to
stay consistent with the other scissor registers and prevent repeated
masking and extraction.
Signed-off-by: Chad Jablonski <[email protected]>
Reviewed-by: BALATON Zoltan <[email protected]>
Message-ID: <[email protected]>
Signed-off-by: Philippe Mathieu-Daudé <[email protected]>
---
hw/display/ati_int.h | 9 +++++-
hw/display/ati_regs.h | 2 ++
hw/display/ati.c | 70 +++++++++++++++++++++++++++++++++++++++++--
3 files changed, 78 insertions(+), 3 deletions(-)
diff --git a/hw/display/ati_regs.h b/hw/display/ati_regs.h
index 0a0825db048..3999edb9b71 100644
--- a/hw/display/ati_regs.h
+++ b/hw/display/ati_regs.h
@@ -397,6 +397,8 @@
#define GMC_DST_PITCH_OFFSET_CNTL 0x00000002
#define GMC_SRC_CLIP_DEFAULT 0x00000000
#define GMC_DST_CLIP_DEFAULT 0x00000000
+#define GMC_SRC_CLIPPING 0x00000004
+#define GMC_DST_CLIPPING 0x00000008
#define GMC_BRUSH_SOLIDCOLOR 0x000000d0
#define GMC_SRC_DSTCOLOR 0x00003000
#define GMC_BYTE_ORDER_MSB_TO_LSB 0x00000000
diff --git a/hw/display/ati.c b/hw/display/ati.c
index 26fc74b19b3..6cf243bcf95 100644
--- a/hw/display/ati.c
+++ b/hw/display/ati.c
@@ -514,7 +514,32 @@ static uint64_t ati_mm_read(void *opaque, hwaddr addr,
unsigned int size)
val |= s->regs.default_tile << 16;
break;
case DEFAULT_SC_BOTTOM_RIGHT:
- val = s->regs.default_sc_bottom_right;
+ val = (s->regs.default_sc_bottom << 16) |
+ s->regs.default_sc_right;
Coverity is reporting an integer handling issues (SIGN_EXTENSION,
CID 1645615):
>>> CID 1645615: Integer handling issues (SIGN_EXTENSION)
>>> Suspicious implicit sign extension: "s->regs.default_sc_bottom"
with type "uint16_t" (16 bits, unsigned) is promoted in
"(s->regs.default_sc_bottom << 16) | s->regs.default_sc_right" to type
"int" (32 bits, signed), then sign-extended to type "unsigned long" (64
bits, unsigned). If "(s->regs.default_sc_bottom << 16) |
s->regs.default_sc_right" is greater than 0x7FFFFFFF, the upper bits of
the result will all be 1.
Do you mind posting a fix?
Thanks,
Phil.