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.

Reply via email to