[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH v2 12/39] xen/riscv: implement vCPU context switching
- To: xen-devel@xxxxxxxxxxxxxxxxxxxx
- From: Oleksii Kurochko <oleksii.kurochko@xxxxxxxxx>
- Date: Wed, 2 Sep 2026 16:42:59 +0200
- Authentication-results: eu.smtp.expurgate.cloud; dkim=pass header.s=20251104 header.d=gmail.com header.i="@gmail.com" header.h="Content-Transfer-Encoding:Content-Type:In-Reply-To:From:Content-Language:References:Cc:To:Subject:User-Agent:MIME-Version:Date:Message-ID"
- Cc: Romain Caritey <Romain.Caritey@xxxxxxxxxxxxx>, Baptiste Le Duc <baptiste.le-duc@xxxxxxxxxx>, Zheng Zhang <zhangzheng@xxxxxxxxxxx>, Alistair Francis <alistair.francis@xxxxxxx>, Connor Davis <connojdavis@xxxxxxxxx>, Andrew Cooper <andrew.cooper3@xxxxxxxxxx>, Anthony PERARD <anthony.perard@xxxxxxxxxx>, Michal Orzel <michal.orzel@xxxxxxx>, Jan Beulich <jbeulich@xxxxxxxx>, Julien Grall <julien@xxxxxxx>, Roger Pau Monné <roger@xxxxxxxxxxxxxx>, Stefano Stabellini <sstabellini@xxxxxxxxxx>
- Delivery-date: Wed, 02 Sep 2026 14:43:12 +0000
- List-id: Xen developer discussion <xen-devel.lists.xenproject.org>
On 8/27/26 5:20 PM, Oleksii Kurochko wrote:
}
+static void save_csr_regs(struct vcpu *vcpu)
+{
+ /*
+ * There is no need to save these CSRs as only hypervisor writes them in
+ * restore_csr_regs() and guest can't access them so they shouldn't be
+ * stored here. Keep them commented here just for symmetry with the
+ * restore CSRs register part.
+ *
+ * vcpu->arch.hedeleg = csr_read(CSR_HEDELEG);
+ * vcpu->arch.hideleg = csr_read(CSR_HIDELEG);
+ * vcpu->arch.henvcfg = csr_read64(CSR_HENVCFG);
+ * vcpu->arch.hcounteren = csr_read(CSR_HCOUNTEREN);
+ * vcpu->arch.htimedelta = csr_read64(CSR_HTIMEDELTA);
+ *
+ * if ( riscv_isa_extension_available(NULL, RISCV_ISA_EXT_smstateen) )
+ * vcpu->arch.hstateen0 = csr_read(CSR_HSTATEEN0);
+ */
+
+ vcpu->arch.hvip = csr_read(CSR_HVIP);
+
+ vcpu->arch.vsstatus = csr_read(CSR_VSSTATUS);
+ vcpu->arch.vsie = csr_read(CSR_VSIE);
It should be heere csr_read64() (accidentally this changed moved to the
next patch).
+ vcpu->arch.vstvec = csr_read(CSR_VSTVEC);
+ vcpu->arch.vsscratch = csr_read(CSR_VSSCRATCH);
+ vcpu->arch.vscause = csr_read(CSR_VSCAUSE);
+ vcpu->arch.vstval = csr_read(CSR_VSTVAL);
+ vcpu->arch.vsepc = csr_read(CSR_VSEPC);
+}
+
+static void restore_csr_regs(struct vcpu *vcpu)
+{
+ csr_write(CSR_HEDELEG, vcpu->arch.hedeleg);
+ csr_write(CSR_HIDELEG, vcpu->arch.hideleg);
+ csr_write(CSR_HVIP, vcpu->arch.hvip);
+ csr_write64(CSR_HENVCFG, vcpu->arch.henvcfg);
+ csr_write(CSR_HCOUNTEREN, vcpu->arch.hcounteren);
+ csr_write64(CSR_HTIMEDELTA, vcpu->arch.htimedelta);
+
+ if ( riscv_isa_extension_available(NULL, RISCV_ISA_EXT_smstateen) )
+ csr_write(CSR_HSTATEEN0, vcpu->arch.hstateen0);
+
+ csr_write(CSR_VSSTATUS, vcpu->arch.vsstatus);
+ csr_write(CSR_VSIE, vcpu->arch.vsie);
It should be heere csr_write64() (accidentally this changed moved to the
next patch).
+ csr_write(CSR_VSTVEC, vcpu->arch.vstvec);
+ csr_write(CSR_VSSCRATCH, vcpu->arch.vsscratch);
+ csr_write(CSR_VSCAUSE, vcpu->arch.vscause);
+ csr_write(CSR_VSTVAL, vcpu->arch.vstval);
+ csr_write(CSR_VSEPC, vcpu->arch.vsepc);
+}
+
[...]
diff --git a/xen/arch/riscv/include/asm/domain.h
b/xen/arch/riscv/include/asm/domain.h
index 15e8fa19685e..90ed584bb844 100644
--- a/xen/arch/riscv/include/asm/domain.h
+++ b/xen/arch/riscv/include/asm/domain.h
@@ -29,6 +29,12 @@ struct arch_vcpu_io {
struct arch_vcpu {
struct vcpu_vmid vmid;
+ /*
+ * The last CPU this vCPU ran on. Initialised to NR_CPUS
+ * (never ran).
+ */
+ unsigned int last_cpu;
+
/*
* Callee saved registers for Xen's state used to switch from
* prev's stack to the next's stack during context switch.
@@ -60,11 +66,19 @@ struct arch_vcpu {
register_t hcounteren;
register_t hedeleg;
register_t hideleg;
- register_t henvcfg;
+ uint64_t henvcfg;
register_t hstateen0;
+ uint64_t htimedelta;
register_t hvip;
register_t vsatp;
+ register_t vscause;
+ register_t vsepc;
+ register_t vsie;
It should be uint64_t.
+ register_t vsscratch;
+ register_t vsstatus;
+ register_t vstval;
+ register_t vstvec;
Sorry for inconvenience.
~ Oleksii
|