diff options
-rw-r--r-- | arch/ia64/kvm/kvm-ia64.c | 37 |
1 files changed, 35 insertions, 2 deletions
diff --git a/arch/ia64/kvm/kvm-ia64.c b/arch/ia64/kvm/kvm-ia64.c index cd0d1a7284b7..7ad759e34295 100644 --- a/arch/ia64/kvm/kvm-ia64.c +++ b/arch/ia64/kvm/kvm-ia64.c | |||
@@ -179,6 +179,7 @@ int kvm_dev_ioctl_check_extension(long ext) | |||
179 | switch (ext) { | 179 | switch (ext) { |
180 | case KVM_CAP_IRQCHIP: | 180 | case KVM_CAP_IRQCHIP: |
181 | case KVM_CAP_USER_MEMORY: | 181 | case KVM_CAP_USER_MEMORY: |
182 | case KVM_CAP_MP_STATE: | ||
182 | 183 | ||
183 | r = 1; | 184 | r = 1; |
184 | break; | 185 | break; |
@@ -1789,11 +1790,43 @@ int kvm_arch_vcpu_runnable(struct kvm_vcpu *vcpu) | |||
1789 | int kvm_arch_vcpu_ioctl_get_mpstate(struct kvm_vcpu *vcpu, | 1790 | int kvm_arch_vcpu_ioctl_get_mpstate(struct kvm_vcpu *vcpu, |
1790 | struct kvm_mp_state *mp_state) | 1791 | struct kvm_mp_state *mp_state) |
1791 | { | 1792 | { |
1792 | return -EINVAL; | 1793 | vcpu_load(vcpu); |
1794 | mp_state->mp_state = vcpu->arch.mp_state; | ||
1795 | vcpu_put(vcpu); | ||
1796 | return 0; | ||
1797 | } | ||
1798 | |||
1799 | static int vcpu_reset(struct kvm_vcpu *vcpu) | ||
1800 | { | ||
1801 | int r; | ||
1802 | long psr; | ||
1803 | local_irq_save(psr); | ||
1804 | r = kvm_insert_vmm_mapping(vcpu); | ||
1805 | if (r) | ||
1806 | goto fail; | ||
1807 | |||
1808 | vcpu->arch.launched = 0; | ||
1809 | kvm_arch_vcpu_uninit(vcpu); | ||
1810 | r = kvm_arch_vcpu_init(vcpu); | ||
1811 | if (r) | ||
1812 | goto fail; | ||
1813 | |||
1814 | kvm_purge_vmm_mapping(vcpu); | ||
1815 | r = 0; | ||
1816 | fail: | ||
1817 | local_irq_restore(psr); | ||
1818 | return r; | ||
1793 | } | 1819 | } |
1794 | 1820 | ||
1795 | int kvm_arch_vcpu_ioctl_set_mpstate(struct kvm_vcpu *vcpu, | 1821 | int kvm_arch_vcpu_ioctl_set_mpstate(struct kvm_vcpu *vcpu, |
1796 | struct kvm_mp_state *mp_state) | 1822 | struct kvm_mp_state *mp_state) |
1797 | { | 1823 | { |
1798 | return -EINVAL; | 1824 | int r = 0; |
1825 | |||
1826 | vcpu_load(vcpu); | ||
1827 | vcpu->arch.mp_state = mp_state->mp_state; | ||
1828 | if (vcpu->arch.mp_state == KVM_MP_STATE_UNINITIALIZED) | ||
1829 | r = vcpu_reset(vcpu); | ||
1830 | vcpu_put(vcpu); | ||
1831 | return r; | ||
1799 | } | 1832 | } |