{"id":2175183,"url":"http://patchwork.ozlabs.org/api/1.0/patches/2175183/?format=json","project":{"id":14,"url":"http://patchwork.ozlabs.org/api/1.0/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":"<20251217143150.94463-10-philmd@linaro.org>","date":"2025-12-17T14:31:45","name":"[09/14] system/memory: Define address_space_ldst[W] endian variants via template","commit_ref":null,"pull_url":null,"state":"new","archived":false,"hash":"96b9331dee7cdc250f0a6676039676f4a6ebd9a5","submitter":{"id":85046,"url":"http://patchwork.ozlabs.org/api/1.0/people/85046/?format=json","name":"Philippe Mathieu-Daudé","email":"philmd@linaro.org"},"delegate":null,"mbox":"http://patchwork.ozlabs.org/project/qemu-devel/patch/20251217143150.94463-10-philmd@linaro.org/mbox/","series":[{"id":485701,"url":"http://patchwork.ozlabs.org/api/1.0/series/485701/?format=json","date":"2025-12-17T14:31:37","name":"system/memory: Clean ups around address_space_ldst() endian variants","version":1,"mbox":"http://patchwork.ozlabs.org/series/485701/mbox/"}],"check":"pending","checks":"http://patchwork.ozlabs.org/api/patches/2175183/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=linaro.org header.i=@linaro.org header.a=rsa-sha256\n header.s=google header.b=g7Z3X3os;\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 4dWbt36kvHz1y0P\n\tfor <incoming@patchwork.ozlabs.org>; Thu, 18 Dec 2025 01:34:51 +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 1vVsaa-00025n-So; Wed, 17 Dec 2025 09:33:16 -0500","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 <philmd@linaro.org>) id 1vVsaZ-00023g-9r\n for qemu-devel@nongnu.org; Wed, 17 Dec 2025 09:33:15 -0500","from mail-wm1-x330.google.com ([2a00:1450:4864:20::330])\n by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128)\n (Exim 4.90_1) (envelope-from <philmd@linaro.org>) id 1vVsaU-0007H0-6Y\n for qemu-devel@nongnu.org; Wed, 17 Dec 2025 09:33:14 -0500","by mail-wm1-x330.google.com with SMTP id\n 5b1f17b1804b1-4779cb0a33fso69558475e9.0\n for <qemu-devel@nongnu.org>; Wed, 17 Dec 2025 06:33:05 -0800 (PST)","from localhost.localdomain (88-187-86-199.subs.proxad.net.\n [88.187.86.199]) by smtp.gmail.com with ESMTPSA id\n ffacd0b85a97d-4310ada846bsm5016541f8f.9.2025.12.17.06.33.00\n (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256);\n Wed, 17 Dec 2025 06:33:00 -0800 (PST)"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=linaro.org; s=google; t=1765981982; x=1766586782; darn=nongnu.org;\n h=content-transfer-encoding:mime-version:references:in-reply-to\n :message-id:date:subject:cc:to:from:from:to:cc:subject:date\n :message-id:reply-to;\n bh=npahtTZPNb59B+CU/KRSE/J9yiwWz2PKpOjmrQGOCdA=;\n b=g7Z3X3osHDGvLVW+0g5KjQMQj8GN1odZCDTdd8KzbhojdHwXGqd1SVPmnByP+aTL57\n CobuU3TNyOnH1ehCCXzpD+SAJzUtyUKrVArtVoHpQYF/QKOA8kbDrHlrfeN/7O+4THgt\n kfi61o1KZW/rU0R1g9TXx+Zs4efXOJ1knrRUBF4qHLHy4gQSUNRSBIGw0priWIulQRr1\n RBUlvLjbEXhHcSMpChP/m0gb6ZCviXRXrIAdQcHVapQ273lNWEQginTze+4JEH011oso\n W791bJAahRrkNYn4FQ7NlbkWa28qEum5m4+vprcexy2oNvmZlng6Lyb9siJ88V81rnnL\n nFiQ==","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20230601; t=1765981982; x=1766586782;\n h=content-transfer-encoding:mime-version:references:in-reply-to\n :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from\n :to:cc:subject:date:message-id:reply-to;\n bh=npahtTZPNb59B+CU/KRSE/J9yiwWz2PKpOjmrQGOCdA=;\n b=KrL0aDkxd8636c17+JrTjEmdfcfL3yITwrL8jmnf4p99LRtCuhttwjWsVa13IZeXbY\n WI+h4UWZ8zATRFMkBgxAJ46Je2FTJ0T1+B/n2zq0Np3pXE75xS731Sg1KGBMFYOqXqU/\n P1egKI0Lq/59/U4biAgL9dggXvMEzCMdN1Yv+NCsrhBb1p307jZ5utHXAa0Inispj39y\n G/sFJ1TlRb6ne9nMBLJwjkg1Dr+ypNc4TyRI14UWxYdxdY4b/FyKIjbQeVYx5tEu9Lb8\n fRQrZZ/HUbtBjP9SGhFhCgdIdmJDiCbDNYPtz24LwNOpOgYJoTHEePj44ezbgKNvrIwn\n fS3w==","X-Gm-Message-State":"AOJu0YxAJw+CDQXxOTFvhbLpDhihLxIp+OVYlX70hirYHpBGYMfTdUXj\n 7mGVjA2uxfxpgBxssh9uSUq+9H0hCUjiMFNLx/TfaRTair+jEnavCOgn0evwyKkzatev1xohY6Y\n xYcCd8nM2wg==","X-Gm-Gg":"AY/fxX4YPVVu3COpx5ly9oN0ZiNyYJsXgYbL4AhbHF8OZN+Dr2FsestfXcvwJGN/d8u\n ivVyKWnn5de1WLgtzMr9yRWRqbw64Q+ac7+yJarWEAUOZtP668gyZBZ6G28tDk/gC8qL7sUiihb\n QJw2IPOy/fHypZDfJzlM6PYECyLGtJlrGYN81cy/YVThYp0i5yQI1K1pVzzWbW5a/ILzo/Hegav\n +F7ay611JnnufgRD9Ml1/6BR1rLCbPY6iE21vvMRwLdqiwszCK6eIijmG5xh9owsZFduziKI435\n 86X2PgfMDn/g4A3gHmGfvhGSD2m6X/Y5UAyQJzey4cbjvuwmF7TL2eOil4q5slDPejZIG5BOv2F\n 4fpRKrDUBEukQqMZlALd/kW61p5LBe85uWCoXt0gnWAdtsp5107ZGFHedAXQk5wvDfOGjJO5YJX\n 63v7DlzAO2Uk9SkAOUPwl37sp/gQFYvh1TDAx9IaJ+X9p8R+nhwtuLkw0IRl8z","X-Google-Smtp-Source":"\n AGHT+IFz4aB2FClE+JBr9xpGXt0+LxuKd8VzhrJ8yc0DmbmXqBBLLPlemFmogH3RTY8odeSjZ8qLpg==","X-Received":"by 2002:a05:600c:8b61:b0:477:6d96:b3ca with SMTP id\n 5b1f17b1804b1-47a8f89b69fmr211658035e9.5.1765981982100;\n Wed, 17 Dec 2025 06:33:02 -0800 (PST)","From":"=?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= <philmd@linaro.org>","To":"qemu-devel@nongnu.org","Cc":"=?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= <philmd@linaro.org>,\n Anton Johansson <anjo@rev.ng>, qemu-arm@nongnu.org,\n Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>,\n Paolo Bonzini <pbonzini@redhat.com>, \"Michael S. Tsirkin\" <mst@redhat.com>,\n Artyom Tarasenko <atar4qemu@gmail.com>,\n Peter Maydell <peter.maydell@linaro.org>,\n David Hildenbrand <david@kernel.org>, Peter Xu <peterx@redhat.com>","Subject":"[PATCH 09/14] system/memory: Define address_space_ldst[W] endian\n variants via template","Date":"Wed, 17 Dec 2025 15:31:45 +0100","Message-ID":"<20251217143150.94463-10-philmd@linaro.org>","X-Mailer":"git-send-email 2.52.0","In-Reply-To":"<20251217143150.94463-1-philmd@linaro.org>","References":"<20251217143150.94463-1-philmd@linaro.org>","MIME-Version":"1.0","Content-Type":"text/plain; charset=UTF-8","Content-Transfer-Encoding":"8bit","Received-SPF":"pass client-ip=2a00:1450:4864:20::330;\n envelope-from=philmd@linaro.org; helo=mail-wm1-x330.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=unavailable 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-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":"Like we do for other LD/ST APIs, use one template to declare and\ndefine all endianness variants of the address_space_lduw() methods.\n\nSigned-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>\n---\n MAINTAINERS                                  |  2 +\n include/exec/memory_ldst.h.inc               | 21 ++++----\n include/exec/memory_ldst_phys.h.inc          | 45 ++++------------\n include/system/memory_ldst_endian.h.inc      | 25 +++++++++\n include/system/memory_ldst_phys_endian.h.inc | 37 ++++++++++++++\n system/memory_ldst.c.inc                     | 54 +++++---------------\n system/memory_ldst_endian.c.inc              | 42 +++++++++++++++\n 7 files changed, 136 insertions(+), 90 deletions(-)\n create mode 100644 include/system/memory_ldst_endian.h.inc\n create mode 100644 include/system/memory_ldst_phys_endian.h.inc\n create mode 100644 system/memory_ldst_endian.c.inc","diff":"diff --git a/MAINTAINERS b/MAINTAINERS\nindex c299b84d418..41a45904cd5 100644\n--- a/MAINTAINERS\n+++ b/MAINTAINERS\n@@ -3256,6 +3256,7 @@ F: include/system/ioport.h\n F: include/exec/memop.h\n F: include/system/memory.h\n F: include/system/memory_cached.h\n+F: include/system/memory_ldst*\n F: include/system/physmem.h\n F: include/system/ram_addr.h\n F: include/system/ramblock.h\n@@ -3265,6 +3266,7 @@ F: system/ioport.c\n F: system/memory.c\n F: system/memory_mapping.c\n F: system/physmem.c\n+F: system/memory_ldst*\n F: system/memory-internal.h\n F: system/ram-block-attributes.c\n F: scripts/coccinelle/memory-region-housekeeping.cocci\ndiff --git a/include/exec/memory_ldst.h.inc b/include/exec/memory_ldst.h.inc\nindex 173164fee3a..73c0366a247 100644\n--- a/include/exec/memory_ldst.h.inc\n+++ b/include/exec/memory_ldst.h.inc\n@@ -19,24 +19,16 @@\n  * License along with this library; if not, see <http://www.gnu.org/licenses/>.\n  */\n \n-uint16_t glue(address_space_lduw, SUFFIX)(ARG1_DECL,\n-    hwaddr addr, MemTxAttrs attrs, MemTxResult *result);\n uint32_t glue(address_space_ldl, SUFFIX)(ARG1_DECL,\n     hwaddr addr, MemTxAttrs attrs, MemTxResult *result);\n uint64_t glue(address_space_ldq, SUFFIX)(ARG1_DECL,\n     hwaddr addr, MemTxAttrs attrs, MemTxResult *result);\n-void glue(address_space_stw, SUFFIX)(ARG1_DECL,\n-    hwaddr addr, uint16_t val, MemTxAttrs attrs, MemTxResult *result);\n void glue(address_space_stl, SUFFIX)(ARG1_DECL,\n     hwaddr addr, uint32_t val, MemTxAttrs attrs, MemTxResult *result);\n void glue(address_space_stq, SUFFIX)(ARG1_DECL,\n     hwaddr addr, uint64_t val, MemTxAttrs attrs, MemTxResult *result);\n uint8_t glue(address_space_ldub, SUFFIX)(ARG1_DECL,\n     hwaddr addr, MemTxAttrs attrs, MemTxResult *result);\n-uint16_t glue(address_space_lduw_le, SUFFIX)(ARG1_DECL,\n-    hwaddr addr, MemTxAttrs attrs, MemTxResult *result);\n-uint16_t glue(address_space_lduw_be, SUFFIX)(ARG1_DECL,\n-    hwaddr addr, MemTxAttrs attrs, MemTxResult *result);\n uint32_t glue(address_space_ldl_le, SUFFIX)(ARG1_DECL,\n     hwaddr addr, MemTxAttrs attrs, MemTxResult *result);\n uint32_t glue(address_space_ldl_be, SUFFIX)(ARG1_DECL,\n@@ -47,10 +39,6 @@ uint64_t glue(address_space_ldq_be, SUFFIX)(ARG1_DECL,\n     hwaddr addr, MemTxAttrs attrs, MemTxResult *result);\n void glue(address_space_stb, SUFFIX)(ARG1_DECL,\n     hwaddr addr, uint8_t val, MemTxAttrs attrs, MemTxResult *result);\n-void glue(address_space_stw_le, SUFFIX)(ARG1_DECL,\n-    hwaddr addr, uint16_t val, MemTxAttrs attrs, MemTxResult *result);\n-void glue(address_space_stw_be, SUFFIX)(ARG1_DECL,\n-    hwaddr addr, uint16_t val, MemTxAttrs attrs, MemTxResult *result);\n void glue(address_space_stl_le, SUFFIX)(ARG1_DECL,\n     hwaddr addr, uint32_t val, MemTxAttrs attrs, MemTxResult *result);\n void glue(address_space_stl_be, SUFFIX)(ARG1_DECL,\n@@ -60,6 +48,15 @@ void glue(address_space_stq_le, SUFFIX)(ARG1_DECL,\n void glue(address_space_stq_be, SUFFIX)(ARG1_DECL,\n     hwaddr addr, uint64_t val, MemTxAttrs attrs, MemTxResult *result);\n \n+#define ENDIANNESS\n+#include \"system/memory_ldst_endian.h.inc\"\n+\n+#define ENDIANNESS              _le\n+#include \"system/memory_ldst_endian.h.inc\"\n+\n+#define ENDIANNESS              _be\n+#include \"system/memory_ldst_endian.h.inc\"\n+\n #undef ARG1_DECL\n #undef ARG1\n #undef SUFFIX\ndiff --git a/include/exec/memory_ldst_phys.h.inc b/include/exec/memory_ldst_phys.h.inc\nindex db67de75251..71c2e64ff0f 100644\n--- a/include/exec/memory_ldst_phys.h.inc\n+++ b/include/exec/memory_ldst_phys.h.inc\n@@ -19,12 +19,6 @@\n  * License along with this library; if not, see <http://www.gnu.org/licenses/>.\n  */\n \n-static inline uint16_t glue(lduw_phys, SUFFIX)(ARG1_DECL, hwaddr addr)\n-{\n-    return glue(address_space_lduw, SUFFIX)(ARG1, addr,\n-                                            MEMTXATTRS_UNSPECIFIED, NULL);\n-}\n-\n static inline uint32_t glue(ldl_phys, SUFFIX)(ARG1_DECL, hwaddr addr)\n {\n     return glue(address_space_ldl, SUFFIX)(ARG1, addr,\n@@ -37,12 +31,6 @@ static inline uint64_t glue(ldq_phys, SUFFIX)(ARG1_DECL, hwaddr addr)\n                                            MEMTXATTRS_UNSPECIFIED, NULL);\n }\n \n-static inline void glue(stw_phys, SUFFIX)(ARG1_DECL, hwaddr addr, uint16_t val)\n-{\n-    glue(address_space_stw, SUFFIX)(ARG1, addr, val,\n-                                    MEMTXATTRS_UNSPECIFIED, NULL);\n-}\n-\n static inline void glue(stl_phys, SUFFIX)(ARG1_DECL, hwaddr addr, uint32_t val)\n {\n     glue(address_space_stl, SUFFIX)(ARG1, addr, val,\n@@ -61,18 +49,6 @@ static inline uint8_t glue(ldub_phys, SUFFIX)(ARG1_DECL, hwaddr addr)\n                                             MEMTXATTRS_UNSPECIFIED, NULL);\n }\n \n-static inline uint16_t glue(lduw_le_phys, SUFFIX)(ARG1_DECL, hwaddr addr)\n-{\n-    return glue(address_space_lduw_le, SUFFIX)(ARG1, addr,\n-                                               MEMTXATTRS_UNSPECIFIED, NULL);\n-}\n-\n-static inline uint16_t glue(lduw_be_phys, SUFFIX)(ARG1_DECL, hwaddr addr)\n-{\n-    return glue(address_space_lduw_be, SUFFIX)(ARG1, addr,\n-                                               MEMTXATTRS_UNSPECIFIED, NULL);\n-}\n-\n static inline uint32_t glue(ldl_le_phys, SUFFIX)(ARG1_DECL, hwaddr addr)\n {\n     return glue(address_space_ldl_le, SUFFIX)(ARG1, addr,\n@@ -103,18 +79,6 @@ static inline void glue(stb_phys, SUFFIX)(ARG1_DECL, hwaddr addr, uint8_t val)\n                                     MEMTXATTRS_UNSPECIFIED, NULL);\n }\n \n-static inline void glue(stw_le_phys, SUFFIX)(ARG1_DECL, hwaddr addr, uint16_t val)\n-{\n-    glue(address_space_stw_le, SUFFIX)(ARG1, addr, val,\n-                                       MEMTXATTRS_UNSPECIFIED, NULL);\n-}\n-\n-static inline void glue(stw_be_phys, SUFFIX)(ARG1_DECL, hwaddr addr, uint16_t val)\n-{\n-    glue(address_space_stw_be, SUFFIX)(ARG1, addr, val,\n-                                       MEMTXATTRS_UNSPECIFIED, NULL);\n-}\n-\n static inline void glue(stl_le_phys, SUFFIX)(ARG1_DECL, hwaddr addr, uint32_t val)\n {\n     glue(address_space_stl_le, SUFFIX)(ARG1, addr, val,\n@@ -139,6 +103,15 @@ static inline void glue(stq_be_phys, SUFFIX)(ARG1_DECL, hwaddr addr, uint64_t va\n                                        MEMTXATTRS_UNSPECIFIED, NULL);\n }\n \n+#define ENDIANNESS\n+#include \"system/memory_ldst_phys_endian.h.inc\"\n+\n+#define ENDIANNESS  _le\n+#include \"system/memory_ldst_phys_endian.h.inc\"\n+\n+#define ENDIANNESS  _be\n+#include \"system/memory_ldst_phys_endian.h.inc\"\n+\n #undef ARG1_DECL\n #undef ARG1\n #undef SUFFIX\ndiff --git a/include/system/memory_ldst_endian.h.inc b/include/system/memory_ldst_endian.h.inc\nnew file mode 100644\nindex 00000000000..4efd7f19f7e\n--- /dev/null\n+++ b/include/system/memory_ldst_endian.h.inc\n@@ -0,0 +1,25 @@\n+/*\n+ *  Physical memory access endian templates\n+ *\n+ *  Copyright (c) 2003 Fabrice Bellard\n+ *  Copyright (c) 2015 Linaro, Inc.\n+ *  Copyright (c) 2016 Red Hat, Inc.\n+ *  Copyright (c) 2025 Linaro Ltd.\n+ *\n+ * SPDX-License-Identifier: LGPL-2.1-or-later\n+ */\n+\n+#define ADDRESS_SPACE_LD(size) \\\n+    glue(glue(address_space_ld, size), glue(ENDIANNESS, SUFFIX))\n+#define ADDRESS_SPACE_ST(size) \\\n+    glue(glue(address_space_st, size), glue(ENDIANNESS, SUFFIX))\n+\n+uint16_t ADDRESS_SPACE_LD(uw)(ARG1_DECL, hwaddr addr,\n+                              MemTxAttrs attrs, MemTxResult *result);\n+void ADDRESS_SPACE_ST(w)(ARG1_DECL, hwaddr addr, uint16_t val,\n+                         MemTxAttrs attrs, MemTxResult *result);\n+\n+#undef ADDRESS_SPACE_LD\n+#undef ADDRESS_SPACE_ST\n+\n+#undef ENDIANNESS\ndiff --git a/include/system/memory_ldst_phys_endian.h.inc b/include/system/memory_ldst_phys_endian.h.inc\nnew file mode 100644\nindex 00000000000..6c00edc2148\n--- /dev/null\n+++ b/include/system/memory_ldst_phys_endian.h.inc\n@@ -0,0 +1,37 @@\n+/*\n+ *  Physical memory access endian templates\n+ *\n+ *  Copyright (c) 2003 Fabrice Bellard\n+ *  Copyright (c) 2015 Linaro, Inc.\n+ *  Copyright (c) 2016 Red Hat, Inc.\n+ *  Copyright (c) 2025 Linaro Ltd.\n+ *\n+ * SPDX-License-Identifier: LGPL-2.1-or-later\n+ */\n+\n+#define LD_PHYS(size) \\\n+    glue(glue(ld, size), glue(ENDIANNESS, glue(_phys, SUFFIX)))\n+#define ADDRESS_SPACE_LD(size) \\\n+    glue(glue(address_space_ld, size), glue(ENDIANNESS, SUFFIX))\n+\n+#define ST_PHYS(size) \\\n+    glue(glue(st, size), glue(ENDIANNESS, glue(_phys, SUFFIX)))\n+#define ADDRESS_SPACE_ST(size) \\\n+    glue(glue(address_space_st, size), glue(ENDIANNESS, SUFFIX))\n+\n+static inline uint16_t LD_PHYS(uw)(ARG1_DECL, hwaddr addr)\n+{\n+    return ADDRESS_SPACE_LD(uw)(ARG1, addr, MEMTXATTRS_UNSPECIFIED, NULL);\n+}\n+\n+static inline void ST_PHYS(w)(ARG1_DECL, hwaddr addr, uint16_t val)\n+{\n+    ADDRESS_SPACE_ST(w)(ARG1, addr, val, MEMTXATTRS_UNSPECIFIED, NULL);\n+}\n+\n+#undef LD_PHYS\n+#undef ST_PHYS\n+#undef ADDRESS_SPACE_LD\n+#undef ADDRESS_SPACE_ST\n+\n+#undef ENDIANNESS\ndiff --git a/system/memory_ldst.c.inc b/system/memory_ldst.c.inc\nindex d5776678edf..c37a07b4f4a 100644\n--- a/system/memory_ldst.c.inc\n+++ b/system/memory_ldst.c.inc\n@@ -240,27 +240,6 @@ static inline uint16_t glue(address_space_lduw_internal, SUFFIX)(ARG1_DECL,\n     return val;\n }\n \n-uint16_t glue(address_space_lduw, SUFFIX)(ARG1_DECL,\n-    hwaddr addr, MemTxAttrs attrs, MemTxResult *result)\n-{\n-    return glue(address_space_lduw_internal, SUFFIX)(ARG1, addr, attrs, result,\n-                                                     DEVICE_NATIVE_ENDIAN);\n-}\n-\n-uint16_t glue(address_space_lduw_le, SUFFIX)(ARG1_DECL,\n-    hwaddr addr, MemTxAttrs attrs, MemTxResult *result)\n-{\n-    return glue(address_space_lduw_internal, SUFFIX)(ARG1, addr, attrs, result,\n-                                                     DEVICE_LITTLE_ENDIAN);\n-}\n-\n-uint16_t glue(address_space_lduw_be, SUFFIX)(ARG1_DECL,\n-    hwaddr addr, MemTxAttrs attrs, MemTxResult *result)\n-{\n-    return glue(address_space_lduw_internal, SUFFIX)(ARG1, addr, attrs, result,\n-                                       DEVICE_BIG_ENDIAN);\n-}\n-\n /* warning: addr must be aligned */\n static inline void glue(address_space_stl_internal, SUFFIX)(ARG1_DECL,\n     hwaddr addr, uint32_t val, MemTxAttrs attrs,\n@@ -401,27 +380,6 @@ static inline void glue(address_space_stw_internal, SUFFIX)(ARG1_DECL,\n     RCU_READ_UNLOCK();\n }\n \n-void glue(address_space_stw, SUFFIX)(ARG1_DECL,\n-    hwaddr addr, uint16_t val, MemTxAttrs attrs, MemTxResult *result)\n-{\n-    glue(address_space_stw_internal, SUFFIX)(ARG1, addr, val, attrs, result,\n-                                             DEVICE_NATIVE_ENDIAN);\n-}\n-\n-void glue(address_space_stw_le, SUFFIX)(ARG1_DECL,\n-    hwaddr addr, uint16_t val, MemTxAttrs attrs, MemTxResult *result)\n-{\n-    glue(address_space_stw_internal, SUFFIX)(ARG1, addr, val, attrs, result,\n-                                             DEVICE_LITTLE_ENDIAN);\n-}\n-\n-void glue(address_space_stw_be, SUFFIX)(ARG1_DECL,\n-    hwaddr addr, uint16_t val, MemTxAttrs attrs, MemTxResult *result)\n-{\n-    glue(address_space_stw_internal, SUFFIX)(ARG1, addr, val, attrs, result,\n-                               DEVICE_BIG_ENDIAN);\n-}\n-\n static inline void glue(address_space_stq_internal, SUFFIX)(ARG1_DECL,\n     hwaddr addr, uint64_t val, MemTxAttrs attrs,\n     MemTxResult *result, enum device_endian endian)\n@@ -486,6 +444,18 @@ void glue(address_space_stq_be, SUFFIX)(ARG1_DECL,\n                                              DEVICE_BIG_ENDIAN);\n }\n \n+#define ENDIANNESS\n+#define DEVICE_ENDIANNESS       DEVICE_NATIVE_ENDIAN\n+#include \"memory_ldst_endian.c.inc\"\n+\n+#define ENDIANNESS              _le\n+#define DEVICE_ENDIANNESS       DEVICE_LITTLE_ENDIAN\n+#include \"memory_ldst_endian.c.inc\"\n+\n+#define ENDIANNESS              _be\n+#define DEVICE_ENDIANNESS       DEVICE_BIG_ENDIAN\n+#include \"memory_ldst_endian.c.inc\"\n+\n #undef ARG1_DECL\n #undef ARG1\n #undef SUFFIX\ndiff --git a/system/memory_ldst_endian.c.inc b/system/memory_ldst_endian.c.inc\nnew file mode 100644\nindex 00000000000..8aa6ebeebb2\n--- /dev/null\n+++ b/system/memory_ldst_endian.c.inc\n@@ -0,0 +1,42 @@\n+/*\n+ *  Physical memory access endian templates\n+ *\n+ *  Copyright (c) 2003 Fabrice Bellard\n+ *  Copyright (c) 2015 Linaro, Inc.\n+ *  Copyright (c) 2016 Red Hat, Inc.\n+ *  Copyright (c) 2025 Linaro Ltd.\n+ *\n+ * SPDX-License-Identifier: LGPL-2.1-or-later\n+ */\n+\n+#define ADDRESS_SPACE_LD(size) \\\n+    glue(glue(address_space_ld, size), glue(ENDIANNESS, SUFFIX))\n+#define ADDRESS_SPACE_LD_INTERNAL(size) \\\n+    glue(glue(address_space_ld, size), glue(_internal, SUFFIX))\n+\n+#define ADDRESS_SPACE_ST(size) \\\n+    glue(glue(address_space_st, size), glue(ENDIANNESS, SUFFIX))\n+#define ADDRESS_SPACE_ST_INTERNAL(size) \\\n+    glue(glue(address_space_st, size), glue(_internal, SUFFIX))\n+\n+uint16_t ADDRESS_SPACE_LD(uw)(ARG1_DECL, hwaddr addr,\n+                              MemTxAttrs attrs, MemTxResult *result)\n+{\n+    return ADDRESS_SPACE_LD_INTERNAL(uw)(ARG1, addr, attrs, result,\n+                                         DEVICE_ENDIANNESS);\n+}\n+\n+void ADDRESS_SPACE_ST(w)(ARG1_DECL, hwaddr addr, uint16_t val,\n+                         MemTxAttrs attrs, MemTxResult *result)\n+{\n+    ADDRESS_SPACE_ST_INTERNAL(w)(ARG1, addr, val, attrs, result,\n+                                 DEVICE_ENDIANNESS);\n+}\n+\n+#undef ADDRESS_SPACE_LD\n+#undef ADDRESS_SPACE_LD_INTERNAL\n+#undef ADDRESS_SPACE_ST\n+#undef ADDRESS_SPACE_ST_INTERNAL\n+\n+#undef ENDIANNESS\n+#undef DEVICE_ENDIANNESS\n","prefixes":["09/14"]}