From patchwork Mon Mar 17 17:06:24 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?b?Q2zDqW1lbnQgTMOpZ2Vy?= X-Patchwork-Id: 14019768 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id DECBAC35FF3 for ; Mon, 17 Mar 2025 17:13:33 +0000 (UTC) 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:References:In-Reply-To: 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: List-Owner; bh=oqJDKXzH8MktPmoy0+Daa/Ti6/GSrx3pN53AjEjGV4E=; b=TZQgVOhy2Yv77J IVN/EMpf3OblwtEldOckdGkvVMbJV0xXl20IiTaomAzjOWA7qX1gpUfcYLPzPRCTpGqM9YkywzSTf /XUnQS1qjKxZ8dM9+CH+vhBCKiOH/9uAWTB0ZA1bC7+8M+Hhf6Oiv0HVPYfe5I+dz3HJtI0NGvUd2 Un6nK35Bw4ffVEhUtCvGizUtp/MVp1ACAuj8HbLydc5Zc56AZkOak8eE2p2Ej/TI8RxFEVFIKJi5m rzJs7LoVNdZ2jXLudLnbRXWSQQenK+1PsobNuQDlgF8n/G0y6sqf3Jn+qfA0S7crQXFSRzPxh6nP8 ilghSZmLL5eg8FCmX2tQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.98 #2 (Red Hat Linux)) id 1tuE1p-00000003Vet-1gZZ; Mon, 17 Mar 2025 17:13:29 +0000 Received: from mail-wm1-x331.google.com ([2a00:1450:4864:20::331]) by bombadil.infradead.org with esmtps (Exim 4.98 #2 (Red Hat Linux)) id 1tuDwz-00000003Td2-1tBq for linux-riscv@lists.infradead.org; Mon, 17 Mar 2025 17:08:30 +0000 Received: by mail-wm1-x331.google.com with SMTP id 5b1f17b1804b1-43ce71582e9so16001845e9.1 for ; Mon, 17 Mar 2025 10:08:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=rivosinc-com.20230601.gappssmtp.com; s=20230601; t=1742231308; x=1742836108; darn=lists.infradead.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=P8A8Qnnc9KJsjMpibTJNoHdSMni25LFd1e2ExEX8AcE=; b=BWhp6/ImpS4nu5/EQtMUzRa5W4y8onwS2kO3MR8IW+QmaN5L/dQ9wmQP0qZ3QzeEOU zlpLi4zuo10yC9yOv0Tf5r+4X5+yLwpbE+G0Vz1wC9Uai+Qmf0EPb6eGiDeB3vfYRmmo 77IeiRj0aypqkOqaxsIscOSi9XIRnjM7XxlGC9B1x9PuRbHSC4UbnG5zhYZ+PeQOsesC LcqvTPxBuEZfDAGIhhCCZfqGFtwfS4aVlFLgU5PQHR26QD6gIFPzpnmCuF0znKDphSQn v/NHbHu5vMFUKhJNoN88UMtCwUMABZqMeRI0Uh6xQaP74ZneytEUQaIH28dz6gbueqdd cNUw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1742231308; x=1742836108; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=P8A8Qnnc9KJsjMpibTJNoHdSMni25LFd1e2ExEX8AcE=; b=LjgYMhjvbVRYBYyT6jWncHhdk9bAA5PQDunRwsuKhYMYk67KvwhHtnsJXUqScc7i+A 7kUWuwevuK6Y9mVDXgK4xb18Cvbr2+kU9Qcw1UFsfADTmw+qPsiWrMPU+45jya5GxRiW w6axk1+GVVIC5Zc9sUHJkd5k8/yrTZLlMnDxSepFuYgz3UM5MELBXBEMGiPO6rjysjkL /Mbd5+JjQPjPIdR5/+JV+0yR58jtE+KoAf3kxTfab8ImwUuQN+hnDNDbdGeeUB9SJqfV 2ZNaPfqMRT6nz+dpRo6riD8mL5bJKiPfE+Pc0rBp9YWrvNIyNBZlfFTXt3dpOTEaqbgu Sckw== X-Forwarded-Encrypted: i=1; AJvYcCUv4vCM7JU4908G1ShhDlfkhhWXqv+Xd2/fNm5Dvn8tolfZPpscAbQMkuzKz2nVeXvSfN2GJFu7N7btSw==@lists.infradead.org X-Gm-Message-State: AOJu0Yy758DPSFWQc+6RQIByxFIxu7xYloYBNQjf3O7Ov0e2K76xydOx YAYEMW/vNHy8M0t44taK93LdB6Zq2ntI/qzlHcnALRDtcY5JO9vrAA2WAmPhF3U= X-Gm-Gg: ASbGnctbAsOceDYtpm4iv3wx15oTok73AUJj2sOvnlG58dJSz3GZia8SlAlPmuFxTOV OcPInrJoKLhoDg2o7TcTmpnDRt7FlReNm9451/okiill7Kt8+3EUWiYHqoHFhWeUE9iPFvzyFYn LhfRmdppgLjjso+9YMi+lSY/jwB+WFKy6Mg3JIKJV3ym9bhafjf6R5TxVK6JYn9m94VudN+b4sC uSdj0EJXWABbCGBYrUupCbBlkGtD+oDzdah+TFsDo82USdckiTD/FE6UPhpiedCXX95c5gd7tl4 tWG6U8Jq8EM4vmNhfkooII6HE7OOkP8ZP76uFLCgdKH/YA== X-Google-Smtp-Source: AGHT+IGdYqlnvEy/PawZt8Sx5CxSE5paeIGe9C/m17bEJMfGQaAbMdJsnw0bGmy+W1Inh7nCACydaQ== X-Received: by 2002:a05:600c:4f0f:b0:43d:683:8caa with SMTP id 5b1f17b1804b1-43d1ec8632dmr150023255e9.15.1742231308146; Mon, 17 Mar 2025 10:08:28 -0700 (PDT) Received: from carbon-x1.. ([2a01:e0a:e17:9700:16d2:7456:6634:9626]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-43d23cddb2asm96014505e9.39.2025.03.17.10.08.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 17 Mar 2025 10:08:27 -0700 (PDT) From: =?utf-8?b?Q2zDqW1lbnQgTMOpZ2Vy?= To: Paul Walmsley , Palmer Dabbelt , Anup Patel , Atish Patra , Shuah Khan , Jonathan Corbet , linux-riscv@lists.infradead.org, linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, kvm@vger.kernel.org, kvm-riscv@lists.infradead.org, linux-kselftest@vger.kernel.org Cc: =?utf-8?b?Q2zDqW1lbnQgTMOpZ2Vy?= , Samuel Holland , Andrew Jones , Deepak Gupta Subject: [PATCH v4 18/18] RISC-V: KVM: add support for SBI_FWFT_MISALIGNED_DELEG Date: Mon, 17 Mar 2025 18:06:24 +0100 Message-ID: <20250317170625.1142870-19-cleger@rivosinc.com> X-Mailer: git-send-email 2.47.2 In-Reply-To: <20250317170625.1142870-1-cleger@rivosinc.com> References: <20250317170625.1142870-1-cleger@rivosinc.com> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20250317_100829_501847_E6C86D94 X-CRM114-Status: GOOD ( 12.45 ) X-BeenThere: linux-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: "linux-riscv" Errors-To: linux-riscv-bounces+linux-riscv=archiver.kernel.org@lists.infradead.org SBI_FWFT_MISALIGNED_DELEG needs hedeleg to be modified to delegate misaligned load/store exceptions. Save and restore it during CPU load/put. Signed-off-by: Clément Léger Reviewed-by: Deepak Gupta Reviewed-by: Andrew Jones --- arch/riscv/kvm/vcpu.c | 3 +++ arch/riscv/kvm/vcpu_sbi_fwft.c | 36 ++++++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/arch/riscv/kvm/vcpu.c b/arch/riscv/kvm/vcpu.c index 542747e2c7f5..d98e379945c3 100644 --- a/arch/riscv/kvm/vcpu.c +++ b/arch/riscv/kvm/vcpu.c @@ -646,6 +646,7 @@ void kvm_arch_vcpu_put(struct kvm_vcpu *vcpu) { void *nsh; struct kvm_vcpu_csr *csr = &vcpu->arch.guest_csr; + struct kvm_vcpu_config *cfg = &vcpu->arch.cfg; vcpu->cpu = -1; @@ -671,6 +672,7 @@ void kvm_arch_vcpu_put(struct kvm_vcpu *vcpu) csr->vstval = nacl_csr_read(nsh, CSR_VSTVAL); csr->hvip = nacl_csr_read(nsh, CSR_HVIP); csr->vsatp = nacl_csr_read(nsh, CSR_VSATP); + cfg->hedeleg = nacl_csr_read(nsh, CSR_HEDELEG); } else { csr->vsstatus = csr_read(CSR_VSSTATUS); csr->vsie = csr_read(CSR_VSIE); @@ -681,6 +683,7 @@ void kvm_arch_vcpu_put(struct kvm_vcpu *vcpu) csr->vstval = csr_read(CSR_VSTVAL); csr->hvip = csr_read(CSR_HVIP); csr->vsatp = csr_read(CSR_VSATP); + cfg->hedeleg = csr_read(CSR_HEDELEG); } } diff --git a/arch/riscv/kvm/vcpu_sbi_fwft.c b/arch/riscv/kvm/vcpu_sbi_fwft.c index 8a7cfe1fe7a7..b0556d66e775 100644 --- a/arch/riscv/kvm/vcpu_sbi_fwft.c +++ b/arch/riscv/kvm/vcpu_sbi_fwft.c @@ -14,6 +14,8 @@ #include #include +#define MIS_DELEG (BIT_ULL(EXC_LOAD_MISALIGNED) | BIT_ULL(EXC_STORE_MISALIGNED)) + struct kvm_sbi_fwft_feature { /** * @id: Feature ID @@ -68,7 +70,41 @@ static bool kvm_fwft_is_defined_feature(enum sbi_fwft_feature_t feature) return false; } +static bool kvm_sbi_fwft_misaligned_delegation_supported(struct kvm_vcpu *vcpu) +{ + return misaligned_traps_can_delegate(); +} + +static long kvm_sbi_fwft_set_misaligned_delegation(struct kvm_vcpu *vcpu, + struct kvm_sbi_fwft_config *conf, + unsigned long value) +{ + if (value == 1) + csr_set(CSR_HEDELEG, MIS_DELEG); + else if (value == 0) + csr_clear(CSR_HEDELEG, MIS_DELEG); + else + return SBI_ERR_INVALID_PARAM; + + return SBI_SUCCESS; +} + +static long kvm_sbi_fwft_get_misaligned_delegation(struct kvm_vcpu *vcpu, + struct kvm_sbi_fwft_config *conf, + unsigned long *value) +{ + *value = (csr_read(CSR_HEDELEG) & MIS_DELEG) != 0; + + return SBI_SUCCESS; +} + static const struct kvm_sbi_fwft_feature features[] = { + { + .id = SBI_FWFT_MISALIGNED_EXC_DELEG, + .supported = kvm_sbi_fwft_misaligned_delegation_supported, + .set = kvm_sbi_fwft_set_misaligned_delegation, + .get = kvm_sbi_fwft_get_misaligned_delegation, + }, }; static struct kvm_sbi_fwft_config *