From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1MEmkP-0006CI-Jr for qemu-devel@nongnu.org; Thu, 11 Jun 2009 12:03:25 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1MEmkL-00068c-UF for qemu-devel@nongnu.org; Thu, 11 Jun 2009 12:03:25 -0400 Received: from [199.232.76.173] (port=57049 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1MEmkL-00068U-Ft for qemu-devel@nongnu.org; Thu, 11 Jun 2009 12:03:21 -0400 Received: from smtp.citrix.com ([66.165.176.89]:48280) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1MEmkK-0005yH-9u for qemu-devel@nongnu.org; Thu, 11 Jun 2009 12:03:20 -0400 Message-ID: <4A312BA3.4030301@eu.citrix.com> Date: Thu, 11 Jun 2009 17:06:59 +0100 From: Stefano Stabellini MIME-Version: 1.0 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: 7bit Subject: [Qemu-devel] implement support for secondary consoles in the console backend List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: xen-devel Cc: "qemu-devel@nongnu.org" This patch adds support for secondary consoles in the console backend. Signed-off-by: Stefano Stabellini --- diff --git a/hw/xen_console.c b/hw/xen_console.c index 27f809d..0d8f654 100644 --- a/hw/xen_console.c +++ b/hw/xen_console.c @@ -185,7 +185,10 @@ static int con_init(struct XenDevice *xendev) /* setup */ dom = xs_get_domain_path(xenstore, con->xendev.dom); - snprintf(con->console, sizeof(con->console), "%s/console", dom); + if (!xendev->dev) + snprintf(con->console, sizeof(con->console), "%s/console", dom); + else + snprintf(con->console, sizeof(con->console), "%s/device/console/%d", dom, xendev->dev); free(dom); type = xenstore_read_str(con->console, "type"); @@ -215,10 +218,15 @@ static int con_connect(struct XenDevice *xendev) if (xenstore_read_int(con->console, "limit", &limit) == 0) con->buffer.max_capacity = limit; - con->sring = xc_map_foreign_range(xen_xc, con->xendev.dom, - XC_PAGE_SIZE, - PROT_READ|PROT_WRITE, - con->ring_ref); + if (!xendev->dev) + con->sring = xc_map_foreign_range(xen_xc, con->xendev.dom, + XC_PAGE_SIZE, + PROT_READ|PROT_WRITE, + con->ring_ref); + else + con->sring = xc_gnttab_map_grant_ref(xendev->gnttabdev, con->xendev.dom, + con->ring_ref, + PROT_READ|PROT_WRITE); if (!con->sring) return -1; @@ -244,7 +252,10 @@ static void con_disconnect(struct XenDevice *xendev) xen_be_unbind_evtchn(&con->xendev); if (con->sring) { - munmap(con->sring, XC_PAGE_SIZE); + if (!xendev->dev) + munmap(con->sring, XC_PAGE_SIZE); + else + xc_gnttab_munmap(xendev->gnttabdev, con->sring, 1); con->sring = NULL; } } @@ -262,9 +273,10 @@ static void con_event(struct XenDevice *xendev) struct XenDevOps xen_console_ops = { .size = sizeof(struct XenConsole), - .flags = DEVOPS_FLAG_IGNORE_STATE, + .flags = DEVOPS_FLAG_IGNORE_STATE|DEVOPS_FLAG_NEED_GNTDEV, .init = con_init, .connect = con_connect, .event = con_event, .disconnect = con_disconnect, }; +