Second KVM PPC update for 5.6
* Fix compile warning on 32-bit machines * Fix locking error in secure VM support -----BEGIN PGP SIGNATURE----- Version: GnuPG v2 iQEcBAABCAAGBQJeMiC8AAoJEJ2a6ncsY3GfGg8H/03p+jc/aCKcA75ZeQPlzhmu KWvSBbPATNcQiYOLfIvbB9AMXUPoyIfiblW/On8G6COFypsIhhUTwEfPUjWIBHNX IwCfzoyf0gDRTi7A7gTDD06ZE+stikxJu59agX2Gc8kTIQ8ge340VR8J95Ol8/n2 /hVA8S/ORrdv8/KaCcvvIwc1V7OV6xBuGsTUOUvywzBTGDKd0CAbNzRwtS8LmWcM OCkZX4G5DpFIYdsnjSBaSfwEVPAf3G1DzyQ801emwRnbAGYYgfakd1LwqdLDxptt 6CFHuIENEmmweJKMf9FBLWg+fOMl8wsv9l4mBIYt7coq5XPpi07yJ6yqSaJEToQ= =Hmfo -----END PGP SIGNATURE----- Merge tag 'kvm-ppc-next-5.6-2' of git://git.kernel.org/pub/scm/linux/kernel/git/paulus/powerpc into HEAD Second KVM PPC update for 5.6 * Fix compile warning on 32-bit machines * Fix locking error in secure VM support
This commit is contained in:
commit
1d5920c306
|
@ -948,6 +948,66 @@ Use cases
|
||||||
up its internal state for this virtual machine.
|
up its internal state for this virtual machine.
|
||||||
|
|
||||||
|
|
||||||
|
H_SVM_INIT_ABORT
|
||||||
|
----------------
|
||||||
|
|
||||||
|
Abort the process of securing an SVM.
|
||||||
|
|
||||||
|
Syntax
|
||||||
|
~~~~~~
|
||||||
|
|
||||||
|
.. code-block:: c
|
||||||
|
|
||||||
|
uint64_t hypercall(const uint64_t H_SVM_INIT_ABORT)
|
||||||
|
|
||||||
|
Return values
|
||||||
|
~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
One of the following values:
|
||||||
|
|
||||||
|
* H_PARAMETER on successfully cleaning up the state,
|
||||||
|
Hypervisor will return this value to the
|
||||||
|
**guest**, to indicate that the underlying
|
||||||
|
UV_ESM ultracall failed.
|
||||||
|
|
||||||
|
* H_STATE if called after a VM has gone secure (i.e
|
||||||
|
H_SVM_INIT_DONE hypercall was successful).
|
||||||
|
|
||||||
|
* H_UNSUPPORTED if called from a wrong context (e.g. from a
|
||||||
|
normal VM).
|
||||||
|
|
||||||
|
Description
|
||||||
|
~~~~~~~~~~~
|
||||||
|
|
||||||
|
Abort the process of securing a virtual machine. This call must
|
||||||
|
be made after a prior call to ``H_SVM_INIT_START`` hypercall and
|
||||||
|
before a call to ``H_SVM_INIT_DONE``.
|
||||||
|
|
||||||
|
On entry into this hypercall the non-volatile GPRs and FPRs are
|
||||||
|
expected to contain the values they had at the time the VM issued
|
||||||
|
the UV_ESM ultracall. Further ``SRR0`` is expected to contain the
|
||||||
|
address of the instruction after the ``UV_ESM`` ultracall and ``SRR1``
|
||||||
|
the MSR value with which to return to the VM.
|
||||||
|
|
||||||
|
This hypercall will cleanup any partial state that was established for
|
||||||
|
the VM since the prior ``H_SVM_INIT_START`` hypercall, including paging
|
||||||
|
out pages that were paged-into secure memory, and issue the
|
||||||
|
``UV_SVM_TERMINATE`` ultracall to terminate the VM.
|
||||||
|
|
||||||
|
After the partial state is cleaned up, control returns to the VM
|
||||||
|
(**not Ultravisor**), at the address specified in ``SRR0`` with the
|
||||||
|
MSR values set to the value in ``SRR1``.
|
||||||
|
|
||||||
|
Use cases
|
||||||
|
~~~~~~~~~
|
||||||
|
|
||||||
|
If after a successful call to ``H_SVM_INIT_START``, the Ultravisor
|
||||||
|
encounters an error while securing a virtual machine, either due
|
||||||
|
to lack of resources or because the VM's security information could
|
||||||
|
not be validated, Ultravisor informs the Hypervisor about it.
|
||||||
|
Hypervisor should use this call to clean up any internal state for
|
||||||
|
this virtual machine and return to the VM.
|
||||||
|
|
||||||
H_SVM_PAGE_IN
|
H_SVM_PAGE_IN
|
||||||
-------------
|
-------------
|
||||||
|
|
||||||
|
|
|
@ -350,6 +350,7 @@
|
||||||
#define H_SVM_PAGE_OUT 0xEF04
|
#define H_SVM_PAGE_OUT 0xEF04
|
||||||
#define H_SVM_INIT_START 0xEF08
|
#define H_SVM_INIT_START 0xEF08
|
||||||
#define H_SVM_INIT_DONE 0xEF0C
|
#define H_SVM_INIT_DONE 0xEF0C
|
||||||
|
#define H_SVM_INIT_ABORT 0xEF14
|
||||||
|
|
||||||
/* Values for 2nd argument to H_SET_MODE */
|
/* Values for 2nd argument to H_SET_MODE */
|
||||||
#define H_SET_MODE_RESOURCE_SET_CIABR 1
|
#define H_SET_MODE_RESOURCE_SET_CIABR 1
|
||||||
|
|
|
@ -19,8 +19,9 @@ unsigned long kvmppc_h_svm_page_out(struct kvm *kvm,
|
||||||
unsigned long kvmppc_h_svm_init_start(struct kvm *kvm);
|
unsigned long kvmppc_h_svm_init_start(struct kvm *kvm);
|
||||||
unsigned long kvmppc_h_svm_init_done(struct kvm *kvm);
|
unsigned long kvmppc_h_svm_init_done(struct kvm *kvm);
|
||||||
int kvmppc_send_page_to_uv(struct kvm *kvm, unsigned long gfn);
|
int kvmppc_send_page_to_uv(struct kvm *kvm, unsigned long gfn);
|
||||||
|
unsigned long kvmppc_h_svm_init_abort(struct kvm *kvm);
|
||||||
void kvmppc_uvmem_drop_pages(const struct kvm_memory_slot *free,
|
void kvmppc_uvmem_drop_pages(const struct kvm_memory_slot *free,
|
||||||
struct kvm *kvm);
|
struct kvm *kvm, bool skip_page_out);
|
||||||
#else
|
#else
|
||||||
static inline int kvmppc_uvmem_init(void)
|
static inline int kvmppc_uvmem_init(void)
|
||||||
{
|
{
|
||||||
|
@ -62,6 +63,11 @@ static inline unsigned long kvmppc_h_svm_init_done(struct kvm *kvm)
|
||||||
return H_UNSUPPORTED;
|
return H_UNSUPPORTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline unsigned long kvmppc_h_svm_init_abort(struct kvm *kvm)
|
||||||
|
{
|
||||||
|
return H_UNSUPPORTED;
|
||||||
|
}
|
||||||
|
|
||||||
static inline int kvmppc_send_page_to_uv(struct kvm *kvm, unsigned long gfn)
|
static inline int kvmppc_send_page_to_uv(struct kvm *kvm, unsigned long gfn)
|
||||||
{
|
{
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
|
@ -69,6 +75,6 @@ static inline int kvmppc_send_page_to_uv(struct kvm *kvm, unsigned long gfn)
|
||||||
|
|
||||||
static inline void
|
static inline void
|
||||||
kvmppc_uvmem_drop_pages(const struct kvm_memory_slot *free,
|
kvmppc_uvmem_drop_pages(const struct kvm_memory_slot *free,
|
||||||
struct kvm *kvm) { }
|
struct kvm *kvm, bool skip_page_out) { }
|
||||||
#endif /* CONFIG_PPC_UV */
|
#endif /* CONFIG_PPC_UV */
|
||||||
#endif /* __ASM_KVM_BOOK3S_UVMEM_H__ */
|
#endif /* __ASM_KVM_BOOK3S_UVMEM_H__ */
|
||||||
|
|
|
@ -278,6 +278,7 @@ struct kvm_resize_hpt;
|
||||||
/* Flag values for kvm_arch.secure_guest */
|
/* Flag values for kvm_arch.secure_guest */
|
||||||
#define KVMPPC_SECURE_INIT_START 0x1 /* H_SVM_INIT_START has been called */
|
#define KVMPPC_SECURE_INIT_START 0x1 /* H_SVM_INIT_START has been called */
|
||||||
#define KVMPPC_SECURE_INIT_DONE 0x2 /* H_SVM_INIT_DONE completed */
|
#define KVMPPC_SECURE_INIT_DONE 0x2 /* H_SVM_INIT_DONE completed */
|
||||||
|
#define KVMPPC_SECURE_INIT_ABORT 0x4 /* H_SVM_INIT_ABORT issued */
|
||||||
|
|
||||||
struct kvm_arch {
|
struct kvm_arch {
|
||||||
unsigned int lpid;
|
unsigned int lpid;
|
||||||
|
|
|
@ -284,7 +284,7 @@ static long kvmppc_virtmode_do_h_enter(struct kvm *kvm, unsigned long flags,
|
||||||
/* Protect linux PTE lookup from page table destruction */
|
/* Protect linux PTE lookup from page table destruction */
|
||||||
rcu_read_lock_sched(); /* this disables preemption too */
|
rcu_read_lock_sched(); /* this disables preemption too */
|
||||||
ret = kvmppc_do_h_enter(kvm, flags, pte_index, pteh, ptel,
|
ret = kvmppc_do_h_enter(kvm, flags, pte_index, pteh, ptel,
|
||||||
current->mm->pgd, false, pte_idx_ret);
|
kvm->mm->pgd, false, pte_idx_ret);
|
||||||
rcu_read_unlock_sched();
|
rcu_read_unlock_sched();
|
||||||
if (ret == H_TOO_HARD) {
|
if (ret == H_TOO_HARD) {
|
||||||
/* this can't happen */
|
/* this can't happen */
|
||||||
|
@ -573,7 +573,7 @@ int kvmppc_book3s_hv_page_fault(struct kvm_run *run, struct kvm_vcpu *vcpu,
|
||||||
is_ci = false;
|
is_ci = false;
|
||||||
pfn = 0;
|
pfn = 0;
|
||||||
page = NULL;
|
page = NULL;
|
||||||
mm = current->mm;
|
mm = kvm->mm;
|
||||||
pte_size = PAGE_SIZE;
|
pte_size = PAGE_SIZE;
|
||||||
writing = (dsisr & DSISR_ISSTORE) != 0;
|
writing = (dsisr & DSISR_ISSTORE) != 0;
|
||||||
/* If writing != 0, then the HPTE must allow writing, if we get here */
|
/* If writing != 0, then the HPTE must allow writing, if we get here */
|
||||||
|
|
|
@ -1102,7 +1102,7 @@ void kvmppc_radix_flush_memslot(struct kvm *kvm,
|
||||||
unsigned int shift;
|
unsigned int shift;
|
||||||
|
|
||||||
if (kvm->arch.secure_guest & KVMPPC_SECURE_INIT_START)
|
if (kvm->arch.secure_guest & KVMPPC_SECURE_INIT_START)
|
||||||
kvmppc_uvmem_drop_pages(memslot, kvm);
|
kvmppc_uvmem_drop_pages(memslot, kvm, true);
|
||||||
|
|
||||||
if (kvm->arch.secure_guest & KVMPPC_SECURE_INIT_DONE)
|
if (kvm->arch.secure_guest & KVMPPC_SECURE_INIT_DONE)
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -253,10 +253,11 @@ static int kvm_spapr_tce_release(struct inode *inode, struct file *filp)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
account_locked_vm(kvm->mm,
|
||||||
|
kvmppc_stt_pages(kvmppc_tce_pages(stt->size)), false);
|
||||||
|
|
||||||
kvm_put_kvm(stt->kvm);
|
kvm_put_kvm(stt->kvm);
|
||||||
|
|
||||||
account_locked_vm(current->mm,
|
|
||||||
kvmppc_stt_pages(kvmppc_tce_pages(stt->size)), false);
|
|
||||||
call_rcu(&stt->rcu, release_spapr_tce_table);
|
call_rcu(&stt->rcu, release_spapr_tce_table);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -272,6 +273,7 @@ long kvm_vm_ioctl_create_spapr_tce(struct kvm *kvm,
|
||||||
{
|
{
|
||||||
struct kvmppc_spapr_tce_table *stt = NULL;
|
struct kvmppc_spapr_tce_table *stt = NULL;
|
||||||
struct kvmppc_spapr_tce_table *siter;
|
struct kvmppc_spapr_tce_table *siter;
|
||||||
|
struct mm_struct *mm = kvm->mm;
|
||||||
unsigned long npages, size = args->size;
|
unsigned long npages, size = args->size;
|
||||||
int ret = -ENOMEM;
|
int ret = -ENOMEM;
|
||||||
|
|
||||||
|
@ -280,7 +282,7 @@ long kvm_vm_ioctl_create_spapr_tce(struct kvm *kvm,
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
npages = kvmppc_tce_pages(size);
|
npages = kvmppc_tce_pages(size);
|
||||||
ret = account_locked_vm(current->mm, kvmppc_stt_pages(npages), true);
|
ret = account_locked_vm(mm, kvmppc_stt_pages(npages), true);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
|
@ -326,7 +328,7 @@ long kvm_vm_ioctl_create_spapr_tce(struct kvm *kvm,
|
||||||
|
|
||||||
kfree(stt);
|
kfree(stt);
|
||||||
fail_acct:
|
fail_acct:
|
||||||
account_locked_vm(current->mm, kvmppc_stt_pages(npages), false);
|
account_locked_vm(mm, kvmppc_stt_pages(npages), false);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1091,6 +1091,9 @@ int kvmppc_pseries_do_hcall(struct kvm_vcpu *vcpu)
|
||||||
case H_SVM_INIT_DONE:
|
case H_SVM_INIT_DONE:
|
||||||
ret = kvmppc_h_svm_init_done(vcpu->kvm);
|
ret = kvmppc_h_svm_init_done(vcpu->kvm);
|
||||||
break;
|
break;
|
||||||
|
case H_SVM_INIT_ABORT:
|
||||||
|
ret = kvmppc_h_svm_init_abort(vcpu->kvm);
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return RESUME_HOST;
|
return RESUME_HOST;
|
||||||
|
@ -4272,7 +4275,7 @@ static int kvmppc_vcpu_run_hv(struct kvm_run *run, struct kvm_vcpu *vcpu)
|
||||||
user_vrsave = mfspr(SPRN_VRSAVE);
|
user_vrsave = mfspr(SPRN_VRSAVE);
|
||||||
|
|
||||||
vcpu->arch.wqp = &vcpu->arch.vcore->wq;
|
vcpu->arch.wqp = &vcpu->arch.vcore->wq;
|
||||||
vcpu->arch.pgdir = current->mm->pgd;
|
vcpu->arch.pgdir = kvm->mm->pgd;
|
||||||
vcpu->arch.state = KVMPPC_VCPU_BUSY_IN_HOST;
|
vcpu->arch.state = KVMPPC_VCPU_BUSY_IN_HOST;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
|
@ -4627,14 +4630,14 @@ static int kvmppc_hv_setup_htab_rma(struct kvm_vcpu *vcpu)
|
||||||
|
|
||||||
/* Look up the VMA for the start of this memory slot */
|
/* Look up the VMA for the start of this memory slot */
|
||||||
hva = memslot->userspace_addr;
|
hva = memslot->userspace_addr;
|
||||||
down_read(¤t->mm->mmap_sem);
|
down_read(&kvm->mm->mmap_sem);
|
||||||
vma = find_vma(current->mm, hva);
|
vma = find_vma(kvm->mm, hva);
|
||||||
if (!vma || vma->vm_start > hva || (vma->vm_flags & VM_IO))
|
if (!vma || vma->vm_start > hva || (vma->vm_flags & VM_IO))
|
||||||
goto up_out;
|
goto up_out;
|
||||||
|
|
||||||
psize = vma_kernel_pagesize(vma);
|
psize = vma_kernel_pagesize(vma);
|
||||||
|
|
||||||
up_read(¤t->mm->mmap_sem);
|
up_read(&kvm->mm->mmap_sem);
|
||||||
|
|
||||||
/* We can handle 4k, 64k or 16M pages in the VRMA */
|
/* We can handle 4k, 64k or 16M pages in the VRMA */
|
||||||
if (psize >= 0x1000000)
|
if (psize >= 0x1000000)
|
||||||
|
@ -4667,7 +4670,7 @@ static int kvmppc_hv_setup_htab_rma(struct kvm_vcpu *vcpu)
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
up_out:
|
up_out:
|
||||||
up_read(¤t->mm->mmap_sem);
|
up_read(&kvm->mm->mmap_sem);
|
||||||
goto out_srcu;
|
goto out_srcu;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5464,7 +5467,7 @@ static int kvmhv_svm_off(struct kvm *kvm)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
kvm_for_each_memslot(memslot, slots) {
|
kvm_for_each_memslot(memslot, slots) {
|
||||||
kvmppc_uvmem_drop_pages(memslot, kvm);
|
kvmppc_uvmem_drop_pages(memslot, kvm, true);
|
||||||
uv_unregister_mem_slot(kvm->arch.lpid, memslot->id);
|
uv_unregister_mem_slot(kvm->arch.lpid, memslot->id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -258,7 +258,7 @@ unsigned long kvmppc_h_svm_init_done(struct kvm *kvm)
|
||||||
* QEMU page table with normal PTEs from newly allocated pages.
|
* QEMU page table with normal PTEs from newly allocated pages.
|
||||||
*/
|
*/
|
||||||
void kvmppc_uvmem_drop_pages(const struct kvm_memory_slot *free,
|
void kvmppc_uvmem_drop_pages(const struct kvm_memory_slot *free,
|
||||||
struct kvm *kvm)
|
struct kvm *kvm, bool skip_page_out)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
struct kvmppc_uvmem_page_pvt *pvt;
|
struct kvmppc_uvmem_page_pvt *pvt;
|
||||||
|
@ -276,7 +276,7 @@ void kvmppc_uvmem_drop_pages(const struct kvm_memory_slot *free,
|
||||||
|
|
||||||
uvmem_page = pfn_to_page(uvmem_pfn);
|
uvmem_page = pfn_to_page(uvmem_pfn);
|
||||||
pvt = uvmem_page->zone_device_data;
|
pvt = uvmem_page->zone_device_data;
|
||||||
pvt->skip_page_out = true;
|
pvt->skip_page_out = skip_page_out;
|
||||||
mutex_unlock(&kvm->arch.uvmem_lock);
|
mutex_unlock(&kvm->arch.uvmem_lock);
|
||||||
|
|
||||||
pfn = gfn_to_pfn(kvm, gfn);
|
pfn = gfn_to_pfn(kvm, gfn);
|
||||||
|
@ -286,6 +286,34 @@ void kvmppc_uvmem_drop_pages(const struct kvm_memory_slot *free,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unsigned long kvmppc_h_svm_init_abort(struct kvm *kvm)
|
||||||
|
{
|
||||||
|
int srcu_idx;
|
||||||
|
struct kvm_memory_slot *memslot;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Expect to be called only after INIT_START and before INIT_DONE.
|
||||||
|
* If INIT_DONE was completed, use normal VM termination sequence.
|
||||||
|
*/
|
||||||
|
if (!(kvm->arch.secure_guest & KVMPPC_SECURE_INIT_START))
|
||||||
|
return H_UNSUPPORTED;
|
||||||
|
|
||||||
|
if (kvm->arch.secure_guest & KVMPPC_SECURE_INIT_DONE)
|
||||||
|
return H_STATE;
|
||||||
|
|
||||||
|
srcu_idx = srcu_read_lock(&kvm->srcu);
|
||||||
|
|
||||||
|
kvm_for_each_memslot(memslot, kvm_memslots(kvm))
|
||||||
|
kvmppc_uvmem_drop_pages(memslot, kvm, false);
|
||||||
|
|
||||||
|
srcu_read_unlock(&kvm->srcu, srcu_idx);
|
||||||
|
|
||||||
|
kvm->arch.secure_guest = 0;
|
||||||
|
uv_svm_terminate(kvm->arch.lpid);
|
||||||
|
|
||||||
|
return H_PARAMETER;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Get a free device PFN from the pool
|
* Get a free device PFN from the pool
|
||||||
*
|
*
|
||||||
|
@ -543,7 +571,7 @@ kvmppc_svm_page_out(struct vm_area_struct *vma, unsigned long start,
|
||||||
|
|
||||||
ret = migrate_vma_setup(&mig);
|
ret = migrate_vma_setup(&mig);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
goto out;
|
||||||
|
|
||||||
spage = migrate_pfn_to_page(*mig.src);
|
spage = migrate_pfn_to_page(*mig.src);
|
||||||
if (!spage || !(*mig.src & MIGRATE_PFN_MIGRATE))
|
if (!spage || !(*mig.src & MIGRATE_PFN_MIGRATE))
|
||||||
|
|
|
@ -2017,6 +2017,7 @@ static int kvm_vm_ioctl_get_smmu_info_pr(struct kvm *kvm,
|
||||||
{
|
{
|
||||||
/* We should not get called */
|
/* We should not get called */
|
||||||
BUG();
|
BUG();
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
#endif /* CONFIG_PPC64 */
|
#endif /* CONFIG_PPC64 */
|
||||||
|
|
||||||
|
|
|
@ -775,7 +775,7 @@ int kvmppc_vcpu_run(struct kvm_run *kvm_run, struct kvm_vcpu *vcpu)
|
||||||
debug = current->thread.debug;
|
debug = current->thread.debug;
|
||||||
current->thread.debug = vcpu->arch.dbg_reg;
|
current->thread.debug = vcpu->arch.dbg_reg;
|
||||||
|
|
||||||
vcpu->arch.pgdir = current->mm->pgd;
|
vcpu->arch.pgdir = vcpu->kvm->mm->pgd;
|
||||||
kvmppc_fix_ee_before_entry();
|
kvmppc_fix_ee_before_entry();
|
||||||
|
|
||||||
ret = __kvmppc_vcpu_run(kvm_run, vcpu);
|
ret = __kvmppc_vcpu_run(kvm_run, vcpu);
|
||||||
|
|
|
@ -73,7 +73,6 @@ int kvmppc_emulate_loadstore(struct kvm_vcpu *vcpu)
|
||||||
{
|
{
|
||||||
struct kvm_run *run = vcpu->run;
|
struct kvm_run *run = vcpu->run;
|
||||||
u32 inst;
|
u32 inst;
|
||||||
int ra, rs, rt;
|
|
||||||
enum emulation_result emulated = EMULATE_FAIL;
|
enum emulation_result emulated = EMULATE_FAIL;
|
||||||
int advance = 1;
|
int advance = 1;
|
||||||
struct instruction_op op;
|
struct instruction_op op;
|
||||||
|
@ -85,10 +84,6 @@ int kvmppc_emulate_loadstore(struct kvm_vcpu *vcpu)
|
||||||
if (emulated != EMULATE_DONE)
|
if (emulated != EMULATE_DONE)
|
||||||
return emulated;
|
return emulated;
|
||||||
|
|
||||||
ra = get_ra(inst);
|
|
||||||
rs = get_rs(inst);
|
|
||||||
rt = get_rt(inst);
|
|
||||||
|
|
||||||
vcpu->arch.mmio_vsx_copy_nums = 0;
|
vcpu->arch.mmio_vsx_copy_nums = 0;
|
||||||
vcpu->arch.mmio_vsx_offset = 0;
|
vcpu->arch.mmio_vsx_offset = 0;
|
||||||
vcpu->arch.mmio_copy_type = KVMPPC_VSX_COPY_NONE;
|
vcpu->arch.mmio_copy_type = KVMPPC_VSX_COPY_NONE;
|
||||||
|
|
Loading…
Reference in New Issue