Initialize xencons_interface's connection field to XENCONSOLE_DISCONNECTED. xenconsoled will mark the page as connected when it establishes the connection.
Signed-off-by: Jason Andryuk <jason.andr...@amd.com> --- xc_dom_console_init() seems closer to the functionality of the gnttab functions, so I put it in xg_dom_boot.c. It can't take a struct xc_dom_image pointer when used with save/restore. v2: New --- tools/include/xenguest.h | 2 ++ tools/libs/guest/xg_dom_arm.c | 2 +- tools/libs/guest/xg_dom_boot.c | 20 ++++++++++++++++++++ tools/libs/guest/xg_dom_x86.c | 6 +++--- 4 files changed, 26 insertions(+), 4 deletions(-) diff --git a/tools/include/xenguest.h b/tools/include/xenguest.h index e01f494b77..1d5a6d3509 100644 --- a/tools/include/xenguest.h +++ b/tools/include/xenguest.h @@ -335,6 +335,8 @@ void *xc_dom_boot_domU_map(struct xc_dom_image *dom, xen_pfn_t pfn, xen_pfn_t count); int xc_dom_boot_image(struct xc_dom_image *dom); int xc_dom_compat_check(struct xc_dom_image *dom); +int xc_dom_console_init(xc_interface *xch, uint32_t guest_domid, + xen_pfn_t console_gfn); int xc_dom_gnttab_init(struct xc_dom_image *dom); int xc_dom_gnttab_seed(xc_interface *xch, uint32_t guest_domid, bool is_hvm, diff --git a/tools/libs/guest/xg_dom_arm.c b/tools/libs/guest/xg_dom_arm.c index 2fd8ee7ad4..c8d0918506 100644 --- a/tools/libs/guest/xg_dom_arm.c +++ b/tools/libs/guest/xg_dom_arm.c @@ -70,7 +70,7 @@ static int alloc_magic_pages(struct xc_dom_image *dom) dom->xenstore_pfn = base + XENSTORE_PFN_OFFSET; dom->vuart_gfn = base + VUART_PFN_OFFSET; - xc_clear_domain_page(dom->xch, dom->guest_domid, dom->console_pfn); + xc_dom_console_init(dom->xch, dom->guest_domid, dom->console_pfn); xc_clear_domain_page(dom->xch, dom->guest_domid, dom->xenstore_pfn); xc_clear_domain_page(dom->xch, dom->guest_domid, base + MEMACCESS_PFN_OFFSET); xc_clear_domain_page(dom->xch, dom->guest_domid, dom->vuart_gfn); diff --git a/tools/libs/guest/xg_dom_boot.c b/tools/libs/guest/xg_dom_boot.c index 5c7e12221d..b5f248e642 100644 --- a/tools/libs/guest/xg_dom_boot.c +++ b/tools/libs/guest/xg_dom_boot.c @@ -34,6 +34,7 @@ #include "xg_core.h" #include <xen/hvm/params.h> #include <xen/grant_table.h> +#include <xen/io/console.h> /* ------------------------------------------------------------------------ */ @@ -427,6 +428,25 @@ int xc_dom_gnttab_init(struct xc_dom_image *dom) dom->console_domid, dom->xenstore_domid); } +int xc_dom_console_init(xc_interface *xch, + uint32_t domid, + unsigned long dst_pfn) +{ + const size_t size = PAGE_SIZE; + struct xencons_interface *xencons = xc_map_foreign_range( + xch, domid, size, PROT_WRITE, dst_pfn); + + if ( xencons == NULL ) + return -1; + + memset(xencons, 0, size); + xencons->connection = XENCONSOLE_DISCONNECTED; + + munmap(xencons, size); + xc_domain_cacheflush(xch, domid, dst_pfn, 1); + return 0; +} + /* * Local variables: * mode: C diff --git a/tools/libs/guest/xg_dom_x86.c b/tools/libs/guest/xg_dom_x86.c index cba01384ae..a82b481a12 100644 --- a/tools/libs/guest/xg_dom_x86.c +++ b/tools/libs/guest/xg_dom_x86.c @@ -587,8 +587,8 @@ static int alloc_magic_pages_pv(struct xc_dom_image *dom) dom->console_pfn = xc_dom_alloc_page(dom, "console"); if ( dom->console_pfn == INVALID_PFN ) return -1; - xc_clear_domain_page(dom->xch, dom->guest_domid, - xc_dom_p2m(dom, dom->console_pfn)); + xc_dom_console_init(dom->xch, dom->guest_domid, + xc_dom_p2m(dom, dom->console_pfn)); dom->alloc_bootstack = 1; @@ -734,7 +734,7 @@ static int alloc_magic_pages_hvm(struct xc_dom_image *dom) special_pfn(SPECIALPAGE_IDENT_PT) << PAGE_SHIFT); dom->console_pfn = special_pfn(SPECIALPAGE_CONSOLE); - xc_clear_domain_page(dom->xch, dom->guest_domid, dom->console_pfn); + xc_dom_console_init(dom->xch, dom->guest_domid, dom->console_pfn); dom->xenstore_pfn = special_pfn(SPECIALPAGE_XENSTORE); xc_clear_domain_page(dom->xch, dom->guest_domid, dom->xenstore_pfn); -- 2.50.1