Re: [Xen-devel] [PATCH 01/24] arm: initial Xen support

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]


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@xxxxxxxxxxxxx>
> > ---
> >  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@xxxxxxxxxxxxx>, 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@xxxxxxxxxxxxx
> > http://lists.xen.org/xen-devel
> 
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[Other Archives]     [Linux Kernel Newbies]     [Linux Driver Development]     [Linux Kbuild]     [Fedora Kernel]     [Linux Kernel Testers]     [Linux SH]     [Linux Omap]     [Linux Tape]     [Linux Input]     [Linux Kernel Janitors]     [Linux Kernel Packagers]     [Linux Doc]     [Linux Man Pages]     [Linux API]     [Linux Memory Management]     [Linux Modules]     [Linux Standards]     [Kernel Announce]     [Netdev]     [Git]     [Linux PCI]     Linux CAN Development     [Linux I2C]     [Linux RDMA]     [Linux NUMA]     [Netfilter]     [Netfilter Devel]     [SELinux]     [Bugtraq]     [FIO]     [Linux Perf Users]     [Linux Serial]     [Linux PPP]     [Linux ISDN]     [Linux Next]     [Kernel Stable Commits]     [Linux Tip Commits]     [Kernel MM Commits]     [Linux Security Module]     [AutoFS]     [Filesystem Development]     [Ext3 Filesystem]     [Linux bcache]     [Ext4 Filesystem]     [Linux BTRFS]     [Linux CEPH Filesystem]     [Linux XFS]     [XFS]     [Linux NFS]     [Linux CIFS]     [Ecryptfs]     [Linux NILFS]     [Linux Cachefs]     [Reiser FS]     [Initramfs]     [Linux FB Devel]     [Linux OpenGL]     [DRI Devel]     [Fastboot]     [Linux RT Users]     [Linux RT Stable]     [eCos]     [Corosync]     [Linux Clusters]     [LVS Devel]     [Hot Plug]     [Linux Virtualization]     [KVM]     [KVM PPC]     [KVM ia64]     [Linux Containers]     [Linux Hexagon]     [Linux Cgroups]     [Util Linux]     [Wireless]     [Linux Bluetooth]     [Bluez Devel]     [Ethernet Bridging]     [Embedded Linux]     [Barebox]     [Linux MMC]     [Linux IIO]     [Sparse]     [Smatch]     [Linux Arch]     [x86 Platform Driver]     [Linux ACPI]     [Linux IBM ACPI]     [LM Sensors]     [CPU Freq]     [Linux Power Management]     [Linmodems]     [Linux DCCP]     [Linux SCTP]     [ALSA Devel]     [Linux USB]     [Linux PA RISC]     [Linux Samsung SOC]     [MIPS Linux]     [IBM S/390 Linux]     [ARM Linux]     [ARM Kernel]     [ARM MSM]     [Tegra Devel]     [Sparc Linux]     [Linux Security]     [Linux Sound]     [Linux Media]     [Video 4 Linux]     [Linux IRDA Users]     [Linux for the blind]     [Linux RAID]     [Linux ATA RAID]     [Device Mapper]     [Linux SCSI]     [SCSI Target Devel]     [Linux SCSI Target Infrastructure]     [Linux IDE]     [Linux SMP]     [Linux AXP]     [Linux Alpha]     [Linux M68K]     [Linux ia64]     [Linux 8086]     [Linux x86_64]     [Linux Config]     [Linux Apps]     [Linux MSDOS]     [Linux X.25]     [Linux Crypto]     [DM Crypt]     [Linux Trace Users]     [Linux Btrace]     [Linux Watchdog]     [Utrace Devel]     [Linux C Programming]     [Linux Assembly]     [Dash]     [DWARVES]     [Hail Devel]     [Linux Kernel Debugger]     [Linux gcc]     [Gcc Help]     [X.Org]     [Wine]

Add to Google Powered by Linux

[Older Kernel Discussion]     [Yosemite National Park Forum]     [Large Format Photos]     [Gimp]     [Yosemite Photos]     [Stuff]