Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 17 Dec 2010 12:07:47 +0000 (GMT)
From:      Robert Watson <rwatson@FreeBSD.org>
To:        freebsd-xen@FreeBSD.org
Subject:   Patches to support (or at least make compile) Xen PV drivers on i386 HVM
Message-ID:  <alpine.BSF.2.00.1012171201290.39096@fledge.watson.org>

next in thread | raw e-mail | index | archive | help

Dear all:

Something I'd like us to do for 9.0 (and maybe even 8.3) is include the Xen PV 
drivers in our GENERIC i386 and amd64 kernels.  This will improve our "just 
works" factor running on Xen HVM by avoiding a mandatory kernel recompile to 
get access to PV drivers, in turn better supporting users who use 
freebsd-update, etc.  However, today we're only in a position to really think 
about this on amd64, as currently options XENHVM and device xenpci are not 
supported on i386.

I've attached some *untested* patches that appear to get them compiling 
properly, and might even work.  However, I'm not set up to test Xen i386 under 
HVM currently.  If there are people who are able to do some testing, that 
would be great -- it wouldn't surprise me if it sort of works but specific 
things don't.  I don't know what those specific things might be. :-)

More generally: there are distressing inconsistencies between the i386 and 
amd64 Xen code in our tree.  Some is a natural outcome of supporting full PV 
on i386 and not amd64, but many are just arbitrarily different file layouts, 
etc.  I think a lot of those can be reduced to our benefit, but the first step 
is trying to rectify functional inconsistencies.

Robert N M Watson
Computer Laboratory
University of Cambridge

Index: conf/options.i386
===================================================================
--- conf/options.i386	(revision 216496)
+++ conf/options.i386	(working copy)
@@ -118,3 +118,4 @@

  NATIVE			opt_global.h
  XEN			opt_global.h
+XENHVM			opt_global.h
Index: dev/xen/netfront/netfront.c
===================================================================
--- dev/xen/netfront/netfront.c	(revision 216496)
+++ dev/xen/netfront/netfront.c	(working copy)
@@ -77,6 +77,7 @@

  #include <machine/xen/xen-os.h>
  #include <machine/xen/xenfunc.h>
+#include <machine/xen/xenvar.h>
  #include <xen/hypervisor.h>
  #include <xen/xen_intr.h>
  #include <xen/evtchn.h>
Index: dev/xen/blkfront/blkfront.c
===================================================================
--- dev/xen/blkfront/blkfront.c	(revision 216496)
+++ dev/xen/blkfront/blkfront.c	(working copy)
@@ -51,6 +51,7 @@

  #include <machine/_inttypes.h>
  #include <machine/xen/xen-os.h>
+#include <machine/xen/xenvar.h>
  #include <machine/xen/xenfunc.h>

  #include <xen/hypervisor.h>
Index: dev/xen/balloon/balloon.c
===================================================================
--- dev/xen/balloon/balloon.c	(revision 216496)
+++ dev/xen/balloon/balloon.c	(working copy)
@@ -41,8 +41,8 @@
  #include <sys/sysctl.h>

  #include <machine/xen/xen-os.h>
+#include <machine/xen/xenvar.h>
  #include <machine/xen/xenfunc.h>
-#include <machine/xen/xenvar.h>
  #include <xen/hypervisor.h>
  #include <xen/xenstore/xenstorevar.h>

Index: dev/xen/xenpci/evtchn.c
===================================================================
--- dev/xen/xenpci/evtchn.c	(revision 216496)
+++ dev/xen/xenpci/evtchn.c	(working copy)
@@ -51,13 +51,19 @@

  #include <dev/xen/xenpci/xenpcivar.h>

+#if defined(__i386__)
+#define	__ffs(word)	ffs(word)
+#elif defined(__amd64__)
  static inline unsigned long __ffs(unsigned long word)
  {
          __asm__("bsfq %1,%0"
                  :"=r" (word)
-                :"rm" (word));
+                :"rm" (word));	/* XXXRW: why no "cc"? */
          return word;
  }
+#else
+#error "evtchn: unsupported architecture"
+#endif

  #define is_valid_evtchn(x)	((x) != 0)
  #define evtchn_from_irq(x)	(irq_evtchn[irq].evtchn)
Index: i386/include/pcpu.h
===================================================================
--- i386/include/pcpu.h	(revision 216496)
+++ i386/include/pcpu.h	(working copy)
@@ -44,14 +44,17 @@
   * other processors"
   */

-#ifdef XEN
+#if defined(XEN) || defined(XENHVM)
  #ifndef NR_VIRQS
  #define	NR_VIRQS	24
  #endif
  #ifndef NR_IPIS
  #define	NR_IPIS		2
  #endif
+#endif

+#if defined(XEN)
+
  /* These are peridically updated in shared_info, and then copied here. */
  struct shadow_time_info {
  	uint64_t tsc_timestamp;     /* TSC at last update of time vals.  */
@@ -72,8 +75,18 @@
  	int	pc_callfunc_irq;					\
  	int	pc_virq_to_irq[NR_VIRQS];				\
  	int	pc_ipi_to_irq[NR_IPIS] 
-#else
+
+#elif defined(XENHVM)
+
+#define	PCPU_XEN_FIELDS							\
+	;								\
+	unsigned int pc_last_processed_l1i;				\
+	unsigned int pc_last_processed_l2i
+
+#else /* !XEN && !XENHVM */
+
  #define PCPU_XEN_FIELDS
+
  #endif

  #define	PCPU_MD_FIELDS							\
Index: i386/include/pmap.h
===================================================================
--- i386/include/pmap.h	(revision 216496)
+++ i386/include/pmap.h	(working copy)
@@ -208,7 +208,7 @@
   */
  #define	vtophys(va)	pmap_kextract((vm_offset_t)(va))

-#ifdef XEN
+#if defined(XEN)
  #include <sys/param.h>
  #include <machine/xen/xen-os.h>
  #include <machine/xen/xenvar.h>
@@ -316,7 +316,9 @@
  	}
  	return (pa);
  }
+#endif

+#if !defined(XEN)
  #define PT_UPDATES_FLUSH()
  #endif

Index: i386/include/xen/xen-os.h
===================================================================
--- i386/include/xen/xen-os.h	(revision 216496)
+++ i386/include/xen/xen-os.h	(working copy)
@@ -12,7 +12,7 @@
  #define CONFIG_X86_PAE
  #endif

-#if defined(XEN) && !defined(__XEN_INTERFACE_VERSION__) 
+#if !defined(__XEN_INTERFACE_VERSION__)
  /*
   * Can update to a more recent version when we implement
   * the hypercall page 
@@ -95,6 +95,8 @@
  /* some function prototypes */
  void trap_init(void);

+#ifndef XENHVM
+
  /*
   * STI/CLI equivalents. These basically set and clear the virtual
   * event_enable flag in teh shared_info structure. Note that when
@@ -164,6 +166,7 @@
  #define spin_lock_irqsave mtx_lock_irqsave
  #define spin_unlock_irqrestore mtx_unlock_irqrestore

+#endif

  #ifdef SMP
  #define smp_mb() mb() 
Index: i386/include/xen/hypercall.h
===================================================================
--- i386/include/xen/hypercall.h	(revision 216496)
+++ i386/include/xen/hypercall.h	(working copy)
@@ -234,9 +234,14 @@
  	return _hypercall2(int, memory_op, cmd, arg);
  }

+#if defined(XEN)
  int HYPERVISOR_multicall(multicall_entry_t *, int);
  static inline int
  _HYPERVISOR_multicall(
+#else /* XENHVM */
+static inline int
+HYPERVISOR_multicall(
+#endif
  	void *call_list, int nr_calls)
  {
  	return _hypercall2(int, multicall, call_list, nr_calls);
Index: i386/include/xen/xenvar.h
===================================================================
--- i386/include/xen/xenvar.h	(revision 216496)
+++ i386/include/xen/xenvar.h	(working copy)
@@ -28,6 +28,11 @@

  #ifndef XENVAR_H_
  #define XENVAR_H_
+
+#include <machine/xen/features.h>
+
+#if defined(XEN)
+
  #define XBOOTUP 0x1
  #define XPMAP   0x2
  extern int xendebug_flags;
@@ -36,7 +41,6 @@
  #else
  #define XENPRINTF printf
  #endif
-#include <machine/xen/features.h>

  extern	xen_pfn_t *xen_phys_machine;
  extern	xen_pfn_t *xen_pfn_to_mfn_frame_list[16];
@@ -101,4 +105,11 @@

  void  xen_destroy_contiguous_region(void * addr, int npages);

+#elif defined(XENHVM)
+
+#define	PFNTOMFN(pa)	(pa)
+#define	MFNTOPFN(ma)	(ma)
+
+#endif /* !XEN && !XENHVM */
+
  #endif
Index: i386/include/xen/xenpmap.h
===================================================================
--- i386/include/xen/xenpmap.h	(revision 216496)
+++ i386/include/xen/xenpmap.h	(working copy)
@@ -35,6 +35,8 @@

  #ifndef _XEN_XENPMAP_H_
  #define _XEN_XENPMAP_H_
+
+#if defined(XEN)
  void _xen_queue_pt_update(vm_paddr_t, vm_paddr_t, char *, int);
  void xen_pt_switch(vm_paddr_t);
  void xen_set_ldt(vm_paddr_t, unsigned long);
@@ -230,5 +232,15 @@
  	return xen_phys_machine[pfn] != INVALID_P2M_ENTRY;
  }

+#elif defined(XENHVM)

+#define	set_phys_to_machine(pfn, mfn)		((void)0)
+#define	phys_to_machine_mapping_valid(pfn)	(TRUE)
+
+#if !defined(PAE)
+#define	vtomach(va)	pmap_kextract((vm_offset_t) (va))
+#endif
+
+#endif /* !XEN && !XENHVM */
+
  #endif /* _XEN_XENPMAP_H_ */



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?alpine.BSF.2.00.1012171201290.39096>