summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDamien Zammit <damien@zamaudio.com>2020-04-10 22:18:46 +1000
committerDamien Zammit <damien@zamaudio.com>2020-04-10 22:18:46 +1000
commit94f4d12f23f4d977536a25c8e84e48617b3fa378 (patch)
tree8afc02cf3cc12e2086f06f29ef8dc50a2dfaf0ab
parentc7b3022d446d4b7b24bf17e47ab82e74609f3f79 (diff)
pci-arbiter: Add --disk-server-task optionrumpdisk-arbiter
-rw-r--r--pci-arbiter/main.c48
-rw-r--r--pci-arbiter/options.c10
-rw-r--r--pci-arbiter/options.h4
-rw-r--r--pci-arbiter/pcifs.h3
4 files changed, 61 insertions, 4 deletions
diff --git a/pci-arbiter/main.c b/pci-arbiter/main.c
index 181bdee2..682a1f35 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>
@@ -46,6 +47,10 @@ int netfs_maxsymlinks = 0;
char *netfs_server_name = "pci-arbiter";
char *netfs_server_version = HURD_VERSION;
+/* Disk boot stuff */
+struct port_class *pcifs_diskboot_class;
+struct port_bucket *pcifs_port_bucket;
+
int
netfs_demuxer (mach_msg_header_t * inp, mach_msg_header_t * outp)
{
@@ -67,20 +72,55 @@ netfs_demuxer (mach_msg_header_t * inp, mach_msg_header_t * outp)
return FALSE;
}
+void
+resume_disk_server(mach_port_t disk_task)
+{
+ error_t err;
+ mach_port_t right;
+ struct port_info *diskboot_info;
+
+ assert_backtrace (disk_task != MACH_PORT_NULL);
+
+ err = ports_create_port (pcifs_diskboot_class, pcifs_port_bucket,
+ sizeof (struct port_info), &diskboot_info);
+ assert_perror_backtrace (err);
+ right = ports_get_send_right (diskboot_info);
+ ports_port_deref (diskboot_info);
+ err = task_set_special_port (disk_task, TASK_BOOTSTRAP_PORT, right);
+ assert_perror_backtrace (err);
+ err = mach_port_deallocate (mach_task_self (), right);
+ assert_perror_backtrace (err);
+
+ err = task_resume (disk_task);
+ assert_perror_backtrace (err);
+
+ printf (" disk");
+ fflush (stdout);
+}
+
int
main (int argc, char **argv)
{
error_t err;
mach_port_t bootstrap;
+ mach_port_t disk_server_task;
/* 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)
+ {
+ resume_disk_server(disk_server_task);
+ bootstrap = disk_server_task;
+ }
+ 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 ();
diff --git a/pci-arbiter/options.c b/pci-arbiter/options.c
index 2023fd9e..d3d42ff2 100644
--- a/pci-arbiter/options.c
+++ b/pci-arbiter/options.c
@@ -203,6 +203,9 @@ 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 ARGP_KEY_INIT:
/* Initialize our parsing state. */
h = malloc (sizeof (struct parse_hook));
@@ -212,6 +215,7 @@ 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;
err = parse_hook_add_set (h);
if (err)
FAIL (err, 1, err, "option parsing");
@@ -248,6 +252,9 @@ parse_opt (int opt, char *arg, struct argp_state *state)
/* Set cache len */
fs->params.node_cache_max = h->ncache_len;
+ /* Set disk bootstrap task */
+ fs->params.disk_server_task = h->disk_server_task;
+
if (fs->root)
{
/*
@@ -326,6 +333,9 @@ 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..14f16db1 100644
--- a/pci-arbiter/options.h
+++ b/pci-arbiter/options.h
@@ -45,6 +45,9 @@ struct parse_hook
/* Node cache length */
size_t ncache_len;
+
+ /* Disk bootstrap task */
+ mach_port_t disk_server_task;
};
/* Lwip translator options. Used for both startup and runtime. */
@@ -65,6 +68,7 @@ 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"},
{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;