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_xenbus() function from arm specific coding to xenbus/xenbus.c and provide a similar paravirtualized function.
Signed-off-by: Juergen Gross <jgr...@suse.com> --- arch/arm/setup.c | 16 +--------------- arch/x86/setup.c | 1 + events.c | 3 +-- include/xenbus.h | 3 +++ xenbus/xenbus.c | 40 +++++++++++++++++++++++++++++++--------- 5 files changed, 37 insertions(+), 26 deletions(-) diff --git a/arch/arm/setup.c b/arch/arm/setup.c index a021616..72e025a 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; -void get_xenbus(void) -{ - uint64_t value; - - if (hvm_get_parameter(HVM_PARAM_STORE_EVTCHN, &value)) - BUG(); - - start_info.store_evtchn = (int)value; - - if(hvm_get_parameter(HVM_PARAM_STORE_PFN, &value)) - BUG(); - start_info.store_mfn = (unsigned long)value; -} - /* * INITIAL C ENTRY POINT. */ @@ -72,7 +58,7 @@ void arch_init(void *dtb_pointer, uint32_t physical_offset) /* Fill in start_info */ get_console(NULL); - get_xenbus(); + get_xenbus(NULL); gic_init(); diff --git a/arch/x86/setup.c b/arch/x86/setup.c index 0c1f2ec..6645784 100644 --- a/arch/x86/setup.c +++ b/arch/x86/setup.c @@ -138,6 +138,7 @@ arch_init(void *par) /* WARN: don't do printk before here, it uses information from shared_info. Use xprintk instead. */ get_console(par); + get_xenbus(par); si = par; memcpy(&start_info, si, sizeof(*si)); diff --git a/events.c b/events.c index 76ea617..e8ef8aa 100644 --- a/events.c +++ b/events.c @@ -46,8 +46,7 @@ void unbind_all_ports(void) for ( i = 0; i < NR_EVS; i++ ) { - if ( i == console_evtchn || - i == start_info.store_evtchn) + if ( i == console_evtchn || i == xenbus_evtchn ) continue; if ( test_and_clear_bit(i, bound_ports) ) diff --git a/include/xenbus.h b/include/xenbus.h index d3bb7af..5646a25 100644 --- a/include/xenbus.h +++ b/include/xenbus.h @@ -29,6 +29,9 @@ struct xenbus_event { }; typedef struct xenbus_event *xenbus_event_queue; +extern uint32_t xenbus_evtchn; + +void get_xenbus(void *p); char *xenbus_watch_path_token(xenbus_transaction_t xbt, const char *path, const char *token, xenbus_event_queue *events); char *xenbus_unwatch_path_token(xenbus_transaction_t xbt, const char *path, const char *token); extern struct wait_queue_head xenbus_watch_queue; diff --git a/xenbus/xenbus.c b/xenbus/xenbus.c index 0ab387a..636786c 100644 --- a/xenbus/xenbus.c +++ b/xenbus/xenbus.c @@ -26,6 +26,7 @@ #include <mini-os/sched.h> #include <mini-os/wait.h> #include <xen/io/xs_wire.h> +#include <xen/hvm/params.h> #include <mini-os/spinlock.h> #include <mini-os/xmalloc.h> @@ -62,6 +63,31 @@ struct xenbus_req_info #define NR_REQS 32 static struct xenbus_req_info req_info[NR_REQS]; +uint32_t xenbus_evtchn; + +#ifdef CONFIG_PARAVIRT +void get_xenbus(void *p) +{ + start_info_t *si = p; + + xenbus_evtchn = si->store_evtchn; + xenstore_buf = mfn_to_virt(si->store_mfn); +} +#else +void get_xenbus(void *p) +{ + uint64_t v; + + if ( hvm_get_parameter(HVM_PARAM_STORE_EVTCHN, &v) ) + BUG(); + xenbus_evtchn = v; + + if( hvm_get_parameter(HVM_PARAM_STORE_PFN, &v) ) + BUG(); + xenstore_buf = (struct xenstore_domain_interface *)map_frame_virt(v); +} +#endif + static void memcpy_from_ring(const void *Ring, void *Dest, int off, @@ -269,7 +295,7 @@ static void xenbus_thread_func(void *ign) } wmb(); - notify_remote_via_evtchn(start_info.store_evtchn); + notify_remote_via_evtchn(xenbus_evtchn); } } } @@ -335,15 +361,11 @@ void init_xenbus(void) { int err; DEBUG("init_xenbus called.\n"); - xenstore_buf = mfn_to_virt(start_info.store_mfn); create_thread("xenstore", xenbus_thread_func, NULL); DEBUG("buf at %p.\n", xenstore_buf); - err = bind_evtchn(start_info.store_evtchn, - xenbus_evtchn_handler, - NULL); - unmask_evtchn(start_info.store_evtchn); - printk("xenbus initialised on irq %d mfn %#llx\n", - err, (unsigned long long) start_info.store_mfn); + err = bind_evtchn(xenbus_evtchn, xenbus_evtchn_handler, NULL); + unmask_evtchn(xenbus_evtchn); + printk("xenbus initialised on irq %d\n", err); } void fini_xenbus(void) @@ -425,7 +447,7 @@ static void xb_write(int type, int req_id, xenbus_transaction_t trans_id, xenstore_buf->req_prod += len; /* Send evtchn to notify remote */ - notify_remote_via_evtchn(start_info.store_evtchn); + notify_remote_via_evtchn(xenbus_evtchn); } /* Send a mesasge to xenbus, in the same fashion as xb_write, and -- 2.6.6 _______________________________________________ Xen-devel mailing list Xen-devel@lists.xen.org https://lists.xen.org/xen-devel