blob: a0bdb37bb17f41c9f0ca3bdd1f6bbc1eac634e18 [file] [log] [blame]
// Copyright 2019 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_SYSTEM_INSTANCE_H_
#define SRC_DEVICES_BIN_DRIVER_MANAGER_SYSTEM_INSTANCE_H_
#include <fuchsia/boot/c/fidl.h>
#include <fuchsia/ldsvc/llcpp/fidl.h>
#include <lib/fdio/namespace.h>
#include <lib/zx/vmo.h>
#include "coordinator.h"
#include "fdio.h"
#include "fuchsia/boot/llcpp/fidl.h"
constexpr char kItemsPath[] = "/svc/" fuchsia_boot_Items_Name;
zx_status_t wait_for_file(const char* path, zx::time deadline);
class SystemInstance : public FsProvider {
public:
struct ServiceStarterArgs {
SystemInstance* instance;
Coordinator* coordinator;
};
SystemInstance();
// Implementation required to implement FsProvider
zx::channel CloneFs(const char* path) override;
// The heart of the public API, in the order that things get called during
// startup.
zx_status_t CreateDriverHostJob(const zx::job& root_job, zx::job* driver_host_job_out);
zx_status_t CreateSvcJob(const zx::job& root_job);
zx_status_t MaybeCreateShellJob(const zx::job& root_job,
llcpp::fuchsia::boot::Arguments::SyncClient& boot_args);
zx_status_t PrepareChannels();
zx_status_t StartSvchost(const zx::job& root_job, const zx::channel& root_dir,
bool require_system, Coordinator* coordinator);
zx_status_t ReuseExistingSvchost();
void devmgr_vfs_init();
void start_console_shell(llcpp::fuchsia::boot::Arguments::SyncClient& boot_args);
int ConsoleStarter(llcpp::fuchsia::boot::Arguments::SyncClient* boot_args);
// Thread entry point
static int service_starter(void* arg);
int ServiceStarter(Coordinator* coordinator);
int WaitForSystemAvailable(Coordinator* coordinator);
// TODO(ZX-4860): DEPRECATED. Do not add new dependencies on the fshost loader service!
zx_status_t clone_fshost_ldsvc(zx::channel* loader);
protected:
DevmgrLauncher& launcher() { return launcher_; }
zx::job& svc_job() { return svc_job_; }
zx::job& shell_job() { return shell_job_; }
private:
// Private helper functions.
void do_autorun(const char* name, const char* cmd, const zx::resource& root_resource);
// The handle used to transmit messages to miscsvc.
zx::channel miscsvc_client_;
// The handle used by miscsvc to serve incoming requests.
zx::channel miscsvc_server_;
// The handle used to transmit messages to device_name_provider.
zx::channel device_name_provider_client_;
// The handle used by device_name_provider to serve incoming requests.
zx::channel device_name_provider_server_;
// The outgoing (exposed) connection to the svchost.
zx::channel svchost_outgoing_;
// The job in which we run "svc" realm services, like svchost, miscsvc, netsvc, etc.
zx::job svc_job_;
// The job in which we run shell processes like consoles and autorun.
// WARNING: This job is created directly from the root job with no additional job policy
// restrictions. Specifically, it has ZX_POL_AMBIENT_MARK_VMO_EXEC allowed. It should only be used
// to launch processes like the shell, autorun processes, and other debug-only functions that are
// disabled on userdebug/user build types. Because of this, we only create it when the
// 'console.shell' kernel command line argument is enabled.
zx::job shell_job_;
// Used to bind the svchost to the virtual-console binary to provide fidl
// services.
zx::channel virtcon_fidl_;
DevmgrLauncher launcher_;
};
#endif // SRC_DEVICES_BIN_DRIVER_MANAGER_SYSTEM_INSTANCE_H_