{"id":2220786,"url":"http://patchwork.ozlabs.org/api/1.1/patches/2220786/?format=json","web_url":"http://patchwork.ozlabs.org/project/kvm-riscv/patch/20260407-riscv_insn_table-v1-10-54b4736a1e77@gmail.com/","project":{"id":70,"url":"http://patchwork.ozlabs.org/api/1.1/projects/70/?format=json","name":"Linux KVM RISC-V","link_name":"kvm-riscv","list_id":"kvm-riscv.lists.infradead.org","list_email":"kvm-riscv@lists.infradead.org","web_url":"","scm_url":"","webscm_url":""},"msgid":"<20260407-riscv_insn_table-v1-10-54b4736a1e77@gmail.com>","date":"2026-04-08T04:45:58","name":"[10/16] KVM: riscv: selftests: Add mmio test","commit_ref":null,"pull_url":null,"state":"new","archived":false,"hash":"43441294208dfd9cbbd3028ab8781da0d930df3f","submitter":{"id":92521,"url":"http://patchwork.ozlabs.org/api/1.1/people/92521/?format=json","name":"Charlie Jenkins via B4 Relay","email":"devnull+thecharlesjenkins.gmail.com@kernel.org"},"delegate":null,"mbox":"http://patchwork.ozlabs.org/project/kvm-riscv/patch/20260407-riscv_insn_table-v1-10-54b4736a1e77@gmail.com/mbox/","series":[{"id":499063,"url":"http://patchwork.ozlabs.org/api/1.1/series/499063/?format=json","web_url":"http://patchwork.ozlabs.org/project/kvm-riscv/list/?series=499063","date":"2026-04-08T04:45:48","name":"riscv: Generate riscv instruction functions","version":1,"mbox":"http://patchwork.ozlabs.org/series/499063/mbox/"}],"comments":"http://patchwork.ozlabs.org/api/patches/2220786/comments/","check":"pending","checks":"http://patchwork.ozlabs.org/api/patches/2220786/checks/","tags":{},"headers":{"Return-Path":"\n <kvm-riscv-bounces+incoming=patchwork.ozlabs.org@lists.infradead.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 secure) header.d=lists.infradead.org header.i=@lists.infradead.org\n header.a=rsa-sha256 header.s=bombadil.20210309 header.b=aHds2w2S;\n\tdkim=fail reason=\"signature verification failed\" (2048-bit key;\n unprotected) header.d=kernel.org header.i=@kernel.org header.a=rsa-sha256\n header.s=k20201202 header.b=PhqFD4cy;\n\tdkim-atps=neutral","legolas.ozlabs.org;\n spf=none (no SPF record) smtp.mailfrom=lists.infradead.org\n (client-ip=2607:7c80:54:3::133; helo=bombadil.infradead.org;\n envelope-from=kvm-riscv-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org;\n receiver=patchwork.ozlabs.org)"],"Received":["from bombadil.infradead.org (bombadil.infradead.org\n [IPv6:2607:7c80:54:3::133])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519 server-signature ECDSA (secp384r1) server-digest SHA384)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4fr9Wt5Ckwz211N\n\tfor <incoming@patchwork.ozlabs.org>; Wed, 08 Apr 2026 14:46:50 +1000 (AEST)","from localhost ([::1] helo=bombadil.infradead.org)\n\tby bombadil.infradead.org with esmtp (Exim 4.98.2 #2 (Red Hat Linux))\n\tid 1wAKoT-00000008Enc-0Ibc;\n\tWed, 08 Apr 2026 04:46:49 +0000","from sea.source.kernel.org ([2600:3c0a:e001:78e:0:1991:8:25])\n\tby bombadil.infradead.org with esmtps (Exim 4.98.2 #2 (Red Hat Linux))\n\tid 1wAKoK-00000008Eco-29DE;\n\tWed, 08 Apr 2026 04:46:42 +0000","from smtp.kernel.org (transwarp.subspace.kernel.org [100.75.92.58])\n\tby sea.source.kernel.org (Postfix) with ESMTP id 68D25445A7;\n\tWed,  8 Apr 2026 04:46:37 +0000 (UTC)","by smtp.kernel.org (Postfix) with ESMTPS id 3FA10C19425;\n\tWed,  8 Apr 2026 04:46:37 +0000 (UTC)","from aws-us-west-2-korg-lkml-1.web.codeaurora.org\n (localhost.localdomain [127.0.0.1])\n\tby smtp.lore.kernel.org (Postfix) with ESMTP id 32796FD5F76;\n\tWed,  8 Apr 2026 04:46:37 +0000 (UTC)"],"DKIM-Signature":["v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed;\n\td=lists.infradead.org; s=bombadil.20210309; h=Sender:\n\tContent-Transfer-Encoding:Content-Type:Reply-To:List-Subscribe:List-Help:\n\tList-Post:List-Archive:List-Unsubscribe:List-Id:Cc:To:In-Reply-To:References:\n\tMessage-Id:MIME-Version:Subject:Date:From:Content-ID:Content-Description:\n\tResent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:\n\tList-Owner; bh=VixBdGpLsQpQaPKiZ34k3MkXvgdHP27Ee5Qp55aTj94=; b=aHds2w2S0Ebza5\n\t9DfyZmsPoQMhGgWwNynDUB+HHFIO3QIP19F8EvR7LRtERUFIhLZfWrXb2ThutQCkngzB1lO7WeZLC\n\ttwtH1O1ugdHsHSS3XJV06ZeW6dJ5B0rHp955Ldkw4ov4JUNqwqoIrefY47aALPoa8UdWaswY7Wn0W\n\tLY0Mq0PxVwmhiB6+RhjJQ4PiyMxPpt03czT8/d4IvuWHX2jbrfRQUVisoaIJDwR6jlnwnmBJu6+1J\n\tmKzKjMR4lc69isvv3oc5KNrAmCmfvZcxwZTx2PK9SYez6qhQiXhCYg/5BBmgYWFtzM07bMh05SJ+p\n\t+A2WFTQEiVsaRCGYt/8Q==;","v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org;\n\ts=k20201202; t=1775623597;\n\tbh=lChrzKmkSUM2VwN/SlQWXnrTo6efmgqrmXjeou47SQQ=;\n\th=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From;\n\tb=PhqFD4cy3LSKa2+erT2riN9afxOLOg9J66WEvfzIv+MJ5G6CIosfoC8oY17PmTyQg\n\t ARrXdGLUKbZpmVD+6Wilj111y17BHhGknxXVpV7S4LzpSOUWSI/yVQ0DIO3nIQCEUR\n\t fMUhZP+vPF921JpAlKpQCh6CtiF72eTLYmLWl2iFq51Jyvo0xM64YeJPEjnLHSpjy+\n\t NxanhlvYRO1G0hbEszMxRHw4QiLDtsMRGmzHXXYB2H+NXfQX0SWZiM/Dkr5jBrgN5C\n\t FaDYnd+Db6+NC50h0SeHXDL9blz3op9mGDAQIp0EJURF8dOBnWJ32n4w7IRKPkyJgc\n\t cKsGx80qz02yQ=="],"From":"Charlie Jenkins via B4 Relay\n <devnull+thecharlesjenkins.gmail.com@kernel.org>","Date":"Tue, 07 Apr 2026 21:45:58 -0700","Subject":"[PATCH 10/16] KVM: riscv: selftests: Add mmio test","MIME-Version":"1.0","Message-Id":"<20260407-riscv_insn_table-v1-10-54b4736a1e77@gmail.com>","References":"<20260407-riscv_insn_table-v1-0-54b4736a1e77@gmail.com>","In-Reply-To":"<20260407-riscv_insn_table-v1-0-54b4736a1e77@gmail.com>","To":"Paul Walmsley <pjw@kernel.org>, Palmer Dabbelt <palmer@dabbelt.com>,\n Alexandre Ghiti <alex@ghiti.fr>, Anup Patel <anup@brainfault.org>,\n Atish Patra <atish.patra@linux.dev>, Conor Dooley <conor@kernel.org>,\n Paolo Bonzini <pbonzini@redhat.com>,\n Andrew Morton <akpm@linux-foundation.org>, Shuah Khan <shuah@kernel.org>","Cc":"linux-riscv@lists.infradead.org, linux-kernel@vger.kernel.org,\n kvm@vger.kernel.org, kvm-riscv@lists.infradead.org,\n linux-kselftest@vger.kernel.org,\n Charlie Jenkins <thecharlesjenkins@gmail.com>","X-Mailer":"b4 0.14.3","X-Developer-Signature":"v=1; a=ed25519-sha256; t=1775623594; l=7215;\n i=thecharlesjenkins@gmail.com; s=2026030; h=from:subject:message-id;\n bh=I1m1SXH0L+QYSFNr6TSVf7ckXNM0lll65+t/TdGFsTs=;\n b=+KRMu+rX16oBPNgSUL6TEER4P32IoJXyqtv72sFw5alZ+T2Acuu1muy0vleUGouSxHuDBDY61\n fc0UIqYhN/AChEN4fM3N0TvboiWeV0iI9sAqQJ1YOYa038JAefijOHJ","X-Developer-Key":"i=thecharlesjenkins@gmail.com; a=ed25519;\n pk=vpF2USrG+aB6CTbSt34rzJKsAVe/l+GAXo1IomCMETk=","X-Endpoint-Received":"by B4 Relay for thecharlesjenkins@gmail.com/2026030\n with auth_id=663","X-Original-From":"Charlie Jenkins <thecharlesjenkins@gmail.com>","X-CRM114-Version":"20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 ","X-CRM114-CacheID":"sfid-20260407_214640_665015_A9EDC420 ","X-CRM114-Status":"GOOD (  13.21  )","X-Spam-Score":"-0.0 (/)","X-Spam-Report":"Spam detection software,\n running on the system \"bombadil.infradead.org\",\n has NOT identified this incoming email as spam.  The original\n message has been attached to this so you can view it or label\n similar future email.  If you have any questions, see\n the administrator of that system for details.\n Content preview:  From: Charlie Jenkins Use the test KVM device to validate\n   that reads and writes to a device are properly emulated by KVM. This test\n   checks all load and store instructions that are emulated by KVM.\n Signed-off-by:\n    Charlie Jenkins --- tools/testing/selftests/kvm/Makefile.kvm | 1 +\n tools/testing/selftests/kvm/riscv/mmio_test.c\n    | 184 ++++++++++++++++++++++++++ 2 files changed, 185 insertions(+)\n Content analysis details:   (-0.0 points, 5.0 required)\n  pts rule name              description\n ---- ----------------------\n --------------------------------------------------\n -0.0 SPF_PASS               SPF: sender matches SPF record\n  0.0 SPF_HELO_NONE          SPF: HELO does not publish an SPF Record\n -0.1 DKIM_VALID_EF          Message has a valid DKIM or DK signature from\n                             envelope-from domain\n  0.1 DKIM_SIGNED            Message has a DKIM or DK signature,\n not necessarily valid\n -0.1 DKIM_VALID_AU          Message has a valid DKIM or DK signature from\n author's\n                             domain\n -0.1 DKIM_VALID             Message has at least one valid DKIM or DK\n signature\n -1.9 BAYES_00               BODY: Bayes spam probability is 0 to 1%\n                             [score: 0.0000]\n  2.1 FREEMAIL_FORGED_REPLYTO Freemail in Reply-To, but not From","X-BeenThere":"kvm-riscv@lists.infradead.org","X-Mailman-Version":"2.1.34","Precedence":"list","List-Id":"<kvm-riscv.lists.infradead.org>","List-Unsubscribe":"<http://lists.infradead.org/mailman/options/kvm-riscv>,\n <mailto:kvm-riscv-request@lists.infradead.org?subject=unsubscribe>","List-Archive":"<http://lists.infradead.org/pipermail/kvm-riscv/>","List-Post":"<mailto:kvm-riscv@lists.infradead.org>","List-Help":"<mailto:kvm-riscv-request@lists.infradead.org?subject=help>","List-Subscribe":"<http://lists.infradead.org/mailman/listinfo/kvm-riscv>,\n <mailto:kvm-riscv-request@lists.infradead.org?subject=subscribe>","Reply-To":"thecharlesjenkins@gmail.com","Content-Type":"text/plain; charset=\"us-ascii\"","Content-Transfer-Encoding":"7bit","Sender":"\"kvm-riscv\" <kvm-riscv-bounces@lists.infradead.org>","Errors-To":"kvm-riscv-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org"},"content":"From: Charlie Jenkins <thecharlesjenkins@gmail.com>\n\nUse the test KVM device to validate that reads and writes to a device\nare properly emulated by KVM. This test checks all load and store\ninstructions that are emulated by KVM.\n\nSigned-off-by: Charlie Jenkins <thecharlesjenkins@gmail.com>\n---\n tools/testing/selftests/kvm/Makefile.kvm      |   1 +\n tools/testing/selftests/kvm/riscv/mmio_test.c | 184 ++++++++++++++++++++++++++\n 2 files changed, 185 insertions(+)","diff":"diff --git a/tools/testing/selftests/kvm/Makefile.kvm b/tools/testing/selftests/kvm/Makefile.kvm\nindex ba5c2b643efa..d402fb339bc0 100644\n--- a/tools/testing/selftests/kvm/Makefile.kvm\n+++ b/tools/testing/selftests/kvm/Makefile.kvm\n@@ -204,6 +204,7 @@ TEST_GEN_PROGS_s390 += rseq_test\n TEST_GEN_PROGS_riscv = $(TEST_GEN_PROGS_COMMON)\n TEST_GEN_PROGS_riscv += riscv/sbi_pmu_test\n TEST_GEN_PROGS_riscv += riscv/ebreak_test\n+TEST_GEN_PROGS_riscv += riscv/mmio_test\n TEST_GEN_PROGS_riscv += access_tracking_perf_test\n TEST_GEN_PROGS_riscv += arch_timer\n TEST_GEN_PROGS_riscv += coalesced_io_test\ndiff --git a/tools/testing/selftests/kvm/riscv/mmio_test.c b/tools/testing/selftests/kvm/riscv/mmio_test.c\nnew file mode 100644\nindex 000000000000..9726860a269a\n--- /dev/null\n+++ b/tools/testing/selftests/kvm/riscv/mmio_test.c\n@@ -0,0 +1,184 @@\n+// SPDX-License-Identifier: GPL-2.0-only\n+/*\n+ * mmio_test.c - Tests the mmio functionality.\n+ */\n+#include \"kvm_util.h\"\n+#include \"ucall_common.h\"\n+\n+#define MMIO_TEST_REGION 0x20000000\n+\n+#define test_standard_read(len, instruction, name, options)\t\t\t\t\t\\\n+static void test_##name(void)\t\t\t\t\t\t\t\t\t\\\n+{\t\t\t\t\t\t\t\t\t\t\t\t\\\n+\tunsigned long mmio_result, reference_result;\t\t\t\t\t\t\\\n+\t/* Configure the MMIO to return 0xff for each byte to check sign extension */\t\t\\\n+\tunsigned long reference = ((unsigned long)-1 >> ((sizeof(long) - len) * 8));\t\t\\\n+\t*((unsigned long *)MMIO_TEST_REGION) = reference;\t\t\t\t\t\\\n+\t/* Check that reads through MMIO are equivalent to standard reads. */\t\t\t\\\n+\tasm volatile (\t\t\t\t\t\t\t\t\t\t\\\n+\t\t\".option push\\n\"\t\t\t\t\t\t\t\t\\\n+\t\toptions\t\t\t\t\t\t\t\t\t\t\\\n+\t\t#instruction \"\t%[mmio_res], 0(%[region])\\n\"\t\t\t\t\t\\\n+\t\t#instruction \"\t%[ref_res], 0(%[ref])\\n\"\t\t\t\t\t\\\n+\t\t\".option pop\\n\"\t\t\t\t\t\t\t\t\t\\\n+\t\t: [mmio_res] \"=&cr\" (mmio_result), [ref_res] \"=&cr\" (reference_result)\t\t\\\n+\t\t: [region] \"cr\" (MMIO_TEST_REGION), [ref] \"cr\" (&reference)\t\t\t\\\n+\t);\t\t\t\t\t\t\t\t\t\t\t\\\n+\tGUEST_ASSERT_EQ(mmio_result, reference_result);\t\t\t\t\t\t\\\n+\tGUEST_DONE();\t\t\t\t\t\t\t\t\t\t\\\n+}\n+\n+#define test_sp_read(len, instruction, name)\t\t\t\t\t\t\t\\\n+static void test_##name(void)\t\t\t\t\t\t\t\t\t\\\n+{\t\t\t\t\t\t\t\t\t\t\t\t\\\n+\tunsigned long mmio_result, reference_result;\t\t\t\t\t\t\\\n+\tunsigned long tmp;\t\t\t\t\t\t\t\t\t\\\n+\t/* Configure the MMIO to return 0xff for each byte to check sign extension */\t\t\\\n+\tunsigned long reference = ((unsigned long)-1 >> ((sizeof(long) - len) * 8));\t\t\\\n+\t*(((unsigned long *)MMIO_TEST_REGION)) = reference;\t\t\t\t\t\\\n+\t/* Check that reads through MMIO are equivalent to standard reads. */\t\t\t\\\n+\tasm volatile (\t\t\t\t\t\t\t\t\t\t\\\n+\t\t\"mv\t%[tmp], sp\\n\"\t\t\t\t\t\t\t\t\\\n+\t\t\"mv\tsp, %[region]\\n\"\t\t\t\t\t\t\t\\\n+\t\t\".option push\\n\"\t\t\t\t\t\t\t\t\\\n+\t\t\".option arch,+c\\n\"\t\t\t\t\t\t\t\t\\\n+\t\t#instruction \"\t%[mmio_res], 0(sp)\\n\"\t\t\t\t\t\t\\\n+\t\t\"mv\tsp, %[ref]\\n\"\t\t\t\t\t\t\t\t\\\n+\t\t#instruction \"\t%[ref_res], 0(sp)\\n\"\t\t\t\t\t\t\\\n+\t\t\".option pop\\n\"\t\t\t\t\t\t\t\t\t\\\n+\t\t\"mv\tsp, %[tmp]\\n\"\t\t\t\t\t\t\t\t\\\n+\t\t: [mmio_res]  \"=&cr\" (mmio_result), [ref_res] \"=&cr\" (reference_result),\t\\\n+\t\t  [tmp] \"=&r\" (tmp)\t\t\t\t\t\t\t\t\\\n+\t\t: [region] \"r\" (MMIO_TEST_REGION), [ref] \"cr\" (&reference)\t\t\t\\\n+\t);\t\t\t\t\t\t\t\t\t\t\t\\\n+\tGUEST_ASSERT_EQ(mmio_result, reference_result);\t\t\t\t\t\t\\\n+\tGUEST_DONE();\t\t\t\t\t\t\t\t\t\t\\\n+}\n+\n+test_standard_read(1, lb, lb, \"\")\n+test_standard_read(1, lbu, lbu, \"\")\n+test_standard_read(4, lw, lw, \"\")\n+test_standard_read(4, c.lw, c_lw, \".option arch,+c\\n\")\n+test_sp_read(4, c.lwsp, c_lwsp)\n+\n+#if __riscv_xlen == 64\n+test_standard_read(2, lh, lh, \"\")\n+test_standard_read(2, lhu, lhu, \"\")\n+test_standard_read(4, lwu, lwu, \"\")\n+test_standard_read(8, ld, ld, \"\")\n+test_standard_read(8, c.ld, c_ld, \".option arch,+c\\n\")\n+test_sp_read(8, c.ldsp, c_ldsp)\n+#endif\n+\n+#define test_standard_write(len, write, read, name, options)\t\t\t\t\t\\\n+static void test_##name(void)\t\t\t\t\t\t\t\t\t\\\n+{\t\t\t\t\t\t\t\t\t\t\t\t\\\n+\tunsigned long result;\t\t\t\t\t\t\t\t\t\\\n+\tunsigned long reference = (0x55555555UL >> ((sizeof(long) - len) * 8));\t\t\t\\\n+\t/* Check that we can write and then read the same value. */\t\t\t\t\\\n+\tasm volatile (\t\t\t\t\t\t\t\t\t\t\\\n+\t\t\".option push\\n\"\t\t\t\t\t\t\t\t\\\n+\t\toptions\t\t\t\t\t\t\t\t\t\t\\\n+\t\t#write \"\t%[ref], 0(%[region])\\n\"\t\t\t\t\t\t\\\n+\t\t#read \"\t\t%[res], 0(%[region])\\n\"\t\t\t\t\t\t\\\n+\t\t\".option pop\\n\"\t\t\t\t\t\t\t\t\t\\\n+\t\t: [res] \"=&cr\" (result)\t\t\t\t\t\t\t\t\\\n+\t\t: [region] \"cr\" (MMIO_TEST_REGION), [ref] \"cr\" (reference)\t\t\t\\\n+\t);\t\t\t\t\t\t\t\t\t\t\t\\\n+\tGUEST_ASSERT_EQ(result, reference);\t\t\t\t\t\t\t\\\n+\tGUEST_DONE();\t\t\t\t\t\t\t\t\t\t\\\n+}\n+\n+#define test_sp_write(len, write, read, name)\t\t\t\t\t\t\t\\\n+static void test_##name(void)\t\t\t\t\t\t\t\t\t\\\n+{\t\t\t\t\t\t\t\t\t\t\t\t\\\n+\tunsigned long result;\t\t\t\t\t\t\t\t\t\\\n+\tunsigned long tmp;\t\t\t\t\t\t\t\t\t\\\n+\tunsigned long reference = (0x55555555UL >> ((sizeof(long) - len) * 8));\t\t\t\\\n+\t/* Check that we can write and then read the same value. */\t\t\t\t\\\n+\tasm volatile (\t\t\t\t\t\t\t\t\t\t\\\n+\t\t\"mv\t%[tmp], sp\\n\"\t\t\t\t\t\t\t\t\\\n+\t\t\"mv\tsp, %[region]\\n\"\t\t\t\t\t\t\t\\\n+\t\t\".option push\\n\"\t\t\t\t\t\t\t\t\\\n+\t\t\".option arch,+c\\n\"\t\t\t\t\t\t\t\t\\\n+\t\t#write \"\t%[ref], 0(sp)\\n\"\t\t\t\t\t\t\\\n+\t\t#read \"\t\t%[res], 0(sp)\\n\"\t\t\t\t\t\t\\\n+\t\t\".option pop\\n\"\t\t\t\t\t\t\t\t\t\\\n+\t\t\"mv\tsp, %[tmp]\\n\"\t\t\t\t\t\t\t\t\\\n+\t\t: [res] \"=&cr\" (result), [tmp] \"=&r\" (tmp)\t\t\t\t\t\\\n+\t\t: [region] \"cr\" (MMIO_TEST_REGION), [ref] \"cr\" (reference)\t\t\t\\\n+\t);\t\t\t\t\t\t\t\t\t\t\t\\\n+\tGUEST_ASSERT_EQ(result, reference);\t\t\t\t\t\t\t\\\n+\tGUEST_DONE();\t\t\t\t\t\t\t\t\t\t\\\n+}\n+\n+test_standard_write(1, sb, lb, sb, \"\")\n+test_standard_write(2, sh, lh, sh, \"\")\n+test_standard_write(4, sw, lw, sw, \"\")\n+test_standard_write(4, c.sw, c.lw, c_sw, \".option arch,+c\\n\")\n+test_sp_write(4, c.swsp, c.lwsp, c_swsp)\n+\n+#if __riscv_xlen == 64\n+test_standard_write(8, sd, ld, sd, \"\")\n+test_standard_write(8, c.sd, c.ld, c_sd, \".option arch,+c\\n\")\n+#endif\n+\n+static void run(void *guest_code, char *instruction)\n+{\n+\tstruct ucall uc;\n+\tstruct kvm_vm *vm;\n+\tstruct kvm_vcpu *vcpu;\n+\n+\tvm = vm_create_with_one_vcpu(&vcpu, guest_code);\n+\tkvm_create_device(vm, KVM_DEV_TYPE_TEST);\n+\n+\tvirt_map(vm, (unsigned long)MMIO_TEST_REGION, MMIO_TEST_REGION, 1);\n+\n+\tvcpu_run(vcpu);\n+\n+\tTEST_ASSERT(get_ucall(vcpu, &uc) == UCALL_DONE,\n+\t\t    \"MMIO with instruction '%s' failed: '%s'\", instruction,\n+\t\t    uc.buffer);\n+\n+\tkvm_vm_free(vm);\n+}\n+\n+void test_mmio_read_sign_extension(void)\n+{\n+\trun(test_lb, \"lb\");\n+\trun(test_lbu, \"lbu\");\n+\trun(test_lw, \"lw\");\n+\trun(test_c_lw, \"c.lw\");\n+\trun(test_c_lwsp, \"c.lwsp\");\n+\n+#if __riscv_xlen == 64\n+\trun(test_lh, \"lh\");\n+\trun(test_lhu, \"lhu\");\n+\trun(test_lwu, \"lwu\");\n+\trun(test_ld, \"ld\");\n+\trun(test_c_ld, \"c.ld\");\n+\trun(test_c_ldsp, \"c.ldsp\");\n+#endif\n+}\n+\n+void test_mmio_write(void)\n+{\n+\trun(test_sb, \"sb\");\n+\trun(test_sh, \"sh\");\n+\trun(test_sw, \"sw\");\n+\trun(test_c_sw, \"c.sw\");\n+\trun(test_c_swsp, \"c.swsp\");\n+\n+#if __riscv_xlen == 64\n+\trun(test_sd, \"sd\");\n+\trun(test_c_sd, \"c.sd\");\n+#endif\n+}\n+\n+int main(void)\n+{\n+\ttest_mmio_read_sign_extension();\n+\ttest_mmio_write();\n+\n+\treturn 0;\n+}\n","prefixes":["10/16"]}