lkml.org 
[lkml]   [2012]   [Aug]   [1]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [PATCH 01/24] arm: initial Xen support
    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)
    >



    \
     
     \ /
      Last update: 2012-08-01 21:01    [W:0.044 / U:33.656 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site