{"id":2224712,"url":"http://patchwork.ozlabs.org/api/1.1/patches/2224712/?format=json","web_url":"http://patchwork.ozlabs.org/project/qemu-devel/patch/20260417205752.3932801-1-chad@jablonski.xyz/","project":{"id":14,"url":"http://patchwork.ozlabs.org/api/1.1/projects/14/?format=json","name":"QEMU Development","link_name":"qemu-devel","list_id":"qemu-devel.nongnu.org","list_email":"qemu-devel@nongnu.org","web_url":"","scm_url":"","webscm_url":""},"msgid":"<20260417205752.3932801-1-chad@jablonski.xyz>","date":"2026-04-17T20:57:52","name":"ati-vga: fix ati_set_dirty address calculation","commit_ref":null,"pull_url":null,"state":"new","archived":false,"hash":"b6d06cce4ea89fb618dd4f3cb772c79499e75441","submitter":{"id":91805,"url":"http://patchwork.ozlabs.org/api/1.1/people/91805/?format=json","name":"Chad Jablonski","email":"chad@jablonski.xyz"},"delegate":null,"mbox":"http://patchwork.ozlabs.org/project/qemu-devel/patch/20260417205752.3932801-1-chad@jablonski.xyz/mbox/","series":[{"id":500402,"url":"http://patchwork.ozlabs.org/api/1.1/series/500402/?format=json","web_url":"http://patchwork.ozlabs.org/project/qemu-devel/list/?series=500402","date":"2026-04-17T20:57:52","name":"ati-vga: fix ati_set_dirty address calculation","version":1,"mbox":"http://patchwork.ozlabs.org/series/500402/mbox/"}],"comments":"http://patchwork.ozlabs.org/api/patches/2224712/comments/","check":"pending","checks":"http://patchwork.ozlabs.org/api/patches/2224712/checks/","tags":{},"headers":{"Return-Path":"<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>","X-Original-To":"incoming@patchwork.ozlabs.org","Delivered-To":"patchwork-incoming@legolas.ozlabs.org","Authentication-Results":["legolas.ozlabs.org;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=jablonski.xyz header.i=@jablonski.xyz\n header.a=rsa-sha256 header.s=fm1 header.b=EwqXnBJN;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=messagingengine.com header.i=@messagingengine.com\n header.a=rsa-sha256 header.s=fm2 header.b=XQRj68kn;\n\tdkim-atps=neutral","legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=nongnu.org\n (client-ip=209.51.188.17; helo=lists1p.gnu.org;\n envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org;\n receiver=patchwork.ozlabs.org)"],"Received":["from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17])\n\t(using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits))\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4fy6gF3W5hz1y1V\n\tfor <incoming@patchwork.ozlabs.org>; Sat, 18 Apr 2026 06:58:47 +1000 (AEST)","from localhost ([::1] helo=lists1p.gnu.org)\n\tby lists1p.gnu.org with esmtp (Exim 4.90_1)\n\t(envelope-from <qemu-devel-bounces@nongnu.org>)\n\tid 1wDqGI-0000et-VT; Fri, 17 Apr 2026 16:58:03 -0400","from eggs.gnu.org ([2001:470:142:3::10])\n by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)\n (Exim 4.90_1) (envelope-from <chad@jablonski.xyz>)\n id 1wDqGH-0000dS-GV\n for qemu-devel@nongnu.org; Fri, 17 Apr 2026 16:58:01 -0400","from fhigh-b6-smtp.messagingengine.com ([202.12.124.157])\n by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)\n (Exim 4.90_1) (envelope-from <chad@jablonski.xyz>)\n id 1wDqGE-0002fD-Ou\n for qemu-devel@nongnu.org; Fri, 17 Apr 2026 16:58:00 -0400","from phl-compute-04.internal (phl-compute-04.internal [10.202.2.44])\n by mailfhigh.stl.internal (Postfix) with ESMTP id 45A8B7A0160;\n Fri, 17 Apr 2026 16:57:57 -0400 (EDT)","from phl-frontend-04 ([10.202.2.163])\n by phl-compute-04.internal (MEProxy); Fri, 17 Apr 2026 16:57:57 -0400","by mail.messagingengine.com (Postfix) with ESMTPA; Fri,\n 17 Apr 2026 16:57:55 -0400 (EDT)","from localhost (chomposaur [local])\n by chomposaur (OpenSMTPD) with ESMTPA id cf87f365;\n Fri, 17 Apr 2026 20:57:55 +0000 (UTC)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/relaxed; d=jablonski.xyz;\n h=cc:cc:content-transfer-encoding:content-type:date:date:from\n :from:in-reply-to:message-id:mime-version:reply-to:subject\n :subject:to:to; s=fm1; t=1776459477; x=1776545877; bh=oLnh0vhJ5B\n /i4EgnfEpvEqOHlg6psmVAusdckEyJs84=; b=EwqXnBJNAAHx7ATUndEXhu/PUh\n pszb+L3HI3ffSmPc7bhjk6mp3fvg4oGLq578SoiZtWK37RC6NTXS+1Uwv1PKdDqK\n DaYhDZ3ByDrfFcSb/0ShG+V9VyasRZCQxp4ZrubS4K4Qdegvi/18z5ucDWebCHKb\n SL45zl9NpetM/WYjaVur9g1vtAFHIM5+WhLbaWLAD4kA322jKPgqic9WXYnoSEHk\n UOWrQjV0ip75xKlkGGPw4LwRFaDm/8kW2npnxQzm15RUL2vAX0W+ZT99Mf2oI/th\n 3NQ1hgMdYmppi2Bt5r/05eJ8kUl8piw7itzNQGeAlXWmHZPvbdiXE1zraFFQ==","v=1; a=rsa-sha256; c=relaxed/relaxed; d=\n messagingengine.com; h=cc:cc:content-transfer-encoding\n :content-type:date:date:feedback-id:feedback-id:from:from\n :in-reply-to:message-id:mime-version:reply-to:subject:subject:to\n :to:x-me-proxy:x-me-sender:x-me-sender:x-sasl-enc; s=fm2; t=\n 1776459477; x=1776545877; bh=oLnh0vhJ5B/i4EgnfEpvEqOHlg6psmVAusd\n ckEyJs84=; b=XQRj68knn3q7O8l5kEkues8n2bMyN4xWvxgVlCUPTODJHM+NAgB\n AaYegj2UP6ABgcbhNKw8NaV6TfcngH9y99UTRmwnYoV6knyxNOL/nTrqbCQfz5+q\n gpO+Sy521C8XcdrAgajcqwifO9knXtrrbNXTlMSrAeVWZNkqiWnTf7ttf5KV56i1\n aESjyJVusOfrul+7EBFZ+1fDbRCTHRVahjA2fqDbvtQdl3RQxL8VWt/DEtWAN5bU\n gZOAgnbGUi6sVk2OEujCL8Z9czPg2mK+gaRIc5HpmEWekYpbDsyovqMtUfP1VYVQ\n 3QOG7fiHKFsWeJ7mQX11nsgPEhdwW7sZBxA=="],"X-ME-Sender":"<xms:1J7iadiKkVYgbiCjbQ-ihXln85sqm1eKEdt0LanHJ0-7izDrVp7NmQ>\n <xme:1J7iaZclqJ859pAOuar-9Pnh0leSySfSVlbs3AfdbeI9sMy-l8fbvDnEaMd0uEeSZ\n SUnfF4l8TzEBi6uwWNrcCaZzM6Rd_WsJIziPXzEgF8s72P4gL-tWrFa>","X-ME-Received":"\n <xmr:1J7iaaezD9qdsq_41Gs-Ct9Au-fzbPamfa_Z_w1DoUFROLta9Ux6Og_BFF_x>","X-ME-Proxy-Cause":"\n gggruggvucftvghtrhhoucdtuddrgeefhedrtddtgdehtdeltdcutefuodetggdotefrod\n ftvfcurfhrohhfihhlvgemucfhrghsthforghilhdpuffrtefokffrpgfnqfghnecuuegr\n ihhlohhuthemuceftddtnecusecvtfgvtghiphhivghnthhsucdlqddutddtmdenfghrlh\n cuvffnffculdejtddmnecujfgurhephffvvefufffkofgggfestdekredtredttdenucfh\n rhhomhepvehhrgguucflrggslhhonhhskhhiuceotghhrggusehjrggslhhonhhskhhird\n ighiiiqeenucggtffrrghtthgvrhhnpefhteeugfeujeelteeggfeigeevjeelgeegudfg\n uedvheeghfffudffledukeeiveenucevlhhushhtvghrufhiiigvpedtnecurfgrrhgrmh\n epmhgrihhlfhhrohhmpegthhgrugesjhgrsghlohhnshhkihdrgiihiidpnhgspghrtghp\n thhtohepfedpmhhouggvpehsmhhtphhouhhtpdhrtghpthhtohepsggrlhgrthhonhesvg\n hikhdrsghmvgdrhhhupdhrtghpthhtohepqhgvmhhuqdguvghvvghlsehnohhnghhnuhdr\n ohhrghdprhgtphhtthhopegthhgrugesjhgrsghlohhnshhkihdrgiihii","X-ME-Proxy":"<xmx:1J7iab8L1kwXAEtsJ68b6yPssHYZ1LKOjVgYk6WmRKURR7oQmi779Q>\n <xmx:1J7iaekVJuZ-GMkE1XbpyPOmicQ5MLsuTt8iuejEm3-65neyfVbcyg>\n <xmx:1J7iaV8rRIEyol5mVrAnufh0L3bVNeNf9h49c9tfmFjbrE2GcspImg>\n <xmx:1J7iaUnbZBQ3AK0kJLLFUolTuruN8j6vW5OJj0QerZhlwArxz7Amaw>\n <xmx:1Z7iaRo8It6Tzs2e6LFrx1wkZBeVafj_pb7b0rhn0yJU0vbbiuhXeeLR>","Feedback-ID":"ib26944c1:Fastmail","From":"Chad Jablonski <chad@jablonski.xyz>","To":"qemu-devel@nongnu.org","Cc":"BALATON Zoltan <balaton@eik.bme.hu>,\n\tChad Jablonski <chad@jablonski.xyz>","Subject":"[PATCH] ati-vga: fix ati_set_dirty address calculation","Date":"Fri, 17 Apr 2026 16:57:52 -0400","Message-ID":"<20260417205752.3932801-1-chad@jablonski.xyz>","X-Mailer":"git-send-email 2.53.0","MIME-Version":"1.0","Content-Transfer-Encoding":"8bit","Received-SPF":"pass client-ip=202.12.124.157; envelope-from=chad@jablonski.xyz;\n helo=fhigh-b6-smtp.messagingengine.com","X-Spam_score_int":"17","X-Spam_score":"1.7","X-Spam_bar":"+","X-Spam_report":"(1.7 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1,\n DKIM_VALID=-0.1,\n DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FROM_SUSPICIOUS_NTLD=0.498,\n FROM_SUSPICIOUS_NTLD_FP=1.997, PDS_OTHER_BAD_TLD=1.997,\n RCVD_IN_DNSWL_LOW=-0.7,\n RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.001,\n SPF_HELO_PASS=-0.001, SPF_PASS=-0.001,\n UNPARSEABLE_RELAY=0.001 autolearn=no autolearn_force=no","X-Spam_action":"no action","X-BeenThere":"qemu-devel@nongnu.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"qemu development <qemu-devel.nongnu.org>","List-Unsubscribe":"<https://lists.nongnu.org/mailman/options/qemu-devel>,\n <mailto:qemu-devel-request@nongnu.org?subject=unsubscribe>","List-Archive":"<https://lists.nongnu.org/archive/html/qemu-devel>","List-Post":"<mailto:qemu-devel@nongnu.org>","List-Help":"<mailto:qemu-devel-request@nongnu.org?subject=help>","List-Subscribe":"<https://lists.nongnu.org/mailman/listinfo/qemu-devel>,\n <mailto:qemu-devel-request@nongnu.org?subject=subscribe>","Errors-To":"qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org","Sender":"qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org"},"content":"When using a virtual desktop any amount of scrolling would cause\nati_set_dirty to set the wrong region of memory as dirty and screen\nupdates are missed. This is because the previous implementation\nused vga->vbe_start_addr in the dirty address calculation. It\nworks when it's zero but as soon as the virtual desktop is involved\nit's often non-zero.\n\nThe first issue is that vga->vbe_start_addr is a word offset and was\nbeing added to byte offsets. But regardless, the vbe_start_address affects\nthe scan out and not the framebuffer. We shouldn't need to apply an\noffset for it at all when thinking about dirty tracking.\n\nThe second is that a bounds check was also being performed to ensure\nthat the dirty memory was within the visible screen. With the virtual\ndesktop this isn't actually what we want. Updates can and will happen\noutside of the visible screen area. Those should be marked dirty.\n\nSigned-off-by: Chad Jablonski <chad@jablonski.xyz>\n---\n hw/display/ati_2d.c | 16 +++++-----------\n 1 file changed, 5 insertions(+), 11 deletions(-)","diff":"diff --git a/hw/display/ati_2d.c b/hw/display/ati_2d.c\nindex 504d1c5708..dc33b014eb 100644\n--- a/hw/display/ati_2d.c\n+++ b/hw/display/ati_2d.c\n@@ -71,17 +71,11 @@ static void ati_set_dirty(VGACommonState *vga, const ATI2DCtx *ctx)\n     DisplaySurface *ds = qemu_console_surface(vga->con);\n \n     (void)ds;\n-    DPRINTF(\"%p %u ds: %p %d %d rop: %x\\n\", vga->vram_ptr, vga->vbe_start_addr,\n-            surface_data(ds), surface_stride(ds), surface_bits_per_pixel(ds),\n-            ctx->rop3 >> 16);\n-    if (ctx->dst_bits >= vga->vram_ptr + vga->vbe_start_addr &&\n-        ctx->dst_bits < vga->vram_ptr + vga->vbe_start_addr +\n-        vga->vbe_regs[VBE_DISPI_INDEX_YRES] * vga->vbe_line_offset) {\n-        memory_region_set_dirty(&vga->vram,\n-                                vga->vbe_start_addr + ctx->dst_offset +\n-                                ctx->dst.y * ctx->dst_stride,\n-                                ctx->dst.height * ctx->dst_stride);\n-    }\n+    DPRINTF(\"%p ds: %p %d %d rop: %x\\n\", vga->vram_ptr, surface_data(ds),\n+            surface_stride(ds), surface_bits_per_pixel(ds), ctx->rop3 >> 16);\n+    memory_region_set_dirty(&vga->vram,\n+                            ctx->dst_offset + ctx->dst.y * ctx->dst_stride,\n+                            ctx->dst.height * ctx->dst_stride);\n }\n \n static void setup_2d_blt_ctx(const ATIVGAState *s, ATI2DCtx *ctx)\n","prefixes":[]}