From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jeremy Fitzhardinge Subject: Re: [PATCH 1/2] hvc_xen: support PV on HVM consoles Date: Wed, 11 Aug 2010 17:48:16 -0700 Message-ID: <4C6344D0.2060604@goop.org> References: <1281366611-21375-1-git-send-email-stefano.stabellini@eu.citrix.com> Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-15; format=flowed Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <1281366611-21375-1-git-send-email-stefano.stabellini@eu.citrix.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xensource.com Errors-To: xen-devel-bounces@lists.xensource.com To: stefano.stabellini@eu.citrix.com Cc: xen-devel@lists.xensource.com List-Id: xen-devel@lists.xenproject.org On 08/09/2010 08:10 AM, stefano.stabellini@eu.citrix.com wrote: > From: Stefano Stabellini How does this work? Should "console=hvc0" just work, along with "xl create -c"? Does it work with earlyprintk=xen? J > Signed-off-by: Stefano Stabellini > --- > drivers/char/hvc_xen.c | 63 ++++++++++++++++++++++++++++++----- > include/xen/interface/hvm/params.h | 6 +++- > 2 files changed, 59 insertions(+), 10 deletions(-) > > diff --git a/drivers/char/hvc_xen.c b/drivers/char/hvc_xen.c > index 60446f8..454a9cd 100644 > --- a/drivers/char/hvc_xen.c > +++ b/drivers/char/hvc_xen.c > @@ -24,9 +24,12 @@ > #include > #include > > +#include > #include > > #include > +#include > +#include > #include > #include > #include > @@ -42,9 +45,13 @@ static int xencons_irq; > /* ------------------------------------------------------------------ */ > > static unsigned long console_pfn = ~0ul; > +static unsigned int console_evtchn = xen_start_info->console.domU.evtchn; > +static struct xencons_interface *xencons_if = NULL; > > static inline struct xencons_interface *xencons_interface(void) > { > + if (xencons_if != NULL) > + return xencons_if; > if (console_pfn == ~0ul) > return mfn_to_virt(xen_start_info->console.domU.mfn); > else > @@ -54,7 +61,7 @@ static inline struct xencons_interface *xencons_interface(void) > static inline void notify_daemon(void) > { > /* Use evtchn: this is called early, before irq is set up. */ > - notify_remote_via_evtchn(xen_start_info->console.domU.evtchn); > + notify_remote_via_evtchn(console_evtchn); > } > > static int __write_console(const char *data, int len) > @@ -130,16 +137,53 @@ static const struct hv_ops hvc_ops = { > .notifier_hangup = notifier_hangup_irq, > }; > > +static int xen_hvm_console_init(void) > +{ > + int r; > + uint64_t v = 0; > + unsigned long mfn; > + > + if (!xen_hvm_domain()) > + return -ENODEV; > + > + if (xencons_if != NULL) > + return -EBUSY; > + > + r = hvm_get_parameter(HVM_PARAM_CONSOLE_EVTCHN,&v); > + if (r< 0) > + return -ENODEV; > + console_evtchn = v; > + hvm_get_parameter(HVM_PARAM_CONSOLE_PFN,&v); > + if (r< 0) > + return -ENODEV; > + mfn = v; > + xencons_if = ioremap(mfn<< PAGE_SHIFT, PAGE_SIZE); > + if (xencons_if == NULL) > + return -ENODEV; > + > + return 0; > +} > + > static int __init xen_init(void) > { > struct hvc_struct *hp; > + int r; > + > + if (!xen_domain() || xen_initial_domain()) > + return -ENODEV; > > - if (!xen_pv_domain() || > - xen_initial_domain() || > - !xen_start_info->console.domU.evtchn) > + if (xen_pv_domain()&& !xen_start_info->console.domU.evtchn) > return -ENODEV; > > - xencons_irq = bind_evtchn_to_irq(xen_start_info->console.domU.evtchn); > + if (xen_pv_domain()) > + console_pfn = mfn_to_pfn(xen_start_info->console.domU.mfn); > + else { > + r = xen_hvm_console_init(); > + if (r< 0) > + return r; > + } > + > + xencons_irq = bind_evtchn_to_irq(console_evtchn); > if (xencons_irq< 0) > xencons_irq = 0; /* NO_IRQ */ > > @@ -149,15 +193,13 @@ static int __init xen_init(void) > > hvc = hp; > > - console_pfn = mfn_to_pfn(xen_start_info->console.domU.mfn); > - > return 0; > } > > void xen_console_resume(void) > { > if (xencons_irq) > - rebind_evtchn_irq(xen_start_info->console.domU.evtchn, xencons_irq); > + rebind_evtchn_irq(console_evtchn, xencons_irq); > } > > static void __exit xen_fini(void) > @@ -168,9 +210,12 @@ static void __exit xen_fini(void) > > static int xen_cons_init(void) > { > - if (!xen_pv_domain()) > + if (!xen_domain()) > return 0; > > + if (xen_hvm_domain()) > + xen_hvm_console_init(); > + > hvc_instantiate(HVC_COOKIE, 0,&hvc_ops); > return 0; > } > diff --git a/include/xen/interface/hvm/params.h b/include/xen/interface/hvm/params.h > index 1888d8c..1b4f923 100644 > --- a/include/xen/interface/hvm/params.h > +++ b/include/xen/interface/hvm/params.h > @@ -90,6 +90,10 @@ > /* Boolean: Enable aligning all periodic vpts to reduce interrupts */ > #define HVM_PARAM_VPT_ALIGN 16 > > -#define HVM_NR_PARAMS 17 > +/* Console debug shared memory ring and event channel */ > +#define HVM_PARAM_CONSOLE_PFN 17 > +#define HVM_PARAM_CONSOLE_EVTCHN 18 > + > +#define HVM_NR_PARAMS 19 > > #endif /* __XEN_PUBLIC_HVM_PARAMS_H__ */