summaryrefslogtreecommitdiff
path: root/guest/vsoc/lib/region_control.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'guest/vsoc/lib/region_control.cpp')
-rw-r--r--guest/vsoc/lib/region_control.cpp168
1 files changed, 0 insertions, 168 deletions
diff --git a/guest/vsoc/lib/region_control.cpp b/guest/vsoc/lib/region_control.cpp
deleted file mode 100644
index 1fcbd138..00000000
--- a/guest/vsoc/lib/region_control.cpp
+++ /dev/null
@@ -1,168 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#include "common/vsoc/lib/region_view.h"
-
-#include <errno.h>
-#include <fcntl.h>
-#include <string.h>
-#include <sys/ioctl.h>
-#include <sys/stat.h>
-#include <sys/types.h>
-#include <unistd.h>
-
-#include <string>
-#include <thread>
-
-#include <android-base/logging.h>
-#include <uapi/vsoc_shm.h>
-
-using cvd::SharedFD;
-
-namespace {
-class GuestRegionControl : public vsoc::RegionControl {
- public:
- explicit GuestRegionControl(const SharedFD& region_fd,
- const vsoc_device_region& desc)
- : region_fd_{region_fd} {
- region_desc_ = desc;
- }
- virtual bool InterruptPeer() override;
- virtual void InterruptSelf() override;
- virtual void WaitForInterrupt() override;
- virtual void* Map() override;
- virtual int SignalSelf(uint32_t offset) override;
- virtual int WaitForSignal(uint32_t offset, uint32_t expected_value) override;
-
- protected:
- int CreateFdScopedPermission(const char* managed_region_name,
- uint32_t owner_offset, uint32_t owned_val,
- uint32_t begin_offset,
- uint32_t end_offset) override;
- cvd::SharedFD region_fd_;
-};
-
-std::string device_path_from_name(const char* region_name) {
- return std::string("/dev/") + region_name;
-}
-
-bool GuestRegionControl::InterruptPeer() {
- int rval = region_fd_->Ioctl(VSOC_SEND_INTERRUPT_TO_HOST, 0);
- if ((rval == -1) && (errno != EBUSY)) {
- LOG(INFO) << __FUNCTION__ << ": ioctl failed (" << strerror(errno) << ")";
- }
- return !rval;
-}
-
-void GuestRegionControl::InterruptSelf() {
- region_fd_->Ioctl(VSOC_SELF_INTERRUPT, 0);
-}
-
-void GuestRegionControl::WaitForInterrupt() {
- region_fd_->Ioctl(VSOC_WAIT_FOR_INCOMING_INTERRUPT, 0);
-}
-
-int GuestRegionControl::SignalSelf(uint32_t offset) {
- return region_fd_->Ioctl(VSOC_COND_WAKE, reinterpret_cast<void*>(offset));
-}
-
-int GuestRegionControl::WaitForSignal(uint32_t offset,
- uint32_t expected_value) {
- struct vsoc_cond_wait wait;
- wait.offset = offset;
- wait.value = expected_value;
- wait.wake_time_sec = 0;
- wait.wake_time_nsec = 0;
- wait.wait_type = VSOC_WAIT_IF_EQUAL;
- wait.wakes = 1000;
- wait.reserved_1 = 0;
- int rval = region_fd_->Ioctl(VSOC_COND_WAIT, &wait);
- if (rval == -1) {
- return rval;
- }
- // Clamp the number of wakes if it overflows an integer.
- rval = wait.wakes;
- if (rval >= 0) {
- return rval;
- }
- return INT_MAX;
-}
-
-int GuestRegionControl::CreateFdScopedPermission(
- const char* managed_region_name, uint32_t owner_offset,
- uint32_t owned_value, uint32_t begin_offset,
- uint32_t end_offset) {
- if (!region_fd_->IsOpen()) {
- LOG(FATAL) << "Can't create permission before opening controller region";
- return -EINVAL;
- }
- int managed_region_fd =
- open(device_path_from_name(managed_region_name).c_str(), O_RDWR);
- if (managed_region_fd < 0) {
- int errno_ = errno;
- LOG(FATAL) << "Can't open managed region: " << managed_region_name;
- return -errno_;
- }
-
- fd_scoped_permission_arg perm;
- perm.perm.begin_offset = begin_offset;
- perm.perm.end_offset = end_offset;
- perm.perm.owned_value = owned_value;
- perm.perm.owner_offset = owner_offset;
- perm.managed_region_fd = managed_region_fd;
- LOG(INFO) << "owner offset: " << perm.perm.owner_offset;
- int retval = region_fd_->Ioctl(VSOC_CREATE_FD_SCOPED_PERMISSION, &perm);
- if (retval) {
- int errno_ = errno;
- close(managed_region_fd);
- if (errno_ != EBUSY) {
- LOG(FATAL) << "Unable to create fd scoped permission ("
- << strerror(errno_) << ")";
- }
- return -errno_;
- }
- return managed_region_fd;
-}
-
-void* GuestRegionControl::Map() {
- region_base_ =
- region_fd_->Mmap(0, region_size(), PROT_READ | PROT_WRITE, MAP_SHARED, 0);
- if (region_base_ == MAP_FAILED) {
- LOG(FATAL) << "mmap failed (" << region_fd_->StrError() << ")";
- region_base_ = nullptr;
- }
- return region_base_;
-}
-} // namespace
-
-// domain is here to ensure that this method has the same signature as the
-// method on host regions.
-std::shared_ptr<vsoc::RegionControl> vsoc::RegionControl::Open(
- const char* region_name) {
- std::string path = device_path_from_name(region_name);
- SharedFD fd = SharedFD::Open(path.c_str(), O_RDWR);
- if (!fd->IsOpen()) {
- LOG(FATAL) << "Unable to open region " << region_name << " ("
- << fd->StrError() << ")";
- return nullptr;
- }
- vsoc_device_region desc;
- if (fd->Ioctl(VSOC_DESCRIBE_REGION, &desc)) {
- LOG(FATAL) << "Unable to obtain region descriptor (" << fd->StrError()
- << ")";
- return nullptr;
- }
- return std::shared_ptr<vsoc::RegionControl>(new GuestRegionControl(fd, desc));
-}