diff options
author | Damien Zammit <damien@zamaudio.com> | 2020-04-10 22:18:46 +1000 |
---|---|---|
committer | Damien Zammit <damien@zamaudio.com> | 2020-04-10 22:18:46 +1000 |
commit | 94f4d12f23f4d977536a25c8e84e48617b3fa378 (patch) | |
tree | 8afc02cf3cc12e2086f06f29ef8dc50a2dfaf0ab | |
parent | c7b3022d446d4b7b24bf17e47ab82e74609f3f79 (diff) |
pci-arbiter: Add --disk-server-task optionrumpdisk-arbiter
-rw-r--r-- | pci-arbiter/main.c | 48 | ||||
-rw-r--r-- | pci-arbiter/options.c | 10 | ||||
-rw-r--r-- | pci-arbiter/options.h | 4 | ||||
-rw-r--r-- | pci-arbiter/pcifs.h | 3 |
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; |