[driver-registrar] Basic commandline tool for calling DriverRegistrar.
Also update cml files with DriverRegistrar protocol.
This is for short term use in testing loading out-of-tree drivers,
and should be replaced with something better in future.
Bug: 66669
Change-Id: I8d9ba452a57c98862dc9851da1f571fcda7a2fec
Reviewed-on: https://fuchsia-review.googlesource.com/c/fuchsia/+/464998
Commit-Queue: Jocelyn Dang <jocelyndang@google.com>
Reviewed-by: Abdulla Kamar <abdulla@google.com>
Reviewed-by: Suraj Malhotra <surajmalhotra@google.com>
diff --git a/src/devices/bin/driver-registrar/BUILD.gn b/src/devices/bin/driver-registrar/BUILD.gn
new file mode 100644
index 0000000..d108f813
--- /dev/null
+++ b/src/devices/bin/driver-registrar/BUILD.gn
@@ -0,0 +1,15 @@
+# Copyright 2021 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.
+
+executable("driver-registrar") {
+ sources = [ "driver-registrar.cc" ]
+ configs += [ "//build/unification/config:zircon-migrated" ]
+ deps = [
+ "//sdk/fidl/fuchsia.driver.registrar:fuchsia.driver.registrar_llcpp",
+ "//sdk/fidl/fuchsia.pkg",
+ "//sdk/lib/fdio",
+ "//sdk/lib/fidl/cpp",
+ "//zircon/public/lib/zx",
+ ]
+}
diff --git a/src/devices/bin/driver-registrar/driver-registrar.cc b/src/devices/bin/driver-registrar/driver-registrar.cc
new file mode 100644
index 0000000..677d2fb
--- /dev/null
+++ b/src/devices/bin/driver-registrar/driver-registrar.cc
@@ -0,0 +1,48 @@
+// Copyright 2021 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.
+
+#include <fuchsia/driver/registrar/llcpp/fidl.h>
+#include <fuchsia/pkg/cpp/fidl.h>
+#include <lib/fdio/directory.h>
+#include <lib/zx/channel.h>
+#include <stdio.h>
+
+#include <fbl/string_printf.h>
+
+int main(int argc, char* argv[]) {
+ if (argc != 2) {
+ fprintf(stderr, "usage: %s <driver package url>\n", argv[0]);
+ return -1;
+ }
+
+ zx::channel local, remote;
+ zx_status_t status = zx::channel::create(0u, &local, &remote);
+ if (status != ZX_OK) {
+ fprintf(stderr, "Failed to create channel, status %d\n", status);
+ return status;
+ }
+
+ const auto svc_path =
+ fbl::StringPrintf("/svc/%s", llcpp::fuchsia::driver::registrar::DriverRegistrar::Name);
+ status = fdio_service_connect(svc_path.c_str(), remote.release());
+ if (status != ZX_OK) {
+ fprintf(stderr, "fdio_service_connect failed, pathc %s, status %d\n", svc_path.c_str(), status);
+ return status;
+ }
+ llcpp::fuchsia::driver::registrar::DriverRegistrar::SyncClient client(std::move(local));
+
+ auto resp =
+ client.Register(llcpp::fuchsia::pkg::PackageUrl{fidl::unowned_str(argv[1], strlen(argv[1]))});
+ if (!resp.ok()) {
+ fprintf(stderr, "Failed to call DriverRegistrar::Register for driver package %s\n", argv[1]);
+ return -1;
+ }
+ if (resp->result.is_err()) {
+ fprintf(stderr, "DriverRegistrar::Register returned err %d for driver package %s\n",
+ resp->result.err(), argv[1]);
+ return -1;
+ }
+ printf("DriverRegistrar::Register successfully registered driver package %s\n", argv[1]);
+ return 0;
+}
diff --git a/src/devices/bin/driver_manager/meta/driver_manager.cml b/src/devices/bin/driver_manager/meta/driver_manager.cml
index e04cbc4..8a9e107 100644
--- a/src/devices/bin/driver_manager/meta/driver_manager.cml
+++ b/src/devices/bin/driver_manager/meta/driver_manager.cml
@@ -1,4 +1,5 @@
{
+ include: [ "sdk/lib/diagnostics/syslog/client.shard.cml" ],
program: {
binary: "bin/driver_manager",
lifecycle: { stop_event: "notify" },
@@ -24,6 +25,7 @@
"fuchsia.device.manager.BindDebugger",
"fuchsia.device.manager.DebugDumper",
"fuchsia.device.manager.SystemStateTransition",
+ "fuchsia.driver.registrar.DriverRegistrar",
],
},
],
@@ -77,9 +79,9 @@
"fuchsia.device.manager.BindDebugger",
"fuchsia.device.manager.DebugDumper",
"fuchsia.device.manager.SystemStateTransition",
+ "fuchsia.driver.registrar.DriverRegistrar",
],
from: "self",
},
],
- include: [ "sdk/lib/diagnostics/syslog/client.shard.cml" ],
}
diff --git a/src/devices/bundles/BUILD.gn b/src/devices/bundles/BUILD.gn
index f42015c..fb95870 100644
--- a/src/devices/bundles/BUILD.gn
+++ b/src/devices/bundles/BUILD.gn
@@ -118,6 +118,7 @@
group("utils") {
deps = [
+ "//src/devices/bin/driver-registrar",
"//src/devices/bin/driverctl",
"//src/devices/bin/lsdev",
"//src/devices/bin/unbind",
diff --git a/src/sys/appmgr/meta/appmgr.cml b/src/sys/appmgr/meta/appmgr.cml
index c5af15d..af894bd 100644
--- a/src/sys/appmgr/meta/appmgr.cml
+++ b/src/sys/appmgr/meta/appmgr.cml
@@ -232,6 +232,10 @@
path: "/svc_for_sys/fuchsia.device.manager.BindDebugger",
},
{
+ protocol: "fuchsia.driver.registrar.DriverRegistrar",
+ path: "/svc_for_sys/fuchsia.driver.registrar.DriverRegistrar",
+ },
+ {
protocol: "fuchsia.hardware.pci.Bus",
path: "/svc_for_sys/fuchsia.hardware.pci.Bus",
},
diff --git a/src/sys/bootstrap/meta/bootstrap.cml b/src/sys/bootstrap/meta/bootstrap.cml
index 418b2ac..0c8a099 100644
--- a/src/sys/bootstrap/meta/bootstrap.cml
+++ b/src/sys/bootstrap/meta/bootstrap.cml
@@ -749,6 +749,7 @@
"fuchsia.device.manager.BindDebugger",
"fuchsia.device.manager.DebugDumper",
"fuchsia.device.manager.SystemStateTransition",
+ "fuchsia.driver.registrar.DriverRegistrar",
],
from: "#driver_manager",
},
diff --git a/src/sys/bootstrap/meta/root.cml b/src/sys/bootstrap/meta/root.cml
index 692b9df..bab8263 100644
--- a/src/sys/bootstrap/meta/root.cml
+++ b/src/sys/bootstrap/meta/root.cml
@@ -133,6 +133,7 @@
"fuchsia.diagnostics.ArchiveAccessor",
"fuchsia.diagnostics.FeedbackArchiveAccessor",
"fuchsia.diagnostics.LegacyMetricsArchiveAccessor",
+ "fuchsia.driver.registrar.DriverRegistrar",
"fuchsia.hardware.power.statecontrol.Admin",
"fuchsia.hardware.power.statecontrol.RebootMethodsWatcherRegister",
"fuchsia.hardware.pty.Device",
diff --git a/src/sys/core/meta/core.cml b/src/sys/core/meta/core.cml
index a10544d..b85c287 100644
--- a/src/sys/core/meta/core.cml
+++ b/src/sys/core/meta/core.cml
@@ -169,6 +169,7 @@
"fuchsia.device.manager.Administrator",
"fuchsia.device.manager.DebugDumper",
"fuchsia.device.NameProvider",
+ "fuchsia.driver.registrar.DriverRegistrar",
"fuchsia.hardware.power.statecontrol.Admin",
"fuchsia.hardware.power.statecontrol.RebootMethodsWatcherRegister",
"fuchsia.hardware.pty.Device",