diff mbox series

[2/3] xenstore: add console xenstore entries for xenstore stubdom

Message ID 20200128142818.27200-3-jgross@suse.com (mailing list archive)
State New, archived
Headers show
Series tools/xenstore | expand

Commit Message

Jürgen Groß Jan. 28, 2020, 2:28 p.m. UTC
In order to be able to connect to the console of Xenstore stubdom we
need to create the appropriate entries in Xenstore.

For the moment we don't support xenconsoled living in another domain
than dom0, as this information isn't available other then via
Xenstore which we are just setting up.

Signed-off-by: Juergen Gross <jgross@suse.com>
---
 tools/helpers/init-xenstore-domain.c | 31 ++++++++++++++++++++++++++++++-
 1 file changed, 30 insertions(+), 1 deletion(-)

Comments

Andrew Cooper Feb. 11, 2020, 8:25 p.m. UTC | #1
On 28/01/2020 14:28, Juergen Gross wrote:
> In order to be able to connect to the console of Xenstore stubdom we
> need to create the appropriate entries in Xenstore.
>
> For the moment we don't support xenconsoled living in another domain
> than dom0, as this information isn't available other then via
> Xenstore which we are just setting up.

Ah - I see the observation here.

>
> Signed-off-by: Juergen Gross <jgross@suse.com>

Acked-by: Andrew Cooper <andrew.cooper3@citrix.com>

> ---
>  tools/helpers/init-xenstore-domain.c | 31 ++++++++++++++++++++++++++++++-
>  1 file changed, 30 insertions(+), 1 deletion(-)
>
> diff --git a/tools/helpers/init-xenstore-domain.c b/tools/helpers/init-xenstore-domain.c
> index a312bc38b8..a81a15a4de 100644
> --- a/tools/helpers/init-xenstore-domain.c
> +++ b/tools/helpers/init-xenstore-domain.c
> @@ -12,6 +12,7 @@
>  #include <xenstore.h>
>  #include <xen/sys/xenbus_dev.h>
>  #include <xen-xsm/flask/flask.h>
> +#include <xen/io/xenbus.h>
>  
>  #include "init-dom-json.h"
>  #include "_paths.h"
> @@ -312,6 +313,15 @@ static void do_xs_write(struct xs_handle *xsh, char *path, char *val)
>          fprintf(stderr, "writing %s to xenstore failed.\n", path);
>  }
>  
> +static void do_xs_write_dir_node(struct xs_handle *xsh, char *dir, char *node,
> +                                 char *val)
> +{
> +    char full_path[100];
> +
> +    snprintf(full_path, 100, "%s/%s", dir, node);
> +    do_xs_write(xsh, full_path, val);
> +}
> +
>  static void do_xs_write_dom(struct xs_handle *xsh, char *path, char *val)
>  {
>      char full_path[64];
> @@ -325,7 +335,7 @@ int main(int argc, char** argv)
>      int opt;
>      xc_interface *xch;
>      struct xs_handle *xsh;
> -    char buf[16];
> +    char buf[16], be_path[64], fe_path[64];
>      int rv, fd;
>      char *maxmem_str = NULL;
>  
> @@ -414,6 +424,25 @@ int main(int argc, char** argv)
>      if (maxmem)
>          snprintf(buf, 16, "%d", maxmem * 1024);
>      do_xs_write_dom(xsh, "memory/static-max", buf);
> +    snprintf(be_path, 64, "/local/domain/0/backend/console/%d/0", domid);
> +    snprintf(fe_path, 64, "/local/domain/%d/console", domid);
> +    snprintf(buf, 16, "%d", domid);
> +    do_xs_write_dir_node(xsh, be_path, "frontend-id", buf);
> +    do_xs_write_dir_node(xsh, be_path, "frontend", fe_path);
> +    do_xs_write_dir_node(xsh, be_path, "online", "1");
> +    snprintf(buf, 16, "%d", XenbusStateInitialising);
> +    do_xs_write_dir_node(xsh, be_path, "state", buf);
> +    do_xs_write_dir_node(xsh, be_path, "protocol", "vt100");
> +    do_xs_write_dir_node(xsh, fe_path, "backend", be_path);
> +    do_xs_write_dir_node(xsh, fe_path, "backend-id", "0");
> +    do_xs_write_dir_node(xsh, fe_path, "limit", "1048576");
> +    do_xs_write_dir_node(xsh, fe_path, "type", "xenconsoled");
> +    do_xs_write_dir_node(xsh, fe_path, "output", "pty");
> +    do_xs_write_dir_node(xsh, fe_path, "tty", "");
> +    snprintf(buf, 16, "%d", console_evtchn);
> +    do_xs_write_dir_node(xsh, fe_path, "port", buf);
> +    snprintf(buf, 16, "%ld", console_mfn);
> +    do_xs_write_dir_node(xsh, fe_path, "ring-ref", buf);

Eww.  Why are pty/tty details in the protocol?  vt100, fine, but the
backend specifics about what it does with the data shouldn't matter to
the frontend.

I presume this is too engrained in legacy to fix?

~Andrew
Jürgen Groß Feb. 12, 2020, 5:34 a.m. UTC | #2
On 11.02.20 21:25, Andrew Cooper wrote:
> On 28/01/2020 14:28, Juergen Gross wrote:
>> In order to be able to connect to the console of Xenstore stubdom we
>> need to create the appropriate entries in Xenstore.
>>
>> For the moment we don't support xenconsoled living in another domain
>> than dom0, as this information isn't available other then via
>> Xenstore which we are just setting up.
> 
> Ah - I see the observation here.
> 
>>
>> Signed-off-by: Juergen Gross <jgross@suse.com>
> 
> Acked-by: Andrew Cooper <andrew.cooper3@citrix.com>
> 
>> ---
>>   tools/helpers/init-xenstore-domain.c | 31 ++++++++++++++++++++++++++++++-
>>   1 file changed, 30 insertions(+), 1 deletion(-)
>>
>> diff --git a/tools/helpers/init-xenstore-domain.c b/tools/helpers/init-xenstore-domain.c
>> index a312bc38b8..a81a15a4de 100644
>> --- a/tools/helpers/init-xenstore-domain.c
>> +++ b/tools/helpers/init-xenstore-domain.c
>> @@ -12,6 +12,7 @@
>>   #include <xenstore.h>
>>   #include <xen/sys/xenbus_dev.h>
>>   #include <xen-xsm/flask/flask.h>
>> +#include <xen/io/xenbus.h>
>>   
>>   #include "init-dom-json.h"
>>   #include "_paths.h"
>> @@ -312,6 +313,15 @@ static void do_xs_write(struct xs_handle *xsh, char *path, char *val)
>>           fprintf(stderr, "writing %s to xenstore failed.\n", path);
>>   }
>>   
>> +static void do_xs_write_dir_node(struct xs_handle *xsh, char *dir, char *node,
>> +                                 char *val)
>> +{
>> +    char full_path[100];
>> +
>> +    snprintf(full_path, 100, "%s/%s", dir, node);
>> +    do_xs_write(xsh, full_path, val);
>> +}
>> +
>>   static void do_xs_write_dom(struct xs_handle *xsh, char *path, char *val)
>>   {
>>       char full_path[64];
>> @@ -325,7 +335,7 @@ int main(int argc, char** argv)
>>       int opt;
>>       xc_interface *xch;
>>       struct xs_handle *xsh;
>> -    char buf[16];
>> +    char buf[16], be_path[64], fe_path[64];
>>       int rv, fd;
>>       char *maxmem_str = NULL;
>>   
>> @@ -414,6 +424,25 @@ int main(int argc, char** argv)
>>       if (maxmem)
>>           snprintf(buf, 16, "%d", maxmem * 1024);
>>       do_xs_write_dom(xsh, "memory/static-max", buf);
>> +    snprintf(be_path, 64, "/local/domain/0/backend/console/%d/0", domid);
>> +    snprintf(fe_path, 64, "/local/domain/%d/console", domid);
>> +    snprintf(buf, 16, "%d", domid);
>> +    do_xs_write_dir_node(xsh, be_path, "frontend-id", buf);
>> +    do_xs_write_dir_node(xsh, be_path, "frontend", fe_path);
>> +    do_xs_write_dir_node(xsh, be_path, "online", "1");
>> +    snprintf(buf, 16, "%d", XenbusStateInitialising);
>> +    do_xs_write_dir_node(xsh, be_path, "state", buf);
>> +    do_xs_write_dir_node(xsh, be_path, "protocol", "vt100");
>> +    do_xs_write_dir_node(xsh, fe_path, "backend", be_path);
>> +    do_xs_write_dir_node(xsh, fe_path, "backend-id", "0");
>> +    do_xs_write_dir_node(xsh, fe_path, "limit", "1048576");
>> +    do_xs_write_dir_node(xsh, fe_path, "type", "xenconsoled");
>> +    do_xs_write_dir_node(xsh, fe_path, "output", "pty");
>> +    do_xs_write_dir_node(xsh, fe_path, "tty", "");
>> +    snprintf(buf, 16, "%d", console_evtchn);
>> +    do_xs_write_dir_node(xsh, fe_path, "port", buf);
>> +    snprintf(buf, 16, "%ld", console_mfn);
>> +    do_xs_write_dir_node(xsh, fe_path, "ring-ref", buf);
> 
> Eww.  Why are pty/tty details in the protocol?  vt100, fine, but the
> backend specifics about what it does with the data shouldn't matter to
> the frontend.
> 
> I presume this is too engrained in legacy to fix?

I think cleaning this up is an orthogonal patch series.


Juergen
diff mbox series

Patch

diff --git a/tools/helpers/init-xenstore-domain.c b/tools/helpers/init-xenstore-domain.c
index a312bc38b8..a81a15a4de 100644
--- a/tools/helpers/init-xenstore-domain.c
+++ b/tools/helpers/init-xenstore-domain.c
@@ -12,6 +12,7 @@ 
 #include <xenstore.h>
 #include <xen/sys/xenbus_dev.h>
 #include <xen-xsm/flask/flask.h>
+#include <xen/io/xenbus.h>
 
 #include "init-dom-json.h"
 #include "_paths.h"
@@ -312,6 +313,15 @@  static void do_xs_write(struct xs_handle *xsh, char *path, char *val)
         fprintf(stderr, "writing %s to xenstore failed.\n", path);
 }
 
+static void do_xs_write_dir_node(struct xs_handle *xsh, char *dir, char *node,
+                                 char *val)
+{
+    char full_path[100];
+
+    snprintf(full_path, 100, "%s/%s", dir, node);
+    do_xs_write(xsh, full_path, val);
+}
+
 static void do_xs_write_dom(struct xs_handle *xsh, char *path, char *val)
 {
     char full_path[64];
@@ -325,7 +335,7 @@  int main(int argc, char** argv)
     int opt;
     xc_interface *xch;
     struct xs_handle *xsh;
-    char buf[16];
+    char buf[16], be_path[64], fe_path[64];
     int rv, fd;
     char *maxmem_str = NULL;
 
@@ -414,6 +424,25 @@  int main(int argc, char** argv)
     if (maxmem)
         snprintf(buf, 16, "%d", maxmem * 1024);
     do_xs_write_dom(xsh, "memory/static-max", buf);
+    snprintf(be_path, 64, "/local/domain/0/backend/console/%d/0", domid);
+    snprintf(fe_path, 64, "/local/domain/%d/console", domid);
+    snprintf(buf, 16, "%d", domid);
+    do_xs_write_dir_node(xsh, be_path, "frontend-id", buf);
+    do_xs_write_dir_node(xsh, be_path, "frontend", fe_path);
+    do_xs_write_dir_node(xsh, be_path, "online", "1");
+    snprintf(buf, 16, "%d", XenbusStateInitialising);
+    do_xs_write_dir_node(xsh, be_path, "state", buf);
+    do_xs_write_dir_node(xsh, be_path, "protocol", "vt100");
+    do_xs_write_dir_node(xsh, fe_path, "backend", be_path);
+    do_xs_write_dir_node(xsh, fe_path, "backend-id", "0");
+    do_xs_write_dir_node(xsh, fe_path, "limit", "1048576");
+    do_xs_write_dir_node(xsh, fe_path, "type", "xenconsoled");
+    do_xs_write_dir_node(xsh, fe_path, "output", "pty");
+    do_xs_write_dir_node(xsh, fe_path, "tty", "");
+    snprintf(buf, 16, "%d", console_evtchn);
+    do_xs_write_dir_node(xsh, fe_path, "port", buf);
+    snprintf(buf, 16, "%ld", console_mfn);
+    do_xs_write_dir_node(xsh, fe_path, "ring-ref", buf);
     xs_close(xsh);
 
     fd = creat(XEN_RUN_DIR "/xenstored.pid", 0666);