Message ID | 1343316846-25860-1-git-send-email-stefano.stabellini@eu.citrix.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Thu, Jul 26, 2012 at 04:33:43PM +0100, Stefano Stabellini wrote: > - Basic hypervisor.h and interface.h definitions. > - Skelethon enlighten.c, set xen_start_info to an empty struct. Skeleton > - Do not limit xen_initial_domain to PV guests. Better wording: Make xen_initial_domain dependent on the SIF_PRIVILIGED_BIT. Which reminds me - what about PV guests that do PCI passthrough. Aren't they "more" priviligied than normal PV guests? Or not really? > > The new code only compiles when CONFIG_XEN is set, that is going to be > added to arch/arm/Kconfig in a later patch. s/later patch/<name of patch>/ > > Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com> > --- > arch/arm/Makefile | 1 + > arch/arm/include/asm/hypervisor.h | 6 +++ > arch/arm/include/asm/xen/hypervisor.h | 19 ++++++++++ > arch/arm/include/asm/xen/interface.h | 64 +++++++++++++++++++++++++++++++++ > arch/arm/xen/Makefile | 1 + > arch/arm/xen/enlighten.c | 35 ++++++++++++++++++ > include/xen/xen.h | 2 +- > 7 files changed, 127 insertions(+), 1 deletions(-) > create mode 100644 arch/arm/include/asm/hypervisor.h > create mode 100644 arch/arm/include/asm/xen/hypervisor.h > create mode 100644 arch/arm/include/asm/xen/interface.h > create mode 100644 arch/arm/xen/Makefile > create mode 100644 arch/arm/xen/enlighten.c > > diff --git a/arch/arm/Makefile b/arch/arm/Makefile > index 0298b00..70aaa82 100644 > --- a/arch/arm/Makefile > +++ b/arch/arm/Makefile > @@ -246,6 +246,7 @@ endif > core-$(CONFIG_FPE_NWFPE) += arch/arm/nwfpe/ > core-$(CONFIG_FPE_FASTFPE) += $(FASTFPE_OBJ) > core-$(CONFIG_VFP) += arch/arm/vfp/ > +core-$(CONFIG_XEN) += arch/arm/xen/ > > # If we have a machine-specific directory, then include it in the build. > core-y += arch/arm/kernel/ arch/arm/mm/ arch/arm/common/ > diff --git a/arch/arm/include/asm/hypervisor.h b/arch/arm/include/asm/hypervisor.h > new file mode 100644 > index 0000000..b90d9e5 > --- /dev/null > +++ b/arch/arm/include/asm/hypervisor.h > @@ -0,0 +1,6 @@ > +#ifndef _ASM_ARM_HYPERVISOR_H > +#define _ASM_ARM_HYPERVISOR_H > + > +#include <asm/xen/hypervisor.h> > + > +#endif > diff --git a/arch/arm/include/asm/xen/hypervisor.h b/arch/arm/include/asm/xen/hypervisor.h > new file mode 100644 > index 0000000..d7ab99a > --- /dev/null > +++ b/arch/arm/include/asm/xen/hypervisor.h > @@ -0,0 +1,19 @@ > +#ifndef _ASM_ARM_XEN_HYPERVISOR_H > +#define _ASM_ARM_XEN_HYPERVISOR_H > + > +extern struct shared_info *HYPERVISOR_shared_info; > +extern struct start_info *xen_start_info; > + > +/* Lazy mode for batching updates / context switch */ > +enum paravirt_lazy_mode { > + PARAVIRT_LAZY_NONE, > + PARAVIRT_LAZY_MMU, > + PARAVIRT_LAZY_CPU, > +}; > + > +static inline enum paravirt_lazy_mode paravirt_get_lazy_mode(void) > +{ > + return PARAVIRT_LAZY_NONE; > +} > + > +#endif /* _ASM_ARM_XEN_HYPERVISOR_H */ > diff --git a/arch/arm/include/asm/xen/interface.h b/arch/arm/include/asm/xen/interface.h > new file mode 100644 > index 0000000..6c3ab59 > --- /dev/null > +++ b/arch/arm/include/asm/xen/interface.h > @@ -0,0 +1,64 @@ > +/****************************************************************************** > + * Guest OS interface to ARM Xen. > + * > + * Stefano Stabellini <stefano.stabellini@eu.citrix.com>, Citrix, 2011 2012 > + */ > + > +#ifndef _ASM_ARM_XEN_INTERFACE_H > +#define _ASM_ARM_XEN_INTERFACE_H > + > +#include <linux/types.h> > + > +#define __DEFINE_GUEST_HANDLE(name, type) \ > + typedef type * __guest_handle_ ## name > + > +#define DEFINE_GUEST_HANDLE_STRUCT(name) \ > + __DEFINE_GUEST_HANDLE(name, struct name) > +#define DEFINE_GUEST_HANDLE(name) __DEFINE_GUEST_HANDLE(name, name) > +#define GUEST_HANDLE(name) __guest_handle_ ## name > + > +#define set_xen_guest_handle(hnd, val) \ > + do { \ > + if (sizeof(hnd) == 8) \ > + *(uint64_t *)&(hnd) = 0; \ > + (hnd) = val; \ > + } while (0) > + > +#ifndef __ASSEMBLY__ > +/* Guest handles for primitive C types. */ > +__DEFINE_GUEST_HANDLE(uchar, unsigned char); > +__DEFINE_GUEST_HANDLE(uint, unsigned int); > +__DEFINE_GUEST_HANDLE(ulong, unsigned long); > +DEFINE_GUEST_HANDLE(char); > +DEFINE_GUEST_HANDLE(int); > +DEFINE_GUEST_HANDLE(long); > +DEFINE_GUEST_HANDLE(void); > +DEFINE_GUEST_HANDLE(uint64_t); > +DEFINE_GUEST_HANDLE(uint32_t); > + > +/* Maximum number of virtual CPUs in multi-processor guests. */ > +#define MAX_VIRT_CPUS 1 > + > +struct arch_vcpu_info { }; > +struct arch_shared_info { }; > + > +/* XXX: Move pvclock definitions some place arch independent */ > +struct pvclock_vcpu_time_info { > + u32 version; > + u32 pad0; > + u64 tsc_timestamp; > + u64 system_time; > + u32 tsc_to_system_mul; > + s8 tsc_shift; > + u8 flags; > + u8 pad[2]; > +} __attribute__((__packed__)); /* 32 bytes */ > + > +struct pvclock_wall_clock { > + u32 version; > + u32 sec; > + u32 nsec; > +} __attribute__((__packed__)); That is weird. It is 4+4+4 = 12 bytes? Don't you want it to be 16 bytes? > +#endif > + > +#endif /* _ASM_ARM_XEN_INTERFACE_H */ > diff --git a/arch/arm/xen/Makefile b/arch/arm/xen/Makefile > new file mode 100644 > index 0000000..0bad594 > --- /dev/null > +++ b/arch/arm/xen/Makefile > @@ -0,0 +1 @@ > +obj-y := enlighten.o > diff --git a/arch/arm/xen/enlighten.c b/arch/arm/xen/enlighten.c > new file mode 100644 > index 0000000..d27c2a6 > --- /dev/null > +++ b/arch/arm/xen/enlighten.c > @@ -0,0 +1,35 @@ > +#include <xen/xen.h> > +#include <xen/interface/xen.h> > +#include <xen/interface/memory.h> > +#include <xen/platform_pci.h> > +#include <asm/xen/hypervisor.h> > +#include <asm/xen/hypercall.h> > +#include <linux/module.h> > + > +struct start_info _xen_start_info; > +struct start_info *xen_start_info = &_xen_start_info; > +EXPORT_SYMBOL_GPL(xen_start_info); > + > +enum xen_domain_type xen_domain_type = XEN_NATIVE; > +EXPORT_SYMBOL_GPL(xen_domain_type); > + > +struct shared_info xen_dummy_shared_info; > +struct shared_info *HYPERVISOR_shared_info = (void *)&xen_dummy_shared_info; > + > +DEFINE_PER_CPU(struct vcpu_info *, xen_vcpu); > + > +/* XXX: to be removed */ In this patch series later on? Or just when you try to collapse the x86 and arm variant together? > +__read_mostly int xen_have_vector_callback; > +EXPORT_SYMBOL_GPL(xen_have_vector_callback); > + > +int xen_platform_pci_unplug = XEN_UNPLUG_ALL; > +EXPORT_SYMBOL_GPL(xen_platform_pci_unplug); > + > +int xen_remap_domain_mfn_range(struct vm_area_struct *vma, > + unsigned long addr, > + unsigned long mfn, int nr, > + pgprot_t prot, unsigned domid) > +{ > + return -ENOSYS; > +} > +EXPORT_SYMBOL_GPL(xen_remap_domain_mfn_range); > diff --git a/include/xen/xen.h b/include/xen/xen.h > index a164024..2c0d3a5 100644 > --- a/include/xen/xen.h > +++ b/include/xen/xen.h > @@ -23,7 +23,7 @@ extern enum xen_domain_type xen_domain_type; > #include <xen/interface/xen.h> > #include <asm/xen/hypervisor.h> > > -#define xen_initial_domain() (xen_pv_domain() && \ > +#define xen_initial_domain() (xen_domain() && \ > xen_start_info->flags & SIF_INITDOMAIN) > #else /* !CONFIG_XEN_DOM0 */ > #define xen_initial_domain() (0) > -- > 1.7.2.5 > > > _______________________________________________ > Xen-devel mailing list > Xen-devel@lists.xen.org > http://lists.xen.org/xen-devel
On Thu, 26 Jul 2012, Konrad Rzeszutek Wilk wrote: > On Thu, Jul 26, 2012 at 04:33:43PM +0100, Stefano Stabellini wrote: > > - Basic hypervisor.h and interface.h definitions. > > - Skelethon enlighten.c, set xen_start_info to an empty struct. > > Skeleton > > > - Do not limit xen_initial_domain to PV guests. > > Better wording: Make xen_initial_domain dependent on the SIF_PRIVILIGED_BIT. > > Which reminds me - what about PV guests that do PCI passthrough. Aren't > they "more" priviligied than normal PV guests? Or not really? Not really, from the Xen POV. > > The new code only compiles when CONFIG_XEN is set, that is going to be > > added to arch/arm/Kconfig in a later patch. > > s/later patch/<name of patch>/ > > > > > Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com> > > --- > > arch/arm/Makefile | 1 + > > arch/arm/include/asm/hypervisor.h | 6 +++ > > arch/arm/include/asm/xen/hypervisor.h | 19 ++++++++++ > > arch/arm/include/asm/xen/interface.h | 64 +++++++++++++++++++++++++++++++++ > > arch/arm/xen/Makefile | 1 + > > arch/arm/xen/enlighten.c | 35 ++++++++++++++++++ > > include/xen/xen.h | 2 +- > > 7 files changed, 127 insertions(+), 1 deletions(-) > > create mode 100644 arch/arm/include/asm/hypervisor.h > > create mode 100644 arch/arm/include/asm/xen/hypervisor.h > > create mode 100644 arch/arm/include/asm/xen/interface.h > > create mode 100644 arch/arm/xen/Makefile > > create mode 100644 arch/arm/xen/enlighten.c > > > > diff --git a/arch/arm/Makefile b/arch/arm/Makefile > > index 0298b00..70aaa82 100644 > > --- a/arch/arm/Makefile > > +++ b/arch/arm/Makefile > > @@ -246,6 +246,7 @@ endif > > core-$(CONFIG_FPE_NWFPE) += arch/arm/nwfpe/ > > core-$(CONFIG_FPE_FASTFPE) += $(FASTFPE_OBJ) > > core-$(CONFIG_VFP) += arch/arm/vfp/ > > +core-$(CONFIG_XEN) += arch/arm/xen/ > > > > # If we have a machine-specific directory, then include it in the build. > > core-y += arch/arm/kernel/ arch/arm/mm/ arch/arm/common/ > > diff --git a/arch/arm/include/asm/hypervisor.h b/arch/arm/include/asm/hypervisor.h > > new file mode 100644 > > index 0000000..b90d9e5 > > --- /dev/null > > +++ b/arch/arm/include/asm/hypervisor.h > > @@ -0,0 +1,6 @@ > > +#ifndef _ASM_ARM_HYPERVISOR_H > > +#define _ASM_ARM_HYPERVISOR_H > > + > > +#include <asm/xen/hypervisor.h> > > + > > +#endif > > diff --git a/arch/arm/include/asm/xen/hypervisor.h b/arch/arm/include/asm/xen/hypervisor.h > > new file mode 100644 > > index 0000000..d7ab99a > > --- /dev/null > > +++ b/arch/arm/include/asm/xen/hypervisor.h > > @@ -0,0 +1,19 @@ > > +#ifndef _ASM_ARM_XEN_HYPERVISOR_H > > +#define _ASM_ARM_XEN_HYPERVISOR_H > > + > > +extern struct shared_info *HYPERVISOR_shared_info; > > +extern struct start_info *xen_start_info; > > + > > +/* Lazy mode for batching updates / context switch */ > > +enum paravirt_lazy_mode { > > + PARAVIRT_LAZY_NONE, > > + PARAVIRT_LAZY_MMU, > > + PARAVIRT_LAZY_CPU, > > +}; > > + > > +static inline enum paravirt_lazy_mode paravirt_get_lazy_mode(void) > > +{ > > + return PARAVIRT_LAZY_NONE; > > +} > > + > > +#endif /* _ASM_ARM_XEN_HYPERVISOR_H */ > > diff --git a/arch/arm/include/asm/xen/interface.h b/arch/arm/include/asm/xen/interface.h > > new file mode 100644 > > index 0000000..6c3ab59 > > --- /dev/null > > +++ b/arch/arm/include/asm/xen/interface.h > > @@ -0,0 +1,64 @@ > > +/****************************************************************************** > > + * Guest OS interface to ARM Xen. > > + * > > + * Stefano Stabellini <stefano.stabellini@eu.citrix.com>, Citrix, 2011 > > 2012 > > > + */ > > + > > +#ifndef _ASM_ARM_XEN_INTERFACE_H > > +#define _ASM_ARM_XEN_INTERFACE_H > > + > > +#include <linux/types.h> > > + > > +#define __DEFINE_GUEST_HANDLE(name, type) \ > > + typedef type * __guest_handle_ ## name > > + > > +#define DEFINE_GUEST_HANDLE_STRUCT(name) \ > > + __DEFINE_GUEST_HANDLE(name, struct name) > > +#define DEFINE_GUEST_HANDLE(name) __DEFINE_GUEST_HANDLE(name, name) > > +#define GUEST_HANDLE(name) __guest_handle_ ## name > > + > > +#define set_xen_guest_handle(hnd, val) \ > > + do { \ > > + if (sizeof(hnd) == 8) \ > > + *(uint64_t *)&(hnd) = 0; \ > > + (hnd) = val; \ > > + } while (0) > > + > > +#ifndef __ASSEMBLY__ > > +/* Guest handles for primitive C types. */ > > +__DEFINE_GUEST_HANDLE(uchar, unsigned char); > > +__DEFINE_GUEST_HANDLE(uint, unsigned int); > > +__DEFINE_GUEST_HANDLE(ulong, unsigned long); > > +DEFINE_GUEST_HANDLE(char); > > +DEFINE_GUEST_HANDLE(int); > > +DEFINE_GUEST_HANDLE(long); > > +DEFINE_GUEST_HANDLE(void); > > +DEFINE_GUEST_HANDLE(uint64_t); > > +DEFINE_GUEST_HANDLE(uint32_t); > > + > > +/* Maximum number of virtual CPUs in multi-processor guests. */ > > +#define MAX_VIRT_CPUS 1 > > + > > +struct arch_vcpu_info { }; > > +struct arch_shared_info { }; > > + > > +/* XXX: Move pvclock definitions some place arch independent */ > > +struct pvclock_vcpu_time_info { > > + u32 version; > > + u32 pad0; > > + u64 tsc_timestamp; > > + u64 system_time; > > + u32 tsc_to_system_mul; > > + s8 tsc_shift; > > + u8 flags; > > + u8 pad[2]; > > +} __attribute__((__packed__)); /* 32 bytes */ > > + > > +struct pvclock_wall_clock { > > + u32 version; > > + u32 sec; > > + u32 nsec; > > +} __attribute__((__packed__)); > > That is weird. It is 4+4+4 = 12 bytes? Don't you want it to be 16 bytes? I agree that 16 bytes would be a better choice, but it needs to match the struct in Xen that is defined as follow: uint32_t wc_version; /* Version counter: see vcpu_time_info_t. */ uint32_t wc_sec; /* Secs 00:00:00 UTC, Jan 1, 1970. */ uint32_t wc_nsec; /* Nsecs 00:00:00 UTC, Jan 1, 1970. */ in xen/include/public/xen.h. > > +#endif > > + > > +#endif /* _ASM_ARM_XEN_INTERFACE_H */ > > diff --git a/arch/arm/xen/Makefile b/arch/arm/xen/Makefile > > new file mode 100644 > > index 0000000..0bad594 > > --- /dev/null > > +++ b/arch/arm/xen/Makefile > > @@ -0,0 +1 @@ > > +obj-y := enlighten.o > > diff --git a/arch/arm/xen/enlighten.c b/arch/arm/xen/enlighten.c > > new file mode 100644 > > index 0000000..d27c2a6 > > --- /dev/null > > +++ b/arch/arm/xen/enlighten.c > > @@ -0,0 +1,35 @@ > > +#include <xen/xen.h> > > +#include <xen/interface/xen.h> > > +#include <xen/interface/memory.h> > > +#include <xen/platform_pci.h> > > +#include <asm/xen/hypervisor.h> > > +#include <asm/xen/hypercall.h> > > +#include <linux/module.h> > > + > > +struct start_info _xen_start_info; > > +struct start_info *xen_start_info = &_xen_start_info; > > +EXPORT_SYMBOL_GPL(xen_start_info); > > + > > +enum xen_domain_type xen_domain_type = XEN_NATIVE; > > +EXPORT_SYMBOL_GPL(xen_domain_type); > > + > > +struct shared_info xen_dummy_shared_info; > > +struct shared_info *HYPERVISOR_shared_info = (void *)&xen_dummy_shared_info; > > + > > +DEFINE_PER_CPU(struct vcpu_info *, xen_vcpu); > > + > > +/* XXX: to be removed */ > > In this patch series later on? Or just when you try to collapse the x86 and arm variant > together? The latter. It is not harmful but we don't need xen_have_vector_callback on ARM, so it would be nice if we didn't have to define it here. > > +__read_mostly int xen_have_vector_callback; > > +EXPORT_SYMBOL_GPL(xen_have_vector_callback); > > + > > +int xen_platform_pci_unplug = XEN_UNPLUG_ALL; > > +EXPORT_SYMBOL_GPL(xen_platform_pci_unplug); > > + > > +int xen_remap_domain_mfn_range(struct vm_area_struct *vma, > > + unsigned long addr, > > + unsigned long mfn, int nr, > > + pgprot_t prot, unsigned domid) > > +{ > > + return -ENOSYS; > > +} > > +EXPORT_SYMBOL_GPL(xen_remap_domain_mfn_range); > > diff --git a/include/xen/xen.h b/include/xen/xen.h > > index a164024..2c0d3a5 100644 > > --- a/include/xen/xen.h > > +++ b/include/xen/xen.h > > @@ -23,7 +23,7 @@ extern enum xen_domain_type xen_domain_type; > > #include <xen/interface/xen.h> > > #include <asm/xen/hypervisor.h> > > > > -#define xen_initial_domain() (xen_pv_domain() && \ > > +#define xen_initial_domain() (xen_domain() && \ > > xen_start_info->flags & SIF_INITDOMAIN) > > #else /* !CONFIG_XEN_DOM0 */ > > #define xen_initial_domain() (0) > > -- > > 1.7.2.5 > > > > > > _______________________________________________ > > Xen-devel mailing list > > Xen-devel@lists.xen.org > > http://lists.xen.org/xen-devel >
> > > +struct pvclock_wall_clock { > > > + u32 version; > > > + u32 sec; > > > + u32 nsec; > > > +} __attribute__((__packed__)); > > > > That is weird. It is 4+4+4 = 12 bytes? Don't you want it to be 16 bytes? > > I agree that 16 bytes would be a better choice, but it needs to match > the struct in Xen that is defined as follow: > > uint32_t wc_version; /* Version counter: see vcpu_time_info_t. */ > uint32_t wc_sec; /* Secs 00:00:00 UTC, Jan 1, 1970. */ > uint32_t wc_nsec; /* Nsecs 00:00:00 UTC, Jan 1, 1970. */ Would it make sense to add some paddigin then at least? In both cases? Or is it too late for this?
On 07/26/2012 10:33 AM, Stefano Stabellini wrote: > - Basic hypervisor.h and interface.h definitions. > - Skelethon enlighten.c, set xen_start_info to an empty struct. > - Do not limit xen_initial_domain to PV guests. > > The new code only compiles when CONFIG_XEN is set, that is going to be > added to arch/arm/Kconfig in a later patch. > > Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com> > --- > arch/arm/Makefile | 1 + > arch/arm/include/asm/hypervisor.h | 6 +++ > arch/arm/include/asm/xen/hypervisor.h | 19 ++++++++++ > arch/arm/include/asm/xen/interface.h | 64 +++++++++++++++++++++++++++++++++ These headers don't seem particularly ARM specific. Could they be moved to asm-generic or include/linux? Rob > arch/arm/xen/Makefile | 1 + > arch/arm/xen/enlighten.c | 35 ++++++++++++++++++ > include/xen/xen.h | 2 +- > 7 files changed, 127 insertions(+), 1 deletions(-) > create mode 100644 arch/arm/include/asm/hypervisor.h > create mode 100644 arch/arm/include/asm/xen/hypervisor.h > create mode 100644 arch/arm/include/asm/xen/interface.h > create mode 100644 arch/arm/xen/Makefile > create mode 100644 arch/arm/xen/enlighten.c > > diff --git a/arch/arm/Makefile b/arch/arm/Makefile > index 0298b00..70aaa82 100644 > --- a/arch/arm/Makefile > +++ b/arch/arm/Makefile > @@ -246,6 +246,7 @@ endif > core-$(CONFIG_FPE_NWFPE) += arch/arm/nwfpe/ > core-$(CONFIG_FPE_FASTFPE) += $(FASTFPE_OBJ) > core-$(CONFIG_VFP) += arch/arm/vfp/ > +core-$(CONFIG_XEN) += arch/arm/xen/ > > # If we have a machine-specific directory, then include it in the build. > core-y += arch/arm/kernel/ arch/arm/mm/ arch/arm/common/ > diff --git a/arch/arm/include/asm/hypervisor.h b/arch/arm/include/asm/hypervisor.h > new file mode 100644 > index 0000000..b90d9e5 > --- /dev/null > +++ b/arch/arm/include/asm/hypervisor.h > @@ -0,0 +1,6 @@ > +#ifndef _ASM_ARM_HYPERVISOR_H > +#define _ASM_ARM_HYPERVISOR_H > + > +#include <asm/xen/hypervisor.h> > + > +#endif > diff --git a/arch/arm/include/asm/xen/hypervisor.h b/arch/arm/include/asm/xen/hypervisor.h > new file mode 100644 > index 0000000..d7ab99a > --- /dev/null > +++ b/arch/arm/include/asm/xen/hypervisor.h > @@ -0,0 +1,19 @@ > +#ifndef _ASM_ARM_XEN_HYPERVISOR_H > +#define _ASM_ARM_XEN_HYPERVISOR_H > + > +extern struct shared_info *HYPERVISOR_shared_info; > +extern struct start_info *xen_start_info; > + > +/* Lazy mode for batching updates / context switch */ > +enum paravirt_lazy_mode { > + PARAVIRT_LAZY_NONE, > + PARAVIRT_LAZY_MMU, > + PARAVIRT_LAZY_CPU, > +}; > + > +static inline enum paravirt_lazy_mode paravirt_get_lazy_mode(void) > +{ > + return PARAVIRT_LAZY_NONE; > +} > + > +#endif /* _ASM_ARM_XEN_HYPERVISOR_H */ > diff --git a/arch/arm/include/asm/xen/interface.h b/arch/arm/include/asm/xen/interface.h > new file mode 100644 > index 0000000..6c3ab59 > --- /dev/null > +++ b/arch/arm/include/asm/xen/interface.h > @@ -0,0 +1,64 @@ > +/****************************************************************************** > + * Guest OS interface to ARM Xen. > + * > + * Stefano Stabellini <stefano.stabellini@eu.citrix.com>, Citrix, 2011 > + */ > + > +#ifndef _ASM_ARM_XEN_INTERFACE_H > +#define _ASM_ARM_XEN_INTERFACE_H > + > +#include <linux/types.h> > + > +#define __DEFINE_GUEST_HANDLE(name, type) \ > + typedef type * __guest_handle_ ## name > + > +#define DEFINE_GUEST_HANDLE_STRUCT(name) \ > + __DEFINE_GUEST_HANDLE(name, struct name) > +#define DEFINE_GUEST_HANDLE(name) __DEFINE_GUEST_HANDLE(name, name) > +#define GUEST_HANDLE(name) __guest_handle_ ## name > + > +#define set_xen_guest_handle(hnd, val) \ > + do { \ > + if (sizeof(hnd) == 8) \ > + *(uint64_t *)&(hnd) = 0; \ > + (hnd) = val; \ > + } while (0) > + > +#ifndef __ASSEMBLY__ > +/* Guest handles for primitive C types. */ > +__DEFINE_GUEST_HANDLE(uchar, unsigned char); > +__DEFINE_GUEST_HANDLE(uint, unsigned int); > +__DEFINE_GUEST_HANDLE(ulong, unsigned long); > +DEFINE_GUEST_HANDLE(char); > +DEFINE_GUEST_HANDLE(int); > +DEFINE_GUEST_HANDLE(long); > +DEFINE_GUEST_HANDLE(void); > +DEFINE_GUEST_HANDLE(uint64_t); > +DEFINE_GUEST_HANDLE(uint32_t); > + > +/* Maximum number of virtual CPUs in multi-processor guests. */ > +#define MAX_VIRT_CPUS 1 > + > +struct arch_vcpu_info { }; > +struct arch_shared_info { }; > + > +/* XXX: Move pvclock definitions some place arch independent */ > +struct pvclock_vcpu_time_info { > + u32 version; > + u32 pad0; > + u64 tsc_timestamp; > + u64 system_time; > + u32 tsc_to_system_mul; > + s8 tsc_shift; > + u8 flags; > + u8 pad[2]; > +} __attribute__((__packed__)); /* 32 bytes */ > + > +struct pvclock_wall_clock { > + u32 version; > + u32 sec; > + u32 nsec; > +} __attribute__((__packed__)); > +#endif > + > +#endif /* _ASM_ARM_XEN_INTERFACE_H */ > diff --git a/arch/arm/xen/Makefile b/arch/arm/xen/Makefile > new file mode 100644 > index 0000000..0bad594 > --- /dev/null > +++ b/arch/arm/xen/Makefile > @@ -0,0 +1 @@ > +obj-y := enlighten.o > diff --git a/arch/arm/xen/enlighten.c b/arch/arm/xen/enlighten.c > new file mode 100644 > index 0000000..d27c2a6 > --- /dev/null > +++ b/arch/arm/xen/enlighten.c > @@ -0,0 +1,35 @@ > +#include <xen/xen.h> > +#include <xen/interface/xen.h> > +#include <xen/interface/memory.h> > +#include <xen/platform_pci.h> > +#include <asm/xen/hypervisor.h> > +#include <asm/xen/hypercall.h> > +#include <linux/module.h> > + > +struct start_info _xen_start_info; > +struct start_info *xen_start_info = &_xen_start_info; > +EXPORT_SYMBOL_GPL(xen_start_info); > + > +enum xen_domain_type xen_domain_type = XEN_NATIVE; > +EXPORT_SYMBOL_GPL(xen_domain_type); > + > +struct shared_info xen_dummy_shared_info; > +struct shared_info *HYPERVISOR_shared_info = (void *)&xen_dummy_shared_info; > + > +DEFINE_PER_CPU(struct vcpu_info *, xen_vcpu); > + > +/* XXX: to be removed */ > +__read_mostly int xen_have_vector_callback; > +EXPORT_SYMBOL_GPL(xen_have_vector_callback); > + > +int xen_platform_pci_unplug = XEN_UNPLUG_ALL; > +EXPORT_SYMBOL_GPL(xen_platform_pci_unplug); > + > +int xen_remap_domain_mfn_range(struct vm_area_struct *vma, > + unsigned long addr, > + unsigned long mfn, int nr, > + pgprot_t prot, unsigned domid) > +{ > + return -ENOSYS; > +} > +EXPORT_SYMBOL_GPL(xen_remap_domain_mfn_range); > diff --git a/include/xen/xen.h b/include/xen/xen.h > index a164024..2c0d3a5 100644 > --- a/include/xen/xen.h > +++ b/include/xen/xen.h > @@ -23,7 +23,7 @@ extern enum xen_domain_type xen_domain_type; > #include <xen/interface/xen.h> > #include <asm/xen/hypervisor.h> > > -#define xen_initial_domain() (xen_pv_domain() && \ > +#define xen_initial_domain() (xen_domain() && \ > xen_start_info->flags & SIF_INITDOMAIN) > #else /* !CONFIG_XEN_DOM0 */ > #define xen_initial_domain() (0) >
On Wed, 2012-08-01 at 19:27 +0100, Rob Herring wrote: > On 07/26/2012 10:33 AM, Stefano Stabellini wrote: > > - Basic hypervisor.h and interface.h definitions. > > - Skelethon enlighten.c, set xen_start_info to an empty struct. > > - Do not limit xen_initial_domain to PV guests. > > > > The new code only compiles when CONFIG_XEN is set, that is going to be > > added to arch/arm/Kconfig in a later patch. > > > > Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com> > > --- > > arch/arm/Makefile | 1 + > > arch/arm/include/asm/hypervisor.h | 6 +++ > > arch/arm/include/asm/xen/hypervisor.h | 19 ++++++++++ > > arch/arm/include/asm/xen/interface.h | 64 +++++++++++++++++++++++++++++++++ > > These headers don't seem particularly ARM specific. Could they be moved > to asm-generic or include/linux? Or perhaps include/xen. A bunch of it also looks like x86 specific stuff which has crept in. e.g. PARAVIRT_LAZY_FOO and paravirt_get_lazy_mode() are arch/x86 specific and shouldn't be called from common code (and aren't, AFAICT).
On Thu, Aug 02, 2012 at 08:35:51AM +0100, Ian Campbell wrote: > On Wed, 2012-08-01 at 19:27 +0100, Rob Herring wrote: > > On 07/26/2012 10:33 AM, Stefano Stabellini wrote: > > > - Basic hypervisor.h and interface.h definitions. > > > - Skelethon enlighten.c, set xen_start_info to an empty struct. > > > - Do not limit xen_initial_domain to PV guests. > > > > > > The new code only compiles when CONFIG_XEN is set, that is going to be > > > added to arch/arm/Kconfig in a later patch. > > > > > > Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com> > > > --- > > > arch/arm/Makefile | 1 + > > > arch/arm/include/asm/hypervisor.h | 6 +++ > > > arch/arm/include/asm/xen/hypervisor.h | 19 ++++++++++ > > > arch/arm/include/asm/xen/interface.h | 64 +++++++++++++++++++++++++++++++++ > > > > These headers don't seem particularly ARM specific. Could they be moved > > to asm-generic or include/linux? > > Or perhaps include/xen. > > A bunch of it also looks like x86 specific stuff which has crept in. > e.g. PARAVIRT_LAZY_FOO and paravirt_get_lazy_mode() are arch/x86 > specific and shouldn't be called from common code (and aren't, AFAICT). The could be moved out..
On Thu, 2 Aug 2012, Konrad Rzeszutek Wilk wrote: > On Thu, Aug 02, 2012 at 08:35:51AM +0100, Ian Campbell wrote: > > On Wed, 2012-08-01 at 19:27 +0100, Rob Herring wrote: > > > On 07/26/2012 10:33 AM, Stefano Stabellini wrote: > > > > - Basic hypervisor.h and interface.h definitions. > > > > - Skelethon enlighten.c, set xen_start_info to an empty struct. > > > > - Do not limit xen_initial_domain to PV guests. > > > > > > > > The new code only compiles when CONFIG_XEN is set, that is going to be > > > > added to arch/arm/Kconfig in a later patch. > > > > > > > > Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com> > > > > --- > > > > arch/arm/Makefile | 1 + > > > > arch/arm/include/asm/hypervisor.h | 6 +++ > > > > arch/arm/include/asm/xen/hypervisor.h | 19 ++++++++++ > > > > arch/arm/include/asm/xen/interface.h | 64 +++++++++++++++++++++++++++++++++ > > > > > > These headers don't seem particularly ARM specific. Could they be moved > > > to asm-generic or include/linux? > > > > Or perhaps include/xen. > > > > A bunch of it also looks like x86 specific stuff which has crept in. > > e.g. PARAVIRT_LAZY_FOO and paravirt_get_lazy_mode() are arch/x86 > > specific and shouldn't be called from common code (and aren't, AFAICT). > > The could be moved out.. > they are called from grant-table.c; sigh, I was the one to add them there :-( interface.h is ARM specific, except for the pvclock structs, that in fact are marked "XXX". hypervisor.h is almost empty but I guess I could move out the following two lines: extern struct shared_info *HYPERVISOR_shared_info; extern struct start_info *xen_start_info; Considering that each arch is free to map them (or not) the way it wants, I don't think is a good idea.
On Wed, 1 Aug 2012, Konrad Rzeszutek Wilk wrote: > > > > +struct pvclock_wall_clock { > > > > + u32 version; > > > > + u32 sec; > > > > + u32 nsec; > > > > +} __attribute__((__packed__)); > > > > > > That is weird. It is 4+4+4 = 12 bytes? Don't you want it to be 16 bytes? > > > > I agree that 16 bytes would be a better choice, but it needs to match > > the struct in Xen that is defined as follow: > > > > uint32_t wc_version; /* Version counter: see vcpu_time_info_t. */ > > uint32_t wc_sec; /* Secs 00:00:00 UTC, Jan 1, 1970. */ > > uint32_t wc_nsec; /* Nsecs 00:00:00 UTC, Jan 1, 1970. */ > > Would it make sense to add some paddigin then at least? In both > cases? Or is it too late for this? I can see why adding some padding would be useful if the structs were not packed and we wanted to enforce 32/64 bit compatibility on x86. However on ARM the field alignments on 32 and 64 bits are the same for integer values so the padding wouldn't make a difference. In any case both structs are packed, so the alignment is forced to be the same by the compiler.
diff --git a/arch/arm/Makefile b/arch/arm/Makefile index 0298b00..70aaa82 100644 --- a/arch/arm/Makefile +++ b/arch/arm/Makefile @@ -246,6 +246,7 @@ endif core-$(CONFIG_FPE_NWFPE) += arch/arm/nwfpe/ core-$(CONFIG_FPE_FASTFPE) += $(FASTFPE_OBJ) core-$(CONFIG_VFP) += arch/arm/vfp/ +core-$(CONFIG_XEN) += arch/arm/xen/ # If we have a machine-specific directory, then include it in the build. core-y += arch/arm/kernel/ arch/arm/mm/ arch/arm/common/ diff --git a/arch/arm/include/asm/hypervisor.h b/arch/arm/include/asm/hypervisor.h new file mode 100644 index 0000000..b90d9e5 --- /dev/null +++ b/arch/arm/include/asm/hypervisor.h @@ -0,0 +1,6 @@ +#ifndef _ASM_ARM_HYPERVISOR_H +#define _ASM_ARM_HYPERVISOR_H + +#include <asm/xen/hypervisor.h> + +#endif diff --git a/arch/arm/include/asm/xen/hypervisor.h b/arch/arm/include/asm/xen/hypervisor.h new file mode 100644 index 0000000..d7ab99a --- /dev/null +++ b/arch/arm/include/asm/xen/hypervisor.h @@ -0,0 +1,19 @@ +#ifndef _ASM_ARM_XEN_HYPERVISOR_H +#define _ASM_ARM_XEN_HYPERVISOR_H + +extern struct shared_info *HYPERVISOR_shared_info; +extern struct start_info *xen_start_info; + +/* Lazy mode for batching updates / context switch */ +enum paravirt_lazy_mode { + PARAVIRT_LAZY_NONE, + PARAVIRT_LAZY_MMU, + PARAVIRT_LAZY_CPU, +}; + +static inline enum paravirt_lazy_mode paravirt_get_lazy_mode(void) +{ + return PARAVIRT_LAZY_NONE; +} + +#endif /* _ASM_ARM_XEN_HYPERVISOR_H */ diff --git a/arch/arm/include/asm/xen/interface.h b/arch/arm/include/asm/xen/interface.h new file mode 100644 index 0000000..6c3ab59 --- /dev/null +++ b/arch/arm/include/asm/xen/interface.h @@ -0,0 +1,64 @@ +/****************************************************************************** + * Guest OS interface to ARM Xen. + * + * Stefano Stabellini <stefano.stabellini@eu.citrix.com>, Citrix, 2011 + */ + +#ifndef _ASM_ARM_XEN_INTERFACE_H +#define _ASM_ARM_XEN_INTERFACE_H + +#include <linux/types.h> + +#define __DEFINE_GUEST_HANDLE(name, type) \ + typedef type * __guest_handle_ ## name + +#define DEFINE_GUEST_HANDLE_STRUCT(name) \ + __DEFINE_GUEST_HANDLE(name, struct name) +#define DEFINE_GUEST_HANDLE(name) __DEFINE_GUEST_HANDLE(name, name) +#define GUEST_HANDLE(name) __guest_handle_ ## name + +#define set_xen_guest_handle(hnd, val) \ + do { \ + if (sizeof(hnd) == 8) \ + *(uint64_t *)&(hnd) = 0; \ + (hnd) = val; \ + } while (0) + +#ifndef __ASSEMBLY__ +/* Guest handles for primitive C types. */ +__DEFINE_GUEST_HANDLE(uchar, unsigned char); +__DEFINE_GUEST_HANDLE(uint, unsigned int); +__DEFINE_GUEST_HANDLE(ulong, unsigned long); +DEFINE_GUEST_HANDLE(char); +DEFINE_GUEST_HANDLE(int); +DEFINE_GUEST_HANDLE(long); +DEFINE_GUEST_HANDLE(void); +DEFINE_GUEST_HANDLE(uint64_t); +DEFINE_GUEST_HANDLE(uint32_t); + +/* Maximum number of virtual CPUs in multi-processor guests. */ +#define MAX_VIRT_CPUS 1 + +struct arch_vcpu_info { }; +struct arch_shared_info { }; + +/* XXX: Move pvclock definitions some place arch independent */ +struct pvclock_vcpu_time_info { + u32 version; + u32 pad0; + u64 tsc_timestamp; + u64 system_time; + u32 tsc_to_system_mul; + s8 tsc_shift; + u8 flags; + u8 pad[2]; +} __attribute__((__packed__)); /* 32 bytes */ + +struct pvclock_wall_clock { + u32 version; + u32 sec; + u32 nsec; +} __attribute__((__packed__)); +#endif + +#endif /* _ASM_ARM_XEN_INTERFACE_H */ diff --git a/arch/arm/xen/Makefile b/arch/arm/xen/Makefile new file mode 100644 index 0000000..0bad594 --- /dev/null +++ b/arch/arm/xen/Makefile @@ -0,0 +1 @@ +obj-y := enlighten.o diff --git a/arch/arm/xen/enlighten.c b/arch/arm/xen/enlighten.c new file mode 100644 index 0000000..d27c2a6 --- /dev/null +++ b/arch/arm/xen/enlighten.c @@ -0,0 +1,35 @@ +#include <xen/xen.h> +#include <xen/interface/xen.h> +#include <xen/interface/memory.h> +#include <xen/platform_pci.h> +#include <asm/xen/hypervisor.h> +#include <asm/xen/hypercall.h> +#include <linux/module.h> + +struct start_info _xen_start_info; +struct start_info *xen_start_info = &_xen_start_info; +EXPORT_SYMBOL_GPL(xen_start_info); + +enum xen_domain_type xen_domain_type = XEN_NATIVE; +EXPORT_SYMBOL_GPL(xen_domain_type); + +struct shared_info xen_dummy_shared_info; +struct shared_info *HYPERVISOR_shared_info = (void *)&xen_dummy_shared_info; + +DEFINE_PER_CPU(struct vcpu_info *, xen_vcpu); + +/* XXX: to be removed */ +__read_mostly int xen_have_vector_callback; +EXPORT_SYMBOL_GPL(xen_have_vector_callback); + +int xen_platform_pci_unplug = XEN_UNPLUG_ALL; +EXPORT_SYMBOL_GPL(xen_platform_pci_unplug); + +int xen_remap_domain_mfn_range(struct vm_area_struct *vma, + unsigned long addr, + unsigned long mfn, int nr, + pgprot_t prot, unsigned domid) +{ + return -ENOSYS; +} +EXPORT_SYMBOL_GPL(xen_remap_domain_mfn_range); diff --git a/include/xen/xen.h b/include/xen/xen.h index a164024..2c0d3a5 100644 --- a/include/xen/xen.h +++ b/include/xen/xen.h @@ -23,7 +23,7 @@ extern enum xen_domain_type xen_domain_type; #include <xen/interface/xen.h> #include <asm/xen/hypervisor.h> -#define xen_initial_domain() (xen_pv_domain() && \ +#define xen_initial_domain() (xen_domain() && \ xen_start_info->flags & SIF_INITDOMAIN) #else /* !CONFIG_XEN_DOM0 */ #define xen_initial_domain() (0)
- Basic hypervisor.h and interface.h definitions. - Skelethon enlighten.c, set xen_start_info to an empty struct. - Do not limit xen_initial_domain to PV guests. The new code only compiles when CONFIG_XEN is set, that is going to be added to arch/arm/Kconfig in a later patch. Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com> --- arch/arm/Makefile | 1 + arch/arm/include/asm/hypervisor.h | 6 +++ arch/arm/include/asm/xen/hypervisor.h | 19 ++++++++++ arch/arm/include/asm/xen/interface.h | 64 +++++++++++++++++++++++++++++++++ arch/arm/xen/Makefile | 1 + arch/arm/xen/enlighten.c | 35 ++++++++++++++++++ include/xen/xen.h | 2 +- 7 files changed, 127 insertions(+), 1 deletions(-) create mode 100644 arch/arm/include/asm/hypervisor.h create mode 100644 arch/arm/include/asm/xen/hypervisor.h create mode 100644 arch/arm/include/asm/xen/interface.h create mode 100644 arch/arm/xen/Makefile create mode 100644 arch/arm/xen/enlighten.c