[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 02/10] xen/arm: vpl011: Add new virtual console hvm params in Xen
On Mon, 3 Apr 2017, Bhupinder Thakur wrote: > 1. Add two new HVM param handlers for: > - Allocate a new event channel for sending/receiving events to/from Xen. > - Map the PFN allocted by the toolstack to be used as IN/OUT ring buffers. > > 2. Add validation to disallow get/set of these HVM params from guest > domain. > > Xen will communicate with xenconsole over the ring buffer and the event > channel to transmit and receive pl011 data on guest domain's behalf. > > Signed-off-by: Bhupinder Thakur <bhupinder.thakur@xxxxxxxxxx> > --- > xen/arch/arm/hvm.c | 112 > ++++++++++++++++++++++++++++++++++++++++ > xen/include/public/hvm/params.h | 10 ++++ > 2 files changed, 122 insertions(+) > > diff --git a/xen/arch/arm/hvm.c b/xen/arch/arm/hvm.c > index d999bde..c1fed45 100644 > --- a/xen/arch/arm/hvm.c > +++ b/xen/arch/arm/hvm.c > @@ -23,6 +23,8 @@ > #include <xen/guest_access.h> > #include <xen/sched.h> > #include <xen/monitor.h> > +#include <xen/event.h> > +#include <xen/vmap.h> > > #include <xsm/xsm.h> > > @@ -31,6 +33,80 @@ > #include <public/hvm/hvm_op.h> > > #include <asm/hypercall.h> > +#include <xen/vpl011.h> > + > +static bool vpl011_built(void) > +{ > +#ifdef CONFIG_VPL011_CONSOLE > + return true; > +#else > + return false; > +#endif > +} > + > +static int hvm_allow_set_param(struct domain *d, > + const struct xen_hvm_param *a) > +{ > + uint64_t value = d->arch.hvm_domain.params[a->index]; > + int rc; > + > + rc = xsm_hvm_param(XSM_TARGET, d, HVMOP_set_param); > + if ( rc ) > + return rc; > + > + switch ( a->index ) > + { > + /* The following parameters should not be set by the guest. */ > + case HVM_PARAM_VCONSOLE_PFN: > + case HVM_PARAM_VCONSOLE_EVTCHN: > + if ( d == current->domain ) > + rc = -EPERM; > + break; > + default: > + break; > + } > + > + if ( rc ) > + return rc; > + > + switch ( a->index ) > + { > + /* The following parameters should only be changed once. */ > + case HVM_PARAM_VCONSOLE_PFN: > + case HVM_PARAM_VCONSOLE_EVTCHN: > + if ( value != 0 && a->value != value ) > + rc = -EEXIST; > + break; > + default: > + break; > + } > + > + return rc; > +} > + > +static int hvm_allow_get_param(struct domain *d, > + const struct xen_hvm_param *a) > +{ > + int rc; > + > + rc = xsm_hvm_param(XSM_TARGET, d, HVMOP_get_param); > + if ( rc ) > + return rc; > + > + switch ( a->index ) > + { > + /* The remaining parameters should not be read by the guest. */ > + case HVM_PARAM_VCONSOLE_PFN: > + case HVM_PARAM_VCONSOLE_EVTCHN: > + if ( d == current->domain ) > + rc = -EPERM; > + break; > + default: > + break; > + } > + > + return rc; > +} > > long do_hvm_op(unsigned long op, XEN_GUEST_HANDLE_PARAM(void) arg) > { > @@ -61,9 +137,45 @@ long do_hvm_op(unsigned long op, > XEN_GUEST_HANDLE_PARAM(void) arg) > if ( op == HVMOP_set_param ) > { > d->arch.hvm_domain.params[a.index] = a.value; > + > + if ( a.index == HVM_PARAM_VCONSOLE_PFN || > + a.index == HVM_PARAM_VCONSOLE_EVTCHN ) > + { > + if ( vpl011_built() ) Code style: we only use spaces for indentation in Xen. Please fix across the series. Also, I would move the "if ( vpl011_built() )" check to hvm_allow_set_param and hvm_allow_get_param. > + { > + rc = hvm_allow_set_param(d, &a); > + if ( rc ) > + goto param_fail; > + > + if ( a.index == HVM_PARAM_VCONSOLE_PFN ) > + { > + rc = vpl011_map_guest_page(d); > + if ( rc ) > + goto param_fail; > + } > + } > + else > + { > + rc = -1; > + goto param_fail; > + } > + } > } > else > { > + if ( a.index == HVM_PARAM_VCONSOLE_PFN || > + a.index == HVM_PARAM_VCONSOLE_EVTCHN ) > + { > + if ( !vpl011_built() ) > + { > + rc = -1; > + goto param_fail; > + } > + } > + rc = hvm_allow_get_param(d, &a); > + if ( rc ) > + goto param_fail; > + > a.value = d->arch.hvm_domain.params[a.index]; > rc = copy_to_guest(arg, &a, 1) ? -EFAULT : 0; > } > diff --git a/xen/include/public/hvm/params.h b/xen/include/public/hvm/params.h > index 3f54a49..15d37e5 100644 > --- a/xen/include/public/hvm/params.h > +++ b/xen/include/public/hvm/params.h > @@ -203,10 +203,20 @@ > */ > #define HVM_PARAM_ACPI_IOPORTS_LOCATION 19 > > +#if defined(__arm__) || defined(__aarch64__) > +/* Virtual console (VC) shared memory ring and event channel. */ > +#define HVM_PARAM_VCONSOLE_PFN 20 > +#define HVM_PARAM_VCONSOLE_EVTCHN 21 > +#else > /* Deprecated */ > #define HVM_PARAM_MEMORY_EVENT_CR0 20 > #define HVM_PARAM_MEMORY_EVENT_CR3 21 > +#endif > + > +/* Deprecated */ > #define HVM_PARAM_MEMORY_EVENT_CR4 22 > + > +/* Deprecated */ > #define HVM_PARAM_MEMORY_EVENT_INT3 23 > #define HVM_PARAM_MEMORY_EVENT_SINGLE_STEP 25 > #define HVM_PARAM_MEMORY_EVENT_MSR 30 > -- > 2.7.4 > _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |