@@ -51,12 +51,33 @@ const struct kvm_stats_header kvm_vcpu_stats_header = {
5151 sizeof (kvm_vcpu_stats_desc ),
5252};
5353
54- static void kvm_riscv_reset_vcpu (struct kvm_vcpu * vcpu )
54+ static void kvm_riscv_vcpu_context_reset (struct kvm_vcpu * vcpu ,
55+ bool kvm_sbi_reset )
5556{
5657 struct kvm_vcpu_csr * csr = & vcpu -> arch .guest_csr ;
57- struct kvm_vcpu_csr * reset_csr = & vcpu -> arch .guest_reset_csr ;
5858 struct kvm_cpu_context * cntx = & vcpu -> arch .guest_context ;
59- struct kvm_cpu_context * reset_cntx = & vcpu -> arch .guest_reset_context ;
59+ void * vector_datap = cntx -> vector .datap ;
60+
61+ memset (cntx , 0 , sizeof (* cntx ));
62+ memset (csr , 0 , sizeof (* csr ));
63+ memset (& vcpu -> arch .smstateen_csr , 0 , sizeof (vcpu -> arch .smstateen_csr ));
64+
65+ /* Restore datap as it's not a part of the guest context. */
66+ cntx -> vector .datap = vector_datap ;
67+
68+ if (kvm_sbi_reset )
69+ kvm_riscv_vcpu_sbi_load_reset_state (vcpu );
70+
71+ /* Setup reset state of shadow SSTATUS and HSTATUS CSRs */
72+ cntx -> sstatus = SR_SPP | SR_SPIE ;
73+
74+ cntx -> hstatus |= HSTATUS_VTW ;
75+ cntx -> hstatus |= HSTATUS_SPVP ;
76+ cntx -> hstatus |= HSTATUS_SPV ;
77+ }
78+
79+ static void kvm_riscv_reset_vcpu (struct kvm_vcpu * vcpu , bool kvm_sbi_reset )
80+ {
6081 bool loaded ;
6182
6283 /**
@@ -71,13 +92,7 @@ static void kvm_riscv_reset_vcpu(struct kvm_vcpu *vcpu)
7192
7293 vcpu -> arch .last_exit_cpu = -1 ;
7394
74- memcpy (csr , reset_csr , sizeof (* csr ));
75-
76- spin_lock (& vcpu -> arch .reset_cntx_lock );
77- memcpy (cntx , reset_cntx , sizeof (* cntx ));
78- spin_unlock (& vcpu -> arch .reset_cntx_lock );
79-
80- memset (& vcpu -> arch .smstateen_csr , 0 , sizeof (vcpu -> arch .smstateen_csr ));
95+ kvm_riscv_vcpu_context_reset (vcpu , kvm_sbi_reset );
8196
8297 kvm_riscv_vcpu_fp_reset (vcpu );
8398
@@ -112,8 +127,6 @@ int kvm_arch_vcpu_precreate(struct kvm *kvm, unsigned int id)
112127int kvm_arch_vcpu_create (struct kvm_vcpu * vcpu )
113128{
114129 int rc ;
115- struct kvm_cpu_context * cntx ;
116- struct kvm_vcpu_csr * reset_csr = & vcpu -> arch .guest_reset_csr ;
117130
118131 spin_lock_init (& vcpu -> arch .mp_state_lock );
119132
@@ -133,24 +146,11 @@ int kvm_arch_vcpu_create(struct kvm_vcpu *vcpu)
133146 /* Setup VCPU hfence queue */
134147 spin_lock_init (& vcpu -> arch .hfence_lock );
135148
136- /* Setup reset state of shadow SSTATUS and HSTATUS CSRs */
137- spin_lock_init (& vcpu -> arch .reset_cntx_lock );
149+ spin_lock_init (& vcpu -> arch .reset_state .lock );
138150
139- spin_lock (& vcpu -> arch .reset_cntx_lock );
140- cntx = & vcpu -> arch .guest_reset_context ;
141- cntx -> sstatus = SR_SPP | SR_SPIE ;
142- cntx -> hstatus = 0 ;
143- cntx -> hstatus |= HSTATUS_VTW ;
144- cntx -> hstatus |= HSTATUS_SPVP ;
145- cntx -> hstatus |= HSTATUS_SPV ;
146- spin_unlock (& vcpu -> arch .reset_cntx_lock );
147-
148- if (kvm_riscv_vcpu_alloc_vector_context (vcpu , cntx ))
151+ if (kvm_riscv_vcpu_alloc_vector_context (vcpu ))
149152 return - ENOMEM ;
150153
151- /* By default, make CY, TM, and IR counters accessible in VU mode */
152- reset_csr -> scounteren = 0x7 ;
153-
154154 /* Setup VCPU timer */
155155 kvm_riscv_vcpu_timer_init (vcpu );
156156
@@ -169,7 +169,7 @@ int kvm_arch_vcpu_create(struct kvm_vcpu *vcpu)
169169 kvm_riscv_vcpu_sbi_init (vcpu );
170170
171171 /* Reset VCPU */
172- kvm_riscv_reset_vcpu (vcpu );
172+ kvm_riscv_reset_vcpu (vcpu , false );
173173
174174 return 0 ;
175175}
@@ -518,6 +518,12 @@ int kvm_arch_vcpu_ioctl_set_mpstate(struct kvm_vcpu *vcpu,
518518 case KVM_MP_STATE_STOPPED :
519519 __kvm_riscv_vcpu_power_off (vcpu );
520520 break ;
521+ case KVM_MP_STATE_INIT_RECEIVED :
522+ if (vcpu -> kvm -> arch .mp_state_reset )
523+ kvm_riscv_reset_vcpu (vcpu , false);
524+ else
525+ ret = - EINVAL ;
526+ break ;
521527 default :
522528 ret = - EINVAL ;
523529 }
@@ -706,7 +712,7 @@ static void kvm_riscv_check_vcpu_requests(struct kvm_vcpu *vcpu)
706712 }
707713
708714 if (kvm_check_request (KVM_REQ_VCPU_RESET , vcpu ))
709- kvm_riscv_reset_vcpu (vcpu );
715+ kvm_riscv_reset_vcpu (vcpu , true );
710716
711717 if (kvm_check_request (KVM_REQ_UPDATE_HGATP , vcpu ))
712718 kvm_riscv_gstage_update_hgatp (vcpu );
0 commit comments