* [PATCH v2 0/3] target/riscv/kvm: reset time changes
@ 2025-02-21 12:26 Daniel Henrique Barboza
2025-02-21 12:26 ` [PATCH v2 1/3] target/riscv/cpu: ignore TCG init for KVM CPUs in reset_hold Daniel Henrique Barboza
` (3 more replies)
0 siblings, 4 replies; 7+ messages in thread
From: Daniel Henrique Barboza @ 2025-02-21 12:26 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-riscv, alistair.francis, bmeng, liwei1518, zhiwei_liu,
palmer, ajones, Daniel Henrique Barboza
Hi,
In this version the following changes were made, based on feedback from
Drew in v1:
- patch 2: reworked. Instead of using a different existing 'env' field
to get/put the 'sie' CSR, we're adding a new helper that contains all
reset vals for the KVM CSRs we support
- patch 3: reworked. Add two KVM CSRs from the KVM UAPI that we're not
using.
Link to v1: https://lore.kernel.org/qemu-riscv/20250220161313.127376-1-dbarboza@ventanamicro.com/
Patches based on alistair/riscv-to-apply.next.
Daniel Henrique Barboza (3):
target/riscv/cpu: ignore TCG init for KVM CPUs in reset_hold
target/riscv/kvm: add kvm_riscv_reset_regs_csr()
target/riscv/kvm: add missing KVM CSRs
target/riscv/cpu.c | 9 +++++----
target/riscv/kvm/kvm-cpu.c | 32 +++++++++++++++++++++-----------
2 files changed, 26 insertions(+), 15 deletions(-)
--
2.48.1
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH v2 1/3] target/riscv/cpu: ignore TCG init for KVM CPUs in reset_hold
2025-02-21 12:26 [PATCH v2 0/3] target/riscv/kvm: reset time changes Daniel Henrique Barboza
@ 2025-02-21 12:26 ` Daniel Henrique Barboza
2025-02-21 12:26 ` [PATCH v2 2/3] target/riscv/kvm: add kvm_riscv_reset_regs_csr() Daniel Henrique Barboza
` (2 subsequent siblings)
3 siblings, 0 replies; 7+ messages in thread
From: Daniel Henrique Barboza @ 2025-02-21 12:26 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-riscv, alistair.francis, bmeng, liwei1518, zhiwei_liu,
palmer, ajones, Daniel Henrique Barboza
riscv_cpu_reset_hold() does a lot of TCG-related initializations that
aren't relevant for KVM, but nevertheless are impacting the reset state
of KVM vcpus.
When running a KVM guest, kvm_riscv_reset_vcpu() is called at the end of
reset_hold(). At that point env->mstatus is initialized to a non-zero
value, and it will be use to write 'sstatus' in the vcpu
(kvm_arch_put_registers() then kvm_riscv_put_regs_csr()).
Do an early exit in riscv_cpu_reset_hold() if we're running KVM. All the
KVM reset procedure will be centered in kvm_riscv_reset_vcpu().
While we're at it, remove the kvm_enabled() check in
kvm_riscv_reset_vcpu() since it's already being gated in
riscv_cpu_reset_hold().
Signed-off-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
Reviewed-by: Andrew Jones <ajones@ventanamicro.com>
---
target/riscv/cpu.c | 9 +++++----
target/riscv/kvm/kvm-cpu.c | 3 ---
2 files changed, 5 insertions(+), 7 deletions(-)
diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
index 522d6584e4..8e6e629ec4 100644
--- a/target/riscv/cpu.c
+++ b/target/riscv/cpu.c
@@ -1050,6 +1050,11 @@ static void riscv_cpu_reset_hold(Object *obj, ResetType type)
mcc->parent_phases.hold(obj, type);
}
#ifndef CONFIG_USER_ONLY
+ if (kvm_enabled()) {
+ kvm_riscv_reset_vcpu(cpu);
+ return;
+ }
+
env->misa_mxl = mcc->misa_mxl_max;
env->priv = PRV_M;
env->mstatus &= ~(MSTATUS_MIE | MSTATUS_MPRV);
@@ -1146,10 +1151,6 @@ static void riscv_cpu_reset_hold(Object *obj, ResetType type)
env->rnmip = 0;
env->mnstatus = set_field(env->mnstatus, MNSTATUS_NMIE, false);
}
-
- if (kvm_enabled()) {
- kvm_riscv_reset_vcpu(cpu);
- }
#endif
}
diff --git a/target/riscv/kvm/kvm-cpu.c b/target/riscv/kvm/kvm-cpu.c
index 23ce779359..484b6afe7c 100644
--- a/target/riscv/kvm/kvm-cpu.c
+++ b/target/riscv/kvm/kvm-cpu.c
@@ -1603,9 +1603,6 @@ void kvm_riscv_reset_vcpu(RISCVCPU *cpu)
CPURISCVState *env = &cpu->env;
int i;
- if (!kvm_enabled()) {
- return;
- }
for (i = 0; i < 32; i++) {
env->gpr[i] = 0;
}
--
2.48.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH v2 2/3] target/riscv/kvm: add kvm_riscv_reset_regs_csr()
2025-02-21 12:26 [PATCH v2 0/3] target/riscv/kvm: reset time changes Daniel Henrique Barboza
2025-02-21 12:26 ` [PATCH v2 1/3] target/riscv/cpu: ignore TCG init for KVM CPUs in reset_hold Daniel Henrique Barboza
@ 2025-02-21 12:26 ` Daniel Henrique Barboza
2025-02-21 12:44 ` Andrew Jones
2025-02-21 12:26 ` [PATCH v2 3/3] target/riscv/kvm: add missing KVM CSRs Daniel Henrique Barboza
2025-02-28 11:10 ` [PATCH v2 0/3] target/riscv/kvm: reset time changes Daniel Henrique Barboza
3 siblings, 1 reply; 7+ messages in thread
From: Daniel Henrique Barboza @ 2025-02-21 12:26 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-riscv, alistair.francis, bmeng, liwei1518, zhiwei_liu,
palmer, ajones, Daniel Henrique Barboza
We're setting reset vals for KVM csrs during kvm_riscv_reset_vcpu(), but
in no particular order and missing some of them (like env->mstatus).
Create a helper to do that, unclogging reset_vcpu(), and initialize
env->mstatus as well. Keep the regs in the same order they appear in
struct kvm_riscv_csr from the KVM UAPI, similar to what
kvm_riscv_(get|put)_regs_csr are doing. This will make a bit easier to
add new KVM CSRs and to verify which values we're writing back to KVM
during vcpu reset.
Signed-off-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
---
target/riscv/kvm/kvm-cpu.c | 23 +++++++++++++++--------
1 file changed, 15 insertions(+), 8 deletions(-)
diff --git a/target/riscv/kvm/kvm-cpu.c b/target/riscv/kvm/kvm-cpu.c
index 484b6afe7c..f14fcc58bb 100644
--- a/target/riscv/kvm/kvm-cpu.c
+++ b/target/riscv/kvm/kvm-cpu.c
@@ -605,6 +605,19 @@ static int kvm_riscv_put_regs_core(CPUState *cs)
return ret;
}
+static void kvm_riscv_reset_regs_csr(CPURISCVState *env)
+{
+ env->mstatus = 0;
+ env->mie = 0;
+ env->stvec = 0;
+ env->sscratch = 0;
+ env->sepc = 0;
+ env->scause = 0;
+ env->stval = 0;
+ env->mip = 0;
+ env->satp = 0;
+}
+
static int kvm_riscv_get_regs_csr(CPUState *cs)
{
CPURISCVState *env = &RISCV_CPU(cs)->env;
@@ -1609,14 +1622,8 @@ void kvm_riscv_reset_vcpu(RISCVCPU *cpu)
env->pc = cpu->env.kernel_addr;
env->gpr[10] = kvm_arch_vcpu_id(CPU(cpu)); /* a0 */
env->gpr[11] = cpu->env.fdt_addr; /* a1 */
- env->satp = 0;
- env->mie = 0;
- env->stvec = 0;
- env->sscratch = 0;
- env->sepc = 0;
- env->scause = 0;
- env->stval = 0;
- env->mip = 0;
+
+ kvm_riscv_reset_regs_csr(env);
}
void kvm_riscv_set_irq(RISCVCPU *cpu, int irq, int level)
--
2.48.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH v2 3/3] target/riscv/kvm: add missing KVM CSRs
2025-02-21 12:26 [PATCH v2 0/3] target/riscv/kvm: reset time changes Daniel Henrique Barboza
2025-02-21 12:26 ` [PATCH v2 1/3] target/riscv/cpu: ignore TCG init for KVM CPUs in reset_hold Daniel Henrique Barboza
2025-02-21 12:26 ` [PATCH v2 2/3] target/riscv/kvm: add kvm_riscv_reset_regs_csr() Daniel Henrique Barboza
@ 2025-02-21 12:26 ` Daniel Henrique Barboza
2025-02-21 12:45 ` Andrew Jones
2025-02-28 11:10 ` [PATCH v2 0/3] target/riscv/kvm: reset time changes Daniel Henrique Barboza
3 siblings, 1 reply; 7+ messages in thread
From: Daniel Henrique Barboza @ 2025-02-21 12:26 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-riscv, alistair.francis, bmeng, liwei1518, zhiwei_liu,
palmer, ajones, Daniel Henrique Barboza
We're missing scounteren and senvcfg CSRs, both already present in the
KVM UAPI.
Signed-off-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
---
target/riscv/kvm/kvm-cpu.c | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/target/riscv/kvm/kvm-cpu.c b/target/riscv/kvm/kvm-cpu.c
index f14fcc58bb..017ca82226 100644
--- a/target/riscv/kvm/kvm-cpu.c
+++ b/target/riscv/kvm/kvm-cpu.c
@@ -616,6 +616,8 @@ static void kvm_riscv_reset_regs_csr(CPURISCVState *env)
env->stval = 0;
env->mip = 0;
env->satp = 0;
+ env->scounteren = 0;
+ env->senvcfg = 0;
}
static int kvm_riscv_get_regs_csr(CPUState *cs)
@@ -631,6 +633,8 @@ static int kvm_riscv_get_regs_csr(CPUState *cs)
KVM_RISCV_GET_CSR(cs, env, stval, env->stval);
KVM_RISCV_GET_CSR(cs, env, sip, env->mip);
KVM_RISCV_GET_CSR(cs, env, satp, env->satp);
+ KVM_RISCV_GET_CSR(cs, env, scounteren, env->scounteren);
+ KVM_RISCV_GET_CSR(cs, env, senvcfg, env->senvcfg);
return 0;
}
@@ -648,6 +652,8 @@ static int kvm_riscv_put_regs_csr(CPUState *cs)
KVM_RISCV_SET_CSR(cs, env, stval, env->stval);
KVM_RISCV_SET_CSR(cs, env, sip, env->mip);
KVM_RISCV_SET_CSR(cs, env, satp, env->satp);
+ KVM_RISCV_SET_CSR(cs, env, scounteren, env->scounteren);
+ KVM_RISCV_SET_CSR(cs, env, senvcfg, env->senvcfg);
return 0;
}
--
2.48.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH v2 2/3] target/riscv/kvm: add kvm_riscv_reset_regs_csr()
2025-02-21 12:26 ` [PATCH v2 2/3] target/riscv/kvm: add kvm_riscv_reset_regs_csr() Daniel Henrique Barboza
@ 2025-02-21 12:44 ` Andrew Jones
0 siblings, 0 replies; 7+ messages in thread
From: Andrew Jones @ 2025-02-21 12:44 UTC (permalink / raw)
To: Daniel Henrique Barboza
Cc: qemu-devel, qemu-riscv, alistair.francis, bmeng, liwei1518,
zhiwei_liu, palmer
On Fri, Feb 21, 2025 at 09:26:22AM -0300, Daniel Henrique Barboza wrote:
> We're setting reset vals for KVM csrs during kvm_riscv_reset_vcpu(), but
> in no particular order and missing some of them (like env->mstatus).
>
> Create a helper to do that, unclogging reset_vcpu(), and initialize
> env->mstatus as well. Keep the regs in the same order they appear in
> struct kvm_riscv_csr from the KVM UAPI, similar to what
> kvm_riscv_(get|put)_regs_csr are doing. This will make a bit easier to
> add new KVM CSRs and to verify which values we're writing back to KVM
> during vcpu reset.
>
> Signed-off-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
> ---
> target/riscv/kvm/kvm-cpu.c | 23 +++++++++++++++--------
> 1 file changed, 15 insertions(+), 8 deletions(-)
>
> diff --git a/target/riscv/kvm/kvm-cpu.c b/target/riscv/kvm/kvm-cpu.c
> index 484b6afe7c..f14fcc58bb 100644
> --- a/target/riscv/kvm/kvm-cpu.c
> +++ b/target/riscv/kvm/kvm-cpu.c
> @@ -605,6 +605,19 @@ static int kvm_riscv_put_regs_core(CPUState *cs)
> return ret;
> }
>
> +static void kvm_riscv_reset_regs_csr(CPURISCVState *env)
> +{
> + env->mstatus = 0;
> + env->mie = 0;
> + env->stvec = 0;
> + env->sscratch = 0;
> + env->sepc = 0;
> + env->scause = 0;
> + env->stval = 0;
> + env->mip = 0;
> + env->satp = 0;
> +}
> +
> static int kvm_riscv_get_regs_csr(CPUState *cs)
> {
> CPURISCVState *env = &RISCV_CPU(cs)->env;
> @@ -1609,14 +1622,8 @@ void kvm_riscv_reset_vcpu(RISCVCPU *cpu)
> env->pc = cpu->env.kernel_addr;
> env->gpr[10] = kvm_arch_vcpu_id(CPU(cpu)); /* a0 */
> env->gpr[11] = cpu->env.fdt_addr; /* a1 */
> - env->satp = 0;
> - env->mie = 0;
> - env->stvec = 0;
> - env->sscratch = 0;
> - env->sepc = 0;
> - env->scause = 0;
> - env->stval = 0;
> - env->mip = 0;
> +
> + kvm_riscv_reset_regs_csr(env);
> }
>
> void kvm_riscv_set_irq(RISCVCPU *cpu, int irq, int level)
> --
> 2.48.1
>
Reviewed-by: Andrew Jones <ajones@ventanamicro.com>
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v2 3/3] target/riscv/kvm: add missing KVM CSRs
2025-02-21 12:26 ` [PATCH v2 3/3] target/riscv/kvm: add missing KVM CSRs Daniel Henrique Barboza
@ 2025-02-21 12:45 ` Andrew Jones
0 siblings, 0 replies; 7+ messages in thread
From: Andrew Jones @ 2025-02-21 12:45 UTC (permalink / raw)
To: Daniel Henrique Barboza
Cc: qemu-devel, qemu-riscv, alistair.francis, bmeng, liwei1518,
zhiwei_liu, palmer
On Fri, Feb 21, 2025 at 09:26:23AM -0300, Daniel Henrique Barboza wrote:
> We're missing scounteren and senvcfg CSRs, both already present in the
> KVM UAPI.
>
> Signed-off-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
> ---
> target/riscv/kvm/kvm-cpu.c | 6 ++++++
> 1 file changed, 6 insertions(+)
>
> diff --git a/target/riscv/kvm/kvm-cpu.c b/target/riscv/kvm/kvm-cpu.c
> index f14fcc58bb..017ca82226 100644
> --- a/target/riscv/kvm/kvm-cpu.c
> +++ b/target/riscv/kvm/kvm-cpu.c
> @@ -616,6 +616,8 @@ static void kvm_riscv_reset_regs_csr(CPURISCVState *env)
> env->stval = 0;
> env->mip = 0;
> env->satp = 0;
> + env->scounteren = 0;
> + env->senvcfg = 0;
> }
>
> static int kvm_riscv_get_regs_csr(CPUState *cs)
> @@ -631,6 +633,8 @@ static int kvm_riscv_get_regs_csr(CPUState *cs)
> KVM_RISCV_GET_CSR(cs, env, stval, env->stval);
> KVM_RISCV_GET_CSR(cs, env, sip, env->mip);
> KVM_RISCV_GET_CSR(cs, env, satp, env->satp);
> + KVM_RISCV_GET_CSR(cs, env, scounteren, env->scounteren);
> + KVM_RISCV_GET_CSR(cs, env, senvcfg, env->senvcfg);
>
> return 0;
> }
> @@ -648,6 +652,8 @@ static int kvm_riscv_put_regs_csr(CPUState *cs)
> KVM_RISCV_SET_CSR(cs, env, stval, env->stval);
> KVM_RISCV_SET_CSR(cs, env, sip, env->mip);
> KVM_RISCV_SET_CSR(cs, env, satp, env->satp);
> + KVM_RISCV_SET_CSR(cs, env, scounteren, env->scounteren);
> + KVM_RISCV_SET_CSR(cs, env, senvcfg, env->senvcfg);
>
> return 0;
> }
> --
> 2.48.1
>
Reviewed-by: Andrew Jones <ajones@ventanamicro.com>
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v2 0/3] target/riscv/kvm: reset time changes
2025-02-21 12:26 [PATCH v2 0/3] target/riscv/kvm: reset time changes Daniel Henrique Barboza
` (2 preceding siblings ...)
2025-02-21 12:26 ` [PATCH v2 3/3] target/riscv/kvm: add missing KVM CSRs Daniel Henrique Barboza
@ 2025-02-28 11:10 ` Daniel Henrique Barboza
3 siblings, 0 replies; 7+ messages in thread
From: Daniel Henrique Barboza @ 2025-02-28 11:10 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-riscv, alistair.francis, bmeng, liwei1518, zhiwei_liu,
palmer, ajones
Hi Alistair,
Can you please take a look in this series? This will collide with another
series that are changing KVM CSRs that will require a rebase. Might
as well do a rebase on top of this set too since it's fully acked already.
Thanks,
Daniel
On 2/21/25 9:26 AM, Daniel Henrique Barboza wrote:
> Hi,
>
> In this version the following changes were made, based on feedback from
> Drew in v1:
>
> - patch 2: reworked. Instead of using a different existing 'env' field
> to get/put the 'sie' CSR, we're adding a new helper that contains all
> reset vals for the KVM CSRs we support
> - patch 3: reworked. Add two KVM CSRs from the KVM UAPI that we're not
> using.
>
> Link to v1: https://lore.kernel.org/qemu-riscv/20250220161313.127376-1-dbarboza@ventanamicro.com/
>
> Patches based on alistair/riscv-to-apply.next.
>
> Daniel Henrique Barboza (3):
> target/riscv/cpu: ignore TCG init for KVM CPUs in reset_hold
> target/riscv/kvm: add kvm_riscv_reset_regs_csr()
> target/riscv/kvm: add missing KVM CSRs
>
> target/riscv/cpu.c | 9 +++++----
> target/riscv/kvm/kvm-cpu.c | 32 +++++++++++++++++++++-----------
> 2 files changed, 26 insertions(+), 15 deletions(-)
>
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2025-02-28 11:11 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-02-21 12:26 [PATCH v2 0/3] target/riscv/kvm: reset time changes Daniel Henrique Barboza
2025-02-21 12:26 ` [PATCH v2 1/3] target/riscv/cpu: ignore TCG init for KVM CPUs in reset_hold Daniel Henrique Barboza
2025-02-21 12:26 ` [PATCH v2 2/3] target/riscv/kvm: add kvm_riscv_reset_regs_csr() Daniel Henrique Barboza
2025-02-21 12:44 ` Andrew Jones
2025-02-21 12:26 ` [PATCH v2 3/3] target/riscv/kvm: add missing KVM CSRs Daniel Henrique Barboza
2025-02-21 12:45 ` Andrew Jones
2025-02-28 11:10 ` [PATCH v2 0/3] target/riscv/kvm: reset time changes Daniel Henrique Barboza
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).