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_ */
_______________________________________________
freebsd-xen@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-xen
To unsubscribe, send any mail to "freebsd-xen-unsubscr...@freebsd.org"

Reply via email to