738 int idx, r = -ENOENT;
740 mutex_lock(&vcpu->kvm->arch.xen.xen_lock);
741 idx = srcu_read_lock(&vcpu->kvm->srcu);
743 switch (data->type) {
744 case KVM_XEN_VCPU_ATTR_TYPE_VCPU_INFO:
746 BUILD_BUG_ON(
sizeof(
struct vcpu_info) !=
748 BUILD_BUG_ON(offsetof(
struct vcpu_info,
time) !=
751 if (data->u.gpa == KVM_XEN_INVALID_GPA) {
758 data->u.gpa,
sizeof(
struct vcpu_info));
760 kvm_make_request(KVM_REQ_CLOCK_UPDATE, vcpu);
764 case KVM_XEN_VCPU_ATTR_TYPE_VCPU_TIME_INFO:
765 if (data->u.gpa == KVM_XEN_INVALID_GPA) {
773 sizeof(
struct pvclock_vcpu_time_info));
775 kvm_make_request(KVM_REQ_CLOCK_UPDATE, vcpu);
778 case KVM_XEN_VCPU_ATTR_TYPE_RUNSTATE_ADDR: {
781 if (!sched_info_on()) {
785 if (data->u.gpa == KVM_XEN_INVALID_GPA) {
798 if (IS_ENABLED(CONFIG_64BIT) && vcpu->kvm->arch.xen.long_mode)
799 sz =
sizeof(
struct vcpu_runstate_info);
804 sz1 = PAGE_SIZE - (data->u.gpa & ~PAGE_MASK);
815 BUG_ON((data->u.gpa + sz1) & ~PAGE_MASK);
817 data->u.gpa + sz1, sz2);
825 case KVM_XEN_VCPU_ATTR_TYPE_RUNSTATE_CURRENT:
826 if (!sched_info_on()) {
830 if (data->u.runstate.state > RUNSTATE_offline) {
839 case KVM_XEN_VCPU_ATTR_TYPE_RUNSTATE_DATA:
840 if (!sched_info_on()) {
844 if (data->u.runstate.state > RUNSTATE_offline) {
848 if (data->u.runstate.state_entry_time !=
849 (data->u.runstate.time_running +
850 data->u.runstate.time_runnable +
851 data->u.runstate.time_blocked +
852 data->u.runstate.time_offline)) {
857 data->u.runstate.state_entry_time) {
862 vcpu->arch.xen.current_runstate = data->u.runstate.state;
863 vcpu->arch.xen.runstate_entry_time =
864 data->u.runstate.state_entry_time;
865 vcpu->arch.xen.runstate_times[RUNSTATE_running] =
866 data->u.runstate.time_running;
867 vcpu->arch.xen.runstate_times[RUNSTATE_runnable] =
868 data->u.runstate.time_runnable;
869 vcpu->arch.xen.runstate_times[RUNSTATE_blocked] =
870 data->u.runstate.time_blocked;
871 vcpu->arch.xen.runstate_times[RUNSTATE_offline] =
872 data->u.runstate.time_offline;
873 vcpu->arch.xen.last_steal = current->sched_info.run_delay;
877 case KVM_XEN_VCPU_ATTR_TYPE_RUNSTATE_ADJUST:
878 if (!sched_info_on()) {
882 if (data->u.runstate.state > RUNSTATE_offline &&
883 data->u.runstate.state != (u64)-1) {
888 if (data->u.runstate.state_entry_time !=
889 (data->u.runstate.time_running +
890 data->u.runstate.time_runnable +
891 data->u.runstate.time_blocked +
892 data->u.runstate.time_offline)) {
898 (vcpu->arch.xen.runstate_entry_time +
899 data->u.runstate.state_entry_time)) {
904 vcpu->arch.xen.runstate_entry_time +=
905 data->u.runstate.state_entry_time;
906 vcpu->arch.xen.runstate_times[RUNSTATE_running] +=
907 data->u.runstate.time_running;
908 vcpu->arch.xen.runstate_times[RUNSTATE_runnable] +=
909 data->u.runstate.time_runnable;
910 vcpu->arch.xen.runstate_times[RUNSTATE_blocked] +=
911 data->u.runstate.time_blocked;
912 vcpu->arch.xen.runstate_times[RUNSTATE_offline] +=
913 data->u.runstate.time_offline;
915 if (data->u.runstate.state <= RUNSTATE_offline)
917 else if (vcpu->arch.xen.runstate_cache.active)
922 case KVM_XEN_VCPU_ATTR_TYPE_VCPU_ID:
923 if (data->u.vcpu_id >= KVM_MAX_VCPUS)
926 vcpu->arch.xen.vcpu_id = data->u.vcpu_id;
931 case KVM_XEN_VCPU_ATTR_TYPE_TIMER:
932 if (data->u.timer.port &&
933 data->u.timer.priority != KVM_IRQ_ROUTING_XEN_EVTCHN_PRIO_2LEVEL) {
938 if (!vcpu->arch.xen.timer.function)
943 vcpu->arch.xen.timer_virq = data->u.timer.port;
946 if (data->u.timer.port && data->u.timer.expires_ns)
948 data->u.timer.expires_ns -
954 case KVM_XEN_VCPU_ATTR_TYPE_UPCALL_VECTOR:
955 if (data->u.vector && data->u.vector < 0x10)
958 vcpu->arch.xen.upcall_vector = data->u.vector;
967 srcu_read_unlock(&vcpu->kvm->srcu, idx);
968 mutex_unlock(&vcpu->kvm->arch.xen.xen_lock);
void kvm_xen_update_runstate(struct kvm_vcpu *v, int state)
static void kvm_xen_init_timer(struct kvm_vcpu *vcpu)