{"id":2228891,"url":"http://patchwork.ozlabs.org/api/1.1/patches/2228891/?format=json","web_url":"http://patchwork.ozlabs.org/project/qemu-devel/patch/20260427130045.3669851-1-alex.bennee@linaro.org/","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":"<20260427130045.3669851-1-alex.bennee@linaro.org>","date":"2026-04-27T13:00:45","name":"[kvm-unit-tests] arm: add wfx test case","commit_ref":null,"pull_url":null,"state":"new","archived":false,"hash":"07e94431d25ce43de60aaa387fae0b314026cc59","submitter":{"id":39532,"url":"http://patchwork.ozlabs.org/api/1.1/people/39532/?format=json","name":"Alex Bennée","email":"alex.bennee@linaro.org"},"delegate":null,"mbox":"http://patchwork.ozlabs.org/project/qemu-devel/patch/20260427130045.3669851-1-alex.bennee@linaro.org/mbox/","series":[{"id":501645,"url":"http://patchwork.ozlabs.org/api/1.1/series/501645/?format=json","web_url":"http://patchwork.ozlabs.org/project/qemu-devel/list/?series=501645","date":"2026-04-27T13:00:45","name":"[kvm-unit-tests] arm: add wfx test case","version":1,"mbox":"http://patchwork.ozlabs.org/series/501645/mbox/"}],"comments":"http://patchwork.ozlabs.org/api/patches/2228891/comments/","check":"pending","checks":"http://patchwork.ozlabs.org/api/patches/2228891/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=EKPuq+Fj;\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 4g43bv6bfNz1yHX\n\tfor <incoming@patchwork.ozlabs.org>; Mon, 27 Apr 2026 23:01:31 +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 1wHLaS-0004qX-R2; Mon, 27 Apr 2026 09:01:22 -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 <alex.bennee@linaro.org>)\n id 1wHLa6-0004Wi-GA\n for qemu-devel@nongnu.org; Mon, 27 Apr 2026 09:00:59 -0400","from mail-wm1-x329.google.com ([2a00:1450:4864:20::329])\n by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128)\n (Exim 4.90_1) (envelope-from <alex.bennee@linaro.org>)\n id 1wHLa3-0002br-Hq\n for qemu-devel@nongnu.org; Mon, 27 Apr 2026 09:00:57 -0400","by mail-wm1-x329.google.com with SMTP id\n 5b1f17b1804b1-48a563e4ef7so68932205e9.0\n for <qemu-devel@nongnu.org>; Mon, 27 Apr 2026 06:00:53 -0700 (PDT)","from draig.lan ([185.124.0.195]) by smtp.gmail.com with ESMTPSA id\n 5b1f17b1804b1-488ffc558f2sm622865905e9.1.2026.04.27.06.00.50\n (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n Mon, 27 Apr 2026 06:00:51 -0700 (PDT)","from draig.lan (localhost [IPv6:::1])\n by draig.lan (Postfix) with ESMTP id 06B075F877;\n Mon, 27 Apr 2026 14:00:50 +0100 (BST)"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=linaro.org; s=google; t=1777294852; x=1777899652; 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=e+5B0T5BZcM8PN6hrBB/cl4KNtkNonj2W3WbwM9F740=;\n b=EKPuq+FjqxEY6hBCZUHjRtiHykxRH9xqUKLWByTKK29fH4jcnvsAETysd8NERqAEju\n NEwvNeinMHFUpYUznNP98/Hu50lhaWGTQuugr0dDdXHFJQME+vsi0DJsE1gLRLoVsI+B\n QZZ+51btI/ix7uxN8V9JTiV6/6uTxr2Jhns45LBfxsWwVa6W/jfeG2Faf0HaNRkfc7kU\n ZsY87bRrH6JBBiXI4nzG29uxY8HCd3MtNPrwk7uf0SbpMTdlbNTC5tvh9LN3IWP5pec2\n RIn+Qu+RmVVCP5wZ+w5cpNE2YzzXNF638hHiW6xVekgR2ez36wQjPaLYhYON6IoG/VN4\n oH/A==","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20251104; t=1777294852; x=1777899652;\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=e+5B0T5BZcM8PN6hrBB/cl4KNtkNonj2W3WbwM9F740=;\n b=U2+ZQGVtOAIB0ZFQn1NwkC2B68v+LpXdP+etHh0PX8xSmHF79wRwskOamNaWZExilM\n +wSE3BkNvaj83yixE0M7WnaQ84FKRraChxmPj0u/sipctz2Q5OM9f3M/W/iWQmJEyuJA\n A9RWTSRe0mm2yZFMPNerM9qWrqlhovEk3Nkk73xGhpGR17tram5/X1bugertj1tDNPDp\n BgTm1HyQFqXby7UjhR9FWXw4yZuWichhaWWRrsPMI9axNLXLaFDODTTkl6654+xK2+6F\n EmwMydf0bSgcWqUwPu8TMFyiTcZbjgmyRtu7uRgd9/5nO/4WUte1ddF8gQZMd72F1m5n\n yifA==","X-Gm-Message-State":"AOJu0Yy5Feond/J+JHqgiU3a55GaKPyADNkgATeDlIXNplCTRf9MYMPn\n pz/hS4gt7vwGcCUG6aokAXOR6o8QpIuh2HSPYzKKhMH+vU60DMohRGVzmuEDQNMK1zY=","X-Gm-Gg":"AeBDieusDY1DAfdNFrX9DPjiS9hWAOHPjDHyWz20Hr9PgmP2cbjZ/6L8gMtPk2Uinng\n sCSn4BgiJU54oTicFhwmwpcxMh1p/Lf6g8Ewqlvtmrfjus3J0UaYRPo5lo48mcnUVMXxnjq6BUj\n WkHpUW9+M7XXsMRF04/97MRp2XSSCVm1KecuITq0lcUDPwNyUWiK2GUpFpR//Pg1Y/HFAOCAfWc\n ryTAY9tOOUN3bOinBnSN0CH4vDvrz0fLXfZi0D4YkvJiAjxpeU7AO/J0hjtWWWX1J1bdhdtX9av\n lhkBQUzoxe5sNHEsTxkEtkqzDrttAfYK7gpHasuqCajUyeIXzHbgK9ZbDAxONu3GxbBhN0p2k/5\n j7QMmyGKszpKVFIWHYoyy3djHxOQtx/TLKBFfn5FIcL137wnGWpym1FPAKwjhn+O+X7kPWLHRVU\n YsBnEYvfQVUcwxlivqjjcMT8beHhxjyTPz7g==","X-Received":"by 2002:a05:600d:8451:b0:48a:599a:36fe with SMTP id\n 5b1f17b1804b1-48a599a4413mr263744425e9.24.1777294851986;\n Mon, 27 Apr 2026 06:00:51 -0700 (PDT)","From":"=?utf-8?q?Alex_Benn=C3=A9e?= <alex.bennee@linaro.org>","To":"qemu-devel@nongnu.org","Cc":"=?utf-8?q?Alex_Benn=C3=A9e?= <alex.bennee@linaro.org>,\n Andrew Jones <andrew.jones@linux.dev>,\n Alexandru Elisei <alexandru.elisei@arm.com>,\n Eric Auger <eric.auger@redhat.com>, kvmarm@lists.linux.dev (open list:ARM),\n kvm@vger.kernel.org (open list:Default mailing list)","Subject":"[kvm-unit-tests PATCH] arm: add wfx test case","Date":"Mon, 27 Apr 2026 14:00:45 +0100","Message-ID":"<20260427130045.3669851-1-alex.bennee@linaro.org>","X-Mailer":"git-send-email 2.47.3","MIME-Version":"1.0","Content-Type":"text/plain; charset=UTF-8","Content-Transfer-Encoding":"8bit","Received-SPF":"pass client-ip=2a00:1450:4864:20::329;\n envelope-from=alex.bennee@linaro.org; helo=mail-wm1-x329.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":"This is based on a similar test case I wrote for QEMU's tcg tests although\nobviously able to take advantage of kvm-unit-tests additional plumbing for\ndealing with the GIC and IRQs.\n\nSigned-off-by: Alex Bennée <alex.bennee@linaro.org>\n---\n arm/Makefile.arm64        |   1 +\n lib/arm64/asm/processor.h |   7 ++\n lib/arm64/asm/sysreg.h    |   3 +\n arm/wfx.c                 | 137 ++++++++++++++++++++++++++++++++++++++\n arm/unittests.cfg         |   5 ++\n 5 files changed, 153 insertions(+)\n create mode 100644 arm/wfx.c","diff":"diff --git a/arm/Makefile.arm64 b/arm/Makefile.arm64\nindex a40c830d..52b3f35d 100644\n--- a/arm/Makefile.arm64\n+++ b/arm/Makefile.arm64\n@@ -64,6 +64,7 @@ tests += $(TEST_DIR)/cache.$(exe)\n tests += $(TEST_DIR)/debug.$(exe)\n tests += $(TEST_DIR)/fpu.$(exe)\n tests += $(TEST_DIR)/mte.$(exe)\n+tests += $(TEST_DIR)/wfx.$(exe)\n \n include $(SRCDIR)/$(TEST_DIR)/Makefile.common\n \ndiff --git a/lib/arm64/asm/processor.h b/lib/arm64/asm/processor.h\nindex 32ddc1b3..2104036d 100644\n--- a/lib/arm64/asm/processor.h\n+++ b/lib/arm64/asm/processor.h\n@@ -173,5 +173,12 @@ static inline bool system_supports_rndr(void)\n \treturn ((id_aa64isar0_el1 >> ID_AA64ISAR0_EL1_RNDR_SHIFT) & 0xf) != 0;\n }\n \n+static inline bool system_supports_wfxt(void)\n+{\n+\tu64 id_aa64isar2_el1 = read_sysreg_s(ID_AA64ISAR2_EL1);\n+\n+\treturn ((id_aa64isar2_el1 >> ID_AA64ISAR2_EL1_WFxT_SHIFT) & 0xf) != 0;\n+}\n+\n #endif /* !__ASSEMBLER__ */\n #endif /* _ASMARM64_PROCESSOR_H_ */\ndiff --git a/lib/arm64/asm/sysreg.h b/lib/arm64/asm/sysreg.h\nindex f2d05018..cb96a649 100644\n--- a/lib/arm64/asm/sysreg.h\n+++ b/lib/arm64/asm/sysreg.h\n@@ -77,6 +77,9 @@ asm(\n #define ID_AA64ISAR0_EL1_RNDR_SHIFT\t60\n #define ID_AA64PFR1_EL1_MTE_SHIFT\t8\n \n+#define ID_AA64ISAR2_EL1\t\tsys_reg(3, 0, 0, 6, 2)\n+#define ID_AA64ISAR2_EL1_WFxT_SHIFT\t0\n+\n #define ID_AA64MMFR0_EL1_FGT_SHIFT\t56\n #define ID_AA64MMFR0_EL1_FGT_FGT2\t0x2\n \ndiff --git a/arm/wfx.c b/arm/wfx.c\nnew file mode 100644\nindex 00000000..912e50e6\n--- /dev/null\n+++ b/arm/wfx.c\n@@ -0,0 +1,137 @@\n+/*\n+ * WFX Instructions Test (WFI, WFE, WFIT, WFET)\n+ *\n+ * Copyright (c) 2026 Linaro Ltd\n+ *\n+ * SPDX-License-Identifier: GPL-2.0-or-later\n+ */\n+\n+#include <libcflat.h>\n+#include <asm/processor.h>\n+#include <asm/gic.h>\n+#include <asm/timer.h>\n+#include <asm/io.h>\n+\n+#define TIMEOUT 200000\n+\n+#define sev() asm volatile(\"sev\" : : : \"memory\")\n+#define sevl() asm volatile(\"sevl\" : : : \"memory\")\n+#define wfi() asm volatile(\"wfi\" : : : \"memory\")\n+#define wfe() asm volatile(\"wfe\" : : : \"memory\")\n+\n+#define wfit(reg) \\\n+\tasm volatile(\".arch armv8.7-a\\n\\twfit %0\" : : \"r\" (reg) : \"memory\")\n+#define wfet(reg) \\\n+\tasm volatile(\".arch armv8.7-a\\n\\twfet %0\" : : \"r\" (reg) : \"memory\")\n+\n+static void timer_handler(struct pt_regs *regs)\n+{\n+\t/* Disable timer to stop IRQ from re-firing */\n+\twrite_sysreg(0, cntv_ctl_el0);\n+}\n+\n+static bool check_elapsed(uint64_t start, uint64_t threshold, const char *test, bool more)\n+{\n+\tuint64_t end = read_sysreg(cntvct_el0);\n+\tuint64_t elapsed = end - start;\n+\tbool pass = more ? elapsed >= threshold : elapsed <= threshold;\n+\n+\treport(pass, \"%s (%ld ticks)\", test, elapsed);\n+\n+\tif (!pass) {\n+\t\treport_info(\"%s %s\", test, more ? \"woke too early\" : \"slept despite SEV\");\n+\t}\n+\treturn pass;\n+}\n+\n+static void test_wfi(void)\n+{\n+\tuint64_t start;\n+\n+\treport_info(\"Testing WFI...\");\n+\n+\tstart = read_sysreg(cntvct_el0);\n+\twrite_sysreg(TIMEOUT, cntv_tval_el0);\n+\twrite_sysreg(1, cntv_ctl_el0); /* Enable timer, no mask */\n+\tisb();\n+\n+\tlocal_irq_enable();\n+\twfi();\n+\tlocal_irq_disable();\n+\n+\tcheck_elapsed(start, TIMEOUT, \"WFI\", true);\n+}\n+\n+static void test_wfe(void)\n+{\n+\tuint64_t start;\n+\n+\treport_info(\"Testing WFE/SEV...\");\n+\tsev();\n+\tstart = read_sysreg(cntvct_el0);\n+\twfe();\n+\tcheck_elapsed(start, TIMEOUT, \"WFE/SEV\", false);\n+\n+\treport_info(\"Testing WFE/SEVL...\");\n+\tsevl();\n+\tstart = read_sysreg(cntvct_el0);\n+\twfe();\n+\tcheck_elapsed(start, TIMEOUT, \"WFE/SEVL\", false);\n+}\n+\n+static void test_wfit(void)\n+{\n+\tuint64_t start, timeout;\n+\n+\treport_info(\"Testing WFIT...\");\n+\tstart = read_sysreg(cntvct_el0);\n+\ttimeout = start + TIMEOUT;\n+\twfit(timeout);\n+\tcheck_elapsed(start, TIMEOUT, \"WFIT\", true);\n+}\n+\n+static void test_wfet(void)\n+{\n+\tuint64_t start, timeout;\n+\n+\treport_info(\"Testing WFET...\");\n+\t/* Ensure no pending events */\n+\tsev();\n+\twfe();\n+\n+\tstart = read_sysreg(cntvct_el0);\n+\ttimeout = start + TIMEOUT;\n+\twfet(timeout);\n+\tcheck_elapsed(start, TIMEOUT, \"WFET\", true);\n+}\n+\n+int main(void)\n+{\n+\n+\tif (gic_init() < 0) {\n+\t\treport_abort(\"GIC init failed\");\n+\t\treturn 1;\n+\t}\n+\n+\t/* Install timer handler for WFI wake-up */\n+\tinstall_irq_handler(EL1H_IRQ, timer_handler);\n+\tgic_enable_defaults();\n+\n+\t/* Enable Virtual Timer PPI */\n+\tgic_irq_set_clr_enable(27, true);\n+\n+\treport_prefix_push(\"WFx\");\n+\ttest_wfi();\n+\ttest_wfe();\n+\treport_prefix_pop();\n+\n+\tif (system_supports_wfxt()) {\n+\t\treport_prefix_push(\"WFxT\");\n+\t\ttest_wfit();\n+\t\ttest_wfet();\n+\t} else {\n+\t\treport_skip(\"WFxT instructions not supported\");\n+\t}\n+\n+\treturn report_summary();\n+}\ndiff --git a/arm/unittests.cfg b/arm/unittests.cfg\nindex 12fc4468..7adf96f2 100644\n--- a/arm/unittests.cfg\n+++ b/arm/unittests.cfg\n@@ -339,3 +339,8 @@ groups = mte\n test_args = asymm\n qemu_params = -machine mte=on\n arch = arm64\n+\n+[wfx]\n+file = wfx.flat\n+groups = wfx\n+arch = arm64\n","prefixes":["kvm-unit-tests"]}