[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 16/22] mini-os: setup xenbus interface parameters
Juergen Gross, on Tue 23 Aug 2016 17:16:02 +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_xenbus() function from arm specific coding to xenbus/xenbus.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 + > 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 > -- Samuel "...[Linux's] capacity to talk via any medium except smoke signals." (By Dr. Greg Wettstein, Roger Maris Cancer Center) _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |