| // Copyright 2022 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef SRC_DEVICES_BIN_DRIVER_MANAGER_DRIVER_HOST_H_ |
| #define SRC_DEVICES_BIN_DRIVER_MANAGER_DRIVER_HOST_H_ |
| |
| #include <fidl/fuchsia.driver.host/cpp/fidl.h> |
| #include <fidl/fuchsia.driver.host/cpp/wire.h> |
| #include <lib/vfs/cpp/pseudo_dir.h> |
| |
| #include <fbl/intrusive_double_list.h> |
| |
| namespace driver_manager { |
| |
| class DriverHost { |
| public: |
| using StartCallback = fit::callback<void(zx::result<>)>; |
| virtual void Start(fidl::ClientEnd<fuchsia_driver_framework::Node> client_end, |
| std::string node_name, |
| fuchsia_driver_framework::wire::NodePropertyDictionary node_properties, |
| fidl::VectorView<fuchsia_driver_framework::wire::NodeSymbol> symbols, |
| fuchsia_component_runner::wire::ComponentStartInfo start_info, |
| fidl::ServerEnd<fuchsia_driver_host::Driver> driver, StartCallback cb) = 0; |
| |
| virtual zx::result<uint64_t> GetProcessKoid() const = 0; |
| }; |
| |
| class DriverHostComponent final |
| : public DriverHost, |
| public fbl::DoublyLinkedListable<std::unique_ptr<DriverHostComponent>> { |
| public: |
| DriverHostComponent(fidl::ClientEnd<fuchsia_driver_host::DriverHost> driver_host, |
| async_dispatcher_t* dispatcher, |
| fbl::DoublyLinkedList<std::unique_ptr<DriverHostComponent>>* driver_hosts, |
| std::shared_ptr<bool> server_connected); |
| |
| void Start(fidl::ClientEnd<fuchsia_driver_framework::Node> client_end, std::string node_name, |
| fuchsia_driver_framework::wire::NodePropertyDictionary node_properties, |
| fidl::VectorView<fuchsia_driver_framework::wire::NodeSymbol> symbols, |
| fuchsia_component_runner::wire::ComponentStartInfo start_info, |
| fidl::ServerEnd<fuchsia_driver_host::Driver> driver, StartCallback cb) override; |
| |
| zx::result<fuchsia_driver_host::ProcessInfo> GetProcessInfo() const; |
| zx::result<uint64_t> GetProcessKoid() const override; |
| zx::result<uint64_t> GetJobKoid() const; |
| |
| zx::result<> InstallLoader(fidl::ClientEnd<fuchsia_ldsvc::Loader> loader_client) const; |
| |
| private: |
| void InitializeElfDir(); |
| |
| fidl::WireSharedClient<fuchsia_driver_host::DriverHost> driver_host_; |
| mutable std::optional<fuchsia_driver_host::ProcessInfo> process_info_; |
| vfs::PseudoDir runtime_dir_; |
| async_dispatcher_t* dispatcher_; |
| std::shared_ptr<bool> server_connected_; |
| }; |
| |
| zx::result<> SetEncodedConfig( |
| fidl::WireTableBuilder<fuchsia_driver_framework::wire::DriverStartArgs>& args, |
| fuchsia_component_runner::wire::ComponentStartInfo& start_info); |
| |
| } // namespace driver_manager |
| |
| #endif // SRC_DEVICES_BIN_DRIVER_MANAGER_DRIVER_HOST_H_ |