Message ID | 20190822102620.21897-5-bharata@linux.ibm.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | KVMPPC driver to manage secure guest pages | expand |
On Thu, Aug 22, 2019 at 03:56:17PM +0530, Bharata B Rao wrote: > + /* > + * TODO: Handle KVM_MR_MOVE > + */ > + if (change == KVM_MR_CREATE) { > + uv_register_mem_slot(kvm->arch.lpid, > + new->base_gfn << PAGE_SHIFT, > + new->npages * PAGE_SIZE, > + 0, new->id); > + } else if (change == KVM_MR_DELETE) > + uv_unregister_mem_slot(kvm->arch.lpid, old->id); > } In preparation for the KVM_MR_MOVE addition just using a switch statement here from the very beginning might make the code a little nicer to read.
diff --git a/arch/powerpc/include/asm/ultravisor-api.h b/arch/powerpc/include/asm/ultravisor-api.h index c578d9b13a56..46b1ee381695 100644 --- a/arch/powerpc/include/asm/ultravisor-api.h +++ b/arch/powerpc/include/asm/ultravisor-api.h @@ -26,6 +26,7 @@ #define UV_WRITE_PATE 0xF104 #define UV_RETURN 0xF11C #define UV_REGISTER_MEM_SLOT 0xF120 +#define UV_UNREGISTER_MEM_SLOT 0xF124 #define UV_PAGE_IN 0xF128 #define UV_PAGE_OUT 0xF12C diff --git a/arch/powerpc/include/asm/ultravisor.h b/arch/powerpc/include/asm/ultravisor.h index 58ccf5e2d6bb..719c0c3930b9 100644 --- a/arch/powerpc/include/asm/ultravisor.h +++ b/arch/powerpc/include/asm/ultravisor.h @@ -52,4 +52,9 @@ static inline int uv_register_mem_slot(u64 lpid, u64 start_gpa, u64 size, size, flags, slotid); } +static inline int uv_unregister_mem_slot(u64 lpid, u64 slotid) +{ + return ucall_norets(UV_UNREGISTER_MEM_SLOT, lpid, slotid); +} + #endif /* _ASM_POWERPC_ULTRAVISOR_H */ diff --git a/arch/powerpc/kvm/book3s_hv.c b/arch/powerpc/kvm/book3s_hv.c index 33b8ebffbef0..57f8b0b1c703 100644 --- a/arch/powerpc/kvm/book3s_hv.c +++ b/arch/powerpc/kvm/book3s_hv.c @@ -74,6 +74,7 @@ #include <asm/hw_breakpoint.h> #include <asm/kvm_host.h> #include <asm/kvm_book3s_devm.h> +#include <asm/ultravisor.h> #include "book3s.h" @@ -4504,6 +4505,22 @@ static void kvmppc_core_commit_memory_region_hv(struct kvm *kvm, if (change == KVM_MR_FLAGS_ONLY && kvm_is_radix(kvm) && ((new->flags ^ old->flags) & KVM_MEM_LOG_DIRTY_PAGES)) kvmppc_radix_flush_memslot(kvm, old); + /* + * If UV hasn't yet called H_SVM_INIT_START, don't register memslots. + */ + if (!kvm->arch.secure_guest) + return; + + /* + * TODO: Handle KVM_MR_MOVE + */ + if (change == KVM_MR_CREATE) { + uv_register_mem_slot(kvm->arch.lpid, + new->base_gfn << PAGE_SHIFT, + new->npages * PAGE_SIZE, + 0, new->id); + } else if (change == KVM_MR_DELETE) + uv_unregister_mem_slot(kvm->arch.lpid, old->id); } /*