From dbbd60534d0e747c4d76a96b0655ef25ae507446 Mon Sep 17 00:00:00 2001
From: David Pursell <dpursell@google.com>
Date: Mon, 22 Apr 2019 19:44:51 +0000
Subject: [PATCH] [handle][guest] Create() KernelHandles

ZX-3612

Test: runtests -t hypervisor-test
Change-Id: Id6631e9fde04e6a0756061cc62df4f04159dc1f9
---
 zircon/kernel/object/guest_dispatcher.cpp             | 11 ++++++-----
 .../kernel/object/include/object/guest_dispatcher.h   |  2 +-
 zircon/kernel/syscalls/hypervisor.cpp                 |  6 +++---
 3 files changed, 10 insertions(+), 9 deletions(-)

diff --git a/zircon/kernel/object/guest_dispatcher.cpp b/zircon/kernel/object/guest_dispatcher.cpp
index d1b4d431655..2d78522ffcd 100644
--- a/zircon/kernel/object/guest_dispatcher.cpp
+++ b/zircon/kernel/object/guest_dispatcher.cpp
@@ -16,7 +16,7 @@ KCOUNTER(dispatcher_guest_create_count, "dispatcher.guest.create")
 KCOUNTER(dispatcher_guest_destroy_count, "dispatcher.guest.destroy")
 
 // static
-zx_status_t GuestDispatcher::Create(fbl::RefPtr<Dispatcher>* guest_dispatcher,
+zx_status_t GuestDispatcher::Create(KernelHandle<GuestDispatcher>* guest_handle,
                                     zx_rights_t* guest_rights,
                                     KernelHandle<VmAddressRegionDispatcher>* vmar_handle,
                                     zx_rights_t* vmar_rights) {
@@ -27,19 +27,20 @@ zx_status_t GuestDispatcher::Create(fbl::RefPtr<Dispatcher>* guest_dispatcher,
     }
 
     fbl::AllocChecker ac;
-    auto disp = fbl::AdoptRef(new (&ac) GuestDispatcher(ktl::move(guest)));
+    KernelHandle new_guest_handle(fbl::AdoptRef(new (&ac) GuestDispatcher(ktl::move(guest))));
     if (!ac.check()) {
         return ZX_ERR_NO_MEMORY;
     }
 
-    status = VmAddressRegionDispatcher::Create(disp->guest()->AddressSpace()->RootVmar(), 0,
-                                               vmar_handle, vmar_rights);
+    status = VmAddressRegionDispatcher::Create(
+        new_guest_handle.dispatcher()->guest()->AddressSpace()->RootVmar(), 0, vmar_handle,
+        vmar_rights);
     if (status != ZX_OK) {
         return status;
     }
 
     *guest_rights = default_rights();
-    *guest_dispatcher = ktl::move(disp);
+    *guest_handle = ktl::move(new_guest_handle);
     return ZX_OK;
 }
 
diff --git a/zircon/kernel/object/include/object/guest_dispatcher.h b/zircon/kernel/object/include/object/guest_dispatcher.h
index 1256182aebc..f722e6ed02a 100644
--- a/zircon/kernel/object/include/object/guest_dispatcher.h
+++ b/zircon/kernel/object/include/object/guest_dispatcher.h
@@ -16,7 +16,7 @@ class VmObject;
 
 class GuestDispatcher final : public SoloDispatcher<GuestDispatcher, ZX_DEFAULT_GUEST_RIGHTS> {
 public:
-    static zx_status_t Create(fbl::RefPtr<Dispatcher>* guest_dispatcher,
+    static zx_status_t Create(KernelHandle<GuestDispatcher>* guest_handle,
                               zx_rights_t* guest_rights,
                               KernelHandle<VmAddressRegionDispatcher>* vmar_handle,
                               zx_rights_t* vmar_rights);
diff --git a/zircon/kernel/syscalls/hypervisor.cpp b/zircon/kernel/syscalls/hypervisor.cpp
index 13af7c642c0..4277c75b19a 100644
--- a/zircon/kernel/syscalls/hypervisor.cpp
+++ b/zircon/kernel/syscalls/hypervisor.cpp
@@ -29,15 +29,15 @@ zx_status_t sys_guest_create(zx_handle_t resource, uint32_t options, user_out_ha
     if (status != ZX_OK)
         return status;
 
-    fbl::RefPtr<Dispatcher> guest_dispatcher;
+    KernelHandle<GuestDispatcher> new_guest_handle;
     KernelHandle<VmAddressRegionDispatcher> new_vmar_handle;
     zx_rights_t guest_rights, vmar_rights;
     status =
-        GuestDispatcher::Create(&guest_dispatcher, &guest_rights, &new_vmar_handle, &vmar_rights);
+        GuestDispatcher::Create(&new_guest_handle, &guest_rights, &new_vmar_handle, &vmar_rights);
     if (status != ZX_OK)
         return status;
 
-    status = guest_handle->make(ktl::move(guest_dispatcher), guest_rights);
+    status = guest_handle->make(ktl::move(new_guest_handle), guest_rights);
     if (status != ZX_OK)
         return status;
     return vmar_handle->make(ktl::move(new_vmar_handle), vmar_rights);
-- 
GitLab