[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 15/22] mini-os: setup console interface parameters
Juergen Gross, on Tue 23 Aug 2016 17:16:01 +0200, wrote: > In order to support HVMlite we need to get the ring page and event > channel from the hypervisor via hypercalls. Move the already existing > get_console() function from arm specific coding to > console/xencons_ring.c and provide a similar paravirtualized function. > > Signed-off-by: Juergen Gross <jgross@xxxxxxxx> Reviewed-by: Samuel Thibault <samuel.thibault@xxxxxxxxxxxx> > --- > arch/arm/setup.c | 16 +--------------- > arch/x86/setup.c | 1 + > console/xencons_ring.c | 38 ++++++++++++++++++++++++++++++-------- > events.c | 2 +- > include/console.h | 3 ++- > 5 files changed, 35 insertions(+), 25 deletions(-) > > diff --git a/arch/arm/setup.c b/arch/arm/setup.c > index cbe67c6..a021616 100644 > --- a/arch/arm/setup.c > +++ b/arch/arm/setup.c > @@ -25,20 +25,6 @@ extern char shared_info_page[PAGE_SIZE]; > > void *device_tree; > > -static void get_console(void) > -{ > - uint64_t v = -1; > - > - hvm_get_parameter(HVM_PARAM_CONSOLE_EVTCHN, &v); > - start_info.console.domU.evtchn = v; > - > - hvm_get_parameter(HVM_PARAM_CONSOLE_PFN, &v); > - start_info.console.domU.mfn = v; > - > - printk("Console is on port %d\n", start_info.console.domU.evtchn); > - printk("Console ring is at mfn %lx\n", (unsigned long) > start_info.console.domU.mfn); > -} > - > void get_xenbus(void) > { > uint64_t value; > @@ -85,7 +71,7 @@ void arch_init(void *dtb_pointer, uint32_t physical_offset) > HYPERVISOR_shared_info = (struct shared_info *)shared_info_page; > > /* Fill in start_info */ > - get_console(); > + get_console(NULL); > get_xenbus(); > > gic_init(); > diff --git a/arch/x86/setup.c b/arch/x86/setup.c > index 8b6bb6e..0c1f2ec 100644 > --- a/arch/x86/setup.c > +++ b/arch/x86/setup.c > @@ -137,6 +137,7 @@ arch_init(void *par) > /* Copy the start_info struct to a globally-accessible area. */ > /* WARN: don't do printk before here, it uses information from > shared_info. Use xprintk instead. */ > + get_console(par); > si = par; > memcpy(&start_info, si, sizeof(*si)); > > diff --git a/console/xencons_ring.c b/console/xencons_ring.c > index 81c8e99..dd64a41 100644 > --- a/console/xencons_ring.c > +++ b/console/xencons_ring.c > @@ -9,27 +9,49 @@ > #include <xen/io/console.h> > #include <xen/io/protocols.h> > #include <xen/io/ring.h> > +#include <xen/hvm/params.h> > #include <mini-os/xmalloc.h> > #include <mini-os/gnttab.h> > #include "console.h" > > DECLARE_WAIT_QUEUE_HEAD(console_queue); > > +static struct xencons_interface *console_ring; > +uint32_t console_evtchn; > + > +#ifdef CONFIG_PARAVIRT > +void get_console(void *p) > +{ > + start_info_t *si = p; > + > + console_ring = mfn_to_virt(si->console.domU.mfn); > + console_evtchn = si->console.domU.evtchn; > +} > +#else > +void get_console(void *p) > +{ > + uint64_t v = -1; > + > + hvm_get_parameter(HVM_PARAM_CONSOLE_EVTCHN, &v); > + console_evtchn = v; > + > + hvm_get_parameter(HVM_PARAM_CONSOLE_PFN, &v); > + console_ring = (struct xencons_interface *)map_frame_virt(v); > +} > +#endif > + > static inline void notify_daemon(struct consfront_dev *dev) > { > /* Use evtchn: this is called early, before irq is set up. */ > if (!dev) > - notify_remote_via_evtchn(start_info.console.domU.evtchn); > + notify_remote_via_evtchn(console_evtchn); > else > notify_remote_via_evtchn(dev->evtchn); > } > > static inline struct xencons_interface *xencons_interface(void) > { > - if (start_info.console.domU.evtchn) > - return mfn_to_virt(start_info.console.domU.mfn); > - else > - return NULL; > + return console_evtchn ? console_ring : NULL; > } > > int xencons_ring_send_no_notify(struct consfront_dev *dev, const char *data, > unsigned len) > @@ -158,7 +180,7 @@ struct consfront_dev *xencons_ring_init(void) > int err; > struct consfront_dev *dev; > > - if (!start_info.console.domU.evtchn) > + if (!console_evtchn) > return 0; > > dev = malloc(sizeof(struct consfront_dev)); > @@ -171,8 +193,8 @@ struct consfront_dev *xencons_ring_init(void) > #ifdef HAVE_LIBC > dev->fd = -1; > #endif > - dev->evtchn = start_info.console.domU.evtchn; > - dev->ring = (struct xencons_interface *) > mfn_to_virt(start_info.console.domU.mfn); > + dev->evtchn = console_evtchn; > + dev->ring = xencons_interface(); > > err = bind_evtchn(dev->evtchn, console_handle_input, dev); > if (err <= 0) { > diff --git a/events.c b/events.c > index 2a23042..76ea617 100644 > --- a/events.c > +++ b/events.c > @@ -46,7 +46,7 @@ void unbind_all_ports(void) > > for ( i = 0; i < NR_EVS; i++ ) > { > - if ( i == start_info.console.domU.evtchn || > + if ( i == console_evtchn || > i == start_info.store_evtchn) > continue; > > diff --git a/include/console.h b/include/console.h > index a77f47f..eb327a8 100644 > --- a/include/console.h > +++ b/include/console.h > @@ -61,7 +61,7 @@ struct consfront_dev { > #endif > }; > > - > +extern uint32_t console_evtchn; > > void print(int direct, const char *fmt, va_list args); > void printk(const char *fmt, ...) __attribute__ ((format (printf, 1, 2))); > @@ -72,6 +72,7 @@ void xprintk(const char *fmt, ...) __attribute__ ((format > (printf, 1, 2))); > void xencons_rx(char *buf, unsigned len, struct pt_regs *regs); > void xencons_tx(void); > > +void get_console(void *p); > void init_console(void); > void console_print(struct consfront_dev *dev, char *data, int length); > void fini_console(struct consfront_dev *dev); > -- > 2.6.6 > -- Samuel /* Amuse the user. */ printk( " \\|/ ____ \\|/\n" " \"@'/ ,. \\`@\"\n" " /_| \\__/ |_\\\n" " \\__U_/\n"); (From linux/arch/sparc/kernel/traps.c:die_if_kernel()) _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |