Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/2215644/?format=api
{ "id": 2215644, "url": "http://patchwork.ozlabs.org/api/patches/2215644/?format=api", "web_url": "http://patchwork.ozlabs.org/project/qemu-devel/patch/20260325004052.1026892-1-richard.henderson@linaro.org/", "project": { "id": 14, "url": "http://patchwork.ozlabs.org/api/projects/14/?format=api", "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": "", "list_archive_url": "", "list_archive_url_format": "", "commit_url_format": "" }, "msgid": "<20260325004052.1026892-1-richard.henderson@linaro.org>", "list_archive_url": null, "date": "2026-03-25T00:40:52", "name": "[for-11.0] tcg: Pass host-endian values to plugin_gen_mem_callbacks_*", "commit_ref": null, "pull_url": null, "state": "new", "archived": false, "hash": "75f195233d82998c10a33e16629bf3c6bbadbc68", "submitter": { "id": 72104, "url": "http://patchwork.ozlabs.org/api/people/72104/?format=api", "name": "Richard Henderson", "email": "richard.henderson@linaro.org" }, "delegate": null, "mbox": "http://patchwork.ozlabs.org/project/qemu-devel/patch/20260325004052.1026892-1-richard.henderson@linaro.org/mbox/", "series": [ { "id": 497361, "url": "http://patchwork.ozlabs.org/api/series/497361/?format=api", "web_url": "http://patchwork.ozlabs.org/project/qemu-devel/list/?series=497361", "date": "2026-03-25T00:40:52", "name": "[for-11.0] tcg: Pass host-endian values to plugin_gen_mem_callbacks_*", "version": 1, "mbox": "http://patchwork.ozlabs.org/series/497361/mbox/" } ], "comments": "http://patchwork.ozlabs.org/api/patches/2215644/comments/", "check": "pending", "checks": "http://patchwork.ozlabs.org/api/patches/2215644/checks/", "tags": {}, "related": [], "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=linaro.org header.i=@linaro.org header.a=rsa-sha256\n header.s=google header.b=BYFbw5HB;\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=lists.gnu.org;\n envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org;\n receiver=patchwork.ozlabs.org)" ], "Received": [ "from lists.gnu.org (lists.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 4fgSm307Rkz1y1G\n\tfor <incoming@patchwork.ozlabs.org>; Wed, 25 Mar 2026 11:42:09 +1100 (AEDT)", "from localhost ([::1] helo=lists1p.gnu.org)\n\tby lists.gnu.org with esmtp (Exim 4.90_1)\n\t(envelope-from <qemu-devel-bounces@nongnu.org>)\n\tid 1w5CJ2-0002XK-3e; Tue, 24 Mar 2026 20:41:09 -0400", "from eggs.gnu.org ([2001:470:142:3::10])\n by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)\n (Exim 4.90_1) (envelope-from <richard.henderson@linaro.org>)\n id 1w5CJ0-0002X2-6X\n for qemu-devel@nongnu.org; Tue, 24 Mar 2026 20:41:06 -0400", "from mail-pj1-x1031.google.com ([2607:f8b0:4864:20::1031])\n by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128)\n (Exim 4.90_1) (envelope-from <richard.henderson@linaro.org>)\n id 1w5CIw-00074i-P6\n for qemu-devel@nongnu.org; Tue, 24 Mar 2026 20:41:05 -0400", "by mail-pj1-x1031.google.com with SMTP id\n 98e67ed59e1d1-35691a231a7so1157559a91.3\n for <qemu-devel@nongnu.org>; Tue, 24 Mar 2026 17:41:01 -0700 (PDT)", "from stoup.. ([103.100.225.140]) by smtp.gmail.com with ESMTPSA id\n 98e67ed59e1d1-35c0e7452d8sm547064a91.11.2026.03.24.17.40.58\n (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n Tue, 24 Mar 2026 17:40:59 -0700 (PDT)" ], "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=linaro.org; s=google; t=1774399260; x=1775004060; darn=nongnu.org;\n h=content-transfer-encoding:mime-version:message-id:date:subject:cc\n :to:from:from:to:cc:subject:date:message-id:reply-to;\n bh=HDshtx+/Cv9MisFd7fSyd+2O4yxqRK4BKvfnLHyGW04=;\n b=BYFbw5HBNqvokt4L1cr41WyCtK0tPX1j0PgVN7MPHK3KyZ167U1+VIWCmGi5uxuyLs\n 3HX4msy9VaXpHA+G1WTSBcXjiy13VGQjfyLt2jKq1gq5/IrMqVQTclBcFatauoPb0zsr\n JXIumPINSQchc0o+xbY2S4GzlB+VISQ94GqjA63GJH1cEj7YEmiBK6qZvgFA9o45wFMa\n zqPYwfXBegCU81saO8GFACBFA74nWq06XGp3LybXGmleV1t6zsD5KnKAa+DYo5opQipJ\n YtwJ4kcr50EZi0ShOAE4m6yUpRaJVhqxxKvHniZ9j5sCnuxA/7OHLXPex4Tride32+PY\n io4w==", "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20251104; t=1774399260; x=1775004060;\n h=content-transfer-encoding:mime-version:message-id:date:subject:cc\n :to:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date\n :message-id:reply-to;\n bh=HDshtx+/Cv9MisFd7fSyd+2O4yxqRK4BKvfnLHyGW04=;\n b=m1nkrVAXghq9PAYRKJ+OANR/9QcQWsvOiOC9uUxILMEaWbLKsIlT/vBmH+0/dSG9Ug\n cep5wahzFpNE3zPzXBvUyrZmNBrmAZ7gRK3pd4xnub1FSeosbNExKS2kyEiS8ZgqaVVe\n i5iZmv30uv7TtZi8Fi+WaJm9MKDw2ssxzwZR/4zp645qPDExXWMHnmYdY9/eQsU/xCNi\n e4pVwvK/aSZl99npxy+Urq8U6TBL/v2NIi2bkzSVDGe+sb3or3Vx1Jr4+EWW0Rj5CrYN\n kSlbfQh7UlithpLsmErRSg8c5cm45lTru0q1mec2PmvoA7KzbYxLajUI7t/DSYyh4g9i\n XqZg==", "X-Gm-Message-State": "AOJu0Yz9Vf6ctio8xlxiLGAgN/7rTMzRdjc5fBFALFFLVJs095oV/+8Q\n BHHn7YdjNVtJ8HIz55t59YL3mPUv1jzwvkGXnwCUVctJzEH5eev4VqVOngFw9Xe1+t/i+AnCwdB\n UdZxT6No=", "X-Gm-Gg": "ATEYQzwUIXCCPIQC8fcHQ2cwenJAP3uqrMsmim6IsCXxAqEPzt7ZXYi0YPnFx6xFS6H\n ClhPIL0HIZcDtSwF61HFNnThFvscX3pb6xuK4DtX4CyWTP78h9pgTfR1pgQ79nOaNNUNuPdhXS+\n 9KJpIC2zeBCv1UCxYm2VfrRCCPk1Ymi/ud7voXv5hC+hfQZHAEdcX1i9FrRrn8K5tycToHzPXW6\n e2r2mR84c7JSOtA4h38M2PPFauvNZqaZ+KXDy77TH1j3GUQjENHJzkN7GYeRD4Sgl1tqpoDB5yQ\n ziLzXeVm/9UwdWGLUaKk0gFd+UGvZIhGw89vWokJ11+ofbzXoBHcsfbtTQqokc0vawuUa0+xG43\n PQepeYicErqZ3mc7Z2XD7P3xXcDm3OgIG3GgkP+bo1339UMO8+ApXNTZx/viWmEn5mtX62ms0yX\n VkmcINeQKVQf6DkTy4IQXoYU5Pmy+8z2tT0czMYAQTjw==", "X-Received": "by 2002:a17:90a:e705:b0:35a:24f3:2c8e with SMTP id\n 98e67ed59e1d1-35c0dd01ee3mr1263512a91.9.1774399260282;\n Tue, 24 Mar 2026 17:41:00 -0700 (PDT)", "From": "Richard Henderson <richard.henderson@linaro.org>", "To": "qemu-devel@nongnu.org", "Cc": "pierrick.bouvier@linaro.org", "Subject": "[PATCH for-11.0] tcg: Pass host-endian values to\n plugin_gen_mem_callbacks_*", "Date": "Wed, 25 Mar 2026 10:40:52 +1000", "Message-ID": "<20260325004052.1026892-1-richard.henderson@linaro.org>", "X-Mailer": "git-send-email 2.43.0", "MIME-Version": "1.0", "Content-Transfer-Encoding": "8bit", "Received-SPF": "pass client-ip=2607:f8b0:4864:20::1031;\n envelope-from=richard.henderson@linaro.org; helo=mail-pj1-x1031.google.com", "X-Spam_score_int": "-20", "X-Spam_score": "-2.1", "X-Spam_bar": "--", "X-Spam_report": "(-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1,\n DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1,\n RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001,\n SPF_PASS=-0.001 autolearn=ham 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": "If the host does not support swapped-endian loads and stores,\nthen we emulate those within the tcg expanders with explicit\nbswap operations.\n\nHowever, we were passing values to the plugin interface in\nthe middle of those bswap operations, which meant that we\nwould pass values of the wrong endianness to plugins when\nrunning on hosts without swapped-endian loads and stores.\n\nResolves: https://gitlab.com/qemu-project/qemu/-/work_items/3351\nSigned-off-by: Richard Henderson <richard.henderson@linaro.org>\n---\n\nHi Pierrick,\n\nOn IRC I expressed the opinion that there was an additional\nbig-endian bug with how we treat neg.plugin_mem_value_low,\nbut I now see that isn't true, because of how we adjust the\nstore address in plugin_gen_mem_callbacks_i32.\n\n\nr~\n---\n tcg/tcg-op-ldst.c | 52 ++++++++++++++++++++++++-----------------------\n 1 file changed, 27 insertions(+), 25 deletions(-)", "diff": "diff --git a/tcg/tcg-op-ldst.c b/tcg/tcg-op-ldst.c\nindex 354d9968f9..22211ccb45 100644\n--- a/tcg/tcg-op-ldst.c\n+++ b/tcg/tcg-op-ldst.c\n@@ -262,9 +262,6 @@ static void tcg_gen_qemu_ld_i32_int(TCGv_i32 val, TCGTemp *addr,\n addr_new = tci_extend_addr(addr);\n copy_addr = plugin_maybe_preserve_addr(addr);\n gen_ldst1(INDEX_op_qemu_ld, TCG_TYPE_I32, tcgv_i32_temp(val), addr_new, oi);\n- plugin_gen_mem_callbacks_i32(val, copy_addr, addr, orig_oi,\n- QEMU_PLUGIN_MEM_R);\n- maybe_free_addr(addr, addr_new);\n \n if ((orig_memop ^ memop) & MO_BSWAP) {\n switch (orig_memop & MO_SIZE) {\n@@ -280,6 +277,10 @@ static void tcg_gen_qemu_ld_i32_int(TCGv_i32 val, TCGTemp *addr,\n g_assert_not_reached();\n }\n }\n+\n+ plugin_gen_mem_callbacks_i32(val, copy_addr, addr, orig_oi,\n+ QEMU_PLUGIN_MEM_R);\n+ maybe_free_addr(addr, addr_new);\n }\n \n void tcg_gen_qemu_ld_i32_chk(TCGv_i32 val, TCGTemp *addr, TCGArg idx,\n@@ -290,10 +291,10 @@ void tcg_gen_qemu_ld_i32_chk(TCGv_i32 val, TCGTemp *addr, TCGArg idx,\n tcg_gen_qemu_ld_i32_int(val, addr, idx, memop);\n }\n \n-static void tcg_gen_qemu_st_i32_int(TCGv_i32 val, TCGTemp *addr,\n+static void tcg_gen_qemu_st_i32_int(TCGv_i32 orig_val, TCGTemp *addr,\n TCGArg idx, MemOp memop)\n {\n- TCGv_i32 swap = NULL;\n+ TCGv_i32 val = orig_val;\n MemOpIdx orig_oi, oi;\n TCGTemp *addr_new;\n \n@@ -302,29 +303,29 @@ static void tcg_gen_qemu_st_i32_int(TCGv_i32 val, TCGTemp *addr,\n orig_oi = oi = make_memop_idx(memop, idx);\n \n if ((memop & MO_BSWAP) && !tcg_target_has_memory_bswap(memop)) {\n- swap = tcg_temp_ebb_new_i32();\n+ val = tcg_temp_ebb_new_i32();\n switch (memop & MO_SIZE) {\n case MO_16:\n- tcg_gen_bswap16_i32(swap, val, 0);\n+ tcg_gen_bswap16_i32(val, orig_val, 0);\n break;\n case MO_32:\n- tcg_gen_bswap32_i32(swap, val);\n+ tcg_gen_bswap32_i32(val, orig_val);\n break;\n default:\n g_assert_not_reached();\n }\n- val = swap;\n memop &= ~MO_BSWAP;\n oi = make_memop_idx(memop, idx);\n }\n \n addr_new = tci_extend_addr(addr);\n gen_ldst1(INDEX_op_qemu_st, TCG_TYPE_I32, tcgv_i32_temp(val), addr_new, oi);\n- plugin_gen_mem_callbacks_i32(val, NULL, addr, orig_oi, QEMU_PLUGIN_MEM_W);\n+ plugin_gen_mem_callbacks_i32(orig_val, NULL, addr, orig_oi,\n+ QEMU_PLUGIN_MEM_W);\n maybe_free_addr(addr, addr_new);\n \n- if (swap) {\n- tcg_temp_free_i32(swap);\n+ if (val != orig_val) {\n+ tcg_temp_free_i32(val);\n }\n }\n \n@@ -360,9 +361,6 @@ static void tcg_gen_qemu_ld_i64_int(TCGv_i64 val, TCGTemp *addr,\n addr_new = tci_extend_addr(addr);\n copy_addr = plugin_maybe_preserve_addr(addr);\n gen_ld_i64(val, addr_new, oi);\n- plugin_gen_mem_callbacks_i64(val, copy_addr, addr, orig_oi,\n- QEMU_PLUGIN_MEM_R);\n- maybe_free_addr(addr, addr_new);\n \n if ((orig_memop ^ memop) & MO_BSWAP) {\n int flags = (orig_memop & MO_SIGN\n@@ -382,6 +380,10 @@ static void tcg_gen_qemu_ld_i64_int(TCGv_i64 val, TCGTemp *addr,\n g_assert_not_reached();\n }\n }\n+\n+ plugin_gen_mem_callbacks_i64(val, copy_addr, addr, orig_oi,\n+ QEMU_PLUGIN_MEM_R);\n+ maybe_free_addr(addr, addr_new);\n }\n \n void tcg_gen_qemu_ld_i64_chk(TCGv_i64 val, TCGTemp *addr, TCGArg idx,\n@@ -392,10 +394,10 @@ void tcg_gen_qemu_ld_i64_chk(TCGv_i64 val, TCGTemp *addr, TCGArg idx,\n tcg_gen_qemu_ld_i64_int(val, addr, idx, memop);\n }\n \n-static void tcg_gen_qemu_st_i64_int(TCGv_i64 val, TCGTemp *addr,\n+static void tcg_gen_qemu_st_i64_int(TCGv_i64 orig_val, TCGTemp *addr,\n TCGArg idx, MemOp memop)\n {\n- TCGv_i64 swap = NULL;\n+ TCGv_i64 val = orig_val;\n MemOpIdx orig_oi, oi;\n TCGTemp *addr_new;\n \n@@ -404,32 +406,32 @@ static void tcg_gen_qemu_st_i64_int(TCGv_i64 val, TCGTemp *addr,\n orig_oi = oi = make_memop_idx(memop, idx);\n \n if ((memop & MO_BSWAP) && !tcg_target_has_memory_bswap(memop)) {\n- swap = tcg_temp_ebb_new_i64();\n+ val = tcg_temp_ebb_new_i64();\n switch (memop & MO_SIZE) {\n case MO_16:\n- tcg_gen_bswap16_i64(swap, val, 0);\n+ tcg_gen_bswap16_i64(val, orig_val, 0);\n break;\n case MO_32:\n- tcg_gen_bswap32_i64(swap, val, 0);\n+ tcg_gen_bswap32_i64(val, orig_val, 0);\n break;\n case MO_64:\n- tcg_gen_bswap64_i64(swap, val);\n+ tcg_gen_bswap64_i64(val, orig_val);\n break;\n default:\n g_assert_not_reached();\n }\n- val = swap;\n memop &= ~MO_BSWAP;\n oi = make_memop_idx(memop, idx);\n }\n \n addr_new = tci_extend_addr(addr);\n gen_st_i64(val, addr_new, oi);\n- plugin_gen_mem_callbacks_i64(val, NULL, addr, orig_oi, QEMU_PLUGIN_MEM_W);\n+ plugin_gen_mem_callbacks_i64(orig_val, NULL, addr, orig_oi,\n+ QEMU_PLUGIN_MEM_W);\n maybe_free_addr(addr, addr_new);\n \n- if (swap) {\n- tcg_temp_free_i64(swap);\n+ if (val != orig_val) {\n+ tcg_temp_free_i64(val);\n }\n }\n \n", "prefixes": [ "for-11.0" ] }