From patchwork Mon Aug 19 02:01:29 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Cade Richard X-Patchwork-Id: 1973632 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; dkim=pass (2048-bit key; secure) header.d=lists.infradead.org header.i=@lists.infradead.org header.a=rsa-sha256 header.s=bombadil.20210309 header.b=XWKBCLhd; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20230601 header.b=AZa4UsSi; dkim-atps=neutral Authentication-Results: legolas.ozlabs.org; spf=none (no SPF record) smtp.mailfrom=lists.infradead.org (client-ip=2607:7c80:54:3::133; helo=bombadil.infradead.org; envelope-from=kvm-riscv-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org; receiver=patchwork.ozlabs.org) Received: from bombadil.infradead.org (bombadil.infradead.org [IPv6:2607:7c80:54:3::133]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (secp384r1) server-digest SHA384) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4WnG6w6tQGz1yXg for ; Mon, 19 Aug 2024 12:01:42 +1000 (AEST) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:Message-ID:Date:Subject:Cc :To:From:Reply-To:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:In-Reply-To:References: List-Owner; bh=S1DqXlEhJkpIPo6Bm+EGJLADUzIb5n9bFlGG62HnTd0=; b=XWKBCLhdHGraIh RYXS03RyAnNX56dkxbvMubsAJ4aXugKthNRBQ6QdoQT/wNrJ/fdkMOVnTlIwSJQbBqfARd/2H9BEa E0tZvNLmYByFJhUBnvJk8/WByCyTkyJKJXaVxOai7NO2s53uoPYw83hRS1jwkVdqGezupGKfSqsr8 RTk+77P0BBXVAby1nFXq9pYYuZGhshTYYucQ3PKyBBvQsBd56TanyDh7Wmi5rhzVpalj6jU2VRRjy z1ytATwdx+YitV4xX9Xh5Gzec4Af2MjsQjFU31IXyqrpiofjTT5Wfa91zxvKK0MZ/NLq+mX61Hjel nxgBdxevgkliKd/B/J5g==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.97.1 #2 (Red Hat Linux)) id 1sfriG-000000005yl-263e; Mon, 19 Aug 2024 02:01:40 +0000 Received: from mail-pf1-x42b.google.com ([2607:f8b0:4864:20::42b]) by bombadil.infradead.org with esmtps (Exim 4.97.1 #2 (Red Hat Linux)) id 1sfriE-000000005y4-0Xiy for kvm-riscv@lists.infradead.org; Mon, 19 Aug 2024 02:01:39 +0000 Received: by mail-pf1-x42b.google.com with SMTP id d2e1a72fcca58-713dc00ce9dso1277789b3a.0 for ; Sun, 18 Aug 2024 19:01:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1724032896; x=1724637696; darn=lists.infradead.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=SuVOPQxv5sxQHAxF11qxHLkDDNYe+vMKbWKMzCBMM5o=; b=AZa4UsSiQWYjoUawdjvnvvgvLl2RGXklrkrQ4F3Z9/svl5xfWKEAPNLGjK9k3uO6N5 aWlnw9zv44WOZxDiwc88jlnRIzdT5+yCY+DQwbplBdHGL7OdZc1/ldTYi2640CaFhYYg 5Gc8c1rhcvz0Jk4Zndy7hM/Gesx0PRJoMl+ZbYJRwxqHClPW5+cWyHMPrRIihiWMsgnH 7Xzcy2Oz8MZLwMNDuEKhSMWOSSVMg/pyYwJqcT/1+6LWl+PZ00w0Fnjpzc/NoA2RiIN7 0498LZpzanV5QM1g0OlXKKyBXNQHpsH0zTWl+2uQ9rz3Xtwz8p4UbJnrsQDAuOwa+QW+ zUiA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1724032896; x=1724637696; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=SuVOPQxv5sxQHAxF11qxHLkDDNYe+vMKbWKMzCBMM5o=; b=Zz2Xj2KMi1pgL5WIyXPF4V6WDYCLwojJCTrx8RlauiUxgCz6zq5Geb2EeU5i2mcI8c bRr4xwBQkgSC2s6YHa4JrfHJpDb7XYHMOrszW61kZfcHA6G7FPcNk+S2ap6t8uayamNw mIu++1n/MMNb+oX/KIxerNWjRbV2YDRDrLTiI5OLxhgyVjc8U2apYqnvH/e6IccriPLi 4dchugEGMrQX2XiSODbBJwk0ANzO5vI6urD4hQeVsc7T0AuKdDukSgdVAbuaDRNeO0Bw zQhxLOsKmU8U5wpaKdeBG9b0lHldFPoycnEJ8JWZKXzhjs/28kcZLTThNhIIbzTBDb1d KRMw== X-Forwarded-Encrypted: i=1; AJvYcCWVbBWpTeSYFzUks3ZbvN3QrY4Ys0hkWWG4WS2KETGbVKxdyNnuD1MnOoUIafWanCwTZsA3HQQsSgM/L8M0Dz/wVLmqpyK5VY66pl11hg== X-Gm-Message-State: AOJu0YwRtcrVzo0EPc24Yn0JdawXTOr3sgvm5VU9dKoDoIZsjIlWPtCD Gs00TTHSJxP4zgaF77Aqfi/ITQ1WxTJKAfSLSp7Ljy4Cewtc8N95 X-Google-Smtp-Source: AGHT+IHurZNRdGJVAwIUGml3i1ty+NZNFBQLI22yX8T7e7GMSCZE6QoKHOYPBEvhxPFD/clNZRrIDA== X-Received: by 2002:a05:6a20:9c93:b0:1be:c929:e269 with SMTP id adf61e73a8af0-1c90501fb2dmr13466463637.34.1724032896353; Sun, 18 Aug 2024 19:01:36 -0700 (PDT) Received: from localhost.localdomain (c-73-185-75-144.hsd1.ca.comcast.net. [73.185.75.144]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-7127ae06b42sm5748582b3a.51.2024.08.18.19.01.35 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 18 Aug 2024 19:01:35 -0700 (PDT) From: Cade Richard X-Google-Original-From: Cade Richard To: kvm@vger.kernel.org, kvm-riscv@lists.infradead.org Cc: andrew.jones@linux.dev, atishp@rivosinc.com, cade.richard@berkeley.edu, jamestiotio@gmail.com Subject: [kvm-unit-tests PATCH] riscv: sbi: Add IPI extension tests. Date: Sun, 18 Aug 2024 19:01:29 -0700 Message-ID: <20240819020129.26095-1-cade.richard@berkeley.edu> X-Mailer: git-send-email 2.43.0 MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20240818_190138_228798_3CB57C4F X-CRM114-Status: GOOD ( 14.71 ) X-Spam-Score: -2.1 (--) X-Spam-Report: Spam detection software, running on the system "bombadil.infradead.org", has NOT identified this incoming email as spam. The original message has been attached to this so you can view it or label similar future email. If you have any questions, see the administrator of that system for details. Content preview: Add tests for the RISC-V OpenSBI inter-processor interrupt extension. Signed-off-by: Cade Richard --- lib/riscv/asm/sbi.h | 5 ++ riscv/sbi.c | 138 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 143 insertions(+) Content analysis details: (-2.1 points, 5.0 required) pts rule name description ---- ---------------------- -------------------------------------------------- -0.0 RCVD_IN_DNSWL_NONE RBL: Sender listed at https://www.dnswl.org/, no trust [2607:f8b0:4864:20:0:0:0:42b listed in] [list.dnswl.org] 0.0 SPF_HELO_NONE SPF: HELO does not publish an SPF Record -0.0 SPF_PASS SPF: sender matches SPF record -0.1 DKIM_VALID_AU Message has a valid DKIM or DK signature from author's domain 0.1 DKIM_SIGNED Message has a DKIM or DK signature, not necessarily valid -0.1 DKIM_VALID Message has at least one valid DKIM or DK signature -0.1 DKIM_VALID_EF Message has a valid DKIM or DK signature from envelope-from domain -1.9 BAYES_00 BODY: Bayes spam probability is 0 to 1% [score: 0.0000] 0.0 FREEMAIL_FROM Sender email is commonly abused enduser mail provider [cade.richard(at)gmail.com] -0.0 T_SCC_BODY_TEXT_LINE No description available. X-BeenThere: kvm-riscv@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "kvm-riscv" Errors-To: kvm-riscv-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org Add tests for the RISC-V OpenSBI inter-processor interrupt extension. Signed-off-by: Cade Richard --- lib/riscv/asm/sbi.h | 5 ++ riscv/sbi.c | 138 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 143 insertions(+) diff --git a/lib/riscv/asm/sbi.h b/lib/riscv/asm/sbi.h index 47e91025..d0abeefc 100644 --- a/lib/riscv/asm/sbi.h +++ b/lib/riscv/asm/sbi.h @@ -20,6 +20,7 @@ enum sbi_ext_id { SBI_EXT_HSM = 0x48534d, SBI_EXT_SRST = 0x53525354, SBI_EXT_DBCN = 0x4442434E, + SBI_EXT_IPI = 0x735049, }; enum sbi_ext_base_fid { @@ -49,6 +50,10 @@ enum sbi_ext_dbcn_fid { SBI_EXT_DBCN_CONSOLE_WRITE_BYTE, }; +enum sbi_ext_ipi_fid { + SBI_EXT_IPI_SEND = 0, +}; + struct sbiret { long error; long value; diff --git a/riscv/sbi.c b/riscv/sbi.c index 36ddfd48..c339b330 100644 --- a/riscv/sbi.c +++ b/riscv/sbi.c @@ -6,11 +6,14 @@ */ #include #include +#include #include #include #include #include #include +#include +#include #include #include #include @@ -23,6 +26,9 @@ #include #define HIGH_ADDR_BOUNDARY ((phys_addr_t)1 << 32) +static prng_state ps; +static bool ipi_received[__riscv_xlen]; +static bool ipi_timeout[__riscv_xlen]; static void help(void) { @@ -45,6 +51,11 @@ static struct sbiret __dbcn_sbi_ecall(int fid, unsigned long arg0, unsigned long return sbi_ecall(SBI_EXT_DBCN, fid, arg0, arg1, arg2, 0, 0, 0); } +static struct sbiret __ipi_sbi_ecall(unsigned long arg0, unsigned long arg1) +{ + return sbi_ecall(SBI_EXT_IPI, SBI_EXT_IPI_SEND, arg0, arg1, 0, 0, 0, 0); +} + static void split_phys_addr(phys_addr_t paddr, unsigned long *hi, unsigned long *lo) { *lo = (unsigned long)paddr; @@ -420,6 +431,132 @@ static void check_dbcn(void) report_prefix_pop(); } +static int rand_online_cpu(prng_state* ps) { + int me = smp_processor_id(); + int num_iters = prng32(ps); + int rand_cpu = cpumask_next(me, &cpu_online_mask); + + for (int i = 0; i < num_iters; i++) { + rand_cpu = cpumask_next(me, &cpu_online_mask); + } + + return rand_cpu; +} + +static void ipi_timeout_handler(struct pt_regs *regs) { + int me = smp_processor_id(); + ipi_timeout[me] = true; + report_fail("ipi timed out on hart %d", me); +} + +static void ipi_irq_handler(struct pt_regs *regs) { + int me = smp_processor_id(); + ipi_received[me] = true; + report_pass("ipi received on hart %d", me); + +} + +static void ipi_hart_init(void *irq_func) { + int me = smp_processor_id(); + printf("Installing IPI IRQ handler on hart %d", me); + install_irq_handler(IRQ_S_IPI, (void *)ipi_irq_handler); + install_irq_handler(IRQ_S_TIMER, (void *)ipi_timeout_handler); + timer_irq_enable(); + while (!ipi_received[me] && !ipi_timeout[me]) { + cpu_relax(); + } +} + +static int offline_cpu(void) { + for (int i = 0; i < __riscv_xlen; i++) { + if (!cpumask_test_cpu(i, &cpu_online_mask)) { + return i; + } + } + return -1; +} + +static void print_bits(size_t const size, void const * const ptr) +{ + unsigned char *b = (unsigned char*) ptr; + unsigned char byte; + int i, j; + + for (i = size-1; i >= 0; i--) { + for (j = 7; j >= 0; j--) { + byte = (b[i] >> j) & 1; + printf("%u", byte); + } + } + puts(""); +} + +static void set_flags_false(bool arr[]) +{ + for (int i = 0; i < __riscv_xlen; i++) { + arr[i] = 0; + } +} + +static void check_ipi(void) +{ + int cpu = smp_processor_id(); + unsigned long me = (unsigned long)cpu; + struct sbiret ret; + ps = prng_init(0xDEADBEEF); + + report_prefix_push("ipi"); + + if (!sbi_probe(SBI_EXT_IPI)) { + report_skip("ipi extension not available"); + report_prefix_pop(); + return; + } + + if (cpu_has_extension(smp_processor_id(), ISA_SSTC)) { + csr_write(CSR_STIMECMP, ULONG_MAX); + if (__riscv_xlen == 32) + csr_write(CSR_STIMECMPH, ULONG_MAX); + } + + report_prefix_push("send to one random hart"); + set_flags_false(ipi_received); + set_flags_false(ipi_timeout); + int rand_hartid = rand_online_cpu(&ps); + on_cpu(rand_hartid, (void *)ipi_hart_init, NULL); + unsigned long ipi_rand_mask = 1 << rand_hartid; + + ret = __ipi_sbi_ecall(ipi_rand_mask, me); + report(ret.error == SBI_SUCCESS, "send to one randomly chosen hart"); + report_prefix_pop(); + + report_prefix_push("broadcast"); + set_flags_false(ipi_received); + set_flags_false(ipi_timeout); + on_cpus((void *)ipi_hart_init, NULL); + unsigned long ipi_broadcast_mask = (unsigned long)(cpumask_bits(&cpu_online_mask)[me]); + puts("online cpu mask: "); + print_bits(CPUMASK_NR_LONGS*sizeof(long), &ipi_broadcast_mask); + puts("\n"); + + ret = __ipi_sbi_ecall(ipi_broadcast_mask, me); + report(ret.error == SBI_SUCCESS, "send to all available harts"); + report_prefix_pop(); + + report_prefix_push("invalid parameters"); + unsigned long invalid_hart_mask_base = offline_cpu(); + ret = __ipi_sbi_ecall(ipi_rand_mask, invalid_hart_mask_base); + report(ret.error == SBI_ERR_INVALID_PARAM, "hart_mask_base"); + + unsigned long invalid_cpu_mask = 1 << invalid_hart_mask_base; + ret = __ipi_sbi_ecall(invalid_cpu_mask, me); + report(ret.error == SBI_ERR_INVALID_PARAM, "hart_mask"); + report_prefix_pop(); + + report_prefix_pop(); + report_prefix_pop(); +} + int main(int argc, char **argv) { if (argc > 1 && !strcmp(argv[1], "-h")) { @@ -431,6 +568,7 @@ int main(int argc, char **argv) check_base(); check_time(); check_dbcn(); + check_ipi(); return report_summary(); }