|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] RE: [PATCH v3 01/10] xen: introduce XEN_DOMCTL_CDF_INTERNAL_directmap
Hi guys
> -----Original Message-----
> From: Penny Zheng <penny.zheng@xxxxxxx>
> Sent: Tuesday, November 16, 2021 1:25 PM
> To: Penny Zheng <Penny.Zheng@xxxxxxx>
> Cc: nd <nd@xxxxxxx>
> Subject: [PATCH v3 01/10] xen: introduce
> XEN_DOMCTL_CDF_INTERNAL_directmap
>
> From: Stefano Stabellini <stefano.stabellini@xxxxxxxxxx>
>
> This commit introduces a new arm-specific flag
> XEN_DOMCTL_CDF_INTERNAL_directmap to specify that a domain should
> have its memory direct-map(guest physical address == physical address) at
> domain creation.
>
> Since this flag is only available for domain created by XEN, not exposed to
> the
> toolstack, we name it with extra "INTERNAL" to distinguish from other public
> XEN_DOMCTL_CDF_xxx flags, and add comments to warn developers not to
> accidently use its bitfield when introducing new XEN_DOMCTL_CDF_xxx flag.
>
> Refine is_domain_direct_mapped to check whether the flag
> XEN_DOMCTL_CDF_INTERNAL_directmap is set.
>
> Signed-off-by: Penny Zheng <penny.zheng@xxxxxxx>
> Signed-off-by: Stefano Stabellini <stefano.stabellini@xxxxxxxxxx>
> ---
> CC: andrew.cooper3@xxxxxxxxxx
> CC: jbeulich@xxxxxxxx
> CC: George Dunlap <George.Dunlap@xxxxxxxxxxxxx>
> CC: Ian Jackson <ian.jackson@xxxxxxxxxxxxx>
> CC: Wei Liu <wl@xxxxxxx>
> CC: "Roger Pau Monné" <roger.pau@xxxxxxxxxx>
> ---
> v2 changes
> - remove the introduce of internal flag
> - remove flag direct_map since we already store this flag in d->options
> - Refine is_domain_direct_mapped to check whether the flag
> XEN_DOMCTL_CDF_directmap is set
> - reword "1:1 direct-map" to just "direct-map"
> ---
> v3 changes
> - move flag back to xen/include/xen/domain.h, to let it be only available for
> domain created by XEN.
> - name it with extra "INTERNAL" and add comments to warn developers not to
> accidently use its bitfield when introducing new XEN_DOMCTL_CDF_xxx flag.
> - reject this flag in x86'es arch_sanitise_domain_config()
> ---
> xen/arch/arm/domain.c | 3 ++-
> xen/arch/arm/domain_build.c | 4 +++-
> xen/arch/x86/domain.c | 6 ++++++
> xen/common/domain.c | 3 ++-
> xen/include/asm-arm/domain.h | 4 ++--
> xen/include/public/domctl.h | 4 ++++
> xen/include/xen/domain.h | 3 +++
> 7 files changed, 22 insertions(+), 5 deletions(-)
>
> diff --git a/xen/arch/arm/domain.c b/xen/arch/arm/domain.c index
> 96e1b23550..d77265c03f 100644
> --- a/xen/arch/arm/domain.c
> +++ b/xen/arch/arm/domain.c
> @@ -629,7 +629,8 @@ int arch_sanitise_domain_config(struct
> xen_domctl_createdomain *config) {
> unsigned int max_vcpus;
> unsigned int flags_required = (XEN_DOMCTL_CDF_hvm |
> XEN_DOMCTL_CDF_hap);
> - unsigned int flags_optional = (XEN_DOMCTL_CDF_iommu |
> XEN_DOMCTL_CDF_vpmu);
> + unsigned int flags_optional = (XEN_DOMCTL_CDF_iommu |
> XEN_DOMCTL_CDF_vpmu |
> + XEN_DOMCTL_CDF_INTERNAL_directmap);
>
> if ( (config->flags & ~flags_optional) != flags_required )
> {
> diff --git a/xen/arch/arm/domain_build.c b/xen/arch/arm/domain_build.c
> index 19487c79da..664c88ebe4 100644
> --- a/xen/arch/arm/domain_build.c
> +++ b/xen/arch/arm/domain_build.c
> @@ -3089,8 +3089,10 @@ static int __init construct_dom0(struct domain *d)
> void __init create_dom0(void) {
> struct domain *dom0;
> + /* DOM0 has always its memory direct-map. */
> struct xen_domctl_createdomain dom0_cfg = {
> - .flags = XEN_DOMCTL_CDF_hvm | XEN_DOMCTL_CDF_hap,
> + .flags = XEN_DOMCTL_CDF_hvm | XEN_DOMCTL_CDF_hap |
> + XEN_DOMCTL_CDF_INTERNAL_directmap,
> .max_evtchn_port = -1,
> .max_grant_frames = gnttab_dom0_frames(),
> .max_maptrack_frames = -1,
> diff --git a/xen/arch/x86/domain.c b/xen/arch/x86/domain.c index
> ef1812dc14..eba6502218 100644
> --- a/xen/arch/x86/domain.c
> +++ b/xen/arch/x86/domain.c
> @@ -692,6 +692,12 @@ int arch_sanitise_domain_config(struct
> xen_domctl_createdomain *config)
> return -EINVAL;
> }
>
> + if ( config->flags & XEN_DOMCTL_CDF_INTERNAL_directmap )
> + {
> + dprintk(XENLOG_INFO, "direct-map cannot be enabled yet\n");
> + return -EINVAL;
> + }
> +
> return 0;
> }
>
> diff --git a/xen/common/domain.c b/xen/common/domain.c index
> 56d47dd664..13ac5950bc 100644
> --- a/xen/common/domain.c
> +++ b/xen/common/domain.c
> @@ -486,7 +486,8 @@ static int sanitise_domain_config(struct
> xen_domctl_createdomain *config)
> ~(XEN_DOMCTL_CDF_hvm | XEN_DOMCTL_CDF_hap |
> XEN_DOMCTL_CDF_s3_integrity | XEN_DOMCTL_CDF_oos_off |
> XEN_DOMCTL_CDF_xs_domain | XEN_DOMCTL_CDF_iommu |
> - XEN_DOMCTL_CDF_nested_virt | XEN_DOMCTL_CDF_vpmu) )
> + XEN_DOMCTL_CDF_nested_virt | XEN_DOMCTL_CDF_vpmu |
> + XEN_DOMCTL_CDF_INTERNAL_directmap) )
> {
> dprintk(XENLOG_INFO, "Unknown CDF flags %#x\n", config->flags);
> return -EINVAL;
> diff --git a/xen/include/asm-arm/domain.h b/xen/include/asm-arm/domain.h
> index 9b3647587a..4f2c3f09d4 100644
> --- a/xen/include/asm-arm/domain.h
> +++ b/xen/include/asm-arm/domain.h
> @@ -29,8 +29,8 @@ enum domain_type {
> #define is_64bit_domain(d) (0)
> #endif
>
> -/* The hardware domain has always its memory direct mapped. */ -#define
> is_domain_direct_mapped(d) is_hardware_domain(d)
> +#define is_domain_direct_mapped(d) \
> + (d->options & XEN_DOMCTL_CDF_INTERNAL_directmap)
>
> struct vtimer {
> struct vcpu *v;
> diff --git a/xen/include/public/domctl.h b/xen/include/public/domctl.h index
> 1c21d4dc75..054e545c97 100644
> --- a/xen/include/public/domctl.h
> +++ b/xen/include/public/domctl.h
> @@ -72,6 +72,10 @@ struct xen_domctl_createdomain {
> #define XEN_DOMCTL_CDF_nested_virt (1U <<
> _XEN_DOMCTL_CDF_nested_virt)
> /* Should we expose the vPMU to the guest? */
> #define XEN_DOMCTL_CDF_vpmu (1U << 7)
> +/*
> + * Be aware that bit 8 has already been occupied by flag
> + * XEN_DOMCTL_CDF_INTERNAL_directmap, defined in
> xen/include/xen/domain.h.
> + */
>
> /* Max XEN_DOMCTL_CDF_* constant. Used for ABI checking. */ #define
> XEN_DOMCTL_CDF_MAX XEN_DOMCTL_CDF_vpmu diff --git
> a/xen/include/xen/domain.h b/xen/include/xen/domain.h index
> 160c8dbdab..2b9edfdcee 100644
> --- a/xen/include/xen/domain.h
> +++ b/xen/include/xen/domain.h
> @@ -28,6 +28,9 @@ void getdomaininfo(struct domain *d, struct
> xen_domctl_getdomaininfo *info); void arch_get_domain_info(const struct
> domain *d,
> struct xen_domctl_getdomaininfo *info);
>
> +/* Should domain memory be directly mapped? */
> +#define XEN_DOMCTL_CDF_INTERNAL_directmap (1U << 8)
> +
I run into some trouble with defining this flag internal in the new serie.
Let me explain in details here:
1. Currently XEN_DOMCTL_CDF_MAX is set to XEN_DOMCTL_CDF_vpmu.
So we can say that XEN_DOMCTL_CDF_MAX knows that there are 8 CDF flags(0 to 7).
The corresponding ocaml tool has a list of CDF flags and currently it knows
that there are 8 CDF flags:
https://xenbits.xen.org/gitweb/?p=xen.git;a=blob;f=tools/ocaml/libs/xc/xenctrl.ml;h=7503031d8f61c2dbcd4aa803738c83e10dfb7bb8;hb=HEAD#l64
This tool performs a check to see if the XEN_DOMCTL_CDF_MAX is equal to the
number of entries in domain_create_flag.
2. Here we are reserving bit 8 for internal flag
XEN_DOMCTL_CDF_INTERNAL_directmap. As this is internal flag,
I do not want to modify XEN_DOMCTL_CDF_MAX.
3. Everything is perfect until someone tries to add another global CDF flag:
#define XEN_DOMCTL_CDF_next_flag (1<<9)
#define XEN_DOMCTL_CDF_MAX XEN_DOMCTL_CDF_next_flag
XEN_DOMCTL_CDF_MAX shows right now that there are 10 flags but ocaml tool sees
only 9.
then we are getting build error.
Hmm, would you please help me find a way to fix this dilemma, thx.
> /*
> * Arch-specifics.
> */
> --
> 2.25.1
Cheers,
Penny Zheng
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |