From patchwork Thu Apr 3 11:25:22 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?b?UmFkaW0gS3LEjW3DocWZ?= X-Patchwork-Id: 14037361 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 64386C3601E for ; Thu, 3 Apr 2025 11:37:49 +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=X41Pth+X3BBNGaFhxr98+P1s+xgWOidFP1sR/9hd1lU=; b=DDyun0jru6g7rd dhpBNLET1C72RcKhBFAXRGr4THg4Xt1GPUPbW/Bsz4kF9FU1BDyw/R4/h0ZdgandA+xxiCvPx5fry wadVnI1Bygjl8bAHN/r+p8qlW5BMEG557bIMKP0DsnIyObHKd59GfQw7E/3HcgDRRt+6f26PezFI5 RTFeD/C6s2dnqSId47c41kregAOWVBeU6LW59NYgL6j/aKWne94VEYdsCF4jIAVx+w4jDN3+yDUnq E3UI990x3rU+8hjV1tsQHNK+pYslZgI0b3XMujUNZAM63Tos3QgUDMXf+l8YwrMrPiHxXX8aKQUVK htMyGcF2nXJyVuR4ZFlQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.98.1 #2 (Red Hat Linux)) id 1u0ItE-00000008jTQ-1fdi; Thu, 03 Apr 2025 11:37:44 +0000 Received: from mail-wm1-x330.google.com ([2a00:1450:4864:20::330]) by bombadil.infradead.org with esmtps (Exim 4.98.1 #2 (Red Hat Linux)) id 1u0Inv-00000008iT3-2xML for linux-riscv@lists.infradead.org; Thu, 03 Apr 2025 11:32:16 +0000 Received: by mail-wm1-x330.google.com with SMTP id 5b1f17b1804b1-43935d1321aso958805e9.1 for ; Thu, 03 Apr 2025 04:32:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ventanamicro.com; s=google; t=1743679934; x=1744284734; 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=oXWumzDe9cV0GiyZzQ4x/1N6jIE102NsKwOmEpuNc8U=; b=ZLf4cmeT8nTxYZgM6WXvn4Bl0n2JP0bbhwB7b+1oWFrSYrSDVxSMe9e6B1RALnmU4T ihCamACIwk8hIo1ueYSr9vpIEUN+jPu00/NYJDDkUJUTz3sRzPwezD7QSweH83EBLrZh 1aomNqYVakQUUuHp8F4904sd/gCUbydGFMjhg6PvvR4Cp+wE6NB1+mjWRD6F8YEXePnc /6tYUy4dHAtEXXXD8YtRaAt5y7U9cIYexpb4073L3jKmdijt8Q9G6WNfc/l1vZWMr4V0 np61LONhu+mWFb+YtFepZo81xaxWQ3/bvemH0kgj7vY8HBPpKMXh6GciMN3U0MRcY7zh IaEA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1743679934; x=1744284734; 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=oXWumzDe9cV0GiyZzQ4x/1N6jIE102NsKwOmEpuNc8U=; b=QYASpef4AkX0iIWrpsYAKnbFbShtFKBRpTcCO4IcxL4PiscRigm8gsw2w5xMjXfcjN d8es2IxO6JkRektVpwmJE3/wyAXVle8lbjQBO1hGNIMI7b6kkXeDmD4sW1eF+WHbfYi6 236WwQqgXfQeBOfm73zfxDZAS41VXIOK5Rh/+hc6OvHEft5KDirgdFTsE1OQ8OjKG0V5 uaC4RoRN5OWqjmlRuW1r/e7wgd1RU+fz5JaeYLVI5KQ/C64Zc1L+bPH8qpj9QJ9bjKoo NdBblt17WkcACCluX/doV2zjcuQAhJ4vmV7AKzpRtGU0gBpzGIoj9LQtF2dt6HvBuBbt YPcA== X-Forwarded-Encrypted: i=1; AJvYcCXskpvPz4TYTP5OjBBtKMCqcNCGiBZxyJDthZEAm/hhed7LzRaRzSCgAvpsVQQeSsxsobX1VKtU3E1k4w==@lists.infradead.org X-Gm-Message-State: AOJu0YzaxEc44kM2Dwbi6AW75O1P3YCCPGgST2rQo4U7LzAmwo9toFYH 1rQH0IX1ZRJdXcOgbChRXKKRj18Wq3i6XuSa7CUYEcnGz4WWUa8hJD7sklKBAf8= X-Gm-Gg: ASbGnctmJlVWuazIvGYC/BY+KWLD6rEIn62PInRDTRgCVWQecdVa4SLgdk3kfw/1xa+ 8hxnCPt1T989R1TO8LWU1pY1owBg6GJI/u/tWvzOQD7JC/IHvGCx2s52cS2L2y2s1AgN0BhRLIF jT4agQbiVmg0RQZu/pg9RygUODmuy8k3S0ScG5nrqlpmFRYm/qdPPNKLC1mvPILeiZZtn6E08Xz dshFuGfX/3ADwqY9IVrOjhjhBtPHXVz9KAJkPanhiWabv1KArmSvnkqRXbp0FIT9KjDNgJj9MZF r/gc5nmoLp+bT4IaIBRkrAfykTK1ycBYRR0pHJhzMjxtRfII6ugCdFF7M3SU+rDwP9N3JldQB+R lnQ== X-Google-Smtp-Source: AGHT+IGYZA79TpGdD3IyE6RBBx1HPlO32wDC9YCrigfm8LcUPmDgc+MGuI/dN03f02oGXug0YpJyDw== X-Received: by 2002:a5d:5f8d:0:b0:386:3a50:8c52 with SMTP id ffacd0b85a97d-39c2470a9a8mr3130677f8f.7.1743679934361; Thu, 03 Apr 2025 04:32:14 -0700 (PDT) Received: from localhost (cst2-173-141.cust.vodafone.cz. [31.30.173.141]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-39c301a7045sm1584106f8f.39.2025.04.03.04.32.13 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 03 Apr 2025 04:32:14 -0700 (PDT) From: =?utf-8?b?UmFkaW0gS3LEjW3DocWZ?= To: kvm-riscv@lists.infradead.org Cc: kvm@vger.kernel.org, linux-riscv@lists.infradead.org, linux-kernel@vger.kernel.org, Anup Patel , Atish Patra , Paul Walmsley , Palmer Dabbelt , Albert Ou , Alexandre Ghiti , Andrew Jones , Mayuresh Chitale Subject: [PATCH 3/5] KVM: RISC-V: remove unnecessary SBI reset state Date: Thu, 3 Apr 2025 13:25:22 +0200 Message-ID: <20250403112522.1566629-6-rkrcmar@ventanamicro.com> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250403112522.1566629-3-rkrcmar@ventanamicro.com> References: <20250403112522.1566629-3-rkrcmar@ventanamicro.com> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20250403_043215_760499_DF9F8DD2 X-CRM114-Status: GOOD ( 19.68 ) 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 The SBI reset state has only two variables -- pc and a1. The rest is known, so keep only the necessary information. The reset structures make sense if we want userspace to control the reset state (which we do), but I'd still remove them now and reintroduce with the userspace interface later -- we could probably have just a single reset state per VM, instead of a reset state for each VCPU. Signed-off-by: Radim Krčmář --- arch/riscv/include/asm/kvm_aia.h | 3 -- arch/riscv/include/asm/kvm_host.h | 12 ++++--- arch/riscv/kvm/aia_device.c | 4 +-- arch/riscv/kvm/vcpu.c | 58 +++++++++++++++++-------------- arch/riscv/kvm/vcpu_sbi.c | 9 +++-- 5 files changed, 44 insertions(+), 42 deletions(-) diff --git a/arch/riscv/include/asm/kvm_aia.h b/arch/riscv/include/asm/kvm_aia.h index 1f37b600ca47..3b643b9efc07 100644 --- a/arch/riscv/include/asm/kvm_aia.h +++ b/arch/riscv/include/asm/kvm_aia.h @@ -63,9 +63,6 @@ struct kvm_vcpu_aia { /* CPU AIA CSR context of Guest VCPU */ struct kvm_vcpu_aia_csr guest_csr; - /* CPU AIA CSR context upon Guest VCPU reset */ - struct kvm_vcpu_aia_csr guest_reset_csr; - /* Guest physical address of IMSIC for this VCPU */ gpa_t imsic_addr; diff --git a/arch/riscv/include/asm/kvm_host.h b/arch/riscv/include/asm/kvm_host.h index 0e9c2fab6378..0c8c9c05af91 100644 --- a/arch/riscv/include/asm/kvm_host.h +++ b/arch/riscv/include/asm/kvm_host.h @@ -193,6 +193,12 @@ struct kvm_vcpu_smstateen_csr { unsigned long sstateen0; }; +struct kvm_vcpu_reset_state { + spinlock_t lock; + unsigned long pc; + unsigned long a1; +}; + struct kvm_vcpu_arch { /* VCPU ran at least once */ bool ran_atleast_once; @@ -227,12 +233,8 @@ struct kvm_vcpu_arch { /* CPU Smstateen CSR context of Guest VCPU */ struct kvm_vcpu_smstateen_csr smstateen_csr; - /* CPU context upon Guest VCPU reset */ - struct kvm_cpu_context guest_reset_context; - spinlock_t reset_cntx_lock; + struct kvm_vcpu_reset_state reset_state; - /* CPU CSR context upon Guest VCPU reset */ - struct kvm_vcpu_csr guest_reset_csr; /* * VCPU interrupts diff --git a/arch/riscv/kvm/aia_device.c b/arch/riscv/kvm/aia_device.c index 39cd26af5a69..43e472ff3e1a 100644 --- a/arch/riscv/kvm/aia_device.c +++ b/arch/riscv/kvm/aia_device.c @@ -526,12 +526,10 @@ int kvm_riscv_vcpu_aia_update(struct kvm_vcpu *vcpu) void kvm_riscv_vcpu_aia_reset(struct kvm_vcpu *vcpu) { struct kvm_vcpu_aia_csr *csr = &vcpu->arch.aia_context.guest_csr; - struct kvm_vcpu_aia_csr *reset_csr = - &vcpu->arch.aia_context.guest_reset_csr; if (!kvm_riscv_aia_available()) return; - memcpy(csr, reset_csr, sizeof(*csr)); + memset(csr, 0, sizeof(*csr)); /* Proceed only if AIA was initialized successfully */ if (!kvm_riscv_aia_initialized(vcpu->kvm)) diff --git a/arch/riscv/kvm/vcpu.c b/arch/riscv/kvm/vcpu.c index 2fb75288ecfe..b8485c1c1ce4 100644 --- a/arch/riscv/kvm/vcpu.c +++ b/arch/riscv/kvm/vcpu.c @@ -51,13 +51,40 @@ const struct kvm_stats_header kvm_vcpu_stats_header = { sizeof(kvm_vcpu_stats_desc), }; -static void kvm_riscv_reset_vcpu(struct kvm_vcpu *vcpu) +static void kvm_riscv_vcpu_context_reset(struct kvm_vcpu *vcpu) { struct kvm_vcpu_csr *csr = &vcpu->arch.guest_csr; - struct kvm_vcpu_csr *reset_csr = &vcpu->arch.guest_reset_csr; struct kvm_cpu_context *cntx = &vcpu->arch.guest_context; - struct kvm_cpu_context *reset_cntx = &vcpu->arch.guest_reset_context; + struct kvm_vcpu_reset_state *reset_state = &vcpu->arch.reset_state; void *vector_datap = cntx->vector.datap; + + memset(cntx, 0, sizeof(*cntx)); + memset(csr, 0, sizeof(*csr)); + + /* Restore datap as it's not a part of the guest context. */ + cntx->vector.datap = vector_datap; + + /* Load SBI reset values */ + cntx->a0 = vcpu->vcpu_id; + + spin_lock(&reset_state->lock); + cntx->sepc = reset_state->pc; + cntx->a1 = reset_state->a1; + spin_unlock(&reset_state->lock); + + /* Setup reset state of shadow SSTATUS and HSTATUS CSRs */ + cntx->sstatus = SR_SPP | SR_SPIE; + + cntx->hstatus |= HSTATUS_VTW; + cntx->hstatus |= HSTATUS_SPVP; + cntx->hstatus |= HSTATUS_SPV; + + /* By default, make CY, TM, and IR counters accessible in VU mode */ + csr->scounteren = 0x7; +} + +static void kvm_riscv_reset_vcpu(struct kvm_vcpu *vcpu) +{ bool loaded; /** @@ -72,16 +99,10 @@ static void kvm_riscv_reset_vcpu(struct kvm_vcpu *vcpu) vcpu->arch.last_exit_cpu = -1; - memcpy(csr, reset_csr, sizeof(*csr)); - - spin_lock(&vcpu->arch.reset_cntx_lock); - memcpy(cntx, reset_cntx, sizeof(*cntx)); - spin_unlock(&vcpu->arch.reset_cntx_lock); + kvm_riscv_vcpu_context_reset(vcpu); kvm_riscv_vcpu_fp_reset(vcpu); - /* Restore datap as it's not a part of the guest context. */ - cntx->vector.datap = vector_datap; kvm_riscv_vcpu_vector_reset(vcpu); kvm_riscv_vcpu_timer_reset(vcpu); @@ -113,8 +134,6 @@ int kvm_arch_vcpu_precreate(struct kvm *kvm, unsigned int id) int kvm_arch_vcpu_create(struct kvm_vcpu *vcpu) { int rc; - struct kvm_cpu_context *cntx; - struct kvm_vcpu_csr *reset_csr = &vcpu->arch.guest_reset_csr; spin_lock_init(&vcpu->arch.mp_state_lock); @@ -134,24 +153,11 @@ int kvm_arch_vcpu_create(struct kvm_vcpu *vcpu) /* Setup VCPU hfence queue */ spin_lock_init(&vcpu->arch.hfence_lock); - /* Setup reset state of shadow SSTATUS and HSTATUS CSRs */ - spin_lock_init(&vcpu->arch.reset_cntx_lock); - - spin_lock(&vcpu->arch.reset_cntx_lock); - cntx = &vcpu->arch.guest_reset_context; - cntx->sstatus = SR_SPP | SR_SPIE; - cntx->hstatus = 0; - cntx->hstatus |= HSTATUS_VTW; - cntx->hstatus |= HSTATUS_SPVP; - cntx->hstatus |= HSTATUS_SPV; - spin_unlock(&vcpu->arch.reset_cntx_lock); + spin_lock_init(&vcpu->arch.reset_state.lock); if (kvm_riscv_vcpu_alloc_vector_context(vcpu)) return -ENOMEM; - /* By default, make CY, TM, and IR counters accessible in VU mode */ - reset_csr->scounteren = 0x7; - /* Setup VCPU timer */ kvm_riscv_vcpu_timer_init(vcpu); diff --git a/arch/riscv/kvm/vcpu_sbi.c b/arch/riscv/kvm/vcpu_sbi.c index f58368f7df1d..3d7955e05cc3 100644 --- a/arch/riscv/kvm/vcpu_sbi.c +++ b/arch/riscv/kvm/vcpu_sbi.c @@ -159,11 +159,10 @@ void kvm_riscv_vcpu_sbi_system_reset(struct kvm_vcpu *vcpu, void kvm_riscv_vcpu_sbi_request_reset(struct kvm_vcpu *vcpu, unsigned long pc, unsigned long a1) { - spin_lock(&vcpu->arch.reset_cntx_lock); - vcpu->arch.guest_reset_context.sepc = pc; - vcpu->arch.guest_reset_context.a0 = vcpu->vcpu_id; - vcpu->arch.guest_reset_context.a1 = a1; - spin_unlock(&vcpu->arch.reset_cntx_lock); + spin_lock(&vcpu->arch.reset_state.lock); + vcpu->arch.reset_state.pc = pc; + vcpu->arch.reset_state.a1 = a1; + spin_unlock(&vcpu->arch.reset_state.lock); kvm_make_request(KVM_REQ_VCPU_RESET, vcpu); }