[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v3 01/10] xen: introduce XEN_DOMCTL_CDF_INTERNAL_directmap
On 07.12.2021 10:15, Penny Zheng wrote: > 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. This was already outlined, but let me do so again: You do _not_ want to overlay with XEN_DOMCTL_CDF_*. domain_create() already has an internal- only parameter. That's a "bool" right now and wants extending to an "unsigned int" covering both the existing "is_priv" (step 1) and your new "directmap" (step 2). To make visible the relationship, naming the respective constants CDF_* (with no XEN_DOMCTL_ prefix to represent the difference) might be appopriate. Btw, as a result (if that's not the plan already anyway) you then probably also want to decouple is_domain_direct_mapped() from is_hardware_domain(), and hence create Dom0 also with the new flag set. Jan
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |