[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH RFC v1 57/74] x86/pv-shim: shadow PV console's page for L2 DomU
>>> On 04.01.18 at 14:06, <wei.liu2@xxxxxxxxxx> wrote: > @@ -125,13 +127,28 @@ void __init pv_shim_setup_dom(struct domain *d, > l4_pgentry_t *l4start, > }) > SET_AND_MAP_PARAM(HVM_PARAM_STORE_PFN, si->store_mfn, store_va); > SET_AND_MAP_PARAM(HVM_PARAM_STORE_EVTCHN, si->store_evtchn, 0); > + SET_AND_MAP_PARAM(HVM_PARAM_CONSOLE_EVTCHN, si->console.domU.evtchn, 0); > if ( !pv_console ) > - { > SET_AND_MAP_PARAM(HVM_PARAM_CONSOLE_PFN, si->console.domU.mfn, > console_va); > - SET_AND_MAP_PARAM(HVM_PARAM_CONSOLE_EVTCHN, si->console.domU.evtchn, > 0); > - } > #undef SET_AND_MAP_PARAM > + else > + { > + /* Allocate a new page for DomU's PV console */ > + void *page = alloc_xenheap_pages(0, MEMF_bits(32)); > + uint64_t console_mfn; > + > + ASSERT(page); > + clear_page(page); > + console_mfn = virt_to_mfn(page); > + si->console.domU.mfn = console_mfn; > + share_xen_page_with_guest(mfn_to_page(console_mfn), d, > + XENSHARE_writable); > + replace_va(d, l4start, console_va, console_mfn); > + dom0_update_physmap(d, (console_va - va_start) >> PAGE_SHIFT, > + console_mfn, vphysmap); > + consoled_set_ring_addr(page); This looks to be a fair part of SET_AND_MAP_PARAM(), so I think this wants breaking out as a separate macro. > +size_t consoled_guest_rx(void) > +{ > + size_t recv = 0, idx = 0; > + XENCONS_RING_IDX cons, prod; > + > + if ( !cons_ring ) > + return 0; > + > + spin_lock(&rx_lock); > + > + cons = cons_ring->out_cons; > + prod = ACCESS_ONCE(cons_ring->out_prod); > + ASSERT((prod - cons) <= sizeof(cons_ring->out)); > + > + /* Is the ring empty? */ > + if ( cons == prod ) > + goto out; > + > + /* Update pointers before accessing the ring */ > + smp_rmb(); I think this need to move up ahead of the if(). In the comment perhaps s/Update/Latch/? > +size_t consoled_guest_tx(char c) > +{ > + size_t sent = 0; > + XENCONS_RING_IDX cons, prod; > + > + if ( !cons_ring ) > + return 0; > + > + cons = ACCESS_ONCE(cons_ring->in_cons); > + prod = cons_ring->in_prod; > + ASSERT((prod - cons) <= sizeof(cons_ring->in)); > + > + /* Is the ring out of space? */ > + if ( sizeof(cons_ring->in) - (prod - cons) == 0 ) > + goto notify; > + > + /* Update pointers before accessing the ring */ > + smp_rmb(); Same here. > --- /dev/null > +++ b/xen/include/xen/consoled.h > @@ -0,0 +1,27 @@ > +#ifndef __XEN_CONSOLED_H__ > +#define __XEN_CONSOLED_H__ > + > +#include <public/io/console.h> > + > +#ifdef CONFIG_PV_SHIM > + > +void consoled_set_ring_addr(struct xencons_interface *ring); > +struct xencons_interface *consoled_get_ring_addr(void); > +size_t consoled_guest_rx(void); > +size_t consoled_guest_tx(char c); > + > +#else > + > +size_t consoled_guest_tx(char c) { return 0; } static inline Jan _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |