sizeof(kvm_vcpu_stats_desc),
 };
 
-static void kvm_riscv_vcpu_context_reset(struct kvm_vcpu *vcpu)
+static void kvm_riscv_vcpu_context_reset(struct kvm_vcpu *vcpu,
+                                        bool kvm_sbi_reset)
 {
        struct kvm_vcpu_csr *csr = &vcpu->arch.guest_csr;
        struct kvm_cpu_context *cntx = &vcpu->arch.guest_context;
-       struct kvm_vcpu_reset_state *reset_state = &vcpu->arch.reset_state;
        void *vector_datap = cntx->vector.datap;
 
        memset(cntx, 0, sizeof(*cntx));
        /* Restore datap as it's not a part of the guest context. */
        cntx->vector.datap = vector_datap;
 
-       /* Load SBI reset values */
-       cntx->a0 = vcpu->vcpu_id;
-
-       spin_lock(&reset_state->lock);
-       cntx->sepc = reset_state->pc;
-       cntx->a1 = reset_state->a1;
-       spin_unlock(&reset_state->lock);
+       if (kvm_sbi_reset)
+               kvm_riscv_vcpu_sbi_load_reset_state(vcpu);
 
        /* Setup reset state of shadow SSTATUS and HSTATUS CSRs */
        cntx->sstatus = SR_SPP | SR_SPIE;
        cntx->hstatus |= HSTATUS_SPV;
 }
 
-static void kvm_riscv_reset_vcpu(struct kvm_vcpu *vcpu)
+static void kvm_riscv_reset_vcpu(struct kvm_vcpu *vcpu, bool kvm_sbi_reset)
 {
        bool loaded;
 
 
        vcpu->arch.last_exit_cpu = -1;
 
-       kvm_riscv_vcpu_context_reset(vcpu);
+       kvm_riscv_vcpu_context_reset(vcpu, kvm_sbi_reset);
 
        kvm_riscv_vcpu_fp_reset(vcpu);
 
        kvm_riscv_vcpu_sbi_init(vcpu);
 
        /* Reset VCPU */
-       kvm_riscv_reset_vcpu(vcpu);
+       kvm_riscv_reset_vcpu(vcpu, false);
 
        return 0;
 }
        case KVM_MP_STATE_STOPPED:
                __kvm_riscv_vcpu_power_off(vcpu);
                break;
+       case KVM_MP_STATE_INIT_RECEIVED:
+               if (vcpu->kvm->arch.mp_state_reset)
+                       kvm_riscv_reset_vcpu(vcpu, false);
+               else
+                       ret = -EINVAL;
+               break;
        default:
                ret = -EINVAL;
        }
                }
 
                if (kvm_check_request(KVM_REQ_VCPU_RESET, vcpu))
-                       kvm_riscv_reset_vcpu(vcpu);
+                       kvm_riscv_reset_vcpu(vcpu, true);
 
                if (kvm_check_request(KVM_REQ_UPDATE_HGATP, vcpu))
                        kvm_riscv_gstage_update_hgatp(vcpu);
 
        kvm_make_request(KVM_REQ_VCPU_RESET, vcpu);
 }
 
+void kvm_riscv_vcpu_sbi_load_reset_state(struct kvm_vcpu *vcpu)
+{
+       struct kvm_vcpu_csr *csr = &vcpu->arch.guest_csr;
+       struct kvm_cpu_context *cntx = &vcpu->arch.guest_context;
+       struct kvm_vcpu_reset_state *reset_state = &vcpu->arch.reset_state;
+
+       cntx->a0 = vcpu->vcpu_id;
+
+       spin_lock(&vcpu->arch.reset_state.lock);
+       cntx->sepc = reset_state->pc;
+       cntx->a1 = reset_state->a1;
+       spin_unlock(&vcpu->arch.reset_state.lock);
+
+       cntx->sstatus &= ~SR_SIE;
+       csr->vsatp = 0;
+}
+
 int kvm_riscv_vcpu_sbi_return(struct kvm_vcpu *vcpu, struct kvm_run *run)
 {
        struct kvm_cpu_context *cp = &vcpu->arch.guest_context;