[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v6 07/16] xen: arm: implement XEN_DOMCTL_set_address_size
This is subarch specific to plumb through to arm32 and arm64 versions. The toolstack uses this to select 32- vs 64-bit guests (or rather it does on x86 and soon will for arm too). Signed-off-by: Ian Campbell <ian.campbell@xxxxxxxxxx> Acked-by: Julien Grall <julien.grall@xxxxxxxxxx> --- v4: moved addition of xen/hypercall.h include into a precursor patch. --- xen/arch/arm/arm32/Makefile | 1 + xen/arch/arm/arm32/domctl.c | 35 +++++++++++++++++++++++ xen/arch/arm/arm64/Makefile | 1 + xen/arch/arm/arm64/domctl.c | 59 +++++++++++++++++++++++++++++++++++++++ xen/arch/arm/domctl.c | 6 +++- xen/include/asm-arm/hypercall.h | 3 ++ 6 files changed, 104 insertions(+), 1 deletion(-) create mode 100644 xen/arch/arm/arm32/domctl.c create mode 100644 xen/arch/arm/arm64/domctl.c diff --git a/xen/arch/arm/arm32/Makefile b/xen/arch/arm/arm32/Makefile index aacdcb9..65ecff4 100644 --- a/xen/arch/arm/arm32/Makefile +++ b/xen/arch/arm/arm32/Makefile @@ -7,5 +7,6 @@ obj-y += traps.o obj-y += domain.o obj-y += vfp.o obj-y += smpboot.o +obj-y += domctl.o obj-$(EARLY_PRINTK) += debug.o diff --git a/xen/arch/arm/arm32/domctl.c b/xen/arch/arm/arm32/domctl.c new file mode 100644 index 0000000..c2ca4d3 --- /dev/null +++ b/xen/arch/arm/arm32/domctl.c @@ -0,0 +1,35 @@ +/****************************************************************************** + * Subarch-specific domctl.c + * + * Copyright (c) 2013, Citrix Systems + */ + +#include <xen/config.h> +#include <xen/types.h> +#include <xen/lib.h> +#include <xen/errno.h> +#include <xen/sched.h> +#include <xen/hypercall.h> +#include <public/domctl.h> + +long subarch_do_domctl(struct xen_domctl *domctl, struct domain *d, + XEN_GUEST_HANDLE_PARAM(xen_domctl_t) u_domctl) +{ + switch ( domctl->cmd ) + { + case XEN_DOMCTL_set_address_size: + return domctl->u.address_size.size == 32 ? 0 : -EINVAL; + default: + return -ENOSYS; + } +} + +/* + * Local variables: + * mode: C + * c-file-style: "BSD" + * c-basic-offset: 4 + * tab-width: 4 + * indent-tabs-mode: nil + * End: + */ diff --git a/xen/arch/arm/arm64/Makefile b/xen/arch/arm/arm64/Makefile index 5d28bad..d2d5875 100644 --- a/xen/arch/arm/arm64/Makefile +++ b/xen/arch/arm/arm64/Makefile @@ -6,5 +6,6 @@ obj-y += traps.o obj-y += domain.o obj-y += vfp.o obj-y += smpboot.o +obj-y += domctl.o obj-$(EARLY_PRINTK) += debug.o diff --git a/xen/arch/arm/arm64/domctl.c b/xen/arch/arm/arm64/domctl.c new file mode 100644 index 0000000..e2b4617 --- /dev/null +++ b/xen/arch/arm/arm64/domctl.c @@ -0,0 +1,59 @@ +/****************************************************************************** + * Subarch-specific domctl.c + * + * Copyright (c) 2013, Citrix Systems + */ + +#include <xen/config.h> +#include <xen/types.h> +#include <xen/lib.h> +#include <xen/errno.h> +#include <xen/sched.h> +#include <xen/hypercall.h> +#include <public/domctl.h> + +static long switch_mode(struct domain *d, enum domain_type type) +{ + if ( d == NULL ) + return -EINVAL; + if ( d->tot_pages != 0 ) + return -EBUSY; + if ( d->arch.type == type ) + return 0; + + d->arch.type = type; + + return 0; +} + +long subarch_do_domctl(struct xen_domctl *domctl, struct domain *d, + XEN_GUEST_HANDLE_PARAM(xen_domctl_t) u_domctl) +{ + switch ( domctl->cmd ) + { + case XEN_DOMCTL_set_address_size: + switch ( domctl->u.address_size.size ) + { + case 32: + return switch_mode(d, DOMAIN_PV32); + case 64: + return switch_mode(d, DOMAIN_PV64); + default: + return -EINVAL; + } + break; + + default: + return -ENOSYS; + } +} + +/* + * Local variables: + * mode: C + * c-file-style: "BSD" + * c-basic-offset: 4 + * tab-width: 4 + * indent-tabs-mode: nil + * End: + */ diff --git a/xen/arch/arm/domctl.c b/xen/arch/arm/domctl.c index 4cf0294..546e86b 100644 --- a/xen/arch/arm/domctl.c +++ b/xen/arch/arm/domctl.c @@ -15,7 +15,11 @@ long arch_do_domctl(struct xen_domctl *domctl, struct domain *d, XEN_GUEST_HANDLE_PARAM(xen_domctl_t) u_domctl) { - return -ENOSYS; + switch ( domctl->cmd ) + { + default: + return subarch_do_domctl(domctl, d, u_domctl); + } } void arch_get_info_guest(struct vcpu *v, vcpu_guest_context_u c) diff --git a/xen/include/asm-arm/hypercall.h b/xen/include/asm-arm/hypercall.h index 3327a96..94a92d4 100644 --- a/xen/include/asm-arm/hypercall.h +++ b/xen/include/asm-arm/hypercall.h @@ -6,6 +6,9 @@ int do_physdev_op(int cmd, XEN_GUEST_HANDLE_PARAM(void) arg); long do_arm_vcpu_op(int cmd, int vcpuid, XEN_GUEST_HANDLE_PARAM(void) arg); +long subarch_do_domctl(struct xen_domctl *domctl, struct domain *d, + XEN_GUEST_HANDLE_PARAM(xen_domctl_t) u_domctl); + #endif /* __ASM_ARM_HYPERCALL_H__ */ /* * Local variables: -- 1.7.10.4 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |