[devmgr] Pass sysinfo job to Coordinator
Rather than indirectly go through a global variable, require the sysinfo
job be passed through the CoordinatorConfig.
Test: Ran Fuchsia and /system/test/ddk tests.
Change-Id: I29a026b30f65ae0bb6e46429253ee74ae25e2012
diff --git a/system/core/devmgr/devmgr/coordinator.cpp b/system/core/devmgr/devmgr/coordinator.cpp
index 55f6eca..3ea0ddf 100644
--- a/system/core/devmgr/devmgr/coordinator.cpp
+++ b/system/core/devmgr/devmgr/coordinator.cpp
@@ -488,7 +488,7 @@
static zx_status_t dc_launch_devhost(Devhost* host, DevhostLoaderService* loader_service,
const char* devhost_bin, const char* name, zx_handle_t hrpc,
- const zx::resource& root_resource,
+ const zx::resource& root_resource, const zx::job& sysinfo_job,
zx::unowned_job devhost_job) {
launchpad_t* lp;
launchpad_create_with_jobs(devhost_job->get(), 0, name, &lp);
@@ -509,7 +509,10 @@
//TODO: limit root resource to root devhost only
if (root_resource.is_valid()) {
zx::resource resource;
- root_resource.duplicate(ZX_RIGHT_SAME_RIGHTS, &resource);
+ zx_status_t status = root_resource.duplicate(ZX_RIGHT_SAME_RIGHTS, &resource);
+ if (status != ZX_OK) {
+ log(ERROR, "devcoord: failed to duplicate root resource: %d\n", status);
+ }
launchpad_add_handle(lp, resource.release(), PA_HND(PA_RESOURCE, 0));
}
@@ -531,27 +534,29 @@
launchpad_set_nametable(lp, name_count, nametable);
- //TODO: limit root job access to root devhost only
- launchpad_add_handle(lp, get_sysinfo_job_root().release(),
- PA_HND(PA_USER0, kIdHJobRoot));
+ //TODO: limit sysinfo job access to root devhost only
+ zx::job sysinfo_job_duplicate;
+ zx_status_t status = sysinfo_job.duplicate(ZX_RIGHT_SAME_RIGHTS, &sysinfo_job_duplicate);
+ if (status != ZX_OK) {
+ log(ERROR, "devcoord: failed to duplicate sysinfo job: %d\n", status);
+ }
+ launchpad_add_handle(lp, sysinfo_job_duplicate.release(), PA_HND(PA_USER0, kIdHJobRoot));
const char* errmsg;
zx_handle_t proc;
- zx_status_t status = launchpad_go(lp, &proc, &errmsg);
+ status = launchpad_go(lp, &proc, &errmsg);
if (status < 0) {
- log(ERROR, "devcoord: launch devhost '%s': failed: %d: %s\n",
- name, status, errmsg);
+ log(ERROR, "devcoord: launch devhost '%s': failed: %d: %s\n", name, status, errmsg);
return status;
}
host->set_proc(proc);
zx_info_handle_basic_t info;
- if (host->proc()->get_info(ZX_INFO_HANDLE_BASIC, &info, sizeof(info), nullptr, nullptr) == ZX_OK) {
+ if (host->proc()->get_info(ZX_INFO_HANDLE_BASIC, &info, sizeof(info), nullptr, nullptr) ==
+ ZX_OK) {
host->set_koid(info.koid);
}
- log(INFO, "devcoord: launch devhost '%s': pid=%zu\n",
- name, host->koid());
-
+ log(INFO, "devcoord: launch devhost '%s': pid=%zu\n", name, host->koid());
return ZX_OK;
}
@@ -569,7 +574,8 @@
dh->set_hrpc(dh_hrpc);
if ((r = dc_launch_devhost(dh.get(), loader_service_, get_devhost_bin(config_.asan_drivers),
- name, hrpc, root_resource(), zx::unowned_job(config_.devhost_job))) < 0) {
+ name, hrpc, root_resource(), config_.sysinfo_job, zx::unowned_job(config_.devhost_job))) <
+ 0) {
zx_handle_close(dh->hrpc());
return r;
}
diff --git a/system/core/devmgr/devmgr/coordinator.h b/system/core/devmgr/devmgr/coordinator.h
index 372c732..958e44a 100644
--- a/system/core/devmgr/devmgr/coordinator.h
+++ b/system/core/devmgr/devmgr/coordinator.h
@@ -266,6 +266,8 @@
struct CoordinatorConfig {
// Initial root resource from the kernel.
zx::resource root_resource;
+ // Job for sysinfo.
+ zx::job sysinfo_job;
// Job for all devhosts.
zx::job devhost_job;
// Event that controls the fshost.
diff --git a/system/core/devmgr/devmgr/devmgr.h b/system/core/devmgr/devmgr/devmgr.h
index 6026150..9eb1ac4 100644
--- a/system/core/devmgr/devmgr/devmgr.h
+++ b/system/core/devmgr/devmgr/devmgr.h
@@ -28,6 +28,4 @@
// Clones the channel connected to the root of devfs.
zx::channel devfs_root_clone();
-zx::job get_sysinfo_job_root();
-
} // namespace devmgr
diff --git a/system/core/devmgr/devmgr/main.cpp b/system/core/devmgr/devmgr/main.cpp
index 8035172..07d6b3b 100644
--- a/system/core/devmgr/devmgr/main.cpp
+++ b/system/core/devmgr/devmgr/main.cpp
@@ -744,16 +744,6 @@
zx_handle_t virtcon_open;
-zx::job get_sysinfo_job_root() {
- zx::job h;
- //TODO: limit to enumerate rights
- if (g_handles.root_job->duplicate(ZX_RIGHT_SAME_RIGHTS, &h) < 0) {
- return zx::job();
- } else {
- return h;
- }
-}
-
zx::channel fs_clone(const char* path) {
if (!strcmp(path, "dev")) {
return devfs_root_clone();
@@ -793,6 +783,7 @@
ParseArgs(argc, argv, &args);
g_handles.root_job = zx::job::default_job();
+ g_handles.root_job->set_property(ZX_PROP_NAME, "root", 4);
bool require_system = devmgr::getenv_bool("devmgr.require-system", false);
async::Loop loop(&kAsyncLoopConfigNoAttachToThread);
@@ -805,14 +796,19 @@
fprintf(stderr, "devmgr: did not receive root resource: %d\n", status);
return 1;
}
+ //TODO: limit to enumerate rights
+ status = g_handles.root_job->duplicate(ZX_RIGHT_SAME_RIGHTS, &config.sysinfo_job);
+ if (status != ZX_OK) {
+ fprintf(stderr, "devmgr: failed to duplicate root job for sysinfo: %d\n", status);
+ }
status = CreateDevhostJob(*g_handles.root_job, &config.devhost_job);
if (status != ZX_OK) {
- fprintf(stderr, "devmgr: unable to create devhost job: %d\n", status);
+ fprintf(stderr, "devmgr: failed to create devhost job: %d\n", status);
return 1;
}
status = zx::event::create(0, &config.fshost_event);
if (status != ZX_OK) {
- fprintf(stderr, "devmgr: unable to create fshost event: %d\n", status);
+ fprintf(stderr, "devmgr: failed to create fshost event: %d\n", status);
return 1;
}
@@ -826,11 +822,9 @@
fdio_service_clone_to(devmgr::devfs_root_borrow()->get(), devfs_client.release());
}
- g_handles.root_job->set_property(ZX_PROP_NAME, "root", 4);
-
status = zx::job::create(*g_handles.root_job, 0u, &g_handles.svc_job);
if (status != ZX_OK) {
- fprintf(stderr, "devmgr: unable to create service job: %d\n", status);
+ fprintf(stderr, "devmgr: failed to create service job: %d\n", status);
return 1;
}
g_handles.svc_job.set_property(ZX_PROP_NAME, "zircon-services", 16);