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