For KVM mode, the privilege mode should not include M-mode, and the initial 
value should be set to S-mode. Additionally,patch 2 adds the implementation of 
putting the vCPU privilege mode to KVM. When the vCPU runs for the first time, 
QEMU will first put the privilege state to KVM.If the initial value is set to 
M-mode, KVM will encounter an error.

In addition, this patch introduces the 'mp_state' field to RISC-V 
vCPUs,following the convention used by KVM on x86. The 'mp_state' reflects the 
multiprocessor state of a vCPU, and is used to control whether the vCPU is 
runnable by KVM.
- The bootstrap processor (cpu_index == 0) is initialized with 
KVM_MP_STATE_RUNNABLE.
- All other vCPUs are initialized with KVM_MP_STATE_STOPPED.

Signed-off-by: Xie Bo <[email protected]>
---
 target/riscv/cpu.c | 11 ++++++++++-
 target/riscv/cpu.h |  2 ++
 2 files changed, 12 insertions(+), 1 deletion(-)

diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
index 09ded6829a..5fa48c1485 100644
--- a/target/riscv/cpu.c
+++ b/target/riscv/cpu.c
@@ -1042,7 +1042,16 @@ static void riscv_cpu_reset_hold(Object *obj, ResetType 
type)
     }
 #ifndef CONFIG_USER_ONLY
     env->misa_mxl = mcc->misa_mxl_max;
-    env->priv = PRV_M;
+    if (kvm_enabled()) {
+        env->priv = PRV_S;
+    } else {
+        env->priv = PRV_M;
+    }
+    if (cs->cpu_index == 0) {
+        env->mp_state = KVM_MP_STATE_RUNNABLE;
+    } else {
+        env->mp_state = KVM_MP_STATE_STOPPED;
+    }
     env->mstatus &= ~(MSTATUS_MIE | MSTATUS_MPRV);
     if (env->misa_mxl > MXL_RV32) {
         /*
diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h
index 51e49e03de..4b1c5bf0e4 100644
--- a/target/riscv/cpu.h
+++ b/target/riscv/cpu.h
@@ -256,6 +256,8 @@ struct CPUArchState {
 #endif
 
     target_ulong priv;
+    /* Current multiprocessor state of this vCPU. */
+    uint32_t mp_state;
     /* CSRs for execution environment configuration */
     uint64_t menvcfg;
     target_ulong senvcfg;
-- 
2.43.0


Reply via email to