[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH 2/3] Bootstrappable pci-arbiter
From: |
Damien Zammit |
Subject: |
[PATCH 2/3] Bootstrappable pci-arbiter |
Date: |
Tue, 2 Feb 2021 18:29:44 +1100 |
---
pci-arbiter/Makefile | 2 +-
pci-arbiter/main.c | 72 ++++++++++++++++++++++++++++++++++++---
pci-arbiter/options.c | 19 +++++++++++
pci-arbiter/options.h | 8 +++++
pci-arbiter/pcifs.h | 3 ++
pci-arbiter/startup-ops.c | 2 ++
6 files changed, 100 insertions(+), 6 deletions(-)
diff --git a/pci-arbiter/Makefile b/pci-arbiter/Makefile
index 1d0309dc..aab59456 100644
--- a/pci-arbiter/Makefile
+++ b/pci-arbiter/Makefile
@@ -26,7 +26,7 @@ SRCS = main.c pci-ops.c netfs_impl.c \
MIGSRCS = pciServer.c startup_notifyServer.c
OBJS = $(patsubst %.S,%.o,$(patsubst %.c,%.o, $(SRCS) $(MIGSRCS)))
-HURDLIBS= fshelp ports shouldbeinlibc netfs iohelp ihash
+HURDLIBS= fshelp ports shouldbeinlibc netfs iohelp ihash trivfs machdev
LDLIBS = -lpthread $(libpciaccess_LIBS)
target = pci-arbiter
diff --git a/pci-arbiter/main.c b/pci-arbiter/main.c
index 181bdee2..61ff220c 100644
--- a/pci-arbiter/main.c
+++ b/pci-arbiter/main.c
@@ -25,6 +25,7 @@
#include <version.h>
#include <argp.h>
#include <hurd/netfs.h>
+#include <hurd/ports.h>
#include <pci_S.h>
#include <startup_notify_S.h>
@@ -34,18 +35,62 @@
#include "libnetfs/fsys_S.h"
#include "libports/interrupt_S.h"
#include "libnetfs/ifsock_S.h"
+#include "libmachdev/machdev.h"
#include <pciaccess.h>
+#include <pthread.h>
#include "pcifs.h"
#include "startup.h"
struct pcifs *fs;
-volatile struct mapped_time_value *pcifs_maptime;
+volatile struct mapped_time_value *pcifs_maptime = NULL;
/* Libnetfs stuff */
int netfs_maxsymlinks = 0;
char *netfs_server_name = "pci-arbiter";
char *netfs_server_version = HURD_VERSION;
+static io_return_t
+device_open (mach_port_t reply_port, mach_msg_type_name_t reply_port_type,
+ dev_mode_t mode, char *name, device_t * devp,
+ mach_msg_type_name_t * devicePoly)
+{
+ io_return_t err;
+ struct port_info newpi;
+
+ if (strncmp(name, "pci", 3))
+ return D_NO_SUCH_DEVICE;
+
+ err = ports_create_port (netfs_control_class, netfs_port_bucket,
+ sizeof (struct port_info), &newpi);
+ if (err)
+ return D_NO_SUCH_DEVICE;
+
+ *devp = ports_get_right (&newpi);
+ *devicePoly = MACH_MSG_TYPE_MAKE_SEND;
+ return D_SUCCESS;
+}
+
+static struct machdev_device_emulation_ops pci_arbiter_emulation_ops = {
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ device_open,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+};
+
int
netfs_demuxer (mach_msg_header_t * inp, mach_msg_header_t * outp)
{
@@ -72,19 +117,36 @@ main (int argc, char **argv)
{
error_t err;
mach_port_t bootstrap;
+ mach_port_t disk_server_task;
+ pthread_t t;
/* Parse options */
alloc_file_system (&fs);
argp_parse (netfs_runtime_argp, argc, argv, 0, 0, 0);
+ disk_server_task = fs->params.disk_server_task;
- task_get_bootstrap_port (mach_task_self (), &bootstrap);
- if (bootstrap == MACH_PORT_NULL)
- error (1, 0, "must be started as a translator");
-
+ if (disk_server_task != MACH_PORT_NULL)
+ {
+ machdev_register (&pci_arbiter_emulation_ops);
+ machdev_device_init ();
+ machdev_trivfs_init (disk_server_task, "pci", "/servers/bus/pci",
&bootstrap);
+ err = pthread_create (&t, NULL, machdev_server, NULL);
+ if (err)
+ error (1, err, "Creating machdev thread");
+ pthread_detach (t);
+ }
+ else
+ {
+ task_get_bootstrap_port (mach_task_self (), &bootstrap);
+ if (bootstrap == MACH_PORT_NULL)
+ error (1, 0, "must be started as a translator");
+ }
/* Initialize netfs and start the translator. */
netfs_init ();
err = maptime_map (0, 0, &pcifs_maptime);
+ if (err)
+ err = maptime_map (1, 0, &pcifs_maptime);
if (err)
error (1, err, "mapping time");
diff --git a/pci-arbiter/options.c b/pci-arbiter/options.c
index 5767ad27..141c69e3 100644
--- a/pci-arbiter/options.c
+++ b/pci-arbiter/options.c
@@ -241,6 +241,15 @@ parse_opt (int opt, char *arg, struct argp_state *state)
case 'n':
h->ncache_len = atoi (arg);
break;
+ case 'T':
+ h->disk_server_task = atoi (arg);
+ break;
+ case 'H':
+ h->host_priv_port = atoi (arg);
+ break;
+ case 'P':
+ h->dev_master_port = atoi (arg);
+ break;
case ARGP_KEY_INIT:
/* Initialize our parsing state. */
h = malloc (sizeof (struct parse_hook));
@@ -250,6 +259,9 @@ parse_opt (int opt, char *arg, struct argp_state *state)
h->permsets = 0;
h->num_permsets = 0;
h->ncache_len = NODE_CACHE_MAX;
+ h->disk_server_task = MACH_PORT_NULL;
+ h->host_priv_port = MACH_PORT_NULL;
+ h->dev_master_port = MACH_PORT_NULL;
err = parse_hook_add_set (h);
if (err)
FAIL (err, 1, err, "option parsing");
@@ -286,6 +298,11 @@ parse_opt (int opt, char *arg, struct argp_state *state)
/* Set cache len */
fs->params.node_cache_max = h->ncache_len;
+ /* Set bootstrap ports */
+ fs->params.disk_server_task = h->disk_server_task;
+ _hurd_host_priv = h->host_priv_port;
+ _hurd_device_master = h->dev_master_port;
+
if (fs->root)
{
/*
@@ -364,6 +381,8 @@ netfs_append_args (char **argz, size_t * argz_len)
if (fs->params.node_cache_max != NODE_CACHE_MAX)
ADD_OPT ("--ncache=%u", fs->params.node_cache_max);
+ if (fs->params.disk_server_task != MACH_PORT_NULL)
+ ADD_OPT ("--disk-server-task=%lu", fs->params.disk_server_task);
#undef ADD_OPT
return err;
}
diff --git a/pci-arbiter/options.h b/pci-arbiter/options.h
index 8e5a9da4..292d2963 100644
--- a/pci-arbiter/options.h
+++ b/pci-arbiter/options.h
@@ -45,6 +45,11 @@ struct parse_hook
/* Node cache length */
size_t ncache_len;
+
+ /* Mach ports */
+ mach_port_t disk_server_task;
+ mach_port_t host_priv_port;
+ mach_port_t dev_master_port;
};
/* Lwip translator options. Used for both startup and runtime. */
@@ -65,6 +70,9 @@ static const struct argp_option options[] = {
{0, 0, 0, 0, "Global configuration options:", 3},
{"ncache", 'n', "LENGTH", 0,
"Node cache length. " STR (NODE_CACHE_MAX) " by default"},
+ {"disk-server-task", 'T', "TASK", 0, "Task for bootstrapping disk server"},
+ {"host-priv-port", 'H', "PORT", 0, "Port for bootstrapping host"},
+ {"dev-master-port", 'P', "PORT", 0, "Port for bootstrapping device master"},
{0}
};
diff --git a/pci-arbiter/pcifs.h b/pci-arbiter/pcifs.h
index 72cf2910..f19654d1 100644
--- a/pci-arbiter/pcifs.h
+++ b/pci-arbiter/pcifs.h
@@ -141,6 +141,9 @@ struct pcifs_params
/* The size of the node cache. */
size_t node_cache_max;
+ /* Bootstrap disk server task */
+ mach_port_t disk_server_task;
+
/* FS permissions. */
struct pcifs_perm *perms;
size_t num_perms;
diff --git a/pci-arbiter/startup-ops.c b/pci-arbiter/startup-ops.c
index eb387fd9..fc285572 100644
--- a/pci-arbiter/startup-ops.c
+++ b/pci-arbiter/startup-ops.c
@@ -25,6 +25,7 @@
#include "startup.h"
+#if 0 // FIXME: this conflicts with trivfs for machdev
/* The system is going down. Call netfs_shutdown() */
error_t
S_startup_dosync (mach_port_t handle)
@@ -42,3 +43,4 @@ S_startup_dosync (mach_port_t handle)
return netfs_shutdown (FSYS_GOAWAY_FORCE);
}
+#endif
--
2.30.0