[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Minios-devel] [PATCH v2 15/22] mini-os: setup console interface parameters
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 _______________________________________________ Minios-devel mailing list Minios-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/cgi-bin/mailman/listinfo/minios-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |