|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 06/27 v8] xen/arm: vpl011: Add a new domctl API to initialize vpl011
Hi Jan,
On 28 August 2017 at 14:39, Jan Beulich <JBeulich@xxxxxxxx> wrote:
>>>> On 28.08.17 at 10:55, <bhupinder.thakur@xxxxxxxxxx> wrote:
>> Add a new domctl API to initialize vpl011. It takes the GFN and console
>> backend domid as input and returns an event channel to be used for
>> sending and receiving events from Xen.
>>
>> Xen will communicate with xenconsole using GFN as the ring buffer and
>> the event channel to transmit and receive pl011 data on the guest domain's
>> behalf.
>>
>> Signed-off-by: Bhupinder Thakur <bhupinder.thakur@xxxxxxxxxx>
>> ---
>> CC: Ian Jackson <ian.jackson@xxxxxxxxxxxxx>
>> CC: Wei Liu <wei.liu2@xxxxxxxxxx>
>> CC: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
>> CC: George Dunlap <George.Dunlap@xxxxxxxxxxxxx>
>> CC: Jan Beulich <jbeulich@xxxxxxxx>
>> CC: Konrad Rzeszutek Wilk <konrad.wilk@xxxxxxxxxx>
>> CC: Stefano Stabellini <sstabellini@xxxxxxxxxx>
>> CC: Tim Deegan <tim@xxxxxxx>
>> CC: Julien Grall <julien.grall@xxxxxxx>
>>
>> Changes since v6:
>> - Renamed the vuart initialization function to a generic name
>> xc_dom_vuart_init
>> - Used domid_t as a type instead of uint32_t for domid
>> - Checking the vuart type explicitly against vpl011 enum value
>>
>> Changes since v5:
>> - xc_dom_vpl011_init() will be compiled for both x86/arm architectures as
>> there
>> is nothing architecture specific in this function. This function will
>> return
>> error when called for x86.
>> - Fixed coding style issues in libxl.
>>
>> Changes since v4:
>> - Removed libxl__arch_domain_create_finish().
>> - Added a new function libxl__arch_build_dom_finish(), which is called at the
>> last
>> in libxl__build_dom(). This function calls the vpl011 initialization
>> function now.
>>
>> Changes since v3:
>> - Added a new arch specific function libxl__arch_domain_create_finish(),
>> which
>> calls the vpl011 initialization function. For x86 this function does not
>> do
>> anything.
>> - domain_vpl011_init() takes a pointer to a structure which contains all the
>> required information such as console_domid, gfn instead of passing
>> parameters
>> separately.
>> - Dropped a DOMCTL API defined for de-initializing vpl011 as that should be
>> taken care when the domain is destroyed (and not dependent on userspace
>> libraries/applications).
>>
>> Changes since v2:
>> - Replaced the DOMCTL APIs defined for get/set of event channel and GFN with
>> a set of DOMCTL APIs for initializing and de-initializing vpl011 emulation.
>>
>> tools/libxc/include/xenctrl.h | 20 +++++++++++++++++++
>> tools/libxc/xc_domain.c | 25 +++++++++++++++++++++++
>> tools/libxl/libxl_arch.h | 7 +++++++
>> tools/libxl/libxl_arm.c | 22 +++++++++++++++++++++
>> tools/libxl/libxl_dom.c | 4 ++++
>> tools/libxl/libxl_x86.c | 8 ++++++++
>> xen/arch/arm/domain.c | 6 ++++++
>> xen/arch/arm/domctl.c | 46
>> +++++++++++++++++++++++++++++++++++++++++++
>> xen/include/public/domctl.h | 21 ++++++++++++++++++++
>> 9 files changed, 159 insertions(+)
>>
>> diff --git a/tools/libxc/include/xenctrl.h b/tools/libxc/include/xenctrl.h
>> index c7710b8..35bbb3b 100644
>> --- a/tools/libxc/include/xenctrl.h
>> +++ b/tools/libxc/include/xenctrl.h
>> @@ -886,6 +886,26 @@ int xc_vcpu_getcontext(xc_interface *xch,
>> vcpu_guest_context_any_t *ctxt);
>>
>> /**
>> + * This function initializes the vuart emulation and returns
>> + * the event to be used by the backend for communicating with
>> + * the emulation code.
>> + *
>> + * @parm xch a handle to an open hypervisor interface
>> + * #parm type type of vuart
>> + * @parm domid the domain to get information from
>> + * @parm console_domid the domid of the backend console
>> + * @parm gfn the guest pfn to be used as the ring buffer
>> + * @parm evtchn the event channel to be used for events
>> + * @return 0 on success, negative error on failure
>> + */
>> +int xc_dom_vuart_init(xc_interface *xch,
>> + uint32_t type,
>> + domid_t domid,
>> + domid_t console_domid,
>> + xen_pfn_t gfn,
>> + evtchn_port_t *evtchn);
>> +
>> +/**
>> * This function returns information about the XSAVE state of a particular
>> * vcpu of a domain. If extstate->size and extstate->xfeature_mask are 0,
>> * the call is considered a query to retrieve them and the buffer is not
>> diff --git a/tools/libxc/xc_domain.c b/tools/libxc/xc_domain.c
>> index 3bab4e8..d2d5111 100644
>> --- a/tools/libxc/xc_domain.c
>> +++ b/tools/libxc/xc_domain.c
>> @@ -343,6 +343,31 @@ int xc_domain_get_guest_width(xc_interface *xch,
>> uint32_t domid,
>> return 0;
>> }
>>
>> +int xc_dom_vuart_init(xc_interface *xch,
>> + uint32_t type,
>> + domid_t domid,
>> + domid_t console_domid,
>> + xen_pfn_t gfn,
>> + evtchn_port_t *evtchn)
>> +{
>> + DECLARE_DOMCTL;
>> + int rc = 0;
>> +
>> + domctl.cmd = XEN_DOMCTL_vuart_op;
>> + domctl.domain = domid;
>> + domctl.u.vuart_op.cmd = XEN_DOMCTL_VUART_OP_INIT;
>> + domctl.u.vuart_op.type = type;
>> + domctl.u.vuart_op.console_domid = console_domid;
>> + domctl.u.vuart_op.gfn = gfn;
>> +
>> + if ( (rc = do_domctl(xch, &domctl)) < 0 )
>> + return rc;
>> +
>> + *evtchn = domctl.u.vuart_op.evtchn;
>> +
>> + return rc;
>> +}
>> +
>> int xc_domain_getinfo(xc_interface *xch,
>> uint32_t first_domid,
>> unsigned int max_doms,
>> diff --git a/tools/libxl/libxl_arch.h b/tools/libxl/libxl_arch.h
>> index 5e1fc60..784ec7f 100644
>> --- a/tools/libxl/libxl_arch.h
>> +++ b/tools/libxl/libxl_arch.h
>> @@ -44,6 +44,13 @@ int libxl__arch_domain_finalise_hw_description(libxl__gc
>> *gc,
>> libxl_domain_build_info *info,
>> struct xc_dom_image *dom);
>>
>> +/* perform any pending hardware initialization */
>> +_hidden
>> +int libxl__arch_build_dom_finish(libxl__gc *gc,
>> + libxl_domain_build_info *info,
>> + struct xc_dom_image *dom,
>> + libxl__domain_build_state *state);
>> +
>> /* build vNUMA vmemrange with arch specific information */
>> _hidden
>> int libxl__arch_vnuma_build_vmemrange(libxl__gc *gc,
>> diff --git a/tools/libxl/libxl_arm.c b/tools/libxl/libxl_arm.c
>> index d842d88..b8147f0 100644
>> --- a/tools/libxl/libxl_arm.c
>> +++ b/tools/libxl/libxl_arm.c
>> @@ -1038,6 +1038,28 @@ int
>> libxl__arch_domain_finalise_hw_description(libxl__gc *gc,
>> return 0;
>> }
>>
>> +int libxl__arch_build_dom_finish(libxl__gc *gc,
>> + libxl_domain_build_info *info,
>> + struct xc_dom_image *dom,
>> + libxl__domain_build_state *state)
>> +{
>> + int rc = 0;
>> +
>> + if (info->arch_arm.vuart != LIBXL_VUART_TYPE_SBSA_UART)
>> + return rc;
>> +
>> + rc = xc_dom_vuart_init(CTX->xch,
>> + XEN_DOMCTL_VUART_TYPE_VPL011,
>> + dom->guest_domid,
>> + dom->console_domid,
>> + dom->vuart_gfn,
>> + &state->vuart_port);
>> + if (rc < 0)
>> + LOG(ERROR, "xc_dom_vuart_init failed\n");
>> +
>> + return rc;
>> +}
>> +
>> int libxl__arch_vnuma_build_vmemrange(libxl__gc *gc,
>> uint32_t domid,
>> libxl_domain_build_info *info,
>> diff --git a/tools/libxl/libxl_dom.c b/tools/libxl/libxl_dom.c
>> index e0f0d78..5f92023 100644
>> --- a/tools/libxl/libxl_dom.c
>> +++ b/tools/libxl/libxl_dom.c
>> @@ -702,6 +702,10 @@ static int libxl__build_dom(libxl__gc *gc, uint32_t
>> domid,
>> LOGE(ERROR, "xc_dom_gnttab_init failed");
>> goto out;
>> }
>> + if ((ret = libxl__arch_build_dom_finish(gc, info, dom, state)) != 0) {
>> + LOGE(ERROR, "libxl__arch_build_dom_finish failed");
>> + goto out;
>> + }
>>
>> out:
>> return ret != 0 ? ERROR_FAIL : 0;
>> diff --git a/tools/libxl/libxl_x86.c b/tools/libxl/libxl_x86.c
>> index 455f6f0..0aaeded 100644
>> --- a/tools/libxl/libxl_x86.c
>> +++ b/tools/libxl/libxl_x86.c
>> @@ -391,6 +391,14 @@ int libxl__arch_domain_finalise_hw_description(libxl__gc
>> *gc,
>> return rc;
>> }
>>
>> +int libxl__arch_build_dom_finish(libxl__gc *gc,
>> + libxl_domain_build_info *info,
>> + struct xc_dom_image *dom,
>> + libxl__domain_build_state *state)
>> +{
>> + return 0;
>> +}
>> +
>> /* Return 0 on success, ERROR_* on failure. */
>> int libxl__arch_vnuma_build_vmemrange(libxl__gc *gc,
>> uint32_t domid,
>> diff --git a/xen/arch/arm/domain.c b/xen/arch/arm/domain.c
>> index eeebbdb..85accdf 100644
>> --- a/xen/arch/arm/domain.c
>> +++ b/xen/arch/arm/domain.c
>> @@ -857,6 +857,12 @@ int domain_relinquish_resources(struct domain *d)
>> if ( ret )
>> return ret;
>>
>> + /*
>> + * Release the resources allocated for vpl011 which were
>> + * allocated via a DOMCTL call XEN_DOMCTL_vuart_op.
>> + */
>> + domain_vpl011_deinit(d);
>> +
>> d->arch.relmem = RELMEM_xen;
>> /* Fallthrough */
>>
>> diff --git a/xen/arch/arm/domctl.c b/xen/arch/arm/domctl.c
>> index db6838d..ea91731 100644
>> --- a/xen/arch/arm/domctl.c
>> +++ b/xen/arch/arm/domctl.c
>> @@ -5,9 +5,11 @@
>> */
>>
>> #include <xen/errno.h>
>> +#include <xen/guest_access.h>
>> #include <xen/hypercall.h>
>> #include <xen/iocap.h>
>> #include <xen/lib.h>
>> +#include <xen/mm.h>
>> #include <xen/sched.h>
>> #include <xen/types.h>
>> #include <xsm/xsm.h>
>> @@ -20,6 +22,29 @@ void arch_get_domain_info(const struct domain *d,
>> info->flags |= XEN_DOMINF_hap;
>> }
>>
>> +static int handle_vuart_init(struct domain *d,
>> + struct xen_domctl_vuart_op *vuart_op)
>> +{
>> + int rc;
>> + struct vpl011_init_info info;
>> +
>> + info.console_domid = vuart_op->console_domid;
>> + info.gfn = _gfn(vuart_op->gfn);
>> +
>> + if ( d->creation_finished )
>> + return -EPERM;
>> +
>> + if ( vuart_op->type != XEN_DOMCTL_VUART_TYPE_VPL011 )
>> + return -EOPNOTSUPP;
>> +
>> + rc = domain_vpl011_init(d, &info);
>> +
>> + if ( !rc )
>> + vuart_op->evtchn = info.evtchn;
>> +
>> + return rc;
>> +}
>> +
>> long arch_do_domctl(struct xen_domctl *domctl, struct domain *d,
>> XEN_GUEST_HANDLE_PARAM(xen_domctl_t) u_domctl)
>> {
>> @@ -119,6 +144,27 @@ long arch_do_domctl(struct xen_domctl *domctl, struct
>> domain *d,
>> d->disable_migrate = domctl->u.disable_migrate.disable;
>> return 0;
>>
>> + case XEN_DOMCTL_vuart_op:
>> + {
>> + int rc;
>> + struct xen_domctl_vuart_op *vuart_op = &domctl->u.vuart_op;
>> +
>> + switch( vuart_op->cmd )
>> + {
>> + case XEN_DOMCTL_VUART_OP_INIT:
>> + rc = handle_vuart_init(d, vuart_op);
>> + break;
>> +
>> + default:
>> + rc = -EINVAL;
>> + break;
>> + }
>> +
>> + if ( !rc )
>> + rc = __copy_to_guest(u_domctl, domctl, 1);
>> +
>> + return rc;
>> + }
>> default:
>> {
>> int rc;
>> diff --git a/xen/include/public/domctl.h b/xen/include/public/domctl.h
>> index 0669c31..ed2ea80 100644
>> --- a/xen/include/public/domctl.h
>> +++ b/xen/include/public/domctl.h
>> @@ -36,6 +36,7 @@
>> #include "grant_table.h"
>> #include "hvm/save.h"
>> #include "memory.h"
>> +#include "event_channel.h"
>>
>> #define XEN_DOMCTL_INTERFACE_VERSION 0x0000000e
>>
>> @@ -1148,6 +1149,24 @@ struct xen_domctl_psr_cat_op {
>> uint32_t target; /* IN */
>> uint64_t data; /* IN/OUT */
>> };
>> +
>> +struct xen_domctl_vuart_op {
>> +#define XEN_DOMCTL_VUART_OP_INIT 0
>> + uint32_t cmd; /* XEN_DOMCTL_VUART_OP_* */
>> +#define XEN_DOMCTL_VUART_TYPE_VPL011 0
>> + uint32_t type; /* IN - type of vuart.
>> + * Currently only vpl011 supported.
>> + */
>> + uint64_aligned_t gfn; /* IN - guest gfn to be used as a
>> + * ring buffer.
>> + */
>> + evtchn_port_t evtchn; /* OUT - remote port of the event
>> + * channel used for sending
>> + * ring buffer events.
>> + */
>> + domid_t console_domid; /* IN */
>> +};
>> +
>> typedef struct xen_domctl_psr_cat_op xen_domctl_psr_cat_op_t;
>> DEFINE_XEN_GUEST_HANDLE(xen_domctl_psr_cat_op_t);
>
> Irrespective of whether this is an appropriate addition (which
> mainly the ARM maintainers should judge about, it is being
> inserted at the wrong place (in the middle of PSR stuff). Also
I will move the vuart structure after the PSR definitions.
> I'm pretty certain I had asked before that all padding be made
> explicit and be checked to be zero.
I will add explicit padding and check it against 0.
As a side note, I also find
> it odd for IN and OUT pieces to be intermixed, instead of all
> INs preceding all OUTs.
I will fix this.
Regards,
Bhupinder
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |