Merge changes from topics "2019-11-12-schuffelen-ivserver", "2019-11-12-schuffelen-record-audio", "2019-11-12-schuffelen-vsoc-lib", "2019-11-13-schuffelen-socket-forward"
* changes:
Delete vsoc support libraries and tests
Remove header dependencies on vsoc_lib
Break build dependencies on vsoc_lib
Delete the stream_audio host binary
Remove references to stream_audio.
Delete the record_audio host binary
Delete the legacy audio hal
Delete vsoc, vsoc-future hwcomposers
Delete guest/hals/gralloc but not /legacy
Delete ivserver
Remove {assemble,launch,run}_cvd ivserver references
Delete socket_forward_proxy
Delete references to socket_forward_proxy
diff --git a/Android.bp b/Android.bp
index a9ee724..9fed081 100644
--- a/Android.bp
+++ b/Android.bp
@@ -110,132 +110,3 @@
host_supported: true,
defaults: ["cuttlefish_base"],
}
-
-cc_library_shared {
- name: "vsoc_lib",
- srcs: [
- "common/vsoc/lib/compat.cpp",
- "common/vsoc/lib/audio_data_layout.cpp",
- "common/vsoc/lib/e2e_test_region_layout.cpp",
- "common/vsoc/lib/gralloc_layout.cpp",
- "common/vsoc/lib/input_events_layout.cpp",
- "common/vsoc/lib/input_events_region_view.cpp",
- "common/vsoc/lib/lock_common.cpp",
- "common/vsoc/lib/managed_e2e_test_region_layout.cpp",
- "common/vsoc/lib/region_view.cpp",
- "common/vsoc/lib/screen_layout.cpp",
- "common/vsoc/lib/screen_region_view.cpp",
- "common/vsoc/lib/socket_forward_layout.cpp",
- "common/vsoc/lib/socket_forward_region_view.cpp",
- "common/vsoc/lib/vsoc_memory.cpp",
- ],
- header_libs: ["cuttlefish_glog"],
- shared_libs: [
- "libcuttlefish_fs",
- "cuttlefish_auto_resources",
- "libbase",
- "liblog",
- ],
- target: {
- host: {
- srcs: [
- "host/vsoc/lib/gralloc_buffer_region_view.cpp",
- "host/vsoc/lib/host_lock.cpp",
- "host/vsoc/lib/region_control.cpp",
- "host/vsoc/lib/region_view.cpp",
- ],
- },
- android: {
- srcs: [
- "guest/vsoc/lib/gralloc_region_view.cpp",
- "guest/vsoc/lib/guest_lock.cpp",
- "guest/vsoc/lib/region_control.cpp",
- "guest/vsoc/lib/region_view.cpp",
- ],
- },
- },
- defaults: ["cuttlefish_host_and_guest"],
-}
-
-cc_test_host {
- name: "circqueue_test",
- srcs: [
- "common/vsoc/lib/circqueue_test.cpp",
- ],
- shared_libs: [
- "vsoc_lib",
- "libbase",
- ],
- defaults: ["cuttlefish_host_only"],
- test_suites: ["general-tests"],
-}
-
-cc_binary_host {
- name: "vsoc_screen_region_view_test",
- srcs: [
- "common/vsoc/lib/screen_region_view_test.cpp",
- ],
- static_libs: [
- "libcuttlefish_host_config",
- "libjsoncpp",
- "libgflags",
- ],
- shared_libs: [
- "vsoc_lib",
- "libbase",
- "libcuttlefish_utils",
- ],
- defaults: ["cuttlefish_host_only"],
-}
-
-cc_test_host {
- name: "lock_test",
- srcs: [
- "common/vsoc/lib/lock_test.cpp",
- ],
- shared_libs: [
- "vsoc_lib",
- "libcuttlefish_fs",
- "cuttlefish_auto_resources",
- "libbase",
- ],
- static_libs: [
- "libgtest_host",
- ],
- defaults: ["cuttlefish_host_only"],
- test_suites: ["general-tests"],
-}
-
-cc_test_host {
- name: "vsoc_graphics_test",
- srcs: [
- "common/vsoc/lib/graphics_test.cpp",
- ],
- shared_libs: [
- "vsoc_lib",
- "libbase",
- ],
- defaults: ["cuttlefish_host_only"],
- test_suites: ["general-tests"],
-}
-
-cc_binary_host {
- name: "host_region_e2e_test",
- srcs: [
- "host/vsoc/lib/host_region_e2e_test.cpp",
- ],
- shared_libs: [
- "vsoc_lib",
- "libcuttlefish_fs",
- "libcuttlefish_utils",
- "cuttlefish_auto_resources",
- "libbase",
- ],
- static_libs: [
- "libcuttlefish_host_config",
- "libjsoncpp",
- "libgtest_host",
- "libgflags",
- ],
- defaults: ["cuttlefish_host_only"],
-}
diff --git a/common/frontend/Android.bp b/common/frontend/Android.bp
index a7a4de5..39a4dbb 100644
--- a/common/frontend/Android.bp
+++ b/common/frontend/Android.bp
@@ -14,6 +14,5 @@
// limitations under the License.
subdirs = [
- "socket_forward_proxy",
"socket_vsock_proxy",
]
diff --git a/common/frontend/socket_forward_proxy/Android.bp b/common/frontend/socket_forward_proxy/Android.bp
deleted file mode 100644
index 74ef53a..0000000
--- a/common/frontend/socket_forward_proxy/Android.bp
+++ /dev/null
@@ -1,45 +0,0 @@
-//
-// Copyright (C) 2018 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.
-
-cc_binary {
- name: "socket_forward_proxy",
- srcs: [
- "main.cpp",
- ],
- shared_libs: [
- "libbase",
- "libcuttlefish_fs",
- "libcuttlefish_utils",
- "libcuttlefish_strings",
- "cuttlefish_auto_resources",
- "vsoc_lib",
- "liblog",
- ],
- static_libs: [
- "libgflags",
- ],
- header_libs: [
- "cuttlefish_glog",
- ],
- target: {
- host: {
- static_libs: [
- "libcuttlefish_host_config",
- "libjsoncpp",
- ],
- },
- },
- defaults: ["cuttlefish_host_and_guest"]
-}
diff --git a/common/frontend/socket_forward_proxy/main.cpp b/common/frontend/socket_forward_proxy/main.cpp
deleted file mode 100644
index 4c21459..0000000
--- a/common/frontend/socket_forward_proxy/main.cpp
+++ /dev/null
@@ -1,374 +0,0 @@
-/*
- * Copyright (C) 2018 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 <array>
-#include <cstdint>
-#include <cstdlib>
-#include <iostream>
-#include <limits>
-#include <memory>
-#include <mutex>
-#include <sstream>
-#include <string>
-#include <thread>
-#include <vector>
-#include <glog/logging.h>
-#include <gflags/gflags.h>
-
-#include <unistd.h>
-
-#include "common/libs/fs/shared_fd.h"
-#include "common/libs/strings/str_split.h"
-#include "common/vsoc/lib/socket_forward_region_view.h"
-
-#ifdef CUTTLEFISH_HOST
-#include "host/libs/config/cuttlefish_config.h"
-#endif
-
-using vsoc::socket_forward::Packet;
-using vsoc::socket_forward::SocketForwardRegionView;
-
-#ifdef CUTTLEFISH_HOST
-DEFINE_string(guest_ports, "",
- "Comma-separated list of ports on which to forward TCP "
- "connections to the guest.");
-DEFINE_string(host_ports, "",
- "Comma-separated list of ports on which to run TCP servers on "
- "the host.");
-#endif
-
-namespace {
-// Sends packets, Shutdown(SHUT_WR) on destruction
-class SocketSender {
- public:
- explicit SocketSender(cvd::SharedFD socket) : socket_{std::move(socket)} {}
-
- SocketSender(SocketSender&&) = default;
- SocketSender& operator=(SocketSender&&) = default;
-
- SocketSender(const SocketSender&&) = delete;
- SocketSender& operator=(const SocketSender&) = delete;
-
- ~SocketSender() {
- if (socket_.operator->()) { // check that socket_ was not moved-from
- socket_->Shutdown(SHUT_WR);
- }
- }
-
- ssize_t SendAll(const Packet& packet) {
- ssize_t written{};
- while (written < static_cast<ssize_t>(packet.payload_length())) {
- if (!socket_->IsOpen()) {
- return -1;
- }
- auto just_written =
- socket_->Send(packet.payload() + written,
- packet.payload_length() - written, MSG_NOSIGNAL);
- if (just_written <= 0) {
- LOG(INFO) << "Couldn't write to client: "
- << strerror(socket_->GetErrno());
- return just_written;
- }
- written += just_written;
- }
- return written;
- }
-
- private:
- cvd::SharedFD socket_;
-};
-
-class SocketReceiver {
- public:
- explicit SocketReceiver(cvd::SharedFD socket) : socket_{std::move(socket)} {}
-
- SocketReceiver(SocketReceiver&&) = default;
- SocketReceiver& operator=(SocketReceiver&&) = default;
-
- SocketReceiver(const SocketReceiver&&) = delete;
- SocketReceiver& operator=(const SocketReceiver&) = delete;
-
- // *packet will be empty if Read returns 0 or error
- void Recv(Packet* packet) {
- auto size = socket_->Read(packet->payload(), sizeof packet->payload());
- if (size < 0) {
- size = 0;
- }
- packet->set_payload_length(size);
- }
-
- private:
- cvd::SharedFD socket_;
-};
-
-void SocketToShm(SocketReceiver socket_receiver,
- SocketForwardRegionView::ShmSender shm_sender) {
- while (true) {
- auto packet = Packet::MakeData();
- socket_receiver.Recv(&packet);
- if (packet.empty() || !shm_sender.Send(packet)) {
- break;
- }
- }
- LOG(INFO) << "Socket to shm exiting";
-}
-
-void ShmToSocket(SocketSender socket_sender,
- SocketForwardRegionView::ShmReceiver shm_receiver) {
- auto packet = Packet{};
- while (true) {
- shm_receiver.Recv(&packet);
- CHECK(packet.IsData());
- if (packet.empty()) {
- break;
- }
- if (socket_sender.SendAll(packet) < 0) {
- break;
- }
- }
- LOG(INFO) << "Shm to socket exiting";
-}
-
-// One thread for reading from shm and writing into a socket.
-// One thread for reading from a socket and writing into shm.
-void HandleConnection(SocketForwardRegionView::ShmSenderReceiverPair shm_sender_and_receiver,
- cvd::SharedFD socket) {
- auto socket_to_shm =
- std::thread(SocketToShm, SocketReceiver{socket}, std::move(shm_sender_and_receiver.first));
- ShmToSocket(SocketSender{socket}, std::move(shm_sender_and_receiver.second));
- socket_to_shm.join();
-}
-
-#ifdef CUTTLEFISH_HOST
-struct PortPair {
- int guest_port;
- int host_port;
-};
-
-enum class QueueState {
- kFree,
- kUsed,
-};
-
-struct SocketConnectionInfo {
- std::mutex lock{};
- std::condition_variable cv{};
- cvd::SharedFD socket{};
- int guest_port{};
- QueueState state = QueueState::kFree;
-};
-
-static constexpr auto kNumHostThreads =
- vsoc::layout::socket_forward::kNumQueues;
-
-using SocketConnectionInfoCollection =
- std::array<SocketConnectionInfo, kNumHostThreads>;
-
-void MarkAsFree(SocketConnectionInfo* conn) {
- std::lock_guard<std::mutex> guard{conn->lock};
- conn->socket = cvd::SharedFD{};
- conn->guest_port = 0;
- conn->state = QueueState::kFree;
-}
-
-std::pair<int, cvd::SharedFD> WaitForConnection(SocketConnectionInfo* conn) {
- std::unique_lock<std::mutex> guard{conn->lock};
- while (conn->state != QueueState::kUsed) {
- conn->cv.wait(guard);
- }
- return {conn->guest_port, conn->socket};
-}
-
-[[noreturn]] void host_thread(SocketForwardRegionView::ShmConnectionView view,
- SocketConnectionInfo* conn) {
- while (true) {
- int guest_port{};
- cvd::SharedFD socket{};
- // TODO structured binding in C++17
- std::tie(guest_port, socket) = WaitForConnection(conn);
-
- LOG(INFO) << "Establishing connection to guest port " << guest_port
- << " with connection_id: " << view.connection_id();
- HandleConnection(view.EstablishConnection(guest_port), std::move(socket));
- LOG(INFO) << "Connection to guest port " << guest_port
- << " closed. Marking queue " << view.connection_id()
- << " as free.";
- MarkAsFree(conn);
- }
-}
-
-bool TryAllocateConnection(SocketConnectionInfo* conn, int guest_port,
- cvd::SharedFD socket) {
- bool success = false;
- {
- std::lock_guard<std::mutex> guard{conn->lock};
- if (conn->state == QueueState::kFree) {
- conn->socket = std::move(socket);
- conn->guest_port = guest_port;
- conn->state = QueueState::kUsed;
- success = true;
- }
- }
- if (success) {
- conn->cv.notify_one();
- }
- return success;
-}
-
-void AllocateWorkers(cvd::SharedFD socket,
- SocketConnectionInfoCollection* socket_connection_info,
- int guest_port) {
- while (true) {
- for (auto& conn : *socket_connection_info) {
- if (TryAllocateConnection(&conn, guest_port, socket)) {
- return;
- }
- }
- LOG(INFO) << "no queues available. sleeping and retrying";
- sleep(5);
- }
-}
-
-[[noreturn]] void host_impl(
- SocketForwardRegionView* shm,
- SocketConnectionInfoCollection* socket_connection_info,
- std::vector<PortPair> ports, std::size_t index) {
- // launch a worker for the following port before handling the current port.
- // recursion (instead of a loop) removes the need fore any join() or having
- // the main thread do no work.
- if (index + 1 < ports.size()) {
- std::thread(host_impl, shm, socket_connection_info, ports, index + 1)
- .detach();
- }
- auto guest_port = ports[index].guest_port;
- auto host_port = ports[index].host_port;
- LOG(INFO) << "starting server on " << host_port << " for guest port "
- << guest_port;
- auto server = cvd::SharedFD::SocketLocalServer(host_port, SOCK_STREAM);
- CHECK(server->IsOpen()) << "Could not start server on port " << host_port;
- while (true) {
- LOG(INFO) << "waiting for client connection";
- auto client_socket = cvd::SharedFD::Accept(*server);
- CHECK(client_socket->IsOpen()) << "error creating client socket";
- LOG(INFO) << "client socket accepted";
- AllocateWorkers(std::move(client_socket), socket_connection_info,
- guest_port);
- }
-}
-
-[[noreturn]] void host(SocketForwardRegionView* shm,
- std::vector<PortPair> ports) {
- CHECK(!ports.empty());
-
- SocketConnectionInfoCollection socket_connection_info{};
-
- auto conn_info_iter = std::begin(socket_connection_info);
- for (auto& shm_connection_view : shm->AllConnections()) {
- CHECK_NE(conn_info_iter, std::end(socket_connection_info));
- std::thread(host_thread, std::move(shm_connection_view), &*conn_info_iter)
- .detach();
- ++conn_info_iter;
- }
- CHECK_EQ(conn_info_iter, std::end(socket_connection_info));
- host_impl(shm, &socket_connection_info, ports, 0);
-}
-
-std::vector<PortPair> ParsePortsList(const std::string& guest_ports_str,
- const std::string& host_ports_str) {
- std::vector<PortPair> ports{};
- auto guest_ports = cvd::StrSplit(guest_ports_str, ',');
- auto host_ports = cvd::StrSplit(host_ports_str, ',');
- CHECK(guest_ports.size() == host_ports.size());
- for (std::size_t i = 0; i < guest_ports.size(); ++i) {
- ports.push_back({std::stoi(guest_ports[i]), std::stoi(host_ports[i])});
- }
- return ports;
-}
-
-#else
-cvd::SharedFD OpenSocketConnection(int port) {
- while (true) {
- auto sock = cvd::SharedFD::SocketLocalClient(port, SOCK_STREAM);
- if (sock->IsOpen()) {
- return sock;
- }
- LOG(WARNING) << "could not connect on port " << port
- << ". sleeping for 1 second";
- sleep(1);
- }
-}
-
-[[noreturn]] void guest_thread(
- SocketForwardRegionView::ShmConnectionView view) {
- while (true) {
- LOG(INFO) << "waiting for new connection";
- auto shm_sender_and_receiver = view.WaitForNewConnection();
- LOG(INFO) << "new connection for port " << view.port();
- HandleConnection(std::move(shm_sender_and_receiver), OpenSocketConnection(view.port()));
- LOG(INFO) << "connection closed on port " << view.port();
- }
-}
-
-[[noreturn]] void guest(SocketForwardRegionView* shm) {
- LOG(INFO) << "Starting guest mainloop";
- auto connection_views = shm->AllConnections();
- for (auto&& shm_connection_view : connection_views) {
- std::thread(guest_thread, std::move(shm_connection_view)).detach();
- }
- while (true) {
- sleep(std::numeric_limits<unsigned int>::max());
- }
-}
-
-#endif
-
-SocketForwardRegionView* GetShm() {
- auto shm = SocketForwardRegionView::GetInstance(
-#ifdef CUTTLEFISH_HOST
- vsoc::GetDomain().c_str()
-#endif
- );
- if (!shm) {
- LOG(FATAL) << "Could not open SHM. Aborting.";
- }
- shm->CleanUpPreviousConnections();
- return shm;
-}
-
-// makes sure we're running as root on the guest, no-op on the host
-void assert_correct_user() {
-#ifndef CUTTLEFISH_HOST
- CHECK_EQ(getuid(), 0u) << "must run as root!";
-#endif
-}
-
-} // namespace
-
-int main(int argc, char* argv[]) {
- gflags::ParseCommandLineFlags(&argc, &argv, true);
- assert_correct_user();
-
- auto shm = GetShm();
- auto worker = shm->StartWorker();
-
-#ifdef CUTTLEFISH_HOST
- CHECK(!FLAGS_guest_ports.empty()) << "Must specify --guest_ports flag";
- CHECK(!FLAGS_host_ports.empty()) << "Must specify --host_ports flag";
- host(shm, ParsePortsList(FLAGS_guest_ports, FLAGS_host_ports));
-#else
- guest(shm);
-#endif
-}
diff --git a/common/frontend/socket_vsock_proxy/main.cpp b/common/frontend/socket_vsock_proxy/main.cpp
index ac421a3..31cff0b 100644
--- a/common/frontend/socket_vsock_proxy/main.cpp
+++ b/common/frontend/socket_vsock_proxy/main.cpp
@@ -20,13 +20,103 @@
#include <gflags/gflags.h>
#include "common/libs/fs/shared_fd.h"
-#include "common/vsoc/lib/socket_forward_region_view.h"
#ifdef CUTTLEFISH_HOST
#include "host/libs/config/cuttlefish_config.h"
#endif
-using vsoc::socket_forward::Packet;
+struct Header {
+ std::uint32_t payload_length;
+ enum MessageType : std::uint32_t {
+ DATA = 0,
+ BEGIN,
+ END,
+ RECV_CLOSED, // indicate that this side's receive end is closed
+ RESTART,
+ };
+ MessageType message_type;
+};
+
+constexpr std::size_t kMaxPacketSize = 8192;
+constexpr std::size_t kMaxPayloadSize = kMaxPacketSize - sizeof(Header);
+
+struct Packet {
+ private:
+ Header header_;
+ using Payload = char[kMaxPayloadSize];
+ Payload payload_data_;
+
+ static constexpr Packet MakePacket(Header::MessageType type) {
+ Packet packet{};
+ packet.header_.message_type = type;
+ return packet;
+ }
+
+ public:
+ // port is only revelant on the host-side.
+ static Packet MakeBegin(std::uint16_t port);
+
+ static constexpr Packet MakeEnd() { return MakePacket(Header::END); }
+
+ static constexpr Packet MakeRecvClosed() {
+ return MakePacket(Header::RECV_CLOSED);
+ }
+
+ static constexpr Packet MakeRestart() { return MakePacket(Header::RESTART); }
+
+ // NOTE payload and payload_length must still be set.
+ static constexpr Packet MakeData() { return MakePacket(Header::DATA); }
+
+ bool empty() const { return IsData() && header_.payload_length == 0; }
+
+ void set_payload_length(std::uint32_t length) {
+ CHECK_LE(length, sizeof payload_data_);
+ header_.payload_length = length;
+ }
+
+ Payload& payload() { return payload_data_; }
+
+ const Payload& payload() const { return payload_data_; }
+
+ constexpr std::uint32_t payload_length() const {
+ return header_.payload_length;
+ }
+
+ constexpr bool IsBegin() const {
+ return header_.message_type == Header::BEGIN;
+ }
+
+ constexpr bool IsEnd() const { return header_.message_type == Header::END; }
+
+ constexpr bool IsData() const { return header_.message_type == Header::DATA; }
+
+ constexpr bool IsRecvClosed() const {
+ return header_.message_type == Header::RECV_CLOSED;
+ }
+
+ constexpr bool IsRestart() const {
+ return header_.message_type == Header::RESTART;
+ }
+
+ constexpr std::uint16_t port() const {
+ CHECK(IsBegin());
+ std::uint16_t port_number{};
+ CHECK_EQ(payload_length(), sizeof port_number);
+ std::memcpy(&port_number, payload(), sizeof port_number);
+ return port_number;
+ }
+
+ char* raw_data() { return reinterpret_cast<char*>(this); }
+
+ const char* raw_data() const { return reinterpret_cast<const char*>(this); }
+
+ constexpr size_t raw_data_length() const {
+ return payload_length() + sizeof header_;
+ }
+};
+
+static_assert(sizeof(Packet) == kMaxPacketSize, "");
+static_assert(std::is_pod<Packet>{}, "");
DEFINE_uint32(tcp_port, 0, "TCP port (server on host, client on guest)");
DEFINE_uint32(vsock_port, 0, "vsock port (client on host, server on guest");
diff --git a/common/vsoc/lib/audio_data_layout.cpp b/common/vsoc/lib/audio_data_layout.cpp
deleted file mode 100644
index 4b5172c..0000000
--- a/common/vsoc/lib/audio_data_layout.cpp
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright (C) 2018 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.
- */
-
-// Define some of the string constants associated with the region layout.
-#include "common/vsoc/shm/audio_data_layout.h"
-
-namespace vsoc {
-namespace layout {
-namespace audio_data {
-
-// static
-const char *const AudioDataLayout::region_name = "audio_data";
-
-} // namespace audio_data
-} // namespace layout
-} // namespace vsoc
-
diff --git a/common/vsoc/lib/audio_data_region_view.h b/common/vsoc/lib/audio_data_region_view.h
deleted file mode 100644
index 42d05df..0000000
--- a/common/vsoc/lib/audio_data_region_view.h
+++ /dev/null
@@ -1,39 +0,0 @@
-#pragma once
-/*
- * Copyright (C) 2018 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 <memory>
-
-#include <android-base/macros.h>
-
-#include "common/vsoc/lib/typed_region_view.h"
-#include "common/vsoc/shm/audio_data_layout.h"
-
-namespace vsoc {
-namespace audio_data {
-
-class AudioDataRegionView
- : public vsoc::TypedRegionView<
- AudioDataRegionView,
- vsoc::layout::audio_data::AudioDataLayout> {
-public:
- AudioDataRegionView() = default;
- AudioDataRegionView(const AudioDataRegionView &) = delete;
- AudioDataRegionView &operator=(const AudioDataRegionView &) = delete;
-};
-
-} // namespace audio_data
-} // namespace vsoc
diff --git a/common/vsoc/lib/circqueue_impl.h b/common/vsoc/lib/circqueue_impl.h
deleted file mode 100644
index 8b0fa90..0000000
--- a/common/vsoc/lib/circqueue_impl.h
+++ /dev/null
@@ -1,234 +0,0 @@
-#pragma once
-
-/*
- * 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 <cerrno>
-#include <cstring>
-
-#include <sys/uio.h>
-
-#include "common/vsoc/lib/region_signaling_interface.h"
-#include "common/vsoc/shm/circqueue.h"
-
-// Increases the given index until it is naturally aligned for T.
-template <typename T>
-uintptr_t align(uintptr_t index) {
- return (index + sizeof(T) - 1) & ~(sizeof(T) - 1);
-}
-
-namespace vsoc {
-class RegionSignalingInterface;
-namespace layout {
-
-template <uint32_t SizeLog2>
-void CircularQueueBase<SizeLog2>::CopyInRange(const char* buffer_in,
- const Range& t) {
- size_t bytes = t.end_idx - t.start_idx;
- uint32_t index = t.start_idx & (BufferSize - 1);
- if (index + bytes <= BufferSize) {
- std::memcpy(buffer_ + index, buffer_in, bytes);
- } else {
- size_t part1_size = BufferSize - index;
- size_t part2_size = bytes - part1_size;
- std::memcpy(buffer_ + index, buffer_in, part1_size);
- std::memcpy(buffer_, buffer_in + part1_size, part2_size);
- }
-}
-
-template <uint32_t SizeLog2>
-void CircularQueueBase<SizeLog2>::CopyOutRange(const Range& t,
- char* buffer_out) {
- uint32_t index = t.start_idx & (BufferSize - 1);
- size_t total_size = t.end_idx - t.start_idx;
- if (index + total_size <= BufferSize) {
- std::memcpy(buffer_out, buffer_ + index, total_size);
- } else {
- uint32_t part1_size = BufferSize - index;
- uint32_t part2_size = total_size - part1_size;
- std::memcpy(buffer_out, buffer_ + index, part1_size);
- std::memcpy(buffer_out + part1_size, buffer_, part2_size);
- }
-}
-
-template <uint32_t SizeLog2>
-void CircularQueueBase<SizeLog2>::WaitForDataLocked(
- RegionSignalingInterface* r) {
- while (1) {
- uint32_t o_w_pub = w_pub_;
- // We don't have data. Wait until some appears and try again
- if (r_released_ != o_w_pub) {
- return;
- }
- lock_.Unlock();
- r->WaitForSignal(&w_pub_, o_w_pub);
- lock_.Lock();
- }
-}
-
-template <uint32_t SizeLog2>
-intptr_t CircularQueueBase<SizeLog2>::WriteReserveLocked(
- RegionSignalingInterface* r, size_t bytes, Range* t, bool non_blocking) {
- // Can't write more than the buffer will hold
- if (bytes > BufferSize) {
- return -ENOSPC;
- }
- while (true) {
- uint32_t o_w_pub = w_pub_;
- uint32_t o_r_release = r_released_;
- uint32_t bytes_in_use = o_w_pub - o_r_release;
- size_t available = BufferSize - bytes_in_use;
- if (available >= bytes) {
- t->start_idx = o_w_pub;
- t->end_idx = o_w_pub + bytes;
- break;
- }
- if (non_blocking) {
- return -EWOULDBLOCK;
- }
- // If we can't write at the moment wait for a reader to release
- // some bytes.
- lock_.Unlock();
- r->WaitForSignal(&r_released_, o_r_release);
- lock_.Lock();
- }
- return t->end_idx - t->start_idx;
-}
-
-template <uint32_t SizeLog2>
-intptr_t CircularByteQueue<SizeLog2>::Read(RegionSignalingInterface* r,
- char* buffer_out, size_t max_size) {
- this->lock_.Lock();
- this->WaitForDataLocked(r);
- Range t;
- t.start_idx = this->r_released_;
- t.end_idx = this->w_pub_;
- // The lock is still held here...
- // Trim the range if we got more than the reader wanted
- if ((t.end_idx - t.start_idx) > max_size) {
- t.end_idx = t.start_idx + max_size;
- }
- this->CopyOutRange(t, buffer_out);
- this->r_released_ = t.end_idx;
- this->lock_.Unlock();
- r->SendSignal(layout::Sides::Both, &this->r_released_);
- return t.end_idx - t.start_idx;
-}
-
-template <uint32_t SizeLog2>
-intptr_t CircularByteQueue<SizeLog2>::Write(RegionSignalingInterface* r,
- const char* buffer_in, size_t bytes,
- bool non_blocking) {
- Range range;
- this->lock_.Lock();
- intptr_t rval = this->WriteReserveLocked(r, bytes, &range, non_blocking);
- if (rval < 0) {
- this->lock_.Unlock();
- return rval;
- }
- this->CopyInRange(buffer_in, range);
- // We can't publish until all of the previous write allocations where
- // published.
- this->w_pub_ = range.end_idx;
- this->lock_.Unlock();
- r->SendSignal(layout::Sides::Both, &this->w_pub_);
- return bytes;
-}
-
-template <uint32_t SizeLog2, uint32_t MaxPacketSize>
-intptr_t CircularPacketQueue<SizeLog2, MaxPacketSize>::CalculateBufferedSize(
- size_t payload) {
- return align<uint32_t>(sizeof(uint32_t) + payload);
-}
-
-template <uint32_t SizeLog2, uint32_t MaxPacketSize>
-intptr_t CircularPacketQueue<SizeLog2, MaxPacketSize>::Read(
- RegionSignalingInterface* r, char* buffer_out, size_t max_size) {
- this->lock_.Lock();
- this->WaitForDataLocked(r);
- uint32_t packet_size = *reinterpret_cast<uint32_t*>(
- this->buffer_ + (this->r_released_ & (this->BufferSize - 1)));
- if (packet_size > max_size) {
- this->lock_.Unlock();
- return -ENOSPC;
- }
- Range t;
- t.start_idx = this->r_released_ + sizeof(uint32_t);
- t.end_idx = t.start_idx + packet_size;
- this->CopyOutRange(t, buffer_out);
- this->r_released_ += this->CalculateBufferedSize(packet_size);
- this->lock_.Unlock();
- r->SendSignal(layout::Sides::Both, &this->r_released_);
- return packet_size;
-}
-
-template <uint32_t SizeLog2, uint32_t MaxPacketSize>
-intptr_t CircularPacketQueue<SizeLog2, MaxPacketSize>::Write(
- RegionSignalingInterface* r, const char* buffer_in, uint32_t bytes,
- bool non_blocking) {
- iovec iov;
- iov.iov_base = const_cast<char *>(buffer_in);
- iov.iov_len = bytes;
- return Writev(r, &iov, 1 /* iov_count */, non_blocking);
-}
-
-template <uint32_t SizeLog2, uint32_t MaxPacketSize>
-intptr_t CircularPacketQueue<SizeLog2, MaxPacketSize>::Writev(
- RegionSignalingInterface *r,
- const iovec *iov,
- size_t iov_count,
- bool non_blocking) {
- size_t bytes = 0;
- for (size_t i = 0; i < iov_count; ++i) {
- bytes += iov[i].iov_len;
- }
-
- if (bytes > MaxPacketSize) {
- return -ENOSPC;
- }
-
- Range range;
- size_t buffered_size = this->CalculateBufferedSize(bytes);
- this->lock_.Lock();
- intptr_t rval =
- this->WriteReserveLocked(r, buffered_size, &range, non_blocking);
- if (rval < 0) {
- this->lock_.Unlock();
- return rval;
- }
- Range header = range;
- header.end_idx = header.start_idx + sizeof(uint32_t);
- Range payload{
- static_cast<uint32_t>(range.start_idx + sizeof(uint32_t)),
- static_cast<uint32_t>(range.start_idx + sizeof(uint32_t) + bytes)};
- this->CopyInRange(reinterpret_cast<const char*>(&bytes), header);
-
- Range subRange = payload;
- for (size_t i = 0; i < iov_count; ++i) {
- subRange.end_idx = subRange.start_idx + iov[i].iov_len;
- this->CopyInRange(static_cast<const char *>(iov[i].iov_base), subRange);
-
- subRange.start_idx = subRange.end_idx;
- }
-
- this->w_pub_ = range.end_idx;
- this->lock_.Unlock();
- r->SendSignal(layout::Sides::Both, &this->w_pub_);
- return bytes;
-}
-
-} // namespace layout
-} // namespace vsoc
diff --git a/common/vsoc/lib/circqueue_test.cpp b/common/vsoc/lib/circqueue_test.cpp
deleted file mode 100644
index 34aca33..0000000
--- a/common/vsoc/lib/circqueue_test.cpp
+++ /dev/null
@@ -1,327 +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 <thread>
-#include <unistd.h>
-
-#include <gtest/gtest.h>
-
-#include "common/vsoc/lib/circqueue_impl.h"
-#include "common/vsoc/lib/mock_region_view.h"
-
-#define EXPECT_BLOCK(region, tid) \
- EXPECT_TRUE(region.IsBlocking(tid))
-
-namespace {
-
-constexpr int kQueueSizeLog2 = 16;
-constexpr int kQueueCapacity = 1 << kQueueSizeLog2;
-constexpr int kMaxPacketSize = 1024;
-
-constexpr int kNumReadingThread = 5;
-constexpr int kNumWritingThread = 5;
-
-struct CircQueueTestRegionLayout : public vsoc::layout::RegionLayout {
- vsoc::layout::CircularByteQueue<kQueueSizeLog2> byte_queue;
- vsoc::layout::CircularPacketQueue<kQueueSizeLog2, kMaxPacketSize> packet_queue;
-};
-
-typedef vsoc::test::MockRegionView<CircQueueTestRegionLayout> CircQueueRegionView;
-
-class CircQueueTest : public ::testing::Test {
- protected:
- virtual void SetUp() {
- region_.Open();
- }
-
- CircQueueRegionView region_;
-};
-
-intptr_t ReadBytes(CircQueueRegionView* region, int bytes) {
- char buffer_out[bytes];
- CircQueueTestRegionLayout* layout = region->data();
- return layout->byte_queue.Read(region, buffer_out, bytes);
-}
-
-intptr_t WriteBytes(CircQueueRegionView* region, int bytes) {
- char buffer_in[bytes];
- CircQueueTestRegionLayout* layout = region->data();
- return layout->byte_queue.Write(region, buffer_in, bytes);
-}
-
-intptr_t ReadPacket(CircQueueRegionView* region, int max_size) {
- char buffer_out[max_size];
- CircQueueTestRegionLayout* layout = region->data();
- return layout->packet_queue.Read(region, buffer_out, max_size);
-}
-
-intptr_t WritePacket(CircQueueRegionView* region, int packet_size) {
- char buffer_in[packet_size];
- CircQueueTestRegionLayout* layout = region->data();
- return layout->packet_queue.Write(region, buffer_in, packet_size);
-}
-
-void ReadBytesInChunk(CircQueueRegionView* region, int total_size, int chuck_size) {
- char buffer_out[chuck_size];
- CircQueueTestRegionLayout* layout = region->data();
- int total_read = 0;
- int remaining = total_size;
- while (remaining >= chuck_size) {
- int ret = layout->byte_queue.Read(region, buffer_out, chuck_size);
- total_read += ret;
- remaining -= ret;
- }
- if (remaining > 0) {
- total_read += layout->byte_queue.Write(region, buffer_out, remaining);
- }
- EXPECT_EQ(total_read, total_size);
-}
-
-void WriteBytesInChunk(CircQueueRegionView* region, int total_size, int chuck_size) {
- char buffer_in[chuck_size];
- CircQueueTestRegionLayout* layout = region->data();
- int total_write = 0;
- int remaining = total_size;
- while (remaining >= chuck_size) {
- int ret = layout->byte_queue.Write(region, buffer_in, chuck_size);
- total_write += ret;
- remaining -= ret;
- }
- if (remaining > 0) {
- total_write += layout->byte_queue.Write(region, buffer_in, remaining);
- }
- EXPECT_EQ(total_write, total_size);
-}
-
-void ReadManyPackets(CircQueueRegionView* region, int num_packets, int packet_size) {
- char buffer_out[packet_size];
- CircQueueTestRegionLayout* layout = region->data();
- int total_read = 0;
- int remaining = num_packets;
- while (remaining > 0) {
- int ret = layout->packet_queue.Read(region, buffer_out, packet_size);
- total_read += ret;
- remaining--;
- }
- EXPECT_EQ(total_read, num_packets * packet_size);
-}
-
-void WriteManyPackets(CircQueueRegionView* region, int num_packets, int packet_size) {
- char buffer_in[packet_size];
- CircQueueTestRegionLayout* layout = region->data();
- int total_write = 0;
- int remaining = num_packets;
- while (remaining > 0) {
- int ret = layout->packet_queue.Write(region, buffer_in, packet_size);
- total_write += ret;
- remaining--;
- }
- EXPECT_EQ(total_write, num_packets * packet_size);
-}
-
-// ByteQueue Tests
-
-// Test writing bytes
-TEST_F(CircQueueTest, ByteQueueSimpleWrite) {
- const int num_bytes = 8;
- EXPECT_EQ(num_bytes, WriteBytes(&this->region_, num_bytes));
-}
-
-// Test reading bytes
-TEST_F(CircQueueTest, ByteQueueSimpleRead) {
- const int num_bytes = 8;
- EXPECT_EQ(num_bytes, WriteBytes(&this->region_, num_bytes));
- EXPECT_EQ(num_bytes, ReadBytes(&this->region_, num_bytes));
-}
-
-// Test reading on an empty queue. Expect blocking.
-TEST_F(CircQueueTest, ByteQueueReadOnEmpty) {
- const int num_bytes = 8;
-
- // Spawn a thread to read from queue. Expect it to block.
- std::thread reading_thread(ReadBytes, &this->region_, num_bytes);
- EXPECT_BLOCK(region_, reading_thread.get_id());
-
- // Write expected bytes in so that we can clean up properly.
- std::thread writing_thread(WriteBytes, &this->region_, num_bytes);
- writing_thread.join();
-
- reading_thread.join();
-}
-
-// Test writing on a full queue. Expect blocking.
-TEST_F(CircQueueTest, ByteQueueWriteOnFull) {
- // Fill the queue.
- const int capacity_bytes = kQueueCapacity;
- EXPECT_EQ(capacity_bytes, WriteBytes(&this->region_, capacity_bytes));
-
- // Now the queue is full, any further write would block.
- const int num_bytes = 8;
- std::thread writing_thread(WriteBytes, &this->region_, num_bytes);
- EXPECT_BLOCK(region_, writing_thread.get_id());
-
- // Read the extra bytes out so that we can clean up properly.
- std::thread reading_thread(ReadBytes, &this->region_, num_bytes);
- reading_thread.join();
-
- writing_thread.join();
-}
-
-// Test if bytes being read out are the same as ones being written in.
-TEST_F(CircQueueTest, ByteQueueContentIntegrity) {
- const int num_bytes = 8;
- CircQueueTestRegionLayout* layout = this->region_.data();
-
- char buffer_in[num_bytes] = {'a'};
- layout->byte_queue.Write(&this->region_, buffer_in, num_bytes);
-
- char buffer_out[num_bytes] = {'b'};
- layout->byte_queue.Read(&this->region_, buffer_out, num_bytes);
-
- for (int i=0; i<num_bytes; i++) {
- EXPECT_EQ(buffer_in[i], buffer_out[i]);
- }
-}
-
-// Test writing more bytes than capacity
-TEST_F(CircQueueTest, ByteQueueWriteTooManyBytes) {
- const int extra_bytes = 8;
- const int num_bytes = kQueueCapacity + extra_bytes;
- EXPECT_EQ(-ENOSPC, WriteBytes(&this->region_, num_bytes));
-}
-
-// Test multiple bytes read/write
-TEST_F(CircQueueTest, ByteQueueMultipleReadWrite) {
- const int chunk_size = 7;
- const int total_size = 3.3 * kQueueCapacity;
- std::vector<std::thread> reading_threads;
- std::vector<std::thread> writing_threads;
- for (int i=0; i<kNumReadingThread; i++) {
- reading_threads.emplace_back(
- std::thread(ReadBytesInChunk, &this->region_, total_size, chunk_size));
- }
- for (int i=0; i<kNumWritingThread; i++) {
- writing_threads.emplace_back(
- std::thread(WriteBytesInChunk, &this->region_, total_size, chunk_size));
- }
- std::for_each(reading_threads.begin(), reading_threads.end(), [](std::thread& t) { t.join(); });
- std::for_each(writing_threads.begin(), writing_threads.end(), [](std::thread& t) { t.join(); });
-}
-
-// PacketQueue Tests
-
-// Test writing packet
-TEST_F(CircQueueTest, PacketQueueSimpleWrite) {
- const int packet_size = 8;
- EXPECT_EQ(packet_size, WritePacket(&this->region_, packet_size));
-}
-
-// Test reading packet
-TEST_F(CircQueueTest, PacketQueueSimpleRead) {
- const int packet_size = 8;
- EXPECT_EQ(packet_size, WritePacket(&this->region_, packet_size));
- EXPECT_EQ(packet_size, ReadPacket(&this->region_, packet_size));
-}
-
-// Test reading on an empty queue. Expect blocking.
-TEST_F(CircQueueTest, PacketQueueReadOnEmpty) {
- const int packet_size = 8;
-
- // Spawn a thread to read from queue. Expect it to block.
- std::thread reading_thread(ReadPacket, &this->region_, packet_size);
- EXPECT_BLOCK(region_, reading_thread.get_id());
-
- // Write expected bytes in so that we can clean up properly.
- std::thread writing_thread(WritePacket, &this->region_, packet_size);
- writing_thread.join();
-
- reading_thread.join();
-}
-
-// Test writing on a full queue. Expect blocking.
-TEST_F(CircQueueTest, PacketQueueWriteOnFull) {
- // Fill the queue.
- const int packet_size = kMaxPacketSize;
- int capacity_bytes = kQueueCapacity;
- while (capacity_bytes >= packet_size) {
- EXPECT_EQ(packet_size, WritePacket(&this->region_, packet_size));
- capacity_bytes -= (packet_size + sizeof(uint32_t));
- }
-
- // Now the queue is full, any further write would block.
- std::thread writing_thread(WritePacket, &this->region_, packet_size);
- EXPECT_BLOCK(region_, writing_thread.get_id());
-
- // Read the extra bytes out so that we can clean up properly.
- std::thread reading_thread(ReadPacket, &this->region_, packet_size);
- reading_thread.join();
-
- writing_thread.join();
-}
-
-// Test if packet being read out are the same as one being written in.
-TEST_F(CircQueueTest, PacketQueueContentIntegrity) {
- const int packet_size = 8;
- CircQueueTestRegionLayout* layout = this->region_.data();
-
- char buffer_in[packet_size] = {'a'};
- layout->packet_queue.Write(&this->region_, buffer_in, packet_size);
-
- char buffer_out[packet_size] = {'b'};
- layout->packet_queue.Read(&this->region_, buffer_out, packet_size);
-
- for (int i=0; i<packet_size; i++) {
- EXPECT_EQ(buffer_in[i], buffer_out[i]);
- }
-}
-
-// Test writing packet larger than capacity
-TEST_F(CircQueueTest, PacketQueueWriteTooLargePacket) {
- const int extra_bytes = 8;
- const int packet_size = kQueueCapacity + extra_bytes;
- EXPECT_EQ(-ENOSPC, WritePacket(&this->region_, packet_size));
-}
-
-// Test reading packet larger than can handle
-TEST_F(CircQueueTest, PacketQueueReadTooLargePacket) {
- const int extra_bytes = 8;
- const int small_packet = 8;
- const int large_packet = small_packet + extra_bytes;
-
- WritePacket(&this->region_, large_packet);
- char buffer_out[small_packet];
- CircQueueTestRegionLayout* layout = this->region_.data();
- EXPECT_EQ(-ENOSPC, layout->packet_queue.Read(&this->region_, buffer_out, small_packet));
-}
-
-// Test multiple packets read/write
-TEST_F(CircQueueTest, PacketQueueMultipleReadWrite) {
- const int packet_size = kMaxPacketSize;
- const int num_packets = 1.5 * (kQueueCapacity / packet_size);
- std::vector<std::thread> reading_threads;
- std::vector<std::thread> writing_threads;
- for (int i=0; i<kNumReadingThread; i++) {
- reading_threads.emplace_back(
- std::thread(ReadManyPackets, &this->region_, num_packets, packet_size));
- }
- for (int i=0; i<kNumWritingThread; i++) {
- writing_threads.emplace_back(
- std::thread(WriteManyPackets, &this->region_, num_packets, packet_size));
- }
- std::for_each(reading_threads.begin(), reading_threads.end(), [](std::thread& t) { t.join(); });
- std::for_each(writing_threads.begin(), writing_threads.end(), [](std::thread& t) { t.join(); });
-}
-
-} // namespace
diff --git a/common/vsoc/lib/compat.cpp b/common/vsoc/lib/compat.cpp
deleted file mode 100644
index 3b8deb2..0000000
--- a/common/vsoc/lib/compat.cpp
+++ /dev/null
@@ -1,30 +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/compat.h"
-
-#include <sys/syscall.h>
-#include <unistd.h>
-
-namespace vsoc {
-
-#ifdef CUTTLEFISH_HOST
-uint32_t gettid() {
- thread_local uint32_t tid = syscall(SYS_gettid);
- return tid;
-}
-#endif
-}
diff --git a/common/vsoc/lib/compat.h b/common/vsoc/lib/compat.h
deleted file mode 100644
index 8f3355c..0000000
--- a/common/vsoc/lib/compat.h
+++ /dev/null
@@ -1,28 +0,0 @@
-#pragma once
-
-/*
- * 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.
- */
-
-// Utilities to make the host and the guest a bit more compatible
-
-#include <stdint.h>
-
-namespace vsoc {
-#ifdef CUTTLEFISH_HOST
-// Things that are missing on the host
-uint32_t gettid();
-#endif
-}
diff --git a/common/vsoc/lib/e2e_test_region_layout.cpp b/common/vsoc/lib/e2e_test_region_layout.cpp
deleted file mode 100644
index 9a787bd..0000000
--- a/common/vsoc/lib/e2e_test_region_layout.cpp
+++ /dev/null
@@ -1,43 +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.
- */
-
-// Define some of the string constants associated with the region layout.
-#include "common/vsoc/shm/e2e_test_region_layout.h"
-
-namespace vsoc {
-namespace layout {
-namespace e2e_test {
-
-const char* E2EPrimaryTestRegionLayout::region_name = "e2e_primary";
-const char
- E2EPrimaryTestRegionLayout::guest_pattern[E2EMemoryFill::kOwnedFieldSize] =
- "primary guest e2e string";
-const char
- E2EPrimaryTestRegionLayout::host_pattern[E2EMemoryFill::kOwnedFieldSize] =
- "primary host e2e string";
-
-const char* E2ESecondaryTestRegionLayout::region_name = "e2e_secondary";
-const char E2ESecondaryTestRegionLayout::guest_pattern
- [E2EMemoryFill::kOwnedFieldSize] = "secondary guest e2e string";
-const char
- E2ESecondaryTestRegionLayout::host_pattern[E2EMemoryFill::kOwnedFieldSize] =
- "secondary host e2e string";
-
-const char* E2EUnfindableRegionLayout::region_name = "e2e_must_not_exist";
-
-} // namespace e2e_test
-} // namespace layout
-} // namespace vsoc
diff --git a/common/vsoc/lib/e2e_test_region_view.h b/common/vsoc/lib/e2e_test_region_view.h
deleted file mode 100644
index 70a3db6..0000000
--- a/common/vsoc/lib/e2e_test_region_view.h
+++ /dev/null
@@ -1,104 +0,0 @@
-#pragma once
-/*
- * Copyright (C) 2016 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 <memory>
-#include <functional>
-
-#include "common/vsoc/lib/typed_region_view.h"
-#include "common/vsoc/shm/e2e_test_region_layout.h"
-
-namespace vsoc {
-template <typename Layout>
-class E2ERegionView : public vsoc::TypedRegionView<
- E2ERegionView<Layout>,
- Layout> {
- public:
-
- uint32_t read_guest_self_register() const {
- return this->data().guest_self_register;
- }
-
- void write_guest_self_register(uint32_t val) {
- this->data()->guest_self_register = val;
- }
-
- void signal_guest_self_register() {
- this->SendSignal(layout::Sides::OurSide,
- &this->data()->guest_self_register);
- }
-
- int wait_guest_self_register(uint32_t expected_value) {
- return this->WaitForSignal(
- &this->data()->guest_self_register, expected_value);
- }
-
- void signal_guest_to_host_register() {
- this->SendSignal(layout::Sides::OurSide,
- &this->data()->guest_to_host_signal);
- }
-
- uint32_t guest_to_host_signal_offset() const {
- return this->pointer_to_region_offset(&this->data().guest_to_host_signal);
- }
-
- uint32_t host_to_guest_signal_offset() const {
- return this->pointer_to_region_offset(&this->data().host_to_guest_signal);
- }
-
- const char* guest_string(size_t index) const {
- return const_cast<const char*>(this->data().data[index].guest_writable);
- }
-
- const char* host_string(size_t index) const {
- return const_cast<const char*>(this->data().data[index].host_writable);
- }
-
- bool set_guest_string(size_t index, const char* value) {
- strcpy(const_cast<char*>(this->data()->data[index].guest_writable),
- value);
- return true;
- }
-
- bool set_host_string(size_t index, const char* value) {
- strcpy(const_cast<char*>(this->data()->data[index].host_writable),
- value);
- return true;
- }
-
- size_t string_size() const {
- return Layout::NumFillRecords(this->control_->region_data_size());
- }
-
- void guest_status(vsoc::layout::e2e_test::E2ETestStage stage) {
- this->data()->guest_status.set_value(stage);
- }
-
- void host_status(vsoc::layout::e2e_test::E2ETestStage stage) {
- this->data()->host_status.set_value(stage);
- }
-};
-
-using E2EPrimaryRegionView =
- vsoc::E2ERegionView<layout::e2e_test::E2EPrimaryTestRegionLayout>;
-
-using E2ESecondaryRegionView =
- vsoc::E2ERegionView<layout::e2e_test::E2ESecondaryTestRegionLayout>;
-
-using E2EUnfindableRegionView =
- vsoc::E2ERegionView<layout::e2e_test::E2EUnfindableRegionLayout>;
-
-} // namespace vsoc
diff --git a/common/vsoc/lib/gralloc_layout.cpp b/common/vsoc/lib/gralloc_layout.cpp
deleted file mode 100644
index 9be790a..0000000
--- a/common/vsoc/lib/gralloc_layout.cpp
+++ /dev/null
@@ -1,30 +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.
- */
-
-// Define some of the string constants associated with the region layout.
-#include "common/vsoc/shm/gralloc_layout.h"
-
-namespace vsoc {
-namespace layout {
-
-namespace gralloc {
-
-const char* GrallocManagerLayout::region_name = "gralloc_manager";
-const char* GrallocBufferLayout::region_name = "gralloc_memory";
-
-} // gralloc
-} // layout
-} // vsoc
diff --git a/common/vsoc/lib/graphics_common.h b/common/vsoc/lib/graphics_common.h
deleted file mode 100644
index d2db6c4..0000000
--- a/common/vsoc/lib/graphics_common.h
+++ /dev/null
@@ -1,28 +0,0 @@
-#pragma once
-
-/*
- * 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/shm/graphics.h"
-
-namespace vsoc {
-
-// Returns BytesPerPixel given a PixelFormat. Code should rely on this rather
-// than accessing the mask directly.
-static inline std::size_t BytesPerPixel(PixelFormat in) {
- return 1 + (in >> PixelFormatBase::SubformatSize) &
- (PixelFormatBase::MaxBytesPerPixel - 1);
-}
-} // vsoc
diff --git a/common/vsoc/lib/graphics_test.cpp b/common/vsoc/lib/graphics_test.cpp
deleted file mode 100644
index b43e56e..0000000
--- a/common/vsoc/lib/graphics_test.cpp
+++ /dev/null
@@ -1,23 +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/shm/graphics.h"
-
-#include <gtest/gtest.h>
-
-TEST(GraphicsTest, Basic) {
- // This is a shared memory layout and is mostly tested via static asserts.
- // If this can compile then the test has passed.
-}
diff --git a/common/vsoc/lib/input_events_layout.cpp b/common/vsoc/lib/input_events_layout.cpp
deleted file mode 100644
index 3f1da61..0000000
--- a/common/vsoc/lib/input_events_layout.cpp
+++ /dev/null
@@ -1,29 +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.
- */
-
-// Define some of the string constants associated with the region layout.
-#include "common/vsoc/shm/input_events_layout.h"
-
-namespace vsoc {
-namespace layout {
-
-namespace input_events {
-
-const char* InputEventsLayout::region_name = "input_events";
-
-} // namespace input_events
-} // namespace layout
-} // namespace vsoc
diff --git a/common/vsoc/lib/input_events_region_view.cpp b/common/vsoc/lib/input_events_region_view.cpp
deleted file mode 100644
index 66bc697..0000000
--- a/common/vsoc/lib/input_events_region_view.cpp
+++ /dev/null
@@ -1,100 +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/input_events_region_view.h"
-
-#include <linux/input.h>
-#include <linux/uinput.h>
-
-#include "common/vsoc/lib/circqueue_impl.h"
-
-using vsoc::layout::input_events::InputEventsLayout;
-
-namespace vsoc {
-namespace input_events {
-
-namespace {
-void InitInputEvent(InputEvent* evt, uint16_t type, uint16_t code, uint32_t value) {
- evt->type = type;
- evt->code = code;
- evt->value = value;
-}
-} // namespace
-
-const int InputEventsRegionView::kMaxEventsPerPacket = 4;
-
-bool InputEventsRegionView::HandleSingleTouchEvent(bool down, int x, int y) {
- // TODO(jemoreira): Use multitouch when available
- InputEvent events[4];
- // Make sure to modify kMaxEventPerPacket if more events are sent.
- InitInputEvent(&events[0], EV_ABS, ABS_X, x);
- InitInputEvent(&events[1], EV_ABS, ABS_Y, y);
- InitInputEvent(&events[2], EV_KEY, BTN_TOUCH, down);
- InitInputEvent(&events[3], EV_SYN, 0, 0);
- return 0 <
- data()->touch_screen_queue.Write(
- this, reinterpret_cast<char*>(&events[0]), sizeof(events), true);
-}
-
-bool InputEventsRegionView::HandlePowerButtonEvent(bool down) {
- InputEvent events[2];
- InitInputEvent(&events[0], EV_KEY, KEY_POWER, down);
- InitInputEvent(&events[1], EV_SYN, 0, 0);
- return 0 < data()->power_button_queue.Write(
- this, reinterpret_cast<char*>(&events[0]),
- sizeof(events), true);
-}
-
-bool InputEventsRegionView::HandleKeyboardEvent(bool down, uint16_t key_code) {
- InputEvent events[2];
- InitInputEvent(&events[0], EV_KEY, key_code, down);
- InitInputEvent(&events[1], EV_SYN, 0, 0);
- return 0 <
- data()->keyboard_queue.Write(this, reinterpret_cast<char*>(&events[0]),
- sizeof(events), true);
-}
-
-intptr_t InputEventsRegionView::GetScreenEventsOrWait(InputEvent* evt,
- int max_event_count) {
- intptr_t ret = this->data()->touch_screen_queue.Read(
- this, reinterpret_cast<char*>(evt), sizeof(InputEvent) * max_event_count);
- if (ret < 0) {
- return ret;
- }
- return ret / sizeof(InputEvent);
-}
-
-intptr_t InputEventsRegionView::GetKeyboardEventsOrWait(InputEvent* evt,
- int max_event_count) {
- intptr_t ret = this->data()->keyboard_queue.Read(
- this, reinterpret_cast<char*>(evt), sizeof(InputEvent) * max_event_count);
- if (ret < 0) {
- return ret;
- }
- return ret / sizeof(InputEvent);
-}
-
-intptr_t InputEventsRegionView::GetPowerButtonEventsOrWait(
- InputEvent* evt, int max_event_count) {
- intptr_t ret = this->data()->power_button_queue.Read(
- this, reinterpret_cast<char*>(evt), sizeof(InputEvent) * max_event_count);
- if (ret < 0) {
- return ret;
- }
- return ret / sizeof(InputEvent);
-}
-
-} // namespace input_events
-} // namespace vsoc
diff --git a/common/vsoc/lib/input_events_region_view.h b/common/vsoc/lib/input_events_region_view.h
deleted file mode 100644
index 3355631..0000000
--- a/common/vsoc/lib/input_events_region_view.h
+++ /dev/null
@@ -1,57 +0,0 @@
-#pragma once
-/*
- * 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 <memory>
-
-#include "common/vsoc/lib/typed_region_view.h"
-#include "common/vsoc/shm/input_events_layout.h"
-#include "uapi/vsoc_shm.h"
-
-namespace vsoc {
-namespace input_events {
-
-struct InputEvent {
- uint16_t type;
- uint16_t code;
- uint32_t value;
-};
-
-class InputEventsRegionView
- : public vsoc::TypedRegionView<
- InputEventsRegionView,
- vsoc::layout::input_events::InputEventsLayout> {
- public:
- static const int kMaxEventsPerPacket;
- // Generates a touch event, may returns true if successful, false if there was
- // an error, most likely that the queue is full.
- bool HandleSingleTouchEvent(bool down, int x, int y);
- bool HandlePowerButtonEvent(bool down);
- bool HandleKeyboardEvent(bool down, uint16_t key_code);
-
- // TODO(jemoreira): HandleMultiTouchEvent()...
-
- // Read input events from the queue, waits if there are none available.
- // Returns the number of events read or a negative value in case of an error
- // (most likely the next packet in the queue is larger than the buffer
- // provided).
- intptr_t GetScreenEventsOrWait(InputEvent* buffer, int max_event_count);
- intptr_t GetKeyboardEventsOrWait(InputEvent* buffer, int max_event_count);
- intptr_t GetPowerButtonEventsOrWait(InputEvent* buffer, int max_event_count);
-
-};
-} // namespace input_events
-} // namespace vsoc
diff --git a/common/vsoc/lib/lock_common.cpp b/common/vsoc/lib/lock_common.cpp
deleted file mode 100644
index c100574..0000000
--- a/common/vsoc/lib/lock_common.cpp
+++ /dev/null
@@ -1,180 +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/shm/lock.h"
-
-#include "common/libs/glog/logging.h"
-#include "common/vsoc/lib/compat.h"
-#include "common/vsoc/lib/region_view.h"
-
-#include <stdlib.h>
-
-using vsoc::layout::Sides;
-
-namespace {
-
-const uint32_t LockFree = 0U;
-const uint32_t GuestWaitingFlag = (Sides::Guest << 30);
-const uint32_t HostWaitingFlag = (Sides::Host << 30);
-const uint32_t OurWaitingFlag = (Sides::OurSide << 30);
-static_assert(GuestWaitingFlag, "GuestWaitingFlag is 0");
-static_assert(HostWaitingFlag, "HostWaitingFlag is 0");
-static_assert((GuestWaitingFlag & HostWaitingFlag) == 0,
- "Waiting flags should not share bits");
-
-// Set if the current owner is the host
-const uint32_t HostIsOwner = 0x20000000U;
-
-// PID_MAX_LIMIT appears to be 0x00400000U, so we're probably ok here
-const uint32_t OwnerMask = 0x3FFFFFFFU;
-
-uint32_t MakeOwnerTid(uint32_t raw_tid) {
- if (Sides::OurSide == Sides::Host) {
- return (raw_tid | HostIsOwner) & OwnerMask;
- } else {
- return raw_tid & (OwnerMask & ~HostIsOwner);
- }
-}
-
-}; // namespace
-
-namespace vsoc {
-/**
- * This is a generic synchronization primitive that provides space for the
- * owner of the lock to write platform-specific information.
- */
-bool vsoc::layout::WaitingLockBase::TryLock(uint32_t tid,
- uint32_t* expected_out) {
- uint32_t masked_tid = MakeOwnerTid(tid);
- uint32_t expected = LockFree;
- while (1) {
- // First try to lock assuming that the mutex is free
- if (lock_uint32_.compare_exchange_strong(expected, masked_tid)) {
- // We got the lock.
- return true;
- }
- // We didn't get the lock and our wait flag is already set. It's safe to
- // try to sleep
- if (expected & OurWaitingFlag) {
- *expected_out = expected;
- return false;
- }
- // Attempt to set the wait flag. This will fail if the lock owner changes.
- while (1) {
- uint32_t add_wait_flag = expected | OurWaitingFlag;
- if (lock_uint32_.compare_exchange_strong(expected, add_wait_flag)) {
- // We set the waiting flag. Try to sleep.
- *expected_out = expected;
- return false;
- }
- // The owner changed, but we at least we got the wait flag.
- // Try sleeping
- if (expected & OurWaitingFlag) {
- *expected_out = expected;
- return false;
- }
- // Special case: the lock was just freed. Stop trying to set the
- // waiting flag and try to grab the lock.
- if (expected == LockFree) {
- break;
- }
- // The owner changed and we have no wait flag
- // Try to set the wait flag again
- }
- // This only happens if the lock was freed while we attempt the set the
- // wait flag. Try to grab the lock again
- }
- // Never reached.
-}
-
-layout::Sides vsoc::layout::WaitingLockBase::UnlockCommon(uint32_t tid) {
- uint32_t expected_state = lock_uint32_;
-
- // We didn't hold the lock. This process is insane and must die before it
- // does damage.
- uint32_t marked_tid = MakeOwnerTid(tid);
- if ((marked_tid ^ expected_state) & OwnerMask) {
- LOG(FATAL) << tid << " unlocking " << this << " owned by "
- << expected_state;
- }
- // If contention is just starting this may fail twice (once for each bit)
- // expected_state updates on each failure. When this finishes we have
- // one bit for each waiter
- while (1) {
- if (lock_uint32_.compare_exchange_strong(expected_state, LockFree)) {
- break;
- }
- }
- if ((expected_state ^ marked_tid) & OwnerMask) {
- LOG(FATAL) << "Lock owner of " << this << " changed from " << tid << " to "
- << expected_state << " during unlock";
- }
- switch (expected_state & (GuestWaitingFlag | HostWaitingFlag)) {
- case 0:
- return Sides::NoSides;
- case GuestWaitingFlag:
- return Sides::Guest;
- case HostWaitingFlag:
- return Sides::Host;
- default:
- return Sides::Both;
- }
-}
-
-bool vsoc::layout::WaitingLockBase::RecoverSingleSided() {
- // No need to signal because the caller ensured that there were no other
- // threads...
- return lock_uint32_.exchange(LockFree) != LockFree;
-}
-
-void layout::GuestAndHostLock::Lock(RegionView* region) {
- uint32_t expected;
- uint32_t tid = gettid();
- while (1) {
- if (TryLock(tid, &expected)) {
- return;
- }
- region->WaitForSignal(&lock_uint32_, expected);
- }
-}
-
-void layout::GuestAndHostLock::Unlock(RegionView* region) {
- region->SendSignal(UnlockCommon(gettid()), &lock_uint32_);
-}
-
-bool layout::GuestAndHostLock::Recover(RegionView* region) {
- uint32_t expected_state = lock_uint32_;
- uint32_t expected_owner_bit = (Sides::OurSide == Sides::Host) ? HostIsOwner : 0;
- // This avoids check then act by reading exactly once and then
- // eliminating the states where Recover should be a noop.
- if (expected_state == LockFree) {
- return false;
- }
- // Owned by the other side, do nothing.
- if ((expected_state & HostIsOwner) != expected_owner_bit) {
- return false;
- }
- // At this point we know two things:
- // * The lock was held by our side
- // * There are no other threads running on our side (precondition
- // for calling Recover())
- // Therefore, we know that the current expected value should still
- // be in the lock structure. Use the normal unlock logic, providing
- // the tid that we observed in the lock.
- region->SendSignal(UnlockCommon(expected_state), &lock_uint32_);
- return true;
-}
-
-} // namespace vsoc
diff --git a/common/vsoc/lib/lock_guard.h b/common/vsoc/lib/lock_guard.h
deleted file mode 100644
index 8fbcc7d..0000000
--- a/common/vsoc/lib/lock_guard.h
+++ /dev/null
@@ -1,84 +0,0 @@
-#pragma once
-
-/*
- * 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/shm/lock.h"
-
-namespace vsoc {
-
-class RegionView;
-
-/*
- * Implements std::lock_guard like functionality for the vsoc locks.
- */
-
-template <typename Lock>
-class LockGuard {
- public:
- explicit LockGuard(Lock* lock) : lock_(lock) {
- lock_->Lock();
- }
-
- LockGuard(LockGuard&& o) noexcept {
- lock_ = o.lock_;
- o.lock_ = nullptr;
- }
-
- LockGuard(const LockGuard&) = delete;
- LockGuard& operator=(const LockGuard&) = delete;
-
- ~LockGuard() {
- if (lock_) {
- lock_->Unlock();
- }
- }
-
- private:
- Lock* lock_;
-};
-
-template <>
-class LockGuard<::vsoc::layout::GuestAndHostLock> {
- using Lock = ::vsoc::layout::GuestAndHostLock;
-
- public:
- LockGuard(Lock* lock, RegionView* region) : lock_(lock), region_(region) {
- lock_->Lock(region_);
- }
-
- LockGuard(LockGuard&& o) noexcept {
- lock_ = o.lock_;
- o.lock_ = nullptr;
- region_ = o.region_;
- o.region_ = nullptr;
- }
-
- LockGuard(const LockGuard&) = delete;
- LockGuard& operator=(const LockGuard&) = delete;
-
- ~LockGuard() {
- if (lock_) {
- lock_->Unlock(region_);
- }
- }
-
- private:
- Lock* lock_;
- RegionView* region_;
-};
-
-} // namespace vsoc
diff --git a/common/vsoc/lib/lock_test.cpp b/common/vsoc/lib/lock_test.cpp
deleted file mode 100644
index d09b5a4..0000000
--- a/common/vsoc/lib/lock_test.cpp
+++ /dev/null
@@ -1,74 +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/shm/lock.h"
-
-#include <thread>
-#include <vector>
-
-#include <gtest/gtest.h>
-
-#include "common/vsoc/lib/region_view.h"
-
-#ifdef CUTTLEFISH_HOST
-using MyLock = vsoc::layout::HostLock;
-#else
-using MyLock = vsoc::layout::GuestLock;
-#endif
-
-class SimpleLocker {
- public:
- enum State {
- BEFORE_EXECUTION,
- BEFORE_LOCK,
- IN_CRITICAL_SECTION,
- DONE,
- JOINED
- };
-
- explicit SimpleLocker(MyLock* lock)
- : lock_(lock), thread_(&SimpleLocker::Work, this) {}
-
- void Work() {
- state_ = BEFORE_LOCK;
- lock_->Lock();
- state_ = IN_CRITICAL_SECTION;
- InCriticalSection();
- lock_->Unlock();
- state_ = DONE;
- }
-
- void InCriticalSection() {}
-
- void Join() {
- thread_.join();
- state_ = JOINED;
- }
-
- protected:
- MyLock* lock_;
- volatile State state_{BEFORE_EXECUTION};
- std::thread thread_;
-};
-
-TEST(LockTest, Basic) {
- // In production regions are always 0 filled on allocation. That's not
- // true on the stack, so initialize the lock when we declare it.
- MyLock lock{};
- SimpleLocker a(&lock);
- SimpleLocker b(&lock);
- a.Join();
- b.Join();
-}
diff --git a/common/vsoc/lib/managed_e2e_test_region_layout.cpp b/common/vsoc/lib/managed_e2e_test_region_layout.cpp
deleted file mode 100644
index 1cc794b..0000000
--- a/common/vsoc/lib/managed_e2e_test_region_layout.cpp
+++ /dev/null
@@ -1,29 +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/shm/managed_e2e_test_region_layout.h"
-
-namespace vsoc {
-namespace layout {
-namespace e2e_test {
-
-const char* E2EManagedTestRegionLayout::region_name = "e2e_managed";
-
-const char* E2EManagerTestRegionLayout::region_name = "e2e_manager";
-
-} // namespace e2e_test
-} // namespace layout
-} // namespace vsoc
diff --git a/common/vsoc/lib/mock_region_view.h b/common/vsoc/lib/mock_region_view.h
deleted file mode 100644
index f9c3006..0000000
--- a/common/vsoc/lib/mock_region_view.h
+++ /dev/null
@@ -1,119 +0,0 @@
-#pragma once
-
-/*
- * 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 <linux/futex.h>
-#include <sys/syscall.h>
-#include <sys/types.h>
-#include <unistd.h>
-
-#include <chrono>
-#include <condition_variable>
-#include <mutex>
-#include <thread>
-#include <unordered_map>
-
-#include "common/vsoc/lib/region_signaling_interface.h"
-
-namespace vsoc {
-namespace test {
-
-/**
- * MockRegionView mocks a region in the shared memory window by calloc and
- * futex. It supports only one-sided signal as in it doesn't do anything on
- * sending or waiting interrupt. This is to test if a particular layout
- * behaves correctly when there are multiple threads accessing it.
- */
-template <typename Layout>
-class MockRegionView : public vsoc::RegionSignalingInterface {
- public:
- explicit MockRegionView(){};
- virtual ~MockRegionView() {
- if (region_base_) {
- free(region_base_);
- region_base_ = nullptr;
- }
- };
-
- bool Open() {
- region_base_ = calloc(sizeof(Layout), 1);
- return !region_base_;
- };
-
- virtual void SendSignal(vsoc::layout::Sides /* sides_to_signal */,
- std::atomic<uint32_t>* uaddr) {
- syscall(SYS_futex, reinterpret_cast<int32_t*>(uaddr), FUTEX_WAKE, -1,
- nullptr, nullptr, 0);
- }
-
- virtual int WaitForSignal(std::atomic<uint32_t>* uaddr,
- uint32_t expected_value) {
- {
- std::lock_guard<std::mutex> guard(mutex_);
- if (tid_to_addr_.find(std::this_thread::get_id()) != tid_to_addr_.end()) {
- // Same thread tries to wait
- return 0;
- }
- tid_to_addr_.emplace(std::this_thread::get_id(), uaddr);
- map_changed_.notify_one();
- }
-
- syscall(SYS_futex, uaddr, FUTEX_WAIT, expected_value, nullptr, nullptr, 0);
-
- {
- std::lock_guard<std::mutex> guard(mutex_);
- tid_to_addr_.erase(std::this_thread::get_id());
- }
- return 0;
- }
-
- // Mock methods from TypedRegionView
- Layout* data() { return reinterpret_cast<Layout*>(region_base_); };
-
- // Check wait status on a specificy thread
- bool IsBlocking(std::thread::id tid) {
- while (1) {
- std::unique_lock<std::mutex> lock(mutex_);
- if (tid_to_addr_.find(tid) != tid_to_addr_.end()) {
- return true;
- }
- // Allow some time as tid map might not be updated yet
- while (tid_to_addr_.find(tid) == tid_to_addr_.end()) {
- if (map_changed_.wait_for(lock,
- std::chrono::seconds(kWaitTimeoutInSec)) ==
- std::cv_status::timeout) {
- return false;
- }
- }
- return true;
- }
- }
-
- private:
- // Timeout to avoid a race on checking if a thread is blocked
- static constexpr int kWaitTimeoutInSec = 5;
-
- void* region_base_{};
- std::mutex mutex_;
- std::condition_variable map_changed_;
- std::unordered_map<std::thread::id, std::atomic<uint32_t>*> tid_to_addr_;
-};
-
-template <typename Layout>
-constexpr int MockRegionView<Layout>::kWaitTimeoutInSec;
-
-} // namespace test
-} // namespace vsoc
diff --git a/common/vsoc/lib/region_control.h b/common/vsoc/lib/region_control.h
deleted file mode 100644
index 7762603..0000000
--- a/common/vsoc/lib/region_control.h
+++ /dev/null
@@ -1,111 +0,0 @@
-#pragma once
-
-/*
- * 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 <sys/mman.h>
-#include <stdint.h>
-#include <memory>
-#include "uapi/vsoc_shm.h"
-
-namespace vsoc {
-
-/**
- * Base class for side-specific utility functions that work on regions.
- * The methods in this class do not assume that the region is mapped in memory.
- * This makes is appropriate for ManagedRegions and certain low-level tests
- * of VSoC shared memory. Most other users will want to use TypedRegions with
- * a defined RegionLayout.
- *
- * This class is not directly instantiable because it must be specialized with
- * additional fields for the host and guest.
- */
-class RegionControl {
- public:
- virtual ~RegionControl() {
- if (region_base_) {
- munmap(region_base_, region_size());
- }
- region_base_ = nullptr;
- }
-
-#if defined(CUTTLEFISH_HOST)
- static std::shared_ptr<RegionControl> Open(const char* region_name,
- const char* domain);
-#else
- static std::shared_ptr<RegionControl> Open(const char* region_name);
-#endif
-
- const vsoc_device_region& region_desc() const { return region_desc_; }
-
- // Returns the size of the entire region, including the signal tables.
- uint32_t region_size() const {
- return region_desc_.region_end_offset - region_desc_.region_begin_offset;
- }
-
- // Returns the size of the region that is usable for region-specific data.
- uint32_t region_data_size() const {
- return region_size() - region_desc_.offset_of_region_data;
- }
-
- // Creates a FdScopedPermission. Returns the file descriptor or -1 on
- // failure. FdScopedPermission is not supported on the host, so -1 is
- // always returned there.
- virtual int CreateFdScopedPermission(const char* managed_region_name,
- uint32_t owner_offset,
- uint32_t owned_value,
- uint32_t begin_offset,
- uint32_t end_offset) = 0;
-
- // Interrupt our peer, causing it to scan the outgoing_signal_table
- virtual bool InterruptPeer() = 0;
-
- // Wake the local signal table scanner. Primarily used during shutdown
- virtual void InterruptSelf() = 0;
-
- // Maps the entire region at an address, returning a pointer to the mapping
- virtual void* Map() = 0;
-
- // Wait for an interrupt from our peer
- virtual void WaitForInterrupt() = 0;
-
- // Signals local waiters at the given region offset.
- // Defined only on the guest.
- // Return value is negative on error.
- virtual int SignalSelf(uint32_t offset) = 0;
-
- // Waits for a signal at the given region offset.
- // Defined only on the guest.
- // Return value is negative on error. The number of false wakes is returned
- // on success.
- virtual int WaitForSignal(uint32_t offset, uint32_t expected_value) = 0;
-
- template <typename T>
- T* region_offset_to_pointer(uint32_t offset) {
- if (offset > region_size()) {
- LOG(FATAL) << __FUNCTION__ << ": " << offset << " not in region @"
- << region_base_;
- }
- return reinterpret_cast<T*>(reinterpret_cast<uintptr_t>(region_base_) +
- offset);
- }
-
- protected:
- RegionControl() {}
- void* region_base_{};
- vsoc_device_region region_desc_{};
-};
-} // namespace vsoc
diff --git a/common/vsoc/lib/region_signaling_interface.h b/common/vsoc/lib/region_signaling_interface.h
deleted file mode 100644
index c1399e1..0000000
--- a/common/vsoc/lib/region_signaling_interface.h
+++ /dev/null
@@ -1,64 +0,0 @@
-#pragma once
-
-/*
- * 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 <stdlib.h>
-#include <atomic>
-
-#include "common/vsoc/shm/base.h"
-
-namespace vsoc {
-
-/**
- * Interface that defines signaling and waiting for signal.
- */
-class RegionSignalingInterface {
- public:
- virtual ~RegionSignalingInterface(){};
-
- // Post a signal to the guest, the host, or both.
- // See futex(2) FUTEX_WAKE for details.
- //
- // sides_to_signal: controls where the signal is sent
- //
- // signal_addr: the memory location to signal. Must be within the region.
- virtual void SendSignal(layout::Sides sides_to_signal,
- std::atomic<uint32_t>* signal_addr) = 0;
-
- // This implements the following:
- // if (*signal_addr == last_observed_value)
- // wait_for_signal_at(signal_addr);
- //
- // Note: the caller still needs to check the value at signal_addr because
- // this function may return early for reasons that are implementation-defined.
- // See futex(2) FUTEX_WAIT for details.
- //
- // signal_addr: the memory that will be signaled. Must be within the region.
- //
- // last_observed_value: the value that motivated the calling code to wait.
- //
- // The return values are:
- // -1 on failure
- // 0 indicates success with no tuning information
- // >0 indicates success. The number indicates how many times the thread
- // woke before it could return.
- // Large values indicate that the regions should be tuned.
- virtual int WaitForSignal(std::atomic<uint32_t>* signal_addr,
- uint32_t last_observed_value) = 0;
-};
-
-} // namespace vsoc
diff --git a/common/vsoc/lib/region_view.cpp b/common/vsoc/lib/region_view.cpp
deleted file mode 100644
index dc1088c..0000000
--- a/common/vsoc/lib/region_view.cpp
+++ /dev/null
@@ -1,201 +0,0 @@
-#include "common/vsoc/lib/region_view.h"
-
-#include <sys/mman.h>
-
-#include "common/libs/glog/logging.h"
-
-namespace {
-const uint32_t UADDR_OFFSET_MASK = 0xFFFFFFFC;
-const uint32_t UADDR_OFFSET_ROUND_TRIP_FLAG = 1;
-} // namespace
-
-using vsoc::layout::Sides;
-
-vsoc::RegionWorker::RegionWorker(RegionView* region,
- std::shared_ptr<RegionControl> control)
- : control_(control),
- region_(region),
- stopping_(false) {}
-
-void vsoc::RegionWorker::start() {
- CHECK(!thread_.joinable());
- thread_ = std::thread(&vsoc::RegionWorker::Work, this);
-}
-
-void vsoc::RegionWorker::Work() {
- while (!stopping_) {
- region_->WaitForInterrupt();
- if (stopping_) {
- return;
- }
- region_->ProcessSignalsFromPeer([this](uint32_t offset) {
- control_->SignalSelf(offset);
- });
- }
-}
-
-vsoc::RegionWorker::~RegionWorker() {
- stopping_ = true;
-
- if (thread_.joinable()) {
- region_->InterruptSelf();
- thread_.join();
- }
-}
-
-vsoc::RegionView::~RegionView() {
- // region_base_ is borrowed here. It's owned by control_, which is
- // responsible for unmapping the memory
- region_base_ = nullptr;
-}
-
-#if defined(CUTTLEFISH_HOST)
-bool vsoc::RegionView::Open(const char* name, const char* domain) {
- control_ = vsoc::RegionControl::Open(name, domain);
- if (!control_) {
- return false;
- }
- region_base_ = control_->Map();
- return region_base_ != nullptr;
-}
-#else
-bool vsoc::RegionView::Open(const char* name) {
- control_ = vsoc::RegionControl::Open(name);
- if (!control_) {
- return false;
- }
- region_base_ = control_->Map();
- return region_base_ != nullptr;
-}
-#endif
-
-// Interrupt our peer, causing it to scan the outgoing_signal_table
-bool vsoc::RegionView::MaybeInterruptPeer() {
- if (region_offset_to_pointer<std::atomic<uint32_t>>(
- outgoing_signal_table().interrupt_signalled_offset)
- ->exchange(1)) {
- return false;
- }
- return control_->InterruptPeer();
-}
-
-// Wait for an interrupt from our peer
-void vsoc::RegionView::WaitForInterrupt() {
- while (1) {
- if (region_offset_to_pointer<std::atomic<uint32_t>>(
- incoming_signal_table().interrupt_signalled_offset)
- ->exchange(0)) {
- return;
- }
- control_->WaitForInterrupt();
- }
-}
-
-void vsoc::RegionView::ProcessSignalsFromPeer(
- std::function<void(uint32_t)> signal_handler) {
- const vsoc_signal_table_layout& table = incoming_signal_table();
- const size_t num_offsets = (1 << table.num_nodes_lg2);
- std::atomic<uint32_t>* offsets =
- region_offset_to_pointer<std::atomic<uint32_t>>(
- table.futex_uaddr_table_offset);
- for (size_t i = 0; i < num_offsets; ++i) {
- uint32_t raw_offset = offsets[i].exchange(0);
- if (raw_offset) {
- bool round_trip = raw_offset & UADDR_OFFSET_ROUND_TRIP_FLAG;
- uint32_t offset = raw_offset & UADDR_OFFSET_MASK;
- signal_handler(offset);
- if (round_trip) {
- SendSignalToPeer(
- region_offset_to_pointer<std::atomic<uint32_t>>(offset), false);
- }
- }
- }
-}
-
-void vsoc::RegionView::SendSignal(Sides sides_to_signal,
- std::atomic<uint32_t>* uaddr) {
- if (sides_to_signal & Sides::Peer) {
- // If we should also be signalling our side set the round trip flag on
- // the futex signal.
- bool round_trip = sides_to_signal & Sides::OurSide;
- SendSignalToPeer(uaddr, round_trip);
- // Return without signaling our waiters to give the other side a chance
- // to run.
- return;
- }
- if (sides_to_signal & Sides::OurSide) {
- control_->SignalSelf(pointer_to_region_offset(uaddr));
- }
-}
-
-void vsoc::RegionView::SendSignalToPeer(std::atomic<uint32_t>* uaddr,
- bool round_trip) {
- const vsoc_signal_table_layout& table = outgoing_signal_table();
- std::atomic<uint32_t>* offsets =
- region_offset_to_pointer<std::atomic<uint32_t>>(
- table.futex_uaddr_table_offset);
- // maximum index in the node that can hold an offset;
- const size_t max_index = (1 << table.num_nodes_lg2) - 1;
- uint32_t offset = pointer_to_region_offset(uaddr);
- if (offset & ~UADDR_OFFSET_MASK) {
- LOG(FATAL) << "uaddr offset is not naturally aligned " << uaddr;
- }
- // Guess at where this offset should go in the table.
- // Do this before we set the round-trip flag.
- size_t hash = (offset >> 2) & max_index;
- if (round_trip) {
- offset |= UADDR_OFFSET_ROUND_TRIP_FLAG;
- }
- while (1) {
- uint32_t expected = 0;
- if (offsets[hash].compare_exchange_strong(expected, offset)) {
- // We stored the offset. Send the interrupt.
- this->MaybeInterruptPeer();
- break;
- }
- // We didn't store, but the value was already in the table with our flag.
- // Return without interrupting.
- if (expected == offset) {
- return;
- }
- // Hash collision. Try again in a different node
- if ((expected & UADDR_OFFSET_MASK) != (offset & UADDR_OFFSET_MASK)) {
- hash = (hash + 1) & max_index;
- continue;
- }
- // Our offset was in the bucket, but the flags didn't match.
- // We're done if the value in the node had the round trip flag set.
- if (expected & UADDR_OFFSET_ROUND_TRIP_FLAG) {
- return;
- }
- // We wanted the round trip flag, but the value in the bucket didn't set it.
- // Do a second swap to try to set it.
- if (offsets[hash].compare_exchange_strong(expected, offset)) {
- // It worked. We're done.
- return;
- }
- if (expected == offset) {
- // expected was the offset without the flag. After the swap it has the
- // the flag. This means that some other thread set the flag, so
- // we're done.
- return;
- }
- // Something about the offset changed. We need to go around again, because:
- // our peer processed the old entry
- // another thread may have stolen the node while we were distracted
- }
-}
-
-std::unique_ptr<vsoc::RegionWorker> vsoc::RegionView::StartWorker() {
- std::unique_ptr<vsoc::RegionWorker> worker(
- new vsoc::RegionWorker(this /* region */, control_));
-
- worker->start();
- return worker;
-}
-
-int vsoc::RegionView::WaitForSignal(std::atomic<uint32_t>* uaddr,
- uint32_t expected_value) {
- return control_->WaitForSignal(pointer_to_region_offset(uaddr),
- expected_value);
-}
diff --git a/common/vsoc/lib/region_view.h b/common/vsoc/lib/region_view.h
deleted file mode 100644
index 055f721..0000000
--- a/common/vsoc/lib/region_view.h
+++ /dev/null
@@ -1,214 +0,0 @@
-#pragma once
-
-/*
- * 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.
- */
-
-// Object that represents a region on the Host
-
-#include <stdlib.h>
-#include <sys/mman.h>
-#include <atomic>
-#include <cstdint>
-
-#include <functional>
-#include <map>
-#include <thread>
-
-#include "common/libs/fs/shared_fd.h"
-#include "common/libs/glog/logging.h"
-#include "common/vsoc/lib/lock_guard.h"
-#include "common/vsoc/lib/region_control.h"
-#include "common/vsoc/lib/region_signaling_interface.h"
-#include "common/vsoc/shm/base.h"
-#include "uapi/vsoc_shm.h"
-
-namespace vsoc {
-
-class RegionControl;
-class RegionView;
-
-/**
- * Represents a task that is tied to a RegionView.
- *
- * This is currently used for the task that forwards futexes across the
- * shared memory window.
- */
-class RegionWorker {
- public:
- RegionWorker(RegionView* region, std::shared_ptr<RegionControl> control);
- ~RegionWorker();
-
- void start();
-
- void Work();
-
- protected:
- std::shared_ptr<RegionControl> control_;
- RegionView* region_;
- std::thread thread_;
- volatile bool stopping_;
-};
-
-/**
- * Base class to access a mapped region in VSoC shared memory.
- * This class holds the methods that depends on the region's memory having an
- * address. The RegionControl class holds the methods that can be invoked
- * without mapping the region.
- */
-class RegionView : public RegionSignalingInterface {
- public:
- virtual ~RegionView();
-
-#if defined(CUTTLEFISH_HOST)
- bool Open(const char* region_name, const char* domain);
-#else
- bool Open(const char* region_name);
-#endif
-
- // Returns a pointer to the table that will be scanned for signals
- const vsoc_signal_table_layout& incoming_signal_table();
-
- // Returns a pointer to the table that will be used to post signals
- const vsoc_signal_table_layout& outgoing_signal_table();
-
- // Returns true iff an interrupt is queued in the signal table
- bool HasIncomingInterrupt() {
- return *region_offset_to_pointer<std::atomic<uint32_t>>(
- incoming_signal_table().interrupt_signalled_offset);
- }
-
- // Wake any threads waiting for an interrupt. This is generally used during
- // shutdown.
- void InterruptSelf() { control_->InterruptSelf(); }
-
- // Interrupt our peer if an interrupt is not already on the way.
- // Returns true if the interrupt was sent, false if an interrupt was already
- // pending.
- bool MaybeInterruptPeer();
-
- // Scan in the incoming signal table, issuing futex calls for any posted
- // signals and then reposting them to the peer if they were round-trip
- // signals.
- //
- // signal_handler: An action to perform on every offset signalled by our
- // peer, usually a FUTEX_WAKE call, but can be customized for other
- // purposes.
- void ProcessSignalsFromPeer(
- std::function<void(uint32_t)> signal_handler);
-
- // Post a signal to the guest, the host, or both.
- // See futex(2) FUTEX_WAKE for details.
- //
- // sides_to_signal: controls where the signal is sent
- //
- // signal_addr: the memory location to signal. Must be within the region.
- void SendSignal(layout::Sides sides_to_signal,
- std::atomic<uint32_t>* signal_addr);
-
- // Post a signal to our peer for a specific memeory location.
- // See futex(2) FUTEX_WAKE for details.
- //
- // signal_addr: the memory location to signal. Must be within the region.
- //
- // round_trip: true if there may be waiters on both sides of the shared
- // memory.
- void SendSignalToPeer(std::atomic<uint32_t>* signal_addr, bool round_trip);
-
- // Waits until an interrupt appears on this region, then clears the
- // interrupted flag and returns.
- void WaitForInterrupt();
-
- // This implements the following:
- // if (*signal_addr == last_observed_value)
- // wait_for_signal_at(signal_addr);
- //
- // Note: the caller still needs to check the value at signal_addr because
- // this function may return early for reasons that are implementation-defined.
- // See futex(2) FUTEX_WAIT for details.
- //
- // signal_addr: the memory that will be signaled. Must be within the region.
- //
- // last_observed_value: the value that motivated the calling code to wait.
- //
- // The return value is -1 on error. On the guest positive values give the
- // number of false wakes.
- int WaitForSignal(std::atomic<uint32_t>* signal_addr,
- uint32_t last_observed_value) override;
-
- // Starts the signal table scanner. This must be invoked by subclasses, which
- // MUST store the returned unique_ptr as a class member.
- __attribute__((warn_unused_result))
- std::unique_ptr<RegionWorker> StartWorker();
-
- // Returns a pointer to the start of region data that is cast to the given
- // type. Initializers that run in the launcher use this to get a typed view
- // of the region. Most other cases should be handled via TypedRegionView.
- template <typename LayoutType>
- LayoutType* GetLayoutPointer() {
- return this->region_offset_to_pointer<LayoutType>(
- control_->region_desc().offset_of_region_data);
- }
-
- // Helper functions for lock guards. This approach has two advantages:
- //
- // o Callers don't have to be refactored when lock types change
- // o The region pointer can be provided automatically
- template <typename T>
- LockGuard<T> make_lock_guard(T* lock) {
- return LockGuard<T>(lock);
- }
-
- LockGuard<::vsoc::layout::GuestAndHostLock> make_lock_guard(
- ::vsoc::layout::GuestAndHostLock* l) {
- return LockGuard<::vsoc::layout::GuestAndHostLock>(l, this);
- }
-
- protected:
- template <typename T>
- T* region_offset_to_pointer(uint32_t offset) {
- return control_->region_offset_to_pointer<T>(offset);
- }
-
- template <typename T>
- const T& region_offset_to_reference(uint32_t offset) const {
- if (offset > control_->region_size()) {
- LOG(FATAL) << __FUNCTION__ << ": " << offset << " not in region @"
- << region_base_;
- }
- return *reinterpret_cast<const T*>(
- reinterpret_cast<uintptr_t>(region_base_) + offset);
- }
-
- // Calculates an offset based on a pointer in the region. Crashes if the
- // pointer isn't in the region.
- // This is mostly for the RegionView's internal plumbing. Use TypedRegionView
- // and RegionLayout to avoid this in most cases.
- template <typename T>
- uint32_t pointer_to_region_offset(T* ptr) const {
- uint32_t rval = reinterpret_cast<uintptr_t>(ptr) -
- reinterpret_cast<uintptr_t>(region_base_);
- if (rval > control_->region_size()) {
- LOG(FATAL) << __FUNCTION__ << ": " << ptr << " not in region @"
- << region_base_;
- }
- return rval;
- }
-
- std::shared_ptr<RegionControl> control_;
- void* region_base_{};
-};
-
-} // namespace vsoc
diff --git a/common/vsoc/lib/screen_layout.cpp b/common/vsoc/lib/screen_layout.cpp
deleted file mode 100644
index d302030..0000000
--- a/common/vsoc/lib/screen_layout.cpp
+++ /dev/null
@@ -1,27 +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/shm/screen_layout.h"
-
-namespace vsoc {
-namespace layout {
-
-namespace screen {
-
-const char* ScreenLayout::region_name = "screen";
-
-} // namespace screen
-} // namespace layout
-} // namespace vsoc
diff --git a/common/vsoc/lib/screen_region_view.cpp b/common/vsoc/lib/screen_region_view.cpp
deleted file mode 100644
index 2a22335..0000000
--- a/common/vsoc/lib/screen_region_view.cpp
+++ /dev/null
@@ -1,94 +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/screen_region_view.h"
-
-#include <memory>
-
-#include "common/libs/glog/logging.h"
-#include "common/vsoc/lib/lock_guard.h"
-
-using vsoc::layout::screen::CompositionStats;
-using vsoc::screen::ScreenRegionView;
-
-const uint8_t* ScreenRegionView::first_buffer() const {
- // TODO(jemoreira): Add alignments?
- return &(this->data().buffer[0]);
-}
-
-int ScreenRegionView::number_of_buffers() const {
- auto offset_of_first_buffer =
- const_cast<ScreenRegionView*>(this)->pointer_to_region_offset(
- this->first_buffer());
- size_t total_buffer_size = control_->region_size() - offset_of_first_buffer;
- return total_buffer_size / buffer_size();
-}
-
-void* ScreenRegionView::GetBuffer(int buffer_idx) {
- uint8_t* buffer = const_cast<uint8_t*>(this->first_buffer());
- return buffer + buffer_idx * this->buffer_size();
-}
-
-// We can use a locking protocol because we decided that the streamer should
-// have more priority than the hwcomposer, so it's OK to block the hwcomposer
-// waiting for the streamer to complete, while the streamer will only block on
-// the hwcomposer when it has ran out of work to do and needs to get more from
-// the hwcomposer.
-void ScreenRegionView::BroadcastNewFrame(int buffer_idx,
- const CompositionStats* stats) {
- {
- if (buffer_idx < 0 || buffer_idx >= number_of_buffers()) {
- LOG(ERROR) << "Attempting to broadcast an invalid buffer index: "
- << buffer_idx;
- return;
- }
- auto lock_guard(make_lock_guard(&data()->bcast_lock));
- data()->seq_num++;
- data()->buffer_index = static_cast<int32_t>(buffer_idx);
- if (stats) {
- data()->stats = *stats;
- }
- }
- // Signaling after releasing the lock may cause spurious wake ups.
- // Signaling while holding the lock may cause the just-awaken listener to
- // block immediately trying to acquire the lock.
- // The former is less costly and slightly less likely to happen.
- SendSignal(layout::Sides::Both, &data()->seq_num);
-}
-
-int ScreenRegionView::WaitForNewFrameSince(uint32_t* last_seq_num,
- CompositionStats* stats) {
- static std::unique_ptr<RegionWorker> worker = StartWorker();
- // It's ok to read seq_num here without holding the lock because the lock will
- // be acquired immediately after so we'll block if necessary to wait for the
- // critical section in BroadcastNewFrame to complete.
- // Also, the call to WaitForSignal receives a pointer to seq_num (so the
- // compiler should not optimize it out) and includes a memory barrier
- // (FUTEX_WAIT).
- while (data()->seq_num == *last_seq_num) {
- // Don't hold the lock when waiting for a signal, will deadlock.
- WaitForSignal(&data()->seq_num, *last_seq_num);
- }
-
- {
- auto lock_guard(make_lock_guard(&data()->bcast_lock));
- *last_seq_num = data()->seq_num;
- if (stats) {
- *stats = data()->stats;
- }
- return static_cast<int>(data()->buffer_index);
- }
-}
diff --git a/common/vsoc/lib/screen_region_view.h b/common/vsoc/lib/screen_region_view.h
deleted file mode 100644
index aef4359..0000000
--- a/common/vsoc/lib/screen_region_view.h
+++ /dev/null
@@ -1,104 +0,0 @@
-#pragma once
-/*
- * 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 <memory>
-
-#include "common/vsoc/lib/typed_region_view.h"
-#include "common/vsoc/shm/graphics.h"
-#include "common/vsoc/shm/screen_layout.h"
-#include "uapi/vsoc_shm.h"
-
-namespace vsoc {
-namespace screen {
-
-// Provides information related to the device's screen. Allows to query screen
-// properties such as resolution and dpi, as well as subscribe/notify to/of
-// changes on the screen contents. It also holds the contents of the display.
-class ScreenRegionView
- : public vsoc::TypedRegionView<ScreenRegionView,
- vsoc::layout::screen::ScreenLayout> {
- public:
- static int align(int input) {
- auto constexpr alignment = 16;
- return (input + alignment - 1) & -alignment;
- }
-
- // Screen width in pixels
- int x_res() const { return data().x_res; }
-
- // Screen height in pixels
- int y_res() const { return data().y_res; }
-
- // Dots per inch
- int dpi() const { return data().dpi; }
-
- // Refresh rate in Hertz
- int refresh_rate_hz() const { return data().refresh_rate_hz; }
-
- uint32_t pixel_format() const { return kFbPixelFormat; }
-
- uint32_t bytes_per_pixel() const {
- return vsoc::PixelFormatProperties<kFbPixelFormat>::bytes_per_pixel;
- }
-
- int line_length() const { return align(x_res() * bytes_per_pixel()); }
-
- size_t buffer_size() const {
- return (align(x_res() * bytes_per_pixel()) * y_res()) + kSwiftShaderPadding;
- }
-
- int number_of_buffers() const;
-
- // Gets a pointer to the beginning of a buffer. Does not perform any bound
- // checks on the index.
- void* GetBuffer(int buffer_idx);
-
- // Broadcasts a new frame.
- // buffer_idx is the index of the buffer containing the composed screen, it's
- // a number in the range [0, number_of_buffers() - 1].
- // Stats holds performance information of the last composition, can be null.
- void BroadcastNewFrame(
- int buffer_idx,
- const vsoc::layout::screen::CompositionStats* stats = nullptr);
-
- // Waits for a new frame (one with a different seq_num than last one we saw).
- // Returns the index of the buffer containing the new frame or a negative
- // number if there was an error, stores the new sequential number in
- // *last_seq_num. The frame sequential numbers will be provided by the
- // hwcomposer and expected to increase monotonically over time (though it's
- // not a hard requirement), this numbers are guaranteed to be non-zero when a
- // valid frame is available. Performance statistics are returned through the
- // stats parameter when it's not null.
- int WaitForNewFrameSince(
- uint32_t* last_seq_num,
- vsoc::layout::screen::CompositionStats* stats = nullptr);
-
- using Pixel = uint32_t;
- static constexpr int kSwiftShaderPadding = 4;
- static constexpr int kRedShift = 0;
- static constexpr int kGreenShift = 8;
- static constexpr int kBlueShift = 16;
- static constexpr int kRedBits = 8;
- static constexpr int kGreenBits = 8;
- static constexpr int kBlueBits = 8;
- static constexpr uint32_t kFbPixelFormat = vsoc::VSOC_PIXEL_FORMAT_RGBA_8888;
-
- protected:
- const uint8_t* first_buffer() const;
-};
-} // namespace screen
-} // namespace vsoc
diff --git a/common/vsoc/lib/screen_region_view_test.cpp b/common/vsoc/lib/screen_region_view_test.cpp
deleted file mode 100644
index cc02baa..0000000
--- a/common/vsoc/lib/screen_region_view_test.cpp
+++ /dev/null
@@ -1,42 +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 "screen_region_view.h"
-#include "host/libs/config/cuttlefish_config.h"
-#include <stdio.h>
-
-using vsoc::screen::ScreenRegionView;
-
-int main() {
- uint32_t frame_num = 0;
- int buffer_id = 0;
-
-#if defined(CUTTLEFISH_HOST)
- auto region = ScreenRegionView::GetInstance(vsoc::GetDomain().c_str());
-#else
- auto region = ScreenRegionView::GetInstance();
-#endif
- if (!region) {
- fprintf(stderr, "Error opening region\n");
- return 1;
- }
-
- while (1) {
- buffer_id = region->WaitForNewFrameSince(&frame_num);
- printf("Signaled frame_num = %d, buffer_id = %d\n", frame_num, buffer_id);
- }
-
- return 0;
-}
diff --git a/common/vsoc/lib/single_sided_signal.h b/common/vsoc/lib/single_sided_signal.h
deleted file mode 100644
index a40c792..0000000
--- a/common/vsoc/lib/single_sided_signal.h
+++ /dev/null
@@ -1,50 +0,0 @@
-#pragma once
-
-/*
- * 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 <unistd.h>
-#include <linux/futex.h>
-#include <sys/syscall.h>
-
-
-// Signaling mechanism that allows threads to signal changes to shared
-// memory and to wait for signals.
-
-namespace vsoc {
-/**
- * Defines the strategy for signaling among threads on a single kernel.
- */
-namespace SingleSidedSignal {
-/**
- * Waits for a signal, assuming the the word at addr matches expected_state.
- * Will return immediately if the value does not match.
- * Callers must be equipped to cope with spurious returns.
- */
-static void AwaitSignal(uint32_t expected_state, uint32_t* uaddr) {
- syscall(SYS_futex, uaddr, FUTEX_WAIT, expected_state, nullptr, nullptr, 0);
-}
-
-/**
- * Sends a signal to every thread in AwaitSignal() using the address in
- * uaddr.
- */
-static void Signal(std::atomic<uint32_t>* uaddr) {
- syscall(SYS_futex, reinterpret_cast<int32_t*>(uaddr), FUTEX_WAKE, -1, nullptr,
- nullptr, 0);
-}
-} // namespace SingleSidedSignal
-} // namespace vsoc
diff --git a/common/vsoc/lib/socket_forward_layout.cpp b/common/vsoc/lib/socket_forward_layout.cpp
deleted file mode 100644
index 299ef70..0000000
--- a/common/vsoc/lib/socket_forward_layout.cpp
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (C) 2018 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/shm/socket_forward_layout.h"
-
-const char* vsoc::layout::socket_forward::SocketForwardLayout::region_name =
- "socket_forward";
diff --git a/common/vsoc/lib/socket_forward_region_view.cpp b/common/vsoc/lib/socket_forward_region_view.cpp
deleted file mode 100644
index 2dbd2e8..0000000
--- a/common/vsoc/lib/socket_forward_region_view.cpp
+++ /dev/null
@@ -1,250 +0,0 @@
-/*
- * Copyright (C) 2018 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 <cassert>
-
-#include "common/vsoc/lib/circqueue_impl.h"
-#include "common/vsoc/lib/lock_guard.h"
-#include "common/vsoc/lib/socket_forward_region_view.h"
-#include "common/vsoc/shm/lock.h"
-#include "common/vsoc/shm/socket_forward_layout.h"
-
-using vsoc::layout::socket_forward::Queue;
-using vsoc::layout::socket_forward::QueuePair;
-// store the read and write direction as variables to keep the ifdefs and macros
-// in later code to a minimum
-constexpr auto ReadDirection = &QueuePair::
-#ifdef CUTTLEFISH_HOST
- guest_to_host;
-#else
- host_to_guest;
-#endif
-
-constexpr auto WriteDirection = &QueuePair::
-#ifdef CUTTLEFISH_HOST
- host_to_guest;
-#else
- guest_to_host;
-#endif
-
-using vsoc::socket_forward::SocketForwardRegionView;
-
-vsoc::socket_forward::Packet vsoc::socket_forward::Packet::MakeBegin(
- std::uint16_t port) {
- auto packet = MakePacket(Header::BEGIN);
- std::memcpy(packet.payload(), &port, sizeof port);
- packet.set_payload_length(sizeof port);
- return packet;
-}
-
-void SocketForwardRegionView::Recv(int connection_id, Packet* packet) {
- CHECK(packet != nullptr);
- do {
- (data()->queues_[connection_id].*ReadDirection)
- .queue.Read(this, reinterpret_cast<char*>(packet), sizeof *packet);
- } while (packet->IsBegin());
- CHECK(!packet->empty()) << "zero-size data message received";
- CHECK_LE(packet->payload_length(), kMaxPayloadSize) << "invalid size";
-}
-
-bool SocketForwardRegionView::Send(int connection_id, const Packet& packet) {
- CHECK(!packet.empty());
- CHECK_LE(packet.payload_length(), kMaxPayloadSize);
-
- (data()->queues_[connection_id].*WriteDirection)
- .queue.Write(this, packet.raw_data(), packet.raw_data_length());
- return true;
-}
-
-int SocketForwardRegionView::IgnoreUntilBegin(int connection_id) {
- Packet packet{};
- do {
- (data()->queues_[connection_id].*ReadDirection)
- .queue.Read(this, reinterpret_cast<char*>(&packet), sizeof packet);
- } while (!packet.IsBegin());
- return packet.port();
-}
-
-constexpr int kNumQueues =
- static_cast<int>(vsoc::layout::socket_forward::kNumQueues);
-
-void SocketForwardRegionView::CleanUpPreviousConnections() {
- data()->Recover();
-
- static constexpr auto kRestartPacket = Packet::MakeRestart();
- for (int connection_id = 0; connection_id < kNumQueues; ++connection_id) {
- Send(connection_id, kRestartPacket);
- }
-}
-
-SocketForwardRegionView::ConnectionViewCollection
-SocketForwardRegionView::AllConnections() {
- SocketForwardRegionView::ConnectionViewCollection all_queues;
- for (int connection_id = 0; connection_id < kNumQueues; ++connection_id) {
- all_queues.emplace_back(this, connection_id);
- }
- return all_queues;
-}
-
-// --- Connection ---- //
-
-void SocketForwardRegionView::ShmConnectionView::Receiver::Recv(Packet* packet) {
- std::unique_lock<std::mutex> guard(receive_thread_data_lock_);
- while (received_packet_free_) {
- receive_thread_data_cv_.wait(guard);
- }
- CHECK(received_packet_.IsData());
- *packet = received_packet_;
- received_packet_free_ = true;
- receive_thread_data_cv_.notify_one();
-}
-
-bool SocketForwardRegionView::ShmConnectionView::Receiver::GotRecvClosed() const {
- return received_packet_.IsRecvClosed() || (received_packet_.IsRestart()
-#ifdef CUTTLEFISH_HOST
- && saw_data_
-#endif
- );
-}
-
-bool SocketForwardRegionView::ShmConnectionView::Receiver::ShouldReceiveAnotherPacket() const {
- return (received_packet_.IsRecvClosed() && !saw_end_) ||
- (saw_end_ && received_packet_.IsEnd())
-#ifdef CUTTLEFISH_HOST
- || (received_packet_.IsRestart() && !saw_data_) ||
- (received_packet_.IsBegin())
-#endif
- ;
-}
-
-void SocketForwardRegionView::ShmConnectionView::Receiver::ReceivePacket() {
- view_->region_view()->Recv(view_->connection_id(), &received_packet_);
-}
-
-void SocketForwardRegionView::ShmConnectionView::Receiver::CheckPacketForRecvClosed() {
- if (GotRecvClosed()) {
- saw_recv_closed_ = true;
- view_->MarkOtherSideRecvClosed();
- }
-#ifdef CUTTLEFISH_HOST
- if (received_packet_.IsData()) {
- saw_data_ = true;
- }
-#endif
-}
-
-void SocketForwardRegionView::ShmConnectionView::Receiver::CheckPacketForEnd() {
- if (received_packet_.IsEnd() || received_packet_.IsRestart()) {
- CHECK(!saw_end_ || received_packet_.IsRestart());
- saw_end_ = true;
- }
-}
-
-
-bool SocketForwardRegionView::ShmConnectionView::Receiver::ExpectMorePackets() const {
- return !saw_recv_closed_ || !saw_end_;
-}
-
-void SocketForwardRegionView::ShmConnectionView::Receiver::UpdatePacketAndSignalAvailable() {
- if (!received_packet_.IsData()) {
- static constexpr auto kEmptyPacket = Packet::MakeData();
- received_packet_ = kEmptyPacket;
- }
- received_packet_free_ = false;
- receive_thread_data_cv_.notify_one();
-}
-
-void SocketForwardRegionView::ShmConnectionView::Receiver::Start() {
- while (ExpectMorePackets()) {
- std::unique_lock<std::mutex> guard(receive_thread_data_lock_);
- while (!received_packet_free_) {
- receive_thread_data_cv_.wait(guard);
- }
-
- do {
- ReceivePacket();
- CheckPacketForRecvClosed();
- } while (ShouldReceiveAnotherPacket());
-
- if (received_packet_.empty()) {
- LOG(ERROR) << "Received empty packet.";
- }
-
- CheckPacketForEnd();
-
- UpdatePacketAndSignalAvailable();
- }
-}
-
-auto SocketForwardRegionView::ShmConnectionView::ResetAndConnect()
- -> ShmSenderReceiverPair {
- if (receiver_) {
- receiver_->Join();
- }
-
- {
- std::lock_guard<std::mutex> guard(*other_side_receive_closed_lock_);
- other_side_receive_closed_ = false;
- }
-
-#ifdef CUTTLEFISH_HOST
- region_view()->IgnoreUntilBegin(connection_id());
- region_view()->Send(connection_id(), Packet::MakeBegin(port_));
-#else
- region_view()->Send(connection_id(), Packet::MakeBegin(port_));
- port_ =
- region_view()->IgnoreUntilBegin(connection_id());
-#endif
-
- receiver_.reset(new Receiver{this});
- return {ShmSender{this}, ShmReceiver{this}};
-}
-
-#ifdef CUTTLEFISH_HOST
-auto SocketForwardRegionView::ShmConnectionView::EstablishConnection(int port)
- -> ShmSenderReceiverPair {
- port_ = port;
- return ResetAndConnect();
-}
-#else
-auto SocketForwardRegionView::ShmConnectionView::WaitForNewConnection()
- -> ShmSenderReceiverPair {
- port_ = 0;
- return ResetAndConnect();
-}
-#endif
-
-bool SocketForwardRegionView::ShmConnectionView::Send(const Packet& packet) {
- if (packet.empty()) {
- LOG(ERROR) << "Sending empty packet";
- }
- if (packet.IsData() && IsOtherSideRecvClosed()) {
- return false;
- }
- return region_view()->Send(connection_id(), packet);
-}
-
-void SocketForwardRegionView::ShmConnectionView::Recv(Packet* packet) {
- receiver_->Recv(packet);
-}
-
-void SocketForwardRegionView::ShmReceiver::Recv(Packet* packet) {
- view_->Recv(packet);
-}
-
-bool SocketForwardRegionView::ShmSender::Send(const Packet& packet) {
- return view_->Send(packet);
-}
diff --git a/common/vsoc/lib/socket_forward_region_view.h b/common/vsoc/lib/socket_forward_region_view.h
deleted file mode 100644
index c41517b..0000000
--- a/common/vsoc/lib/socket_forward_region_view.h
+++ /dev/null
@@ -1,316 +0,0 @@
-/*
- * Copyright (C) 2018 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.
- */
-#pragma once
-
-#include <cstdlib>
-#include <utility>
-#include <vector>
-#include <memory>
-
-#include "common/vsoc/lib/typed_region_view.h"
-#include "common/vsoc/shm/socket_forward_layout.h"
-
-namespace vsoc {
-namespace socket_forward {
-
-struct Header {
- std::uint32_t payload_length;
- enum MessageType : std::uint32_t {
- DATA = 0,
- BEGIN,
- END,
- RECV_CLOSED, // indicate that this side's receive end is closed
- RESTART,
- };
- MessageType message_type;
-};
-
-constexpr std::size_t kMaxPayloadSize =
- layout::socket_forward::kMaxPacketSize - sizeof(Header);
-
-struct Packet {
- private:
- Header header_;
- using Payload = char[kMaxPayloadSize];
- Payload payload_data_;
-
- static constexpr Packet MakePacket(Header::MessageType type) {
- Packet packet{};
- packet.header_.message_type = type;
- return packet;
- }
-
- public:
- // port is only revelant on the host-side.
- static Packet MakeBegin(std::uint16_t port);
-
- static constexpr Packet MakeEnd() { return MakePacket(Header::END); }
-
- static constexpr Packet MakeRecvClosed() {
- return MakePacket(Header::RECV_CLOSED);
- }
-
- static constexpr Packet MakeRestart() { return MakePacket(Header::RESTART); }
-
- // NOTE payload and payload_length must still be set.
- static constexpr Packet MakeData() { return MakePacket(Header::DATA); }
-
- bool empty() const { return IsData() && header_.payload_length == 0; }
-
- void set_payload_length(std::uint32_t length) {
- CHECK_LE(length, sizeof payload_data_);
- header_.payload_length = length;
- }
-
- Payload& payload() { return payload_data_; }
-
- const Payload& payload() const { return payload_data_; }
-
- constexpr std::uint32_t payload_length() const {
- return header_.payload_length;
- }
-
- constexpr bool IsBegin() const {
- return header_.message_type == Header::BEGIN;
- }
-
- constexpr bool IsEnd() const { return header_.message_type == Header::END; }
-
- constexpr bool IsData() const { return header_.message_type == Header::DATA; }
-
- constexpr bool IsRecvClosed() const {
- return header_.message_type == Header::RECV_CLOSED;
- }
-
- constexpr bool IsRestart() const {
- return header_.message_type == Header::RESTART;
- }
-
- constexpr std::uint16_t port() const {
- CHECK(IsBegin());
- std::uint16_t port_number{};
- CHECK_EQ(payload_length(), sizeof port_number);
- std::memcpy(&port_number, payload(), sizeof port_number);
- return port_number;
- }
-
- char* raw_data() { return reinterpret_cast<char*>(this); }
-
- const char* raw_data() const { return reinterpret_cast<const char*>(this); }
-
- constexpr size_t raw_data_length() const {
- return payload_length() + sizeof header_;
- }
-};
-
-static_assert(sizeof(Packet) == layout::socket_forward::kMaxPacketSize, "");
-static_assert(std::is_pod<Packet>{}, "");
-
-// Data sent will start with a uint32_t indicating the number of bytes being
-// sent, followed be the data itself
-class SocketForwardRegionView
- : public TypedRegionView<SocketForwardRegionView,
- layout::socket_forward::SocketForwardLayout> {
- private:
- // Returns an empty data packet if the other side is closed.
- void Recv(int connection_id, Packet* packet);
- // Returns true on success
- bool Send(int connection_id, const Packet& packet);
-
- // skip everything in the connection queue until seeing a BEGIN packet.
- // returns port from begin packet.
- int IgnoreUntilBegin(int connection_id);
-
- public:
- class ShmSender;
- class ShmReceiver;
-
- using ShmSenderReceiverPair = std::pair<ShmSender, ShmReceiver>;
-
- class ShmConnectionView {
- public:
- ShmConnectionView(SocketForwardRegionView* region_view, int connection_id)
- : region_view_{region_view}, connection_id_{connection_id} {}
-
-#ifdef CUTTLEFISH_HOST
- ShmSenderReceiverPair EstablishConnection(int port);
-#else
- // Should not be called while there is an active ShmSender or ShmReceiver
- // for this connection.
- ShmSenderReceiverPair WaitForNewConnection();
-#endif
-
- int port() const { return port_; }
-
- bool Send(const Packet& packet);
- void Recv(Packet* packet);
-
- ShmConnectionView(const ShmConnectionView&) = delete;
- ShmConnectionView& operator=(const ShmConnectionView&) = delete;
-
- // Moving invalidates all existing ShmSenders and ShmReceiver
- ShmConnectionView(ShmConnectionView&&) = default;
- ShmConnectionView& operator=(ShmConnectionView&&) = default;
- ~ShmConnectionView() = default;
-
- // NOTE should only be used for debugging/logging purposes.
- // connection_ids are an implementation detail that are currently useful for
- // debugging, but may go away in the future.
- int connection_id() const { return connection_id_; }
-
- private:
- SocketForwardRegionView* region_view() const { return region_view_; }
-
- bool IsOtherSideRecvClosed() {
- std::lock_guard<std::mutex> guard(*other_side_receive_closed_lock_);
- return other_side_receive_closed_;
- }
-
- void MarkOtherSideRecvClosed() {
- std::lock_guard<std::mutex> guard(*other_side_receive_closed_lock_);
- other_side_receive_closed_ = true;
- }
-
- void ReceiverThread();
- ShmSenderReceiverPair ResetAndConnect();
-
- class Receiver {
- public:
- Receiver(ShmConnectionView* view)
- : view_{view}
- {
- receiver_thread_ = std::thread([this] { Start(); });
- }
-
- void Recv(Packet* packet);
-
- void Join() { receiver_thread_.join(); }
-
- Receiver(const Receiver&) = delete;
- Receiver& operator=(const Receiver&) = delete;
-
- ~Receiver() = default;
- private:
- void Start();
- bool GotRecvClosed() const;
- void ReceivePacket();
- void CheckPacketForRecvClosed();
- void CheckPacketForEnd();
- void UpdatePacketAndSignalAvailable();
- bool ShouldReceiveAnotherPacket() const;
- bool ExpectMorePackets() const;
-
- std::mutex receive_thread_data_lock_;
- std::condition_variable receive_thread_data_cv_;
- bool received_packet_free_ = true;
- Packet received_packet_{};
-
- ShmConnectionView* view_{};
- bool saw_recv_closed_ = false;
- bool saw_end_ = false;
-#ifdef CUTTLEFISH_HOST
- bool saw_data_ = false;
-#endif
-
- std::thread receiver_thread_;
- };
-
- SocketForwardRegionView* region_view_{};
- int connection_id_ = -1;
- int port_ = -1;
-
- std::unique_ptr<std::mutex> other_side_receive_closed_lock_ =
- std::unique_ptr<std::mutex>{new std::mutex{}};
- bool other_side_receive_closed_ = false;
-
- std::unique_ptr<Receiver> receiver_;
- };
-
- class ShmSender {
- public:
- explicit ShmSender(ShmConnectionView* view) : view_{view} {}
-
- ShmSender(const ShmSender&) = delete;
- ShmSender& operator=(const ShmSender&) = delete;
-
- ShmSender(ShmSender&&) = default;
- ShmSender& operator=(ShmSender&&) = default;
- ~ShmSender() = default;
-
- // Returns true on success
- bool Send(const Packet& packet);
-
- private:
- struct EndSender {
- void operator()(ShmConnectionView* view) const {
- if (view) {
- view->Send(Packet::MakeEnd());
- }
- }
- };
-
- // Doesn't actually own the View, responsible for sending the End
- // indicator and marking the sending side as disconnected.
- std::unique_ptr<ShmConnectionView, EndSender> view_;
- };
-
- class ShmReceiver {
- public:
- explicit ShmReceiver(ShmConnectionView* view) : view_{view} {}
- ShmReceiver(const ShmReceiver&) = delete;
- ShmReceiver& operator=(const ShmReceiver&) = delete;
-
- ShmReceiver(ShmReceiver&&) = default;
- ShmReceiver& operator=(ShmReceiver&&) = default;
- ~ShmReceiver() = default;
-
- void Recv(Packet* packet);
-
- private:
- struct RecvClosedSender {
- void operator()(ShmConnectionView* view) const {
- if (view) {
- view->Send(Packet::MakeRecvClosed());
- }
- }
- };
-
- // Doesn't actually own the view, responsible for sending the RecvClosed
- // indicator
- std::unique_ptr<ShmConnectionView, RecvClosedSender> view_{};
- };
-
- friend ShmConnectionView;
-
- SocketForwardRegionView() = default;
- ~SocketForwardRegionView() = default;
- SocketForwardRegionView(const SocketForwardRegionView&) = delete;
- SocketForwardRegionView& operator=(const SocketForwardRegionView&) = delete;
-
- using ConnectionViewCollection = std::vector<ShmConnectionView>;
- ConnectionViewCollection AllConnections();
-
- int port(int connection_id);
- void CleanUpPreviousConnections();
-
- private:
-#ifndef CUTTLEFISH_HOST
- std::uint32_t last_seq_number_{};
-#endif
-};
-
-} // namespace socket_forward
-} // namespace vsoc
diff --git a/common/vsoc/lib/typed_region_view.h b/common/vsoc/lib/typed_region_view.h
deleted file mode 100644
index ead7412..0000000
--- a/common/vsoc/lib/typed_region_view.h
+++ /dev/null
@@ -1,104 +0,0 @@
-#pragma once
-
-/*
- * 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.
- */
-
-// Object that represents a region on the Host
-
-#include "common/vsoc/lib/region_view.h"
-
-#include <map>
-#include <mutex>
-#include <string>
-
-namespace vsoc {
-
-/**
- * This class adds methods that depend on the Region's type.
- * This may be directly constructed. However, it may be more effective to
- * subclass it, adding region-specific methods.
- *
- * Layout should be VSoC shared memory compatible, defined in common/vsoc/shm,
- * and should have a constant string region name.
- */
-template <typename ViewType, typename LayoutType>
-class TypedRegionView : public RegionView {
- public:
- using Layout = LayoutType;
-
- /* Returns a pointer to the region with a type that matches the layout */
- LayoutType* data() {
- return this->GetLayoutPointer<LayoutType>();
- }
-
- const LayoutType& data() const {
- return this->region_offset_to_reference<LayoutType>(
- control_->region_desc().offset_of_region_data);
- }
-
- protected:
-#if defined(CUTTLEFISH_HOST)
- bool Open(const char* domain) {
- return RegionView::Open(LayoutType::region_name, domain);
- }
-#else
- bool Open() {
- return RegionView::Open(LayoutType::region_name);
- }
-#endif
-
- public:
- // Implementation of the region singletons.
-#if defined(CUTTLEFISH_HOST)
- static ViewType* GetInstance(const char* domain) {
- static std::mutex mtx;
- static std::map<std::string, std::unique_ptr<ViewType>> instances;
- if (!domain) {
- return nullptr;
- }
- std::lock_guard<std::mutex> lock(mtx);
- // Get a reference to the actual unique_ptr that's stored in the map, if
- // there wasn't one it will be default constructed pointing to nullptr.
- auto& instance = instances[domain];
- if (!instance) {
- // Update the referenced pointer with the address of the newly created
- // region view.
- instance.reset(new ViewType{});
- if (!instance->Open(domain)) {
- instance.reset();
- }
- }
- return instance.get();
- }
-#else
- static ViewType* GetInstance() {
- static std::mutex mtx;
- static std::unique_ptr<ViewType> instance;
- std::lock_guard<std::mutex> lock(mtx);
- if (!instance) {
- instance.reset(new ViewType{});
- if (!instance->Open()) {
- instance.reset();
- }
- }
- return instance.get();
- }
-#endif
-
-
-};
-
-} // namespace vsoc
diff --git a/common/vsoc/lib/vsoc_audio_message.h b/common/vsoc/lib/vsoc_audio_message.h
deleted file mode 100644
index 230c4de..0000000
--- a/common/vsoc/lib/vsoc_audio_message.h
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * Copyright (C) 2016 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.
- */
-#pragma once
-
-#include <stdlib.h>
-#include <stdint.h>
-#include <time.h>
-
-#include <system/audio.h>
-
-typedef uint32_t size32_t;
-
-struct timespec32 {
- uint32_t tv_sec;
- uint32_t tv_nsec;
-
- timespec32() = default;
-
- timespec32(const timespec &from)
- : tv_sec(from.tv_sec),
- tv_nsec(from.tv_nsec) {
- }
-};
-
-struct gce_audio_message {
- static const size32_t kMaxAudioFrameLen = 65536;
- enum message_t {
- UNKNOWN = 0,
- DATA_SAMPLES = 1,
- OPEN_INPUT_STREAM = 2,
- OPEN_OUTPUT_STREAM = 3,
- CLOSE_INPUT_STREAM = 4,
- CLOSE_OUTPUT_STREAM = 5,
- CONTROL_PAUSE = 100
- };
- // Size of the header + data. Used to frame when we're on TCP.
- size32_t total_size;
- // Size of the audio header
- size32_t header_size;
- message_t message_type;
- // Identifier for the stream.
- uint32_t stream_number;
- // HAL assigned frame number, starts from 0.
- int64_t frame_num;
- // MONOTONIC_TIME when these frames were presented to the HAL.
- timespec32 time_presented;
- // Sample rate from the audio configuration.
- uint32_t frame_rate;
- // Channel mask from the audio configuration.
- audio_channel_mask_t channel_mask;
- // Format from the audio configuration.
- audio_format_t format;
- // Size of each frame in bytes.
- size32_t frame_size;
- // Number of frames that were presented to the HAL.
- size32_t num_frames_presented;
- // Number of frames that the HAL accepted.
- // For blocking audio this will be the same as num_frames.
- // For non-blocking audio this may be less.
- size32_t num_frames_accepted;
- // Count of the number of packets that were dropped because they would
- // have blocked the HAL or exceeded the maximum message size.
- size32_t num_packets_dropped;
- // Count of the number of packets that were shortened to fit within
- // kMaxAudioFrameLen.
- size32_t num_packets_shortened;
- // num_frames_presented (not num_frames_accepted) will follow here.
-
- gce_audio_message() :
- total_size(sizeof(gce_audio_message)),
- header_size(sizeof(gce_audio_message)),
- message_type(UNKNOWN),
- stream_number(0),
- frame_num(0),
- frame_rate(0),
- channel_mask(0),
- format(AUDIO_FORMAT_DEFAULT),
- frame_size(0),
- num_frames_presented(0),
- num_frames_accepted(0),
- num_packets_dropped(0),
- num_packets_shortened(0) {
- time_presented.tv_sec = 0;
- time_presented.tv_nsec = 0;
- }
-};
diff --git a/common/vsoc/lib/vsoc_memory.cpp b/common/vsoc/lib/vsoc_memory.cpp
deleted file mode 100644
index 017ab13..0000000
--- a/common/vsoc/lib/vsoc_memory.cpp
+++ /dev/null
@@ -1,194 +0,0 @@
-/*
- * Copyright (C) 2018 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/vsoc_memory.h"
-
-#include <string.h>
-#include <unistd.h>
-
-#include <map>
-#include <string>
-#include <type_traits>
-
-#include "common/libs/glog/logging.h"
-#include "common/vsoc/shm/audio_data_layout.h"
-#include "common/vsoc/shm/base.h"
-#include "common/vsoc/shm/e2e_test_region_layout.h"
-#include "common/vsoc/shm/gralloc_layout.h"
-#include "common/vsoc/shm/input_events_layout.h"
-#include "common/vsoc/shm/managed_e2e_test_region_layout.h"
-#include "common/vsoc/shm/screen_layout.h"
-#include "common/vsoc/shm/socket_forward_layout.h"
-
-#include "uapi/vsoc_shm.h"
-
-namespace {
-
-// Takes a vector of objects and returns a vector of pointers to those objects.
-template <typename T, typename R>
-std::vector<R*> GetConstPointers(const std::vector<T>& v) {
- std::vector<R*> result;
- result.reserve(v.size());
- for (auto& element : v) {
- result.push_back(&element);
- }
- return result;
-}
-} // namespace
-
-namespace vsoc {
-
-namespace {
-
-class VSoCRegionLayoutImpl : public VSoCRegionLayout {
- public:
- VSoCRegionLayoutImpl(const char* region_name, size_t layout_size,
- int guest_to_host_signal_table_log_size,
- int host_to_guest_signal_table_log_size,
- const char* managed_by)
- : region_name_(region_name),
- layout_size_(layout_size),
- guest_to_host_signal_table_log_size_(
- guest_to_host_signal_table_log_size),
- host_to_guest_signal_table_log_size_(
- host_to_guest_signal_table_log_size),
- managed_by_(managed_by) {
- }
- VSoCRegionLayoutImpl(const VSoCRegionLayoutImpl&) = default;
-
- const char* region_name() const override { return region_name_; }
- const char* managed_by() const override { return managed_by_; }
-
- size_t layout_size() const override { return layout_size_; }
- int guest_to_host_signal_table_log_size() const override {
- return guest_to_host_signal_table_log_size_;
- }
- int host_to_guest_signal_table_log_size() const override {
- return host_to_guest_signal_table_log_size_;
- }
-
- private:
- const char* region_name_{};
- const size_t layout_size_{};
- const int guest_to_host_signal_table_log_size_{};
- const int host_to_guest_signal_table_log_size_{};
- const char* managed_by_{};
-};
-
-class VSoCMemoryLayoutImpl : public VSoCMemoryLayout {
- public:
- explicit VSoCMemoryLayoutImpl(std::vector<VSoCRegionLayoutImpl>&& regions)
- : regions_(regions), region_idx_by_name_(GetNameToIndexMap(regions)) {
- for (size_t i = 0; i < regions_.size(); ++i) {
- // This link could be resolved later, but doing it here disables
- // managed_by cycles among the regions.
- if (regions[i].managed_by() &&
- !region_idx_by_name_.count(regions[i].managed_by())) {
- LOG(FATAL) << regions[i].region_name()
- << " managed by unknown region: " << regions[i].managed_by()
- << ". Manager Regions must be declared before the regions "
- "they manage";
- }
- }
- }
-
- ~VSoCMemoryLayoutImpl() = default;
-
- std::vector<const VSoCRegionLayout*> GetRegions() const {
- static std::vector<const VSoCRegionLayout*> ret =
- GetConstPointers<VSoCRegionLayoutImpl, const VSoCRegionLayout>(
- regions_);
- return ret;
- }
-
- const VSoCRegionLayout* GetRegionByName(
- const char* region_name) const override {
- if (!region_idx_by_name_.count(region_name)) {
- return nullptr;
- }
- return ®ions_[region_idx_by_name_.at(region_name)];
- }
-
- protected:
- VSoCMemoryLayoutImpl() = delete;
- VSoCMemoryLayoutImpl(const VSoCMemoryLayoutImpl&) = delete;
-
- // Helper function to allow the creation of the name to index map in the
- // constructor and allow the field to be const
- static std::map<const char*, size_t> GetNameToIndexMap(
- const std::vector<VSoCRegionLayoutImpl>& regions) {
- std::map<const char*, size_t> result;
- for (size_t index = 0; index < regions.size(); ++index) {
- auto region_name = regions[index].region_name();
- if (result.count(region_name)) {
- LOG(FATAL) << region_name << " used for more than one region";
- }
- result[region_name] = index;
- }
- return result;
- }
-
- std::vector<VSoCRegionLayoutImpl> regions_;
- const std::map<const char*, size_t> region_idx_by_name_;
-};
-
-template <class R>
-VSoCRegionLayoutImpl ValidateAndBuildLayout(int g_to_h_signal_table_log_size,
- int h_to_g_signal_table_log_size,
- const char* managed_by = nullptr) {
- // Double check that the Layout is a valid shm type.
- ASSERT_SHM_COMPATIBLE(R);
- return VSoCRegionLayoutImpl(R::region_name, sizeof(R),
- g_to_h_signal_table_log_size,
- h_to_g_signal_table_log_size, managed_by);
-}
-
-} // namespace
-
-VSoCMemoryLayout* VSoCMemoryLayout::Get() {
- /*******************************************************************
- * Make sure the first region is not the manager of other regions. *
- * This error will only be caught on runtime!!!!! *
- *******************************************************************/
- static VSoCMemoryLayoutImpl layout(
- {ValidateAndBuildLayout<layout::input_events::InputEventsLayout>(2, 2),
- ValidateAndBuildLayout<layout::screen::ScreenLayout>(2, 2),
- ValidateAndBuildLayout<layout::gralloc::GrallocManagerLayout>(2, 2),
- ValidateAndBuildLayout<layout::gralloc::GrallocBufferLayout>(
- 0, 0,
- /* managed_by */ layout::gralloc::GrallocManagerLayout::region_name),
- ValidateAndBuildLayout<layout::socket_forward::SocketForwardLayout>(7,
- 7),
- ValidateAndBuildLayout<layout::e2e_test::E2EPrimaryTestRegionLayout>(1,
- 1),
- ValidateAndBuildLayout<layout::e2e_test::E2ESecondaryTestRegionLayout>(
- 1, 1),
- ValidateAndBuildLayout<layout::e2e_test::E2EManagerTestRegionLayout>(1,
- 1),
- ValidateAndBuildLayout<layout::e2e_test::E2EManagedTestRegionLayout>(1,
- 1),
- ValidateAndBuildLayout<layout::audio_data::AudioDataLayout>(2, 2)});
-
- // We need this code to compile on both sides to enforce the static checks,
- // but should only be used host side.
-#if !defined(CUTTLEFISH_HOST)
- LOG(FATAL) << "Memory layout should not be used guest side, use region "
- "classes or the vsoc driver directly instead.";
-#endif
- return &layout;
-}
-
-} // namespace vsoc
diff --git a/common/vsoc/lib/vsoc_memory.h b/common/vsoc/lib/vsoc_memory.h
deleted file mode 100644
index 49853f9..0000000
--- a/common/vsoc/lib/vsoc_memory.h
+++ /dev/null
@@ -1,53 +0,0 @@
-#pragma once
-/*
- * Copyright (C) 2018 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 <stdint.h>
-
-#include <vector>
-
-namespace vsoc {
-
-class VSoCRegionLayout {
- public:
- virtual const char* region_name() const = 0;
- virtual const char* managed_by() const = 0;
-
- virtual size_t layout_size() const = 0;
- virtual int guest_to_host_signal_table_log_size() const = 0;
- virtual int host_to_guest_signal_table_log_size() const = 0;
- protected:
- VSoCRegionLayout() = default;
- virtual ~VSoCRegionLayout() = default;
-};
-
-class VSoCMemoryLayout {
- public:
- // Returns a pointer to the memory layout singleton.
- static VSoCMemoryLayout* Get();
-
- VSoCMemoryLayout(const VSoCMemoryLayout&) = delete;
- VSoCMemoryLayout(VSoCMemoryLayout&&) = delete;
-
- virtual std::vector<const VSoCRegionLayout *> GetRegions() const = 0;
- virtual const VSoCRegionLayout* GetRegionByName(
- const char* region_name) const = 0;
- protected:
- VSoCMemoryLayout() = default;
- virtual ~VSoCMemoryLayout() = default;
-};
-
-} // namespace vsoc
diff --git a/common/vsoc/shm/audio_data_layout.h b/common/vsoc/shm/audio_data_layout.h
deleted file mode 100644
index 3991ea0..0000000
--- a/common/vsoc/shm/audio_data_layout.h
+++ /dev/null
@@ -1,38 +0,0 @@
-#pragma once
-/*
- * Copyright (C) 2018 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/shm/base.h"
-#include "common/vsoc/shm/circqueue.h"
-
-// Memory layout for region carrying audio data from audio HAL to client.
-
-namespace vsoc {
-namespace layout {
-namespace audio_data {
-
-struct AudioDataLayout : public RegionLayout {
- static const char *const region_name;
- static constexpr size_t layout_size = 16396;
-
- // size = 2^14 = 16384, packets are up to 4KB bytes each.
- CircularPacketQueue<14, 4096> audio_queue;
-};
-ASSERT_SHM_COMPATIBLE(AudioDataLayout);
-
-} // namespace audio_data
-} // namespace layout
-} // namespace vsoc
diff --git a/common/vsoc/shm/base.h b/common/vsoc/shm/base.h
deleted file mode 100644
index f5abec8..0000000
--- a/common/vsoc/shm/base.h
+++ /dev/null
@@ -1,82 +0,0 @@
-#pragma once
-/*
- * 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 <stdint.h>
-#include <type_traits>
-
-// Base macros for all layout structures.
-// ShmTypeValidator provides meaningful information about the type size
-// mismatch in compilation error messages, eg.
-//
-// error:
-// static_assert failed "Class size changed, update the layout_size field"
-// static_assert(Current == Expected,
-// note: in instantiation of template class
-// 'ShmTypeValidator<vsoc::layout::myclass::ClassName>'
-// requested here ASSERT_SHM_COMPATIBLE(ClassName);
-//
-template <typename Type, size_t expected_size = Type::layout_size>
-struct ShmTypeValidator {
- static_assert(sizeof(Type) == expected_size,
- "Class size changed, update the layout_size field");
- static_assert(std::is_trivial<Type>(), "Class uses features that are unsafe");
- static constexpr bool valid =
- sizeof(Type) == expected_size && std::is_trivial<Type>();
-};
-
-#define ASSERT_SHM_COMPATIBLE(T) \
- static_assert(ShmTypeValidator<T>::valid, \
- "Compilation error. Please fix above errors and retry.")
-
-namespace vsoc {
-namespace layout {
-
-/**
- * Memory is shared between Guest and Host kernels. In some cases we need
- * flag to indicate which side we're on. In those cases we'll use this
- * simple structure.
- *
- * These are carefully formatted to make Guest and Host a bitfield.
- */
-enum Sides : uint32_t {
- NoSides = 0,
- Guest = 1,
- Host = 2,
- Both = 3,
-#ifdef CUTTLEFISH_HOST
- OurSide = Host,
- Peer = Guest
-#else
- OurSide = Guest,
- Peer = Host
-#endif
-};
-// Enums can't have static members, so can't use the macro here.
- static_assert(ShmTypeValidator<Sides, 4>::valid,
- "Compilation error. Please fix above errors and retry.");
-
-/**
- * Base class for all region layout structures.
- */
-class RegionLayout {
-public:
- static constexpr size_t layout_size = 1;
-};
-ASSERT_SHM_COMPATIBLE(RegionLayout);
-
-} // namespace layout
-} // namespace vsoc
diff --git a/common/vsoc/shm/circqueue.h b/common/vsoc/shm/circqueue.h
deleted file mode 100644
index 05893bf..0000000
--- a/common/vsoc/shm/circqueue.h
+++ /dev/null
@@ -1,203 +0,0 @@
-#pragma once
-
-/*
- * 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.
- */
-
-// Memory layout for byte-oriented circular queues
-
-#include <atomic>
-#include <cstdint>
-#include "common/vsoc/shm/base.h"
-#include "common/vsoc/shm/lock.h"
-
-struct iovec;
-
-namespace vsoc {
-class RegionSignalingInterface;
-namespace layout {
-
-/**
- * Base classes for all spinlock protected circular queues.
- * This class should be embedded in the per-region data structure that is used
- * as the parameter to TypedRegion.
- */
-template <uint32_t SizeLog2>
-class CircularQueueBase {
- public:
- static constexpr size_t layout_size = (1 << SizeLog2) + 12;
-
- private:
- CircularQueueBase() = delete;
- CircularQueueBase(const CircularQueueBase&) = delete;
- CircularQueueBase& operator=(const CircularQueueBase&) = delete;
-
- protected:
- /**
- * Specifies a part of the queue. Note, the given indexes must be masked
- * before they can be used against buffer_
- */
- struct Range {
- // Points to the first bytes that is part of the range
- uint32_t start_idx;
- // Points to the first byte that is not in the range. This is similar to
- // the STL end iterator.
- uint32_t end_idx;
- };
- static const uintptr_t BufferSize = (1 << SizeLog2);
-
- /**
- * Copy bytes from buffer_in into the part of the queue specified by Range.
- */
- void CopyInRange(const char* buffer_in, const Range& t);
-
- /**
- * Copy the bytes specified by range to the given buffer. They caller must
- * ensure that the buffer is large enough to hold the content of the range.
- */
- void CopyOutRange(const Range& t, char* buffer_out);
-
- /**
- * Wait until data becomes available in the queue. The caller must have
- * called Lock() before invoking this. The caller must call Unlock()
- * after this returns.
- */
- void WaitForDataLocked(RegionSignalingInterface* r);
-
- /**
- * Reserve space in the queue for writing. The caller must have called Lock()
- * before invoking this. The caller must call Unlock() after this returns.
- * Indexes pointing to the reserved space will be placed in range.
- * On success this returns bytes.
- * On failure a negative errno indicates the problem. -ENOSPC indicates that
- * bytes > the queue size, -EWOULDBLOCK indicates that the call would block
- * waiting for space but was requested non bloking.
- */
- intptr_t WriteReserveLocked(RegionSignalingInterface* r, size_t bytes,
- Range* t, bool non_blocking);
-
- bool RecoverBase() {
- return lock_.Recover();
- }
-
- // Note: Both of these fields may hold values larger than the buffer size,
- // they should be interpreted modulo the buffer size. This fact along with the
- // buffer size being a power of two greatly simplyfies the index calculations.
- // Advances when a reader has finished with buffer space
- std::atomic<uint32_t> r_released_;
- // Advances when buffer space is filled and ready for a reader
- std::atomic<uint32_t> w_pub_;
- // Spinlock that protects the region. 0 means unlocked
- SpinLock lock_;
- // The actual memory in the buffer
- char buffer_[BufferSize];
-};
-using CircularQueueBase64k = CircularQueueBase<16>;
-ASSERT_SHM_COMPATIBLE(CircularQueueBase64k);
-
-/**
- * Byte oriented circular queue. Reads will always return some data, but
- * may return less data than requested. Writes will always write all of the
- * data or return an error.
- */
-template <uint32_t SizeLog2>
-class CircularByteQueue : public CircularQueueBase<SizeLog2> {
- public:
- static constexpr size_t layout_size =
- CircularQueueBase<SizeLog2>::layout_size;
- /**
- * Read at most max_size bytes from the qeueue, placing them in buffer_out
- */
- intptr_t Read(RegionSignalingInterface* r, char* buffer_out,
- std::size_t max_size);
- /**
- * Write all of the given bytes into the queue. If non_blocking isn't set the
- * call may block until there is enough available space in the queue. On
- * success the return value will match bytes. On failure a negative errno is
- * returned. -ENOSPC: If the queue size is smaller than the number of bytes to
- * write. -EWOULDBLOCK: If non_blocking is true and there is not enough free
- * space.
- */
- intptr_t Write(RegionSignalingInterface* r, const char* buffer_in,
- std::size_t bytes, bool non_blocking = false);
-
- bool Recover() {
- return this->RecoverBase();
- }
-
- protected:
- using Range = typename CircularQueueBase<SizeLog2>::Range;
-};
-using CircularByteQueue64k = CircularByteQueue<16>;
-ASSERT_SHM_COMPATIBLE(CircularByteQueue64k);
-
-/**
- * Packet oriented circular queue. Reads will either return data or an error.
- * Each return from read corresponds to a call to write and returns all of the
- * data from that corresponding Write().
- */
-template <uint32_t SizeLog2, uint32_t MaxPacketSize>
-class CircularPacketQueue : public CircularQueueBase<SizeLog2> {
- public:
- static constexpr size_t layout_size =
- CircularQueueBase<SizeLog2>::layout_size;
-
- /**
- * Read a single packet from the queue, placing its data into buffer_out.
- * If max_size indicates that buffer_out cannot hold the entire packet
- * this function will return -ENOSPC.
- */
- intptr_t Read(RegionSignalingInterface* r, char* buffer_out,
- std::size_t max_size);
-
- /**
- * Writes [buffer_in, buffer_in + bytes) to the queue.
- * If the number of bytes to be written exceeds the size of the queue
- * -ENOSPC will be returned.
- * If non_blocking is true and there is not enough free space on the queue to
- * write all the data -EWOULDBLOCK will be returned.
- */
- intptr_t Write(RegionSignalingInterface* r, const char* buffer_in,
- uint32_t bytes, bool non_blocking = false);
-
- /**
- * Writes the data referenced by the given iov scatter/gather array to the
- * queue.
- * If the number of bytes to be written exceeds the size of the queue
- * -ENOSPC will be returned.
- * If non_blocking is true and there is not enough free space on the queue to
- * write all the data -EWOULDBLOCK will be returned.
- */
- intptr_t Writev(
- RegionSignalingInterface *r,
- const iovec *iov,
- size_t iov_count,
- bool non_blocking = false);
-
- bool Recover() {
- return this->RecoverBase();
- }
-
- protected:
- static_assert(CircularQueueBase<SizeLog2>::BufferSize >= MaxPacketSize,
- "Buffer is too small to hold the maximum sized packet");
- using Range = typename CircularQueueBase<SizeLog2>::Range;
- intptr_t CalculateBufferedSize(size_t payload);
-};
-using CircularPacketQueue64k = CircularPacketQueue<16, 1024>;
-ASSERT_SHM_COMPATIBLE(CircularPacketQueue64k);
-
-} // namespace layout
-} // namespace vsoc
diff --git a/common/vsoc/shm/e2e_test_region_layout.h b/common/vsoc/shm/e2e_test_region_layout.h
deleted file mode 100644
index f3ae615..0000000
--- a/common/vsoc/shm/e2e_test_region_layout.h
+++ /dev/null
@@ -1,168 +0,0 @@
-#pragma once
-/*
- * Copyright (C) 2016 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 <atomic>
-#include <cstdint>
-#include "common/vsoc/shm/base.h"
-
-// Memory layout for a region that supports end-to-end (E2E) testing of
-// shared memory regions. This verifies that all sorts of things work along the
-// the path:
-//
-// host libraries <-> ivshmem server <-> kernel <-> guest libraries
-//
-// This is intentionally not a unit test. The primary source of errors along
-// this path is a misunderstanding and/or inconsistency in one of the
-// interfaces. Introducing mocks would allow these errors to go undetected.
-// Another way of looking at it is that the mocks would end up being a
-// a copy-and-paste job, making a series of change-detector tests.
-//
-// These tests are actually run on every device boot to verify that things are
-// ok.
-
-namespace vsoc {
-namespace layout {
-
-namespace e2e_test {
-
-/**
- * Flags that are used to indicate test status. Some of the latter testing
- * stages rely on initializion that must be done on the peer.
- */
-enum E2ETestStage : uint32_t {
- // No tests have passed
- E2E_STAGE_NONE = 0,
- // This side has finished writing its pattern to the region
- E2E_MEMORY_FILLED = 1,
- // This side has confirmed that it can see its peer's writes to the region
- E2E_PEER_MEMORY_READ = 2,
-};
-static_assert(ShmTypeValidator<E2ETestStage, 4>::valid,
- "Compilation error. Please fix above errors and retry.");
-
-/**
- * Structure that grants permission to write in the region to either the guest
- * or the host. This size of these fields is arbitrary.
- */
-struct E2EMemoryFill {
- static constexpr size_t layout_size = 64;
-
- static const std::size_t kOwnedFieldSize = 32;
-
- // The compiler must not attempt to optimize away reads and writes to the
- // shared memory window. This is pretty typical when dealing with devices
- // doing memory mapped I/O.
- char host_writable[kOwnedFieldSize];
- char guest_writable[kOwnedFieldSize];
-};
-ASSERT_SHM_COMPATIBLE(E2EMemoryFill);
-
-/**
- * Structure that grants permission to write in the region to either the guest
- * or the host. This size of these fields is arbitrary.
- */
-class E2ETestStageRegister {
- public:
- static constexpr size_t layout_size = 4;
-
- E2ETestStage value() const {
- return value_;
- }
-
- void set_value(E2ETestStage new_value) { value_ = new_value; }
-
- protected:
- // The compiler must not attempt to optimize away reads and writes to the
- // shared memory window. This is pretty typical when dealing with devices
- // doing memory mapped I/O.
- E2ETestStage value_;
-};
-ASSERT_SHM_COMPATIBLE(E2ETestStageRegister);
-
-/**
- * Describes the layout of the regions used for the end-to-end test. There
- * are multiple regions: primary and secondary, so some details like the region
- * name must wait until later.
- */
-class E2ETestRegionLayout : public ::vsoc::layout::RegionLayout {
- public:
- static constexpr size_t layout_size = 2 * E2ETestStageRegister::layout_size +
- 3 * 4 + E2EMemoryFill::layout_size;
-
- /**
- * Computes how many E2EMemoryFill records we need to cover the region.
- * Covering the entire region during the test ensures that everything is
- * mapped and coherent between guest and host.
- */
- static std::size_t NumFillRecords(std::size_t region_size) {
- if (region_size < sizeof(E2ETestRegionLayout)) {
- return 0;
- }
- // 1 + ... An array of size 1 is allocated in the E2ETestRegion.
- // TODO(ghartman): AddressSanitizer may find this sort of thing to be
- // alarming.
- return 1 +
- (region_size - sizeof(E2ETestRegionLayout)) / sizeof(E2EMemoryFill);
- }
- // The number of test stages that have completed on the guest
- // Later host tests will wait on this
- E2ETestStageRegister guest_status;
- // The number of test stages that have completed on the host
- // Later guest tests will wait on this
- E2ETestStageRegister host_status;
- // These fields are used to test the signaling mechanism.
- std::atomic<uint32_t> host_to_guest_signal;
- std::atomic<uint32_t> guest_to_host_signal;
- std::atomic<uint32_t> guest_self_register;
- // There rest of the region will be filled by guest_host_strings.
- // We actually use more than one of these, but we can't know how many
- // until we examine the region.
- E2EMemoryFill data[1];
-};
-ASSERT_SHM_COMPATIBLE(E2ETestRegionLayout);
-
-struct E2EPrimaryTestRegionLayout : public E2ETestRegionLayout {
- static constexpr size_t layout_size = E2ETestRegionLayout::layout_size;
-
- static const char* region_name;
- static const char guest_pattern[E2EMemoryFill::kOwnedFieldSize];
- static const char host_pattern[E2EMemoryFill::kOwnedFieldSize];
-};
-ASSERT_SHM_COMPATIBLE(E2EPrimaryTestRegionLayout);
-
-struct E2ESecondaryTestRegionLayout : public E2ETestRegionLayout {
- static constexpr size_t layout_size = E2ETestRegionLayout::layout_size;
-
- static const char* region_name;
- static const char guest_pattern[E2EMemoryFill::kOwnedFieldSize];
- static const char host_pattern[E2EMemoryFill::kOwnedFieldSize];
-};
-ASSERT_SHM_COMPATIBLE(E2ESecondaryTestRegionLayout);
-
-/**
- * Defines an end-to-end region with a name that should never be configured.
- */
-struct E2EUnfindableRegionLayout : public E2ETestRegionLayout {
- static constexpr size_t layout_size = E2ETestRegionLayout::layout_size;
-
- static const char* region_name;
-};
-ASSERT_SHM_COMPATIBLE(E2EUnfindableRegionLayout);
-
-} // namespace e2e_test
-} // namespace layout
-} // namespace vsoc
diff --git a/common/vsoc/shm/gralloc_layout.h b/common/vsoc/shm/gralloc_layout.h
deleted file mode 100644
index 4da740f..0000000
--- a/common/vsoc/shm/gralloc_layout.h
+++ /dev/null
@@ -1,75 +0,0 @@
-#pragma once
-/*
- * 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/shm/base.h"
-#include "common/vsoc/shm/graphics.h"
-#include "common/vsoc/shm/lock.h"
-
-// Memory layout for the gralloc manager region.
-
-namespace vsoc {
-namespace layout {
-
-namespace gralloc {
-
-struct BufferEntry {
- static constexpr size_t layout_size =
- 7 * 4 + PixelFormatRegister::layout_size;
-
- uint32_t owned_by;
- uint32_t buffer_begin;
- uint32_t buffer_end;
-
- PixelFormatRegister pixel_format;
- uint32_t stride;
- uint32_t width;
- uint32_t height;
-
- // A size of 28 is causing different layouts when GrallocManagerLayout is
- // compiled in host and guest sides
- uint32_t padding;
-
- uint32_t buffer_size() {
- return buffer_end - buffer_begin;
- }
-};
-ASSERT_SHM_COMPATIBLE(BufferEntry);
-
-struct GrallocBufferLayout : public RegionLayout {
- static constexpr size_t layout_size = 1;
- static const char* region_name;
-};
-ASSERT_SHM_COMPATIBLE(GrallocBufferLayout);
-
-struct GrallocManagerLayout : public RegionLayout {
- static constexpr size_t layout_size =
- 8 + GuestLock::layout_size + BufferEntry::layout_size;
- static const char* region_name;
- typedef GrallocBufferLayout ManagedRegion;
-
- uint32_t allocated_buffer_memory;
- uint32_t buffer_count;
- // Make sure this isn't the first field
- GuestLock new_buffer_lock;
- // Needs to be last field
- BufferEntry buffers_table[1];
-};
-ASSERT_SHM_COMPATIBLE(GrallocManagerLayout);
-
-} // namespace gralloc
-} // namespace layout
-} // namespace vsoc
diff --git a/common/vsoc/shm/graphics.h b/common/vsoc/shm/graphics.h
deleted file mode 100644
index 0aa7875..0000000
--- a/common/vsoc/shm/graphics.h
+++ /dev/null
@@ -1,169 +0,0 @@
-#pragma once
-
-/*
- * 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.
- */
-
-// Memory layout for primitive graphics types.
-
-// The vsoc::layout namespace indicates that these are shared memory structure
-// definitions. The #include's given above are strictly limited, as are the
-// types that can be referenced below.
-
-#include <cstdint>
-
-#include "common/vsoc/shm/base.h"
-
-namespace vsoc {
-
-// The enumerations for VSoC pixel formats are laid out so that hardware to
-// parse bytes per pixel without relying an a exhaustive list of pixel formats.
-// These constants define the fields involved.
-namespace PixelFormatConst {
- static const uint32_t BytesPerPixelSize = 3;
- static const uint32_t SubformatSize = 3;
- static const uint32_t MaxBytesPerPixel = (1 << BytesPerPixelSize);
- static const uint32_t MaxSubformat = (1 << SubformatSize) - 1;
-};
-
-
-// Builds (statically) a new pixel format enumeration value given constant
-// bytes per pixel.
-template <uint32_t BYTES, uint32_t SUB_FORMAT>
-struct PixelFormatBuilder {
- static_assert(BYTES > 0, "Too few bytes");
- static_assert(BYTES <= PixelFormatConst::MaxBytesPerPixel, "Too many bytes");
- static_assert(SUB_FORMAT <= PixelFormatConst::MaxSubformat,
- "Too many subformats");
- static const uint32_t value = ((BYTES - 1) << PixelFormatConst::SubformatSize) | SUB_FORMAT;
-};
-
-template <uint32_t FORMAT>
-struct PixelFormatProperties {
- // No static asserts since all int32_t values are (technically) valid pixel formats?
- static const uint32_t bytes_per_pixel = (FORMAT >> PixelFormatConst::SubformatSize) + 1;
-};
-
-// Contains all of the pixel formats currently supported by this VSoC. The
-// enumeration serves multiple purposes:
-//
-// * The compile will warn (or error) if we switch on PixelFormat and don't
-// handly all of the cases.
-//
-// * Code can use PixelFormat to describe paramaters, making APIs a bit more
-// self-documenting.
-//
-// * Observant reviewers can verify that the same pixel value is not assigned
-// to multiple formats. Keep the enums in numerical order below to
-// make this easier.
-enum PixelFormat : uint32_t {
- VSOC_PIXEL_FORMAT_UNINITIALIZED = PixelFormatBuilder<1,0>::value,
- VSOC_PIXEL_FORMAT_BLOB = PixelFormatBuilder<1,1>::value,
-
- VSOC_PIXEL_FORMAT_RGB_565 = PixelFormatBuilder<2,0>::value,
- VSOC_PIXEL_FORMAT_YV12 = PixelFormatBuilder<2,1>::value,
- VSOC_PIXEL_FORMAT_YCbCr_420_888 = PixelFormatBuilder<2,2>::value,
-
- VSOC_PIXEL_FORMAT_RGB_888 = PixelFormatBuilder<3,0>::value,
-
- VSOC_PIXEL_FORMAT_RGBA_8888 = PixelFormatBuilder<4,0>::value,
- VSOC_PIXEL_FORMAT_RGBX_8888 = PixelFormatBuilder<4,1>::value,
- VSOC_PIXEL_FORMAT_BGRA_8888 = PixelFormatBuilder<4,2>::value,
-
- VSOC_PIXEL_FORMAT_RGBA_FP16 = PixelFormatBuilder<8,0>::value,
-
- // VSOC_PIXEL_FORMAT_IMPLEMENTATION_DEFINED intentionally left out. The HALs
- // should choose one of the defined contrete types.
- //
- // The following formats are defined in various platform versions, but don't
- // seem to be used. If we encounter them it's ok to add them to the table.
- // This does not necessitate a version change.
- //
- // The following have been in the framework for a long time:
- //
- // VSOC_PIXEL_FORMAT_YCrCb_420_SP
- // VSOC_PIXEL_FORMAT_YCbCr_422_SP
- //
- // The following were added in JB_MR2:
- //
- // VSOC_PIXEL_FORMAT_YCbCr_420_888
- // VSOC_PIXEL_FORMAT_Y8
- // VSOC_PIXEL_FORMAT_Y16
- //
- // The following were added in L:
- //
- // VSOC_PIXEL_FORMAT_RAW_OPAQUE
- // VSOC_PIXEL_FORMAT_RAW16 (also known as RAW_SENSOR. Define only RAW16)
- // VSOC_PIXEL_FORMAT_RAW10
- //
- // The following were added in L MR1:
- //
- // VSOC_PIXEL_FORMAT_YCbCr_444_888
- // VSOC_PIXEL_FORMAT_YCbCr_422_888
- // VSOC_PIXEL_FORMAT_RAW12
- // VSOC_PIXEL_FORMAT_FLEX_RGBA_8888
- // VSOC_PIXEL_FORMAT_FLEX_RGB_888
- //
- // These pixel formats were removed in later framework versions. Implement
- // only if absolutely necessary.
- //
- // Support was dropped in K for:
- //
- // VSOC_PIXEL_FORMAT_RGBA_5551
- // VSOC_PIXEL_FORMAT_RGBA_4444
- //
- // Supported only in K, L, and LMR1:
- //
- // VSOC_PIXEL_FORMAT_sRGB_X_8888
- // VSOC_PIXEL_FORMAT_sRGB_A_8888
-};
-// Enums can't have static members, so can't use the macro here.
-static_assert(ShmTypeValidator<PixelFormat, 4>::valid,
- "Compilation error. Please fix above errors and retry.");
-
-namespace layout {
-
-// VSoC memory layout for a register that accepts a single pixel format.
-// The value is volatile to ensure that the compiler does not eliminate stores.
-struct PixelFormatRegister {
- static constexpr size_t layout_size = 4;
-
- volatile PixelFormat value_;
-};
-ASSERT_SHM_COMPATIBLE(PixelFormatRegister);
-
-// Register layout for a mask giving different PixelFormats. Reserve enough
-// space to allow for future expansion. For example, we may well end with
-// a 12 bit per channel format in the future.
-struct PixelFormatMaskRegister {
- static constexpr size_t layout_size = 8;
-
- volatile uint64_t value_;
-
- bool HasValue(PixelFormat in) {
- return !!(value_ & (uint64_t(1) << in));
- }
-};
-ASSERT_SHM_COMPATIBLE(PixelFormatMaskRegister);
-
-// Ensure that the mask is large enough to hold the highest encodable
-// pixel format.
-static_assert(PixelFormatBuilder<
- PixelFormatConst::MaxBytesPerPixel,
- PixelFormatConst::MaxSubformat>::value <
- 8 * sizeof(PixelFormatMaskRegister),
- "Largest pixel format does not fit in mask");
-} // layout
-} // vsoc
diff --git a/common/vsoc/shm/input_events_layout.h b/common/vsoc/shm/input_events_layout.h
deleted file mode 100644
index 737c903..0000000
--- a/common/vsoc/shm/input_events_layout.h
+++ /dev/null
@@ -1,46 +0,0 @@
-#pragma once
-/*
- * 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/shm/base.h"
-#include "common/vsoc/shm/circqueue.h"
-
-// Memory layout for region carrying input events from host to guest
-
-namespace vsoc {
-namespace layout {
-
-namespace input_events {
-
-struct InputEventsLayout : public RegionLayout {
- static constexpr size_t layout_size =
- CircularPacketQueue<10, 256>::layout_size +
- 2 * CircularPacketQueue<10, 16>::layout_size;
-
- static const char* region_name;
- // Event queues for the different input devices supported. Both the power
- // button and the keyboard need only generate 2 input events for every
- // 'hardware' event, so 16 bytes are enough, however when the touchscreen has
- // multitouch enabled the number of generated events is significantly higher.
- CircularPacketQueue<10, 256> touch_screen_queue;
- CircularPacketQueue<10, 16> keyboard_queue;
- CircularPacketQueue<10, 16> power_button_queue;
-};
-ASSERT_SHM_COMPATIBLE(InputEventsLayout);
-
-} // namespace input_events
-} // namespace layout
-} // namespace vsoc
diff --git a/common/vsoc/shm/lock.h b/common/vsoc/shm/lock.h
deleted file mode 100644
index 2049ba8..0000000
--- a/common/vsoc/shm/lock.h
+++ /dev/null
@@ -1,252 +0,0 @@
-#pragma once
-
-/*
- * 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.
- */
-
-// Memory layout for locks of all types.
-
-// The vsoc::layout namespace indicates that these are shared memory structure
-// definitions. The #include's given above are strictly limited, as are the
-// types that can be referenced below.
-
-// For _mm_pause()
-#if defined(__SSE2__)
-#include <x86intrin.h>
-#define _pause() _mm_pause()
-#elif defined(__arm__) || defined(__aarch64__)
-#include <arm_acle.h>
-#define _pause() __yield()
-#endif
-
-#include <atomic>
-#include <cstdint>
-
-#include "common/vsoc/shm/base.h"
-
-// Host userspace, guest userspace, and the guest kernel must all agree on
-// the relationship between std::atomic and atomic_t. That's hard to do without
-// examining assembly, and we can't really examing atomic_t outside of the
-// kernel tree, but we can at least assert that the host and the guest
-// agree on a size.
-static_assert(sizeof(std::atomic<uint32_t>) == 4, "std::atomic size mismatch");
-
-namespace vsoc {
-
-class RegionView;
-
-namespace layout {
-
-/**
- * Lock that causes threads to busy loop rather than sleeping.
- * This lock should never be used when the amount of work in the critical
- * section cannot be bounded.
- */
-class SpinLock {
- public:
- static constexpr size_t layout_size = 4;
-
- /**
- * Acquire the spinlock on the queue. This will effectively block all
- * readers and writers.
- */
- void Lock() {
- while (1) {
- uint32_t expected = 0;
- if (lock_.compare_exchange_strong(expected, Sides::OurSide)) {
- return;
- }
- _pause();
- }
- }
-
- /**
- * Drop the lock iff it is currently held by this side. Used by
- * recovery code that cleans up regions in the event of a reboot
- * (guest side) or a service restart (host side).
- *
- * The caller must ensure that there are no other threads on its
- * side (e.g. guest/host) are using the window.
- */
- bool Recover() {
- uint32_t expected = Sides::OurSide;
- return lock_.compare_exchange_strong(expected, 0);
- }
-
- /**
- * Release the spinlock.
- */
- void Unlock() {
- lock_ = 0;
- }
-
- protected:
- std::atomic<uint32_t> lock_;
-};
-ASSERT_SHM_COMPATIBLE(SpinLock);
-
-/**
- * This is a generic synchronization primitive that provides space for the
- * owner of the lock to write platform-specific information.
- */
-class WaitingLockBase {
- public:
- static constexpr size_t layout_size = 40;
-
- protected:
- // Common code to handle locking
- // Must be called with the kernel's thread id
- // Returns true if the lock was acquired. In this case the value in
- // expected_vlaue is undefined.
- // Returns false if locking failed. The value discovered in the lock word
- // is returned in expected_value, and should probably be used in a conditional
- // sleep.
- bool TryLock(uint32_t tid, uint32_t* expected_value);
-
- // Common code to handle unlocking.
- // Must be called with the kernel's thread id
- // Returns sides that should be signalled or 0
- Sides UnlockCommon(uint32_t tid);
-
- // Common code to recover single-sided locks.
- bool RecoverSingleSided();
-
- // Non-zero values in this word indicate that the lock is in use.
- // This is 32 bits for compatibility with futex()
- std::atomic<uint32_t> lock_uint32_;
-
- // Pad so we line up with glib's pthread_mutex_t and can share the same queue.
- // These fields may be redefined at any point in the future. They should not
- // be used.
- private:
-// These fields are known to be unused and are provided for compatibility
-// with glibc's locks.
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wunused-private-field"
- uint32_t reserved_1_;
- char reserved_2_[16];
- // Provide scratch space for the owner of the lock. The content of this space
- // is undefined when the lock is acquired. The owner may write to and read
- // from it while it holds the lock, but must relinquish control before
- // releasing the lock.
- //
- // This is intended to support Linux robust futexes. See the documentation
- // in the kernel tree:
- // Documentation/robust-futex-ABI.txt
- public:
- int64_t owner_scratch_[2];
-#pragma clang diagnostic pop
-};
-ASSERT_SHM_COMPATIBLE(WaitingLockBase);
-
-/**
- * GuestLocks can be acquired and released only on the guest. They reside
- * in the shared memory window because mutiple guest processes may need
- * to coordinate activities in certain shared memory regions.
- *
- * Representing this as a concrete type allows for some optimizations when
- * signalling on the lock.
- */
-class GuestLock : public WaitingLockBase {
- public:
- static constexpr size_t layout_size = WaitingLockBase::layout_size;
-
-#ifndef CUTTLEFISH_HOST
- void Lock();
- void Unlock();
- /**
- * Drop the lock iff it is currently held. Used by
- * recovery code that cleans up regions in the event of a reboot.
- *
- * The caller must ensure that there are no other threads on its
- * side (e.g. guest/host) are using the window.
- */
- bool Recover();
-#endif
-};
-ASSERT_SHM_COMPATIBLE(GuestLock);
-
-/**
- * HostLocks can be acquired and released only on the host. They reside
- * in the shared memory window because mutiple host processes may need
- * to coordinate activities in certain shared memory regions.
- *
- * Representing this as a concrete type allows for some optimizations when
- * signalling on the lock.
- */
-class HostLock : public WaitingLockBase {
- public:
- static constexpr size_t layout_size = WaitingLockBase::layout_size;
-
-#ifdef CUTTLEFISH_HOST
- void Lock();
- void Unlock();
- /**
- * Drop the lock iff it is currently held. Used by
- * recovery code that cleans up regions in the event of a daemon
- * restart.
- *
- * The caller must ensure that there are no other threads on its
- * side (e.g. guest/host) are using the window.
- */
- bool Recover();
-#endif
-};
-ASSERT_SHM_COMPATIBLE(HostLock);
-
-/**
- * GuestAndHostLocks can be acquired and released on either side of the
- * shared memory window. The locks attempt to enforce fairness by using
- * a round-trip signal:
- *
- * When a guest releases a lock this code sends a signal to wake the host,
- * but not other guest waiters.
- *
- * The wake handler on the host wakes up and local waiters and then reposts
- * the signal to the guest.
- *
- * When the guest receives the signal from the host it then wakes ups
- * any waiters.
- *
- * A similar scenario applies when the host releases a lock with guest waiters.
- *
- * Signalling across the shared memory window twice has non-trivial cost.
- * There are some optimizations in the code to prevent the full round-trip
- * if the process releasing the lock can confirm that there are no waiters on
- * the other side.
- *
- * Representing this as a concrete type allows for some optimizations when
- * signalling on the lock.
- */
-class GuestAndHostLock : public WaitingLockBase {
- public:
- static constexpr size_t layout_size = WaitingLockBase::layout_size;
-
- void Lock(RegionView*);
- void Unlock(RegionView*);
- /**
- * Drop the lock iff it is currently held by this side. Used by
- * recovery code that cleans up regions in the event of a reboot
- * (guest side) or a service restart (host side).
- *
- * The caller must ensure that there are no other threads on its
- * side (e.g. guest/host) are using the window.
- */
- bool Recover(RegionView*);
-};
-ASSERT_SHM_COMPATIBLE(GuestAndHostLock);
-
-} // namespace layout
-} // namespace vsoc
diff --git a/common/vsoc/shm/managed_e2e_test_region_layout.h b/common/vsoc/shm/managed_e2e_test_region_layout.h
deleted file mode 100644
index dc23f66..0000000
--- a/common/vsoc/shm/managed_e2e_test_region_layout.h
+++ /dev/null
@@ -1,46 +0,0 @@
-#pragma once
-/*
- * Copyright (C) 2016 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 <cstdint>
-
-#include "common/vsoc/shm/base.h"
-
-namespace vsoc {
-namespace layout {
-
-namespace e2e_test {
-
-struct E2EManagedTestRegionLayout : public RegionLayout {
- static constexpr size_t layout_size = 4;
-
- static const char* region_name;
- uint32_t val; // Not needed, here only to avoid an empty struct.
-};
-ASSERT_SHM_COMPATIBLE(E2EManagedTestRegionLayout);
-
-struct E2EManagerTestRegionLayout : public RegionLayout {
- static constexpr size_t layout_size = 4 * 4;
-
- static const char* region_name;
- typedef E2EManagedTestRegionLayout ManagedRegion;
- uint32_t data[4]; // We don't need more than 4 for the tests
-};
-ASSERT_SHM_COMPATIBLE(E2EManagerTestRegionLayout);
-
-} // namespace e2e_test
-} // namespace layout
-} // namespace vsoc
diff --git a/common/vsoc/shm/screen_layout.h b/common/vsoc/shm/screen_layout.h
deleted file mode 100644
index 7ad0ca3..0000000
--- a/common/vsoc/shm/screen_layout.h
+++ /dev/null
@@ -1,76 +0,0 @@
-#pragma once
-/*
- * 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/shm/base.h"
-#include "common/vsoc/shm/lock.h"
-
-// Memory layout for screen region
-
-namespace vsoc {
-namespace layout {
-
-namespace screen {
-struct TimeSpec {
- static constexpr size_t layout_size = 16;
-
- int64_t ts_sec;
- uint32_t ts_nsec;
- // Host and guest compilers are giving the structure different sizes without
- // this field.
- uint32_t reserved;
-};
-ASSERT_SHM_COMPATIBLE(TimeSpec);
-
-struct CompositionStats {
- static constexpr size_t layout_size = 4 + 2 * 2 + 5 * TimeSpec::layout_size;
-
- uint32_t num_prepare_calls;
- uint16_t num_layers;
- uint16_t num_hwcomposited_layers;
- TimeSpec last_vsync;
- TimeSpec prepare_start;
- TimeSpec prepare_end;
- TimeSpec set_start;
- TimeSpec set_end;
-};
-ASSERT_SHM_COMPATIBLE(CompositionStats);
-
-struct ScreenLayout : public RegionLayout {
- static constexpr size_t layout_size = 24 + CompositionStats::layout_size;
- static const char* region_name;
- // Display properties
- uint32_t x_res;
- uint32_t y_res;
- uint16_t dpi;
- uint16_t refresh_rate_hz;
-
- // Protects access to the frame offset, sequential number and stats.
- // See the region implementation for more details.
- SpinLock bcast_lock;
- // The frame sequential number
- std::atomic<uint32_t> seq_num;
- // The index of the buffer containing the current frame.
- int32_t buffer_index;
- CompositionStats stats;
- uint8_t buffer[0];
-};
-ASSERT_SHM_COMPATIBLE(ScreenLayout);
-
-} // namespace screen
-
-} // namespace layout
-} // namespace vsoc
diff --git a/common/vsoc/shm/socket_forward_layout.h b/common/vsoc/shm/socket_forward_layout.h
deleted file mode 100644
index 4a9beda..0000000
--- a/common/vsoc/shm/socket_forward_layout.h
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Copyright (C) 2018 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.
- */
-#pragma once
-
-#include "common/vsoc/shm/base.h"
-#include "common/vsoc/shm/circqueue.h"
-#include "common/vsoc/shm/lock.h"
-
-// Memory layout for wifi packet exchange region.
-namespace vsoc {
-namespace layout {
-namespace socket_forward {
-
-constexpr std::size_t kMaxPacketSize = 8192;
-constexpr std::size_t kNumQueues = 16;
-
-struct Queue {
- static constexpr size_t layout_size =
- CircularPacketQueue<16, kMaxPacketSize>::layout_size;
-
- CircularPacketQueue<16, kMaxPacketSize> queue;
-
- bool Recover() { return queue.Recover(); }
-};
-ASSERT_SHM_COMPATIBLE(Queue);
-
-struct QueuePair {
- static constexpr size_t layout_size = 2 * Queue::layout_size;
-
- // Traffic originating from host that proceeds towards guest.
- Queue host_to_guest;
- // Traffic originating from guest that proceeds towards host.
- Queue guest_to_host;
-
- bool Recover() {
- bool recovered = false;
- recovered = recovered || host_to_guest.Recover();
- recovered = recovered || guest_to_host.Recover();
- return recovered;
- }
-};
-ASSERT_SHM_COMPATIBLE(QueuePair);
-
-struct SocketForwardLayout : public RegionLayout {
- static constexpr size_t layout_size = QueuePair::layout_size * kNumQueues;
-
- bool Recover() {
- bool recovered = false;
- for (auto& i : queues_) {
- bool rval = i.Recover();
- recovered = recovered || rval;
- }
- return recovered;
- }
-
- QueuePair queues_[kNumQueues];
- static const char* region_name;
-};
-
-ASSERT_SHM_COMPATIBLE(SocketForwardLayout);
-
-} // namespace socket_forward
-} // namespace layout
-} // namespace vsoc
diff --git a/guest/commands/vsoc_input_service/Android.bp b/guest/commands/vsoc_input_service/Android.bp
index 73ca067..f2e197f 100644
--- a/guest/commands/vsoc_input_service/Android.bp
+++ b/guest/commands/vsoc_input_service/Android.bp
@@ -33,7 +33,6 @@
"libcuttlefish_fs",
"libbase",
"liblog",
- "vsoc_lib",
],
header_libs: [
"cuttlefish_glog",
diff --git a/guest/commands/vsoc_input_service/vsoc_input_service.cpp b/guest/commands/vsoc_input_service/vsoc_input_service.cpp
index 8753735..8b75b45 100644
--- a/guest/commands/vsoc_input_service/vsoc_input_service.cpp
+++ b/guest/commands/vsoc_input_service/vsoc_input_service.cpp
@@ -28,7 +28,6 @@
#include "common/libs/fs/shared_fd.h"
#include "common/libs/device_config/device_config.h"
-#include "common/vsoc/lib/input_events_region_view.h"
using vsoc::input_events::InputEvent;
using vsoc_input_service::VirtualDeviceBase;
diff --git a/guest/commands/vsoc_input_service/vsoc_input_service.h b/guest/commands/vsoc_input_service/vsoc_input_service.h
index 2282b40..edf196d 100644
--- a/guest/commands/vsoc_input_service/vsoc_input_service.h
+++ b/guest/commands/vsoc_input_service/vsoc_input_service.h
@@ -21,6 +21,18 @@
#include "virtual_power_button.h"
#include "virtual_touchscreen.h"
+namespace vsoc {
+namespace input_events {
+
+struct InputEvent {
+ uint16_t type;
+ uint16_t code;
+ uint32_t value;
+};
+
+} // namespace input_events
+} // namespace vsoc
+
namespace vsoc_input_service {
class VSoCInputService {
diff --git a/guest/hals/audio/legacy/Android.mk b/guest/hals/audio/legacy/Android.mk
deleted file mode 100644
index 8d4ef0a..0000000
--- a/guest/hals/audio/legacy/Android.mk
+++ /dev/null
@@ -1,65 +0,0 @@
-# Copyright (C) 2016 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.
-
-LOCAL_PATH := $(call my-dir)
-
-include $(CLEAR_VARS)
-
-ifeq (0, $(shell test $(PLATFORM_SDK_VERSION) -ge 21; echo $$?))
-LOCAL_MODULE_RELATIVE_PATH := hw
-else
-LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/hw
-endif
-LOCAL_MODULE_TAGS := optional
-LOCAL_MULTILIB := first
-
-LOCAL_SHARED_LIBRARIES := \
- libbase \
- liblog \
- libcutils \
- cuttlefish_auto_resources \
- libcuttlefish_fs \
- cuttlefish_time \
- vsoc_lib
-
-LOCAL_HEADER_LIBRARIES := \
- libhardware_headers
-
-LOCAL_SRC_FILES := \
- audio_hal.cpp \
- vsoc_audio.cpp \
- vsoc_audio_input_stream.cpp \
- vsoc_audio_output_stream.cpp
-
-LOCAL_C_INCLUDES := \
- device/google/cuttlefish_common \
- device/google/cuttlefish_kernel \
- $(VSOC_STLPORT_INCLUDES) \
- frameworks/native/include/media/hardware \
- $(call include-path-for, audio)
-
-LOCAL_STATIC_LIBRARIES := \
- libcutils \
- libcuttlefish_remoter_framework \
- $(VSOC_STLPORT_STATIC_LIBS)
-
-LOCAL_CFLAGS := \
- -Wall -Werror -std=c++17 \
- $(VSOC_VERSION_CFLAGS)
-
-
-LOCAL_MODULE := audio.primary.cutf_ivsh
-LOCAL_VENDOR_MODULE := true
-
-include $(BUILD_SHARED_LIBRARY)
diff --git a/guest/hals/audio/legacy/audio_hal.cpp b/guest/hals/audio/legacy/audio_hal.cpp
deleted file mode 100644
index a865d46..0000000
--- a/guest/hals/audio/legacy/audio_hal.cpp
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Copyright (C) 2016 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 "guest/hals/audio/legacy/vsoc_audio.h"
-
-#include "guest/hals/audio/legacy/audio_hal.h"
-
-static hw_module_methods_t hal_module_methods = {
- .open = cvd::GceAudio::Open,
-};
-
-
-audio_module HAL_MODULE_INFO_SYM = {
- .common = {
- .tag = HARDWARE_MODULE_TAG,
- .module_api_version = AUDIO_MODULE_API_VERSION_0_1,
- .hal_api_version = HARDWARE_HAL_API_VERSION,
- .id = AUDIO_HARDWARE_MODULE_ID,
- .name = "GCE Audio HW HAL",
- .author = "The Android Open Source Project",
- .methods = &hal_module_methods,
- },
-};
diff --git a/guest/hals/audio/legacy/audio_hal.h b/guest/hals/audio/legacy/audio_hal.h
deleted file mode 100644
index db547ff..0000000
--- a/guest/hals/audio/legacy/audio_hal.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Copyright (C) 2016 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.
- */
-#pragma once
-
-#define AUDIO_DEBUG 0
-
-#if AUDIO_DEBUG
-# define D(...) ALOGD(__VA_ARGS__)
-#else
-# define D(...) ((void)0)
-#endif
-
-#include <errno.h>
-#include <string.h>
-#include <log/log.h>
-
-#include <hardware/hardware.h>
-
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wparentheses"
-#pragma GCC diagnostic ignored "-Wgnu-designator"
-#include <system/audio.h>
-#pragma GCC diagnostic pop
-
-#include <hardware/audio.h>
diff --git a/guest/hals/audio/legacy/policy/Android.mk b/guest/hals/audio/legacy/policy/Android.mk
deleted file mode 100644
index 0b2ef8c..0000000
--- a/guest/hals/audio/legacy/policy/Android.mk
+++ /dev/null
@@ -1,45 +0,0 @@
-# Copyright (C) 2016 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.
-
-LOCAL_PATH := $(call my-dir)
-
-include $(CLEAR_VARS)
-
-ifeq (0, $(shell test $(PLATFORM_SDK_VERSION) -ge 21; echo $$?))
-LOCAL_MODULE_RELATIVE_PATH := hw
-else
-LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/hw
-endif
-LOCAL_MODULE_TAGS := optional
-LOCAL_MULTILIB := first
-
-LOCAL_SHARED_LIBRARIES := \
- liblog \
- libcutils
-
-LOCAL_SRC_FILES := \
- vsoc_audio_policy_hal.cpp
-
-LOCAL_C_INCLUDES := \
- device/google/cuttlefish_common \
- $(VSOC_STLPORT_INCLUDES) \
- frameworks/native/include/media/hardware \
- $(call include-path-for, audio)
-
-LOCAL_CFLAGS := -Wall -Werror
-
-LOCAL_MODULE := audio_policy.vsoc
-LOCAL_VENDOR_MODULE := true
-
-include $(BUILD_SHARED_LIBRARY)
diff --git a/guest/hals/audio/legacy/policy/vsoc_audio_policy_hal.cpp b/guest/hals/audio/legacy/policy/vsoc_audio_policy_hal.cpp
deleted file mode 100644
index 53c3127..0000000
--- a/guest/hals/audio/legacy/policy/vsoc_audio_policy_hal.cpp
+++ /dev/null
@@ -1,156 +0,0 @@
-/*
- * Copyright (C) 2016 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 <errno.h>
-#include <stdint.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include <hardware/hardware.h>
-#include <system/audio.h>
-#include <system/audio_policy.h>
-#include <hardware/audio_policy.h>
-
-#include "guest/hals/audio/legacy/policy/vsoc_audio_policy_hal.h"
-
-namespace cvd {
-
-int GceAudioPolicy::Create(
- const audio_policy_device* device,
- audio_policy_service_ops* aps_ops,
- void* service, audio_policy** ap) {
- D("%s", __FUNCTION__);
- audio_policy_device* dev;
- gce_audio_policy* dap;
- int ret;
-
- *ap = NULL;
-
- if (!service || !aps_ops) {
- return -EINVAL;
- }
-
- dap = (gce_audio_policy*) calloc(1, sizeof(*dap));
- if (!dap) {
- return -ENOMEM;
- }
-
- dap->policy.set_device_connection_state =
- &GceAudioPolicy::SetDeviceConnectionState;
- dap->policy.get_device_connection_state =
- &GceAudioPolicy::GetDeviceConnectionState;
- dap->policy.set_phone_state = &GceAudioPolicy::SetPhoneState;
- dap->policy.set_ringer_mode = &GceAudioPolicy::SetRingerMode;
- dap->policy.set_force_use = &GceAudioPolicy::SetForceUse;
- dap->policy.get_force_use = &GceAudioPolicy::GetForceUse;
- dap->policy.set_can_mute_enforced_audible =
- &GceAudioPolicy::SetCanMuteEnforcedAudible;
- dap->policy.init_check = &GceAudioPolicy::InitCheck;
- dap->policy.get_output = &GceAudioPolicy::GetOutput;
- dap->policy.start_output = &GceAudioPolicy::StartOutput;
- dap->policy.stop_output = &GceAudioPolicy::StopOutput;
- dap->policy.release_output = &GceAudioPolicy::ReleaseOutput;
- dap->policy.get_input = &GceAudioPolicy::GetInput;
- dap->policy.start_input = &GceAudioPolicy::StartInput;
- dap->policy.stop_input = &GceAudioPolicy::StopInput;
- dap->policy.release_input = &GceAudioPolicy::ReleaseInput;
- dap->policy.init_stream_volume = &GceAudioPolicy::InitStreamVolume;
- dap->policy.set_stream_volume_index = &GceAudioPolicy::SetStreamVolumeIndex;
- dap->policy.get_stream_volume_index = &GceAudioPolicy::GetStreamVolumeIndex;
- dap->policy.set_stream_volume_index_for_device =
- &GceAudioPolicy::SetStreamVolumeIndexForDevice;
- dap->policy.get_stream_volume_index_for_device =
- &GceAudioPolicy::GetStreamVolumeIndexForDevice;
- dap->policy.get_strategy_for_stream = &GceAudioPolicy::GetStrategyForStream;
- dap->policy.get_devices_for_stream = &GceAudioPolicy::GetDevicesForStream;
- dap->policy.get_output_for_effect = &GceAudioPolicy::GetOutputForEffect;
- dap->policy.register_effect = &GceAudioPolicy::RegisterEffect;
- dap->policy.unregister_effect = &GceAudioPolicy::UnregisterEffect;
- dap->policy.set_effect_enabled = &GceAudioPolicy::SetEffectEnabled;
- dap->policy.is_stream_active = &GceAudioPolicy::IsStreamActive;
- dap->policy.dump = &GceAudioPolicy::Dump;
-#ifdef ENABLE_OFFLOAD
- dap->policy.is_offload_supported = &GceAudioPolicy::IsOffloadSupported;
-#endif
-
- dap->service = service;
- dap->aps_ops = aps_ops;
-
- *ap = &dap->policy;
- return 0;
-}
-
-
-int GceAudioPolicy::Destroy(const audio_policy_device* ap_dev,
- audio_policy* ap) {
- D("%s", __FUNCTION__);
- free(ap);
- return 0;
-}
-
-
-int GceAudioPolicy::Close(hw_device_t* device) {
- D("%s", __FUNCTION__);
- free(device);
- return 0;
-}
-
-
-int GceAudioPolicy::Open(
- const hw_module_t* module, const char* name, hw_device_t** device) {
- D("%s", __FUNCTION__);
- audio_policy_device* dev;
-
- *device = NULL;
-
- if (strcmp(name, AUDIO_POLICY_INTERFACE) != 0) {
- return -EINVAL;
- }
-
- dev = (audio_policy_device*) calloc(1, sizeof(*dev));
- if (!dev) {
- return -ENOMEM;
- }
-
- dev->common.tag = HARDWARE_DEVICE_TAG;
- dev->common.version = 0;
- dev->common.module = (hw_module_t*) module;
- dev->common.close = &GceAudioPolicy::Close;
- dev->create_audio_policy = &GceAudioPolicy::Create;
- dev->destroy_audio_policy = &GceAudioPolicy::Destroy;
-
- *device = &dev->common;
-
- return 0;
-}
-
-}
-
-static hw_module_methods_t gce_audio_policy_module_methods = {
- .open = &cvd::GceAudioPolicy::Open,
-};
-
-
-audio_policy_module HAL_MODULE_INFO_SYM = {
- .common = {
- .tag = HARDWARE_MODULE_TAG,
- .version_major = 1,
- .version_minor = 0,
- .id = AUDIO_POLICY_HARDWARE_MODULE_ID,
- .name = "GCE Audio Policy HAL",
- .author = "The Android Open Source Project",
- .methods = &gce_audio_policy_module_methods,
- },
-};
diff --git a/guest/hals/audio/legacy/policy/vsoc_audio_policy_hal.h b/guest/hals/audio/legacy/policy/vsoc_audio_policy_hal.h
deleted file mode 100644
index 00ea3d1..0000000
--- a/guest/hals/audio/legacy/policy/vsoc_audio_policy_hal.h
+++ /dev/null
@@ -1,245 +0,0 @@
-/*
- * Copyright (C) 2016 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.
- */
-#pragma once
-
-#include <errno.h>
-#include <string.h>
-#include <log/log.h>
-
-#include <hardware/hardware.h>
-#include <system/audio.h>
-#include <hardware/audio.h>
-
-#define AUDIO_DEBUG 1
-
-#if AUDIO_DEBUG
-# define D(...) ALOGD(__VA_ARGS__)
-#else
-# define D(...) ((void)0)
-#endif
-
-#define LOG_TAG "GceAudioPolicy"
-
-namespace avd {
-
-struct gce_audio_policy {
- audio_policy policy;
-
- audio_policy_service_ops* aps_ops;
- void* service;
-};
-
-
-class GceAudioPolicy {
- public:
- GceAudioPolicy() {}
- ~GceAudioPolicy() {}
-
- static int Open(
- const hw_module_t* module, const char* name, hw_device_t** device);
- static int Create(const audio_policy_device* device,
- audio_policy_service_ops* aps_ops, void* service,
- audio_policy** ap);
- static int Destroy(const audio_policy_device* ap_dev,
- audio_policy* ap);
- static int Close(hw_device_t* device);
-
- static int SetDeviceConnectionState(
- audio_policy* pol, audio_devices_t device,
- audio_policy_dev_state_t state, const char* device_address) {
- ALOGE("%s: not supported", __FUNCTION__);
- return -ENOSYS;
- }
-
- static audio_policy_dev_state_t GetDeviceConnectionState(
- const audio_policy* pol, audio_devices_t device,
- const char* device_address) {
- ALOGE("%s: not supported", __FUNCTION__);
- return AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE;
- }
-
- static void SetPhoneState(audio_policy* pol, audio_mode_t state) {
- ALOGE("%s: not supported", __FUNCTION__);
- }
-
- static void SetRingerMode(audio_policy* pol, uint32_t mode,
- uint32_t mask) {
- ALOGW("%s: deprecated", __FUNCTION__);
- }
-
- static void SetForceUse(
- audio_policy* pol, audio_policy_force_use_t usage,
- audio_policy_forced_cfg_t config) {
- ALOGE("%s: not supported", __FUNCTION__);
- }
-
- static audio_policy_forced_cfg_t GetForceUse(
- const audio_policy* pol, audio_policy_force_use_t usage) {
- ALOGE("%s: not supported", __FUNCTION__);
- return AUDIO_POLICY_FORCE_NONE;
- }
-
- static void SetCanMuteEnforcedAudible(
- audio_policy* pol, bool can_mute) {
- ALOGE("%s: not supported", __FUNCTION__);
- }
-
- static int InitCheck(const audio_policy* pol) {
- ALOGE("%s: not supported", __FUNCTION__);
- return 0;
- }
-
- static audio_io_handle_t GetOutput(
- audio_policy* pol, audio_stream_type_t stream,
- uint32_t sampling_rate, audio_format_t format,
- audio_channel_mask_t channelMask, audio_output_flags_t flags
-#ifdef ENABLE_OFFLOAD
- , const audio_offload_info_t* info
-#endif
- ) {
- ALOGE("%s: not supported", __FUNCTION__);
- return 0;
- }
-
- static int StartOutput(audio_policy* pol, audio_io_handle_t output,
- audio_stream_type_t stream, int session) {
- ALOGE("%s: not supported", __FUNCTION__);
- return -ENOSYS;
- }
-
- static int StopOutput(audio_policy* pol, audio_io_handle_t output,
- audio_stream_type_t stream, int session) {
- ALOGE("%s: not supported", __FUNCTION__);
- return -ENOSYS;
- }
-
- static void ReleaseOutput(
- audio_policy* pol, audio_io_handle_t output) {
- ALOGE("%s: not supported", __FUNCTION__);
- }
-
- static audio_io_handle_t GetInput(
- audio_policy* pol, audio_source_t inputSource,
- uint32_t sampling_rate, audio_format_t format,
- audio_channel_mask_t channelMask, audio_in_acoustics_t acoustics) {
- ALOGE("%s: not supported", __FUNCTION__);
- return 0;
- }
-
- static int StartInput(audio_policy* pol, audio_io_handle_t input) {
- ALOGE("%s: not supported", __FUNCTION__);
- return -ENOSYS;
- }
-
- static int StopInput(audio_policy* pol, audio_io_handle_t input) {
- ALOGE("%s: not supported", __FUNCTION__);
- return -ENOSYS;
- }
-
- static void ReleaseInput(
- audio_policy* pol, audio_io_handle_t input) {
- ALOGE("%s: not supported", __FUNCTION__);
- }
-
- static void InitStreamVolume(audio_policy* pol,
- audio_stream_type_t stream, int index_min,
- int index_max) {
- ALOGE("%s: not supported", __FUNCTION__);
- }
-
- static int SetStreamVolumeIndex(audio_policy* pol,
- audio_stream_type_t stream, int index) {
- ALOGE("%s: not supported", __FUNCTION__);
- return -ENOSYS;
- }
-
- static int GetStreamVolumeIndex(const audio_policy* pol,
- audio_stream_type_t stream, int* index) {
- ALOGE("%s: not supported", __FUNCTION__);
- return -ENOSYS;
- }
-
- static int SetStreamVolumeIndexForDevice(
- audio_policy* pol, audio_stream_type_t stream,
- int index, audio_devices_t device) {
- ALOGE("%s: not supported", __FUNCTION__);
- return -ENOSYS;
- }
-
- static int GetStreamVolumeIndexForDevice(
- const audio_policy* pol, audio_stream_type_t stream,
- int* index, audio_devices_t device) {
- ALOGE("%s: not supported", __FUNCTION__);
- return -ENOSYS;
- }
-
- static uint32_t GetStrategyForStream(const audio_policy* pol,
- audio_stream_type_t stream) {
- ALOGE("%s: not supported", __FUNCTION__);
- return 0;
- }
-
- static audio_devices_t GetDevicesForStream(const audio_policy* pol,
- audio_stream_type_t stream) {
- ALOGE("%s: not supported", __FUNCTION__);
- return 0;
- }
-
- static audio_io_handle_t GetOutputForEffect(
- audio_policy* pol, const effect_descriptor_s* desc) {
- ALOGE("%s: not supported", __FUNCTION__);
- return 0;
- }
-
- static int RegisterEffect(
- audio_policy* pol, const effect_descriptor_s* desc,
- audio_io_handle_t output, uint32_t strategy, int session, int id) {
- ALOGE("%s: not supported", __FUNCTION__);
- return -ENOSYS;
- }
-
- static int UnregisterEffect(audio_policy* pol, int id) {
- ALOGE("%s: not supported", __FUNCTION__);
- return -ENOSYS;
- }
-
- static int SetEffectEnabled(audio_policy* pol, int id, bool enabled) {
- ALOGE("%s: not supported", __FUNCTION__);
- return -ENOSYS;
- }
-
- static bool IsStreamActive(
- const audio_policy* pol, audio_stream_type_t stream,
- uint32_t in_past_ms) {
- ALOGE("%s: not supported", __FUNCTION__);
- return false;
- }
-
- static int Dump(const audio_policy* pol, int fd) {
- ALOGE("%s: not supported", __FUNCTION__);
- return -ENOSYS;
- }
-
-#ifdef ENABLE_OFFLOAD
- static bool IsOffloadSupported(const audio_policy* pol,
- const audio_offload_info_t* info) {
- ALOGE("%s: not supported", __FUNCTION__);
- return false;
- }
-#endif
-};
-
-}
diff --git a/guest/hals/audio/legacy/vsoc_audio.cpp b/guest/hals/audio/legacy/vsoc_audio.cpp
deleted file mode 100644
index 040e1e7..0000000
--- a/guest/hals/audio/legacy/vsoc_audio.cpp
+++ /dev/null
@@ -1,387 +0,0 @@
-/*
- * Copyright (C) 2016 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 "guest/hals/audio/legacy/audio_hal.h"
-
-#include <inttypes.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <sys/time.h>
-#include <fcntl.h>
-
-extern "C" {
-#include <cutils/str_parms.h>
-}
-
-#include "common/libs/auto_resources/auto_resources.h"
-#include "common/libs/fs/shared_select.h"
-#include "common/libs/threads/cuttlefish_thread.h"
-#include "common/libs/threads/thunkers.h"
-#include "common/vsoc/lib/circqueue_impl.h"
-#include "guest/hals/audio/legacy/vsoc_audio.h"
-#include "guest/hals/audio/legacy/vsoc_audio_input_stream.h"
-#include "guest/hals/audio/legacy/vsoc_audio_output_stream.h"
-#include "guest/libs/remoter/remoter_framework_pkt.h"
-
-using cvd::LockGuard;
-using cvd::Mutex;
-
-namespace cvd {
-
-GceAudio::~GceAudio() { }
-
-int GceAudio::Close() {
- D("GceAudio::%s", __FUNCTION__);
- {
- LockGuard<Mutex> guard(lock_);
- for (std::list<GceAudioOutputStream*>::iterator it = output_list_.begin();
- it != output_list_.end(); ++it) {
- delete *it;
- }
- for (input_map_t::iterator it = input_map_.begin();
- it != input_map_.end(); ++it) {
- delete it->second;
- }
- }
- delete this;
- return 0;
-}
-
-size_t GceAudio::GetInputBufferSize(const audio_config*) const {
- return IN_BUFFER_BYTES;
-}
-
-uint32_t GceAudio::GetSupportedDevices() const {
- return AUDIO_DEVICE_OUT_EARPIECE |
- AUDIO_DEVICE_OUT_SPEAKER |
- AUDIO_DEVICE_OUT_DEFAULT |
- AUDIO_DEVICE_IN_COMMUNICATION |
- AUDIO_DEVICE_IN_BUILTIN_MIC |
- AUDIO_DEVICE_IN_WIRED_HEADSET |
- AUDIO_DEVICE_IN_VOICE_CALL |
- AUDIO_DEVICE_IN_DEFAULT;
-}
-
-int GceAudio::InitCheck() const {
- D("GceAudio::%s", __FUNCTION__);
- return 0;
-}
-
-int GceAudio::SetMicMute(bool state) {
- D("GceAudio::%s", __FUNCTION__);
- LockGuard<Mutex> guard(lock_);
- mic_muted_ = state;
- return 0;
-}
-
-int GceAudio::GetMicMute(bool *state) const {
- D("GceAudio::%s", __FUNCTION__);
- LockGuard<Mutex> guard(lock_);
- *state = mic_muted_;
- return 0;
-}
-
-int GceAudio::OpenInputStream(audio_io_handle_t handle,
- audio_devices_t devices,
- audio_config *config,
- audio_stream_in **stream_in,
- audio_input_flags_t /*flags*/,
- const char * /*address*/,
- audio_source_t /*source*/) {
- GceAudioInputStream* new_stream;
- int rval = GceAudioInputStream::Open(
- this, handle, devices, *config, &new_stream);
- uint32_t stream_number;
- if (new_stream) {
- LockGuard<Mutex> guard(lock_);
- stream_number = next_stream_number_++;
- input_map_[stream_number] = new_stream;
- }
- // This should happen after the lock is released, hence the double check
- if (new_stream) {
- SendStreamUpdate(new_stream->GetStreamDescriptor(
- stream_number, gce_audio_message::OPEN_INPUT_STREAM), MSG_DONTWAIT);
- }
- *stream_in = new_stream;
- return rval;
-}
-
-
-void GceAudio::CloseInputStream(audio_stream_in *stream) {
- GceAudioInputStream* astream = static_cast<GceAudioInputStream*>(stream);
- gce_audio_message descriptor;
- {
- LockGuard<Mutex> guard(lock_);
- // TODO(ghartman): This could be optimized if stream knew it's number.
- for (input_map_t::iterator it = input_map_.begin();
- it != input_map_.end(); ++it) {
- if (it->second == stream) {
- descriptor = it->second->GetStreamDescriptor(
- it->first, gce_audio_message::CLOSE_INPUT_STREAM);
- input_map_.erase(it);
- break;
- }
- }
- }
- SendStreamUpdate(descriptor, MSG_DONTWAIT);
- delete astream;
-}
-
-
-int GceAudio::OpenOutputStream(audio_io_handle_t handle,
- audio_devices_t devices,
- audio_output_flags_t flags,
- audio_config *config,
- audio_stream_out **stream_out,
- const char * /*address*/) {
- GceAudioOutputStream* new_stream;
- int rval;
- {
- LockGuard<Mutex> guard(lock_);
- rval = GceAudioOutputStream::Open(
- this, handle, devices, flags, config, next_stream_number_++,
- &new_stream);
- if (new_stream) {
- output_list_.push_back(new_stream);
- }
- }
- if (new_stream) {
- SendStreamUpdate(new_stream->GetStreamDescriptor(
- gce_audio_message::OPEN_OUTPUT_STREAM), MSG_DONTWAIT);
- }
- *stream_out = new_stream;
- return rval;
-}
-
-void GceAudio::CloseOutputStream(audio_stream_out *stream) {
- GceAudioOutputStream* astream = static_cast<GceAudioOutputStream*>(stream);
- gce_audio_message close;
- {
- LockGuard<Mutex> guard(lock_);
- output_list_.remove(astream);
- close = astream->GetStreamDescriptor(
- gce_audio_message::CLOSE_OUTPUT_STREAM);
- }
- SendStreamUpdate(close, MSG_DONTWAIT);
- delete astream;
-}
-
-int GceAudio::Dump(int fd) const {
- LockGuard<Mutex> guard(lock_);
- dprintf(
- fd,
- "\nadev_dump:\n"
- "\tmic_mute: %s\n"
- "\tnum_outputs: %zu\n"
- "\tnum_inputs: %zu\n\n",
- mic_muted_ ? "true": "false",
- output_list_.size(), input_map_.size());
-
- for (std::list<GceAudioOutputStream*>::const_iterator it =
- output_list_.begin();
- it != output_list_.end(); ++it) {
- (*it)->common.dump(&(*it)->common, fd);
- }
-
- for (input_map_t::const_iterator it = input_map_.begin();
- it != input_map_.end(); ++it) {
- (*it).second->common.dump(&(*it).second->common, fd);
- }
-
- return 0;
-}
-
-ssize_t GceAudio::SendMsg(const msghdr& msg, int /* flags */) {
- intptr_t res = audio_data_rv_->data()->audio_queue.Writev(
- audio_data_rv_,
- msg.msg_iov,
- msg.msg_iovlen,
- true /* non_blocking */);
-
- if (res < 0) {
- ALOGV("GceAudio::%s: CircularPacketQueue::Write returned %" PRIiPTR,
- __FUNCTION__,
- res);
- }
-
- return static_cast<ssize_t>(res);
-}
-
-ssize_t GceAudio::SendStreamUpdate(
- const gce_audio_message& stream_info, int flags) {
- msghdr msg;
- iovec msg_iov[1];
- msg_iov[0].iov_base = const_cast<gce_audio_message*>(&stream_info);
- msg_iov[0].iov_len = sizeof(gce_audio_message);
- msg.msg_name = NULL;
- msg.msg_namelen = 0;
- msg.msg_iov = msg_iov;
- msg.msg_iovlen = arraysize(msg_iov);
- msg.msg_control = NULL;
- msg.msg_controllen = 0;
- msg.msg_flags = 0;
- return SendMsg(msg, flags);
-}
-
-int GceAudio::SetVoiceVolume(float volume) {
- D("GceAudio::%s: set voice volume %f", __FUNCTION__, volume);
- voice_volume_ = volume;
- return 0;
-}
-
-int GceAudio::SetMasterVolume(float volume) {
- D("GceAudio::%s: set master volume %f", __FUNCTION__, volume);
- master_volume_ = volume;
- return 0;
-}
-
-int GceAudio::GetMasterVolume(float* volume) {
- D("GceAudio::%s: get master volume %f", __FUNCTION__, master_volume_);
- *volume = master_volume_;
- return 0;
-}
-
-int GceAudio::SetMasterMute(bool muted) {
- D("GceAudio::%s: set master muted %d", __FUNCTION__, muted);
- master_muted_ = muted;
- return 0;
-}
-
-int GceAudio::GetMasterMute(bool* muted) {
- D("GceAudio::%s: get master muted %d", __FUNCTION__, master_muted_);
- *muted = master_muted_;
- return 0;
-}
-
-int GceAudio::SetMode(audio_mode_t mode) {
- D("GceAudio::%s: new mode %d", __FUNCTION__, mode);
- mode_ = mode;
- return 0;
-}
-
-int GceAudio::Open(const hw_module_t* module, const char* name,
- hw_device_t** device) {
- D("GceAudio::%s", __FUNCTION__);
-
- if (strcmp(name, AUDIO_HARDWARE_INTERFACE)) {
- ALOGE("GceAudio::%s: invalid module name %s (expected %s)",
- __FUNCTION__, name, AUDIO_HARDWARE_INTERFACE);
- return -EINVAL;
- }
-
- GceAudio* rval = new GceAudio;
-
- rval->audio_data_rv_ = AudioDataRegionView::GetInstance();
- rval->audio_worker_ = rval->audio_data_rv_->StartWorker();
-
- rval->common.tag = HARDWARE_DEVICE_TAG;
- rval->common.version = version_;
- rval->common.module = const_cast<hw_module_t *>(module);
- rval->common.close = cvd::thunk<hw_device_t, &GceAudio::Close>;
-
-#if !defined(AUDIO_DEVICE_API_VERSION_2_0)
- // This HAL entry is supported only on AUDIO_DEVICE_API_VERSION_1_0.
- // In fact, with version 2.0 the device numbers were orgainized in a
- // way that makes the return value nonsense.
- // Skipping the assignment is ok: the memset in the constructor already
- // put a NULL here.
- rval->get_supported_devices =
- cvd::thunk<audio_hw_device, &GceAudio::GetSupportedDevices>;
-#endif
- rval->init_check = cvd::thunk<audio_hw_device, &GceAudio::InitCheck>;
-
- rval->set_voice_volume =
- cvd::thunk<audio_hw_device, &GceAudio::SetVoiceVolume>;
- rval->set_master_volume =
- cvd::thunk<audio_hw_device, &GceAudio::SetMasterVolume>;
- rval->get_master_volume =
- cvd::thunk<audio_hw_device, &GceAudio::GetMasterVolume>;
-
-#if defined(AUDIO_DEVICE_API_VERSION_2_0)
- rval->set_master_mute =
- cvd::thunk<audio_hw_device, &GceAudio::SetMasterMute>;
- rval->get_master_mute =
- cvd::thunk<audio_hw_device, &GceAudio::GetMasterMute>;
-#endif
-
- rval->set_mode = cvd::thunk<audio_hw_device, &GceAudio::SetMode>;
- rval->set_mic_mute = cvd::thunk<audio_hw_device, &GceAudio::SetMicMute>;
- rval->get_mic_mute = cvd::thunk<audio_hw_device, &GceAudio::GetMicMute>;
-
- rval->set_parameters = cvd::thunk<audio_hw_device, &GceAudio::SetParameters>;
- rval->get_parameters = cvd::thunk<audio_hw_device, &GceAudio::GetParameters>;
-
- rval->get_input_buffer_size =
- cvd::thunk<audio_hw_device, &GceAudio::GetInputBufferSize>;
-
- rval->open_input_stream =
- cvd::thunk<audio_hw_device, &GceAudio::OpenInputStreamCurrentHAL>;
- rval->close_input_stream =
- cvd::thunk<audio_hw_device, &GceAudio::CloseInputStream>;
-
- rval->open_output_stream =
- cvd::thunk<audio_hw_device, &GceAudio::OpenOutputStreamCurrentHAL>;
- rval->close_output_stream =
- cvd::thunk<audio_hw_device, &GceAudio::CloseOutputStream>;
-
- rval->dump = cvd::thunk<audio_hw_device, &GceAudio::Dump>;
-
- *device = &rval->common;
- return 0;
-}
-
-int GceAudio::SetParameters(const char *kvpairs) {
- ALOGE("GceAudio::%s: not implemented", __FUNCTION__);
- if (kvpairs) D("GceAudio::%s: kvpairs %s", __FUNCTION__, kvpairs);
- return 0;
-}
-
-
-char* GceAudio::GetParameters(const char *keys) const {
- ALOGE("GceAudio::%s: not implemented", __FUNCTION__);
- if (keys) D("GceAudio::%s: kvpairs %s", __FUNCTION__, keys);
- return strdup("");
-}
-
-int GceAudio::SetStreamParameters(
- struct audio_stream *stream, const char *kv_pairs) {
- struct str_parms *parms = str_parms_create_str(kv_pairs);
- if (!parms) {
- return 0;
- }
- int sample_rate;
- if (str_parms_get_int(parms, AUDIO_PARAMETER_STREAM_SAMPLING_RATE,
- &sample_rate) >= 0) {
- stream->set_sample_rate(stream, sample_rate);
- }
- int format;
- if (str_parms_get_int(parms, AUDIO_PARAMETER_STREAM_FORMAT,
- &format) >= 0) {
- stream->set_format(stream, static_cast<audio_format_t>(format));
- }
- int routing;
- if (str_parms_get_int(parms, AUDIO_PARAMETER_STREAM_ROUTING,
- &routing) >= 0) {
- stream->set_device(stream, static_cast<audio_devices_t>(routing));
- }
- if (str_parms_get_int(parms, AUDIO_PARAMETER_STREAM_INPUT_SOURCE,
- &routing) >= 0) {
- stream->set_device(stream, static_cast<audio_devices_t>(routing));
- }
- str_parms_destroy(parms);
- return 0;
-}
-
-}
diff --git a/guest/hals/audio/legacy/vsoc_audio.h b/guest/hals/audio/legacy/vsoc_audio.h
deleted file mode 100644
index 7b96878..0000000
--- a/guest/hals/audio/legacy/vsoc_audio.h
+++ /dev/null
@@ -1,306 +0,0 @@
-/*
- * Copyright (C) 2016 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.
- */
-#pragma once
-
-#include <list>
-#include <map>
-#include <memory>
-
-#include "common/libs/fs/shared_fd.h"
-#include "common/libs/threads/cuttlefish_thread.h"
-#include "common/vsoc/lib/audio_data_region_view.h"
-#include "common/vsoc/lib/vsoc_audio_message.h"
-#include "guest/hals/audio/legacy/audio_hal.h"
-#include "guest/hals/audio/legacy/vsoc_audio_input_stream.h"
-
-namespace cvd {
-
-class GceAudioInputStream;
-class GceAudioOutputStream;
-
-class GceAudio : public audio_hw_device {
- public:
- // This common code manipulates the parameters of input and output streams.
- static int SetStreamParameters(struct audio_stream *, const char *);
-
- ~GceAudio();
-
- // Non-HAL methods that are part of the GCE implementation.
- // Most of these are used by the input and output streams.
-
- // Returns true if the microphone is muted. Used by input streams.
- bool IsMicrophoneMuted() {
- cvd::LockGuard<cvd::Mutex> guard(lock_);
- return mic_muted_;
- }
-
- // Send a message to the connected streamer.
- // Returns:
- // 0 if there is no streamer.
- // >0 if the message was sent.
- // -1 if there was an error.
- ssize_t SendMsg(const msghdr&, int flags);
-
- // Sends a stream update to the connected streamer.
- // Stream updates have no frames. Use SendMsg if the message has frames.
- // 0 if there is no streamer.
- // >0 if the message was sent.
- // -1 if there was an error.
- ssize_t SendStreamUpdate(
- const gce_audio_message& stream_info, int flags);
-
- // Callbacks for the Android audio_module HAL interface.
- // Most of the comments below are copied from
- // libhardware/include/hardware/audio.h
- //
- // Where the is a conflict the comments there apply.
- // By default these methods return 0 on success -<errno> for failure.
-
- // Opens the device.
- static int Open(const hw_module_t* module, const char* name,
- hw_device_t** device);
-
- // Closes the device, closing any open input streams and output streams.
- int Close();
-
- // Closes the input stream, throwing away any data in the buffer.
- void CloseInputStream(audio_stream_in* stream);
-
- // Closes the output stream without waiting for the buffer to clear.
- void CloseOutputStream(audio_stream_out* stream);
-
- // Creates an audio patch between several source and sink ports.
- // The handle is allocated by the HAL and should be unique for this
- // audio HAL module.
- // TODO(ghartman): Implement this as part of HAL 3.0
- //int CreateAudioPatch(unsigned int num_sources,
- // const struct audio_port_config *sources,
- // unsigned int num_sinks,
- // const struct audio_port_config *sinks,
- // audio_patch_handle_t *handle);
-
- // dumps the state of the audio hardware to the given fd.
- // This information can be retrieved using the dumpsys utility.
- int Dump(int fd) const;
-
- // Fills the list of supported attributes for a given audio port.
- // As input, "port" contains the information (type, role, address etc...)
- // needed by the HAL to identify the port.
- // As output, "port" contains possible attributes (sampling rates, formats,
- // channel masks, gain controllers...) for this port.
- // TODO(ghartman): Implement this as part of HAL 3.0
- // int GetAudioPort(struct audio_port *port);
-
- // Sets audio port configuration
- // TODO(ghartman): Implement this as part of HAL 3.0
- // int SetAudioPortConfig(const struct audio_port_config *config);
-
- size_t GetInputBufferSize(const audio_config*) const;
-
- // Gets the current master volume value for the HAL, if the HAL supports
- // master volume control. AudioFlinger will query this value from the
- // primary audio HAL when the service starts and use the value for setting
- // the initial master volume across all HALs. HALs which do not support
- // this method may leave it set to NULL.
- int GetMasterVolume(float* /*volume*/);
-
- // Get the current master mute status for the HAL, if the HAL supports
- // master mute control. AudioFlinger will query this value from the primary
- // audio HAL when the service starts and use the value for setting the
- // initial master mute across all HALs. HALs which do not support this
- // method may leave it set to NULL.
- int GetMasterMute(bool* muted);
-
- // Gets the audio mute status for the microphone.
- int GetMicMute(bool* state) const;
-
- // Retrieves the global audio parameters.
- // TODO(ghartman): Implement this.
- char* GetParameters(const char* keys) const;
-
- // Enumerates what devices are supported by each audio_hw_device
- // implementation.
- // Return value is a bitmask of 1 or more values of audio_devices_t
- // used by audio flinger.
- // NOTE: audio HAL implementations starting with
- // AUDIO_DEVICE_API_VERSION_2_0 do not implement this function.
- // AUDIO_DEVICE_API_VERSION_2_0 was the current version as of JB-MR1
- // All supported devices should be listed in audio_policy.conf
- // file and the audio policy manager must choose the appropriate
- // audio module based on information in this file.
- uint32_t GetSupportedDevices() const;
-
- // Checks to see if the audio hardware interface has been initialized.
- // Always returns 0 to indicate success, but -ENODEV is also allowed to
- // indicate failure.
- int InitCheck() const;
-
- // Creates an additional hardware input stream.
- // Additional parameters were added in the 3.0 version of the HAL.
- // These defaults make it easier to implement a cross-branch device.
- int OpenInputStream(
- audio_io_handle_t handle,
- audio_devices_t devices, audio_config *config,
- audio_stream_in **stream_in,
- audio_input_flags_t flags = AUDIO_INPUT_FLAG_NONE,
- const char* address = 0,
- audio_source_t source = AUDIO_SOURCE_DEFAULT);
-
- // Creates an additional output stream.
- // The "address" parameter qualifies the "devices" audio device type if
- // needed. On GCE we ignore it for now because we simulate a single SoC
- // hw devices.
- //
- // The format format depends on the device type:
- // Bluetooth devices use the MAC address of the device in the form
- // "00:11:22:AA:BB:CC"
- // USB devices use the ALSA card and device numbers in the form
- // "card=X;device=Y"
- // Other devices may use a number or any other string.
- int OpenOutputStream(
- audio_io_handle_t handle,
- audio_devices_t devices, audio_output_flags_t flags,
- audio_config* config, audio_stream_out** stream_out,
- const char* address = 0);
-
- // Releases an audio patch.
- // TODO(ghartman): Implement this as part of HAL 3.0
- //int ReleaseAudioPatch(audio_patch_handle_t handle);
-
- // Sets the audio mute status for all audio activities. If any value other
- // than 0 is returned, the software mixer will emulate this capability.
- // The GCE implementation always returns 0.
- int SetMasterMute(bool muted);
-
- // Sets the audio volume for all audio activities other than voice call.
- // Range between 0.0 and 1.0. If any value other than 0 is returned,
- // the software mixer will emulate this capability.
- // The GCE implementation always returns 0.
- int SetMasterVolume(float volume);
-
- // Sets the audio mute status for the microphone.
- int SetMicMute(bool state);
-
- // set_mode is called when the audio mode changes. AUDIO_MODE_NORMAL mode
- // is for standard audio playback, AUDIO_MODE_RINGTONE when a ringtone is
- // playing, and AUDIO_MODE_IN_CALL when a call is in progress.
- int SetMode(audio_mode_t mode);
-
- // Sets the global audio parameters.
- // TODO(ghartman): Create a sensible implementation.
- int SetParameters(const char* kvpairs);
-
- // Sets the audio volume of a voice call. Range is between 0.0 and 1.0
- int SetVoiceVolume(float volume);
-
-
- private:
- // HAL 3.0 modifies the signatures of OpenInputStream and OpenOutputStream.
- // We don't want to fork the implementation, and we don't want #ifdefs all
- // over the code. The current implementation defines OpenInputStream and
- // OpenOutputStream with default values for the paramteres that were added,
- // and then generates a HAL-specific wrapper to be used in the function
- // table.
-#if defined(AUDIO_DEVICE_API_VERSION_3_0)
- typedef int OpenInputStreamHAL_t(
- audio_io_handle_t, audio_devices_t, audio_config*, audio_stream_in**,
- audio_input_flags_t, const char*, audio_source_t);
-
- int OpenInputStreamCurrentHAL(
- audio_io_handle_t a, audio_devices_t b, audio_config* c,
- audio_stream_in** d, audio_input_flags_t e, const char* f,
- audio_source_t g) {
- return OpenInputStream(a, b, c, d, e, f, g);
- }
-
- typedef int OpenOutputStreamHAL_t(
- audio_io_handle_t, audio_devices_t, audio_output_flags_t,
- audio_config*, audio_stream_out**,
- const char*);
-
- int OpenOutputStreamCurrentHAL(
- audio_io_handle_t a, audio_devices_t b, audio_output_flags_t c,
- audio_config* d, audio_stream_out** e,
- const char* f) {
- return OpenOutputStream(a, b, c, d, e, f);
- }
-#else
- typedef int OpenInputStreamHAL_t(
- audio_io_handle_t, audio_devices_t, audio_config*, audio_stream_in**);
-
- int OpenInputStreamCurrentHAL(
- audio_io_handle_t a, audio_devices_t b, audio_config* c,
- audio_stream_in** d) {
- return OpenInputStream(a, b, c, d);
- }
-
- typedef int OpenOutputStreamHAL_t(
- audio_io_handle_t, audio_devices_t, audio_output_flags_t,
- audio_config*, audio_stream_out**);
-
- int OpenOutputStreamCurrentHAL(
- audio_io_handle_t a, audio_devices_t b, audio_output_flags_t c,
- audio_config* d, audio_stream_out** e) {
- return OpenOutputStream(a, b, c, d, e);
- }
-#endif
-
- //TODO(ghartman): Update this when we support 3.0.
-#if defined(AUDIO_DEVICE_API_VERSION_2_0)
- static const unsigned int version_ = AUDIO_DEVICE_API_VERSION_2_0;
-#else
- static const unsigned int version_ = AUDIO_DEVICE_API_VERSION_1_0;
-#endif
-
- using AudioDataRegionView = vsoc::audio_data::AudioDataRegionView;
- AudioDataRegionView* audio_data_rv_{};
- std::unique_ptr<vsoc::RegionWorker> audio_worker_;
-
- // Lock to protect the data below.
- mutable cvd::Mutex lock_;
- // State that is managed at the device level.
- float voice_volume_;
- float master_volume_;
- bool master_muted_;
- bool mic_muted_;
- audio_mode_t mode_;
- // There can be multiple input and output streams. This field is used
- // to assign each one a unique identifier.
- // TODO(ghartman): This can wrap after 2^32 streams. Ideally we should check
- // the output_list_ to ensure that the stream number hasn't been assigned.
- // However, streams don't really appear and disapper that often.
- // We use the same counter for both input and output streams to make things
- // a little easier on the client.
- uint32_t next_stream_number_;
- // List of the currently active output streams.
- // Used to clean things up Close()
- std::list<GceAudioOutputStream *> output_list_;
- // List of the currently active input streams.
- // Used to clean things up Close()
- typedef std::map<uint32_t, GceAudioInputStream *> input_map_t;
- input_map_t input_map_;
-
- GceAudio() :
- audio_hw_device(),
- voice_volume_(0.0),
- master_volume_(0.0),
- master_muted_(false),
- mic_muted_(false),
- mode_(AUDIO_MODE_NORMAL),
- next_stream_number_(1) { }
-};
-
-}
diff --git a/guest/hals/audio/legacy/vsoc_audio_input_stream.cpp b/guest/hals/audio/legacy/vsoc_audio_input_stream.cpp
deleted file mode 100644
index bb9e196..0000000
--- a/guest/hals/audio/legacy/vsoc_audio_input_stream.cpp
+++ /dev/null
@@ -1,184 +0,0 @@
-/*
- * Copyright (C) 2016 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 <pthread.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <cstdint>
-#include <cinttypes>
-
-extern "C"{
-#include <cutils/str_parms.h>
-}
-
-#include "common/libs/auto_resources/auto_resources.h"
-#include "common/libs/threads/thunkers.h"
-#include "guest/hals/audio/legacy/audio_hal.h"
-#include "guest/hals/audio/legacy/vsoc_audio.h"
-#include "guest/hals/audio/legacy/vsoc_audio_input_stream.h"
-
-namespace cvd {
-
-#if defined(AUDIO_DEVICE_API_VERSION_3_0)
-static inline size_t GceAudioFrameSize(const audio_stream_in* s) {
- return audio_stream_in_frame_size(s);
-}
-#elif defined(AUDIO_DEVICE_API_VERSION_2_0)
-static inline size_t GceAudioFrameSize(const audio_stream_in* s) {
-
- return audio_stream_frame_size(&s->common);
-}
-#else
-static inline size_t GceAudioFrameSize(audio_stream_in* s) {
-
- return audio_stream_frame_size(&s->common);
-}
-#endif
-
-GceAudioInputStream::GceAudioInputStream(
- cvd::GceAudio* dev, audio_devices_t devices, const audio_config& config)
- : audio_stream_in(),
- dev_(dev),
- config_(config),
- gain_(0.0),
- device_(devices) {
- common.get_sample_rate =
- cvd::thunk<audio_stream, &GceAudioInputStream::GetSampleRate>;
- common.set_sample_rate =
- cvd::thunk<audio_stream, &GceAudioInputStream::SetSampleRate>;
- common.get_buffer_size =
- cvd::thunk<audio_stream, &GceAudioInputStream::GetBufferSize>;
- common.get_channels =
- cvd::thunk<audio_stream, &GceAudioInputStream::GetChannels>;
- common.get_device = cvd::thunk<audio_stream, &GceAudioInputStream::GetDevice>;
- common.set_device = cvd::thunk<audio_stream, &GceAudioInputStream::SetDevice>;
- common.get_format = cvd::thunk<audio_stream, &GceAudioInputStream::GetFormat>;
- common.set_format = cvd::thunk<audio_stream, &GceAudioInputStream::SetFormat>;
- common.standby = cvd::thunk<audio_stream, &GceAudioInputStream::Standby>;
- common.dump = cvd::thunk<audio_stream, &GceAudioInputStream::Dump>;
- common.set_parameters = GceAudio::SetStreamParameters;
- common.get_parameters =
- cvd::thunk<audio_stream, &GceAudioInputStream::GetParameters>;
- common.add_audio_effect =
- cvd::thunk<audio_stream, &GceAudioInputStream::AddAudioEffect>;
- common.remove_audio_effect = cvd::thunk<audio_stream,
- &GceAudioInputStream::RemoveAudioEffect>;
- set_gain = cvd::thunk<audio_stream_in, &GceAudioInputStream::SetGain>;
- read = cvd::thunk<audio_stream_in,
- &GceAudioInputStream::Read>;
- get_input_frames_lost = cvd::thunk<audio_stream_in,
- &GceAudioInputStream::GetInputFramesLost>;
- frame_size_ = GceAudioFrameSize(this);
- buffer_model_.reset(
- new SimulatedInputBuffer(config_.sample_rate, GetBufferSize() /
- frame_size_));
- reported_lost_frames_ = 0;
-}
-
-gce_audio_message GceAudioInputStream::GetStreamDescriptor(
- uint32_t stream_number, gce_audio_message::message_t event) {
- gce_audio_message rval;
- rval.message_type = event;
- rval.stream_number = stream_number;
- rval.frame_num = buffer_model_->GetCurrentItemNum();
- rval.time_presented =
- buffer_model_->GetLastUpdatedTime().SinceEpoch().GetTS();
- rval.frame_rate = config_.sample_rate;
- rval.channel_mask = config_.channel_mask;
- rval.format = config_.format;
- rval.frame_size = frame_size_;
- return rval;
-}
-
-int GceAudioInputStream::Open(GceAudio* dev,
- audio_io_handle_t /*handle*/,
- audio_devices_t devices,
- const audio_config& config,
- GceAudioInputStream** stream_in) {
- D("GceAudioInputStream::%s", __FUNCTION__);
- *stream_in = new GceAudioInputStream(dev, devices, config);
- return 0;
-}
-
-int GceAudioInputStream::SetFormat(audio_format_t format) {
- config_.format = format;
- frame_size_ = GceAudioFrameSize(this);
- return 0;
-}
-
-int GceAudioInputStream::Dump(int fd) const {
- D("GceAudioInputStream::%s", __FUNCTION__);
- dprintf(
- fd,
- "\tInputSteam Dump:\n"
- "\t\tsample rate: %u\n"
- "\t\tbuffer size: %zu\n"
- "\t\tchannel mask: %08x\n"
- "\t\tformat: %d\n"
- "\t\tdevice: %08x\n"
- "\t\taudio dev: %p\n\n",
- GetSampleRate(), GetBufferSize(),
- GetChannels(), GetFormat(), device_, dev_);
- return 0;
-}
-
-int GceAudioInputStream::SetSampleRate(uint32_t sample_rate) {
- if (sample_rate != config_.sample_rate) {
- config_.sample_rate = sample_rate;
- buffer_model_.reset(
- new SimulatedInputBuffer(sample_rate, GetBufferSize() / frame_size_));
- reported_lost_frames_ = 0;
- }
- return 0;
-}
-
-char* GceAudioInputStream::GetParameters(const char* keys) const {
- D("GceAudioInputStream::%s", __FUNCTION__);
- if (keys) D("GceAudioInputStream::%s keys %s", __FUNCTION__, keys);
-
- str_parms* query = str_parms_create_str(keys);
- str_parms* reply = str_parms_create();
-
- char value[256];
- int ret = str_parms_get_str(query, AUDIO_PARAMETER_STREAM_ROUTING,
- value, sizeof(value));
- char* str;
- if (ret >= 0) {
- str_parms_add_int(reply, AUDIO_PARAMETER_STREAM_ROUTING, device_);
- str = strdup(str_parms_to_str(reply));
- } else {
- str = strdup(keys);
- }
- str_parms_destroy(query);
- str_parms_destroy(reply);
- return str;
-}
-
-
-ssize_t GceAudioInputStream::Read(void* buffer, size_t bytes) {
- int64_t available = buffer_model_->RemoveFromInputBuffer(
- bytes / frame_size_, false) * frame_size_;
- ssize_t rval = available;
- if ((rval != available) || (rval < 0)) {
- ALOGE("GceAudioInputStream:%s got bad value from "
- "RemoveFromInputBuffer %" PRId64, __FUNCTION__, available);
- return -1;
- }
- memset(buffer, 0, rval);
- return rval;
-}
-
-}
diff --git a/guest/hals/audio/legacy/vsoc_audio_input_stream.h b/guest/hals/audio/legacy/vsoc_audio_input_stream.h
deleted file mode 100644
index 222194c..0000000
--- a/guest/hals/audio/legacy/vsoc_audio_input_stream.h
+++ /dev/null
@@ -1,169 +0,0 @@
-/*
- * Copyright (C) 2016 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.
- */
-#pragma once
-
-#include <memory>
-
-#include "common/libs/utils/simulated_buffer.h"
-#include "common/vsoc/lib/vsoc_audio_message.h"
-#include "guest/hals/audio/legacy/audio_hal.h"
-
-namespace cvd {
-
-namespace {
-static const int IN_BUFFER_BYTES = 4096;
-}
-
-class GceAudio;
-
-// Defines static callback functions for generic_stream_in HAL interface.
-class GceAudioInputStream : public audio_stream_in {
- public:
- // These methods are internal to the GCE audio implementation.
- // Factory for new input streams.
- static int Open(
- GceAudio* dev, audio_io_handle_t handle,
- audio_devices_t devices, const audio_config& config,
- GceAudioInputStream** stream_in);
-
- // Gets a description of this stream
- gce_audio_message GetStreamDescriptor(
- uint32_t stream_number, gce_audio_message::message_t event);
-
- // audio_stream_in implementation. These definitions follow the ones
- // in hardware/libhardware/include/hardware/audio.h
-
- // Returns the sampling rate in Hz - eg. 44100.
- uint32_t GetSampleRate() const { return config_.sample_rate; }
-
- // Sets the sample rate
- // no direct calls from JB and later, but called indirectly from
- // GceAudio::SetStreamParamters when it finds
- // AUDIO_PARAMETER_STREAM_SAMPLING_RATE
- int SetSampleRate(uint32_t rate);
-
- // Returns the size of input/output buffer in bytes for this stream - eg.
- // 4800.
- // It should be a multiple of the frame size. See also get_input_buffer_size
- size_t GetBufferSize() const {
- return IN_BUFFER_BYTES;
- }
-
- // Returns the channel mask -
- // e.g. AUDIO_CHANNEL_OUT_STEREO or AUDIO_CHANNEL_IN_STEREO
- audio_channel_mask_t GetChannels() const {
- return config_.channel_mask;
- }
-
- // Returns the audio format - e.g. AUDIO_FORMAT_PCM_16_BIT
- audio_format_t GetFormat() const {
- return config_.format;
- }
-
- // Sets the audio format
- // no direct calls from JB and later, but called indirectly from
- // GceAudio::SetStreamParamters when it finds
- // AUDIO_PARAMETER_STREAM_FORMAT
- int SetFormat(audio_format_t format);
-
- // Puts the audio hardware input/output into standby mode.
- // Driver should exit from standby mode at the next I/O operation.
- // Returns 0 on success and <0 on failure.
- int Standby() { return 0; }
-
- // Dumps the state of the audio input/output device
- int Dump(int fd) const;
-
- // Returns the set of device(s) which this stream is connected to
- audio_devices_t GetDevice() const {
- return device_;
- }
-
- // Sets the device this stream is connected to.
- // no direct calls from JB and later, but called indirectly from
- // GceAudio::SetStreamParamters when it finds
- // AUDIO_PARAMETER_STREAM_ROUTING for both input and output.
- // AUDIO_PARAMETER_STREAM_INPUT_SOURCE is an additional information used by
- // input streams only.
- int SetDevice(audio_devices_t device) { device_ = device; return 0; }
-
- // sets audio stream parameters. The function accepts a list of
- // parameter key value pairs in the form: key1=value1;key2=value2;...
- //
- // Some keys are reserved for standard parameters (See AudioParameter class)
- //
- // If the implementation does not accept a parameter change while
- // the output is active but the parameter is acceptable otherwise, it must
- // return -ENOSYS.
- // The audio flinger will put the stream in standby and then change the
- // parameter value.
- // Uses GceAudio::SetStreamParameters
-
- // Returns a pointer to a heap allocated string. The caller is responsible
- // for freeing the memory for it using free().
- char* GetParameters(const char* keys) const;
-
- int AddAudioEffect(effect_handle_t /*effect*/) const {
- return 0;
- }
-
- int RemoveAudioEffect(effect_handle_t /*effect*/) const {
- return 0;
- }
-
- // Input stream specific methods
-
- // Sets the input gain for the audio driver. This method is for
- // for future use as of M.
- int SetGain(float gain) {
- gain_ = gain;
- return 0;
- }
-
- // Reads audio buffer in from audio driver. Returns number of bytes read, or
- // a negative android::status_t. If at least one frame was read prior to the error,
- // read should return that byte count and then return an error in the
- // subsequent call.
- ssize_t Read(void* buffer, size_t bytes);
-
- // Return the amount of input frames lost in the audio driver since the
- // last call of this function.
- // Audio driver is expected to reset the value to 0 and restart counting
- // upon returning the current value by this function call.
- // Such loss typically occurs when the user space process is blocked
- // longer than the capacity of audio driver buffers.
- //
- // Unit: the number of input audio frames
- uint32_t GetInputFramesLost() {
- int64_t cur_lost_frames = buffer_model_->GetLostInputItems();
- uint32_t rval = cur_lost_frames - reported_lost_frames_;
- reported_lost_frames_ = cur_lost_frames;
- return rval;
- }
-
- private:
- GceAudioInputStream(cvd::GceAudio* dev, audio_devices_t devices,
- const audio_config& config);
- std::unique_ptr<SimulatedInputBuffer> buffer_model_;
- cvd::GceAudio *dev_;
- audio_config config_;
- float gain_;
- audio_devices_t device_;
- size_t frame_size_;
- int64_t reported_lost_frames_;
-};
-
-}
diff --git a/guest/hals/audio/legacy/vsoc_audio_output_stream.cpp b/guest/hals/audio/legacy/vsoc_audio_output_stream.cpp
deleted file mode 100644
index 571f95e..0000000
--- a/guest/hals/audio/legacy/vsoc_audio_output_stream.cpp
+++ /dev/null
@@ -1,322 +0,0 @@
-/*
- * Copyright (C) 2016 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 <pthread.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <memory>
-
-#include <cutils/sockets.h>
-extern "C"{
-#include <cutils/str_parms.h>
-}
-
-#include "common/libs/auto_resources/auto_resources.h"
-#include "common/libs/threads/thunkers.h"
-#include "common/libs/time/monotonic_time.h"
-#include "guest/hals/audio/legacy/audio_hal.h"
-#include "guest/hals/audio/legacy/vsoc_audio.h"
-#include "guest/hals/audio/legacy/vsoc_audio_output_stream.h"
-#include "guest/libs/remoter/remoter_framework_pkt.h"
-
-#if defined(AUDIO_DEVICE_API_VERSION_3_0)
-static inline size_t GceAudioFrameSize(const audio_stream_out* s) {
- return audio_stream_out_frame_size(s);
-}
-#elif defined(AUDIO_DEVICE_API_VERSION_2_0)
-static inline size_t GceAudioFrameSize(const audio_stream_out* s) {
-
- return audio_stream_frame_size(&s->common);
-}
-#else
-static inline size_t GceAudioFrameSize(audio_stream_out* s) {
-
- return audio_stream_frame_size(&s->common);
-}
-#endif
-
-namespace cvd {
-
-const size_t GceAudioOutputStream::kOutBufferSize;
-const size_t GceAudioOutputStream::kOutLatency;
-
-GceAudioOutputStream::GceAudioOutputStream(GceAudio* dev) :
- audio_stream_out(),
- dev_(dev),
- device_(AUDIO_DEVICE_OUT_DEFAULT),
- frame_count_(0),
- left_volume_(0.0),
- right_volume_(0.0) { }
-
-int GceAudioOutputStream::Dump(int fd) const {
- D("GceAudioOutputStream::%s", __FUNCTION__);
- dprintf(
- fd,
- "\tout_dump:\n"
- "\t\tsample rate: %u\n"
- "\t\tbuffer size: %zu\n"
- "\t\tchannel mask: %08x\n"
- "\t\tformat: %d\n"
- "\t\tdevice: %08x\n"
- "\t\taudio dev: %p\n\n",
- GetSampleRate(),
- GetBufferSize(),
- GetChannels(),
- GetFormat(),
- device_,
- dev_);
- return 0;
-}
-
-int GceAudioOutputStream::GetNextWriteTimestamp(int64_t* nstime) const {
- *nstime = cvd::time::Nanoseconds(
- buffer_->GetNextOutputBufferItemTime().SinceEpoch()).count();
- return 0;
-}
-
-namespace {
-struct StrParmsDestroyer {
- void operator()(str_parms* parms) const {
- if (parms) {
- str_parms_destroy(parms);
- }
- }
-};
-
-typedef std::unique_ptr<str_parms, StrParmsDestroyer> StrParmsPtr;
-}
-
-int GceAudioOutputStream::SetParameters(const char* kv_pairs) {
- int err = 0;
- StrParmsPtr parms(str_parms_create_str(kv_pairs));
- {
- int fmt = 0;
- if (str_parms_get_int(parms.get(), AUDIO_PARAMETER_STREAM_FORMAT, &fmt)
- == 0) {
- SetFormat(static_cast<audio_format_t>(fmt));
- }
- }
- {
- int sample_rate = 0;
- if (str_parms_get_int(parms.get(), AUDIO_PARAMETER_STREAM_SAMPLING_RATE,
- &sample_rate) == 0) {
- SetSampleRate(static_cast<uint32_t>(sample_rate));
- }
- }
- {
- int routing = 0;
- if (str_parms_get_int(parms.get(), AUDIO_PARAMETER_STREAM_ROUTING,
- &routing) == 0) {
- device_ = static_cast<uint32_t>(routing);
- }
- }
- {
- int channels = 0;
- if (str_parms_get_int(parms.get(), AUDIO_PARAMETER_STREAM_CHANNELS,
- &channels) == 0) {
- message_header_.channel_mask = static_cast<audio_channel_mask_t>(channels);
- }
- }
- {
- int frame_count = 0;
- if (str_parms_get_int(parms.get(), AUDIO_PARAMETER_STREAM_FRAME_COUNT,
- &frame_count) == 0) {
- frame_count_ = static_cast<size_t>(frame_count);
- }
- }
- {
- int input_source = 0;
- if (str_parms_get_int(parms.get(), AUDIO_PARAMETER_STREAM_INPUT_SOURCE,
- &input_source) == 0){
- ALOGE("GceAudioOutputStream::%s AUDIO_PARAMETER_STREAM_INPUT_SOURCE"
- " passed to an output stream", __FUNCTION__);
- err = -EINVAL;
- }
- }
- return err;
-}
-
-void GceAudioOutputStream::AddIntIfKeyPresent(
- /*const */ str_parms* query, str_parms* reply, const char* key, int value) {
- if (str_parms_get_str(query, key, NULL, 0) >= 0) {
- str_parms_add_int(reply, key, value);
- }
-}
-
-
-char* GceAudioOutputStream::GetParameters(const char* keys) const {
- D("GceAudioOutputStream::%s", __FUNCTION__);
- if (keys) D("%s keys %s", __FUNCTION__, keys);
-
- StrParmsPtr query(str_parms_create_str(keys));
- StrParmsPtr reply(str_parms_create());
-
- AddIntIfKeyPresent(query.get(), reply.get(),
- AUDIO_PARAMETER_STREAM_FORMAT,
- static_cast<int>(GetFormat()));
- AddIntIfKeyPresent(query.get(), reply.get(),
- AUDIO_PARAMETER_STREAM_SAMPLING_RATE,
- static_cast<int>(GetSampleRate()));
- AddIntIfKeyPresent(query.get(), reply.get(),
- AUDIO_PARAMETER_STREAM_ROUTING,
- static_cast<int>(device_));
- AddIntIfKeyPresent(query.get(), reply.get(),
- AUDIO_PARAMETER_STREAM_CHANNELS,
- static_cast<int>(message_header_.channel_mask));
- AddIntIfKeyPresent(query.get(), reply.get(),
- AUDIO_PARAMETER_STREAM_FRAME_COUNT,
- static_cast<int>(frame_count_));
-
- char *str = str_parms_to_str(reply.get());
- return str;
-}
-
-int GceAudioOutputStream::GetRenderPosition(uint32_t* dsp_frames) const {
- *dsp_frames = buffer_->GetCurrentItemNum();
- return 0;
-}
-
-ssize_t GceAudioOutputStream::Write(const void* buffer, size_t length) {
- // We're always the blocking case for now.
- static const bool blocking = true;
- message_header_.frame_size = frame_size_;
- frame_count_ += message_header_.num_frames_presented = length / frame_size_;
- message_header_.message_type = gce_audio_message::DATA_SAMPLES;
- // First do a nonblocking add
- int64_t frames_accepted_without_blocking = buffer_->AddToOutputBuffer(
- message_header_.num_frames_presented, false);
- // This seems backward, but adding the items to the buffer first
- // allows us to calculate the right frame number in the case of underflow.
- message_header_.frame_num =
- buffer_->GetNextOutputBufferItemNum() - frames_accepted_without_blocking;
- message_header_.time_presented =
- buffer_->GetLastUpdatedTime().SinceEpoch().GetTS();
- // We want to send the message before blocking. If we're in blocking mode
- // we will accept all of the frames.
- if (blocking) {
- message_header_.num_frames_accepted =
- message_header_.num_frames_presented;
- } else {
- message_header_.num_frames_accepted = frames_accepted_without_blocking;
- }
- // Never exceed the maximum packet size, as defined by the interface.
- // Clip off any frames that we can't transmit and increment the clipped
- // count.
- size_t transmitted_frame_size = length;
- if (length > gce_audio_message::kMaxAudioFrameLen) {
- transmitted_frame_size = gce_audio_message::kMaxAudioFrameLen;
- message_header_.num_packets_shortened++;
- }
- message_header_.total_size =
- sizeof(message_header_) + transmitted_frame_size;
- // Now send the message. Do not block if the receiver isn't ready
- // If this is a blocking write we will block after we have attempted to
- // send the data to the receiver.
- msghdr msg;
- iovec msg_iov[2];
- // We need a cast here because iov_base is defined non-const to support
- // recvmsg et.al.
- // There is no danger here:sendmsg does not write to the buffer.
- msg_iov[0].iov_base = &message_header_;
- msg_iov[0].iov_len = sizeof(message_header_);
- msg_iov[1].iov_base = const_cast<void*>(buffer);
- msg_iov[1].iov_len = transmitted_frame_size;
- msg.msg_name = NULL;
- msg.msg_namelen = 0;
- msg.msg_iov = msg_iov;
- msg.msg_iovlen = arraysize(msg_iov);
- msg.msg_control = NULL;
- msg.msg_controllen = 0;
- msg.msg_flags = 0;
- if (dev_->SendMsg(msg, MSG_DONTWAIT) < 0) {
- message_header_.num_packets_dropped++;
- }
- if (!blocking) {
- return frames_accepted_without_blocking * frame_size_;
- }
- if ((message_header_.num_frames_presented) >
- static_cast<size_t>(frames_accepted_without_blocking)) {
- buffer_->AddToOutputBuffer(
- message_header_.num_frames_presented -
- frames_accepted_without_blocking, true);
- }
- return message_header_.num_frames_presented * frame_size_;
-}
-
-int GceAudioOutputStream::Open(
- GceAudio* dev, audio_io_handle_t /*handle*/,
- audio_devices_t devices, audio_output_flags_t /*flags*/,
- audio_config* config, uint32_t stream_number,
- GceAudioOutputStream** stream_out) {
- D("GceAudioOutputStream::%s", __FUNCTION__);
- *stream_out = NULL;
- // Deleted by Close(); UniquePtr holds until end of Open().
- std::unique_ptr<GceAudioOutputStream> out(
- new GceAudioOutputStream(dev));
- out->message_header_.stream_number = stream_number;
- out->message_header_.format = config->format;
- out->message_header_.channel_mask = config->channel_mask;
- out->message_header_.frame_rate = config->sample_rate;
- out->frame_count_ = config->frame_count;
- out->common.get_sample_rate =
- cvd::thunk<audio_stream, &GceAudioOutputStream::GetSampleRate>;
- out->common.set_sample_rate =
- cvd::thunk<audio_stream, &GceAudioOutputStream::SetSampleRate>;
- out->common.get_buffer_size =
- cvd::thunk<audio_stream, &GceAudioOutputStream::GetBufferSize>;
- out->common.get_channels =
- cvd::thunk<audio_stream, &GceAudioOutputStream::GetChannels>;
- out->common.get_format = cvd::thunk<audio_stream, &GceAudioOutputStream::GetFormat>;
- out->common.set_format = cvd::thunk<audio_stream, &GceAudioOutputStream::SetFormat>;
- out->common.standby = cvd::thunk<audio_stream, &GceAudioOutputStream::Standby>;
- out->common.dump = cvd::thunk<audio_stream, &GceAudioOutputStream::Dump>;
- out->common.get_device = cvd::thunk<audio_stream, &GceAudioOutputStream::GetDevice>;
- out->common.set_device = cvd::thunk<audio_stream, &GceAudioOutputStream::SetDevice>;
- out->common.set_parameters =
- cvd::thunk<audio_stream, &GceAudioOutputStream::SetParameters>;
- out->common.get_parameters =
- cvd::thunk<audio_stream, &GceAudioOutputStream::GetParameters>;
- out->common.add_audio_effect =
- cvd::thunk<audio_stream, &GceAudioOutputStream::AddAudioEffect>;
- out->common.remove_audio_effect =
- cvd::thunk<audio_stream, &GceAudioOutputStream::RemoveAudioEffect>;
-
- out->get_latency =
- cvd::thunk<audio_stream_out, &GceAudioOutputStream::GetLatency>;
- out->set_volume =
- cvd::thunk<audio_stream_out, &GceAudioOutputStream::SetVolume>;
- out->write =
- cvd::thunk<audio_stream_out, &GceAudioOutputStream::Write>;
- out->get_render_position =
- cvd::thunk<audio_stream_out, &GceAudioOutputStream::GetRenderPosition>;
- out->get_next_write_timestamp =
- cvd::thunk<audio_stream_out, &GceAudioOutputStream::GetNextWriteTimestamp>;
- out->device_ = devices;
- out->frame_size_ = GceAudioFrameSize(out.get());
-
- int64_t item_capacity =
- out->frame_size_ == 0 ? 0 : out->GetBufferSize() / out->frame_size_;
- if (item_capacity == 0) {
- ALOGE("Attempt to create GceAudioOutputStream with frame_size_ of 0.");
- return -EINVAL;
- }
- out->buffer_.reset(
- new SimulatedOutputBuffer(
- config->sample_rate, item_capacity));
- *stream_out = out.release();
- return 0;
-}
-
-} // namespace cvd
diff --git a/guest/hals/audio/legacy/vsoc_audio_output_stream.h b/guest/hals/audio/legacy/vsoc_audio_output_stream.h
deleted file mode 100644
index 70ced6e..0000000
--- a/guest/hals/audio/legacy/vsoc_audio_output_stream.h
+++ /dev/null
@@ -1,313 +0,0 @@
-/*
- * Copyright (C) 2016 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.
- */
-#pragma once
-
-#include <memory>
-
-#include "common/libs/utils/simulated_buffer.h"
-#include "common/vsoc/lib/vsoc_audio_message.h"
-#include "guest/hals/audio/legacy/audio_hal.h"
-
-namespace cvd {
-
-// Defines static callback functions for the audio_stream and audio_stream_out
-// interfaces in libhardware/include/hardware/audio.h
-//
-// Where the is a conflict the comments there apply.
-// By default these methods return 0 on success -<errno> for failure.
-class GceAudioOutputStream : public audio_stream_out {
- public:
- // Factory method for a new output stream.
- static int Open(GceAudio* dev, audio_io_handle_t handle,
- audio_devices_t devices, audio_output_flags_t flags,
- audio_config* config, uint32_t stream_number,
- GceAudioOutputStream** stream_out);
-
- gce_audio_message GetStreamDescriptor(
- gce_audio_message::message_t message_type) const {
- gce_audio_message rval = message_header_;
- rval.total_size = sizeof(rval);
- rval.header_size = sizeof(rval);
- rval.message_type = message_type;
- rval.num_frames_presented = 0;
- rval.num_frames_accepted = 0;
- return rval;
- }
-
- // Method from audio_stream, listed in order of appearance.
- // TODO(ghartman): Consider moving these if they could be shared with
- // gce_audio_input_stream.
-
-
- // Returns the sampling rate in Hz - eg. 44100.
- uint32_t GetSampleRate() const {
- return message_header_.frame_rate;
- }
-
- // Sets the sample rate
- // AUDIO_PARAMETER_STREAM_SAMPLING_RATE
- int SetSampleRate(uint32_t sample_rate) {
- if (sample_rate != message_header_.frame_rate) {
- message_header_.frame_rate = sample_rate;
- // TODO(ghartman): The output buffer should be quantized at about 192
- // bytes for better fidelity. Do this by passing
- // frame_rate * frame_size / 192 and then rescaling the outputs.
- // Or we could always create a quantized wrapper of the buffer...
- buffer_.reset(
- new SimulatedOutputBuffer(
- sample_rate, GetBufferSize() / frame_size_));
- }
- return 0;
- }
-
- // Returns the size of input/output buffer in bytes for this stream.
- // eg. 4800.
- // It should be a multiple of the frame size. See also GetInputBufferSize.
- size_t GetBufferSize() const {
- return kOutBufferSize;
- }
-
- // Returns the channel mask -
- // e.g. AUDIO_CHANNEL_OUT_STEREO or AUDIO_CHANNEL_IN_STEREO
- audio_channel_mask_t GetChannels() const {
- return message_header_.channel_mask;
- }
-
- // Returns the audio format - e.g. AUDIO_FORMAT_PCM_16_BIT
- audio_format_t GetFormat() const {
- return message_header_.format;
- }
-
- // Sets the audio format.
- // Unused as of JB - use set_parameters with key
- // AUDIO_PARAMETER_STREAM_FORMAT
- int SetFormat(audio_format_t format) {
- message_header_.format = format;
- return 0;
- }
-
- // Puts the audio hardware input/output into standby mode.
- // Driver should exit from standby mode at the next I/O operation.
- // Returns 0 on success and <0 on failure.
- // TODO(ghartman): This should reset some of the frame counts.
- int Standby() {
- return 0;
- }
-
- // dumps the state of the audio hardware to the given fd.
- // This information can be retrieved using the dumpsys utility.
- int Dump(int fd) const;
-
- // Returns the set of device(s) which this stream is connected to.
- // TODO(ghartman): Implement this.
- audio_devices_t GetDevice() const { return device_; }
-
- // Not directly called from JB forward.
- // Called indirectly from SetParameters with the key
- // AUDIO_PARAMETER_STREAM_ROUTING
- int SetDevice(audio_devices_t device) { device_ = device; return 0; }
-
- // Sets audio stream parameters. The function accepts a list of
- // parameter key value pairs in the form: key1=value1;key2=value2;...
- //
- // Some keys are reserved for standard parameters (See AudioParameter class)
- //
- // If the implementation does not accept a parameter change while
- // the output is active but the parameter is acceptable otherwise, it must
- // return -ENOSYS.
- //
- // The audio flinger will put the stream in standby and then change the
- // parameter value.
- int SetParameters(const char* kv_pairs);
-
- // Gets audio stream parameters. The function accepts a list of
- // keys in the form: key1=value1;key2=value2;...
- //
- // Returns a pointer to a heap allocated string. The caller is responsible
- // for freeing the memory for it using free().
- // TODO(ghartman): Implement this.
- char* GetParameters(const char* keys) const;
-
- // TODO(ghartman): Implement this.
- int AddAudioEffect(effect_handle_t /*effect*/) const {
- static unsigned int printed = 0; // printed every 2^32-th call.
- ALOGE_IF(!printed++, "%s: not implemented", __FUNCTION__);
- return 0;
- }
-
- // TODO(ghartman): Implement this.
- int RemoveAudioEffect(effect_handle_t /*effect*/) const {
- static unsigned int printed = 0; // printed every 2^32-th call.
- ALOGE_IF(!printed++, "%s: not implemented", __FUNCTION__);
- return 0;
- }
-
- // Methods defined in audio_stream_out
-
- // Returns the audio hardware driver estimated latency in milliseconds.
- // TODO(ghartman): Calculate this based on the format and the quantum.
- uint32_t GetLatency() const {
- return kOutLatency;
- }
-
- // Use this method in situations where audio mixing is done in the
- // hardware. This method serves as a direct interface with hardware,
- // allowing you to directly set the volume as apposed to via the framework.
- // This method might produce multiple PCM outputs or hardware accelerated
- // codecs, such as MP3 or AAC.
- //
- // Note that GCE simulates hardware mixing.
- int SetVolume(float left_volume, float right_volume) {
- left_volume_ = left_volume;
- right_volume_ = right_volume;
- return 0;
- }
-
- // Write audio buffer to driver. Returns number of bytes written, or a
- // negative android::status_t. If at least one frame was written successfully prior
- // to the error the driver will return that successful (short) byte count
- // and then return an error in the subsequent call.
- //
- // If SetCallback() has previously been called to enable non-blocking mode
- // the Write() is not allowed to block. It must write only the number of
- // bytes that currently fit in the driver/hardware buffer and then return
- // this byte count. If this is less than the requested write size the
- // callback function must be called when more space is available in the
- // driver/hardware buffer.
- ssize_t Write(const void* buffer, size_t bytes);
-
- // Returns the number of audio frames written by the audio dsp to DAC since
- // the output has exited standby
- // TODO(ghartman): Implement zeroing this in Standby().
- int GetRenderPosition(uint32_t* dsp_frames) const;
-
- // Gets the local time at which the next write to the audio driver will be
- // presented. The units are microseconds, where the epoch is decided by the
- // local audio HAL.
- //
- // The GCE implementation uses CLOCK_MONOTONIC, which also happens to line
- // up with LocalTime.
- int GetNextWriteTimestamp(int64_t*) const;
-
- // Turns on non-blocking mode and sets the callback function for notifying
- // completion of non-blocking write and drain.
- // Calling this function implies that all future Write() and Drain()
- // must be non-blocking and use the callback to signal completion.
- //
- // TODO(ghartman): Implement this URGENTLY.
- //
- // int SetCallback(stream_callback_t callback, void *cookie);
-
- // Notifies to the audio driver to stop playback however the queued buffers
- // are retained by the hardware. Useful for implementing pause/resume. Empty
- // implementation if not supported however should be implemented for hardware
- // with non-trivial latency. In the pause state audio hardware could still be
- // using power. User may consider calling suspend after a timeout.
- //
- // Implementation of this function is mandatory for offloaded playback.
- //
- // TODO(ghartman): Implement this URGENTLY. There is already support in
- // SimulatedBuffer.
- // int Pause();
-
- // Notifies to the audio driver to resume playback following a pause.
- // Returns error if called without matching pause.
- //
- // Implementation of this function is mandatory for offloaded playback.
- //
- // TODO(ghartman): Implement this URGENTLY.
- //
- // int Resume();
-
- // Requests notification when data buffered by the driver/hardware has
- // been played. If set_callback() has previously been called to enable
- // non-blocking mode, the drain() must not block, instead it should return
- // quickly and completion of the drain is notified through the callback.
- // If set_callback() has not been called, the drain() must block until
- // completion.
- //
- // If type==AUDIO_DRAIN_ALL, the drain completes when all previously written
- // data has been played.
- //
- // If type==AUDIO_DRAIN_EARLY_NOTIFY, the drain completes shortly before all
- // data for the current track has played to allow time for the framework
- // to perform a gapless track switch.
- //
- // Drain must return immediately on stop() and flush() call
- //
- // Implementation of this function is mandatory for offloaded playback.
- //
- // TODO(ghartman): Implement this URGENTLY.
- //
- // int Drain(audio_drain_type_t type);
-
- // Notifies to the audio driver to flush the queued data. Stream must already
- // be paused before calling Flush().
- //
- // Implementation of this function is mandatory for offloaded playback.
- //
- // TODO(ghartman): Implement this URGENTLY.
- //
- // int Flush();
-
- // Returns a recent count of the number of audio frames presented to an
- // external observer. This excludes frames which have been written but are
- // still in the pipeline.
- //
- // The count is not reset to zero when output enters standby.
- // Also returns the value of CLOCK_MONOTONIC as of this presentation count.
- // The returned count is expected to be 'recent',
- // but does not need to be the most recent possible value.
- // However, the associated time should correspond to whatever count is
- // returned.
- //
- // Example: assume that N+M frames have been presented, where M is a
- // 'small' number.
- // Then it is permissible to return N instead of N+M,
- // and the timestamp should correspond to N rather than N+M.
- // The terms 'recent' and 'small' are not defined.
- // They reflect the quality of the implementation.
- //
- // 3.0 and higher only.
- //
- // TODO(ghartman): Implement this URGENTLY.
- //
- // int GetPresentationPosition(uint64_t *frames, struct timespec *timestamp);
-
- private:
- // If key is present in query, add key=value; to reply.
- // query should be pointer to const, but the str_parms functions aren't
- // const-correct, so neither is this.
- static void AddIntIfKeyPresent(
- /*const*/ str_parms* query, str_parms* reply, const char* key, int value);
-
-
- explicit GceAudioOutputStream(cvd::GceAudio*);
-
- static const size_t kOutBufferSize = 3840;
- static const size_t kOutLatency = 2;
-
- gce_audio_message message_header_;
- std::unique_ptr<SimulatedOutputBuffer> buffer_;
- cvd::GceAudio *dev_;
- audio_devices_t device_;
- size_t frame_size_;
- size_t frame_count_;
- float left_volume_;
- float right_volume_;
-};
-
-}
diff --git a/guest/hals/gralloc/Android.mk b/guest/hals/gralloc/Android.mk
deleted file mode 100644
index 68ffffa..0000000
--- a/guest/hals/gralloc/Android.mk
+++ /dev/null
@@ -1,63 +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.
-
-LOCAL_PATH := $(call my-dir)
-
-include $(CLEAR_VARS)
-
-LOCAL_MODULE := gralloc.cutf_ivsh-future
-LOCAL_MODULE_TAGS := optional
-
-LOCAL_SRC_FILES := \
- gralloc.cpp \
- mapper.cpp
-
-LOCAL_C_INCLUDES += \
- device/google/cuttlefish_common \
- device/google/cuttlefish_kernel \
- hardware/libhardware/include \
- system/core/base/include
-
-LOCAL_CFLAGS := \
- -DLOG_TAG=\"gralloc_vsoc\" \
- -Wno-missing-field-initializers \
- -Wall -Werror \
- $(VSOC_VERSION_CFLAGS)
-
-LOCAL_SHARED_LIBRARIES := \
- libbase \
- libcutils \
- cuttlefish_auto_resources \
- libcuttlefish_fs \
- liblog \
- vsoc_lib
-
-LOCAL_HEADER_LIBRARIES := \
- libhardware_headers
-
-ifeq (0, $(shell test $(PLATFORM_SDK_VERSION) -ge 21; echo $$?))
-LOCAL_MODULE_RELATIVE_PATH := hw
-else
-LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/hw
-endif
-
-LOCAL_VENDOR_MODULE := true
-
-# See b/67109557
-ifeq (true, $(TARGET_TRANSLATE_2ND_ARCH))
-LOCAL_MULTILIB := first
-endif
-include $(BUILD_SHARED_LIBRARY)
-
-include $(call first-makefiles-under,$(LOCAL_PATH))
diff --git a/guest/hals/gralloc/gralloc.cpp b/guest/hals/gralloc/gralloc.cpp
deleted file mode 100644
index d21d918..0000000
--- a/guest/hals/gralloc/gralloc.cpp
+++ /dev/null
@@ -1,320 +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 <hardware/gralloc.h>
-#include <hardware/hardware.h>
-#include <log/log.h>
-#include <stdlib.h>
-
-#include "guest/hals/gralloc/gralloc_vsoc_priv.h"
-#include "guest/vsoc/lib/gralloc_region_view.h"
-
-using vsoc::gralloc::GrallocRegionView;
-
-namespace {
-
-static const int kSwiftShaderPadding = 4;
-
-inline void formatToYcbcr(
- int format, int width, int height, void* base_v, android_ycbcr* ycbcr) {
- uintptr_t it = reinterpret_cast<uintptr_t>(base_v);
- // Clear reserved fields;
- memset(ycbcr, 0, sizeof(*ycbcr));
- switch (format) {
- case HAL_PIXEL_FORMAT_YV12:
- case HAL_PIXEL_FORMAT_YCbCr_420_888:
- ycbcr->ystride = align(width, 16);
- ycbcr->cstride = align(ycbcr->ystride / 2, 16);
- ycbcr->chroma_step = 1;
- ycbcr->y = reinterpret_cast<void*>(it);
- it += ycbcr->ystride * height;
- ycbcr->cr = reinterpret_cast<void*>(it);
- it += ycbcr->cstride * height / 2;
- ycbcr->cb = reinterpret_cast<void*>(it);
- break;
- default:
- ALOGE("%s: can't deal with format=0x%x", __FUNCTION__, format);
- }
-}
-
-inline int formatToBytesPerPixel(int format) {
- switch (format) {
- case HAL_PIXEL_FORMAT_RGBA_FP16:
- return 8;
- case HAL_PIXEL_FORMAT_RGBA_8888:
- case HAL_PIXEL_FORMAT_RGBX_8888:
- case HAL_PIXEL_FORMAT_BGRA_8888:
- // The camera 3.0 implementation assumes that IMPLEMENTATION_DEFINED
- // means HAL_PIXEL_FORMAT_RGBA_8888
- case HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED:
- return 4;
- case HAL_PIXEL_FORMAT_RGB_888:
- return 3;
- case HAL_PIXEL_FORMAT_RGB_565:
- case HAL_PIXEL_FORMAT_YV12:
- case HAL_PIXEL_FORMAT_YCbCr_420_888:
- return 2;
- case HAL_PIXEL_FORMAT_BLOB:
- return 1;
- default:
- ALOGE("%s: unknown format=%d", __FUNCTION__, format);
- return 8;
- }
-}
-
-inline int formatToBytesPerFrame(int format, int w, int h) {
- int bytes_per_pixel = formatToBytesPerPixel(format);
- int w16, h16;
- int y_size, c_size;
-
- switch (format) {
- // BLOB is used to allocate buffers for JPEG formatted data. Bytes per pixel
- // is 1, the desired buffer size is in w, and h should be 1. We refrain from
- // adding additional padding, although the caller is likely to round
- // up to a page size.
- case HAL_PIXEL_FORMAT_BLOB:
- return bytes_per_pixel * w * h;
- case HAL_PIXEL_FORMAT_YV12:
- case HAL_PIXEL_FORMAT_YCbCr_420_888:
- android_ycbcr strides;
- formatToYcbcr(format, w, h, NULL, &strides);
- y_size = strides.ystride * h;
- c_size = strides.cstride * h / 2;
- return (y_size + 2 * c_size + kSwiftShaderPadding);
- /*case HAL_PIXEL_FORMAT_RGBA_8888:
- case HAL_PIXEL_FORMAT_RGBX_8888:
- case HAL_PIXEL_FORMAT_BGRA_8888:
- case HAL_PIXEL_FORMAT_RGB_888:
- case HAL_PIXEL_FORMAT_RGB_565:*/
- default:
- w16 = align(w, 16);
- h16 = align(h, 16);
- return bytes_per_pixel * w16 * h16 + kSwiftShaderPadding;
- }
-}
-
-}
-
-/******************************************************************************/
-
-void dump(struct alloc_device_t */*dev*/, char */*buff*/, int /*buff_len*/) {}
-
-/******************************************************************************/
-
-int lock(struct gralloc_module_t const* /*module*/,
- buffer_handle_t handle,
- int /*usage*/,
- int /*l*/,
- int /*t*/,
- int /*w*/,
- int /*h*/,
- void** vaddr) {
- if (!vaddr || vsoc_buffer_handle_t::validate(handle)) {
- return -EINVAL;
- }
- // TODO(jemoreira): Check allocation usage flags against requested usage.
- const vsoc_buffer_handle_t* hnd =
- reinterpret_cast<const vsoc_buffer_handle_t*>(handle);
- void* mapped = reference_buffer(hnd);
- if (mapped == NULL) {
- ALOGE("Unable to reference buffer, %s", __FUNCTION__);
- return -1;
- }
- *vaddr = mapped;
- return 0;
-}
-
-int unlock(struct gralloc_module_t const* /*module*/, buffer_handle_t handle) {
- if (vsoc_buffer_handle_t::validate(handle)) {
- return -EINVAL;
- }
- return unreference_buffer(
- reinterpret_cast<const vsoc_buffer_handle_t*>(handle));
-}
-
-int lock_ycbcr(struct gralloc_module_t const* module,
- buffer_handle_t handle,
- int usage,
- int l,
- int t,
- int w,
- int h,
- struct android_ycbcr* ycbcr) {
- void* mapped;
- int retval = lock(module, handle, usage, l, t, w, h, &mapped);
- if (retval) {
- return retval;
- }
- const vsoc_buffer_handle_t* hnd =
- reinterpret_cast<const vsoc_buffer_handle_t*>(handle);
- formatToYcbcr(hnd->format, w, h, mapped, ycbcr);
- return 0;
-}
-
-/******************************************************************************/
-
-static int gralloc_alloc(alloc_device_t* /*dev*/,
- int w,
- int h,
- int format,
- int /*usage*/,
- buffer_handle_t* pHandle,
- int* pStrideInPixels) {
- int fd = -1;
-
- int bytes_per_pixel = formatToBytesPerPixel(format);
- int bytes_per_line;
- int stride_in_pixels;
- int size = 0;
- uint32_t offset = 0;
- // SwiftShader can't handle RGB_888, so fail fast and hard if we try to create
- // a gralloc buffer in this format.
- ALOG_ASSERT(format != HAL_PIXEL_FORMAT_RGB_888);
- if (format == HAL_PIXEL_FORMAT_YV12) {
- bytes_per_line = align(bytes_per_pixel * w, 16);
- } else {
- bytes_per_line = align(bytes_per_pixel * w, 8);
- }
- size = align(size + formatToBytesPerFrame(format, w, h), PAGE_SIZE);
- size += PAGE_SIZE;
- fd = GrallocRegionView::GetInstance()->AllocateBuffer(size, &offset);
- if (fd < 0) {
- ALOGE("Unable to allocate buffer (%s)", strerror(-fd));
- return fd;
- }
-
- stride_in_pixels = bytes_per_line / bytes_per_pixel;
- vsoc_buffer_handle_t* hnd = new vsoc_buffer_handle_t(fd,
- offset,
- size,
- format,
- w, h,
- stride_in_pixels);
- void* addr =
- reference_buffer(reinterpret_cast<const vsoc_buffer_handle_t*>(hnd));
- if (!addr) {
- ALOGE("Unable to reference buffer, %s", __FUNCTION__);
- return -EIO;
- }
-
- *pHandle = hnd;
- *pStrideInPixels = stride_in_pixels;
-
- return 0;
-}
-
-static int gralloc_free(alloc_device_t* /*dev*/, buffer_handle_t handle) {
- // No need to do anything else, the buffer will be atomatically deallocated
- // when the handle is closed.
- return unreference_buffer(
- reinterpret_cast<const vsoc_buffer_handle_t*>(handle));
-}
-
-static int register_buffer(struct gralloc_module_t const* /*module*/,
- buffer_handle_t handle) {
- if (vsoc_buffer_handle_t::validate(handle)) {
- return -EINVAL;
- }
- void* addr =
- reference_buffer(reinterpret_cast<const vsoc_buffer_handle_t*>(handle));
- if (!addr) {
- ALOGE("Unable to reference buffer, %s", __FUNCTION__);
- return -EIO;
- }
- return 0;
-}
-
-int unregister_buffer(struct gralloc_module_t const* /*module*/,
- buffer_handle_t handle) {
- if (vsoc_buffer_handle_t::validate(handle)) {
- return -EINVAL;
- }
- return unreference_buffer(
- reinterpret_cast<const vsoc_buffer_handle_t*>(handle));
-}
-
-/******************************************************************************/
-
-static int gralloc_device_close(struct hw_device_t *dev) {
- vsoc_alloc_device_t* pdev = reinterpret_cast<vsoc_alloc_device_t*>(dev);
- if (pdev) {
- free(pdev);
- }
- return 0;
-}
-
-static int gralloc_device_open(
- const hw_module_t* module, const char* name, hw_device_t** device) {
- int status = -EINVAL;
- if (!strcmp(name, GRALLOC_HARDWARE_GPU0)) {
- vsoc_alloc_device_t *dev;
- dev = (vsoc_alloc_device_t*) malloc(sizeof(*dev));
- LOG_FATAL_IF(!dev, "%s: malloc returned NULL.", __FUNCTION__);
-
- /* initialize our state here */
- memset(dev, 0, sizeof(*dev));
-
- /* initialize the procs */
- dev->device.common.tag = HARDWARE_DEVICE_TAG;
- dev->device.common.version = 0; // TODO(jemoreira): Bump to 0_2 when stable
- dev->device.common.module = const_cast<hw_module_t*>(module);
- dev->device.common.close = gralloc_device_close;
-
- dev->device.alloc = gralloc_alloc;
- dev->device.free = gralloc_free;
-
- if (!GrallocRegionView::GetInstance()) {
- LOG_FATAL("Unable to instantiate the gralloc region");
- free(dev);
- return -EIO;
- }
-
- *device = &dev->device.common;
- status = 0;
- }
- // TODO(jemoreira): Consider opening other type of devices (framebuffer)
- return status;
-}
-
-/******************************************************************************/
-
-static struct hw_module_methods_t gralloc_module_methods = {
- .open = gralloc_device_open
-};
-
-struct vsoc_gralloc_module_t HAL_MODULE_INFO_SYM = {
- .base = {
- .common = {
- .tag = HARDWARE_MODULE_TAG,
- .version_major = GRALLOC_MODULE_API_VERSION_0_2,
- .version_minor = 0,
- .id = GRALLOC_HARDWARE_MODULE_ID,
- .name = "VSoC X86 Graphics Memory Allocator Module",
- .author = "The Android Open Source Project",
- .methods = &gralloc_module_methods,
- .dso = NULL,
- .reserved = {0},
- },
- .registerBuffer = register_buffer,
- .unregisterBuffer = unregister_buffer,
- .lock = lock,
- .unlock = unlock,
- .perform = NULL,
- .lock_ycbcr = lock_ycbcr,
- .getTransportSize = NULL,
- .validateBufferSize = NULL,
- },
-};
diff --git a/guest/hals/gralloc/gralloc_vsoc_priv.h b/guest/hals/gralloc/gralloc_vsoc_priv.h
deleted file mode 100644
index 1ec5659..0000000
--- a/guest/hals/gralloc/gralloc_vsoc_priv.h
+++ /dev/null
@@ -1,100 +0,0 @@
-#pragma once
-/*
- * 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 <errno.h>
-#include <cutils/native_handle.h>
-#include <hardware/gralloc.h>
-#include <log/log.h>
-
-struct vsoc_alloc_device_t {
- alloc_device_t device;
-};
-
-struct vsoc_gralloc_module_t {
- gralloc_module_t base;
-};
-
-static_assert(sizeof(int) >= 4, "At least 4 bytes are needed for offsets");
-
-struct vsoc_buffer_handle_t : public native_handle {
- // File descriptors
- int fd;
- // ints
- int magic;
- int format;
- int x_res;
- int y_res;
- int stride_in_pixels;
- int size;
- // buffer offset in bytes divided by PAGE_SIZE
- int offset;
-
- static inline int sNumInts() {
- return ((sizeof(vsoc_buffer_handle_t) - sizeof(native_handle_t)) /
- sizeof(int) -
- sNumFds);
- }
- static const int sNumFds = 1;
- static const int sMagic = 0xc63752f4;
-
- vsoc_buffer_handle_t(int fd,
- int offset,
- int size,
- int format,
- int x_res,
- int y_res,
- int stride_in_pixels)
- : fd(fd),
- magic(sMagic),
- format(format),
- x_res(x_res),
- y_res(y_res),
- stride_in_pixels(stride_in_pixels),
- size(size),
- offset(offset) {
- version = sizeof(native_handle);
- numInts = sNumInts();
- numFds = sNumFds;
- }
-
- ~vsoc_buffer_handle_t() {
- magic = 0;
- }
-
- static int validate(const native_handle* handle) {
- const vsoc_buffer_handle_t* hnd =
- reinterpret_cast<const vsoc_buffer_handle_t*>(handle);
- if (!hnd || hnd->version != sizeof(native_handle) ||
- hnd->numInts != sNumInts() || hnd->numFds != sNumFds ||
- hnd->magic != sMagic) {
- ALOGE("Invalid gralloc handle (at %p)", handle);
- return -EINVAL;
- }
- return 0;
- }
-};
-
-// These functions are to be used to map/unmap gralloc buffers. They are thread
-// safe and ensure that the same buffer never gets mapped twice.
-void* reference_buffer(const vsoc_buffer_handle_t* hnd);
-int unreference_buffer(const vsoc_buffer_handle_t* hnd);
-
-// TODO(jemoreira): Move this to a place where it can be used by the gralloc
-// region as well.
-inline int align(int input, int alignment) {
- return (input + alignment - 1) & -alignment;
-}
diff --git a/guest/hals/gralloc/legacy/Android.mk b/guest/hals/gralloc/legacy/Android.mk
index 4bbc9c0..ac789fb 100644
--- a/guest/hals/gralloc/legacy/Android.mk
+++ b/guest/hals/gralloc/legacy/Android.mk
@@ -18,7 +18,6 @@
VSOC_GRALLOC_COMMON_SRC_FILES := \
gralloc.cpp \
- framebuffer.cpp \
mapper.cpp \
region_registry.cpp
@@ -47,8 +46,7 @@
libbase \
liblog \
libutils \
- libcutils \
- vsoc_lib
+ libcutils
LOCAL_VENDOR_MODULE := true
diff --git a/guest/hals/gralloc/legacy/framebuffer.cpp b/guest/hals/gralloc/legacy/framebuffer.cpp
deleted file mode 100644
index 5a2b7f0..0000000
--- a/guest/hals/gralloc/legacy/framebuffer.cpp
+++ /dev/null
@@ -1,155 +0,0 @@
-/*
- * Copyright (C) 2016 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 <sys/mman.h>
-
-#include <dlfcn.h>
-
-#include <cutils/ashmem.h>
-#include <log/log.h>
-#include <cutils/properties.h>
-
-#include <sys/system_properties.h>
-
-#include <hardware/hardware.h>
-#include <hardware/gralloc.h>
-
-#include <fcntl.h>
-#include <errno.h>
-#include <sys/ioctl.h>
-#include <string.h>
-#include <stdlib.h>
-
-#include <cutils/atomic.h>
-
-#if defined(__ANDROID__)
-#include <linux/fb.h>
-#endif
-
-#include "gralloc_vsoc_priv.h"
-#include "region_registry.h"
-
-#include "common/libs/auto_resources/auto_resources.h"
-#include "common/libs/threads/cuttlefish_thread.h"
-#include "common/vsoc/lib/screen_region_view.h"
-
-using vsoc::screen::ScreenRegionView;
-
-/*****************************************************************************/
-
-struct fb_context_t {
- framebuffer_device_t device;
-};
-
-/*****************************************************************************/
-
-static int fb_setSwapInterval(struct framebuffer_device_t* dev, int interval) {
- if (interval < dev->minSwapInterval || interval > dev->maxSwapInterval) {
- return -EINVAL;
- }
- // FIXME: implement fb_setSwapInterval
- return 0;
-}
-
-/*
- * These functions (and probably the entire framebuffer device) are most likely
- * not used when the hardware composer device is present, however is hard to be
- * 100% sure.
- */
-static int fb_setUpdateRect(
- struct framebuffer_device_t* dev __unused, int l, int t, int w, int h) {
- if (((w|h) <= 0) || ((l|t)<0)) {
- return -EINVAL;
- }
- // TODO(jemoreira): Find a way to broadcast this with the framebuffer control.
- return 0;
-}
-
-static int fb_post(struct framebuffer_device_t* dev __unused,
- buffer_handle_t buffer_handle) {
- static int frame_buffer_idx = 0;
-
- auto screen_view = ScreenRegionView::GetInstance();
-
- void* frame_buffer = screen_view->GetBuffer(frame_buffer_idx);
- const private_handle_t* p_handle =
- reinterpret_cast<const private_handle_t*>(buffer_handle);
- void* buffer;
- int retval =
- reinterpret_cast<gralloc_module_t*>(dev->common.module)
- ->lock(reinterpret_cast<const gralloc_module_t*>(dev->common.module),
- buffer_handle, GRALLOC_USAGE_SW_READ_OFTEN, 0, 0,
- p_handle->x_res, p_handle->y_res, &buffer);
- if (retval != 0) {
- ALOGE("Got error code %d from lock function", retval);
- return -1;
- }
- memcpy(frame_buffer, buffer, screen_view->buffer_size());
- screen_view->BroadcastNewFrame(frame_buffer_idx);
-
- frame_buffer_idx = (frame_buffer_idx + 1) % screen_view->number_of_buffers();
-
- return 0;
-}
-
-/*****************************************************************************/
-
-static int fb_close(struct hw_device_t *dev) {
- fb_context_t* ctx = (fb_context_t*)dev;
- if (ctx) {
- free(ctx);
- }
- return 0;
-}
-
-int fb_device_open(
- hw_module_t const* module, const char* name, hw_device_t** device) {
- if (strcmp(name, GRALLOC_HARDWARE_FB0) != 0) {
- return -EINVAL;
- }
- /* initialize our state here */
- fb_context_t* dev = (fb_context_t*) malloc(sizeof(*dev));
- LOG_FATAL_IF(!dev, "%s: malloc returned NULL.", __FUNCTION__);
- memset(dev, 0, sizeof(*dev));
-
- /* initialize the procs */
- dev->device.common.tag = HARDWARE_DEVICE_TAG;
- dev->device.common.version = 0;
- dev->device.common.module = const_cast<hw_module_t*>(module);
- dev->device.common.close = fb_close;
- dev->device.setSwapInterval = fb_setSwapInterval;
- dev->device.post = fb_post;
- dev->device.setUpdateRect = fb_setUpdateRect;
-
- auto screen_view = ScreenRegionView::GetInstance();
-
- int stride =
- screen_view->line_length() / screen_view->bytes_per_pixel();
- int format = HAL_PIXEL_FORMAT_RGBX_8888;
- const_cast<uint32_t&>(dev->device.flags) = 0;
- const_cast<uint32_t&>(dev->device.width) = screen_view->x_res();
- const_cast<uint32_t&>(dev->device.height) = screen_view->y_res();
- const_cast<int&>(dev->device.stride) = stride;
- const_cast<int&>(dev->device.format) = format;
- const_cast<float&>(dev->device.xdpi) = screen_view->dpi();
- const_cast<float&>(dev->device.ydpi) = screen_view->dpi();
- const_cast<float&>(dev->device.fps) =
- (screen_view->refresh_rate_hz() * 1000) / 1000.0f;
- const_cast<int&>(dev->device.minSwapInterval) = 1;
- const_cast<int&>(dev->device.maxSwapInterval) = 1;
- *device = &dev->device.common;
-
- return 0;
-}
diff --git a/guest/hals/gralloc/legacy/gralloc.cpp b/guest/hals/gralloc/legacy/gralloc.cpp
index 8a0cbd2..dbe2838 100644
--- a/guest/hals/gralloc/legacy/gralloc.cpp
+++ b/guest/hals/gralloc/legacy/gralloc.cpp
@@ -36,7 +36,6 @@
#include <hardware/gralloc.h>
#include "common/libs/auto_resources/auto_resources.h"
-#include "common/vsoc/lib/screen_region_view.h"
#include "gralloc_vsoc_priv.h"
#include "region_registry.h"
@@ -162,7 +161,7 @@
*device = &dev->device.common;
status = 0;
} else {
- status = fb_device_open(module, name, device);
+ ALOGE("Need to create framebuffer, but it is unsupported");
}
return status;
}
diff --git a/guest/hals/gralloc/legacy/gralloc_vsoc_priv.h b/guest/hals/gralloc/legacy/gralloc_vsoc_priv.h
index 2544b5a..390c654 100644
--- a/guest/hals/gralloc/legacy/gralloc_vsoc_priv.h
+++ b/guest/hals/gralloc/legacy/gralloc_vsoc_priv.h
@@ -29,8 +29,6 @@
#include <linux/fb.h>
-#include "common/vsoc/lib/screen_region_view.h"
-
#ifndef GRALLOC_MODULE_API_VERSION_0_2
// This structure will be defined in later releases of Android. Declare it
// here to allow us to structure the code well.
@@ -45,6 +43,20 @@
};
#endif
+namespace vsoc {
+namespace screen {
+
+struct ScreenRegionView {
+ static int align(int input) {
+ auto constexpr alignment = 16;
+ return (input + alignment - 1) & -alignment;
+ }
+ static constexpr int kSwiftShaderPadding = 4;
+};
+
+}
+}
+
/*****************************************************************************/
struct private_handle_t;
@@ -297,9 +309,6 @@
}
}
-int fb_device_open(
- const hw_module_t* module, const char* name, hw_device_t** device);
-
int gralloc_lock(
gralloc_module_t const* module,
buffer_handle_t handle, int usage,
diff --git a/guest/hals/gralloc/mapper.cpp b/guest/hals/gralloc/mapper.cpp
deleted file mode 100644
index e9ba2eb..0000000
--- a/guest/hals/gralloc/mapper.cpp
+++ /dev/null
@@ -1,132 +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 "gralloc_vsoc_priv.h"
-
-#include <unistd.h>
-#include <string.h>
-#include <sys/mman.h>
-
-#include <cutils/hashmap.h>
-#include <hardware/gralloc.h>
-#include <hardware/hardware.h>
-#include <log/log.h>
-
-namespace {
-
-const size_t g_page_size = sysconf(_SC_PAGESIZE);
-
-struct HmLockGuard {
- HmLockGuard(Hashmap* map) : map_(map) {
- hashmapLock(map_);
- }
- ~HmLockGuard() {
- hashmapUnlock(map_);
- }
- private:
- Hashmap* map_;
-};
-
-int offset_hash(void* key) {
- return *reinterpret_cast<int*>(key);
-}
-
-bool offset_equals(void* key1, void* key2) {
- return *reinterpret_cast<int*>(key1) ==
- *reinterpret_cast<int*>(key2);
-}
-
-// Keeps track of how many times a buffer is locked in the current process.
-struct GrallocBuffer {
- void* vaddr;
- int ref_count;
- GrallocBuffer() : vaddr(NULL), ref_count(0) {}
-
- static Hashmap* mapped_buffers() {
- static Hashmap* mapped_buffers =
- hashmapCreate(19, offset_hash, offset_equals);
- return mapped_buffers;
- }
-};
-
-}
-
-void* reference_buffer(const vsoc_buffer_handle_t* hnd) {
- Hashmap* map = GrallocBuffer::mapped_buffers();
- HmLockGuard lock_guard(map);
- GrallocBuffer* buffer = reinterpret_cast<GrallocBuffer*>(
- hashmapGet(map, const_cast<int*>(&hnd->offset)));
- if (!buffer) {
- buffer = new GrallocBuffer();
- hashmapPut(map, const_cast<int*>(&hnd->offset), buffer);
- }
-
- if (!buffer->vaddr) {
- void* mapped =
- mmap(NULL, hnd->size, PROT_READ | PROT_WRITE, MAP_SHARED, hnd->fd, 0);
- if (mapped == MAP_FAILED) {
- ALOGE("Unable to map buffer (offset: %d, size: %d): %s",
- hnd->offset,
- hnd->size,
- strerror(errno));
- return NULL;
- }
- // Set up the guard pages. The last page is always a guard
- uintptr_t base = uintptr_t(mapped);
- uintptr_t addr = base + hnd->size - g_page_size;
- if (mprotect((void*)addr, g_page_size, PROT_NONE) == -1) {
- ALOGW("Unable to protect last page of buffer (offset: %d, size: %d): %s",
- hnd->offset,
- hnd->size,
- strerror(errno));
- }
- buffer->vaddr = mapped;
- }
- buffer->ref_count++;
- return buffer->vaddr;
-}
-
-int unreference_buffer(const vsoc_buffer_handle_t* hnd) {
- int result = 0;
- Hashmap* map = GrallocBuffer::mapped_buffers();
- HmLockGuard lock_guard(map);
- GrallocBuffer* buffer = reinterpret_cast<GrallocBuffer*>(
- hashmapGet(map, const_cast<int*>(&hnd->offset)));
- if (!buffer) {
- ALOGE("Unreferencing an unknown buffer (offset: %d, size: %d)",
- hnd->offset,
- hnd->size);
- return -EINVAL;
- }
- if (buffer->ref_count == 0) {
- ALOGE("Unbalanced reference/unreference on buffer (offset: %d, size: %d)",
- hnd->offset,
- hnd->size);
- return -EINVAL;
- }
- buffer->ref_count--;
- if (buffer->ref_count == 0) {
- result = munmap(buffer->vaddr, hnd->size);
- if (result) {
- ALOGE("Unable to unmap buffer (offset: %d, size: %d): %s",
- hnd->offset,
- hnd->size,
- strerror(errno));
- }
- buffer->vaddr = NULL;
- }
- return result;
-}
diff --git a/guest/hals/hwcomposer/vsoc-future/Android.mk b/guest/hals/hwcomposer/vsoc-future/Android.mk
deleted file mode 100644
index bcc104e..0000000
--- a/guest/hals/hwcomposer/vsoc-future/Android.mk
+++ /dev/null
@@ -1,58 +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.
-
-LOCAL_PATH := $(call my-dir)
-
-include $(CLEAR_VARS)
-
-LOCAL_MODULE := hwcomposer.cutf_ivsh-future
-LOCAL_MODULE_TAGS := optional
-
-LOCAL_SRC_FILES := \
- hwcomposer.cpp
-
-LOCAL_C_INCLUDES += \
- device/google/cuttlefish_kernel \
- device/google/cuttlefish_common \
- device/google/cuttlefish_common/guest/hals/hwcomposer \
- hardware/libhardware/include \
- system/core/base/include
-
-LOCAL_CFLAGS := \
- -DLOG_TAG=\"hwcomposer_vsoc\" \
- -Wall -Werror
-
-LOCAL_SHARED_LIBRARIES := \
- libbase \
- liblog \
- vsoc_lib
-
-ifeq (0, $(shell test $(PLATFORM_SDK_VERSION) -ge 21; echo $$?))
-LOCAL_MODULE_RELATIVE_PATH := hw
-else
-LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/hw
-endif
-
-LOCAL_VENDOR_MODULE := true
-# See b/67109557
-ifeq (true, $(TARGET_TRANSLATE_2ND_ARCH))
-LOCAL_MULTILIB := first
-endif
-
-LOCAL_HEADER_LIBRARIES := \
- libhardware_headers
-
-include $(BUILD_SHARED_LIBRARY)
-
-include $(call first-makefiles-under,$(LOCAL_PATH))
diff --git a/guest/hals/hwcomposer/vsoc-future/hwcomposer.cpp b/guest/hals/hwcomposer/vsoc-future/hwcomposer.cpp
deleted file mode 100644
index f18712c..0000000
--- a/guest/hals/hwcomposer/vsoc-future/hwcomposer.cpp
+++ /dev/null
@@ -1,363 +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 <pthread.h>
-#include <sys/resource.h>
-#include <sys/time.h>
-
-#include <hardware/hwcomposer.h>
-#include <hardware/hwcomposer_defs.h>
-#include <log/log.h>
-
-#include "common/vsoc/lib/screen_region_view.h"
-#include "guest/hals/gralloc/gralloc_vsoc_priv.h"
-
-// This file contains just a skeleton hwcomposer, the first step in the
-// multisided vsoc hwcomposer for cuttlefish.
-
-using vsoc::screen::ScreenRegionView;
-
-// TODO(jemoreira): ScreenRegionView may become the HWC region
-namespace {
-
-// Ensures that the layer does not include any inconsistencies
-int SanityCheckLayer(const hwc_layer_1& layer) {
- // Check displayFrame
- if (layer.displayFrame.left > layer.displayFrame.right ||
- layer.displayFrame.top > layer.displayFrame.bottom) {
- ALOGE(
- "%s: Malformed rectangle (displayFrame): [left = %d, right = %d, top = "
- "%d, bottom = %d]",
- __FUNCTION__, layer.displayFrame.left, layer.displayFrame.right,
- layer.displayFrame.top, layer.displayFrame.bottom);
- return -EINVAL;
- }
- // Check sourceCrop
- if (layer.sourceCrop.left > layer.sourceCrop.right ||
- layer.sourceCrop.top > layer.sourceCrop.bottom) {
- ALOGE(
- "%s: Malformed rectangle (sourceCrop): [left = %d, right = %d, top = "
- "%d, bottom = %d]",
- __FUNCTION__, layer.sourceCrop.left, layer.sourceCrop.right,
- layer.sourceCrop.top, layer.sourceCrop.bottom);
- return -EINVAL;
- }
- const vsoc_buffer_handle_t* p_handle =
- reinterpret_cast<const vsoc_buffer_handle_t*>(layer.handle);
- if (!p_handle) {
- ALOGE("Layer has a NULL buffer handle");
- return -EINVAL;
- }
- if (layer.sourceCrop.left < 0 || layer.sourceCrop.top < 0 ||
- layer.sourceCrop.right > p_handle->x_res ||
- layer.sourceCrop.bottom > p_handle->y_res) {
- ALOGE(
- "%s: Invalid sourceCrop for buffer handle: sourceCrop = [left = %d, "
- "right = %d, top = %d, bottom = %d], handle = [width = %d, height = "
- "%d]",
- __FUNCTION__, layer.sourceCrop.left, layer.sourceCrop.right,
- layer.sourceCrop.top, layer.sourceCrop.bottom, p_handle->x_res,
- p_handle->y_res);
- return -EINVAL;
- }
- return 0;
-}
-
-struct vsoc_hwc_device {
- hwc_composer_device_1_t base;
- const hwc_procs_t* procs;
- pthread_t vsync_thread;
- int64_t vsync_base_timestamp;
- int32_t vsync_period_ns;
- uint32_t frame_num;
-};
-
-void* vsync_thread(void* arg) {
- vsoc_hwc_device* pdev = reinterpret_cast<vsoc_hwc_device*>(arg);
- setpriority(PRIO_PROCESS, 0, HAL_PRIORITY_URGENT_DISPLAY);
-
- int64_t base_timestamp = pdev->vsync_base_timestamp;
- int64_t last_logged = base_timestamp / 1e9;
- int sent = 0;
- int last_sent = 0;
- static const int log_interval = 60;
- void (*vsync_proc)(const struct hwc_procs*, int, int64_t) = nullptr;
- bool log_no_procs = true, log_no_vsync = true;
- while (true) {
- struct timespec rt;
- if (clock_gettime(CLOCK_MONOTONIC, &rt) == -1) {
- ALOGE("%s:%d error in vsync thread clock_gettime: %s", __FILE__, __LINE__,
- strerror(errno));
- }
- int64_t timestamp = int64_t(rt.tv_sec) * 1e9 + rt.tv_nsec;
- // Given now's timestamp calculate the time of the next vsync.
- timestamp += pdev->vsync_period_ns -
- (timestamp - base_timestamp) % pdev->vsync_period_ns;
-
- rt.tv_sec = timestamp / 1e9;
- rt.tv_nsec = timestamp % static_cast<int32_t>(1e9);
- int err = clock_nanosleep(CLOCK_MONOTONIC, TIMER_ABSTIME, &rt, NULL);
- if (err == -1) {
- ALOGE("error in vsync thread: %s", strerror(errno));
- if (errno == EINTR) {
- continue;
- }
- }
-
- // The vsync thread is started on device open, it may run before the
- // registerProcs callback has a chance to be called, so we need to make sure
- // procs is not NULL before dereferencing it.
- if (pdev && pdev->procs) {
- vsync_proc = pdev->procs->vsync;
- } else if (log_no_procs) {
- log_no_procs = false;
- ALOGI("procs is not set yet, unable to deliver vsync event");
- }
- if (vsync_proc) {
- vsync_proc(const_cast<hwc_procs_t*>(pdev->procs), 0, timestamp);
- ++sent;
- } else if (log_no_vsync) {
- log_no_vsync = false;
- ALOGE("vsync callback is null (but procs was already set)");
- }
- if (rt.tv_sec - last_logged > log_interval) {
- ALOGI("Sent %d syncs in %ds", sent - last_sent, log_interval);
- last_logged = rt.tv_sec;
- last_sent = sent;
- }
- }
-
- return NULL;
-}
-
-int hwc_prepare(struct hwc_composer_device_1* /*dev*/, size_t numDisplays,
- hwc_display_contents_1_t** displays) {
- if (!numDisplays || !displays) return 0;
- hwc_display_contents_1_t* list = displays[HWC_DISPLAY_PRIMARY];
- if (!list) return 0;
-
- for (size_t i = 0; i < list->numHwLayers; i++) {
- if (list->hwLayers[i].compositionType == HWC_FRAMEBUFFER_TARGET) {
- continue;
- }
- list->hwLayers[i].compositionType = HWC_FRAMEBUFFER;
- }
-
- return 0;
-}
-
-int hwc_set(struct hwc_composer_device_1* dev, size_t numDisplays,
- hwc_display_contents_1_t** displays) {
- if (!numDisplays || !displays) return 0;
- hwc_display_contents_1_t* list = displays[HWC_DISPLAY_PRIMARY];
- if (!list) return 0;
- if (!dev) {
- ALOGE("%s: dev is NULL", __FUNCTION__);
- return -EINVAL;
- }
-
- for (size_t i = 0; i < list->numHwLayers; i++) {
- if (vsoc_buffer_handle_t::validate(list->hwLayers[i].handle)) {
- return -EINVAL;
- }
- if (list->hwLayers[i].compositionType == HWC_FRAMEBUFFER_TARGET) {
- if (SanityCheckLayer(list->hwLayers[i])) {
- ALOGW("Skipping layer %zu due to failed sanity check", i);
- continue;
- }
- const vsoc_buffer_handle_t* fb_handle =
- reinterpret_cast<const vsoc_buffer_handle_t*>(
- list->hwLayers[i].handle);
- ScreenRegionView::GetInstance()->BroadcastNewFrame(fb_handle->offset);
- break;
- }
- }
-
- return 0;
-}
-
-int hwc_eventControl(struct hwc_composer_device_1* /*dev*/, int disp, int event,
- int /*enabled*/) {
- if (event == HWC_EVENT_VSYNC || disp != HWC_DISPLAY_PRIMARY) {
- return 0;
- }
- return -EINVAL;
-}
-
-int hwc_blank(struct hwc_composer_device_1* /*dev*/, int disp, int /*blank*/) {
- if (disp != HWC_DISPLAY_PRIMARY) {
- return -EINVAL;
- }
- return 0;
-}
-
-int hwc_query(struct hwc_composer_device_1* dev, int what, int* value) {
- vsoc_hwc_device* pdev = reinterpret_cast<vsoc_hwc_device*>(dev);
- switch (what) {
- case HWC_BACKGROUND_LAYER_SUPPORTED:
- // we don't support the background layer
- *value = 0;
- break;
- case HWC_VSYNC_PERIOD:
- *value = pdev->vsync_period_ns;
- break;
- case HWC_DISPLAY_TYPES_SUPPORTED:
- // We only support the primary display
- *value = HWC_DISPLAY_PRIMARY_BIT;
- break;
- default:
- // unsupported query
- ALOGE("%s badness unsupported query what=%d", __FUNCTION__, what);
- return -EINVAL;
- }
- return 0;
-}
-
-void hwc_registerProcs(struct hwc_composer_device_1* dev,
- hwc_procs_t const* procs) {
- reinterpret_cast<vsoc_hwc_device*>(dev)->procs = procs;
-}
-
-void hwc_dump(struct hwc_composer_device_1* /*dev*/, char* /*buff*/,
- int /*buff_len*/) {}
-
-int hwc_getDisplayConfigs(struct hwc_composer_device_1* /*dev*/, int disp,
- uint32_t* configs, size_t* numConfigs) {
- if (*numConfigs == 0) return 0;
-
- if (disp == HWC_DISPLAY_PRIMARY) {
- configs[0] = 0;
- *numConfigs = 1;
- return 0;
- }
-
- return -EINVAL;
-}
-
-int32_t vsoc_hwc_attribute(uint32_t attribute) {
- auto screen_view = ScreenRegionView::GetInstance();
- switch (attribute) {
- case HWC_DISPLAY_VSYNC_PERIOD:
- return 1000000000 / screen_view->refresh_rate_hz();
- case HWC_DISPLAY_WIDTH:
- return screen_view->x_res();
- case HWC_DISPLAY_HEIGHT:
- return screen_view->y_res();
- case HWC_DISPLAY_DPI_X:
- case HWC_DISPLAY_DPI_Y:
- // The number of pixels per thousand inches
- return screen_view->dpi() * 1000;
- case HWC_DISPLAY_COLOR_TRANSFORM:
- // TODO(jemoreira): Add the other color transformations
- return HAL_COLOR_TRANSFORM_IDENTITY;
- default:
- ALOGE("unknown display attribute %u", attribute);
- return -EINVAL;
- }
-}
-
-int hwc_getDisplayAttributes(struct hwc_composer_device_1* /*dev*/, int disp,
- uint32_t /*config*/, const uint32_t* attributes,
- int32_t* values) {
- if (disp != HWC_DISPLAY_PRIMARY) {
- ALOGE("Unknown display type %u", disp);
- return -EINVAL;
- }
-
- for (int i = 0; attributes[i] != HWC_DISPLAY_NO_ATTRIBUTE; i++) {
- values[i] = vsoc_hwc_attribute(attributes[i]);
- }
-
- return 0;
-}
-
-int hwc_close(hw_device_t* device) {
- vsoc_hwc_device* dev = reinterpret_cast<vsoc_hwc_device*>(device);
- pthread_kill(dev->vsync_thread, SIGTERM);
- pthread_join(dev->vsync_thread, NULL);
- delete dev;
- return 0;
-}
-
-int hwc_open(const struct hw_module_t* module, const char* name,
- struct hw_device_t** device) {
- ALOGI("Opening vsoc hwcomposer device: %s", __FUNCTION__);
- if (strcmp(name, HWC_HARDWARE_COMPOSER)) {
- ALOGE("%s called with bad name %s", __FUNCTION__, name);
- return -EINVAL;
- }
-
- vsoc_hwc_device* dev = new vsoc_hwc_device();
- if (!dev) {
- ALOGE("%s failed to allocate dev", __FUNCTION__);
- return -ENOMEM;
- }
- memset(dev, 0, sizeof(*dev));
-
- int refreshRate = 60;
- dev->vsync_period_ns = 1000000000 / refreshRate;
- struct timespec rt;
- if (clock_gettime(CLOCK_MONOTONIC, &rt) == -1) {
- ALOGE("%s:%d error in clock_gettime: %s", __FILE__, __LINE__,
- strerror(errno));
- }
- dev->vsync_base_timestamp = int64_t(rt.tv_sec) * 1e9 + rt.tv_nsec;
-
- dev->base.common.tag = HARDWARE_DEVICE_TAG;
- dev->base.common.version = HWC_DEVICE_API_VERSION_1_1;
- dev->base.common.module = const_cast<hw_module_t*>(module);
- dev->base.common.close = hwc_close;
-
- dev->base.prepare = hwc_prepare;
- dev->base.set = hwc_set;
- dev->base.query = hwc_query;
- dev->base.registerProcs = hwc_registerProcs;
- dev->base.dump = hwc_dump;
- dev->base.blank = hwc_blank;
- dev->base.eventControl = hwc_eventControl;
- dev->base.getDisplayConfigs = hwc_getDisplayConfigs;
- dev->base.getDisplayAttributes = hwc_getDisplayAttributes;
-
- if (!ScreenRegionView::GetInstance()) {
- ALOGE("Unable to open screen region (%s)", __FUNCTION__);
- delete dev;
- return -1;
- }
-
- int ret = pthread_create(&dev->vsync_thread, NULL, vsync_thread, dev);
- if (ret) {
- ALOGE("failed to start vsync thread: %s", strerror(ret));
- delete dev;
- } else {
- *device = &dev->base.common;
- }
-
- return -ret;
-}
-
-struct hw_module_methods_t hwc_module_methods = {hwc_open};
-
-} // namespace
-
-hwc_module_t HAL_MODULE_INFO_SYM = {{HARDWARE_MODULE_TAG,
- HWC_MODULE_API_VERSION_0_1,
- HARDWARE_HAL_API_VERSION,
- HWC_HARDWARE_MODULE_ID,
- "Cuttlefish hwcomposer module",
- "Google",
- &hwc_module_methods,
- NULL,
- {0}}};
diff --git a/guest/hals/hwcomposer/vsoc/Android.bp b/guest/hals/hwcomposer/vsoc/Android.bp
deleted file mode 100644
index 559a1c1..0000000
--- a/guest/hals/hwcomposer/vsoc/Android.bp
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright (C) 2019 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.
-
-
-cc_library_shared {
- name: "hwcomposer.cutf_ivsh_ashmem",
- relative_install_path: "hw",
- defaults: ["cuttlefish_guest_only"],
- cflags: [
- "-DGATHER_STATS",
- // Uncomment the following line to revert to GL compositions
- // "-DUSE_OLD_HWCOMPOSER",
- ],
- srcs: [
- "vsoc_screen_view.cpp",
- "hwcomposer.cpp",
- ],
- export_include_dirs: ["."],
- static_libs: [
- "libyuv_static",
- "hwcomposer_common"
- ],
- shared_libs: [
- "cuttlefish_auto_resources",
- "liblog",
- "libhardware",
- "libbase",
- "libcutils",
- "libutils",
- "libsync",
- "libjpeg",
- "libcuttlefish_utils",
- "libcuttlefish_fs",
- "vsoc_lib",
- ],
-}
diff --git a/guest/hals/hwcomposer/vsoc/hwcomposer.cpp b/guest/hals/hwcomposer/vsoc/hwcomposer.cpp
deleted file mode 100644
index 67713f2..0000000
--- a/guest/hals/hwcomposer/vsoc/hwcomposer.cpp
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Copyright (C) 2016 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.
- */
-
-#define LOG_TAG "hwc.cutf_cvm"
-
-#include <cutils/properties.h>
-#include <hardware/hardware.h>
-#include <hardware/hwcomposer.h>
-#include <hardware/hwcomposer_defs.h>
-#include <log/log.h>
-
-#include "guest/hals/hwcomposer/common/hwcomposer.h"
-
-#include "guest/hals/hwcomposer/vsoc/vsoc_screen_view.h"
-
-static int hwc_open(const struct hw_module_t* module, const char* name,
- struct hw_device_t** device) {
- std::unique_ptr<cvd::ScreenView> screen_view(new cvd::VSoCScreenView());
- if (!screen_view) {
- ALOGE("Failed to instantiate screen view");
- return -1;
- }
-
- return cvd::cvd_hwc_open(std::move(screen_view), module, name, device);
-}
-
-static struct hw_module_methods_t hwc_module_methods = {
- hwc_open,
-};
-
-hwc_module_t HAL_MODULE_INFO_SYM = {{HARDWARE_MODULE_TAG,
- HWC_MODULE_API_VERSION_0_1,
- HARDWARE_HAL_API_VERSION,
- HWC_HARDWARE_MODULE_ID,
- "VSoC hwcomposer module",
- "Google",
- &hwc_module_methods,
- NULL,
- {0}}};
diff --git a/guest/hals/hwcomposer/vsoc/vsoc_screen_view.cpp b/guest/hals/hwcomposer/vsoc/vsoc_screen_view.cpp
deleted file mode 100644
index 6ca9ac2..0000000
--- a/guest/hals/hwcomposer/vsoc/vsoc_screen_view.cpp
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * Copyright (C) 2016 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 "guest/hals/hwcomposer/vsoc/vsoc_screen_view.h"
-
-#include <sys/time.h>
-
-#include "common/vsoc/lib/screen_region_view.h"
-
-using vsoc::layout::screen::TimeSpec;
-using vsoc::screen::ScreenRegionView;
-
-namespace cvd {
-namespace {
-
-TimeSpec TimeSpecFromSystemStruct(const timespec* spec) {
- return {static_cast<uint32_t>(spec->tv_sec),
- static_cast<uint32_t>(spec->tv_nsec), 0};
-}
-
-void VSoCStatsFromCvdStats(vsoc::layout::screen::CompositionStats* vsoc_stats,
- const cvd::CompositionStats* stats) {
- vsoc_stats->num_prepare_calls = stats->num_prepare_calls;
- vsoc_stats->num_layers = stats->num_layers;
- vsoc_stats->num_hwcomposited_layers = stats->num_hwcomposited_layers;
- vsoc_stats->last_vsync = TimeSpecFromSystemStruct(&stats->last_vsync);
- vsoc_stats->prepare_start = TimeSpecFromSystemStruct(&stats->prepare_start);
- vsoc_stats->prepare_end = TimeSpecFromSystemStruct(&stats->prepare_end);
- vsoc_stats->set_start = TimeSpecFromSystemStruct(&stats->set_start);
- vsoc_stats->set_end = TimeSpecFromSystemStruct(&stats->set_end);
-}
-
-} // namespace
-
-VSoCScreenView::VSoCScreenView()
- : region_view_(ScreenRegionView::GetInstance()) {}
-
-VSoCScreenView::~VSoCScreenView() {}
-
-void VSoCScreenView::Broadcast(int buffer_id,
- const cvd::CompositionStats* stats) {
- if (stats) {
- vsoc::layout::screen::CompositionStats vsoc_stats;
- VSoCStatsFromCvdStats(&vsoc_stats, stats);
- region_view_->BroadcastNewFrame(buffer_id, &vsoc_stats);
- } else {
- region_view_->BroadcastNewFrame(buffer_id);
- }
-}
-
-void* VSoCScreenView::GetBuffer(int fb_index) {
- return region_view_->GetBuffer(fb_index);
-}
-
-int32_t VSoCScreenView::x_res() const { return region_view_->x_res(); }
-
-int32_t VSoCScreenView::y_res() const { return region_view_->y_res(); }
-
-int32_t VSoCScreenView::dpi() const { return region_view_->dpi(); }
-
-int32_t VSoCScreenView::refresh_rate() const {
- return region_view_->refresh_rate_hz();
-}
-
-int VSoCScreenView::num_buffers() const {
- return region_view_->number_of_buffers();
-}
-} // namespace cvd
diff --git a/guest/hals/hwcomposer/vsoc/vsoc_screen_view.h b/guest/hals/hwcomposer/vsoc/vsoc_screen_view.h
deleted file mode 100644
index 1ecace6..0000000
--- a/guest/hals/hwcomposer/vsoc/vsoc_screen_view.h
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Copyright (C) 2016 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.
- */
-#pragma once
-
-#include <condition_variable>
-#include <functional>
-#include <mutex>
-#include <thread>
-#include <vector>
-
-#include "common/libs/fs/shared_fd.h"
-#include "common/vsoc/lib/screen_region_view.h"
-#include "guest/hals/hwcomposer/common/screen_view.h"
-
-namespace cvd {
-
-class VSoCScreenView : public ScreenView {
- public:
- VSoCScreenView();
- virtual ~VSoCScreenView();
-
- void Broadcast(int buffer_id,
- const CompositionStats* stats = nullptr) override;
- void* GetBuffer(int fb_index) override;
-
- int32_t x_res() const override;
- int32_t y_res() const override;
- int32_t dpi() const override;
- int32_t refresh_rate() const override;
-
- int num_buffers() const override;
-
- private:
- vsoc::screen::ScreenRegionView* region_view_;
-};
-
-} // namespace cvd
diff --git a/guest/vsoc/lib/Android.bp b/guest/vsoc/lib/Android.bp
deleted file mode 100644
index d534a5d..0000000
--- a/guest/vsoc/lib/Android.bp
+++ /dev/null
@@ -1,77 +0,0 @@
-//
-// Copyright (C) 2019 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.
-
-cc_binary {
- name: "vsoc_driver_test",
- srcs: [
- "vsoc_driver_test.cpp",
- ],
- shared_libs: [
- "vsoc_lib",
- "cuttlefish_auto_resources",
- "libcuttlefish_fs",
- "libbase",
- ],
- static_libs: [
- "libgtest",
- ],
- cflags: [
- "-DGTEST_OS_LINUX_ANDROID",
- "-DGTEST_HAS_STD_STRING",
- ],
- defaults: ["cuttlefish_guest_only"]
-}
-
-cc_binary {
- name: "vsoc_guest_region_e2e_test",
- srcs: [
- "guest_region_e2e_test.cpp",
- ],
- shared_libs: [
- "vsoc_lib",
- "cuttlefish_auto_resources",
- "libcuttlefish_fs",
- "libbase",
- ],
- static_libs: [
- "libgtest",
- ],
- cflags: [
- "-DGTEST_OS_LINUX_ANDROID",
- "-DGTEST_HAS_STD_STRING",
- ],
- defaults: ["cuttlefish_guest_only"]
-}
-
-cc_binary {
- name: "vsoc_managed_region_e2e_test",
- srcs: [
- "managed_region_e2e_test.cpp",
- ],
- shared_libs: [
- "vsoc_lib",
- "cuttlefish_auto_resources",
- "libcuttlefish_fs",
- "libbase",
- ],
- static_libs: [
- "libgtest",
- ],
- cflags: [
- "-DGTEST_OS_LINUX_ANDROID",
- "-DGTEST_HAS_STD_STRING",
- ],
- defaults: ["cuttlefish_guest_only"]
-}
diff --git a/guest/vsoc/lib/e2e_test_common.h b/guest/vsoc/lib/e2e_test_common.h
deleted file mode 100644
index 521f4c6..0000000
--- a/guest/vsoc/lib/e2e_test_common.h
+++ /dev/null
@@ -1,32 +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.
- */
-
-#pragma once
-
-#include <android-base/logging.h>
-
-#define DEATH_TEST_MESSAGE "abort converted to exit of 2 during death test"
-
-static inline void disable_tombstones() {
- // We don't want a tombstone, and we're already in the child, so we modify the
- // behavior of LOG(ABORT) to print the well known message and do an
- // error-based exit.
- android::base::SetAborter([](const char*) {
- fputs(DEATH_TEST_MESSAGE, stderr);
- fflush(stderr);
- exit(2);
- });
-}
diff --git a/guest/vsoc/lib/gralloc_region_view.cpp b/guest/vsoc/lib/gralloc_region_view.cpp
deleted file mode 100644
index 2c42f57..0000000
--- a/guest/vsoc/lib/gralloc_region_view.cpp
+++ /dev/null
@@ -1,142 +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 "guest/vsoc/lib/gralloc_region_view.h"
-
-#include <common/vsoc/lib/lock_guard.h>
-#include <log/log.h>
-#include <sys/types.h>
-#include <uapi/vsoc_shm.h>
-#include <atomic>
-
-using vsoc::gralloc::GrallocRegionView;
-using vsoc::layout::gralloc::BufferEntry;
-using vsoc::layout::gralloc::GrallocBufferLayout;
-using vsoc::layout::gralloc::GrallocManagerLayout;
-
-namespace {
-template <typename T>
-inline T gralloc_align(T val) {
- return (val + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1);
-}
-
-// Use the thread id to identify the original creator of a buffer.
-inline uint32_t gralloc_owned_value() {
- return gettid();
-}
-
-} // namespace
-
-bool GrallocRegionView::Open() {
- if (!vsoc::ManagerRegionView<GrallocRegionView, GrallocManagerLayout>::Open()) {
- return false;
- }
- std::shared_ptr<vsoc::RegionControl> managed_region =
- vsoc::RegionControl::Open(
- GrallocManagerLayout::ManagedRegion::region_name);
- if (!managed_region) {
- LOG_FATAL("Unable to open managed region");
- return false;
- }
- offset_of_buffer_memory_ = gralloc_align<uint32_t>(
- managed_region->region_desc().offset_of_region_data);
- total_buffer_memory_ =
- managed_region->region_size() - offset_of_buffer_memory_;
-
- // TODO(jemoreira): Handle the case of unexpected values in the region.
- return true;
-}
-
-int GrallocRegionView::AllocateBuffer(size_t size, uint32_t* begin_offset) {
- size = gralloc_align<size_t>(size);
- // Cache the value of buffer_count in shared memory.
- uint32_t buffer_count_local = 0;
- {
- vsoc::LockGuard<vsoc::layout::GuestLock>(&data()->new_buffer_lock);
- buffer_count_local = data()->buffer_count;
- }
- // Find a free buffer entry of the appropriate size.
- for (uint32_t idx = 0; idx < buffer_count_local; ++idx) {
- BufferEntry& entry = data()->buffers_table[idx];
- if (entry.owned_by == VSOC_REGION_FREE && entry.buffer_size() == size) {
- int fd = control_->CreateFdScopedPermission(
- GrallocManagerLayout::ManagedRegion::region_name,
- pointer_to_region_offset(&entry.owned_by),
- gralloc_owned_value(),
- entry.buffer_begin,
- entry.buffer_end);
- if (fd >= 0) {
- if (begin_offset) {
- *begin_offset = entry.buffer_begin;
- }
- return fd;
- }
- }
- }
-
- // We couldn't find any suitable buffer, create one
- {
- vsoc::LockGuard<vsoc::layout::GuestLock>(&data()->new_buffer_lock);
- // don't use the cached value here!!!
- uint32_t idx = data()->buffer_count;
- if (pointer_to_region_offset(&data()->buffers_table[idx + 1]) >
- control_->region_size()) {
- ALOGE(
- "Out of memory in gralloc_manager (total: %d, used: %d, "
- "requested: %d)",
- static_cast<int>(control_->region_size()),
- static_cast<int>(
- pointer_to_region_offset(&data()->buffers_table[idx])),
- static_cast<int>(sizeof(data()->buffers_table[idx])));
- return -ENOMEM;
- }
- if (total_buffer_memory_ - data()->allocated_buffer_memory < size) {
- ALOGE(
- "Out of memory in gralloc_memory (total: %d, used: %d, requested: %d)",
- static_cast<int>(total_buffer_memory_),
- static_cast<int>(data()->allocated_buffer_memory),
- static_cast<int>(size));
- return -ENOMEM;
- }
- // Initialize the buffer entry and acquire ownership
- // Do it before increasing buffer_count so that another thread looking for
- // free entries doesn't find this one
- BufferEntry& new_entry = data()->buffers_table[idx];
- new_entry.buffer_begin =
- offset_of_buffer_memory_ + data()->allocated_buffer_memory;
- data()->allocated_buffer_memory += size;
- new_entry.buffer_end = new_entry.buffer_begin + size;
- int fd = control_->CreateFdScopedPermission(
- GrallocManagerLayout::ManagedRegion::region_name,
- pointer_to_region_offset(&new_entry.owned_by),
- gralloc_owned_value(),
- new_entry.buffer_begin,
- new_entry.buffer_end);
- if (fd < 0) {
- LOG_FATAL(
- "Unexpected error while creating fd scoped permission over "
- "uncontested memory: %s",
- strerror(-fd));
- return fd;
- }
- // Increment buffer_count now that the entry can't be taken from us
- data()->buffer_count++;
- if (begin_offset) {
- *begin_offset = new_entry.buffer_begin;
- }
- return fd;
- }
-}
diff --git a/guest/vsoc/lib/gralloc_region_view.h b/guest/vsoc/lib/gralloc_region_view.h
deleted file mode 100644
index ef5553f..0000000
--- a/guest/vsoc/lib/gralloc_region_view.h
+++ /dev/null
@@ -1,52 +0,0 @@
-#pragma once
-
-/*
- * 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/shm/gralloc_layout.h>
-#include <guest/vsoc/lib/manager_region_view.h>
-#include <memory>
-#include <stdlib.h>
-
-namespace vsoc {
-namespace gralloc {
-
-class GrallocRegionView : public vsoc::ManagerRegionView<
- GrallocRegionView,
- vsoc::layout::gralloc::GrallocManagerLayout> {
- public:
- friend TypedRegionView<
- GrallocRegionView, vsoc::layout::gralloc::GrallocManagerLayout>;
- GrallocRegionView() = default;
- // Allocates a gralloc buffer of (at least) the specified size. Returns a file
- // descriptor that exposes the buffer when mmapped from 0 to (the page
- // aligned) size (and fails to mmap anything outside of that range) or a
- // negative number in case of error (e.g not enough free memory left).
- // TODO(jemoreira): Include debug info like stride, width, height, etc
- int AllocateBuffer(size_t size, uint32_t* begin_offset = nullptr);
-
- protected:
- GrallocRegionView(const GrallocRegionView&) = delete;
- GrallocRegionView & operator=(const GrallocRegionView&) = delete;
-
- bool Open();
-
- uint32_t offset_of_buffer_memory_{};
- uint32_t total_buffer_memory_{};
-};
-
-} // namespace gralloc
-} // namespace vsoc
diff --git a/guest/vsoc/lib/guest_lock.cpp b/guest/vsoc/lib/guest_lock.cpp
deleted file mode 100644
index 247b48b..0000000
--- a/guest/vsoc/lib/guest_lock.cpp
+++ /dev/null
@@ -1,49 +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/shm/lock.h"
-
-#include "common/vsoc/lib/compat.h"
-#include "common/vsoc/lib/single_sided_signal.h"
-
-namespace vsoc {
-namespace layout {
-
-void GuestLock::Lock() {
- uint32_t tid = gettid();
- uint32_t expected_value;
- uint32_t* uaddr = reinterpret_cast<uint32_t*>(&lock_uint32_);
-
- while (1) {
- if (TryLock(tid, &expected_value)) {
- return;
- }
- SingleSidedSignal::AwaitSignal(expected_value, uaddr);
- }
-}
-
-void GuestLock::Unlock() {
- Sides sides_to_signal = UnlockCommon(gettid());
- if (sides_to_signal != Sides::NoSides) {
- SingleSidedSignal::Signal(&lock_uint32_);
- }
-}
-
-bool GuestLock::Recover() {
- return RecoverSingleSided();
-}
-
-} // namespace layout
-} // namespace vsoc
diff --git a/guest/vsoc/lib/guest_region_e2e_test.cpp b/guest/vsoc/lib/guest_region_e2e_test.cpp
deleted file mode 100644
index 5fd644a..0000000
--- a/guest/vsoc/lib/guest_region_e2e_test.cpp
+++ /dev/null
@@ -1,156 +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.
- */
-
-/*
- * End-to-end test to ensure that mapping of vsoc regions works on the guest.
- */
-
-#include "guest/vsoc/lib/e2e_test_common.h"
-#include "common/vsoc/lib/e2e_test_region_view.h"
-
-#include <android-base/logging.h>
-#include <gtest/gtest.h>
-
-template <typename View>
-void DeathTestView() {
- disable_tombstones();
- // View::GetInstance should never return.
- EXPECT_FALSE(!!View::GetInstance());
-}
-
-// Here is a summary of the two regions interrupt and write test:
-// 1. Write our strings to the first region
-// 2. Ensure that our peer hasn't signalled the second region. That would
-// indicate that it didn't wait for our interrupt.
-// 3. Send the interrupt on the first region
-// 4. Wait for our peer's interrupt on the first region
-// 5. Confirm that we can see our peer's writes in the first region
-// 6. Initialize our strings in the second region
-// 7. Send an interrupt on the second region to our peer
-// 8. Wait for our peer's interrupt on the second region
-// 9. Confirm that we can see our peer's writes in the second region
-// 10. Repeat the process for signaling.
-// 11. Confirm that no interrupt is pending in the first region
-// 12. Confirm that no interrupt is pending in the second region
-
-template <typename View>
-void SetGuestStrings(View* in) {
- size_t num_data = in->string_size();
- EXPECT_LE(2U, num_data);
- for (size_t i = 0; i < num_data; ++i) {
- EXPECT_TRUE(!in->guest_string(i)[0] ||
- !strcmp(in->guest_string(i), View::Layout::guest_pattern));
- in->set_guest_string(i, View::Layout::guest_pattern);
- EXPECT_STREQ(in->guest_string(i), View::Layout::guest_pattern);
- }
-}
-
-template <typename View>
-void CheckPeerStrings(View* in) {
- size_t num_data = in->string_size();
- EXPECT_LE(2U, num_data);
- for (size_t i = 0; i < num_data; ++i) {
- EXPECT_STREQ(View::Layout::host_pattern, in->host_string(i));
- }
-}
-
-TEST(RegionTest, BasicPeerTests) {
- auto primary = vsoc::E2EPrimaryRegionView::GetInstance();
- auto secondary = vsoc::E2ESecondaryRegionView::GetInstance();
- ASSERT_TRUE(!!primary);
- ASSERT_TRUE(!!secondary);
- LOG(INFO) << "Regions are open";
- SetGuestStrings(primary);
- LOG(INFO) << "Primary guest strings are set";
- EXPECT_FALSE(secondary->HasIncomingInterrupt());
- LOG(INFO) << "Verified no early second interrupt";
- EXPECT_TRUE(primary->MaybeInterruptPeer());
- LOG(INFO) << "Interrupt sent. Waiting for first interrupt from peer";
- primary->WaitForInterrupt();
- LOG(INFO) << "First interrupt received";
- CheckPeerStrings(primary);
- LOG(INFO) << "Verified peer's primary strings";
- SetGuestStrings(secondary);
- LOG(INFO) << "Secondary guest strings are set";
- EXPECT_TRUE(secondary->MaybeInterruptPeer());
- LOG(INFO) << "Second interrupt sent";
- secondary->WaitForInterrupt();
- LOG(INFO) << "Second interrupt received";
- CheckPeerStrings(secondary);
- LOG(INFO) << "Verified peer's secondary strings";
-
- // Test signals
- EXPECT_FALSE(secondary->HasIncomingInterrupt());
- LOG(INFO) << "Verified no early second signal";
- primary->SendSignal(vsoc::layout::Sides::Peer,
- &primary->data()->guest_to_host_signal);
- LOG(INFO) << "Signal sent. Waiting for first signal from peer";
- primary->WaitForInterrupt();
- int count = 0; // counts the number of signals received.
- primary->ProcessSignalsFromPeer(
- [&primary, &count](uint32_t offset) {
- ++count;
- EXPECT_TRUE(offset == primary->host_to_guest_signal_offset());
- });
- EXPECT_TRUE(count == 1);
- LOG(INFO) << "Signal received on primary region";
- secondary->SendSignal(vsoc::layout::Sides::Peer,
- &secondary->data()->guest_to_host_signal);
- LOG(INFO) << "Signal sent. Waiting for second signal from peer";
- secondary->WaitForInterrupt();
- count = 0;
- secondary->ProcessSignalsFromPeer(
- [&secondary, &count](uint32_t offset) {
- ++count;
- EXPECT_TRUE(offset == secondary->host_to_guest_signal_offset());
- });
- EXPECT_TRUE(count == 1);
- LOG(INFO) << "Signal received on secondary region";
-
- EXPECT_FALSE(primary->HasIncomingInterrupt());
- EXPECT_FALSE(secondary->HasIncomingInterrupt());
- LOG(INFO) << "PASS: BasicPeerTests";
-}
-
-TEST(RegionTest, MissingRegionDeathTest) {
- // EXPECT_DEATH creates a child for the test, so we do it out here.
- // DeathTestGuestRegion will actually do the deadly call after ensuring
- // that we don't create an unwanted tombstone.
- EXPECT_EXIT(DeathTestView<vsoc::E2EUnfindableRegionView>(),
- testing::ExitedWithCode(2),
- ".*" DEATH_TEST_MESSAGE ".*");
-}
-
-int main(int argc, char** argv) {
- if (argc == 2) {
- // gtest tries to leave temporary files in the current directory, so make the
- // current directory something that we control.
- if (chdir(argv[1]) != 0) {
- abort();
- }
- }
- android::base::InitLogging(argv);
- testing::InitGoogleTest(&argc, argv);
- int rval = RUN_ALL_TESTS();
- if (!rval) {
- auto region = vsoc::E2EPrimaryRegionView::GetInstance();
- region->guest_status(vsoc::layout::e2e_test::E2E_MEMORY_FILLED);
- LOG(INFO) << "stage_1_guest_region_e2e_tests PASSED";
- } else {
- LOG(ERROR) << "stage_1_guest_region_e2e_tests FAILED";
- }
- return rval;
-}
diff --git a/guest/vsoc/lib/managed_region_e2e_test.cpp b/guest/vsoc/lib/managed_region_e2e_test.cpp
deleted file mode 100644
index 390a6b7..0000000
--- a/guest/vsoc/lib/managed_region_e2e_test.cpp
+++ /dev/null
@@ -1,123 +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/shm/managed_e2e_test_region_layout.h"
-#include "guest/vsoc/lib/e2e_test_common.h"
-#include "guest/vsoc/lib/manager_region_view.h"
-
-#include <android-base/logging.h>
-#include <gtest/gtest.h>
-
-using vsoc::layout::e2e_test::E2EManagedTestRegionLayout;
-using vsoc::layout::e2e_test::E2EManagerTestRegionLayout;
-
-// Region view classes to allow calling the Open() function from the test.
-class E2EManagedTestRegionView
- : public vsoc::TypedRegionView<
- E2EManagedTestRegionView,
- E2EManagedTestRegionLayout> {
- public:
- using vsoc::TypedRegionView<
- E2EManagedTestRegionView, E2EManagedTestRegionLayout>::Open;
-};
-class E2EManagerTestRegionView
- : public vsoc::ManagerRegionView<
- E2EManagerTestRegionView,
- E2EManagerTestRegionLayout> {
- public:
- using vsoc::ManagerRegionView<
- E2EManagerTestRegionView, E2EManagerTestRegionLayout>::Open;
-};
-
-class ManagedRegionTest {
- public:
- void testManagedRegionFailMap() {
- E2EManagedTestRegionView managed_region;
- disable_tombstones();
- // managed_region.Open should never return.
- EXPECT_FALSE(managed_region.Open());
- }
-
- void testManagedRegionMap() {
- EXPECT_TRUE(manager_region_.Open());
-
- // Maps correctly with permission
- const uint32_t owned_value = 65, begin_offset = 4096, end_offset = 8192;
- int perm_fd = manager_region_.CreateFdScopedPermission(
- &manager_region_.data()->data[0], owned_value, begin_offset,
- end_offset);
- EXPECT_TRUE(perm_fd >= 0);
- fd_scoped_permission perm;
- ASSERT_TRUE(ioctl(perm_fd, VSOC_GET_FD_SCOPED_PERMISSION, &perm) == 0);
- void* mapped_ptr = mmap(NULL, perm.end_offset - perm.begin_offset,
- PROT_WRITE | PROT_READ, MAP_SHARED, perm_fd, 0);
- EXPECT_FALSE(mapped_ptr == MAP_FAILED);
-
- // Owned value gets written
- EXPECT_TRUE(manager_region_.data()->data[0] == owned_value);
-
- // Data written to the mapped memory stays there after unmap
- std::string str = "managed by e2e_manager";
- strcpy(reinterpret_cast<char*>(mapped_ptr), str.c_str());
- EXPECT_TRUE(munmap(mapped_ptr, end_offset - begin_offset) == 0);
- mapped_ptr = mmap(NULL, end_offset - begin_offset, PROT_WRITE | PROT_READ,
- MAP_SHARED, perm_fd, 0);
- EXPECT_FALSE(mapped_ptr == MAP_FAILED);
- EXPECT_TRUE(strcmp(reinterpret_cast<char*>(mapped_ptr), str.c_str()) == 0);
-
- // Create permission elsewhere in the region, map same offset and length,
- // ensure data isn't there
- EXPECT_TRUE(munmap(mapped_ptr, end_offset - begin_offset) == 0);
- close(perm_fd);
- EXPECT_TRUE(manager_region_.data()->data[0] == 0);
- perm_fd = manager_region_.CreateFdScopedPermission(
- &manager_region_.data()->data[1], owned_value, begin_offset + 4096,
- end_offset + 4096);
- EXPECT_TRUE(perm_fd >= 0);
- mapped_ptr = mmap(NULL, end_offset - begin_offset, PROT_WRITE | PROT_READ,
- MAP_SHARED, perm_fd, 0);
- EXPECT_FALSE(mapped_ptr == MAP_FAILED);
- EXPECT_FALSE(strcmp(reinterpret_cast<char*>(mapped_ptr), str.c_str()) == 0);
- }
- ManagedRegionTest() {}
-
- private:
- E2EManagerTestRegionView manager_region_;
-};
-
-TEST(ManagedRegionTest, ManagedRegionFailMap) {
- ManagedRegionTest test;
- EXPECT_EXIT(test.testManagedRegionFailMap(), testing::ExitedWithCode(2),
- ".*" DEATH_TEST_MESSAGE ".*");
-}
-
-TEST(ManagedRegionTest, ManagedRegionMap) {
- ManagedRegionTest test;
- test.testManagedRegionMap();
-}
-
-int main(int argc, char** argv) {
- if (argc == 2) {
- // gtest tries to leave temporary files in the current directory, so make the
- // current directory something that we control.
- if (chdir(argv[1]) != 0) {
- abort();
- }
- }
- android::base::InitLogging(argv);
- testing::InitGoogleTest(&argc, argv);
- return RUN_ALL_TESTS();
-}
diff --git a/guest/vsoc/lib/manager_region_view.h b/guest/vsoc/lib/manager_region_view.h
deleted file mode 100644
index c2a873d..0000000
--- a/guest/vsoc/lib/manager_region_view.h
+++ /dev/null
@@ -1,58 +0,0 @@
-#pragma once
-
-/*
- * 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/typed_region_view.h"
-
-namespace vsoc {
-
-/**
- * Adds methods to create file descriptor scoped permissions. Just like
- * TypedRegionView it can be directly constructed or subclassed.
- *
- * The Layout type must (in addition to requirements for TypedRegionView) also
- * provide a nested type for the layout of the managed region.
- */
-template <typename View, typename Layout>
-class ManagerRegionView : public TypedRegionView<View, Layout> {
- public:
- ManagerRegionView() = default;
- /**
- * Creates a fd scoped permission on the managed region.
- *
- * The managed_region_fd is in/out parameter that can be a not yet open file
- * descriptor. If the fd is not open yet it will open the managed region
- * device and then create the permission. If the function returns EBUSY
- * (meaning that we lost the race to acquire the memory) the same fd can (and
- * is expected to) be used in a subsequent call to create a permission on
- * another memory location.
- *
- * On success returns an open fd with the requested permission asociated to
- * it. If another thread/process acquired ownership of *owner_ptr before this
- * one returns -EBUSY, returns a different negative number otherwise.
- */
- int CreateFdScopedPermission(uint32_t* owner_ptr, uint32_t owned_val,
- uint32_t begin_offset,
- uint32_t end_offset) {
- return this->control_->CreateFdScopedPermission(
- Layout::ManagedRegion::region_name,
- this->pointer_to_region_offset(owner_ptr), owned_val, begin_offset,
- end_offset);
- }
-};
-
-} // namespace vsoc
diff --git a/guest/vsoc/lib/region_control.cpp b/guest/vsoc/lib/region_control.cpp
deleted file mode 100644
index 1fcbd13..0000000
--- 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));
-}
diff --git a/guest/vsoc/lib/region_view.cpp b/guest/vsoc/lib/region_view.cpp
deleted file mode 100644
index db1bec0..0000000
--- a/guest/vsoc/lib/region_view.cpp
+++ /dev/null
@@ -1,26 +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 "common/vsoc/lib/region_control.h"
-
-const vsoc_signal_table_layout& vsoc::RegionView::incoming_signal_table() {
- return control_->region_desc().host_to_guest_signal_table;
-}
-
-// Returns a pointer to the table that will be used to post signals
-const vsoc_signal_table_layout& vsoc::RegionView::outgoing_signal_table() {
- return control_->region_desc().guest_to_host_signal_table;
-}
diff --git a/guest/vsoc/lib/vsoc_driver_test.cpp b/guest/vsoc/lib/vsoc_driver_test.cpp
deleted file mode 100644
index ff20ecb..0000000
--- a/guest/vsoc/lib/vsoc_driver_test.cpp
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Copyright (C) 2018 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.
- */
-
-/*
- * Stand-alone tests for the ioctls in the vsoc driver.
- */
-
-#include "uapi/vsoc_shm.h"
-#include <atomic>
-#include <stdint.h>
-#include "common/vsoc/lib/e2e_test_region_view.h"
-#include "guest/vsoc/lib/manager_region_view.h"
-
-#include <android-base/logging.h>
-#include <gtest/gtest.h>
-
-void BasicWaitForSignal(vsoc::E2EPrimaryRegionView* region,
- uint32_t expected_start,
- uint32_t expected_finish) {
- ASSERT_EQ(expected_start, region->read_guest_self_register());
- int rval = region->wait_guest_self_register(expected_start);
- EXPECT_LE(0, rval);
- EXPECT_GT(5, rval);
- EXPECT_EQ(expected_finish, region->read_guest_self_register());
-}
-
-TEST(FutexTest, BasicFutexTests) {
- constexpr uint32_t INITIAL_SIGNAL = 0;
- constexpr uint32_t SILENT_UPDATE_SIGNAL = 1;
- constexpr uint32_t WAKE_SIGNAL = 2;
- auto region = vsoc::E2EPrimaryRegionView::GetInstance();
- ASSERT_TRUE(region != NULL);
- LOG(INFO) << "Regions are open";
- region->write_guest_self_register(INITIAL_SIGNAL);
- std::thread waiter(BasicWaitForSignal, region, INITIAL_SIGNAL, WAKE_SIGNAL);
- sleep(1);
- LOG(INFO) << "Still waiting. Trying to wake wrong address";
- region->signal_guest_to_host_register();
- sleep(1);
- LOG(INFO) << "Still waiting. Trying to wake without update";
- region->signal_guest_self_register();
- sleep(1);
- LOG(INFO) << "Still waiting. Trying to wake without signal";
- region->write_guest_self_register(SILENT_UPDATE_SIGNAL);
- sleep(1);
- LOG(INFO) << "Still waiting. Trying to wake with signal";
- region->write_guest_self_register(WAKE_SIGNAL);
- region->signal_guest_self_register();
- waiter.join();
- LOG(INFO) << "Wake worked";
- LOG(INFO) << "PASS: BasicPeerTests";
-}
-
-int main(int argc, char* argv[]) {
- android::base::InitLogging(argv);
- testing::InitGoogleTest(&argc, argv);
- return RUN_ALL_TESTS();
-}
diff --git a/host/commands/Android.bp b/host/commands/Android.bp
index a6f059d..c200611 100644
--- a/host/commands/Android.bp
+++ b/host/commands/Android.bp
@@ -19,7 +19,6 @@
"launch",
"stop_cvd",
"ivserver",
- "record_audio",
"virtual_usb_manager",
"kernel_log_monitor",
"config_server",
diff --git a/host/commands/assemble_cvd/Android.bp b/host/commands/assemble_cvd/Android.bp
index c5ac4c9..75d85d0 100644
--- a/host/commands/assemble_cvd/Android.bp
+++ b/host/commands/assemble_cvd/Android.bp
@@ -44,7 +44,6 @@
],
shared_libs: [
"cdisk_spec",
- "vsoc_lib",
"libcuttlefish_fs",
"libcuttlefish_utils",
"cuttlefish_auto_resources",
@@ -57,7 +56,6 @@
static_libs: [
"libcuttlefish_host_config",
"libcuttlefish_vm_manager",
- "libivserver",
"libgflags",
"libxml2",
"libjsoncpp",
diff --git a/host/commands/assemble_cvd/flags.cc b/host/commands/assemble_cvd/flags.cc
index 5ae5a91..09e76e6 100644
--- a/host/commands/assemble_cvd/flags.cc
+++ b/host/commands/assemble_cvd/flags.cc
@@ -9,7 +9,6 @@
#include "common/libs/utils/environment.h"
#include "common/libs/utils/files.h"
-#include "common/vsoc/lib/vsoc_memory.h"
#include "host/commands/assemble_cvd/boot_image_unpacker.h"
#include "host/commands/assemble_cvd/data_image.h"
#include "host/commands/assemble_cvd/image_aggregator.h"
@@ -113,11 +112,6 @@
DEFINE_string(vnc_server_binary,
vsoc::DefaultHostArtifactsPath("bin/vnc_server"),
"Location of the vnc server binary.");
-DEFINE_bool(start_stream_audio, false,
- "Whether to start the stream audio process.");
-DEFINE_string(stream_audio_binary,
- vsoc::DefaultHostArtifactsPath("bin/stream_audio"),
- "Location of the stream_audio binary.");
DEFINE_string(virtual_usb_manager_binary,
vsoc::DefaultHostArtifactsPath("bin/virtual_usb_manager"),
"Location of the virtual usb manager binary.");
@@ -129,8 +123,6 @@
"Location of the ivshmem server binary.");
DEFINE_int32(vnc_server_port, GetPerInstanceDefault(6444),
"The port on which the vnc server should listen");
-DEFINE_int32(stream_audio_port, GetPerInstanceDefault(7444),
- "The port on which stream_audio should listen.");
DEFINE_string(socket_forward_proxy_binary,
vsoc::DefaultHostArtifactsPath("bin/socket_forward_proxy"),
"Location of the socket_forward_proxy binary.");
@@ -281,7 +273,6 @@
const cvd::BootImageUnpacker& boot_image_unpacker,
const cvd::FetcherConfig& fetcher_config) {
vsoc::CuttlefishConfig tmp_config_obj;
- auto& memory_layout = *vsoc::VSoCMemoryLayout::Get();
// Set this first so that calls to PerInstancePath below are correct
tmp_config_obj.set_instance_dir(FLAGS_instance_dir);
if (!vm_manager::VmManager::IsValidName(FLAGS_vm_manager)) {
@@ -444,7 +435,7 @@
tmp_config_obj.PerInstanceInternalPath("ivshmem_socket_qemu"));
tmp_config_obj.set_ivshmem_client_socket_path(
tmp_config_obj.PerInstanceInternalPath("ivshmem_socket_client"));
- tmp_config_obj.set_ivshmem_vector_count(memory_layout.GetRegions().size());
+ tmp_config_obj.set_ivshmem_vector_count(0);
if (tmp_config_obj.adb_mode().count(vsoc::AdbMode::Usb) > 0) {
tmp_config_obj.set_usb_v1_socket_name(
@@ -487,10 +478,6 @@
tmp_config_obj.set_vnc_server_binary(FLAGS_vnc_server_binary);
tmp_config_obj.set_vnc_server_port(FLAGS_vnc_server_port);
- tmp_config_obj.set_enable_stream_audio(FLAGS_start_stream_audio);
- tmp_config_obj.set_stream_audio_binary(FLAGS_stream_audio_binary);
- tmp_config_obj.set_stream_audio_port(FLAGS_stream_audio_port);
-
tmp_config_obj.set_restart_subprocesses(FLAGS_restart_subprocesses);
tmp_config_obj.set_run_adb_connector(FLAGS_run_adb_connector);
tmp_config_obj.set_adb_connector_binary(FLAGS_adb_connector_binary);
diff --git a/host/commands/ivserver/Android.bp b/host/commands/ivserver/Android.bp
deleted file mode 100644
index 4fc47a9..0000000
--- a/host/commands/ivserver/Android.bp
+++ /dev/null
@@ -1,83 +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.
-
-cc_library_host_static {
- name: "libivserver",
- srcs: [
- "hald_client.cc",
- "ivserver.cc",
- "options.cc",
- "qemu_client.cc",
- "vsocsharedmem.cc",
- ],
- header_libs: [
- "cuttlefish_glog",
- ],
- shared_libs: [
- "libbase",
- "vsoc_lib",
- ],
- static_libs: [
- "libjsoncpp",
- ],
- defaults: ["cuttlefish_host_only"],
-}
-
-cc_test_host {
- name: "hald_client_test",
- srcs: [
- "hald_client_test.cc",
- ],
- header_libs: [
- "cuttlefish_glog",
- ],
- shared_libs: [
- "libcuttlefish_fs",
- "cuttlefish_auto_resources",
- "libbase",
- "vsoc_lib",
- ],
- static_libs: [
- "libivserver",
- "libjsoncpp",
- "libgmock",
- ],
- defaults: ["cuttlefish_host_only"],
-}
-
-cc_binary_host {
- name: "ivserver",
- srcs: [
- "main.cpp",
- ],
- header_libs: [
- "cuttlefish_glog",
- ],
- shared_libs: [
- "vsoc_lib",
- "libbase",
- "libcuttlefish_fs",
- "libcuttlefish_utils",
- "cuttlefish_auto_resources",
- "liblog",
- ],
- static_libs: [
- "libcuttlefish_host_config",
- "libivserver",
- "libgflags",
- "libjsoncpp",
- ],
- defaults: ["cuttlefish_host_only"],
-}
diff --git a/host/commands/ivserver/hald_client.cc b/host/commands/ivserver/hald_client.cc
deleted file mode 100644
index 98a83f6..0000000
--- a/host/commands/ivserver/hald_client.cc
+++ /dev/null
@@ -1,128 +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 "host/commands/ivserver/hald_client.h"
-
-#include <string>
-
-#include <glog/logging.h>
-
-namespace ivserver {
-namespace {
-// The protocol between host-clients and the ivserver could change.
-// Clients should verify what version they are talking to during the handshake.
-const uint32_t kHaldClientProtocolVersion = 0;
-} // anonymous namespace
-
-std::unique_ptr<HaldClient> HaldClient::New(const VSoCSharedMemory& shmem,
- const cvd::SharedFD& clientfd) {
- std::unique_ptr<HaldClient> res;
-
- if (!clientfd->IsOpen()) {
- LOG(WARNING) << "Invalid socket passed to HaldClient: "
- << clientfd->StrError();
- return res;
- }
-
- res.reset(new HaldClient(clientfd));
- if (!res->PerformHandshake(shmem)) {
- LOG(ERROR) << "HalD handshake failed. Dropping connection.";
- res.reset();
- }
-
- return res;
-}
-
-HaldClient::HaldClient(const cvd::SharedFD& client_socket)
- : client_socket_(client_socket) {}
-
-bool HaldClient::PerformHandshake(const VSoCSharedMemory& shared_mem) {
- int rval =
- client_socket_->Send(&kHaldClientProtocolVersion,
- sizeof(kHaldClientProtocolVersion), MSG_NOSIGNAL);
- if (rval != sizeof(kHaldClientProtocolVersion)) {
- LOG(ERROR) << "failed to send protocol version: "
- << client_socket_->StrError();
- return false;
- }
-
- int16_t region_name_len;
- if (client_socket_->Recv(®ion_name_len, sizeof(region_name_len),
- MSG_NOSIGNAL) != sizeof(region_name_len)) {
- LOG(ERROR) << "Error receiving region name length: "
- << client_socket_->StrError();
- return false;
- }
-
- if (region_name_len <= 0 ||
- region_name_len > VSOC_DEVICE_NAME_SZ) {
- LOG(ERROR) << "Invalid region length received: " << region_name_len;
- return false;
- }
-
- std::vector<char> region_name_data(region_name_len);
- rval = client_socket_->Recv(region_name_data.data(), region_name_len,
- MSG_NOSIGNAL);
- if (rval != region_name_len) {
- LOG(ERROR) << "Incomplete region name length received. Want: "
- << region_name_len << ", got: " << rval;
- return false;
- }
-
- std::string region_name(region_name_data.begin(), region_name_data.end());
- LOG(INFO) << "New HALD requesting region: " << region_name;
-
- // Send Host, Guest and SharedMemory FDs associated with this region.
- cvd::SharedFD guest_to_host_efd;
- cvd::SharedFD host_to_guest_efd;
-
- if (!shared_mem.GetEventFdPairForRegion(region_name, &guest_to_host_efd,
- &host_to_guest_efd)) {
- LOG(ERROR) << "Region " << region_name << " was not found.";
- return false;
- }
-
- if (!guest_to_host_efd->IsOpen()) {
- LOG(ERROR) << "Host channel is not open; last known error: "
- << guest_to_host_efd->StrError();
- return false;
- }
-
- if (!host_to_guest_efd->IsOpen()) {
- LOG(ERROR) << "Guest channel is not open; last known error: "
- << host_to_guest_efd->StrError();
- return false;
- }
-
- // TODO(ender): delete this once no longer necessary. Currently, absence of
- // payload makes RecvMsgAndFDs hang forever.
- uint64_t control_data = 0;
- struct iovec vec {
- &control_data, sizeof(control_data)
- };
- cvd::InbandMessageHeader hdr{nullptr, 0, &vec, 1, 0};
- cvd::SharedFD fds[3] = {guest_to_host_efd, host_to_guest_efd,
- shared_mem.SharedMemFD()};
- rval = client_socket_->SendMsgAndFDs<3>(hdr, MSG_NOSIGNAL, fds);
- if (rval == -1) {
- LOG(ERROR) << "failed to send Host FD: " << client_socket_->StrError();
- return false;
- }
-
- LOG(INFO) << "HALD managing region: " << region_name << " connected.";
- return true;
-}
-
-} // namespace ivserver
diff --git a/host/commands/ivserver/hald_client.h b/host/commands/ivserver/hald_client.h
deleted file mode 100644
index 3b0fe2b..0000000
--- a/host/commands/ivserver/hald_client.h
+++ /dev/null
@@ -1,49 +0,0 @@
-#pragma once
-/*
- * 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 <inttypes.h>
-#include <unistd.h>
-#include <memory>
-
-#include "common/libs/fs/shared_fd.h"
-#include "host/commands/ivserver/vsocsharedmem.h"
-
-namespace ivserver {
-
-// Handles a HAL deamon client connection & handshake.
-class HaldClient final {
- public:
- static std::unique_ptr<HaldClient> New(const VSoCSharedMemory &shared_mem,
- const cvd::SharedFD &client_fd);
-
- private:
- cvd::SharedFD client_socket_;
-
- // Initialize new instance of HAL Client.
- HaldClient(const cvd::SharedFD &client_fd);
-
- // Perform handshake with HAL Client.
- // If the region is not found approprate status (-1) is sent.
- // Note that for every new client connected a unique ClientConnection object
- // will be created and after the handshake it will be destroyed.
- bool PerformHandshake(const VSoCSharedMemory &shared_mem);
-
- HaldClient(const HaldClient &) = delete;
- HaldClient &operator=(const HaldClient &) = delete;
-};
-
-} // namespace ivserver
diff --git a/host/commands/ivserver/hald_client_test.cc b/host/commands/ivserver/hald_client_test.cc
deleted file mode 100644
index ee65530..0000000
--- a/host/commands/ivserver/hald_client_test.cc
+++ /dev/null
@@ -1,179 +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 <stdlib.h>
-#include <memory>
-#include <string>
-#include <thread>
-
-#include <glog/logging.h>
-#include <gmock/gmock.h>
-#include <gtest/gtest.h>
-
-#include "common/libs/fs/shared_fd.h"
-#include "host/commands/ivserver/hald_client.h"
-#include "host/commands/ivserver/vsocsharedmem_mock.h"
-
-using ::testing::_;
-using ::testing::DoAll;
-using ::testing::Return;
-using ::testing::ReturnRef;
-using ::testing::SetArgPointee;
-
-namespace ivserver {
-namespace test {
-
-class HaldClientTest : public ::testing::Test {
- public:
- void SetUp() override {
- std::string socket_location;
- ASSERT_TRUE(GetTempLocation(&socket_location))
- << "Could not create temp file";
- LOG(INFO) << "Temp file location: " << socket_location;
-
- hald_server_socket_ = cvd::SharedFD::SocketLocalServer(
- socket_location.c_str(), false, SOCK_STREAM, 0666);
- test_socket_ = cvd::SharedFD::SocketLocalClient(socket_location.c_str(),
- false, SOCK_STREAM);
- hald_socket_ =
- cvd::SharedFD::Accept(*hald_server_socket_, nullptr, nullptr);
-
- EXPECT_TRUE(hald_server_socket_->IsOpen());
- EXPECT_TRUE(test_socket_->IsOpen());
- EXPECT_TRUE(hald_socket_->IsOpen());
- }
-
- bool GetTempLocation(std::string* target) {
- char temp_location[] = "/tmp/hald-client-test-XXXXXX";
- mktemp(temp_location);
- *target = temp_location;
- if (target->size()) {
- cleanup_files_.emplace_back(*target);
- return true;
- }
- return false;
- }
-
- void TearDown() override {
- hald_socket_->Close();
- test_socket_->Close();
- hald_server_socket_->Close();
-
- for (const std::string& file : cleanup_files_) {
- unlink(file.c_str());
- }
- }
-
- protected:
- ::testing::NiceMock<VSoCSharedMemoryMock> vsoc_;
-
- cvd::SharedFD hald_server_socket_;
- cvd::SharedFD hald_socket_;
- cvd::SharedFD test_socket_;
-
- private:
- std::vector<std::string> cleanup_files_;
-};
-
-TEST_F(HaldClientTest, HandshakeTerminatedByHald) {
- std::thread thread(
- [this]() {
- auto client(HaldClient::New(vsoc_, hald_socket_));
- EXPECT_FALSE(client)
- << "Handshake should not complete when client terminates early.";
- });
-
- test_socket_->Close();
- thread.join();
-}
-
-TEST_F(HaldClientTest, HandshakeTerminatedByInvalidRegionSize) {
- uint16_t sizes[] = {0, VSOC_DEVICE_NAME_SZ + 1, 0xffff};
-
- for (uint16_t size : sizes) {
- std::thread thread([this, size]() {
- auto client(HaldClient::New(vsoc_, hald_socket_));
- EXPECT_FALSE(client) << "Handle should not be created when size is "
- << size;
- });
-
- int32_t proto_version;
- EXPECT_EQ(sizeof(proto_version),
- static_cast<size_t>(test_socket_->Recv(
- &proto_version, sizeof(proto_version), MSG_NOSIGNAL)));
-
- test_socket_->Send(&size, sizeof(size), MSG_NOSIGNAL);
- thread.join();
- }
-}
-
-TEST_F(HaldClientTest, FullSaneHandshake) {
- std::string temp;
- ASSERT_TRUE(GetTempLocation(&temp));
- cvd::SharedFD host_fd(
- cvd::SharedFD::Open(temp.c_str(), O_CREAT | O_RDWR, 0666));
- EXPECT_TRUE(host_fd->IsOpen());
-
- ASSERT_TRUE(GetTempLocation(&temp));
- cvd::SharedFD guest_fd(
- cvd::SharedFD::Open(temp.c_str(), O_CREAT | O_RDWR, 0666));
- EXPECT_TRUE(guest_fd->IsOpen());
-
- ASSERT_TRUE(GetTempLocation(&temp));
- cvd::SharedFD shmem_fd(
- cvd::SharedFD::Open(temp.c_str(), O_CREAT | O_RDWR, 0666));
- EXPECT_TRUE(shmem_fd->IsOpen());
-
- const std::string test_location("testing");
- EXPECT_CALL(vsoc_, GetEventFdPairForRegion(test_location, _, _))
- .WillOnce(DoAll(SetArgPointee<1>(host_fd), SetArgPointee<2>(guest_fd),
- Return(true)));
- EXPECT_CALL(vsoc_, SharedMemFD()).WillOnce(ReturnRef(shmem_fd));
-
- std::thread thread([this]() {
- auto client(HaldClient::New(vsoc_, hald_socket_));
- EXPECT_TRUE(client);
- });
-
- int32_t proto_version;
- EXPECT_EQ(sizeof(proto_version),
- static_cast<size_t>(test_socket_->Recv(
- &proto_version, sizeof(proto_version), MSG_NOSIGNAL)));
-
- uint16_t size = test_location.size();
- EXPECT_EQ(sizeof(size), static_cast<size_t>(test_socket_->Send(
- &size, sizeof(size), MSG_NOSIGNAL)));
- EXPECT_EQ(size, static_cast<size_t>(test_socket_->Send(test_location.data(),
- size, MSG_NOSIGNAL)));
-
- // TODO(ender): delete this once no longer necessary. Currently, absence of
- // payload makes RecvMsgAndFDs hang forever.
- uint64_t control_data;
- struct iovec vec {
- &control_data, sizeof(control_data)
- };
- cvd::InbandMessageHeader hdr{nullptr, 0, &vec, 1, 0};
- cvd::SharedFD fds[3];
-
- EXPECT_GT(test_socket_->RecvMsgAndFDs<3>(hdr, MSG_NOSIGNAL, &fds), 0);
- EXPECT_TRUE(fds[0]->IsOpen());
- EXPECT_TRUE(fds[1]->IsOpen());
- EXPECT_TRUE(fds[2]->IsOpen());
-
- thread.join();
-}
-
-} // namespace test
-} // namespace ivserver
diff --git a/host/commands/ivserver/ivserver.cc b/host/commands/ivserver/ivserver.cc
deleted file mode 100644
index ca274cc..0000000
--- a/host/commands/ivserver/ivserver.cc
+++ /dev/null
@@ -1,93 +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 "host/commands/ivserver/ivserver.h"
-
-#include <sys/select.h>
-#include <algorithm>
-
-#include <glog/logging.h>
-
-#include "common/libs/fs/shared_select.h"
-#include "host/commands/ivserver/hald_client.h"
-#include "host/commands/ivserver/qemu_client.h"
-
-namespace ivserver {
-
-IVServer::IVServer(const IVServerOptions &options, int qemu_channel_fd,
- int client_channel_fd)
- : vsoc_shmem_(VSoCSharedMemory::New(options.shm_file_path)) {
- if (qemu_channel_fd > 0) {
- qemu_channel_ = cvd::SharedFD::Dup(qemu_channel_fd);
- } else {
- LOG_IF(WARNING, unlink(options.qemu_socket_path.c_str()) == 0)
- << "Removed existing unix socket: " << options.qemu_socket_path
- << ". We can't confirm yet whether another instance is running.";
- qemu_channel_ = cvd::SharedFD::SocketLocalServer(
- options.qemu_socket_path.c_str(), false, SOCK_STREAM, 0666);
- }
- LOG_IF(FATAL, !qemu_channel_->IsOpen())
- << "Could not create QEmu channel: " << qemu_channel_->StrError();
-
- if (client_channel_fd > 0) {
- client_channel_ = cvd::SharedFD::Dup(client_channel_fd);
- } else {
- LOG_IF(WARNING, unlink(options.client_socket_path.c_str()) == 0)
- << "Removed existing unix socket: " << options.client_socket_path
- << ". We can't confirm yet whether another instance is running.";
- client_channel_ = cvd::SharedFD::SocketLocalServer(
- options.client_socket_path.c_str(), false, SOCK_STREAM, 0666);
- }
- LOG_IF(FATAL, !client_channel_->IsOpen())
- << "Could not create Client channel: " << client_channel_->StrError();
-}
-
-void IVServer::Serve() {
- while (true) {
- cvd::SharedFDSet rset;
- rset.Set(qemu_channel_);
- rset.Set(client_channel_);
- cvd::Select(&rset, nullptr, nullptr, nullptr);
-
- if (rset.IsSet(qemu_channel_)) {
- HandleNewQemuConnection();
- }
-
- if (rset.IsSet(client_channel_)) {
- HandleNewClientConnection();
- }
- }
-
- LOG(FATAL) << "Control reached out of event loop";
-}
-
-void IVServer::HandleNewClientConnection() {
- std::unique_ptr<HaldClient> res = HaldClient::New(
- *vsoc_shmem_, cvd::SharedFD::Accept(*client_channel_, nullptr, nullptr));
- if (!res) {
- LOG(WARNING) << "Rejecting unsuccessful HALD connection.";
- }
-}
-
-void IVServer::HandleNewQemuConnection() {
- std::unique_ptr<QemuClient> res = QemuClient::New(
- *vsoc_shmem_, cvd::SharedFD::Accept(*qemu_channel_, nullptr, nullptr));
-
- if (!res) {
- LOG(WARNING) << "Could not accept new QEmu client.";
- }
-}
-
-} // namespace ivserver
diff --git a/host/commands/ivserver/ivserver.h b/host/commands/ivserver/ivserver.h
deleted file mode 100644
index d28d14b..0000000
--- a/host/commands/ivserver/ivserver.h
+++ /dev/null
@@ -1,51 +0,0 @@
-#pragma once
-/*
- * 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 <memory>
-
-#include "common/libs/fs/shared_fd.h"
-#include "host/commands/ivserver/options.h"
-#include "host/commands/ivserver/vsocsharedmem.h"
-
-namespace ivserver {
-
-// This class is responsible for orchestrating the setup and then serving
-// new connections.
-class IVServer final {
- public:
- // The qemu_channel_fd and client_channel_fd are the server sockets. If
- // non-positive values are provided the server will create those sockets
- // itself.
- IVServer(const IVServerOptions &options, int qemu_channel_fd,
- int client_channel_fd);
- IVServer(const IVServer &) = delete;
- IVServer& operator=(const IVServer&) = delete;
-
- // Serves incoming client and qemu connection.
- // This method should never return.
- void Serve();
-
- private:
- void HandleNewClientConnection();
- void HandleNewQemuConnection();
-
- std::unique_ptr<VSoCSharedMemory> vsoc_shmem_;
- cvd::SharedFD qemu_channel_;
- cvd::SharedFD client_channel_;
-};
-
-} // namespace ivserver
diff --git a/host/commands/ivserver/main.cpp b/host/commands/ivserver/main.cpp
deleted file mode 100644
index 16aa747..0000000
--- a/host/commands/ivserver/main.cpp
+++ /dev/null
@@ -1,64 +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 <unistd.h>
-
-#include <thread>
-
-#include <gflags/gflags.h>
-#include <glog/logging.h>
-
-#include "host/libs/config/cuttlefish_config.h"
-#include "host/commands/ivserver/ivserver.h"
-#include "host/commands/ivserver/options.h"
-
-DEFINE_int32(
- qemu_socket_fd, -1,
- "A file descriptor to use as the server Qemu connects to. If not specified "
- "a unix socket will be created in the default location.");
-DEFINE_int32(
- client_socket_fd, -1,
- "A file descriptor to use as the server clients connects to. If not "
- "specified a unix socket will be created in the default location.");
-
-int main(int argc, char* argv[]) {
- ::android::base::InitLogging(argv, android::base::StderrLogger);
- google::ParseCommandLineFlags(&argc, &argv, true);
-
- auto config = vsoc::CuttlefishConfig::Get();
- if (!config) {
- LOG(ERROR) << "Unable to get cuttlefish config";
- return 1;
- }
-
- ivserver::IVServer server(
- ivserver::IVServerOptions(config->mempath(),
- config->ivshmem_qemu_socket_path(),
- vsoc::GetDomain()),
- FLAGS_qemu_socket_fd, FLAGS_client_socket_fd);
-
- // Close the file descriptors as they have been dupped by now.
- if (FLAGS_qemu_socket_fd > 0) {
- close(FLAGS_qemu_socket_fd);
- }
- if (FLAGS_client_socket_fd > 0) {
- close(FLAGS_client_socket_fd);
- }
-
- server.Serve();
-
- return 0;
-}
diff --git a/host/commands/ivserver/options.cc b/host/commands/ivserver/options.cc
deleted file mode 100644
index 0f19397..0000000
--- a/host/commands/ivserver/options.cc
+++ /dev/null
@@ -1,35 +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 "host/commands/ivserver/options.h"
-
-namespace ivserver {
-
-IVServerOptions::IVServerOptions(const std::string &shm_file_path,
- const std::string &qemu_socket_path,
- const std::string &client_socket_path)
- : shm_file_path(shm_file_path),
- qemu_socket_path(qemu_socket_path),
- client_socket_path(client_socket_path) {}
-
-std::ostream &operator<<(std::ostream &out, const IVServerOptions &options) {
- out << "\nshm_file: " << options.shm_file_path
- << "\nqemu_socket_path: " << options.qemu_socket_path
- << "\nclient_socket_path: " << options.client_socket_path << std::endl;
-
- return out;
-}
-
-} // namespace ivserver
diff --git a/host/commands/ivserver/options.h b/host/commands/ivserver/options.h
deleted file mode 100644
index 40b3246..0000000
--- a/host/commands/ivserver/options.h
+++ /dev/null
@@ -1,47 +0,0 @@
-#pragma once
-/*
- * 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 <inttypes.h>
-#include <iostream>
-#include <string>
-
-namespace ivserver {
-
-const uint16_t kIVServerMajorVersion = 1;
-const uint16_t kIVServerMinorVersion = 0;
-const uint32_t kIVServerDefaultShmSizeInMiB = 4;
-
-//
-// structure that contains the various options to start the server.
-//
-struct IVServerOptions final {
- IVServerOptions(const std::string &shm_file_path,
- const std::string &qemu_socket_path,
- const std::string &client_socket_path);
-
- //
- // We still need a friend here
- //
- friend std::ostream &operator<<(std::ostream &out,
- const IVServerOptions &opts);
-
- const std::string shm_file_path;
- const std::string qemu_socket_path;
- const std::string client_socket_path;
-};
-
-} // namespace ivserver
diff --git a/host/commands/ivserver/qemu_client.cc b/host/commands/ivserver/qemu_client.cc
deleted file mode 100644
index 660c915..0000000
--- a/host/commands/ivserver/qemu_client.cc
+++ /dev/null
@@ -1,124 +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 "host/commands/ivserver/qemu_client.h"
-
-#include <glog/logging.h>
-
-namespace ivserver {
-
-std::unique_ptr<QemuClient> QemuClient::New(const VSoCSharedMemory& shmem,
- const cvd::SharedFD& socket) {
- std::unique_ptr<QemuClient> res;
- if (!socket->IsOpen()) {
- LOG(WARNING) << "Invalid socket passed to QemuClient: "
- << socket->StrError();
- return res;
- }
-
- res.reset(new QemuClient(std::move(socket)));
- if (!res->PerformHandshake(shmem)) {
- LOG(ERROR) << "Qemu handshake failed. Dropping connection.";
- res.reset();
- }
-
- return res;
-}
-
-QemuClient::QemuClient(cvd::SharedFD socket) : client_socket_(socket) {}
-
-// Once the QemuClient object is constructed, invoking the following
-// method will perform the actual handshake with a QEMU instance.
-bool QemuClient::PerformHandshake(const VSoCSharedMemory& shmem) {
- LOG(INFO) << "New QEmu client connected.";
- // 1. The protocol version number, currently zero. The client should
- // close the connection on receipt of versions it can't handle.
- int64_t msg = QemuConstants::kIvshMemProtocolVersion;
- int rval = client_socket_->Send(&msg, sizeof(msg), MSG_NOSIGNAL);
- if (rval != sizeof(msg)) {
- LOG(ERROR) << "Failed to send protocol version: "
- << client_socket_->StrError();
- return false;
- }
-
- // 2. The client's ID. This is unique among all clients of this server.
- // IDs must be between 0 and 65535, because the Doorbell register
- // provides only 16 bits for them.
- msg = QemuConstants::kGuestID;
- rval = client_socket_->Send(&msg, sizeof(msg), MSG_NOSIGNAL);
- if (rval != sizeof(msg)) {
- LOG(ERROR) << "Failed to send VM Id: " << client_socket_->StrError();
- return false;
- }
-
- // 3. Connect notifications for existing other clients, if any. This is
- // a peer ID (number between 0 and 65535 other than the client's ID),
- // repeated N times. Each repetition is accompanied by one file
- // descriptor. These are for interrupting the peer with that ID using
- // vector 0,..,N-1, in order. If the client is configured for fewer
- // vectors, it closes the extra file descriptors. If it is configured
- // for more, the extra vectors remain unconnected.
- for (const auto& region_data : shmem.Regions()) {
- if (!SendSocketInfo(kHostID, region_data.host_fd)) {
- LOG(ERROR) << "Failed to send Host Side FD for region "
- << region_data.device_name << ": " << client_socket_->StrError();
- return false;
- }
- }
-
- // 4. Interrupt setup. This is the client's own ID, repeated N times.
- // Each repetition is accompanied by one file descriptor. These are
- // for receiving interrupts from peers using vector 0,..,N-1, in
- // order. If the client is configured for fewer vectors, it closes
- // the extra file descriptors. If it is configured for more, the
- // extra vectors remain unconnected.
- for (const auto& region_data : shmem.Regions()) {
- if (!SendSocketInfo(kGuestID, region_data.guest_fd)) {
- LOG(ERROR) << "Failed to send Guest Side FD for region "
- << region_data.device_name << ": " << client_socket_->StrError();
- return false;
- }
- }
-
- // 5. The number -1, accompanied by the file descriptor for the shared
- // memory.
- if (!SendSocketInfo(kSharedMem, shmem.SharedMemFD())) {
- LOG(ERROR) << "Failed to send Shared Memory socket: "
- << client_socket_->StrError();
- return false;
- }
-
-
- LOG(INFO) << "QEmu handshake completed.";
- return true;
-}
-
-bool QemuClient::SendSocketInfo(QemuConstants message,
- const cvd::SharedFD& socket) {
- struct iovec vec {
- &message, sizeof(message)
- };
- cvd::InbandMessageHeader hdr{nullptr, 0, &vec, 1, 0};
- cvd::SharedFD fds[] = {socket};
- int rval = client_socket_->SendMsgAndFDs(hdr, 0, fds);
- if (rval == -1) {
- LOG(ERROR) << "failed to send shared_mem_fd: "
- << client_socket_->StrError();
- return false;
- }
- return true;
-}
-
-} // namespace ivserver
diff --git a/host/commands/ivserver/qemu_client.h b/host/commands/ivserver/qemu_client.h
deleted file mode 100644
index 31cd211..0000000
--- a/host/commands/ivserver/qemu_client.h
+++ /dev/null
@@ -1,69 +0,0 @@
-#pragma once
-/*
- * 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 <memory>
-
-#include "common/libs/fs/shared_fd.h"
-#include "host/commands/ivserver/vsocsharedmem.h"
-
-namespace ivserver {
-
-// QemuClient manages individual QEmu connections using protocol specified
-// in documentation file distributed as part of QEmu 2.8 package under:
-// docs/specs/ivshmem-spec.txt
-// Alternatively, please point your browser to the following URL:
-// https://github.com/qemu/qemu/blob/stable-2.8/docs/specs/ivshmem-spec.txt
-class QemuClient final {
- public:
- static std::unique_ptr<QemuClient> New(const VSoCSharedMemory &shmem,
- const cvd::SharedFD &connection);
-
- cvd::SharedFD client_socket() const { return client_socket_; }
-
- private:
- enum QemuConstants : int64_t {
- kIvshMemProtocolVersion = 0,
- // Marker for the shared memory file
- kSharedMem = -1,
- // HostID is in fact a Peer ID and can take multiple values, depending on
- // how many subsystems we would like Guest to talk to.
- kHostID = 0,
- // GuestID is a unique form of Peer ID (see above), that identifies newly
- // created quest in IvSharedMem world.
- kGuestID = 1
- };
-
- static_assert(QemuConstants::kHostID != QemuConstants::kGuestID,
- "Guest and host should have different IDs");
-
- cvd::SharedFD client_socket_;
-
- // Initialize new instance of QemuClient.
- QemuClient(cvd::SharedFD qemu_listener_socket);
-
- // Once the QemuClient object is constructed, invoking the following
- // method will perform the actual handshake with a QEMU instance.
- bool PerformHandshake(const VSoCSharedMemory &shmem_fd);
-
- // Send socket data to Qemu.
- bool SendSocketInfo(QemuConstants message, const cvd::SharedFD &socket);
-
- QemuClient(const QemuClient &) = delete;
- QemuClient &operator=(const QemuClient &) = delete;
-};
-
-} // namespace ivserver
diff --git a/host/commands/ivserver/shm_layout.txt b/host/commands/ivserver/shm_layout.txt
deleted file mode 100644
index 39d66a7..0000000
--- a/host/commands/ivserver/shm_layout.txt
+++ /dev/null
@@ -1,88 +0,0 @@
-(Please use a smaller font and/or appropriate terminal width to see this line without wrapping)
-
-
- REGION DESCRIPTORS
- (starts at page 0)
- +------------------------------+
- | major_version: u16 |
- +------------------------------+
- | minor_version: u16 |
- +------------------------------+
- (size of shared memory) | size: u32 |
- +------------------------------+
- (number of regions) | region_count: u32 |
- +------------------------------+
- (offset of region descriptor data) | vsoc_region_desc_offset: u32 |o-----+
- +------------------------------+ |
- | | |
- | .. .. .. | |
- | | |
- (region 0 descriptor start) +------------------------------+ <----+
- | current_version: u16 |
- +------------------------------+
- | min_compatible_version: u16 |
- +------------------------------+
- (start offset of region 0) | region_begin_offset: u32 |o--------------------+
- +------------------------------+ |
- (end offset of region 0) | region_end_offset: u32 |o----------------------------------------------------------------------+
- +------------------------------+ | |
- | offset_of_region_data: u32 |o-----+ | |
- +------------------------------+ | | |
- | guest_to_host_signal_table | | | |
- |______________________________| | | |
- +----------------------------+ | | |
- | num_nodes_lg2: u32 | | | |
- +----------------------------+ | | |
- |futex_uaddr_table_offset:u32|o------------------+ | |
- +----------------------------+ | | | |
- | intr_signaled_offset: u32 |o----------------+ | | |
- +----------------------------+ | | | | |
- +------------------------------+ | | | | |
- | host_to_guest_signal_table | | | | | |
- |______________________________| | | | | |
- +----------------------------+ | | | | |
- | num_nodes_lg2: u32 | | | | | |
- +----------------------------+ | | | | |
- |futex_uaddr_table_offset:u32|o--------------+ | | | |
- +----------------------------+ | | | | \/ REGION AREA (page aligned) |
- | intr_signaled_offset: u32 |o------|-----+ | | | +---------------------------------------+ |
- +----------------------------+ | | | | | | region area before start of guest to | |
- +------------------------------+ | | | | | | host signal table. | |
- | device_name: char[16] | | | | | | | (currently does not exist) | |
- (region 0 descriptor end) +------------------------------+ | | | | +->+---------------------------------------+ |
- (region 1 descriptor start) | | | | | | | uaddr_offset_0 : u32 | |
- | current_version: u16 | | | | | +---------------------------------------+ |
- +------------------------------+ | | | | | uaddr_offset_1 : u32 | |
- | min_compatible_version: u16 | | | | | +---------------------------------------+ |
- +------------------------------+ | | | | | ... .. ... | |
- | region_begin_offset: u32 | | | | | +---------------------------------------+ |
- +------------------------------+ | | | | | uaddr_offset_(2^num_nodes_lg2 - 1):u32| |
- | region_end_offset: u32 | | | | +--->+---------------------------------------+ |
- +------------------------------+ | | | | (interrupt_signaled_area) : u32 | |
- | offset_of_region_data: u32 | | | +----->+---------------------------------------+ |
- +------------------------------+ | | | uaddr_offset_0 : u32 | |
- | guest_to_host_signal_table | | | +---------------------------------------+ |
- +------------------------------+ | | | ... .. ... | |
- | host_to_guest_signal_table | | | +---------------------------------------+ |
- +------------------------------+ | | | uaddr_offset_(2^num_nodes_lg2 - 1):u32| |
- | device_name: char[16] | | +------->+---------------------------------------+ |
- (region 1 descriptor end) +------------------------------+ | | (interrupt_signaled_area) : u32 | |
- ... ... ... +------------->+---------------------------------------+ |
- +------------------------------+ | | |
- | current_version: u16 | | | |
- +------------------------------+ | | |
- | min_compatible_version: u16 | | region specific data | |
- +------------------------------+ | (defined by region specific agreement | |
- | region_begin_offset: u32 | | between HAL and host-side process) | |
- +------------------------------+ | | |
- | region_end_offset: u32 | | | |
- +------------------------------+ | | |
- | offset_of_region_data: u32 | +---------------------------------------+ <-------+
- +------------------------------+
- | guest_to_host_signal_table |
- +------------------------------+
- | host_to_guest_signal_table |
- +------------------------------+
- | device_name: char[16] |
- +------------------------------+
- END OF REGION DESCRIPTORS
diff --git a/host/commands/ivserver/vsocsharedmem.cc b/host/commands/ivserver/vsocsharedmem.cc
deleted file mode 100644
index eb448d8..0000000
--- a/host/commands/ivserver/vsocsharedmem.cc
+++ /dev/null
@@ -1,131 +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 "host/commands/ivserver/vsocsharedmem.h"
-
-#include <errno.h>
-#include <fcntl.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/eventfd.h>
-#include <sys/mman.h>
-#include <sys/stat.h>
-#include <unistd.h>
-#include <algorithm>
-#include <tuple>
-
-#include <glog/logging.h>
-
-#include "common/vsoc/lib/vsoc_memory.h"
-#include "uapi/vsoc_shm.h"
-
-namespace ivserver {
-namespace {
-
-class VSoCSharedMemoryImpl : public VSoCSharedMemory {
- public:
- VSoCSharedMemoryImpl(const std::map<std::string, size_t> &name_to_region_idx,
- const std::vector<Region> ®ions,
- const std::string &path);
-
- bool GetEventFdPairForRegion(const std::string ®ion_name,
- cvd::SharedFD *guest_to_host,
- cvd::SharedFD *host_to_guest) const override;
-
- const cvd::SharedFD &SharedMemFD() const override;
-
- const std::vector<Region> &Regions() const override;
-
- private:
- void CreateLayout();
-
- cvd::SharedFD shared_mem_fd_;
- const std::map<std::string, size_t> region_name_to_index_;
- const std::vector<Region> region_data_;
-
- VSoCSharedMemoryImpl(const VSoCSharedMemoryImpl &) = delete;
- VSoCSharedMemoryImpl &operator=(const VSoCSharedMemoryImpl &other) = delete;
-};
-
-VSoCSharedMemoryImpl::VSoCSharedMemoryImpl(
- const std::map<std::string, size_t> &name_to_region_idx,
- const std::vector<Region> ®ions, const std::string &path)
- : shared_mem_fd_(cvd::SharedFD::Open(path.c_str(), O_RDWR)),
- region_name_to_index_{name_to_region_idx},
- region_data_{regions} {
- LOG_IF(FATAL, !shared_mem_fd_->IsOpen())
- << "Error in creating shared_memory file: " << shared_mem_fd_->StrError();
-}
-
-const cvd::SharedFD &VSoCSharedMemoryImpl::SharedMemFD() const {
- return shared_mem_fd_;
-}
-
-const std::vector<VSoCSharedMemory::Region> &VSoCSharedMemoryImpl::Regions()
- const {
- return region_data_;
-}
-
-bool VSoCSharedMemoryImpl::GetEventFdPairForRegion(
- const std::string ®ion_name, cvd::SharedFD *guest_to_host,
- cvd::SharedFD *host_to_guest) const {
- auto it = region_name_to_index_.find(region_name);
- if (it == region_name_to_index_.end()) return false;
-
- *guest_to_host = region_data_[it->second].host_fd;
- *host_to_guest = region_data_[it->second].guest_fd;
- return true;
-}
-
-} // anonymous namespace
-
-std::unique_ptr<VSoCSharedMemory> VSoCSharedMemory::New(
- const std::string &path) {
- auto device_layout = vsoc::VSoCMemoryLayout::Get();
-
- std::map<std::string, size_t> name_to_region_idx;
- std::vector<Region> regions;
- regions.reserve(device_layout->GetRegions().size());
-
- for (auto region_spec : device_layout->GetRegions()) {
- auto device_name = region_spec->region_name();
-
- // Create one pair of eventfds for this region. Note that the guest to host
- // eventfd is non-blocking, whereas the host to guest eventfd is blocking.
- // This is in anticipation of blocking semantics for the host side locks.
- auto host_fd = cvd::SharedFD::Event(0, EFD_NONBLOCK);
- if (!host_fd->IsOpen()) {
- LOG(ERROR) << "Failed to create host eventfd for " << device_name << ": "
- << host_fd->StrError();
- return nullptr;
- }
- auto guest_fd = cvd::SharedFD::Event(0, EFD_NONBLOCK);
- if (!guest_fd->IsOpen()) {
- LOG(ERROR) << "Failed to create guest eventfd for " << device_name << ": "
- << guest_fd->StrError();
- return nullptr;
- }
-
- auto region_idx = regions.size();
- name_to_region_idx[device_name] = region_idx;
- regions.emplace_back(device_name, host_fd, guest_fd);
- }
-
- return std::unique_ptr<VSoCSharedMemory>(
- new VSoCSharedMemoryImpl(name_to_region_idx, regions, path));
-}
-
-} // namespace ivserver
diff --git a/host/commands/ivserver/vsocsharedmem.h b/host/commands/ivserver/vsocsharedmem.h
deleted file mode 100644
index 613c6a0..0000000
--- a/host/commands/ivserver/vsocsharedmem.h
+++ /dev/null
@@ -1,59 +0,0 @@
-#pragma once
-/*
- * 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 <inttypes.h>
-#include <map>
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "common/libs/fs/shared_fd.h"
-#include "uapi/vsoc_shm.h"
-
-namespace ivserver {
-
-class VSoCSharedMemory {
- public:
- // Region describes a VSoCSharedMem region.
- struct Region {
- Region() = default;
- explicit Region(const char *device_name, const cvd::SharedFD &host_fd,
- const cvd::SharedFD &guest_fd)
- : device_name(device_name), host_fd(host_fd), guest_fd(guest_fd) {}
- const char *device_name;
- cvd::SharedFD host_fd;
- cvd::SharedFD guest_fd;
- };
-
- VSoCSharedMemory() = default;
- virtual ~VSoCSharedMemory() = default;
-
- static std::unique_ptr<VSoCSharedMemory> New(const std::string &name);
-
- virtual bool GetEventFdPairForRegion(const std::string ®ion_name,
- cvd::SharedFD *guest_to_host,
- cvd::SharedFD *host_to_guest) const = 0;
-
- virtual const cvd::SharedFD &SharedMemFD() const = 0;
- virtual const std::vector<Region> &Regions() const = 0;
-
- private:
- VSoCSharedMemory(const VSoCSharedMemory &) = delete;
- VSoCSharedMemory &operator=(const VSoCSharedMemory &other) = delete;
-};
-
-} // namespace ivserver
diff --git a/host/commands/ivserver/vsocsharedmem_mock.h b/host/commands/ivserver/vsocsharedmem_mock.h
deleted file mode 100644
index 4ed1f16..0000000
--- a/host/commands/ivserver/vsocsharedmem_mock.h
+++ /dev/null
@@ -1,33 +0,0 @@
-#pragma once
-/*
- * 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 <gmock/gmock.h>
-
-#include "host/commands/ivserver/vsocsharedmem.h"
-
-namespace ivserver {
-namespace test {
-class VSoCSharedMemoryMock : public VSoCSharedMemory {
- public:
- MOCK_CONST_METHOD3(GetEventFdPairForRegion,
- bool(const std::string&, cvd::SharedFD*, cvd::SharedFD*));
- MOCK_CONST_METHOD0(SharedMemFD, const cvd::SharedFD&());
- MOCK_CONST_METHOD0(Regions,
- const std::vector<VSoCSharedMemory::Region>&());
-};
-} // namespace test
-} // namespace ivserver
diff --git a/host/commands/launch/Android.bp b/host/commands/launch/Android.bp
index e2db615..6dd6426 100644
--- a/host/commands/launch/Android.bp
+++ b/host/commands/launch/Android.bp
@@ -24,7 +24,6 @@
"cuttlefish_glog",
],
shared_libs: [
- "vsoc_lib",
"libcuttlefish_fs",
"libcuttlefish_utils",
"cuttlefish_auto_resources",
@@ -34,7 +33,6 @@
static_libs: [
"libcuttlefish_host_config",
"libcuttlefish_vm_manager",
- "libivserver",
"libgflags",
"libxml2",
"libjsoncpp",
diff --git a/host/commands/record_audio/Android.bp b/host/commands/record_audio/Android.bp
deleted file mode 100644
index 13f47ef..0000000
--- a/host/commands/record_audio/Android.bp
+++ /dev/null
@@ -1,35 +0,0 @@
-//
-// Copyright (C) 2018 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.
-
-cc_binary_host {
- name: "record_audio",
- srcs: [
- "main.cc",
- ],
- include_dirs: [
- "frameworks/av/cmds/stagefright",
- ],
- shared_libs: [
- "libbase",
- "libcuttlefish_utils",
- "vsoc_lib",
- ],
- static_libs: [
- "libcuttlefish_host_config",
- "libjsoncpp",
- "libgflags",
- ],
- defaults: ["cuttlefish_host_only"],
-}
diff --git a/host/commands/record_audio/main.cc b/host/commands/record_audio/main.cc
deleted file mode 100644
index 3c024b8..0000000
--- a/host/commands/record_audio/main.cc
+++ /dev/null
@@ -1,138 +0,0 @@
-/*
- * Copyright (C) 2018 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/audio_data_region_view.h"
-#include "common/vsoc/lib/circqueue_impl.h"
-#include "common/vsoc/lib/vsoc_audio_message.h"
-#include "host/libs/config/cuttlefish_config.h"
-
-#include "WaveWriter.h"
-
-#include <android-base/logging.h>
-#include <gflags/gflags.h>
-#include <iostream>
-#include <signal.h>
-
-using AudioDataRegionView = vsoc::audio_data::AudioDataRegionView;
-using WaveWriter = android::WaveWriter;
-
-DEFINE_string(output_file, "", "Location of the output audio file.");
-DEFINE_bool(verbose, false, "Enable verbose logging.");
-
-volatile bool gDone = false;
-static void SigIntHandler(int /* sig */) {
- gDone = true;
-}
-
-int main(int argc, char **argv) {
- ::android::base::InitLogging(argv, android::base::StderrLogger);
- google::ParseCommandLineFlags(&argc, &argv, true);
-
- LOG_IF(FATAL, FLAGS_output_file.empty())
- << "--output_file must be specified.";
-
- AudioDataRegionView *audio_data_rv =
- AudioDataRegionView::GetInstance(vsoc::GetDomain().c_str());
-
- auto worker = audio_data_rv->StartWorker();
-
- std::unique_ptr<WaveWriter> writer;
- int64_t frameCount = 0LL;
-
- // The configuration the writer is setup for.
- gce_audio_message writer_hdr;
-
- uint8_t buffer[4096];
-
- gDone = false;
-
- struct sigaction act;
- sigemptyset(&act.sa_mask);
- act.sa_flags = 0;
- act.sa_handler = SigIntHandler;
-
- struct sigaction oact;
- sigaction(SIGINT, &act, &oact);
-
- while (!gDone) {
- intptr_t res = audio_data_rv->data()->audio_queue.Read(
- audio_data_rv,
- reinterpret_cast<char *>(buffer),
- sizeof(buffer));
-
- if (res < 0) {
- std::cerr << "CircularPacketQueue::Read returned " << res << std::endl;
- continue;
- }
-
- CHECK_GE(static_cast<size_t>(res), sizeof(gce_audio_message));
-
- gce_audio_message hdr;
- std::memcpy(&hdr, buffer, sizeof(gce_audio_message));
-
- if (hdr.message_type != gce_audio_message::DATA_SAMPLES) {
- continue;
- }
-
- const size_t payloadSize = res - sizeof(gce_audio_message);
-
- if (FLAGS_verbose) {
- std::cerr
- << "stream "
- << hdr.stream_number
- << ", frame "
- << hdr.frame_num
- << ", rate "
- << hdr.frame_rate
- << ", channel_mask "
- << hdr.channel_mask
- << ", format "
- << hdr.format
- << ", payload_size "
- << payloadSize
- << std::endl;
- }
-
- if (!writer) {
- const size_t numChannels = hdr.frame_size / sizeof(int16_t);
-
- writer.reset(
- new WaveWriter(FLAGS_output_file.c_str(), numChannels, hdr.frame_rate));
-
- frameCount = hdr.frame_num;
- writer_hdr = hdr;
- } else if (writer_hdr.frame_size != hdr.frame_size
- || writer_hdr.frame_rate != hdr.frame_rate
- || writer_hdr.stream_number != hdr.stream_number) {
- std::cerr << "Audio configuration changed. Aborting." << std::endl;
- break;
- }
-
- int64_t framesMissing = hdr.frame_num - frameCount;
- if (framesMissing > 0) {
- // TODO(andih): Insert silence here, if necessary.
- }
-
- frameCount = hdr.frame_num;
-
- writer->Append(&buffer[sizeof(gce_audio_message)], payloadSize);
- }
-
- std::cout << "DONE" << std::endl;
-
- return 0;
-}
-
diff --git a/host/commands/run_cvd/Android.bp b/host/commands/run_cvd/Android.bp
index 29238c9..a8621e9 100644
--- a/host/commands/run_cvd/Android.bp
+++ b/host/commands/run_cvd/Android.bp
@@ -19,14 +19,11 @@
"launch.cc",
"process_monitor.cc",
"main.cc",
- "screen_region_handler.cc",
- "vsoc_shared_memory.cc",
],
header_libs: [
"cuttlefish_glog",
],
shared_libs: [
- "vsoc_lib",
"libcuttlefish_fs",
"libcuttlefish_utils",
"cuttlefish_auto_resources",
@@ -36,7 +33,6 @@
static_libs: [
"libcuttlefish_host_config",
"libcuttlefish_vm_manager",
- "libivserver",
"libgflags",
"libxml2",
"libjsoncpp",
diff --git a/host/commands/run_cvd/launch.cc b/host/commands/run_cvd/launch.cc
index 5c42e59..e4eb858 100644
--- a/host/commands/run_cvd/launch.cc
+++ b/host/commands/run_cvd/launch.cc
@@ -8,10 +8,8 @@
#include "common/libs/fs/shared_fd.h"
#include "common/libs/utils/files.h"
#include "common/libs/utils/size_utils.h"
-#include "common/vsoc/shm/screen_layout.h"
#include "host/commands/run_cvd/runner_defs.h"
#include "host/commands/run_cvd/pre_launch_initializers.h"
-#include "host/commands/run_cvd/vsoc_shared_memory.h"
#include "host/libs/vm_manager/crosvm_manager.h"
#include "host/libs/vm_manager/qemu_manager.h"
@@ -20,20 +18,6 @@
namespace {
-cvd::SharedFD CreateIvServerUnixSocket(const std::string& path) {
- return cvd::SharedFD::SocketLocalServer(path.c_str(), false, SOCK_STREAM,
- 0666);
-}
-
-std::string GetGuestPortArg() {
- constexpr int kEmulatorPort = 5555;
- return std::string{"--guest_ports="} + std::to_string(kEmulatorPort);
-}
-
-std::string GetHostPortArg(const vsoc::CuttlefishConfig& config) {
- return std::string{"--host_ports="} + std::to_string(config.host_port());
-}
-
std::string GetAdbConnectorTcpArg(const vsoc::CuttlefishConfig& config) {
return std::string{"127.0.0.1:"} + std::to_string(config.host_port());
}
@@ -48,10 +32,6 @@
return config.adb_mode().count(mode) > 0;
}
-bool AdbTunnelEnabled(const vsoc::CuttlefishConfig& config) {
- return AdbModeEnabled(config, vsoc::AdbMode::Tunnel);
-}
-
bool AdbVsockTunnelEnabled(const vsoc::CuttlefishConfig& config) {
return config.vsock_guest_cid() > 2
&& AdbModeEnabled(config, vsoc::AdbMode::VsockTunnel);
@@ -63,11 +43,9 @@
}
bool AdbTcpConnectorEnabled(const vsoc::CuttlefishConfig& config) {
- bool tunnel = AdbTunnelEnabled(config);
bool vsock_tunnel = AdbVsockTunnelEnabled(config);
bool vsock_half_tunnel = AdbVsockHalfTunnelEnabled(config);
- return config.run_adb_connector()
- && (tunnel || vsock_tunnel || vsock_half_tunnel);
+ return config.run_adb_connector() && (vsock_tunnel || vsock_half_tunnel);
}
bool AdbVsockConnectorEnabled(const vsoc::CuttlefishConfig& config) {
@@ -93,32 +71,6 @@
return config.logcat_mode() == cvd::kLogcatVsockMode;
}
-cvd::Command GetIvServerCommand(const vsoc::CuttlefishConfig& config) {
- // Resize screen region
- auto actual_width = cvd::AlignToPowerOf2(config.x_res() * 4, 4);// align to 16
- uint32_t screen_buffers_size =
- config.num_screen_buffers() *
- cvd::AlignToPageSize(actual_width * config.y_res() + 16 /* padding */);
- screen_buffers_size +=
- (config.num_screen_buffers() - 1) * 4096; /* Guard pages */
-
- // TODO(b/79170615) Resize gralloc region too.
-
- vsoc::CreateSharedMemoryFile(
- config.mempath(),
- {{vsoc::layout::screen::ScreenLayout::region_name, screen_buffers_size}});
-
-
- cvd::Command ivserver(config.ivserver_binary());
- ivserver.AddParameter(
- "-qemu_socket_fd=",
- CreateIvServerUnixSocket(config.ivshmem_qemu_socket_path()));
- ivserver.AddParameter(
- "-client_socket_fd=",
- CreateIvServerUnixSocket(config.ivshmem_client_socket_path()));
- return ivserver;
-}
-
std::vector<cvd::SharedFD> LaunchKernelLogMonitor(
const vsoc::CuttlefishConfig& config,
cvd::ProcessMonitor* process_monitor,
@@ -314,17 +266,6 @@
return false;
}
-void LaunchStreamAudioIfEnabled(const vsoc::CuttlefishConfig& config,
- cvd::ProcessMonitor* process_monitor,
- std::function<bool(MonitorEntry*)> callback) {
- if (config.enable_stream_audio()) {
- auto port_options = "-port=" + std::to_string(config.stream_audio_port());
- cvd::Command stream_audio(config.stream_audio_binary());
- stream_audio.AddParameter(port_options);
- process_monitor->StartSubprocess(std::move(stream_audio), callback);
- }
-}
-
void LaunchAdbConnectorIfEnabled(cvd::ProcessMonitor* process_monitor,
const vsoc::CuttlefishConfig& config,
cvd::SharedFD adbd_events_pipe) {
@@ -351,17 +292,6 @@
}
}
-void LaunchSocketForwardProxyIfEnabled(cvd::ProcessMonitor* process_monitor,
- const vsoc::CuttlefishConfig& config) {
- if (AdbTunnelEnabled(config)) {
- cvd::Command adb_tunnel(config.socket_forward_proxy_binary());
- adb_tunnel.AddParameter(GetGuestPortArg());
- adb_tunnel.AddParameter(GetHostPortArg(config));
- process_monitor->StartSubprocess(std::move(adb_tunnel),
- GetOnSubprocessExitCallback(config));
- }
-}
-
void LaunchSocketVsockProxyIfEnabled(cvd::ProcessMonitor* process_monitor,
const vsoc::CuttlefishConfig& config) {
if (AdbVsockTunnelEnabled(config)) {
@@ -385,14 +315,3 @@
GetOnSubprocessExitCallback(config));
}
}
-
-void LaunchIvServerIfEnabled(cvd::ProcessMonitor* process_monitor,
- const vsoc::CuttlefishConfig& config) {
- if (config.enable_ivserver()) {
- process_monitor->StartSubprocess(GetIvServerCommand(config),
- GetOnSubprocessExitCallback(config));
-
- // Initialize the regions that require so before the VM starts.
- PreLaunchInitializers::Initialize(config);
- }
-}
diff --git a/host/commands/run_cvd/launch.h b/host/commands/run_cvd/launch.h
index 714b5bd..4db6e12 100644
--- a/host/commands/run_cvd/launch.h
+++ b/host/commands/run_cvd/launch.h
@@ -6,7 +6,6 @@
#include "host/commands/run_cvd/process_monitor.h"
#include "host/libs/config/cuttlefish_config.h"
-cvd::Command GetIvServerCommand(const vsoc::CuttlefishConfig& config);
std::vector <cvd::SharedFD> LaunchKernelLogMonitor(
const vsoc::CuttlefishConfig& config,
cvd::ProcessMonitor* process_monitor,
@@ -20,17 +19,10 @@
bool LaunchVNCServerIfEnabled(const vsoc::CuttlefishConfig& config,
cvd::ProcessMonitor* process_monitor,
std::function<bool(cvd::MonitorEntry*)> callback);
-void LaunchStreamAudioIfEnabled(const vsoc::CuttlefishConfig& config,
- cvd::ProcessMonitor* process_monitor,
- std::function<bool(cvd::MonitorEntry*)> callback);
void LaunchAdbConnectorIfEnabled(cvd::ProcessMonitor* process_monitor,
const vsoc::CuttlefishConfig& config,
cvd::SharedFD adbd_events_pipe);
-void LaunchSocketForwardProxyIfEnabled(cvd::ProcessMonitor* process_monitor,
- const vsoc::CuttlefishConfig& config);
void LaunchSocketVsockProxyIfEnabled(cvd::ProcessMonitor* process_monitor,
const vsoc::CuttlefishConfig& config);
-void LaunchIvServerIfEnabled(cvd::ProcessMonitor* process_monitor,
- const vsoc::CuttlefishConfig& config);
void LaunchTombstoneReceiverIfEnabled(const vsoc::CuttlefishConfig& config,
cvd::ProcessMonitor* process_monitor);
diff --git a/host/commands/run_cvd/main.cc b/host/commands/run_cvd/main.cc
index dd5ed4d..a4ed8cc 100644
--- a/host/commands/run_cvd/main.cc
+++ b/host/commands/run_cvd/main.cc
@@ -46,12 +46,9 @@
#include "common/libs/utils/files.h"
#include "common/libs/utils/subprocess.h"
#include "common/libs/utils/size_utils.h"
-#include "common/vsoc/lib/vsoc_memory.h"
-#include "common/vsoc/shm/screen_layout.h"
#include "host/commands/run_cvd/launch.h"
#include "host/commands/run_cvd/runner_defs.h"
#include "host/commands/run_cvd/process_monitor.h"
-#include "host/commands/run_cvd/vsoc_shared_memory.h"
#include "host/libs/config/cuttlefish_config.h"
#include "host/commands/kernel_log_monitor/kernel_log_server.h"
#include <host/libs/vm_manager/crosvm_manager.h>
@@ -455,8 +452,6 @@
LaunchTombstoneReceiverIfEnabled(*config, &process_monitor);
LaunchUsbServerIfEnabled(*config, &process_monitor);
-
- LaunchIvServerIfEnabled(&process_monitor, *config);
// Launch the e2e tests after the ivserver is ready
LaunchE2eTestIfEnabled(&process_monitor, boot_state_machine, *config);
@@ -474,10 +469,7 @@
}
// Start other host processes
- LaunchSocketForwardProxyIfEnabled(&process_monitor, *config);
LaunchSocketVsockProxyIfEnabled(&process_monitor, *config);
- LaunchStreamAudioIfEnabled(*config, &process_monitor,
- GetOnSubprocessExitCallback(*config));
LaunchAdbConnectorIfEnabled(&process_monitor, *config, adbd_events_pipe);
ServerLoop(launcher_monitor_socket, &process_monitor); // Should not return
diff --git a/host/commands/run_cvd/screen_region_handler.cc b/host/commands/run_cvd/screen_region_handler.cc
deleted file mode 100644
index 9be969e..0000000
--- a/host/commands/run_cvd/screen_region_handler.cc
+++ /dev/null
@@ -1,35 +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 <glog/logging.h>
-
-#include "common/vsoc/lib/screen_region_view.h"
-#include "host/commands/run_cvd/pre_launch_initializers.h"
-#include "host/libs/config/cuttlefish_config.h"
-
-void InitializeScreenRegion(const vsoc::CuttlefishConfig& config) {
- auto region =
- vsoc::screen::ScreenRegionView::GetInstance(vsoc::GetDomain().c_str());
- if (!region) {
- LOG(FATAL) << "Screen region was not found";
- return;
- }
- auto dest = region->data();
- dest->x_res = config.x_res();
- dest->y_res = config.y_res();
- dest->dpi = config.dpi();
- dest->refresh_rate_hz = config.refresh_rate_hz();
-}
diff --git a/host/commands/run_cvd/vsoc_shared_memory.cc b/host/commands/run_cvd/vsoc_shared_memory.cc
deleted file mode 100644
index 0278cad..0000000
--- a/host/commands/run_cvd/vsoc_shared_memory.cc
+++ /dev/null
@@ -1,192 +0,0 @@
-/*
- * Copyright (C) 2018 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 "host/commands/run_cvd/vsoc_shared_memory.h"
-
-#include <unistd.h>
-
-#include <map>
-#include <vector>
-
-#include "common/libs/fs/shared_fd.h"
-#include "common/libs/utils/size_utils.h"
-#include "common/vsoc/lib/vsoc_memory.h"
-#include "glog/logging.h"
-
-#include "uapi/vsoc_shm.h"
-
-namespace vsoc {
-
-namespace {
-
-uint32_t OffsetOfRegionData(const VSoCRegionLayout& layout) {
- uint32_t offset = 0;
- // Signal tables
- offset +=
- (1 << layout.guest_to_host_signal_table_log_size()) * sizeof(uint32_t);
- offset +=
- (1 << layout.host_to_guest_signal_table_log_size()) * sizeof(uint32_t);
- // Interrup signals
- offset += 2 * sizeof(uint32_t);
- return offset;
-}
-
-struct VSoCRegionAllocator {
- const VSoCRegionLayout* region_layout;
- uint32_t begin_offset;
- uint32_t region_size;
-
- VSoCRegionAllocator(const VSoCRegionLayout& layout, uint32_t offset,
- uint32_t requested_layout_increase = 0)
- : region_layout(&layout),
- begin_offset(offset),
- region_size(cvd::AlignToPageSize(OffsetOfRegionData(layout) +
- layout.layout_size() +
- requested_layout_increase)) {}
-};
-
-// Writes a region's signal table layout to shared memory. Returns the region
-// offset of free memory after the table and interrupt signaled word.
-uint32_t WriteSignalTableDescription(vsoc_signal_table_layout* layout,
- uint32_t offset, int log_size) {
- layout->num_nodes_lg2 = log_size;
- // First the signal table
- layout->futex_uaddr_table_offset = offset;
- offset += (1 << log_size) * sizeof(uint32_t);
- // Then the interrupt signaled word
- layout->interrupt_signalled_offset = offset;
- offset += sizeof(uint32_t);
- return offset;
-}
-
-// Writes a region's layout description to shared memory
-void WriteRegionDescription(vsoc_device_region* shmem_region_desc,
- const VSoCRegionAllocator& allocator) {
- // Region versions are deprecated, write some sensible value
- shmem_region_desc->current_version = 0;
- shmem_region_desc->min_compatible_version = 0;
-
- shmem_region_desc->region_begin_offset = allocator.begin_offset;
- shmem_region_desc->region_end_offset =
- allocator.begin_offset + allocator.region_size;
- shmem_region_desc->offset_of_region_data =
- OffsetOfRegionData(*allocator.region_layout);
- strncpy(shmem_region_desc->device_name,
- allocator.region_layout->region_name(), VSOC_DEVICE_NAME_SZ - 1);
- shmem_region_desc->device_name[VSOC_DEVICE_NAME_SZ - 1] = '\0';
- // Guest to host signal table at the beginning of the region
- uint32_t offset = 0;
- offset = WriteSignalTableDescription(
- &shmem_region_desc->guest_to_host_signal_table, offset,
- allocator.region_layout->guest_to_host_signal_table_log_size());
- // Host to guest signal table right after
- offset = WriteSignalTableDescription(
- &shmem_region_desc->host_to_guest_signal_table, offset,
- allocator.region_layout->host_to_guest_signal_table_log_size());
- // Double check that the region metadata does not collide with the data
- if (offset > shmem_region_desc->offset_of_region_data) {
- LOG(FATAL) << "Error: Offset of region data too small (is "
- << shmem_region_desc->offset_of_region_data << " should be "
- << offset << " ) for region "
- << allocator.region_layout->region_name() << ". This is a bug";
- }
-}
-
-void WriteLayout(void* shared_memory,
- const std::vector<VSoCRegionAllocator>& allocators,
- uint32_t file_size) {
- // Device header
- static_assert(CURRENT_VSOC_LAYOUT_MAJOR_VERSION == 2,
- "Region layout code must be updated");
- auto header = reinterpret_cast<vsoc_shm_layout_descriptor*>(shared_memory);
- header->major_version = CURRENT_VSOC_LAYOUT_MAJOR_VERSION;
- header->minor_version = CURRENT_VSOC_LAYOUT_MINOR_VERSION;
- header->size = file_size;
- header->region_count = allocators.size();
-
- std::map<std::string, size_t> region_idx_by_name;
- for (size_t idx = 0; idx < allocators.size(); ++idx) {
- region_idx_by_name[allocators[idx].region_layout->region_name()] = idx;
- }
-
- // Region descriptions go right after the layout descriptor
- header->vsoc_region_desc_offset = sizeof(vsoc_shm_layout_descriptor);
- auto region_descriptions = reinterpret_cast<vsoc_device_region*>(header + 1);
- for (size_t idx = 0; idx < allocators.size(); ++idx) {
- auto shmem_region_desc = ®ion_descriptions[idx];
- const auto& region = *allocators[idx].region_layout;
- WriteRegionDescription(shmem_region_desc, allocators[idx]);
- // Handle managed_by links
- if (region.managed_by()) {
- auto manager_idx = region_idx_by_name.at(region.managed_by());
- if (manager_idx == VSOC_REGION_WHOLE) {
- LOG(FATAL) << "Region '" << region.region_name() << "' has owner "
- << region.managed_by() << " with index " << manager_idx
- << " which is the default value for regions without an "
- "owner. Choose a different region to be at index "
- << manager_idx
- << ", make sure the chosen region is NOT the owner of any "
- "other region";
- }
- shmem_region_desc->managed_by = manager_idx;
- } else {
- shmem_region_desc->managed_by = VSOC_REGION_WHOLE;
- }
- }
-}
-} // namespace
-
-void CreateSharedMemoryFile(
- const std::string& path,
- const std::map<std::string, uint32_t>& layout_increases) {
- // TODO(ender): Lock the file after creation and check lock status upon second
- // execution attempt instead of throwing an error.
- LOG_IF(WARNING, unlink(path.c_str()) == 0)
- << "Removed existing instance of " << path
- << ". We currently don't know if another instance of daemon is running";
- auto shared_mem_fd = cvd::SharedFD::Open(
- path.c_str(), O_RDWR | O_CREAT | O_EXCL, S_IRUSR | S_IWUSR);
- LOG_IF(FATAL, !shared_mem_fd->IsOpen())
- << "Error in creating shared_memory file: " << shared_mem_fd->StrError();
-
- auto region_layouts = VSoCMemoryLayout::Get()->GetRegions();
- std::vector<VSoCRegionAllocator> allocators;
- uint32_t file_size =
- cvd::AlignToPageSize(sizeof(vsoc_shm_layout_descriptor) +
- region_layouts.size() * sizeof(vsoc_device_region));
- for (auto layout : region_layouts) {
- allocators.emplace_back(*layout, file_size /* offset */,
- layout_increases.count(layout->region_name())
- ? layout_increases.at(layout->region_name())
- : 0);
- file_size += allocators.back().region_size;
- }
- file_size = cvd::RoundUpToNextPowerOf2(file_size);
-
- int truncate_res = shared_mem_fd->Truncate(file_size);
- LOG_IF(FATAL, truncate_res == -1)
- << "Error in sizing up the shared memory file: "
- << shared_mem_fd->StrError();
-
- void* mmap_addr =
- shared_mem_fd->Mmap(0, file_size, PROT_READ | PROT_WRITE, MAP_SHARED, 0);
- LOG_IF(FATAL, mmap_addr == MAP_FAILED)
- << "Error mmaping file: " << strerror(errno);
- WriteLayout(mmap_addr, allocators, file_size);
- munmap(mmap_addr, file_size);
-}
-
-} // namespace vsoc
diff --git a/host/commands/run_cvd/vsoc_shared_memory.h b/host/commands/run_cvd/vsoc_shared_memory.h
deleted file mode 100644
index 94c03a1..0000000
--- a/host/commands/run_cvd/vsoc_shared_memory.h
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (C) 2018 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.
- */
-#pragma once
-
-#include <map>
-#include <string>
-
-namespace vsoc {
-
-// Creates the shared memory file and initializes it with with the region
-// information. The size of each region is determined to be the smallest
-// multiple of page size that can accommodate the header and the layout. The
-// size of the layout can be increased by specifyng it on the
-// layout_increases_by_region_name parameter.
-void CreateSharedMemoryFile(
- const std::string& path,
- const std::map<std::string, uint32_t>& layout_increases_by_region_name = {});
-
-} // namespace vsoc
diff --git a/host/commands/virtual_usb_manager/Android.bp b/host/commands/virtual_usb_manager/Android.bp
index 9c86b70..40c8c74 100644
--- a/host/commands/virtual_usb_manager/Android.bp
+++ b/host/commands/virtual_usb_manager/Android.bp
@@ -34,7 +34,6 @@
"cuttlefish_glog",
],
shared_libs: [
- "vsoc_lib",
"libcuttlefish_fs",
"libcuttlefish_utils",
"cuttlefish_auto_resources",
diff --git a/host/frontend/Android.bp b/host/frontend/Android.bp
index 5a053e7..8d78a9f 100644
--- a/host/frontend/Android.bp
+++ b/host/frontend/Android.bp
@@ -14,7 +14,6 @@
// limitations under the License.
subdirs = [
- "stream_audio",
"vnc_server",
"adb_connector",
]
diff --git a/host/frontend/stream_audio/Android.bp b/host/frontend/stream_audio/Android.bp
deleted file mode 100644
index 8f07536..0000000
--- a/host/frontend/stream_audio/Android.bp
+++ /dev/null
@@ -1,38 +0,0 @@
-//
-// Copyright (C) 2018 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.
-
-cc_binary_host {
- name: "stream_audio",
- srcs: [
- "main.cpp",
- ],
- shared_libs: [
- "cuttlefish_tcp_socket",
- "libbase",
- "libcuttlefish_utils",
- "libcuttlefish_fs",
- "libopus",
- "vsoc_lib",
- ],
- static_libs: [
- "libcuttlefish_host_config",
- "libjsoncpp",
- "libgflags",
- "libopuscpp",
- ],
- cpp_std: "c++17",
- enabled: false,
- defaults: ["cuttlefish_host_only"],
-}
diff --git a/host/frontend/stream_audio/main.cpp b/host/frontend/stream_audio/main.cpp
deleted file mode 100644
index f63e315..0000000
--- a/host/frontend/stream_audio/main.cpp
+++ /dev/null
@@ -1,270 +0,0 @@
-/*
- *
- * Copyright (C) 2018 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.
- */
-
-// For each client that connects initially a header is sent with the following,
-// in this order, all as uint16_t in network-byte-order:
-// number of channels, frame rate
-//
-// Following, audio packets are sent as a uint32_t length (network byte order)
-// indicating the number of bytes
-// followed by the (opus) frame_size as a uint32_t
-// followed by <length> bytes.
-
-#include "common/libs/tcp_socket/tcp_socket.h"
-#include "common/vsoc/lib/audio_data_region_view.h"
-#include "common/vsoc/lib/circqueue_impl.h"
-#include "common/vsoc/lib/vsoc_audio_message.h"
-#include "host/frontend/stream_audio/opuscpp/opus_wrapper.h"
-#include "host/libs/config/cuttlefish_config.h"
-
-#include <android-base/logging.h>
-#include <gflags/gflags.h>
-
-#include <arpa/inet.h>
-
-#include <cstdint>
-#include <cstring>
-#include <iostream>
-#include <memory>
-#include <mutex>
-#include <thread>
-#include <tuple>
-#include <vector>
-
-using vsoc::audio_data::AudioDataRegionView;
-
-DEFINE_int32(port, 0, "port on which to serve audio.");
-
-namespace {
-
-// Read audio frames from the AudioDataRegionView
-class AudioStreamer {
- public:
- cvd::Message MakeAudioDescriptionHeader() const {
- std::unique_lock guard(buffer_lock_);
- while (!audio_buffer_) {
- buffer_cv_.wait(guard);
- }
-
- const size_t num_channels = header_.frame_size / sizeof(opus_int16);
- return cvd::CreateMessage(static_cast<std::uint16_t>(num_channels),
- static_cast<std::uint16_t>(header_.frame_rate));
- }
-
- std::uint32_t frame_rate() const {
- std::unique_lock guard(buffer_lock_);
- while (!audio_buffer_) {
- buffer_cv_.wait(guard);
- }
- return header_.frame_rate;
- }
-
- std::uint32_t num_channels() const {
- std::unique_lock guard(buffer_lock_);
- while (!audio_buffer_) {
- buffer_cv_.wait(guard);
- }
- return header_.frame_size / sizeof(opus_int16);
- }
-
- // Returns the frame id and audio frame
- std::tuple<std::int64_t, std::shared_ptr<const cvd::Message>> audio_buffer(
- std::int64_t previous_frame_num) const {
- std::unique_lock guard(buffer_lock_);
- while (header_.frame_num <= previous_frame_num) {
- buffer_cv_.wait(guard);
- }
-
- return {header_.frame_num, audio_buffer_};
- }
-
- void Update() {
- auto audio_data_rv =
- AudioDataRegionView::GetInstance(vsoc::GetDomain().c_str());
- auto worker = audio_data_rv->StartWorker();
- std::vector<char> new_buffer;
-
- while (true) {
- new_buffer.resize(new_buffer.capacity());
-
- auto [new_header, payload_size, audio_data] =
- NextAudioMessage(audio_data_rv, &new_buffer);
-
- LOG(DEBUG) << "stream " << new_header.stream_number << ", frame "
- << new_header.frame_num << ", rate " << new_header.frame_rate
- << ", channel_mask " << new_header.channel_mask << ", format "
- << new_header.format << ", payload_size " << payload_size
- << '\n';
-
- {
- std::lock_guard guard(buffer_lock_);
- CheckAudioConfigurationIsSame(new_header);
- header_ = new_header;
- audio_buffer_ = std::make_shared<const cvd::Message>(
- audio_data, audio_data + payload_size);
- }
- buffer_cv_.notify_all();
- }
- }
-
- private:
- struct AudioMessage {
- gce_audio_message header;
- std::size_t payload_size;
- const std::uint8_t* payload_data;
- };
-
- void ReadAudioMessage(AudioDataRegionView* audio_data_rv,
- std::vector<char>* buffer) const {
- while (true) {
- auto read_size = audio_data_rv->data()->audio_queue.Read(
- audio_data_rv, buffer->data(), buffer->size());
- if (read_size == -ENOSPC) {
- DoubleSize(buffer);
- } else if (read_size < 0) {
- LOG(ERROR) << "CircularPacketQueue::Read returned " << read_size;
- } else {
- buffer->resize(read_size);
- return;
- }
- }
- }
-
- void DoubleSize(std::vector<char>* buffer) const {
- if (buffer->empty()) {
- buffer->resize(1);
- } else {
- buffer->resize(buffer->size() * 2);
- }
- }
-
- gce_audio_message GetHeaderFromBuffer(const std::vector<char>& buffer) const {
- gce_audio_message new_header{};
- CHECK_GE(buffer.size(), sizeof new_header);
-
- std::memcpy(&new_header, buffer.data(), sizeof new_header);
- CHECK_GT(new_header.stream_number, 0u);
- return new_header;
- }
-
- std::tuple<std::size_t, const std::uint8_t*> GetPayloadFromBuffer(
- const std::vector<char>& buffer) const {
- const auto payload_size = buffer.size() - sizeof(gce_audio_message);
- const auto* audio_data =
- reinterpret_cast<const std::uint8_t*>(buffer.data()) +
- sizeof(gce_audio_message);
- return {payload_size, audio_data};
- }
-
- AudioMessage NextAudioMessage(AudioDataRegionView* audio_data_rv,
- std::vector<char>* buffer) const {
- while (true) {
- ReadAudioMessage(audio_data_rv, buffer);
- auto header = GetHeaderFromBuffer(*buffer);
- if (header.message_type == gce_audio_message::DATA_SAMPLES) {
- auto [payload_size, payload_data] = GetPayloadFromBuffer(*buffer);
- return {header, payload_size, payload_data};
- }
- }
- }
-
- void CheckAudioConfigurationIsSame(
- const gce_audio_message& new_header) const {
- if (audio_buffer_) {
- CHECK_EQ(header_.frame_size, new_header.frame_size)
- << "audio frame_size changed";
- CHECK_EQ(header_.frame_rate, new_header.frame_rate)
- << "audio frame_rate changed";
- CHECK_EQ(header_.stream_number, new_header.stream_number)
- << "audio stream_number changed";
- }
- }
-
- std::shared_ptr<const cvd::Message> audio_buffer_{};
- gce_audio_message header_{};
- mutable std::mutex buffer_lock_;
- mutable std::condition_variable buffer_cv_;
-};
-
-void HandleClient(AudioStreamer* audio_streamer,
- cvd::ClientSocket client_socket) {
- auto num_channels = audio_streamer->num_channels();
- opus::Encoder enc(audio_streamer->frame_rate(),
- audio_streamer->num_channels(), OPUS_APPLICATION_AUDIO);
- CHECK(enc.valid()) << "Could not construct Encoder. Maybe bad frame_rate ("
- << audio_streamer->frame_rate() <<") or num_channels ("
- << audio_streamer->num_channels() << ")?";
-
- auto header = audio_streamer->MakeAudioDescriptionHeader();
- client_socket.SendNoSignal(header);
- std::int64_t previous_frame_num = 0;
-
- while (!client_socket.closed()) {
- CHECK(enc.valid()) << "encoder in invalid state";
- auto [frame_num, audio_data] =
- audio_streamer->audio_buffer(previous_frame_num);
- previous_frame_num = frame_num;
-
- std::vector<opus_int16> pcm(audio_data->size() / sizeof(opus_int16));
- std::memcpy(pcm.data(), audio_data->data(), audio_data->size());
- // in opus terms "frame_size" is the number of unencoded samples per frame
- const std::uint32_t frame_size = pcm.size() / num_channels;
- auto encoded = enc.Encode(pcm, frame_size);
- for (auto&& p : encoded) {
- auto length_message =
- cvd::CreateMessage(static_cast<std::uint32_t>(p.size()));
- client_socket.SendNoSignal(length_message);
- client_socket.SendNoSignal(cvd::CreateMessage(frame_size));
- client_socket.SendNoSignal(p);
- }
- }
-}
-
-[[noreturn]] void AudioStreamerUpdateLoop(AudioStreamer* audio_streamer) {
- while (true) {
- audio_streamer->Update();
- }
-}
-
-[[noreturn]] void MainLoop() {
- AudioStreamer audio_streamer;
- std::thread audio_streamer_update_thread;
- auto server = cvd::ServerSocket(FLAGS_port);
- while (true) {
- LOG(INFO) << "waiting for client connection";
- auto client = server.Accept();
- LOG(INFO) << "client socket accepted";
- if (!audio_streamer_update_thread.joinable()) {
- audio_streamer_update_thread =
- std::thread{AudioStreamerUpdateLoop, &audio_streamer};
- }
- std::thread(HandleClient, &audio_streamer, std::move(client)).detach();
- }
-}
-
-} // namespace
-
-int main(int argc, char* argv[]) {
- ::android::base::InitLogging(argv, android::base::StderrLogger);
- gflags::SetUsageMessage(" ");
- google::ParseCommandLineFlags(&argc, &argv, true);
- if (FLAGS_port <= 0) {
- std::cerr << "--port must be specified.\n";
- return 1;
- }
- MainLoop();
-}
diff --git a/host/frontend/stream_audio/opuscpp/Android.bp b/host/frontend/stream_audio/opuscpp/Android.bp
deleted file mode 100644
index 9ad7a52..0000000
--- a/host/frontend/stream_audio/opuscpp/Android.bp
+++ /dev/null
@@ -1,28 +0,0 @@
-//
-// Copyright (C) 2019 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.
-
-cc_library_host_static {
- name: "libopuscpp",
- srcs: [
- "opus_wrapper.cc",
- ],
- shared_libs: [
- "libbase",
- "libopus",
- ],
- cpp_std: "c++17",
- enabled: false,
- defaults: ["cuttlefish_host_only"],
-}
diff --git a/host/frontend/stream_audio/opuscpp/opus_wrapper.cc b/host/frontend/stream_audio/opuscpp/opus_wrapper.cc
deleted file mode 100644
index 538bee8..0000000
--- a/host/frontend/stream_audio/opuscpp/opus_wrapper.cc
+++ /dev/null
@@ -1,177 +0,0 @@
-// Copyright 2018 Google LLC
-//
-// 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
-//
-// https://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.
-
-// https://github.com/google/opuscpp
-
-#include <iterator>
-#include <memory>
-#include <string>
-#include <vector>
-
-#include <android-base/logging.h>
-#include "host/frontend/stream_audio/opuscpp/opus_wrapper.h"
-
-std::string opus::ErrorToString(int error) {
- switch (error) {
- case OPUS_OK:
- return "OK";
- case OPUS_BAD_ARG:
- return "One or more invalid/out of range arguments.";
- case OPUS_BUFFER_TOO_SMALL:
- return "The mode struct passed is invalid.";
- case OPUS_INTERNAL_ERROR:
- return "An internal error was detected.";
- case OPUS_INVALID_PACKET:
- return "The compressed data passed is corrupted.";
- case OPUS_UNIMPLEMENTED:
- return "Invalid/unsupported request number.";
- case OPUS_INVALID_STATE:
- return "An encoder or decoder structure is invalid or already freed.";
- default:
- return "Unknown error code: " + std::to_string(error);
- }
-}
-
-void opus::internal::OpusDestroyer::operator()(OpusEncoder* encoder) const
- noexcept {
- opus_encoder_destroy(encoder);
-}
-
-void opus::internal::OpusDestroyer::operator()(OpusDecoder* decoder) const
- noexcept {
- opus_decoder_destroy(decoder);
-}
-
-opus::Encoder::Encoder(opus_int32 sample_rate, int num_channels,
- int application, int expected_loss_percent)
- : num_channels_{num_channels} {
- int error{};
- encoder_.reset(
- opus_encoder_create(sample_rate, num_channels, application, &error));
- valid_ = error == OPUS_OK;
- if (!valid()) {
- LOG(INFO) << "Could not construct encoder. Error: " << ErrorToString(error);
- return;
- }
- if (expected_loss_percent > 0) {
- LOG(INFO) << "Enabling FEC in the encoder.";
- Ctl(OPUS_SET_INBAND_FEC(1));
- Ctl(OPUS_SET_PACKET_LOSS_PERC(expected_loss_percent));
- }
-}
-
-bool opus::Encoder::ResetState() {
- valid_ = Ctl(OPUS_RESET_STATE) == OPUS_OK;
- return valid_;
-}
-
-bool opus::Encoder::SetBitrate(int bitrate) {
- valid_ = Ctl(OPUS_SET_BITRATE(bitrate)) == OPUS_OK;
- return valid_;
-}
-
-bool opus::Encoder::SetVariableBitrate(int vbr) {
- valid_ = Ctl(OPUS_SET_VBR(vbr)) == OPUS_OK;
- return valid_;
-}
-
-bool opus::Encoder::SetComplexity(int complexity) {
- valid_ = Ctl(OPUS_SET_COMPLEXITY(complexity)) == OPUS_OK;
- return valid_;
-}
-
-int opus::Encoder::GetLookahead() {
- opus_int32 skip{};
- valid_ = Ctl(OPUS_GET_LOOKAHEAD(&skip)) == OPUS_OK;
- return skip;
-}
-
-std::vector<std::vector<unsigned char>> opus::Encoder::Encode(
- const std::vector<opus_int16>& pcm, int frame_size) {
- constexpr auto sample_size = sizeof(pcm[0]);
- const auto frame_length = frame_size * num_channels_ * sample_size;
- auto data_length = pcm.size() * sample_size;
- if (data_length % frame_length != 0u) {
- LOG(WARNING) << "PCM samples contain an incomplete frame. Ignoring the "
- "incomplete frame.";
- data_length -= (data_length % frame_length);
- }
-
- std::vector<std::vector<unsigned char>> encoded;
- for (std::size_t i{}; i < data_length; i += frame_length) {
- encoded.push_back(EncodeFrame(pcm.begin() + (i / sample_size), frame_size));
- }
- return encoded;
-}
-
-std::vector<unsigned char> opus::Encoder::EncodeFrame(
- const std::vector<opus_int16>::const_iterator& frame_start,
- int frame_size) {
- const auto frame_length = (frame_size * num_channels_ * sizeof(*frame_start));
- std::vector<unsigned char> encoded(frame_length);
- auto num_bytes = opus_encode(encoder_.get(), &*frame_start, frame_size,
- encoded.data(), encoded.size());
- if (num_bytes < 0) {
- LOG(ERROR) << "Encode error: " << opus::ErrorToString(num_bytes);
- return {};
- }
- encoded.resize(num_bytes);
- return encoded;
-}
-
-opus::Decoder::Decoder(opus_uint32 sample_rate, int num_channels)
- : num_channels_(num_channels) {
- int error{};
- decoder_.reset(opus_decoder_create(sample_rate, num_channels, &error));
- valid_ = error == OPUS_OK;
-}
-
-std::vector<opus_int16> opus::Decoder::Decode(
- const std::vector<std::vector<unsigned char>>& packets, int frame_size,
- bool decode_fec) {
- std::vector<opus_int16> decoded;
- for (const auto& enc : packets) {
- auto just_decoded = Decode(enc, frame_size, decode_fec);
- decoded.insert(std::end(decoded), std::begin(just_decoded),
- std::end(just_decoded));
- }
- return decoded;
-}
-
-std::vector<opus_int16> opus::Decoder::Decode(
- const std::vector<unsigned char>& packet, int frame_size, bool decode_fec) {
- const auto frame_length = (frame_size * num_channels_ * sizeof(opus_int16));
- std::vector<opus_int16> decoded(frame_length);
- auto num_samples = opus_decode(decoder_.get(), packet.data(), packet.size(),
- decoded.data(), frame_size, decode_fec);
- if (num_samples < 0) {
- LOG(ERROR) << "Decode error: " << opus::ErrorToString(num_samples);
- return {};
- }
- decoded.resize(num_samples * num_channels_);
- return decoded;
-}
-
-std::vector<opus_int16> opus::Decoder::DecodeDummy(int frame_size) {
- const auto frame_length = (frame_size * num_channels_ * sizeof(opus_int16));
- std::vector<opus_int16> decoded(frame_length);
- auto num_samples =
- opus_decode(decoder_.get(), nullptr, 0, decoded.data(), frame_size, true);
- if (num_samples < 0) {
- LOG(ERROR) << "Decode error: " << opus::ErrorToString(num_samples);
- return {};
- }
- decoded.resize(num_samples * num_channels_);
- return decoded;
-}
diff --git a/host/frontend/stream_audio/opuscpp/opus_wrapper.h b/host/frontend/stream_audio/opuscpp/opus_wrapper.h
deleted file mode 100644
index 07e932e..0000000
--- a/host/frontend/stream_audio/opuscpp/opus_wrapper.h
+++ /dev/null
@@ -1,133 +0,0 @@
-// Copyright 2018 Google LLC
-//
-// 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
-//
-// https://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.
-
-// https://github.com/google/opuscpp
-
-#ifndef OPUSCPP_OPUS_WRAPPER_H_
-#define OPUSCPP_OPUS_WRAPPER_H_
-
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "opus.h"
-
-namespace opus {
-
-std::string ErrorToString(int error);
-
-namespace internal {
-// Deleter for OpusEncoders and OpusDecoders
-struct OpusDestroyer {
- void operator()(OpusEncoder* encoder) const noexcept;
- void operator()(OpusDecoder* decoder) const noexcept;
-};
-template <typename T>
-using opus_uptr = std::unique_ptr<T, OpusDestroyer>;
-} // namespace internal
-
-class Encoder {
- public:
- // see documentation at:
- // https://mf4.xiph.org/jenkins/view/opus/job/opus/ws/doc/html/group__opus__encoder.html#gaa89264fd93c9da70362a0c9b96b9ca88
- // Fs corresponds to sample_rate
- //
- // If expected_loss_percent is positive, FEC will be enabled
- Encoder(opus_int32 sample_rate, int num_channels, int application,
- int expected_loss_percent = 0);
-
- // Resets internal state of encoder. This should be called between encoding
- // different streams so that back-to-back decoding and one-at-a-time decoding
- // give the same result. Returns true on success.
- bool ResetState();
-
- // Sets the desired bitrate. Rates from 500 to 512000 are meaningful as well
- // as the special values OPUS_AUTO and OPUS_BITRATE_MAX. If this method
- // is not called, the default value of OPUS_AUTO is used.
- // Returns true on success.
- bool SetBitrate(int bitrate);
-
- // Enables or disables variable bitrate in the encoder. By default, variable
- // bitrate is enabled. Returns true on success.
- bool SetVariableBitrate(int vbr);
-
- // Sets the computational complexity of the encoder, in the range of 0 to 10,
- // inclusive, with 10 being the highest complexity. Returns true on success.
- bool SetComplexity(int complexity);
-
- // Gets the total samples of delay added by the entire codec. This value
- // is the minimum amount of 'preskip' that has to be specified in an
- // ogg-stream that encapsulates the encoded audio.
- int GetLookahead();
-
- // Takes audio data and encodes it. Returns a sequence of encoded packets.
- // pcm.size() must be divisible by frame_size * (number of channels);
- // pcm must not contain any incomplete packets.
- // see documentation for pcm and frame_size at:
- // https://mf4.xiph.org/jenkins/view/opus/job/opus/ws/doc/html/group__opus__encoder.html#gad2d6bf6a9ffb6674879d7605ed073e25
- std::vector<std::vector<unsigned char>> Encode(
- const std::vector<opus_int16>& pcm, int frame_size);
-
- int valid() const { return valid_; }
-
- private:
- std::vector<unsigned char> EncodeFrame(
- const std::vector<opus_int16>::const_iterator& frame_start,
- int frame_size);
-
- template <typename... Ts>
- int Ctl(int request, Ts... args) const {
- return opus_encoder_ctl(encoder_.get(), request, args...);
- }
-
- int num_channels_{};
- bool valid_{};
- internal::opus_uptr<OpusEncoder> encoder_;
-};
-
-class Decoder {
- public:
- // see documentation at:
- // https://mf4.xiph.org/jenkins/view/opus/job/opus/ws/doc/html/group__opus__decoder.html#ga753f6fe0b699c81cfd47d70c8e15a0bd
- // Fs corresponds to sample_rate
- Decoder(opus_uint32 sample_rate, int num_channels);
-
- // Takes a sequence of encoded packets and decodes them. Returns the decoded
- // audio.
- // see documentation at:
- // https://mf4.xiph.org/jenkins/view/opus/job/opus/ws/doc/html/group__opus__decoder.html#ga7d1111f64c36027ddcb81799df9b3fc9
- std::vector<opus_int16> Decode(
- const std::vector<std::vector<unsigned char>>& packets, int frame_size,
- bool decode_fec);
-
- int valid() const { return valid_; }
-
- // Takes an encoded packet and decodes it. Returns the decoded audio
- // see documentation at:
- // https://mf4.xiph.org/jenkins/view/opus/job/opus/ws/doc/html/group__opus__decoder.html#ga7d1111f64c36027ddcb81799df9b3fc9
- std::vector<opus_int16> Decode(const std::vector<unsigned char>& packet,
- int frame_size, bool decode_fec);
-
- // Generates a dummy frame by passing nullptr to the underlying opus decode.
- std::vector<opus_int16> DecodeDummy(int frame_size);
-
- private:
- int num_channels_{};
- bool valid_{};
- internal::opus_uptr<OpusDecoder> decoder_;
-};
-
-} // namespace opus
-
-#endif
diff --git a/host/frontend/vnc_server/Android.bp b/host/frontend/vnc_server/Android.bp
index fae5a17..210f21d 100644
--- a/host/frontend/vnc_server/Android.bp
+++ b/host/frontend/vnc_server/Android.bp
@@ -30,7 +30,6 @@
"cuttlefish_glog",
],
shared_libs: [
- "vsoc_lib",
"libcuttlefish_fs",
"libcuttlefish_utils",
"cuttlefish_tcp_socket",
diff --git a/host/frontend/vnc_server/screen_connector.cpp b/host/frontend/vnc_server/screen_connector.cpp
index 53cb389..35cf22f 100644
--- a/host/frontend/vnc_server/screen_connector.cpp
+++ b/host/frontend/vnc_server/screen_connector.cpp
@@ -18,11 +18,11 @@
#include <atomic>
#include <condition_variable>
+#include <thread>
+#include <glog/logging.h>
#include <gflags/gflags.h>
-#include <common/vsoc/lib/screen_region_view.h>
-#include <host/libs/config/cuttlefish_config.h>
#include "host/frontend/vnc_server/vnc_utils.h"
DEFINE_int32(frame_server_fd, -1, "");
@@ -31,23 +31,6 @@
namespace vnc {
namespace {
-class VSoCScreenConnector : public ScreenConnector {
- public:
- int WaitForNewFrameSince(std::uint32_t* seq_num) override {
- if (!screen_view_) return -1;
- return screen_view_->WaitForNewFrameSince(seq_num);
- }
-
- void* GetBuffer(int buffer_idx) override {
- if (!screen_view_) return nullptr;
- return screen_view_->GetBuffer(buffer_idx);
- }
-
- private:
- vsoc::screen::ScreenRegionView* screen_view_ =
- vsoc::screen::ScreenRegionView::GetInstance(vsoc::GetDomain().c_str());
-};
-
// TODO(b/128852363): Substitute with one based on memory shared with the
// wayland mock
class SocketBasedScreenConnector : public ScreenConnector {
@@ -140,12 +123,7 @@
} // namespace
ScreenConnector* ScreenConnector::Get() {
- auto config = vsoc::CuttlefishConfig::Get();
- if (config->enable_ivserver()) {
- return new VSoCScreenConnector();
- } else {
- return new SocketBasedScreenConnector();
- }
+ return new SocketBasedScreenConnector();
}
} // namespace vnc
diff --git a/host/frontend/vnc_server/simulated_hw_composer.cpp b/host/frontend/vnc_server/simulated_hw_composer.cpp
index 7a94454..96702e8 100644
--- a/host/frontend/vnc_server/simulated_hw_composer.cpp
+++ b/host/frontend/vnc_server/simulated_hw_composer.cpp
@@ -20,7 +20,6 @@
#include "host/libs/config/cuttlefish_config.h"
using cvd::vnc::SimulatedHWComposer;
-using vsoc::screen::ScreenRegionView;
SimulatedHWComposer::SimulatedHWComposer(BlackBoard* bb)
:
diff --git a/host/frontend/vnc_server/virtual_inputs.cpp b/host/frontend/vnc_server/virtual_inputs.cpp
index 31c0328..fb91409 100644
--- a/host/frontend/vnc_server/virtual_inputs.cpp
+++ b/host/frontend/vnc_server/virtual_inputs.cpp
@@ -16,18 +16,19 @@
#include "host/frontend/vnc_server/virtual_inputs.h"
#include <gflags/gflags.h>
+#include <glog/logging.h>
#include <linux/input.h>
#include <linux/uinput.h>
#include <cstdint>
#include <mutex>
+#include <thread>
#include "keysyms.h"
#include <common/libs/fs/shared_select.h>
#include <host/libs/config/cuttlefish_config.h>
using cvd::vnc::VirtualInputs;
-using vsoc::input_events::InputEventsRegionView;
DEFINE_int32(touch_fd, -1,
"A fd for a socket where to accept touch connections");
@@ -245,37 +246,6 @@
} // namespace
-class VSoCVirtualInputs : public VirtualInputs {
- public:
- VSoCVirtualInputs()
- : input_events_region_view_{
- vsoc::input_events::InputEventsRegionView::GetInstance(
- vsoc::GetDomain().c_str())} {
- if (!input_events_region_view_) {
- LOG(FATAL) << "Failed to open Input events region view";
- }
- }
-
- void GenerateKeyPressEvent(int code, bool down) override {
- if (keymapping_.count(code)) {
- input_events_region_view_->HandleKeyboardEvent(down, keymapping_[code]);
- } else {
- LOG(ERROR) << "Unknown keycode" << code;
- }
- }
-
- void PressPowerButton(bool down) override {
- input_events_region_view_->HandlePowerButtonEvent(down);
- }
-
- void HandlePointerEvent(bool touch_down, int x, int y) override {
- input_events_region_view_->HandleSingleTouchEvent(touch_down, x, y);
- }
-
- private:
- vsoc::input_events::InputEventsRegionView* input_events_region_view_{};
-};
-
class SocketVirtualInputs : public VirtualInputs {
public:
SocketVirtualInputs()
diff --git a/host/frontend/vnc_server/virtual_inputs.h b/host/frontend/vnc_server/virtual_inputs.h
index f92693b..7aca3eb 100644
--- a/host/frontend/vnc_server/virtual_inputs.h
+++ b/host/frontend/vnc_server/virtual_inputs.h
@@ -21,8 +21,6 @@
#include <map>
#include <mutex>
-#include "common/vsoc/lib/input_events_region_view.h"
-
namespace cvd {
namespace vnc {
diff --git a/host/frontend/vnc_server/vnc_client_connection.cpp b/host/frontend/vnc_server/vnc_client_connection.cpp
index a8faf47..b81bb88 100644
--- a/host/frontend/vnc_server/vnc_client_connection.cpp
+++ b/host/frontend/vnc_server/vnc_client_connection.cpp
@@ -42,7 +42,17 @@
using cvd::vnc::Stripe;
using cvd::vnc::StripePtrVec;
using cvd::vnc::VncClientConnection;
-using vsoc::screen::ScreenRegionView;
+
+struct ScreenRegionView {
+ using Pixel = uint32_t;
+ static constexpr int kSwiftShaderPadding = 4;
+ static constexpr int kRedShift = 0;
+ static constexpr int kGreenShift = 8;
+ static constexpr int kBlueShift = 16;
+ static constexpr int kRedBits = 8;
+ static constexpr int kGreenBits = 8;
+ static constexpr int kBlueBits = 8;
+};
DEFINE_bool(debug_client, false, "Turn on detailed logging for the client");
diff --git a/host/frontend/vnc_server/vnc_utils.h b/host/frontend/vnc_server/vnc_utils.h
index 0953c4e..db88131 100644
--- a/host/frontend/vnc_server/vnc_utils.h
+++ b/host/frontend/vnc_server/vnc_utils.h
@@ -23,7 +23,6 @@
#include "common/libs/utils/size_utils.h"
#include "common/libs/tcp_socket/tcp_socket.h"
-#include "common/vsoc/lib/screen_region_view.h"
#include "host/libs/config/cuttlefish_config.h"
namespace cvd {
@@ -65,7 +64,7 @@
};
inline constexpr int BytesPerPixel() {
- return sizeof(vsoc::screen::ScreenRegionView::Pixel);
+ return sizeof(uint32_t);
}
// The width of the screen regardless of orientation. Does not change.
diff --git a/host/libs/config/cuttlefish_config.cpp b/host/libs/config/cuttlefish_config.cpp
index 17dcb6e..6f66fb3 100644
--- a/host/libs/config/cuttlefish_config.cpp
+++ b/host/libs/config/cuttlefish_config.cpp
@@ -134,10 +134,6 @@
const char* kVncServerBinary = "vnc_server_binary";
const char* kVncServerPort = "vnc_server_port";
-const char* kEnableStreamAudio = "enable_stream_audio";
-const char* kStreamAudioBinary = "stream_audio_binary";
-const char* kStreamAudioPort = "stream_audio_port";
-
const char* kRestartSubprocesses = "restart_subprocesses";
const char* kRunAdbConnector = "run_adb_connector";
const char* kAdbConnectorBinary = "adb_connector_binary";
@@ -563,9 +559,7 @@
static AdbMode stringToAdbMode(std::string mode) {
std::transform(mode.begin(), mode.end(), mode.begin(), ::tolower);
- if (mode == "tunnel") {
- return AdbMode::Tunnel;
- } else if (mode == "vsock_tunnel") {
+ if (mode == "vsock_tunnel") {
return AdbMode::VsockTunnel;
} else if (mode == "vsock_half_tunnel") {
return AdbMode::VsockHalfTunnel;
@@ -612,11 +606,10 @@
std::string CuttlefishConfig::adb_device_name() const {
// TODO(schuffelen): Deal with duplication between here and launch.cc
- bool tunnelMode = adb_mode().count(AdbMode::Tunnel) > 0;
bool vsockTunnel = adb_mode().count(AdbMode::VsockTunnel) > 0;
bool vsockHalfProxy = adb_mode().count(AdbMode::VsockHalfTunnel) > 0;
bool nativeVsock = adb_mode().count(AdbMode::NativeVsock) > 0;
- if (tunnelMode || vsockTunnel || vsockHalfProxy || nativeVsock) {
+ if (vsockTunnel || vsockHalfProxy || nativeVsock) {
return adb_ip_and_port();
} else if (adb_mode().count(AdbMode::Usb) > 0) {
return serial_number();
@@ -708,31 +701,6 @@
(*dictionary_)[kVncServerPort] = vnc_server_port;
}
-bool CuttlefishConfig::enable_stream_audio() const {
- return (*dictionary_)[kEnableStreamAudio].asBool();
-}
-
-void CuttlefishConfig::set_enable_stream_audio(bool enable_stream_audio) {
- (*dictionary_)[kEnableStreamAudio] = enable_stream_audio;
-}
-
-std::string CuttlefishConfig::stream_audio_binary() const {
- return (*dictionary_)[kStreamAudioBinary].asString();
-}
-
-void CuttlefishConfig::set_stream_audio_binary(
- const std::string& stream_audio_binary) {
- (*dictionary_)[kStreamAudioBinary] = stream_audio_binary;
-}
-
-int CuttlefishConfig::stream_audio_port() const {
- return (*dictionary_)[kStreamAudioPort].asInt();
-}
-
-void CuttlefishConfig::set_stream_audio_port(int stream_audio_port) {
- (*dictionary_)[kStreamAudioPort] = stream_audio_port;
-}
-
bool CuttlefishConfig::restart_subprocesses() const {
return (*dictionary_)[kRestartSubprocesses].asBool();
}
diff --git a/host/libs/config/cuttlefish_config.h b/host/libs/config/cuttlefish_config.h
index fc479ec..4ec49e7 100644
--- a/host/libs/config/cuttlefish_config.h
+++ b/host/libs/config/cuttlefish_config.h
@@ -39,7 +39,6 @@
enum class AdbMode {
- Tunnel,
VsockTunnel,
VsockHalfTunnel,
NativeVsock,
@@ -276,15 +275,6 @@
void set_vnc_server_binary(const std::string& vnc_server_binary);
std::string vnc_server_binary() const;
- void set_enable_stream_audio(bool enable_stream_audio);
- bool enable_stream_audio() const;
-
- void set_stream_audio_port(int stream_audio_port);
- int stream_audio_port() const;
-
- void set_stream_audio_binary(const std::string& stream_audio_binary);
- std::string stream_audio_binary() const;
-
void set_restart_subprocesses(bool restart_subprocesses);
bool restart_subprocesses() const;
diff --git a/host/vsoc/lib/gralloc_buffer_region_view.cpp b/host/vsoc/lib/gralloc_buffer_region_view.cpp
deleted file mode 100644
index db302cb..0000000
--- a/host/vsoc/lib/gralloc_buffer_region_view.cpp
+++ /dev/null
@@ -1,34 +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 "host/vsoc/lib/gralloc_buffer_region_view.h"
-
-#include <memory>
-#include <mutex>
-#include "glog/logging.h"
-
-using vsoc::gralloc::GrallocBufferRegionView;
-
-uint8_t* GrallocBufferRegionView::OffsetToBufferPtr(uint32_t offset) {
- if (offset <= control_->region_desc().offset_of_region_data ||
- offset >= control_->region_size()) {
- LOG(FATAL)
- << "Attempted to access a gralloc buffer outside region data, offset: "
- << offset;
- return nullptr;
- }
- return region_offset_to_pointer<uint8_t>(offset);
-}
diff --git a/host/vsoc/lib/gralloc_buffer_region_view.h b/host/vsoc/lib/gralloc_buffer_region_view.h
deleted file mode 100644
index b132a0e..0000000
--- a/host/vsoc/lib/gralloc_buffer_region_view.h
+++ /dev/null
@@ -1,47 +0,0 @@
-#pragma once
-/*
- * 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/typed_region_view.h"
-#include "common/vsoc/shm/gralloc_layout.h"
-
-#include <string>
-
-namespace vsoc {
-namespace gralloc {
-
-// Allows access to the gralloc buffer region from host side. It needs to be a
-// different class than the one on guest side because of the required
-// interactions with the kernel on the guest.
-// Initially this class only returns a pointer to a buffer in memory given a
-// region offset, which is enough for now since it's only used by the hwcomposer
-// (which gets all other information from the guest side hwcomposer) and by the
-// VNC server (which uses only the frame buffer and gets the information it
-// needs from the framebuffer region).
-class GrallocBufferRegionView
- : vsoc::TypedRegionView<
- GrallocBufferRegionView,
- vsoc::layout::gralloc::GrallocBufferLayout> {
- public:
- GrallocBufferRegionView() = default;
- GrallocBufferRegionView(const GrallocBufferRegionView&) = delete;
- GrallocBufferRegionView& operator=(const GrallocBufferRegionView&) = delete;
-
- uint8_t* OffsetToBufferPtr(uint32_t offset);
-};
-
-} // namespace gralloc
-} // namespace vsoc
diff --git a/host/vsoc/lib/host_lock.cpp b/host/vsoc/lib/host_lock.cpp
deleted file mode 100644
index 895a429..0000000
--- a/host/vsoc/lib/host_lock.cpp
+++ /dev/null
@@ -1,51 +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/shm/lock.h"
-
-#include "sys/types.h"
-
-#include "common/vsoc/lib/compat.h"
-#include "common/vsoc/lib/single_sided_signal.h"
-
-namespace vsoc {
-namespace layout {
-
-void HostLock::Lock() {
- uint32_t tid = gettid();
- uint32_t expected_value;
- uint32_t* uaddr = reinterpret_cast<uint32_t*>(&lock_uint32_);
-
- while (1) {
- if (TryLock(tid, &expected_value)) {
- return;
- }
- SingleSidedSignal::AwaitSignal(expected_value, uaddr);
- }
-}
-
-void HostLock::Unlock() {
- Sides sides_to_signal = UnlockCommon(gettid());
- if (sides_to_signal != Sides::NoSides) {
- SingleSidedSignal::Signal(&lock_uint32_);
- }
-}
-
-bool HostLock::Recover() {
- return RecoverSingleSided();
-}
-
-} // namespace layout
-} // namespace vsoc
diff --git a/host/vsoc/lib/host_region_e2e_test.cpp b/host/vsoc/lib/host_region_e2e_test.cpp
deleted file mode 100644
index 1366838..0000000
--- a/host/vsoc/lib/host_region_e2e_test.cpp
+++ /dev/null
@@ -1,130 +0,0 @@
-/*
- * Copyright (C) 2016 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.
- */
-
-/*
- * End-to-end test to ensure that mapping of vsoc regions works on the host.
- */
-
-#include <gtest/gtest.h>
-#include "common/vsoc/lib/e2e_test_region_view.h"
-#include "host/libs/config/cuttlefish_config.h"
-
-// Here is a summary of the two regions interrupt and write test:
-// 1. Write our strings to the first region
-// 2. Ensure that our peer hasn't signalled the second region. That would
-// indicate that it didn't wait for our interrupt.
-// 3. Send the interrupt on the first region
-// 4. Wait for our peer's interrupt on the first region
-// 5. Confirm that we can see our peer's writes in the first region
-// 6. Initialize our strings in the second region
-// 7. Send an interrupt on the second region to our peer
-// 8. Wait for our peer's interrupt on the second region
-// 9. Confirm that we can see our peer's writes in the second region
-// 10. Repeat the process for signaling.
-// 11. Confirm that no interrupt is pending in the first region
-// 12. Confirm that no interrupt is pending in the second region
-
-template <typename View>
-void SetHostStrings(View* in) {
- size_t num_data = in->string_size();
- EXPECT_LE(static_cast<size_t>(2), num_data);
- for (size_t i = 0; i < num_data; ++i) {
- EXPECT_TRUE(!in->host_string(i)[0] ||
- !strcmp(in->host_string(i), View::Layout::host_pattern));
- in->set_host_string(i, View::Layout::host_pattern);
- EXPECT_STREQ(in->host_string(i), View::Layout::host_pattern);
- }
-}
-
-template <typename View>
-void CheckPeerStrings(View* in) {
- size_t num_data = in->string_size();
- EXPECT_LE(static_cast<size_t>(2), num_data);
- for (size_t i = 0; i < num_data; ++i) {
- EXPECT_STREQ(View::Layout::guest_pattern, in->guest_string(i));
- }
-}
-
-TEST(RegionTest, PeerTests) {
- auto primary =
- vsoc::E2EPrimaryRegionView::GetInstance(vsoc::GetDomain().c_str());
- ASSERT_TRUE(!!primary);
- auto secondary =
- vsoc::E2ESecondaryRegionView::GetInstance(vsoc::GetDomain().c_str());
- ASSERT_TRUE(!!secondary);
- LOG(INFO) << "Regions are open";
- SetHostStrings(primary);
- EXPECT_FALSE(secondary->HasIncomingInterrupt());
- EXPECT_TRUE(primary->MaybeInterruptPeer());
- LOG(INFO) << "Waiting for first interrupt from peer";
- primary->WaitForInterrupt();
- LOG(INFO) << "First interrupt received";
- CheckPeerStrings(primary);
- SetHostStrings(secondary);
- EXPECT_TRUE(secondary->MaybeInterruptPeer());
- LOG(INFO) << "Waiting for second interrupt from peer";
- secondary->WaitForInterrupt();
- LOG(INFO) << "Second interrupt received";
- CheckPeerStrings(secondary);
-
- // Test signals
- EXPECT_FALSE(secondary->HasIncomingInterrupt());
- LOG(INFO) << "Verified no early second signal";
- primary->SendSignal(vsoc::layout::Sides::Peer,
- &primary->data()->host_to_guest_signal);
- LOG(INFO) << "Signal sent. Waiting for first signal from peer";
- primary->WaitForInterrupt();
- int count = 0; // counts the number of signals received.
- primary->ProcessSignalsFromPeer(
- [&primary, &count](uint32_t offset) {
- ++count;
- EXPECT_EQ(primary->guest_to_host_signal_offset(), offset);
- });
- EXPECT_EQ(1, count);
- LOG(INFO) << "Signal received on primary region";
- secondary->SendSignal(vsoc::layout::Sides::Peer,
- &secondary->data()->host_to_guest_signal);
- LOG(INFO) << "Signal sent. Waiting for second signal from peer";
- secondary->WaitForInterrupt();
- count = 0;
- secondary->ProcessSignalsFromPeer(
- [secondary, &count](uint32_t offset) {
- ++count;
- EXPECT_EQ(secondary->guest_to_host_signal_offset(), offset);
- });
- EXPECT_EQ(1, count);
- LOG(INFO) << "Signal received on secondary region";
-
- EXPECT_FALSE(primary->HasIncomingInterrupt());
- EXPECT_FALSE(secondary->HasIncomingInterrupt());
-}
-
-TEST(RegionTest, MissingRegionCausesDeath) {
- EXPECT_DEATH(
- vsoc::E2EUnfindableRegionView::GetInstance(vsoc::GetDomain().c_str()),
- ".*");
-}
-
-int main(int argc, char** argv) {
- testing::InitGoogleTest(&argc, argv);
- int rval = RUN_ALL_TESTS();
- if (!rval) {
- auto region =
- vsoc::E2EPrimaryRegionView::GetInstance(vsoc::GetDomain().c_str());
- region->host_status(vsoc::layout::e2e_test::E2E_MEMORY_FILLED);
- }
- return rval;
-}
diff --git a/host/vsoc/lib/region_control.cpp b/host/vsoc/lib/region_control.cpp
deleted file mode 100644
index 491f600..0000000
--- a/host/vsoc/lib/region_control.cpp
+++ /dev/null
@@ -1,260 +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"
-
-#define LOG_TAG "vsoc: region_host"
-
-#include <stdio.h>
-#include <string.h>
-#include <linux/futex.h>
-#include <sys/mman.h>
-#include <sys/socket.h>
-#include <sys/syscall.h>
-#include <sys/types.h>
-#include <unistd.h>
-
-#include <iomanip>
-#include <sstream>
-#include <thread>
-#include <vector>
-
-#include <glog/logging.h>
-
-#include "common/libs/fs/shared_fd.h"
-#include "common/libs/fs/shared_select.h"
-
-using cvd::SharedFD;
-
-namespace {
-
-class HostRegionControl : public vsoc::RegionControl {
- public:
- HostRegionControl(const char* region_name,
- const SharedFD& incoming_interrupt_fd,
- const SharedFD& outgoing_interrupt_fd,
- const SharedFD& shared_memory_fd)
- : region_name_{region_name},
- incoming_interrupt_fd_{incoming_interrupt_fd},
- outgoing_interrupt_fd_{outgoing_interrupt_fd},
- shared_memory_fd_{shared_memory_fd} {}
-
- int CreateFdScopedPermission(const char* /*managed_region_name*/,
- uint32_t /*owner_offset*/,
- uint32_t /*owned_val*/,
- uint32_t /*begin_offset*/,
- uint32_t /*end_offset*/) override {
- return -1;
- }
-
- bool InitializeRegion();
-
- virtual bool InterruptPeer() override {
- uint64_t one = 1;
- ssize_t rval = outgoing_interrupt_fd_->Write(&one, sizeof(one));
- if (rval != sizeof(one)) {
- LOG(FATAL) << __FUNCTION__ << ": rval (" << rval << ") != sizeof(one))";
- return false;
- }
- return true;
- }
-
- // Wake the local signal table scanner. Primarily used during shutdown
- virtual void InterruptSelf() override {
- uint64_t one = 1;
- ssize_t rval = incoming_interrupt_fd_->Write(&one, sizeof(one));
- if (rval != sizeof(one)) {
- LOG(FATAL) << __FUNCTION__ << ": rval (" << rval << ") != sizeof(one))";
- }
- }
-
- virtual void WaitForInterrupt() override {
- // Check then act isn't a problem here: the other side does
- // the following things in exactly this order:
- // 1. exchanges 1 with interrupt_signalled
- // 2. if interrupt_signalled was 0 it increments the eventfd
- // eventfd increments are persistent, so if interrupt_signalled was set
- // back to 1 while we are going to sleep the sleep will return
- // immediately.
- uint64_t missed{};
- cvd::SharedFDSet readset;
- readset.Set(incoming_interrupt_fd_);
- cvd::Select(&readset, NULL, NULL, NULL);
- ssize_t rval = incoming_interrupt_fd_->Read(&missed, sizeof(missed));
- if (rval != sizeof(missed)) {
- LOG(FATAL) << __FUNCTION__ << ": rval (" << rval
- << ") != sizeof(missed)), are there more than one threads "
- "waiting for interrupts?";
- }
- if (!missed) {
- LOG(FATAL) << __FUNCTION__ << ": woke with 0 interrupts";
- }
- }
-
- virtual void* Map() override {
- if (region_base_) {
- return region_base_;
- }
- // Now actually map the region
- region_base_ =
- shared_memory_fd_->Mmap(0, region_size(), PROT_READ | PROT_WRITE,
- MAP_SHARED, region_desc_.region_begin_offset);
- if (region_base_ == MAP_FAILED) {
- LOG(FATAL) << "mmap failed for offset "
- << region_desc_.region_begin_offset << " ("
- << shared_memory_fd_->StrError() << ")";
- region_base_ = nullptr;
- }
- return region_base_;
- }
-
-
- virtual int SignalSelf(uint32_t offset) override {
- return syscall(SYS_futex, region_offset_to_pointer<int32_t*>(offset),
- FUTEX_WAKE, -1, nullptr, nullptr, 0);
- }
-
- virtual int WaitForSignal(uint32_t offset, uint32_t expected_value) override {
- return syscall(SYS_futex, region_offset_to_pointer<int32_t*>(offset),
- FUTEX_WAIT, expected_value, nullptr, nullptr, 0);
- }
-
- protected:
- const char* region_name_{};
- cvd::SharedFD incoming_interrupt_fd_;
- cvd::SharedFD outgoing_interrupt_fd_;
- cvd::SharedFD shared_memory_fd_;
-};
-
-// Default path to the ivshmem_server socket. This can vary when we're
-// launching multiple CVDs.
-constexpr int kMaxSupportedProtocolVersion = 0;
-
-bool HostRegionControl::InitializeRegion() {
- size_t region_name_len = strlen(region_name_);
- if (region_name_len >= VSOC_DEVICE_NAME_SZ) {
- LOG(FATAL) << "Region name length (" << region_name_len << ") not < "
- << VSOC_DEVICE_NAME_SZ;
- return false;
- }
- vsoc_shm_layout_descriptor layout;
- ssize_t rval = shared_memory_fd_->Pread(&layout, sizeof(layout), 0);
- if (rval != sizeof(layout)) {
- LOG(FATAL) << "Unable to read layout, rval=" << rval << " ("
- << shared_memory_fd_->StrError() << ")";
- return false;
- }
- if (layout.major_version != CURRENT_VSOC_LAYOUT_MAJOR_VERSION) {
- LOG(FATAL) << "Incompatible major version: saw " << layout.major_version
- << " wanted " << CURRENT_VSOC_LAYOUT_MAJOR_VERSION;
- }
- std::vector<vsoc_device_region> descriptors;
- descriptors.resize(layout.region_count);
- ssize_t wanted = sizeof(vsoc_device_region) * layout.region_count;
- rval = shared_memory_fd_->Pread(descriptors.data(), wanted,
- layout.vsoc_region_desc_offset);
- if (rval != wanted) {
- LOG(FATAL) << "Unable to read region descriptors, rval=" << rval << " ("
- << shared_memory_fd_->StrError() << ")";
- return false;
- }
- for (const auto& desc : descriptors) {
- if (!strcmp(region_name_, desc.device_name)) {
- region_desc_ = desc;
- return true;
- }
- }
-
- std::ostringstream buf;
- for (const auto& desc : descriptors) {
- buf << " " << desc.device_name;
- }
- LOG(FATAL) << "Region name of " << region_name_
- << " not found among:" << buf.str();
- return false;
-}
-} // namespace
-
-std::shared_ptr<vsoc::RegionControl> vsoc::RegionControl::Open(
- const char* region_name, const char* domain) {
- AutoFreeBuffer msg;
-
- SharedFD region_server =
- SharedFD::SocketLocalClient(domain, false, SOCK_STREAM);
- if (!region_server->IsOpen()) {
- LOG(FATAL) << "Could not contact ivshmem_server ("
- << region_server->StrError() << ")";
- return nullptr;
- }
-
- // Check server protocol version.
- uint32_t protocol_version;
- ssize_t bytes = region_server->Recv(&protocol_version,
- sizeof(protocol_version), MSG_NOSIGNAL);
- if (bytes != sizeof(protocol_version)) {
- LOG(FATAL) << "Failed to recv protocol version; res=" << bytes << " ("
- << region_server->StrError() << ")";
- return nullptr;
- }
-
- if (protocol_version > kMaxSupportedProtocolVersion) {
- LOG(FATAL) << "Unsupported protocol version " << protocol_version
- << "; max supported version is " << kMaxSupportedProtocolVersion;
- return nullptr;
- }
-
- // Send requested region.
- int16_t size = strlen(region_name);
- bytes = region_server->Send(&size, sizeof(size), MSG_NOSIGNAL);
- if (bytes != sizeof(size)) {
- LOG(FATAL) << "Failed to send region name length; res=" << bytes << " ("
- << region_server->StrError() << ")";
- return nullptr;
- }
-
- bytes = region_server->Send(region_name, size, MSG_NOSIGNAL);
- if (bytes != size) {
- LOG(FATAL) << "Failed to send region name; res=" << bytes << " ("
- << region_server->StrError() << ")";
- return nullptr;
- }
-
- // Receive control sockets.
- uint64_t control_data;
- struct iovec iov {
- &control_data, sizeof(control_data)
- };
- cvd::InbandMessageHeader hdr{};
- hdr.msg_iov = &iov;
- hdr.msg_iovlen = 1;
- SharedFD fds[3];
- bytes = region_server->RecvMsgAndFDs(hdr, 0, &fds);
- if (bytes != sizeof(control_data)) {
- LOG(FATAL) << "Failed to complete handshake; res=" << bytes << " ("
- << region_server->StrError() << ")";
- return nullptr;
- }
- HostRegionControl* rval =
- new HostRegionControl(region_name, fds[0], fds[1], fds[2]);
- if (!rval) {
- return nullptr;
- }
- // Search for the region header
- if (!rval->InitializeRegion()) {
- // We already logged, so we can just bail out.
- return nullptr;
- }
- return std::shared_ptr<RegionControl>(rval);
-}
diff --git a/host/vsoc/lib/region_view.cpp b/host/vsoc/lib/region_view.cpp
deleted file mode 100644
index 975b7cd..0000000
--- a/host/vsoc/lib/region_view.cpp
+++ /dev/null
@@ -1,26 +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 "common/vsoc/lib/region_control.h"
-
-const vsoc_signal_table_layout& vsoc::RegionView::incoming_signal_table() {
- return control_->region_desc().guest_to_host_signal_table;
-}
-
-// Returns a pointer to the table that will be used to post signals
-const vsoc_signal_table_layout& vsoc::RegionView::outgoing_signal_table() {
- return control_->region_desc().host_to_guest_signal_table;
-}