|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH v1 3/3] xen: introduce CONFIG_HAS_DOMAIN_TYPE
As domain type is part of common code now there is no any reason
to have architecture-specific set_domain_type() functions so
it is dropped.
The CONFIG_ARM_64 guard in xen/arch/arm/domain_build.c is intentionally
left unchanged: it is ARM-specific code, and ARM_64 selects
HAS_DOMAIN_TYPE, so the semantics are identical.
x86 with CONFIG_64BIT=y shouldn't use is_{32,64}bit_domain() as
x86 doesn't have support of CONFIG_HAS_DOMAIN_TYPE. For x86_32
it is fine to follow generic is_{32,64}_bit_domain() implementations.
Generally it probably would be better to introduce CONFIG_32BIT
and use it to define is_{32,64}bit_domain() as if one day
CONFIG_128BIT will be introduced is_{32,64}bit_domain() will be
defined incorrectly but considering that CONFIG_64BIT is maximum
supported bitness it is fine to define in this way.
Signed-off-by: Oleksii Kurochko <oleksii.kurochko@xxxxxxxxx>
---
xen/arch/Kconfig | 3 +++
xen/arch/arm/Kconfig | 1 +
xen/arch/arm/arm64/domctl.c | 4 ++--
xen/arch/arm/dom0less-build.c | 14 --------------
xen/arch/arm/domain_build.c | 8 ++++----
xen/arch/arm/include/asm/domain.h | 12 ------------
xen/arch/arm/include/asm/kernel.h | 4 ----
xen/arch/arm/kernel.c | 10 +++++-----
xen/common/device-tree/dom0less-build.c | 5 ++++-
xen/include/xen/dom0less-build.h | 2 --
xen/include/xen/domain.h | 13 +++++++++++++
xen/include/xen/fdt-kernel.h | 5 +++++
xen/include/xen/sched.h | 4 ++++
13 files changed, 41 insertions(+), 44 deletions(-)
diff --git a/xen/arch/Kconfig b/xen/arch/Kconfig
index f9230bfaf872..6c53149f7ee1 100644
--- a/xen/arch/Kconfig
+++ b/xen/arch/Kconfig
@@ -1,6 +1,9 @@
config 64BIT
bool
+config HAS_DOMAIN_TYPE
+ bool
+
config PHYS_ADDR_T_32
bool
diff --git a/xen/arch/arm/Kconfig b/xen/arch/arm/Kconfig
index 2f2b501fdac4..79622b46a10d 100644
--- a/xen/arch/arm/Kconfig
+++ b/xen/arch/arm/Kconfig
@@ -7,6 +7,7 @@ config ARM_64
def_bool y
depends on !ARM_32
select 64BIT
+ select HAS_DOMAIN_TYPE
select HAS_FAST_MULTIPLY
select HAS_VPCI_GUEST_SUPPORT if PCI_PASSTHROUGH
diff --git a/xen/arch/arm/arm64/domctl.c b/xen/arch/arm/arm64/domctl.c
index 8720d126c97d..9e9a29eb1e78 100644
--- a/xen/arch/arm/arm64/domctl.c
+++ b/xen/arch/arm/arm64/domctl.c
@@ -21,10 +21,10 @@ static long switch_mode(struct domain *d, enum domain_type
type)
return -EINVAL;
if ( domain_tot_pages(d) != 0 )
return -EBUSY;
- if ( d->arch.type == type )
+ if ( d->type == type )
return 0;
- d->arch.type = type;
+ d->type = type;
if ( is_64bit_domain(d) )
for_each_vcpu(d, v)
diff --git a/xen/arch/arm/dom0less-build.c b/xen/arch/arm/dom0less-build.c
index 4181c105389a..6f73c65e5151 100644
--- a/xen/arch/arm/dom0less-build.c
+++ b/xen/arch/arm/dom0less-build.c
@@ -237,20 +237,6 @@ int __init make_arch_nodes(struct kernel_info *kinfo)
return 0;
}
-/* TODO: make arch.type generic ? */
-#ifdef CONFIG_ARM_64
-void __init set_domain_type(struct domain *d, struct kernel_info *kinfo)
-{
- /* type must be set before allocate memory */
- d->arch.type = kinfo->arch.type;
-}
-#else
-void __init set_domain_type(struct domain *d, struct kernel_info *kinfo)
-{
- /* Nothing to do */
-}
-#endif
-
int __init init_vuart(struct domain *d, struct kernel_info *kinfo,
const struct dt_device_node *node)
{
diff --git a/xen/arch/arm/domain_build.c b/xen/arch/arm/domain_build.c
index 6740da3d324b..2fd89b3a1345 100644
--- a/xen/arch/arm/domain_build.c
+++ b/xen/arch/arm/domain_build.c
@@ -1178,7 +1178,7 @@ int __init make_cpus_node(const struct domain *d, struct
kernel_info *kinfo)
/* Keep the compiler happy with -Og */
bool clock_valid = false;
uint64_t mpidr_aff;
- void *fdt = kinfo;
+ void *fdt = kinfo->fdt;
dt_dprintk("Create cpus node\n");
@@ -1774,13 +1774,13 @@ int __init construct_domain(struct domain *d, struct
kernel_info *kinfo)
#ifdef CONFIG_ARM_64
/* if aarch32 mode is not supported at EL1 do not allow 32-bit domain */
- if ( !(cpu_has_el1_32) && kinfo->arch.type == DOMAIN_32BIT )
+ if ( !(cpu_has_el1_32) && kinfo->type == DOMAIN_32BIT )
{
printk("Platform does not support 32-bit domain\n");
return -EINVAL;
}
- if ( is_sve_domain(d) && (kinfo->arch.type == DOMAIN_32BIT) )
+ if ( is_sve_domain(d) && (kinfo->type == DOMAIN_32BIT) )
{
printk("SVE is not available for 32-bit domain\n");
return -EINVAL;
@@ -1896,7 +1896,7 @@ int __init construct_hwdom(struct kernel_info *kinfo,
#ifdef CONFIG_ARM_64
/* type must be set before allocate_memory */
- d->arch.type = kinfo->arch.type;
+ d->type = kinfo->type;
#endif
find_gnttab_region(d, kinfo);
if ( is_domain_direct_mapped(d) )
diff --git a/xen/arch/arm/include/asm/domain.h
b/xen/arch/arm/include/asm/domain.h
index f95ad1285e6e..2d4c1bdecb66 100644
--- a/xen/arch/arm/include/asm/domain.h
+++ b/xen/arch/arm/include/asm/domain.h
@@ -18,18 +18,6 @@ struct hvm_domain
uint64_t params[HVM_NR_PARAMS];
};
-#ifdef CONFIG_ARM_64
-enum domain_type {
- DOMAIN_32BIT,
- DOMAIN_64BIT,
-};
-#define is_32bit_domain(d) ((d)->arch.type == DOMAIN_32BIT)
-#define is_64bit_domain(d) ((d)->arch.type == DOMAIN_64BIT)
-#else
-#define is_32bit_domain(d) (1)
-#define is_64bit_domain(d) (0)
-#endif
-
struct vtimer {
struct vcpu *v;
int irq;
diff --git a/xen/arch/arm/include/asm/kernel.h
b/xen/arch/arm/include/asm/kernel.h
index 7c3b7fde5b64..21f4273fa1b5 100644
--- a/xen/arch/arm/include/asm/kernel.h
+++ b/xen/arch/arm/include/asm/kernel.h
@@ -10,10 +10,6 @@
struct arch_kernel_info
{
-#ifdef CONFIG_ARM_64
- enum domain_type type;
-#endif
-
/* Enable pl011 emulation */
bool vpl011;
};
diff --git a/xen/arch/arm/kernel.c b/xen/arch/arm/kernel.c
index 3c613cdb233f..bc9aad3f5f45 100644
--- a/xen/arch/arm/kernel.c
+++ b/xen/arch/arm/kernel.c
@@ -101,7 +101,7 @@ static paddr_t __init kernel_zimage_place(struct
kernel_info *info)
paddr_t load_addr;
#ifdef CONFIG_ARM_64
- if ( (info->arch.type == DOMAIN_64BIT) && (info->image.start == 0) )
+ if ( (info->type == DOMAIN_64BIT) && (info->image.start == 0) )
return mem->bank[0].start + info->image.text_offset;
#endif
@@ -272,10 +272,10 @@ int __init kernel_uimage_probe(struct kernel_info *info,
switch ( uimage.arch )
{
case IH_ARCH_ARM:
- info->arch.type = DOMAIN_32BIT;
+ info->type = DOMAIN_32BIT;
break;
case IH_ARCH_ARM64:
- info->arch.type = DOMAIN_64BIT;
+ info->type = DOMAIN_64BIT;
break;
default:
printk(XENLOG_ERR "Unsupported uImage arch type %d\n", uimage.arch);
@@ -345,7 +345,7 @@ static int __init kernel_zimage64_probe(struct kernel_info
*info,
info->load = kernel_zimage_load;
- info->arch.type = DOMAIN_64BIT;
+ info->type = DOMAIN_64BIT;
return 0;
}
@@ -397,7 +397,7 @@ static int __init kernel_zimage32_probe(struct kernel_info
*info,
info->load = kernel_zimage_load;
#ifdef CONFIG_ARM_64
- info->arch.type = DOMAIN_32BIT;
+ info->type = DOMAIN_32BIT;
#endif
return 0;
diff --git a/xen/common/device-tree/dom0less-build.c
b/xen/common/device-tree/dom0less-build.c
index 64b12d6aec62..418282a6a549 100644
--- a/xen/common/device-tree/dom0less-build.c
+++ b/xen/common/device-tree/dom0less-build.c
@@ -809,7 +809,10 @@ static int __init construct_domU(struct kernel_info *kinfo,
if ( rc < 0 )
return rc;
- set_domain_type(d, kinfo);
+#ifdef CONFIG_HAS_DOMAIN_TYPE
+ /* type must be set before allocate memory */
+ d->type = kinfo->type;
+#endif
if ( is_hardware_domain(d) )
{
diff --git a/xen/include/xen/dom0less-build.h b/xen/include/xen/dom0less-build.h
index faaf660424b2..4118dec76c0a 100644
--- a/xen/include/xen/dom0less-build.h
+++ b/xen/include/xen/dom0less-build.h
@@ -57,8 +57,6 @@ int init_vuart(struct domain *d, struct kernel_info *kinfo,
int make_intc_domU_node(struct kernel_info *kinfo);
int make_arch_nodes(struct kernel_info *kinfo);
-void set_domain_type(struct domain *d, struct kernel_info *kinfo);
-
int init_intc_phandle(struct kernel_info *kinfo, const char *name,
const int node_next, const void *pfdt);
diff --git a/xen/include/xen/domain.h b/xen/include/xen/domain.h
index 93c0fd00c1d7..5951e7e6928f 100644
--- a/xen/include/xen/domain.h
+++ b/xen/include/xen/domain.h
@@ -13,6 +13,19 @@ struct guest_area {
void *map;
};
+#ifdef CONFIG_HAS_DOMAIN_TYPE
+enum domain_type {
+ DOMAIN_32BIT,
+ DOMAIN_64BIT,
+};
+#define is_32bit_domain(d) ((d)->type == DOMAIN_32BIT)
+#define is_64bit_domain(d) ((d)->type == DOMAIN_64BIT)
+#elif !defined(CONFIG_64BIT)
+/* On 32-bit-only platforms all domains are 32-bit. */
+#define is_32bit_domain(d) (true)
+#define is_64bit_domain(d) (false)
+#endif
+
#include <asm/domain.h>
typedef union {
diff --git a/xen/include/xen/fdt-kernel.h b/xen/include/xen/fdt-kernel.h
index 3527934b2a00..2c9bf4d4ef4f 100644
--- a/xen/include/xen/fdt-kernel.h
+++ b/xen/include/xen/fdt-kernel.h
@@ -9,6 +9,7 @@
#include <xen/bootinfo.h>
#include <xen/device_tree.h>
+#include <xen/domain.h>
#include <xen/types.h>
#if __has_include(<asm/kernel.h>)
@@ -69,6 +70,10 @@ struct kernel_info {
} image;
};
+#ifdef CONFIG_HAS_DOMAIN_TYPE
+ enum domain_type type;
+#endif
+
#if __has_include(<asm/kernel.h>)
struct arch_kernel_info arch;
#endif
diff --git a/xen/include/xen/sched.h b/xen/include/xen/sched.h
index 212c7d765c3e..4314bd195457 100644
--- a/xen/include/xen/sched.h
+++ b/xen/include/xen/sched.h
@@ -668,6 +668,10 @@ struct domain
struct page_info *pending_scrub;
unsigned int pending_scrub_order;
unsigned int pending_scrub_index;
+
+#ifdef CONFIG_HAS_DOMAIN_TYPE
+ enum domain_type type;
+#endif
} __aligned(PAGE_SIZE);
static inline struct page_list_head *page_to_list(
--
2.53.0
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |