diff options
author | Damien Zammit <damien@zamaudio.com> | 2020-07-25 11:18:47 +1000 |
---|---|---|
committer | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2020-07-25 13:14:55 +0200 |
commit | 94779df38295bcd1b07795970685e0e5e2ce2a81 (patch) | |
tree | e82e3ffe97065eacf4d2b32587d2e028ca0c0bbd /rumpdisk/main.c | |
parent | 06906d97984e6de0567b652e108cc4d8d764e561 (diff) | |
download | hurd-94779df38295bcd1b07795970685e0e5e2ce2a81.tar.gz hurd-94779df38295bcd1b07795970685e0e5e2ce2a81.tar.bz2 hurd-94779df38295bcd1b07795970685e0e5e2ce2a81.zip |
rumpdisk: Use bootstrap resume of fs task in machdev
Message-Id: <20200725011847.186969-4-damien@zamaudio.com>
Diffstat (limited to 'rumpdisk/main.c')
-rw-r--r-- | rumpdisk/main.c | 95 |
1 files changed, 92 insertions, 3 deletions
diff --git a/rumpdisk/main.c b/rumpdisk/main.c index 0181f685..27a8ea38 100644 --- a/rumpdisk/main.c +++ b/rumpdisk/main.c @@ -16,24 +16,113 @@ * Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ +#include <stdarg.h> +#include <stdio.h> +#include <fcntl.h> +#include <unistd.h> +#include <stdlib.h> +#include <string.h> +#include <error.h> +#include <argp.h> +#include <version.h> + #include "libmachdev/machdev.h" #include "block-rump.h" #include <pthread.h> #include <mach.h> +/* TODO: Add api to pciaccess to allow selecting backend. + * For now we pretend to be the arbiter and claim x86 method. + */ +char *netfs_server_name = "pci-arbiter"; + +mach_port_t bootstrap_resume_task = MACH_PORT_NULL; + +static const struct argp_option options[] = { + {"host-priv-port", 'h', "PORT", 0, "Host private port PORT"}, + {"device-master-port",'d', "PORT", 0, "Device master port PORT"}, + {"filesystem-task", 'f', "TASK", 0, "Filesystem task TASK"}, + {0} +}; + + +/* Parse a command line option. */ +static error_t +parse_opt (int key, char *arg, struct argp_state *state) +{ + /* We save our parsed values in this structure, hung off STATE->hook. + Only after parsing all options successfully will we use these values. */ + struct + { + int host_priv; + int dev_master; + int fs_task; + } *values = state->hook; + + switch (key) + { + case 'h': + values->host_priv = atoi(arg); + break; + case 'd': + values->dev_master = atoi(arg); + break; + case 'f': + values->fs_task = atoi(arg); + break; + + case ARGP_KEY_INIT: + state->child_inputs[0] = state->input; + values = malloc (sizeof *values); + if (values == 0) + return ENOMEM; + state->hook = values; + memset (values, 0, sizeof *values); + break; + + case ARGP_KEY_SUCCESS: + /* All options parsed successfully */ + _hurd_host_priv = values->host_priv; + _hurd_device_master = values->dev_master; + bootstrap_resume_task = values->fs_task; + break; + + default: + return ARGP_ERR_UNKNOWN; + } + return 0; +} + +static struct argp_child empty_argp_children[] = {{0}}; +static struct argp rumpdisk_argp = {options, parse_opt, 0, 0, empty_argp_children}; +static const struct argp *rumpdisk_argp_bootup = &rumpdisk_argp; + int -main () +main (int argc, char **argv) { + mach_port_t bootstrap = MACH_PORT_NULL; int err; pthread_t t; + setenv ("RUMP_NCPU", "1", 1); + setenv ("RUMP_VERBOSE", "1", 1); + setenv ("RUMP_HOSTNAME", "HURD0", 1); + setenv ("HOSTNAME", "HURD0", 1); + setenv ("RUMP_PANIC", "1", 1); + + err = argp_parse (rumpdisk_argp_bootup, argc, argv, 0, 0, NULL); + if (err) + { + error(1, err, "Missing parameters for bootstrap"); + } + rump_register_block (); machdev_device_init (); - machdev_trivfs_init (); + machdev_trivfs_init (bootstrap_resume_task, "fs", &bootstrap); err = pthread_create (&t, NULL, machdev_server, NULL); if (err) return err; pthread_detach (t); - machdev_trivfs_server (); + machdev_trivfs_server (bootstrap); return 0; } |