|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v2 03/16] xen/riscv: implement vcpu_csr_init()
On 1/24/26 11:44 PM, Teddy Astie wrote: Le 22/01/2026 à 17:49, Oleksii Kurochko a écrit :Introduce vcpu_csr_init() to set up the initial hypervisor-visible CSR state for a vCPU before it is first scheduled.To me, "hypervisor-visible CSR state" sounds like some state of the guest the hypervisor has view on. But to what I read, it's more hypervisor state CSRs regarding what to intercept and various virtualization behavior. I'll rephrase then to: Introduce vcpu_csr_init() to initialise hypervisor CSRs that control vCPU execution and virtualization behaviour before the vCPU is first scheduled. The function configures trap and interrupt delegation to VS-mode by setting the appropriate bits in the hedeleg and hideleg registers, initializes hstatus so that execution enters VS-mode when control is passed to the guest, and restricts guest access to hardware performance counters by initializing hcounteren, as unrestricted access would require additional handling in Xen. When the Smstateen and SSAIA extensions are available, access to AIA CSRs and IMSIC guest interrupt files is enabled by setting the corresponding bits in hstateen0, avoiding unnecessary traps into Xen (note that SVSLCT(Supervisor Virtual Select) name is used intead of CSRIND as OpenSBI uses such name and riscv_encoding.h is mostly based on it). If the Svpbmt extension is supported, the PBMTE bit is set in henvcfg to allow its use for VS-stage address translation. Guest access to the ENVCFG CSR is also enabled by setting ENVCFG bit in hstateen0, as a guest may need to control certain characteristics of the U-mode (VU-mode when V=1) execution environment. For CSRs that may contain read-only bits (e.g. hedeleg, hideleg, hstateen0), the written value is re-read from hardware and cached in vcpu->arch to avoid divergence between the software state and the actual CSR contents.AFAIU from RISC-V isa document, at least for some CSRs the read-only-0 bits are well-defined and means "can't be configured" due to not having a meaning (e.g hedeleg defines as read-only "Environment call from HS-mode" because guest can't be in a "actual" HS-mode). It was said about bits which hypervisor tries to set in the mentioned registers and IIRC all of them could be r/o-0 as, for example, M-mode can decide not to delegate them to HS-mode.
Generally, agree. But hstatus want to be saved during a trap even before guest is started and considering that we already have the code which stores it in guest_cpu_user_regs structure and handle it during the trap, I've decided just to drop hstatus from arch_vcpu.
Yes, they will be updated anyway. When this approach was initially suggested, I considered the case where some code might attempt to use these bits before the context-switch logic runs. In that situation, we could end up executing code that assumes the feature is available (because the bit is set in|v->arch.some_reg|), only to later discover that the corresponding CSR bit is read-only zero. I think it would be better to have : - vcpu_csr_init -> sets initial state CSR in vcpu structure, doesn't touch machine CSR - context switching logic -> loads vcpu-specific machine CSR from vcpu structure We would have to make a context switch to enter the vcpu for the first time; but that's to be expected. With my proposal, we would also want to move the vcpu_csr_init() invocation to the place we initialize the vcpu_arch structure rather than the first time we schedule inside that vcpu. I think I may be misunderstanding something here. vcpu_csr_init() is now called from arch_vcpu_create(), which initialises architecture-specific arch_vcpu fields. Am I missing something? That would also allow to take account of per-domain configuration if we need to (e.g feature flags). Thanks. ~ Oleksii
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |