diff --git a/docs/misc/xen-command-line.pandoc b/docs/misc/xen-command-line.pandoc index 08c28f909431..716133ccaf3a 100644 --- a/docs/misc/xen-command-line.pandoc +++ b/docs/misc/xen-command-line.pandoc @@ -183,17 +183,17 @@ in combination with cpuidle. This option is only expected to be useful for developers wishing Xen to fall back to older timing methods on newer hardware. ### argo -> `= ` - -> Default: `false` + = List of [ ] -Enable the Argo hypervisor-mediated interdomain communication mechanism. +Controls for the Argo hypervisor-mediated interdomain communication service. +Argo is only available when Xen is compiled with `CONFIG_ARGO` enabled. -Only available if Xen is compiled with `CONFIG_ARGO` enabled. +Argo is a interdomain communication mechanism, where Xen acts as the central +point of authority. Guests may register memory rings to recieve messages, +query the status of other domains, and send messages by hypercall, all subject +to appropriate auditing by Xen. -This allows domains access to the Argo hypercall, which supports registration -of memory rings with the hypervisor to receive messages, sending messages to -other domains by hypercall and querying the ring status of other domains. +* An overall boolean acts as a global control. Argo is disabled by default. ### asid (x86) > `= ` diff --git a/xen/common/argo.c b/xen/common/argo.c index 1958fdc8e428..ce3bbff8c8aa 100644 --- a/xen/common/argo.c +++ b/xen/common/argo.c @@ -31,9 +31,29 @@ DEFINE_XEN_GUEST_HANDLE(xen_argo_addr_t); DEFINE_XEN_GUEST_HANDLE(xen_argo_ring_t); -/* Xen command line option to enable argo */ -static bool __read_mostly opt_argo_enabled; -boolean_param("argo", opt_argo_enabled); +static bool __read_mostly opt_argo; + +static int __init parse_argo(const char *s) +{ + const char *ss; + int val, rc = 0; + + do { + ss = strchr(s, ','); + if ( !ss ) + ss = strchr(s, '\0'); + + if ( (val = parse_bool(s, ss)) >= 0 ) + opt_argo = val; + else + rc = -EINVAL; + + s = ss + 1; + } while ( *ss ); + + return rc; +} +custom_param("argo", parse_argo); typedef struct argo_ring_id {