blob: b22244a9f64df85691a50d9fd045227efca3c975 [file] [log] [blame]
// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "garnet/lib/machina/guest_controller_impl.h"
#include "lib/fxl/logging.h"
static constexpr zx_rights_t kVmoRights =
ZX_RIGHT_READ | ZX_RIGHT_MAP | ZX_RIGHTS_BASIC;
template <typename T>
static T duplicate(const T& handle, zx_rights_t rights) {
T handle_out;
zx_status_t status = handle.duplicate(rights, &handle_out);
FXL_CHECK(status == ZX_OK) << "Failed to duplicate handle";
return handle_out;
}
namespace machina {
GuestControllerImpl::GuestControllerImpl(
fuchsia::sys::StartupContext* startup_context, const PhysMem& phys_mem)
: vmo_(duplicate(phys_mem.vmo(), kVmoRights)) {
zx_status_t status = zx::socket::create(0, &server_socket_, &client_socket_);
FXL_CHECK(status == ZX_OK) << "Failed to create socket";
startup_context->outgoing().AddPublicService<fuchsia::guest::GuestController>(
[this](fidl::InterfaceRequest<fuchsia::guest::GuestController> request) {
bindings_.AddBinding(this, std::move(request));
});
}
void GuestControllerImpl::GetPhysicalMemory(
GetPhysicalMemoryCallback callback) {
callback(duplicate(vmo_, ZX_RIGHT_SAME_RIGHTS));
}
void GuestControllerImpl::GetSerial(GetSerialCallback callback) {
callback(duplicate(client_socket_, ZX_RIGHT_SAME_RIGHTS));
}
void GuestControllerImpl::GetViewProvider(
fidl::InterfaceRequest<::fuchsia::ui::views_v1::ViewProvider> request) {
if (view_provider_ != nullptr) {
view_provider_bindings_.AddBinding(view_provider_, std::move(request));
}
}
} // namespace machina