[PATCH v10 05/20] xen: rework xen timer so it can be used early in boot process

2014-01-14 Thread Roger Pau Monne
This should not introduce any functional change, and makes the
functions suitable to be called before we have actually mapped the
vcpu_info struct on a per-cpu basis.
---
 sys/dev/xen/timer/timer.c |   29 -
 1 files changed, 20 insertions(+), 9 deletions(-)

diff --git a/sys/dev/xen/timer/timer.c b/sys/dev/xen/timer/timer.c
index 354085b..b2f6bcd 100644
--- a/sys/dev/xen/timer/timer.c
+++ b/sys/dev/xen/timer/timer.c
@@ -230,22 +230,22 @@ xen_fetch_vcpu_tinfo(struct vcpu_time_info *dst, struct 
vcpu_time_info *src)
 /**
  * \brief Get the current time, in nanoseconds, since the hypervisor booted.
  *
+ * \param vcpu vcpu_info structure to fetch the time from.
+ *
  * \note This function returns the current CPU's idea of this value, unless
  *   it happens to be less than another CPU's previously determined value.
  */
 static uint64_t
-xen_fetch_vcpu_time(void)
+xen_fetch_vcpu_time(struct vcpu_info *vcpu)
 {
struct vcpu_time_info dst;
struct vcpu_time_info *src;
uint32_t pre_version;
uint64_t now;
volatile uint64_t last;
-   struct vcpu_info *vcpu = DPCPU_GET(vcpu_info);
 
src = vcpu-time;
 
-   critical_enter();
do {
pre_version = xen_fetch_vcpu_tinfo(dst, src);
barrier();
@@ -266,16 +266,19 @@ xen_fetch_vcpu_time(void)
}
} while (!atomic_cmpset_64(xen_timer_last_time, last, now));
 
-   critical_exit();
-
return (now);
 }
 
 static uint32_t
 xentimer_get_timecount(struct timecounter *tc)
 {
+   uint32_t xen_time;
 
-   return ((uint32_t)xen_fetch_vcpu_time()  UINT_MAX);
+   critical_enter();
+   xen_time = (uint32_t)xen_fetch_vcpu_time(DPCPU_GET(vcpu_info))  
UINT_MAX;
+   critical_exit();
+
+   return (xen_time);
 }
 
 /**
@@ -305,7 +308,12 @@ xen_fetch_wallclock(struct timespec *ts)
 static void
 xen_fetch_uptime(struct timespec *ts)
 {
-   uint64_t uptime = xen_fetch_vcpu_time();
+   uint64_t uptime;
+
+   critical_enter();
+   uptime = xen_fetch_vcpu_time(DPCPU_GET(vcpu_info));
+   critical_exit();
+
ts-tv_sec = uptime / NSEC_IN_SEC;
ts-tv_nsec = uptime % NSEC_IN_SEC;
 }
@@ -354,7 +362,7 @@ xentimer_intr(void *arg)
struct xentimer_softc *sc = (struct xentimer_softc *)arg;
struct xentimer_pcpu_data *pcpu = DPCPU_PTR(xentimer_pcpu);
 
-   pcpu-last_processed = xen_fetch_vcpu_time();
+   pcpu-last_processed = xen_fetch_vcpu_time(DPCPU_GET(vcpu_info));
if (pcpu-timer != 0  sc-et.et_active)
sc-et.et_event_cb(sc-et, sc-et.et_arg);
 
@@ -415,7 +423,10 @@ xentimer_et_start(struct eventtimer *et,
do {
if (++i == 60)
panic(can't schedule timer);
-   next_time = xen_fetch_vcpu_time() + first_in_ns;
+   critical_enter();
+   next_time = xen_fetch_vcpu_time(DPCPU_GET(vcpu_info)) +
+   first_in_ns;
+   critical_exit();
error = xentimer_vcpu_start_timer(cpu, next_time);
} while (error == -ETIME);
 
-- 
1.7.7.5 (Apple Git-26)

___
freebsd-current@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-current
To unsubscribe, send any mail to freebsd-current-unsubscr...@freebsd.org


[PATCH v10 02/20] xen: add macro to detect if running as Dom0

2014-01-14 Thread Roger Pau Monne
---
 sys/xen/xen-os.h |7 +++
 1 files changed, 7 insertions(+), 0 deletions(-)

diff --git a/sys/xen/xen-os.h b/sys/xen/xen-os.h
index c7474d8..e8a5a99 100644
--- a/sys/xen/xen-os.h
+++ b/sys/xen/xen-os.h
@@ -82,6 +82,13 @@ xen_hvm_domain(void)
return (xen_domain_type == XEN_HVM_DOMAIN);
 }
 
+static inline int
+xen_initial_domain(void)
+{
+   return (xen_domain()  HYPERVISOR_start_info 
+   HYPERVISOR_start_info-flags  SIF_INITDOMAIN);
+}
+
 #ifndef xen_mb
 #define xen_mb() mb()
 #endif
-- 
1.7.7.5 (Apple Git-26)

___
freebsd-current@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-current
To unsubscribe, send any mail to freebsd-current-unsubscr...@freebsd.org


[PATCH v10 07/20] xen: implement hook to fetch e820 memory map

2014-01-14 Thread Roger Pau Monne
---
 sys/amd64/amd64/machdep.c   |   50 ++
 sys/amd64/include/pc/bios.h |2 +
 sys/amd64/include/sysarch.h |1 +
 sys/x86/xen/pv.c|   25 +
 4 files changed, 59 insertions(+), 19 deletions(-)

diff --git a/sys/amd64/amd64/machdep.c b/sys/amd64/amd64/machdep.c
index b8d6dc2..64df89a 100644
--- a/sys/amd64/amd64/machdep.c
+++ b/sys/amd64/amd64/machdep.c
@@ -169,11 +169,15 @@ SYSINIT(cpu, SI_SUB_CPU, SI_ORDER_FIRST, cpu_startup, 
NULL);
 /* Preload data parse function */
 static caddr_t native_parse_preload_data(u_int64_t);
 
+/* Native function to fetch and parse the e820 map */
+static void native_parse_memmap(caddr_t, vm_paddr_t *, int *);
+
 /* Default init_ops implementation. */
 struct init_ops init_ops = {
.parse_preload_data =   native_parse_preload_data,
.early_delay_init = i8254_init,
.early_delay =  i8254_delay,
+   .parse_memmap = native_parse_memmap,
 };
 
 /*
@@ -1403,21 +1407,12 @@ add_physmap_entry(uint64_t base, uint64_t length, 
vm_paddr_t *physmap,
return (1);
 }
 
-static void
-add_smap_entries(struct bios_smap *smapbase, vm_paddr_t *physmap,
-int *physmap_idx)
+void
+bios_add_smap_entries(struct bios_smap *smapbase, u_int32_t smapsize,
+  vm_paddr_t *physmap, int *physmap_idx)
 {
struct bios_smap *smap, *smapend;
-   u_int32_t smapsize;
 
-   /*
-* Memory map from INT 15:E820.
-*
-* subr_module.c says:
-* Consumer may safely assume that size value precedes data.
-* ie: an int32_t immediately precedes smap.
-*/
-   smapsize = *((u_int32_t *)smapbase - 1);
smapend = (struct bios_smap *)((uintptr_t)smapbase + smapsize);
 
for (smap = smapbase; smap  smapend; smap++) {
@@ -1434,6 +1429,29 @@ add_smap_entries(struct bios_smap *smapbase, vm_paddr_t 
*physmap,
}
 }
 
+static void
+native_parse_memmap(caddr_t kmdp, vm_paddr_t *physmap, int *physmap_idx)
+{
+   struct bios_smap *smap;
+   u_int32_t size;
+
+   /*
+* Memory map from INT 15:E820.
+*
+* subr_module.c says:
+* Consumer may safely assume that size value precedes data.
+* ie: an int32_t immediately precedes smap.
+*/
+
+   smap = (struct bios_smap *)preload_search_info(kmdp,
+   MODINFO_METADATA | MODINFOMD_SMAP);
+   if (smap == NULL)
+   panic(No BIOS smap info from loader!);
+   size = *((u_int32_t *)smap - 1);
+
+   bios_add_smap_entries(smap, size, physmap, physmap_idx);
+}
+
 /*
  * Populate the (physmap) array with base/bound pairs describing the
  * available physical memory in the system, then test this memory and
@@ -1451,19 +1469,13 @@ getmemsize(caddr_t kmdp, u_int64_t first)
vm_paddr_t pa, physmap[PHYSMAP_SIZE];
u_long physmem_start, physmem_tunable, memtest;
pt_entry_t *pte;
-   struct bios_smap *smapbase;
quad_t dcons_addr, dcons_size;
 
bzero(physmap, sizeof(physmap));
basemem = 0;
physmap_idx = 0;
 
-   smapbase = (struct bios_smap *)preload_search_info(kmdp,
-   MODINFO_METADATA | MODINFOMD_SMAP);
-   if (smapbase == NULL)
-   panic(No BIOS smap info from loader!);
-
-   add_smap_entries(smapbase, physmap, physmap_idx);
+   init_ops.parse_memmap(kmdp, physmap, physmap_idx);
 
/*
 * Find the 'base memory' segment for SMP
diff --git a/sys/amd64/include/pc/bios.h b/sys/amd64/include/pc/bios.h
index e7d568e..95ef703 100644
--- a/sys/amd64/include/pc/bios.h
+++ b/sys/amd64/include/pc/bios.h
@@ -106,6 +106,8 @@ struct bios_oem {
 intbios_oem_strings(struct bios_oem *oem, u_char *buffer, size_t maxlen);
 uint32_t bios_sigsearch(uint32_t start, u_char *sig, int siglen, int paralen,
int sigofs);
+void bios_add_smap_entries(struct bios_smap *smapbase, u_int32_t smapsize,
+   vm_paddr_t *physmap, int *physmap_idx);
 #endif
 
 #endif /* _MACHINE_PC_BIOS_H_ */
diff --git a/sys/amd64/include/sysarch.h b/sys/amd64/include/sysarch.h
index 60fa635..084223e 100644
--- a/sys/amd64/include/sysarch.h
+++ b/sys/amd64/include/sysarch.h
@@ -15,6 +15,7 @@ struct init_ops {
caddr_t (*parse_preload_data)(u_int64_t);
void(*early_delay_init)(void);
void(*early_delay)(int);
+   void(*parse_memmap)(caddr_t, vm_paddr_t *, int *);
 };
 
 extern struct init_ops init_ops;
diff --git a/sys/x86/xen/pv.c b/sys/x86/xen/pv.c
index 0ec4b54..d11bc1a 100644
--- a/sys/x86/xen/pv.c
+++ b/sys/x86/xen/pv.c
@@ -48,6 +48,7 @@ __FBSDID($FreeBSD$);
 
 #include machine/sysarch.h
 #include machine/clock.h
+#include machine/pc/bios.h
 
 #include xen/xen-os.h
 #include xen/hypervisor.h
@@ -57,8 +58,11 @@ extern u_int64_t hammer_time(u_int64_t, u_int64_t);
 /* Xen initial function */
 extern u_int64_t hammer_time_xen(start_info_t *, u_int64_t);
 
+#define 

[PATCH v10 06/20] xen: implement an early timer for Xen PVH

2014-01-14 Thread Roger Pau Monne
When running as a PVH guest, there's no emulated i8254, so we need to
use the Xen PV timer as the early source for DELAY. This change allows
for different implementations of the early DELAY function and
implements a Xen variant for it.
---
 sys/amd64/amd64/machdep.c   |6 ++-
 sys/amd64/include/clock.h   |5 ++
 sys/amd64/include/sysarch.h |2 +
 sys/conf/files.amd64|1 +
 sys/conf/files.i386 |1 +
 sys/dev/xen/timer/timer.c   |   33 +
 sys/i386/include/clock.h|5 ++
 sys/x86/isa/clock.c |   53 +
 sys/x86/x86/delay.c |  112 +++
 sys/x86/xen/pv.c|3 +
 10 files changed, 167 insertions(+), 54 deletions(-)
 create mode 100644 sys/x86/x86/delay.c

diff --git a/sys/amd64/amd64/machdep.c b/sys/amd64/amd64/machdep.c
index 343f9b8..b8d6dc2 100644
--- a/sys/amd64/amd64/machdep.c
+++ b/sys/amd64/amd64/machdep.c
@@ -172,6 +172,8 @@ static caddr_t native_parse_preload_data(u_int64_t);
 /* Default init_ops implementation. */
 struct init_ops init_ops = {
.parse_preload_data =   native_parse_preload_data,
+   .early_delay_init = i8254_init,
+   .early_delay =  i8254_delay,
 };
 
 /*
@@ -1822,10 +1824,10 @@ hammer_time(u_int64_t modulep, u_int64_t physfree)
lidt(r_idt);
 
/*
-* Initialize the i8254 before the console so that console
+* Initialize the early delay before the console so that console
 * initialization can use DELAY().
 */
-   i8254_init();
+   init_ops.early_delay_init();
 
/*
 * Initialize the console before we print anything out.
diff --git a/sys/amd64/include/clock.h b/sys/amd64/include/clock.h
index d7f7d82..ac8818f 100644
--- a/sys/amd64/include/clock.h
+++ b/sys/amd64/include/clock.h
@@ -25,6 +25,11 @@ extern int   smp_tsc;
 #endif
 
 void   i8254_init(void);
+void   i8254_delay(int);
+#ifdef XENHVM
+void   xen_delay_init(void);
+void   xen_delay(int);
+#endif
 
 /*
  * Driver to clock driver interface.
diff --git a/sys/amd64/include/sysarch.h b/sys/amd64/include/sysarch.h
index 58ac8cd..60fa635 100644
--- a/sys/amd64/include/sysarch.h
+++ b/sys/amd64/include/sysarch.h
@@ -13,6 +13,8 @@
  */
 struct init_ops {
caddr_t (*parse_preload_data)(u_int64_t);
+   void(*early_delay_init)(void);
+   void(*early_delay)(int);
 };
 
 extern struct init_ops init_ops;
diff --git a/sys/conf/files.amd64 b/sys/conf/files.amd64
index 16029d8..109a796 100644
--- a/sys/conf/files.amd64
+++ b/sys/conf/files.amd64
@@ -565,6 +565,7 @@ x86/x86/mptable_pci.c   optionalmptable 
pci
 x86/x86/msi.c  optionalpci
 x86/x86/nexus.cstandard
 x86/x86/tsc.c  standard
+x86/x86/delay.cstandard
 x86/xen/hvm.c  optionalxenhvm
 x86/xen/xen_intr.c optionalxen | xenhvm
 x86/xen/pv.c   optionalxenhvm
diff --git a/sys/conf/files.i386 b/sys/conf/files.i386
index eb8697c..790296d 100644
--- a/sys/conf/files.i386
+++ b/sys/conf/files.i386
@@ -600,5 +600,6 @@ x86/x86/mptable_pci.c   optional apic native pci
 x86/x86/msi.c  optional apic pci
 x86/x86/nexus.cstandard
 x86/x86/tsc.c  standard
+x86/x86/delay.cstandard
 x86/xen/hvm.c  optional xenhvm
 x86/xen/xen_intr.c optional xen | xenhvm
diff --git a/sys/dev/xen/timer/timer.c b/sys/dev/xen/timer/timer.c
index b2f6bcd..96372ab 100644
--- a/sys/dev/xen/timer/timer.c
+++ b/sys/dev/xen/timer/timer.c
@@ -59,6 +59,9 @@ __FBSDID($FreeBSD$);
 #include machine/_inttypes.h
 #include machine/smp.h
 
+/* For the declaration of clock_lock */
+#include isa/rtc.h
+
 #include clock_if.h
 
 static devclass_t xentimer_devclass;
@@ -584,6 +587,36 @@ xentimer_suspend(device_t dev)
return (0);
 }
 
+/*
+ * Xen delay early init
+ */
+void xen_delay_init(void)
+{
+   /* Init the clock lock */
+   mtx_init(clock_lock, clk, NULL, MTX_SPIN | MTX_NOPROFILE);
+}
+/*
+ * Xen PV DELAY function
+ *
+ * When running on PVH mode we don't have an emulated i8524, so
+ * make use of the Xen time info in order to code a simple DELAY
+ * function that can be used during early boot.
+ */
+void xen_delay(int n)
+{
+   uint64_t end_ns;
+   uint64_t current;
+
+   end_ns = xen_fetch_vcpu_time(HYPERVISOR_shared_info-vcpu_info[0]);
+   end_ns += n * NSEC_IN_USEC;
+
+   for (;;) {
+   current = 
xen_fetch_vcpu_time(HYPERVISOR_shared_info-vcpu_info[0]);
+   if (current = end_ns)
+   break;
+   }
+}
+
 static device_method_t xentimer_methods[] = {
DEVMETHOD(device_identify, xentimer_identify),
DEVMETHOD(device_probe, xentimer_probe),
diff --git a/sys/i386/include/clock.h b/sys/i386/include/clock.h

[PATCH v10 01/20] xen: add PV/PVH kernel entry point

2014-01-14 Thread Roger Pau Monne
Add the PV/PVH entry point and the low level functions for PVH
initialization.
---
 sys/amd64/amd64/locore.S |1 +
 sys/amd64/amd64/xen-locore.S |   83 +
 sys/amd64/include/asmacros.h |   26 +
 sys/conf/files.amd64 |2 +
 sys/i386/xen/xen_machdep.c   |2 +
 sys/x86/xen/hvm.c|1 +
 sys/x86/xen/pv.c |  119 ++
 sys/xen/xen-os.h |4 ++
 8 files changed, 238 insertions(+), 0 deletions(-)
 create mode 100644 sys/amd64/amd64/xen-locore.S
 create mode 100644 sys/x86/xen/pv.c

diff --git a/sys/amd64/amd64/locore.S b/sys/amd64/amd64/locore.S
index 55cda3a..4acef97 100644
--- a/sys/amd64/amd64/locore.S
+++ b/sys/amd64/amd64/locore.S
@@ -84,5 +84,6 @@ NON_GPROF_ENTRY(btext)
 
.bss
ALIGN_DATA  /* just to be sure */
+   .globl  bootstack
.space  0x1000  /* space for bootstack - temporary 
stack */
 bootstack:
diff --git a/sys/amd64/amd64/xen-locore.S b/sys/amd64/amd64/xen-locore.S
new file mode 100644
index 000..84287c4
--- /dev/null
+++ b/sys/amd64/amd64/xen-locore.S
@@ -0,0 +1,83 @@
+/*-
+ * Copyright (c) 2003 Peter Wemm pe...@freebsd.org
+ * Copyright (c) 2013 Roger Pau Monne roy...@freebsd.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *notice, this list of conditions and the following disclaimer in the
+ *documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#include machine/asmacros.h
+#include machine/psl.h
+#include machine/pmap.h
+#include machine/specialreg.h
+
+#include xen/xen-os.h
+#define __ASSEMBLY__
+#include xen/interface/elfnote.h
+
+#include assym.s
+
+.section __xen_guest
+   ELFNOTE(Xen, XEN_ELFNOTE_GUEST_OS,   .asciz, FreeBSD)
+   ELFNOTE(Xen, XEN_ELFNOTE_GUEST_VERSION,  .asciz, HEAD)
+   ELFNOTE(Xen, XEN_ELFNOTE_XEN_VERSION,.asciz, xen-3.0)
+   ELFNOTE(Xen, XEN_ELFNOTE_VIRT_BASE,  .quad,  KERNBASE)
+   ELFNOTE(Xen, XEN_ELFNOTE_PADDR_OFFSET,   .quad,  KERNBASE) /* Xen 
honours elf-p_paddr; compensate for this */
+   ELFNOTE(Xen, XEN_ELFNOTE_ENTRY,  .quad,  xen_start)
+   ELFNOTE(Xen, XEN_ELFNOTE_HYPERCALL_PAGE, .quad,  hypercall_page)
+   ELFNOTE(Xen, XEN_ELFNOTE_HV_START_LOW,   .quad,  HYPERVISOR_VIRT_START)
+   ELFNOTE(Xen, XEN_ELFNOTE_FEATURES,   .asciz, 
writable_descriptor_tables|auto_translated_physmap|supervisor_mode_kernel|hvm_callback_vector)
+   ELFNOTE(Xen, XEN_ELFNOTE_PAE_MODE,   .asciz, yes)
+   ELFNOTE(Xen, XEN_ELFNOTE_L1_MFN_VALID,   .long,  PG_V, PG_V)
+   ELFNOTE(Xen, XEN_ELFNOTE_LOADER, .asciz, generic)
+   ELFNOTE(Xen, XEN_ELFNOTE_SUSPEND_CANCEL, .long,  0)
+   ELFNOTE(Xen, XEN_ELFNOTE_BSD_SYMTAB, .asciz, yes)
+
+   .text
+.p2align PAGE_SHIFT, 0x90  /* Hypercall_page needs to be PAGE aligned */
+
+NON_GPROF_ENTRY(hypercall_page)
+   .skip   0x1000, 0x90/* Fill with nops */
+
+NON_GPROF_ENTRY(xen_start)
+   /* Don't trust what the loader gives for rflags. */
+   pushq   $PSL_KERNEL
+   popfq
+
+   /* Parameters for the xen init function */
+   movq%rsi, %rdi  /* shared_info (arg 1) */
+   movq%rsp, %rsi  /* xenstack(arg 2) */
+
+   /* Use our own stack */
+   movq$bootstack,%rsp
+   xorl%ebp, %ebp
+
+   /* u_int64_t hammer_time_xen(start_info_t *si, u_int64_t xenstack); */
+   callhammer_time_xen
+   movq%rax, %rsp  /* set up kstack for mi_startup() */
+   callmi_startup  /* autoconfiguration, mountroot etc */
+
+   /* NOTREACHED */
+0: hlt
+   jmp 0b
diff --git a/sys/amd64/include/asmacros.h b/sys/amd64/include/asmacros.h
index 1fb592a..ce8dce4 100644

[PATCH v10 00/20] FreeBSD PVH DomU support

2014-01-14 Thread Roger Pau Monne
This series is a split of the previous patch Xen x86 DomU PVH 
support, with the aim to make the review of the code easier.

The series can also be found on my git repo:

git://xenbits.xen.org/people/royger/freebsd.git pvh_v10

or

http://xenbits.xen.org/gitweb/?p=people/royger/freebsd.git;a=shortlog;h=refs/heads/pvh_v10

PVH mode is basically a PV guest inside an HVM container, and shares
a great amount of code with PVHVM. The main difference is the way the
guest is started, PVH uses the PV start sequence, jumping directly
into the kernel entry point in long mode and with page tables set.
The main work of this patch consists in setting the environment as
similar as possible to what native FreeBSD expects, and then adding
hooks to the PV ops when necessary.

This new version of the series (v10) addresses the comments from the 
previous posted version (v9). Major changes between v9 and v10:

 * Add a identify routine to xenpv instead of attaching it manually 
   from the Xen nexus.
 * Remove bus routines from xenpci (devices are now attached to xenpv 
   instead).
 * Add __printflike modifier to xc_printf.
___
freebsd-current@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-current
To unsubscribe, send any mail to freebsd-current-unsubscr...@freebsd.org


[PATCH v10 03/20] xen: add and enable Xen console for PVH guests

2014-01-14 Thread Roger Pau Monne
This adds and enables the console used on XEN kernels.
---
 sys/conf/files |4 +-
 sys/dev/xen/console/console.c  |   37 +--
 sys/dev/xen/console/xencons_ring.c |   15 +
 sys/i386/include/xen/xen-os.h  |1 -
 sys/i386/xen/xen_machdep.c |   17 
 sys/x86/xen/pv.c   |4 +++
 sys/xen/xen-os.h   |4 +++
 7 files changed, 50 insertions(+), 32 deletions(-)

diff --git a/sys/conf/files b/sys/conf/files
index 33fc75d..bddf021 100644
--- a/sys/conf/files
+++ b/sys/conf/files
@@ -2493,8 +2493,8 @@ dev/xe/if_xe_pccard.c optional xe pccard
 dev/xen/balloon/balloon.c  optional xen | xenhvm
 dev/xen/blkfront/blkfront.coptional xen | xenhvm
 dev/xen/blkback/blkback.c  optional xen | xenhvm
-dev/xen/console/console.c  optional xen
-dev/xen/console/xencons_ring.c optional xen
+dev/xen/console/console.c  optional xen | xenhvm
+dev/xen/console/xencons_ring.c optional xen | xenhvm
 dev/xen/control/control.c  optional xen | xenhvm
 dev/xen/netback/netback.c  optional xen | xenhvm
 dev/xen/netfront/netfront.coptional xen | xenhvm
diff --git a/sys/dev/xen/console/console.c b/sys/dev/xen/console/console.c
index 23eaee2..899dffc 100644
--- a/sys/dev/xen/console/console.c
+++ b/sys/dev/xen/console/console.c
@@ -69,11 +69,14 @@ struct mtx  cn_mtx;
 static char wbuf[WBUF_SIZE];
 static char rbuf[RBUF_SIZE];
 static int rc, rp;
-static unsigned int cnsl_evt_reg;
+unsigned int cnsl_evt_reg;
 static unsigned int wc, wp; /* write_cons, write_prod */
 xen_intr_handle_t xen_intr_handle;
 device_t xencons_dev;
 
+/* Virtual address of the shared console page */
+char *console_page;
+
 #ifdef KDB
 static int xc_altbrk;
 #endif
@@ -110,9 +113,26 @@ static struct ttydevsw xc_ttydevsw = {
 .tsw_outwakeup = xcoutwakeup,
 };
 
+/*- Debug function 
---*/
+#define XC_PRINTF_BUFSIZE 1024
+void
+xc_printf(const char *fmt, ...)
+{
+   static char buf[XC_PRINTF_BUFSIZE];
+   __va_list ap;
+
+   va_start(ap, fmt);
+   vsnprintf(buf, sizeof(buf), fmt, ap);
+   va_end(ap);
+   HYPERVISOR_console_write(buf, strlen(buf));
+}
+
 static void
 xc_cnprobe(struct consdev *cp)
 {
+   if (!xen_pv_domain())
+   return;
+
cp-cn_pri = CN_REMOTE;
sprintf(cp-cn_name, %s0, driver_name);
 }
@@ -175,7 +195,7 @@ static void
 xc_cnputc(struct consdev *dev, int c)
 {
 
-   if (xen_start_info-flags  SIF_INITDOMAIN)
+   if (xen_initial_domain())
xc_cnputc_dom0(dev, c);
else
xc_cnputc_domu(dev, c);
@@ -206,8 +226,7 @@ xcons_putc(int c)
xcons_force_flush();
 #endif 
}
-   if (cnsl_evt_reg)
-   __xencons_tx_flush();
+   __xencons_tx_flush();

/* inform start path that we're pretty full */
return ((wp - wc) = WBUF_SIZE - 100) ? TRUE : FALSE;
@@ -217,6 +236,10 @@ static void
 xc_identify(driver_t *driver, device_t parent)
 {
device_t child;
+
+   if (!xen_pv_domain())
+   return;
+
child = BUS_ADD_CHILD(parent, 0, driver_name, 0);
device_set_driver(child, driver);
device_set_desc(child, Xen Console);
@@ -245,7 +268,7 @@ xc_attach(device_t dev)
cnsl_evt_reg = 1;
callout_reset(xc_callout, XC_POLLTIME, xc_timeout, xccons);
 
-   if (xen_start_info-flags  SIF_INITDOMAIN) {
+   if (xen_initial_domain()) {
error = xen_intr_bind_virq(dev, VIRQ_CONSOLE, 0, NULL,
   xencons_priv_interrupt, NULL,
   INTR_TYPE_TTY, xen_intr_handle);
@@ -309,7 +332,7 @@ __xencons_tx_flush(void)
sz = wp - wc;
if (sz  (WBUF_SIZE - WBUF_MASK(wc)))
sz = WBUF_SIZE - WBUF_MASK(wc);
-   if (xen_start_info-flags  SIF_INITDOMAIN) {
+   if (xen_initial_domain()) {
HYPERVISOR_console_io(CONSOLEIO_write, sz, 
wbuf[WBUF_MASK(wc)]);
wc += sz;
} else {
@@ -424,7 +447,7 @@ xcons_force_flush(void)
 {
intsz;
 
-   if (xen_start_info-flags  SIF_INITDOMAIN)
+   if (xen_initial_domain())
return;
 
/* Spin until console data is flushed through to the domain controller. 
*/
diff --git a/sys/dev/xen/console/xencons_ring.c 
b/sys/dev/xen/console/xencons_ring.c
index 3701551..d826363 100644
--- a/sys/dev/xen/console/xencons_ring.c
+++ b/sys/dev/xen/console/xencons_ring.c
@@ -32,9 +32,9 @@ __FBSDID($FreeBSD$);
 
 #define console_evtchn console.domU.evtchn
 xen_intr_handle_t console_handle;
-extern char *console_page;
 extern struct mtx  cn_mtx;
 extern device_t xencons_dev;
+extern int cnsl_evt_reg;
 
 static inline struct 

[PATCH v10 08/20] xen: use the same hypercall mechanism for XEN and XENHVM

2014-01-14 Thread Roger Pau Monne
---
 sys/amd64/include/xen/hypercall.h |7 ---
 sys/i386/i386/locore.s|9 +
 sys/i386/include/xen/hypercall.h  |8 
 sys/x86/xen/hvm.c |   24 ++--
 4 files changed, 19 insertions(+), 29 deletions(-)

diff --git a/sys/amd64/include/xen/hypercall.h 
b/sys/amd64/include/xen/hypercall.h
index a1b2a5c..499fb4d 100644
--- a/sys/amd64/include/xen/hypercall.h
+++ b/sys/amd64/include/xen/hypercall.h
@@ -51,15 +51,8 @@
 #define CONFIG_XEN_COMPAT  0x030002
 #define __must_check
 
-#ifdef XEN
 #define HYPERCALL_STR(name)\
call hypercall_page + (STR(__HYPERVISOR_##name) * 32)
-#else
-#define HYPERCALL_STR(name)\
-   mov $(STR(__HYPERVISOR_##name) * 32),%%eax; \
-   add hypercall_stubs(%%rip),%%rax; \
-   call *%%rax
-#endif
 
 #define _hypercall0(type, name)\
 ({ \
diff --git a/sys/i386/i386/locore.s b/sys/i386/i386/locore.s
index 68cb430..bd136b1 100644
--- a/sys/i386/i386/locore.s
+++ b/sys/i386/i386/locore.s
@@ -898,3 +898,12 @@ done_pde:
 #endif
 
ret
+
+#ifdef XENHVM
+/* Xen Hypercall page */
+   .text
+.p2align PAGE_SHIFT, 0x90  /* Hypercall_page needs to be PAGE aligned */
+
+NON_GPROF_ENTRY(hypercall_page)
+   .skip   0x1000, 0x90/* Fill with nops */
+#endif
diff --git a/sys/i386/include/xen/hypercall.h b/sys/i386/include/xen/hypercall.h
index edc13f4..16b5ee2 100644
--- a/sys/i386/include/xen/hypercall.h
+++ b/sys/i386/include/xen/hypercall.h
@@ -39,16 +39,8 @@
 #defineENOXENSYS   38
 #define CONFIG_XEN_COMPAT  0x030002
 
-
-#if defined(XEN)
 #define HYPERCALL_STR(name) \
 call hypercall_page + (STR(__HYPERVISOR_##name) * 32)
-#else
-#define HYPERCALL_STR(name) \
-mov hypercall_stubs,%%eax;\
-add $(STR(__HYPERVISOR_##name) * 32),%%eax; \
-call *%%eax
-#endif
 
 #define _hypercall0(type, name) \
 ({  \
diff --git a/sys/x86/xen/hvm.c b/sys/x86/xen/hvm.c
index b397721..9a0411e 100644
--- a/sys/x86/xen/hvm.c
+++ b/sys/x86/xen/hvm.c
@@ -157,7 +157,7 @@ DPCPU_DEFINE(xen_intr_handle_t, 
ipi_handle[nitems(xen_ipis)]);
 
 /*-- Hypervisor Access Shared Memory Regions 
-*/
 /** Hypercall table accessed via HYPERVISOR_*_op() methods. */
-char *hypercall_stubs;
+extern char *hypercall_page;
 shared_info_t *HYPERVISOR_shared_info;
 start_info_t *HYPERVISOR_start_info;
 
@@ -559,7 +559,7 @@ xen_hvm_cpuid_base(void)
  * Allocate and fill in the hypcall page.
  */
 static int
-xen_hvm_init_hypercall_stubs(void)
+xen_hvm_init_hypercall_stubs(enum xen_hvm_init_type init_type)
 {
uint32_t base, regs[4];
int i;
@@ -568,7 +568,7 @@ xen_hvm_init_hypercall_stubs(void)
if (base == 0)
return (ENXIO);
 
-   if (hypercall_stubs == NULL) {
+   if (init_type == XEN_HVM_INIT_COLD) {
do_cpuid(base + 1, regs);
printf(XEN: Hypervisor version %d.%d detected.\n,
regs[0]  16, regs[0]  0x);
@@ -578,18 +578,9 @@ xen_hvm_init_hypercall_stubs(void)
 * Find the hypercall pages.
 */
do_cpuid(base + 2, regs);
-   
-   if (hypercall_stubs == NULL) {
-   size_t call_region_size;
-
-   call_region_size = regs[0] * PAGE_SIZE;
-   hypercall_stubs = malloc(call_region_size, M_XENHVM, M_NOWAIT);
-   if (hypercall_stubs == NULL)
-   panic(Unable to allocate Xen hypercall region);
-   }
 
for (i = 0; i  regs[0]; i++)
-   wrmsr(regs[1], vtophys(hypercall_stubs + i * PAGE_SIZE) + i);
+   wrmsr(regs[1], vtophys(hypercall_page + i * PAGE_SIZE) + i);
 
return (0);
 }
@@ -692,7 +683,12 @@ xen_hvm_init(enum xen_hvm_init_type init_type)
if (init_type == XEN_HVM_INIT_CANCELLED_SUSPEND)
return;
 
-   error = xen_hvm_init_hypercall_stubs();
+   if (xen_pv_domain()) {
+   /* hypercall page is already set in the PV case */
+   error = 0;
+   } else {
+   error = xen_hvm_init_hypercall_stubs(init_type);
+   }
 
switch (init_type) {
case XEN_HVM_INIT_COLD:
-- 
1.7.7.5 (Apple Git-26)

___
freebsd-current@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-current
To unsubscribe, send any mail to freebsd-current-unsubscr...@freebsd.org


[PATCH v10 09/20] xen: add a apic_enumerator for PVH

2014-01-14 Thread Roger Pau Monne
---
 sys/conf/files.amd64 |1 +
 sys/x86/xen/pvcpu_enum.c |  136 ++
 2 files changed, 137 insertions(+), 0 deletions(-)
 create mode 100644 sys/x86/xen/pvcpu_enum.c

diff --git a/sys/conf/files.amd64 b/sys/conf/files.amd64
index 109a796..a3491da 100644
--- a/sys/conf/files.amd64
+++ b/sys/conf/files.amd64
@@ -569,3 +569,4 @@ x86/x86/delay.c standard
 x86/xen/hvm.c  optionalxenhvm
 x86/xen/xen_intr.c optionalxen | xenhvm
 x86/xen/pv.c   optionalxenhvm
+x86/xen/pvcpu_enum.c   optionalxenhvm
diff --git a/sys/x86/xen/pvcpu_enum.c b/sys/x86/xen/pvcpu_enum.c
new file mode 100644
index 000..0384886
--- /dev/null
+++ b/sys/x86/xen/pvcpu_enum.c
@@ -0,0 +1,136 @@
+/*-
+ * Copyright (c) 2003 John Baldwin j...@freebsd.org
+ * Copyright (c) 2013 Roger Pau Monné roger@citrix.com
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *notice, this list of conditions and the following disclaimer in the
+ *documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the author nor the names of any co-contributors
+ *may be used to endorse or promote products derived from this software
+ *without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include sys/cdefs.h
+__FBSDID($FreeBSD$);
+
+#include sys/param.h
+#include sys/systm.h
+#include sys/bus.h
+#include sys/kernel.h
+#include sys/smp.h
+#include sys/pcpu.h
+#include vm/vm.h
+#include vm/pmap.h
+
+#include machine/intr_machdep.h
+#include machine/apicvar.h
+
+#include machine/cpu.h
+#include machine/smp.h
+
+#include xen/xen-os.h
+#include xen/hypervisor.h
+
+#include xen/interface/vcpu.h
+
+static int xenpv_probe(void);
+static int xenpv_probe_cpus(void);
+static int xenpv_setup_local(void);
+static int xenpv_setup_io(void);
+
+static struct apic_enumerator xenpv_enumerator = {
+   Xen PV,
+   xenpv_probe,
+   xenpv_probe_cpus,
+   xenpv_setup_local,
+   xenpv_setup_io
+};
+
+/*
+ * This enumerator will only be registered on PVH
+ */
+static int
+xenpv_probe(void)
+{
+   return (-100);
+}
+
+/*
+ * Test each possible vCPU in order to find the number of vCPUs
+ */
+static int
+xenpv_probe_cpus(void)
+{
+#ifdef SMP
+   int i, ret;
+
+   for (i = 0; i  MAXCPU; i++) {
+   ret = HYPERVISOR_vcpu_op(VCPUOP_is_up, i, NULL);
+   if (ret = 0)
+   cpu_add((i * 2), (i == 0));
+   }
+#endif
+   return (0);
+}
+
+/*
+ * Initialize the vCPU id of the BSP
+ */
+static int
+xenpv_setup_local(void)
+{
+   PCPU_SET(vcpu_id, 0);
+   return (0);
+}
+
+/*
+ * On PVH guests there's no IO APIC
+ */
+static int
+xenpv_setup_io(void)
+{
+   return (0);
+}
+
+static void
+xenpv_register(void *dummy __unused)
+{
+   if (xen_pv_domain()) {
+   apic_register_enumerator(xenpv_enumerator);
+   }
+}
+SYSINIT(xenpv_register, SI_SUB_TUNABLES - 1, SI_ORDER_FIRST, xenpv_register, 
NULL);
+
+/*
+ * Setup per-CPU vCPU IDs
+ */
+static void
+xenpv_set_ids(void *dummy)
+{
+   struct pcpu *pc;
+   int i;
+
+   CPU_FOREACH(i) {
+   pc = pcpu_find(i);
+   pc-pc_vcpu_id = i;
+   }
+}
+SYSINIT(xenpv_set_ids, SI_SUB_CPU, SI_ORDER_MIDDLE, xenpv_set_ids, NULL);
-- 
1.7.7.5 (Apple Git-26)

___
freebsd-current@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-current
To unsubscribe, send any mail to freebsd-current-unsubscr...@freebsd.org

[PATCH v10 04/20] amd64: introduce hook for custom preload metadata parsers

2014-01-14 Thread Roger Pau Monne
---
 sys/amd64/amd64/machdep.c   |   41 --
 sys/amd64/include/sysarch.h |   12 ++
 sys/x86/xen/pv.c|   82 +++
 3 files changed, 124 insertions(+), 11 deletions(-)

diff --git a/sys/amd64/amd64/machdep.c b/sys/amd64/amd64/machdep.c
index f0d4ea8..343f9b8 100644
--- a/sys/amd64/amd64/machdep.c
+++ b/sys/amd64/amd64/machdep.c
@@ -126,6 +126,7 @@ __FBSDID($FreeBSD$);
 #include machine/reg.h
 #include machine/sigframe.h
 #include machine/specialreg.h
+#include machine/sysarch.h
 #ifdef PERFMON
 #include machine/perfmon.h
 #endif
@@ -165,6 +166,14 @@ static int  set_fpcontext(struct thread *td, const 
mcontext_t *mcp,
 char *xfpustate, size_t xfpustate_len);
 SYSINIT(cpu, SI_SUB_CPU, SI_ORDER_FIRST, cpu_startup, NULL);
 
+/* Preload data parse function */
+static caddr_t native_parse_preload_data(u_int64_t);
+
+/* Default init_ops implementation. */
+struct init_ops init_ops = {
+   .parse_preload_data =   native_parse_preload_data,
+};
+
 /*
  * The file conf/ldscript.amd64 defines the symbol kernphys.  Its value is
  * the physical address at which the kernel is loaded.
@@ -1685,6 +1694,26 @@ do_next:
msgbufp = (struct msgbuf *)PHYS_TO_DMAP(phys_avail[pa_indx]);
 }
 
+static caddr_t
+native_parse_preload_data(u_int64_t modulep)
+{
+   caddr_t kmdp;
+
+   preload_metadata = (caddr_t)(uintptr_t)(modulep + KERNBASE);
+   preload_bootstrap_relocate(KERNBASE);
+   kmdp = preload_search_by_type(elf kernel);
+   if (kmdp == NULL)
+   kmdp = preload_search_by_type(elf64 kernel);
+   boothowto = MD_FETCH(kmdp, MODINFOMD_HOWTO, int);
+   kern_envp = MD_FETCH(kmdp, MODINFOMD_ENVP, char *) + KERNBASE;
+#ifdef DDB
+   ksym_start = MD_FETCH(kmdp, MODINFOMD_SSYM, uintptr_t);
+   ksym_end = MD_FETCH(kmdp, MODINFOMD_ESYM, uintptr_t);
+#endif
+
+   return (kmdp);
+}
+
 u_int64_t
 hammer_time(u_int64_t modulep, u_int64_t physfree)
 {
@@ -1709,17 +1738,7 @@ hammer_time(u_int64_t modulep, u_int64_t physfree)
 */
proc_linkup0(proc0, thread0);
 
-   preload_metadata = (caddr_t)(uintptr_t)(modulep + KERNBASE);
-   preload_bootstrap_relocate(KERNBASE);
-   kmdp = preload_search_by_type(elf kernel);
-   if (kmdp == NULL)
-   kmdp = preload_search_by_type(elf64 kernel);
-   boothowto = MD_FETCH(kmdp, MODINFOMD_HOWTO, int);
-   kern_envp = MD_FETCH(kmdp, MODINFOMD_ENVP, char *) + KERNBASE;
-#ifdef DDB
-   ksym_start = MD_FETCH(kmdp, MODINFOMD_SSYM, uintptr_t);
-   ksym_end = MD_FETCH(kmdp, MODINFOMD_ESYM, uintptr_t);
-#endif
+   kmdp = init_ops.parse_preload_data(modulep);
 
/* Init basic tunables, hz etc */
init_param1();
diff --git a/sys/amd64/include/sysarch.h b/sys/amd64/include/sysarch.h
index cd380d4..58ac8cd 100644
--- a/sys/amd64/include/sysarch.h
+++ b/sys/amd64/include/sysarch.h
@@ -4,3 +4,15 @@
 /* $FreeBSD$ */
 
 #include x86/sysarch.h
+
+/*
+ * Struct containing pointers to init functions whose
+ * implementation is run time selectable.  Selection can be made,
+ * for example, based on detection of a BIOS variant or
+ * hypervisor environment.
+ */
+struct init_ops {
+   caddr_t (*parse_preload_data)(u_int64_t);
+};
+
+extern struct init_ops init_ops;
diff --git a/sys/x86/xen/pv.c b/sys/x86/xen/pv.c
index db3b7a3..908b50b 100644
--- a/sys/x86/xen/pv.c
+++ b/sys/x86/xen/pv.c
@@ -46,6 +46,8 @@ __FBSDID($FreeBSD$);
 #include vm/vm_pager.h
 #include vm/vm_param.h
 
+#include machine/sysarch.h
+
 #include xen/xen-os.h
 #include xen/hypervisor.h
 
@@ -54,6 +56,36 @@ extern u_int64_t hammer_time(u_int64_t, u_int64_t);
 /* Xen initial function */
 extern u_int64_t hammer_time_xen(start_info_t *, u_int64_t);
 
+/*--- Forward Declarations 
---*/
+static caddr_t xen_pv_parse_preload_data(u_int64_t);
+
+static void xen_pv_set_init_ops(void);
+
+/* Global Data 
---*/
+/* Xen init_ops implementation. */
+struct init_ops xen_init_ops = {
+   .parse_preload_data =   xen_pv_parse_preload_data,
+};
+
+static struct
+{
+   const char  *ev;
+   int mask;
+} howto_names[] = {
+   {boot_askname,RB_ASKNAME},
+   {boot_single, RB_SINGLE},
+   {boot_nosync, RB_NOSYNC},
+   {boot_halt,   RB_ASKNAME},
+   {boot_serial, RB_SERIAL},
+   {boot_cdrom,  RB_CDROM},
+   {boot_gdb,RB_GDB},
+   {boot_gdb_pause,  RB_RESERVED1},
+   {boot_verbose,RB_VERBOSE},
+   {boot_multicons,  RB_MULTIPLE},
+   {NULL,  0}
+};
+
+/* Xen PV init 
---*/
 /*
  * First function called by the Xen PVH boot sequence.
  *
@@ -118,6 +150,56 @@ hammer_time_xen(start_info_t *si, u_int64_t xenstack)
}
load_cr3(((u_int64_t)PT4[0]) - 

[PATCH v10 12/20] xen: add a hook to perform AP startup

2014-01-14 Thread Roger Pau Monne
AP startup on PVH follows the PV method, so we need to add a hook in
order to diverge from bare metal.
---
 sys/amd64/amd64/mp_machdep.c |   14 +++---
 sys/amd64/include/cpu.h  |1 +
 sys/amd64/include/smp.h  |1 +
 sys/x86/xen/hvm.c|   12 +-
 sys/x86/xen/pv.c |   85 ++
 sys/xen/pv.h |   32 
 6 files changed, 137 insertions(+), 8 deletions(-)
 create mode 100644 sys/xen/pv.h

diff --git a/sys/amd64/amd64/mp_machdep.c b/sys/amd64/amd64/mp_machdep.c
index 4af4f8f..17e957d 100644
--- a/sys/amd64/amd64/mp_machdep.c
+++ b/sys/amd64/amd64/mp_machdep.c
@@ -90,7 +90,7 @@ extern  struct pcpu __pcpu[];
 
 /* AP uses this during bootstrap.  Do not staticize.  */
 char *bootSTK;
-static int bootAP;
+int bootAP;
 
 /* Free these after use */
 void *bootstacks[MAXCPU];
@@ -124,7 +124,8 @@ static u_long *ipi_hardclock_counts[MAXCPU];
 
 /* Default cpu_ops implementation. */
 struct cpu_ops cpu_ops = {
-   .ipi_vectored = lapic_ipi_vectored
+   .ipi_vectored = lapic_ipi_vectored,
+   .start_all_aps = native_start_all_aps,
 };
 
 extern inthand_t IDTVEC(fast_syscall), IDTVEC(fast_syscall32);
@@ -138,7 +139,7 @@ extern int pmap_pcid_enabled;
 static volatile cpuset_t ipi_nmi_pending;
 
 /* used to hold the AP's until we are ready to release them */
-static struct mtx ap_boot_mtx;
+struct mtx ap_boot_mtx;
 
 /* Set to 1 once we're ready to let the APs out of the pen. */
 static volatile int aps_ready = 0;
@@ -165,7 +166,6 @@ static int cpu_cores;   /* cores per 
package */
 
 static voidassign_cpu_ids(void);
 static voidset_interrupt_apic_ids(void);
-static int start_all_aps(void);
 static int start_ap(int apic_id);
 static voidrelease_aps(void *dummy);
 
@@ -569,7 +569,7 @@ cpu_mp_start(void)
assign_cpu_ids();
 
/* Start each Application Processor */
-   start_all_aps();
+   cpu_ops.start_all_aps();
 
set_interrupt_apic_ids();
 }
@@ -908,8 +908,8 @@ assign_cpu_ids(void)
 /*
  * start each AP in our list
  */
-static int
-start_all_aps(void)
+int
+native_start_all_aps(void)
 {
vm_offset_t va = boot_address + KERNBASE;
u_int64_t *pt4, *pt3, *pt2;
diff --git a/sys/amd64/include/cpu.h b/sys/amd64/include/cpu.h
index 3c5d5df..98dc3e0 100644
--- a/sys/amd64/include/cpu.h
+++ b/sys/amd64/include/cpu.h
@@ -64,6 +64,7 @@ struct cpu_ops {
void (*cpu_init)(void);
void (*cpu_resume)(void);
void (*ipi_vectored)(u_int, int);
+   int  (*start_all_aps)(void);
 };
 
 extern struct  cpu_ops cpu_ops;
diff --git a/sys/amd64/include/smp.h b/sys/amd64/include/smp.h
index d1b366b..15bc823 100644
--- a/sys/amd64/include/smp.h
+++ b/sys/amd64/include/smp.h
@@ -79,6 +79,7 @@ void  smp_masked_invlpg_range(cpuset_t mask, struct pmap 
*pmap,
vm_offset_t startva, vm_offset_t endva);
 void   smp_invltlb(struct pmap *pmap);
 void   smp_masked_invltlb(cpuset_t mask, struct pmap *pmap);
+intnative_start_all_aps(void);
 
 #endif /* !LOCORE */
 #endif /* SMP */
diff --git a/sys/x86/xen/hvm.c b/sys/x86/xen/hvm.c
index fb1ed79..49caacf 100644
--- a/sys/x86/xen/hvm.c
+++ b/sys/x86/xen/hvm.c
@@ -53,6 +53,9 @@ __FBSDID($FreeBSD$);
 #include xen/hypervisor.h
 #include xen/hvm.h
 #include xen/xen_intr.h
+#ifdef __amd64__
+#include xen/pv.h
+#endif
 
 #include xen/interface/hvm/params.h
 #include xen/interface/vcpu.h
@@ -119,7 +122,10 @@ enum xen_domain_type xen_domain_type = XEN_NATIVE;
 struct cpu_ops xen_hvm_cpu_ops = {
.ipi_vectored   = lapic_ipi_vectored,
.cpu_init   = xen_hvm_cpu_init,
-   .cpu_resume = xen_hvm_cpu_resume
+   .cpu_resume = xen_hvm_cpu_resume,
+#ifdef __amd64__
+   .start_all_aps = native_start_all_aps,
+#endif
 };
 
 static MALLOC_DEFINE(M_XENHVM, xen_hvm, Xen HVM PV Support);
@@ -698,6 +704,10 @@ xen_hvm_init(enum xen_hvm_init_type init_type)
setup_xen_features();
cpu_ops = xen_hvm_cpu_ops;
vm_guest = VM_GUEST_XEN;
+#ifdef __amd64__
+   if (xen_pv_domain())
+   cpu_ops.start_all_aps = xen_pv_start_all_aps;
+#endif
break;
case XEN_HVM_INIT_RESUME:
if (error != 0)
diff --git a/sys/x86/xen/pv.c b/sys/x86/xen/pv.c
index d11bc1a..22fd6a6 100644
--- a/sys/x86/xen/pv.c
+++ b/sys/x86/xen/pv.c
@@ -34,8 +34,11 @@ __FBSDID($FreeBSD$);
 #include sys/kernel.h
 #include sys/reboot.h
 #include sys/systm.h
+#include sys/malloc.h
 #include sys/lock.h
 #include sys/rwlock.h
+#include sys/mutex.h
+#include sys/smp.h
 
 #include vm/vm.h
 #include vm/vm_extern.h
@@ -49,9 +52,13 @@ __FBSDID($FreeBSD$);
 #include machine/sysarch.h
 #include machine/clock.h
 #include machine/pc/bios.h
+#include machine/smp.h
 
 #include xen/xen-os.h
 #include xen/hypervisor.h
+#include xen/pv.h
+
+#include xen/interface/vcpu.h
 
 /* Native initial function */
 extern 

[PATCH v10 20/20] isa: allow ISA bus to attach to xenpv device

2014-01-14 Thread Roger Pau Monne
---
 sys/x86/isa/isa.c |3 +++
 1 files changed, 3 insertions(+), 0 deletions(-)

diff --git a/sys/x86/isa/isa.c b/sys/x86/isa/isa.c
index 1a57137..9287ff2 100644
--- a/sys/x86/isa/isa.c
+++ b/sys/x86/isa/isa.c
@@ -241,3 +241,6 @@ isa_release_resource(device_t bus, device_t child, int 
type, int rid,
  * On this platform, isa can also attach to the legacy bus.
  */
 DRIVER_MODULE(isa, legacy, isa_driver, isa_devclass, 0, 0);
+#ifdef XENHVM
+DRIVER_MODULE(isa, xenpv, isa_driver, isa_devclass, 0, 0);
+#endif
-- 
1.7.7.5 (Apple Git-26)

___
freebsd-current@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-current
To unsubscribe, send any mail to freebsd-current-unsubscr...@freebsd.org


[PATCH v10 15/20] xen: create a PV CPU device for PVH guests

2014-01-14 Thread Roger Pau Monne
Since there's no ACPI on PVH guests, we need to create a dummy CPU
device in order to fill the pcpu-pc_device field.
---
 sys/conf/files|1 +
 sys/dev/xen/pvcpu/pvcpu.c |  101 +
 2 files changed, 102 insertions(+), 0 deletions(-)
 create mode 100644 sys/dev/xen/pvcpu/pvcpu.c

diff --git a/sys/conf/files b/sys/conf/files
index bddf021..178d5e2 100644
--- a/sys/conf/files
+++ b/sys/conf/files
@@ -2500,6 +2500,7 @@ dev/xen/netback/netback.c optional xen | xenhvm
 dev/xen/netfront/netfront.coptional xen | xenhvm
 dev/xen/xenpci/xenpci.coptional xenpci
 dev/xen/timer/timer.c  optional xen | xenhvm
+dev/xen/pvcpu/pvcpu.c  optional xen | xenhvm
 dev/xl/if_xl.c optional xl pci
 dev/xl/xlphy.c optional xl pci
 fs/deadfs/dead_vnops.c standard
diff --git a/sys/dev/xen/pvcpu/pvcpu.c b/sys/dev/xen/pvcpu/pvcpu.c
new file mode 100644
index 000..7f3697c
--- /dev/null
+++ b/sys/dev/xen/pvcpu/pvcpu.c
@@ -0,0 +1,101 @@
+/*
+ * Copyright (c) 2013 Roger Pau Monné roger@citrix.com
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *notice, this list of conditions and the following disclaimer in the
+ *documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include sys/cdefs.h
+__FBSDID($FreeBSD$);
+
+#include sys/param.h
+#include sys/systm.h
+#include sys/bus.h
+#include sys/kernel.h
+#include sys/module.h
+#include sys/pcpu.h
+#include sys/smp.h
+
+#include xen/xen-os.h
+
+/*
+ * Dummy Xen cpu device
+ *
+ * Since there's no ACPI on PVH guests, we need to create a dummy
+ * CPU device in order to fill the pcpu-pc_device field.
+ */
+
+static void
+xenpvcpu_identify(driver_t *driver, device_t parent)
+{
+   device_t child;
+   int i;
+
+   /* Only attach to PV guests, HVM guests use the ACPI CPU devices */
+   if (!xen_pv_domain())
+   return;
+
+   CPU_FOREACH(i) {
+   child = BUS_ADD_CHILD(parent, 0, pvcpu, i);
+   if (child == NULL)
+   panic(xenpvcpu_identify add pvcpu);
+   }
+}
+
+static int
+xenpvcpu_probe(device_t dev)
+{
+
+   device_set_desc(dev, Xen PV CPU);
+   return (BUS_PROBE_NOWILDCARD);
+}
+
+static int
+xenpvcpu_attach(device_t dev)
+{
+   struct pcpu *pc;
+   int cpu;
+
+   cpu = device_get_unit(dev);
+   pc = pcpu_find(cpu);
+   pc-pc_device = dev;
+   return (0);
+}
+
+static device_method_t xenpvcpu_methods[] = {
+   DEVMETHOD(device_identify, xenpvcpu_identify),
+   DEVMETHOD(device_probe, xenpvcpu_probe),
+   DEVMETHOD(device_attach, xenpvcpu_attach),
+
+   DEVMETHOD_END
+};
+
+static driver_t xenpvcpu_driver = {
+   pvcpu,
+   xenpvcpu_methods,
+   0,
+};
+
+devclass_t xenpvcpu_devclass;
+
+DRIVER_MODULE(xenpvcpu, xenpv, xenpvcpu_driver, xenpvcpu_devclass, 0, 0);
+MODULE_DEPEND(xenpvcpu, xenpv, 1, 1, 1);
-- 
1.7.7.5 (Apple Git-26)

___
freebsd-current@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-current
To unsubscribe, send any mail to freebsd-current-unsubscr...@freebsd.org

[PATCH v10 16/20] xen: create a Xen nexus to use in PV/PVH

2014-01-14 Thread Roger Pau Monne
Introduce a Xen specific nexus that is going to be in charge for
attaching Xen specific devices.
---
 sys/conf/files.amd64  |1 +
 sys/conf/files.i386   |1 +
 sys/dev/xen/console/console.c |2 +-
 sys/dev/xen/timer/timer.c |4 +-
 sys/dev/xen/xenpci/xenpci.c   |   64 ++-
 sys/x86/xen/xen_nexus.c   |   76 +
 sys/xen/xenstore/xenstore.c   |6 +---
 7 files changed, 85 insertions(+), 69 deletions(-)
 create mode 100644 sys/x86/xen/xen_nexus.c

diff --git a/sys/conf/files.amd64 b/sys/conf/files.amd64
index d7c98cc..f378983 100644
--- a/sys/conf/files.amd64
+++ b/sys/conf/files.amd64
@@ -571,3 +571,4 @@ x86/xen/xen_intr.c  optionalxen | xenhvm
 x86/xen/pv.c   optionalxenhvm
 x86/xen/pvcpu_enum.c   optionalxenhvm
 x86/xen/xenpv.coptionalxenhvm
+x86/xen/xen_nexus.coptionalxenhvm
diff --git a/sys/conf/files.i386 b/sys/conf/files.i386
index 81142e3..02887a33 100644
--- a/sys/conf/files.i386
+++ b/sys/conf/files.i386
@@ -604,3 +604,4 @@ x86/x86/delay.c standard
 x86/xen/hvm.c  optional xenhvm
 x86/xen/xen_intr.c optional xen | xenhvm
 x86/xen/xenpv.coptional xen | xenhvm
+x86/xen/xen_nexus.coptional xen | xenhvm
diff --git a/sys/dev/xen/console/console.c b/sys/dev/xen/console/console.c
index 899dffc..91538fe 100644
--- a/sys/dev/xen/console/console.c
+++ b/sys/dev/xen/console/console.c
@@ -462,4 +462,4 @@ xcons_force_flush(void)
}
 }
 
-DRIVER_MODULE(xc, nexus, xc_driver, xc_devclass, 0, 0);
+DRIVER_MODULE(xc, xenpv, xc_driver, xc_devclass, 0, 0);
diff --git a/sys/dev/xen/timer/timer.c b/sys/dev/xen/timer/timer.c
index 96372ab..f16f5a5 100644
--- a/sys/dev/xen/timer/timer.c
+++ b/sys/dev/xen/timer/timer.c
@@ -636,5 +636,5 @@ static driver_t xentimer_driver = {
sizeof(struct xentimer_softc),
 };
 
-DRIVER_MODULE(xentimer, nexus, xentimer_driver, xentimer_devclass, 0, 0);
-MODULE_DEPEND(xentimer, nexus, 1, 1, 1);
+DRIVER_MODULE(xentimer, xenpv, xentimer_driver, xentimer_devclass, 0, 0);
+MODULE_DEPEND(xentimer, xenpv, 1, 1, 1);
diff --git a/sys/dev/xen/xenpci/xenpci.c b/sys/dev/xen/xenpci/xenpci.c
index dd2ad92..e334051 100644
--- a/sys/dev/xen/xenpci/xenpci.c
+++ b/sys/dev/xen/xenpci/xenpci.c
@@ -51,8 +51,6 @@ __FBSDID($FreeBSD$);
 
 extern void xen_intr_handle_upcall(struct trapframe *trap_frame);
 
-static device_t nexus;
-
 /*
  * This is used to find our platform device instance.
  */
@@ -188,36 +186,6 @@ xenpci_alloc_space(size_t sz, vm_paddr_t *pa)
}
 }
 
-static struct resource *
-xenpci_alloc_resource(device_t dev, device_t child, int type, int *rid,
-u_long start, u_long end, u_long count, u_int flags)
-{
-   return (BUS_ALLOC_RESOURCE(nexus, child, type, rid, start,
-   end, count, flags));
-}
-
-
-static int
-xenpci_release_resource(device_t dev, device_t child, int type, int rid,
-struct resource *r)
-{
-   return (BUS_RELEASE_RESOURCE(nexus, child, type, rid, r));
-}
-
-static int
-xenpci_activate_resource(device_t dev, device_t child, int type, int rid,
-struct resource *r)
-{
-   return (BUS_ACTIVATE_RESOURCE(nexus, child, type, rid, r));
-}
-
-static int
-xenpci_deactivate_resource(device_t dev, device_t child, int type,
-int rid, struct resource *r)
-{
-   return (BUS_DEACTIVATE_RESOURCE(nexus, child, type, rid, r));
-}
-
 /*
  * Probe - just check device ID.
  */
@@ -229,7 +197,7 @@ xenpci_probe(device_t dev)
return (ENXIO);
 
device_set_desc(dev, Xen Platform Device);
-   return (bus_generic_probe(dev));
+   return (BUS_PROBE_DEFAULT);
 }
 
 /*
@@ -239,20 +207,8 @@ static int
 xenpci_attach(device_t dev)
 {
struct xenpci_softc *scp = device_get_softc(dev);
-   devclass_t dc;
int error;
 
-   /*
-* Find and record nexus0.  Since we are not really on the
-* PCI bus, all resource operations are directed to nexus
-* instead of through our parent.
-*/
-   if ((dc = devclass_find(nexus))  == 0
-|| (nexus = devclass_get_device(dc, 0)) == 0) {
-   device_printf(dev, unable to find nexus.);
-   return (ENOENT);
-   }
-
error = xenpci_allocate_resources(dev);
if (error) {
device_printf(dev, xenpci_allocate_resources failed(%d).\n,
@@ -270,7 +226,7 @@ xenpci_attach(device_t dev)
goto errexit;
}
 
-   return (bus_generic_attach(dev));
+   return (0);
 
 errexit:
/*
@@ -309,16 +265,10 @@ xenpci_detach(device_t dev)
 }
 
 static int
-xenpci_suspend(device_t dev)
-{
-   return (bus_generic_suspend(dev));
-}
-
-static int
 xenpci_resume(device_t dev)
 {
xen_hvm_set_callback(dev);
-   return (bus_generic_resume(dev));
+   return (0);
 }
 

[PATCH v10 13/20] xen: introduce flag to disable the local apic

2014-01-14 Thread Roger Pau Monne
PVH guests don't have an emulated lapic.
---
 sys/amd64/amd64/mp_machdep.c |   10 ++
 sys/amd64/include/apicvar.h  |1 +
 sys/i386/include/apicvar.h   |1 +
 sys/i386/xen/xen_machdep.c   |2 ++
 sys/x86/x86/local_apic.c |8 +---
 sys/x86/xen/pv.c |3 +++
 6 files changed, 18 insertions(+), 7 deletions(-)

diff --git a/sys/amd64/amd64/mp_machdep.c b/sys/amd64/amd64/mp_machdep.c
index 17e957d..cea0306 100644
--- a/sys/amd64/amd64/mp_machdep.c
+++ b/sys/amd64/amd64/mp_machdep.c
@@ -707,7 +707,8 @@ init_secondary(void)
wrmsr(MSR_SF_MASK, PSL_NT|PSL_T|PSL_I|PSL_C|PSL_D);
 
/* Disable local APIC just to be sure. */
-   lapic_disable();
+   if (lapic_valid)
+   lapic_disable();
 
/* signal our startup to the BSP. */
mp_naps++;
@@ -733,7 +734,7 @@ init_secondary(void)
 
/* A quick check from sanity claus */
cpuid = PCPU_GET(cpuid);
-   if (PCPU_GET(apic_id) != lapic_id()) {
+   if (lapic_valid  (PCPU_GET(apic_id) != lapic_id())) {
printf(SMP: cpuid = %d\n, cpuid);
printf(SMP: actual apic_id = %d\n, lapic_id());
printf(SMP: correct apic_id = %d\n, PCPU_GET(apic_id));
@@ -749,7 +750,8 @@ init_secondary(void)
mtx_lock_spin(ap_boot_mtx);
 
/* Init local apic for irq's */
-   lapic_setup(1);
+   if (lapic_valid)
+   lapic_setup(1);
 
/* Set memory range attributes for this CPU to match the BSP */
mem_range_AP_init();
@@ -764,7 +766,7 @@ init_secondary(void)
if (cpu_logical  1  PCPU_GET(apic_id) % cpu_logical != 0)
CPU_SET(cpuid, logical_cpus_mask);
 
-   if (bootverbose)
+   if (lapic_valid  bootverbose)
lapic_dump(AP);
 
if (smp_cpus == mp_ncpus) {
diff --git a/sys/amd64/include/apicvar.h b/sys/amd64/include/apicvar.h
index e7423a3..c04a238 100644
--- a/sys/amd64/include/apicvar.h
+++ b/sys/amd64/include/apicvar.h
@@ -169,6 +169,7 @@ inthand_t
 
 extern vm_paddr_t lapic_paddr;
 extern int apic_cpuids[];
+extern bool lapic_valid;
 
 u_int  apic_alloc_vector(u_int apic_id, u_int irq);
 u_int  apic_alloc_vectors(u_int apic_id, u_int *irqs, u_int count,
diff --git a/sys/i386/include/apicvar.h b/sys/i386/include/apicvar.h
index df99ebe..ea8a3c3 100644
--- a/sys/i386/include/apicvar.h
+++ b/sys/i386/include/apicvar.h
@@ -168,6 +168,7 @@ inthand_t
 
 extern vm_paddr_t lapic_paddr;
 extern int apic_cpuids[];
+extern bool lapic_valid;
 
 u_int  apic_alloc_vector(u_int apic_id, u_int irq);
 u_int  apic_alloc_vectors(u_int apic_id, u_int *irqs, u_int count,
diff --git a/sys/i386/xen/xen_machdep.c b/sys/i386/xen/xen_machdep.c
index 09c01f1..25b9cfc 100644
--- a/sys/i386/xen/xen_machdep.c
+++ b/sys/i386/xen/xen_machdep.c
@@ -59,6 +59,7 @@ __FBSDID($FreeBSD$);
 #include machine/intr_machdep.h
 #include machine/md_var.h
 #include machine/asmacros.h
+#include machine/apicvar.h
 
 
 
@@ -912,6 +913,7 @@ initvalues(start_info_t *startinfo)
 #endif 
xen_start_info = startinfo;
HYPERVISOR_start_info = startinfo;
+   lapic_valid = false;
xen_phys_machine = (xen_pfn_t *)startinfo-mfn_list;
 
IdlePTD = (pd_entry_t *)((uint8_t *)startinfo-pt_base + PAGE_SIZE);
diff --git a/sys/x86/x86/local_apic.c b/sys/x86/x86/local_apic.c
index 41bd602..fddf1fb 100644
--- a/sys/x86/x86/local_apic.c
+++ b/sys/x86/x86/local_apic.c
@@ -156,6 +156,7 @@ extern inthand_t IDTVEC(rsvd);
 
 volatile lapic_t *lapic;
 vm_paddr_t lapic_paddr;
+bool lapic_valid = true;
 static u_long lapic_timer_divisor;
 static struct eventtimer lapic_et;
 
@@ -1367,9 +1368,10 @@ apic_setup_io(void *dummy __unused)
if (retval != 0)
printf(%s: Failed to setup I/O APICs: returned %d\n,
best_enum-apic_name, retval);
-#ifdef XEN
-   return;
-#endif
+
+   if (!lapic_valid)
+   return;
+
/*
 * Finish setting up the local APIC on the BSP once we know how to
 * properly program the LINT pins.
diff --git a/sys/x86/xen/pv.c b/sys/x86/xen/pv.c
index 22fd6a6..6ea1e2a 100644
--- a/sys/x86/xen/pv.c
+++ b/sys/x86/xen/pv.c
@@ -53,6 +53,7 @@ __FBSDID($FreeBSD$);
 #include machine/clock.h
 #include machine/pc/bios.h
 #include machine/smp.h
+#include machine/apicvar.h
 
 #include xen/xen-os.h
 #include xen/hypervisor.h
@@ -315,4 +316,6 @@ xen_pv_set_init_ops(void)
 {
/* Init ops for Xen PV */
init_ops = xen_init_ops;
+   /* Disable lapic */
+   lapic_valid = false;
 }
-- 
1.7.7.5 (Apple Git-26)

___
freebsd-current@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-current
To unsubscribe, send any mail to freebsd-current-unsubscr...@freebsd.org


[PATCH v10 14/20] xen: introduce xenpv bus and a dummy pvcpu device

2014-01-14 Thread Roger Pau Monne
Since Xen PVH guests doesn't have ACPI, we need to create a dummy
bus so top level Xen devices can attach to it (instead of
attaching directly to the nexus) and a pvcpu device that will be used
to fill the pcpu-pc_device field.
---
 sys/conf/files.amd64 |1 +
 sys/conf/files.i386  |1 +
 sys/x86/xen/xenpv.c  |  128 ++
 3 files changed, 130 insertions(+), 0 deletions(-)
 create mode 100644 sys/x86/xen/xenpv.c

diff --git a/sys/conf/files.amd64 b/sys/conf/files.amd64
index a3491da..d7c98cc 100644
--- a/sys/conf/files.amd64
+++ b/sys/conf/files.amd64
@@ -570,3 +570,4 @@ x86/xen/hvm.c   optionalxenhvm
 x86/xen/xen_intr.c optionalxen | xenhvm
 x86/xen/pv.c   optionalxenhvm
 x86/xen/pvcpu_enum.c   optionalxenhvm
+x86/xen/xenpv.coptionalxenhvm
diff --git a/sys/conf/files.i386 b/sys/conf/files.i386
index 790296d..81142e3 100644
--- a/sys/conf/files.i386
+++ b/sys/conf/files.i386
@@ -603,3 +603,4 @@ x86/x86/tsc.c   standard
 x86/x86/delay.cstandard
 x86/xen/hvm.c  optional xenhvm
 x86/xen/xen_intr.c optional xen | xenhvm
+x86/xen/xenpv.coptional xen | xenhvm
diff --git a/sys/x86/xen/xenpv.c b/sys/x86/xen/xenpv.c
new file mode 100644
index 000..e1282cf
--- /dev/null
+++ b/sys/x86/xen/xenpv.c
@@ -0,0 +1,128 @@
+/*
+ * Copyright (c) 2013 Roger Pau Monné roger@citrix.com
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *notice, this list of conditions and the following disclaimer in the
+ *documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include sys/cdefs.h
+__FBSDID($FreeBSD$);
+
+#include sys/param.h
+#include sys/systm.h
+#include sys/bus.h
+#include sys/kernel.h
+#include sys/module.h
+#include sys/pcpu.h
+#include sys/smp.h
+
+#include xen/xen-os.h
+
+static devclass_t xenpv_devclass;
+
+static void
+xenpv_identify(driver_t *driver, device_t parent)
+{
+   if (!xen_domain())
+   return;
+
+   /* Make sure there's only one xenpv device. */
+   if (devclass_get_device(xenpv_devclass, 0))
+   return;
+
+   /*
+* Use a high order number so xenpv is attached after
+* xenpci on HVM guests.
+*/
+   BUS_ADD_CHILD(parent, 200, xenpv, 0);
+}
+
+static int
+xenpv_probe(device_t dev)
+{
+
+   device_set_desc(dev, Xen PV bus);
+   device_quiet(dev);
+   return (BUS_PROBE_NOWILDCARD);
+}
+
+static int
+xenpv_attach(device_t dev)
+{
+   device_t child;
+
+   if (xen_hvm_domain()) {
+   device_t xenpci;
+   devclass_t dc;
+
+   /* Make sure xenpci has been attached */
+   dc = devclass_find(xenpci);
+   if (dc == NULL)
+   panic(unable to find xenpci devclass);
+
+   xenpci = devclass_get_device(dc, 0);
+   if (xenpci == NULL)
+   panic(unable to find xenpci device);
+
+   if (!device_is_attached(xenpci))
+   panic(trying to attach xenpv before xenpci);
+   }
+
+   /*
+* Let our child drivers identify any child devices that they
+* can find.  Once that is done attach any devices that we
+* found.
+*/
+   bus_generic_probe(dev);
+   bus_generic_attach(dev);
+
+   if (!devclass_get_device(devclass_find(isa), 0)) {
+   child = BUS_ADD_CHILD(dev, 0, isa, 0);
+   if (child == NULL)
+   panic(xenpv_attach isa);
+   device_probe_and_attach(child);
+   }
+
+   return 0;
+}
+
+static device_method_t xenpv_methods[] = {
+   /* Device interface */
+   

[PATCH v10 19/20] xen: changes to gnttab for PVH

2014-01-14 Thread Roger Pau Monne
---
 sys/xen/gnttab.c |   26 +-
 1 files changed, 21 insertions(+), 5 deletions(-)

diff --git a/sys/xen/gnttab.c b/sys/xen/gnttab.c
index 03c32b7..6949be5 100644
--- a/sys/xen/gnttab.c
+++ b/sys/xen/gnttab.c
@@ -25,6 +25,7 @@ __FBSDID($FreeBSD$);
 #include sys/lock.h
 #include sys/malloc.h
 #include sys/mman.h
+#include sys/limits.h
 
 #include xen/xen-os.h
 #include xen/hypervisor.h
@@ -607,6 +608,7 @@ gnttab_resume(void)
 {
int error;
unsigned int max_nr_gframes, nr_gframes;
+   void *alloc_mem;
 
nr_gframes = nr_grant_frames;
max_nr_gframes = max_nr_grant_frames();
@@ -614,11 +616,25 @@ gnttab_resume(void)
return (ENOSYS);
 
if (!resume_frames) {
-   error = xenpci_alloc_space(PAGE_SIZE * max_nr_gframes,
-   resume_frames);
-   if (error) {
-   printf(error mapping gnttab share frames\n);
-   return (error);
+   if (xen_pv_domain()) {
+   /*
+* This is a waste of physical memory,
+* we should use ballooned pages instead,
+* but it will do for now.
+*/
+   alloc_mem = contigmalloc(max_nr_gframes * PAGE_SIZE,
+M_DEVBUF, M_NOWAIT, 0,
+ULONG_MAX, PAGE_SIZE, 0);
+   KASSERT((alloc_mem != NULL),
+   (unable to alloc memory for gnttab));
+   resume_frames = vtophys(alloc_mem);
+   } else {
+   error = xenpci_alloc_space(PAGE_SIZE * max_nr_gframes,
+   resume_frames);
+   if (error) {
+   printf(error mapping gnttab share frames\n);
+   return (error);
+   }
}
}
 
-- 
1.7.7.5 (Apple Git-26)

___
freebsd-current@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-current
To unsubscribe, send any mail to freebsd-current-unsubscr...@freebsd.org


[PATCH v10 17/20] xen: add shutdown hook for PVH

2014-01-14 Thread Roger Pau Monne
Add the PV shutdown hook to PVH.
---
 sys/dev/xen/control/control.c |   37 ++---
 1 files changed, 18 insertions(+), 19 deletions(-)

diff --git a/sys/dev/xen/control/control.c b/sys/dev/xen/control/control.c
index bc0609d..78894ba 100644
--- a/sys/dev/xen/control/control.c
+++ b/sys/dev/xen/control/control.c
@@ -316,21 +316,6 @@ xctrl_suspend()
EVENTHANDLER_INVOKE(power_resume);
 }
 
-static void
-xen_pv_shutdown_final(void *arg, int howto)
-{
-   /*
-* Inform the hypervisor that shutdown is complete.
-* This is not necessary in HVM domains since Xen
-* emulates ACPI in that mode and FreeBSD's ACPI
-* support will request this transition.
-*/
-   if (howto  (RB_HALT | RB_POWEROFF))
-   HYPERVISOR_shutdown(SHUTDOWN_poweroff);
-   else
-   HYPERVISOR_shutdown(SHUTDOWN_reboot);
-}
-
 #else
 
 /* HVM mode suspension. */
@@ -440,6 +425,21 @@ xctrl_crash()
panic(Xen directed crash);
 }
 
+static void
+xen_pv_shutdown_final(void *arg, int howto)
+{
+   /*
+* Inform the hypervisor that shutdown is complete.
+* This is not necessary in HVM domains since Xen
+* emulates ACPI in that mode and FreeBSD's ACPI
+* support will request this transition.
+*/
+   if (howto  (RB_HALT | RB_POWEROFF))
+   HYPERVISOR_shutdown(SHUTDOWN_poweroff);
+   else
+   HYPERVISOR_shutdown(SHUTDOWN_reboot);
+}
+
 /*-- Event Reception 
-*/
 static void
 xctrl_on_watch_event(struct xs_watch *watch, const char **vec, unsigned int 
len)
@@ -522,10 +522,9 @@ xctrl_attach(device_t dev)
xctrl-xctrl_watch.callback_data = (uintptr_t)xctrl;
xs_register_watch(xctrl-xctrl_watch);
 
-#ifndef XENHVM
-   EVENTHANDLER_REGISTER(shutdown_final, xen_pv_shutdown_final, NULL,
- SHUTDOWN_PRI_LAST);
-#endif
+   if (xen_pv_domain())
+   EVENTHANDLER_REGISTER(shutdown_final, xen_pv_shutdown_final, 
NULL,
+ SHUTDOWN_PRI_LAST);
 
return (0);
 }
-- 
1.7.7.5 (Apple Git-26)

___
freebsd-current@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-current
To unsubscribe, send any mail to freebsd-current-unsubscr...@freebsd.org


[PATCH v10 11/20] xen: changes to hvm code in order to support PVH guests

2014-01-14 Thread Roger Pau Monne
On PVH we don't need to init the shared info page, or disable emulated
devices. Also, make sure PV IPIs are set before starting the APs.
---
 sys/x86/xen/hvm.c |   17 -
 1 files changed, 12 insertions(+), 5 deletions(-)

diff --git a/sys/x86/xen/hvm.c b/sys/x86/xen/hvm.c
index 9a0411e..fb1ed79 100644
--- a/sys/x86/xen/hvm.c
+++ b/sys/x86/xen/hvm.c
@@ -523,7 +523,7 @@ xen_setup_cpus(void)
 {
int i;
 
-   if (!xen_hvm_domain() || !xen_vector_callback_enabled)
+   if (!xen_vector_callback_enabled)
return;
 
 #ifdef __amd64__
@@ -712,10 +712,13 @@ xen_hvm_init(enum xen_hvm_init_type init_type)
}
 
xen_vector_callback_enabled = 0;
-   xen_domain_type = XEN_HVM_DOMAIN;
-   xen_hvm_init_shared_info_page();
xen_hvm_set_callback(NULL);
-   xen_hvm_disable_emulated_devices();
+
+   if (!xen_pv_domain()) {
+   xen_domain_type = XEN_HVM_DOMAIN;
+   xen_hvm_init_shared_info_page();
+   xen_hvm_disable_emulated_devices();
+   }
 } 
 
 void
@@ -746,6 +749,9 @@ xen_set_vcpu_id(void)
struct pcpu *pc;
int i;
 
+   if (!xen_hvm_domain())
+   return;
+
/* Set vcpu_id to acpi_id */
CPU_FOREACH(i) {
pc = pcpu_find(i);
@@ -789,7 +795,8 @@ xen_hvm_cpu_init(void)
 
 SYSINIT(xen_hvm_init, SI_SUB_HYPERVISOR, SI_ORDER_FIRST, xen_hvm_sysinit, 
NULL);
 #ifdef SMP
-SYSINIT(xen_setup_cpus, SI_SUB_SMP, SI_ORDER_FIRST, xen_setup_cpus, NULL);
+/* We need to setup IPIs before APs are started */
+SYSINIT(xen_setup_cpus, SI_SUB_SMP-1, SI_ORDER_FIRST, xen_setup_cpus, NULL);
 #endif
 SYSINIT(xen_hvm_cpu_init, SI_SUB_INTR, SI_ORDER_FIRST, xen_hvm_cpu_init, NULL);
 SYSINIT(xen_set_vcpu_id, SI_SUB_CPU, SI_ORDER_ANY, xen_set_vcpu_id, NULL);
-- 
1.7.7.5 (Apple Git-26)

___
freebsd-current@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-current
To unsubscribe, send any mail to freebsd-current-unsubscr...@freebsd.org


[PATCH v10 10/20] xen: add hook for AP bootstrap memory reservation

2014-01-14 Thread Roger Pau Monne
This hook will only be implemented for bare metal, Xen doesn't require
any bootstrap code since APs are started in long mode with paging
enabled.
---
 sys/amd64/amd64/machdep.c   |6 +-
 sys/amd64/include/sysarch.h |1 +
 2 files changed, 6 insertions(+), 1 deletions(-)

diff --git a/sys/amd64/amd64/machdep.c b/sys/amd64/amd64/machdep.c
index 64df89a..3a2db30 100644
--- a/sys/amd64/amd64/machdep.c
+++ b/sys/amd64/amd64/machdep.c
@@ -178,6 +178,9 @@ struct init_ops init_ops = {
.early_delay_init = i8254_init,
.early_delay =  i8254_delay,
.parse_memmap = native_parse_memmap,
+#ifdef SMP
+   .mp_bootaddress =   mp_bootaddress,
+#endif
 };
 
 /*
@@ -1492,7 +1495,8 @@ getmemsize(caddr_t kmdp, u_int64_t first)
 
 #ifdef SMP
/* make hole for AP bootstrap code */
-   physmap[1] = mp_bootaddress(physmap[1] / 1024);
+   if (init_ops.mp_bootaddress)
+   physmap[1] = init_ops.mp_bootaddress(physmap[1] / 1024);
 #endif
 
/*
diff --git a/sys/amd64/include/sysarch.h b/sys/amd64/include/sysarch.h
index 084223e..7696064 100644
--- a/sys/amd64/include/sysarch.h
+++ b/sys/amd64/include/sysarch.h
@@ -16,6 +16,7 @@ struct init_ops {
void(*early_delay_init)(void);
void(*early_delay)(int);
void(*parse_memmap)(caddr_t, vm_paddr_t *, int *);
+   u_int   (*mp_bootaddress)(u_int);
 };
 
 extern struct init_ops init_ops;
-- 
1.7.7.5 (Apple Git-26)

___
freebsd-current@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-current
To unsubscribe, send any mail to freebsd-current-unsubscr...@freebsd.org


[PATCH v10 18/20] xen: xenstore changes to support PVH

2014-01-14 Thread Roger Pau Monne
---
 sys/xen/xenstore/xenstore.c |   18 +-
 1 files changed, 9 insertions(+), 9 deletions(-)

diff --git a/sys/xen/xenstore/xenstore.c b/sys/xen/xenstore/xenstore.c
index b5cf413..7fa08cc 100644
--- a/sys/xen/xenstore/xenstore.c
+++ b/sys/xen/xenstore/xenstore.c
@@ -229,13 +229,11 @@ struct xs_softc {
 */
struct sx xenwatch_mutex;
 
-#ifdef XENHVM
/**
 * The HVM guest pseudo-physical frame number.  This is Xen's mapping
 * of the true machine frame number into our physical address space.
 */
unsigned long gpfn;
-#endif
 
/**
 * The event channel for communicating with the
@@ -1147,13 +1145,15 @@ xs_attach(device_t dev)
/* Initialize the interface to xenstore. */
struct proc *p;
 
-#ifdef XENHVM
-   xs.evtchn = hvm_get_parameter(HVM_PARAM_STORE_EVTCHN);
-   xs.gpfn = hvm_get_parameter(HVM_PARAM_STORE_PFN);
-   xen_store = pmap_mapdev(xs.gpfn * PAGE_SIZE, PAGE_SIZE);
-#else
-   xs.evtchn = xen_start_info-store_evtchn;
-#endif
+   if (xen_hvm_domain()) {
+   xs.evtchn = hvm_get_parameter(HVM_PARAM_STORE_EVTCHN);
+   xs.gpfn = hvm_get_parameter(HVM_PARAM_STORE_PFN);
+   xen_store = pmap_mapdev(xs.gpfn * PAGE_SIZE, PAGE_SIZE);
+   } else if (xen_pv_domain()) {
+   xs.evtchn = HYPERVISOR_start_info-store_evtchn;
+   } else {
+   panic(Unknown domain type, cannot initialize xenstore\n);
+   }
 
TAILQ_INIT(xs.reply_list);
TAILQ_INIT(xs.watch_events);
-- 
1.7.7.5 (Apple Git-26)

___
freebsd-current@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-current
To unsubscribe, send any mail to freebsd-current-unsubscr...@freebsd.org


[PATCH v9 00/19] FreeBSD PVH DomU support

2014-01-02 Thread Roger Pau Monne
This series is a split of the previous patch Xen x86 DomU PVH 
support, with the aim to make the review of the code easier.

The series can also be found on my git repo:

git://xenbits.xen.org/people/royger/freebsd.git pvh_v9

or

http://xenbits.xen.org/gitweb/?p=people/royger/freebsd.git;a=shortlog;h=refs/heads/pvh_v9

PVH mode is basically a PV guest inside an HVM container, and shares
a great amount of code with PVHVM. The main difference is the way the
guest is started, PVH uses the PV start sequence, jumping directly
into the kernel entry point in long mode and with page tables set.
The main work of this patch consists in setting the environment as
similar as possible to what native FreeBSD expects, and then adding
hooks to the PV ops when necessary.

This new version of the series (v9) addresses the comments from the 
previous posted version (v7).
___
freebsd-current@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-current
To unsubscribe, send any mail to freebsd-current-unsubscr...@freebsd.org


[PATCH v9 06/19] xen: implement an early timer for Xen PVH

2014-01-02 Thread Roger Pau Monne
When running as a PVH guest, there's no emulated i8254, so we need to
use the Xen PV timer as the early source for DELAY. This change allows
for different implementations of the early DELAY function and
implements a Xen variant for it.
---
 sys/amd64/amd64/machdep.c   |6 ++-
 sys/amd64/include/clock.h   |5 ++
 sys/amd64/include/sysarch.h |2 +
 sys/conf/files.amd64|1 +
 sys/conf/files.i386 |1 +
 sys/dev/xen/timer/timer.c   |   33 +
 sys/i386/include/clock.h|5 ++
 sys/x86/isa/clock.c |   53 +
 sys/x86/x86/delay.c |  112 +++
 sys/x86/xen/pv.c|3 +
 10 files changed, 167 insertions(+), 54 deletions(-)
 create mode 100644 sys/x86/x86/delay.c

diff --git a/sys/amd64/amd64/machdep.c b/sys/amd64/amd64/machdep.c
index e073eea..178d8b3 100644
--- a/sys/amd64/amd64/machdep.c
+++ b/sys/amd64/amd64/machdep.c
@@ -172,6 +172,8 @@ static caddr_t native_parse_preload_data(u_int64_t);
 /* Default init_ops implementation. */
 struct init_ops init_ops = {
.parse_preload_data =   native_parse_preload_data,
+   .early_delay_init = i8254_init,
+   .early_delay =  i8254_delay,
 };
 
 /*
@@ -1820,10 +1822,10 @@ hammer_time(u_int64_t modulep, u_int64_t physfree)
lidt(r_idt);
 
/*
-* Initialize the i8254 before the console so that console
+* Initialize the early delay before the console so that console
 * initialization can use DELAY().
 */
-   i8254_init();
+   init_ops.early_delay_init();
 
/*
 * Initialize the console before we print anything out.
diff --git a/sys/amd64/include/clock.h b/sys/amd64/include/clock.h
index d7f7d82..ac8818f 100644
--- a/sys/amd64/include/clock.h
+++ b/sys/amd64/include/clock.h
@@ -25,6 +25,11 @@ extern int   smp_tsc;
 #endif
 
 void   i8254_init(void);
+void   i8254_delay(int);
+#ifdef XENHVM
+void   xen_delay_init(void);
+void   xen_delay(int);
+#endif
 
 /*
  * Driver to clock driver interface.
diff --git a/sys/amd64/include/sysarch.h b/sys/amd64/include/sysarch.h
index 58ac8cd..60fa635 100644
--- a/sys/amd64/include/sysarch.h
+++ b/sys/amd64/include/sysarch.h
@@ -13,6 +13,8 @@
  */
 struct init_ops {
caddr_t (*parse_preload_data)(u_int64_t);
+   void(*early_delay_init)(void);
+   void(*early_delay)(int);
 };
 
 extern struct init_ops init_ops;
diff --git a/sys/conf/files.amd64 b/sys/conf/files.amd64
index 16029d8..109a796 100644
--- a/sys/conf/files.amd64
+++ b/sys/conf/files.amd64
@@ -565,6 +565,7 @@ x86/x86/mptable_pci.c   optionalmptable 
pci
 x86/x86/msi.c  optionalpci
 x86/x86/nexus.cstandard
 x86/x86/tsc.c  standard
+x86/x86/delay.cstandard
 x86/xen/hvm.c  optionalxenhvm
 x86/xen/xen_intr.c optionalxen | xenhvm
 x86/xen/pv.c   optionalxenhvm
diff --git a/sys/conf/files.i386 b/sys/conf/files.i386
index eb8697c..790296d 100644
--- a/sys/conf/files.i386
+++ b/sys/conf/files.i386
@@ -600,5 +600,6 @@ x86/x86/mptable_pci.c   optional apic native pci
 x86/x86/msi.c  optional apic pci
 x86/x86/nexus.cstandard
 x86/x86/tsc.c  standard
+x86/x86/delay.cstandard
 x86/xen/hvm.c  optional xenhvm
 x86/xen/xen_intr.c optional xen | xenhvm
diff --git a/sys/dev/xen/timer/timer.c b/sys/dev/xen/timer/timer.c
index b2f6bcd..96372ab 100644
--- a/sys/dev/xen/timer/timer.c
+++ b/sys/dev/xen/timer/timer.c
@@ -59,6 +59,9 @@ __FBSDID($FreeBSD$);
 #include machine/_inttypes.h
 #include machine/smp.h
 
+/* For the declaration of clock_lock */
+#include isa/rtc.h
+
 #include clock_if.h
 
 static devclass_t xentimer_devclass;
@@ -584,6 +587,36 @@ xentimer_suspend(device_t dev)
return (0);
 }
 
+/*
+ * Xen delay early init
+ */
+void xen_delay_init(void)
+{
+   /* Init the clock lock */
+   mtx_init(clock_lock, clk, NULL, MTX_SPIN | MTX_NOPROFILE);
+}
+/*
+ * Xen PV DELAY function
+ *
+ * When running on PVH mode we don't have an emulated i8524, so
+ * make use of the Xen time info in order to code a simple DELAY
+ * function that can be used during early boot.
+ */
+void xen_delay(int n)
+{
+   uint64_t end_ns;
+   uint64_t current;
+
+   end_ns = xen_fetch_vcpu_time(HYPERVISOR_shared_info-vcpu_info[0]);
+   end_ns += n * NSEC_IN_USEC;
+
+   for (;;) {
+   current = 
xen_fetch_vcpu_time(HYPERVISOR_shared_info-vcpu_info[0]);
+   if (current = end_ns)
+   break;
+   }
+}
+
 static device_method_t xentimer_methods[] = {
DEVMETHOD(device_identify, xentimer_identify),
DEVMETHOD(device_probe, xentimer_probe),
diff --git a/sys/i386/include/clock.h b/sys/i386/include/clock.h

[PATCH v9 04/19] amd64: introduce hook for custom preload metadata parsers

2014-01-02 Thread Roger Pau Monne
---
 sys/amd64/amd64/machdep.c   |   41 --
 sys/amd64/include/sysarch.h |   12 ++
 sys/x86/xen/pv.c|   82 +++
 3 files changed, 124 insertions(+), 11 deletions(-)

diff --git a/sys/amd64/amd64/machdep.c b/sys/amd64/amd64/machdep.c
index eae657b..e073eea 100644
--- a/sys/amd64/amd64/machdep.c
+++ b/sys/amd64/amd64/machdep.c
@@ -126,6 +126,7 @@ __FBSDID($FreeBSD$);
 #include machine/reg.h
 #include machine/sigframe.h
 #include machine/specialreg.h
+#include machine/sysarch.h
 #ifdef PERFMON
 #include machine/perfmon.h
 #endif
@@ -165,6 +166,14 @@ static int  set_fpcontext(struct thread *td, const 
mcontext_t *mcp,
 char *xfpustate, size_t xfpustate_len);
 SYSINIT(cpu, SI_SUB_CPU, SI_ORDER_FIRST, cpu_startup, NULL);
 
+/* Preload data parse function */
+static caddr_t native_parse_preload_data(u_int64_t);
+
+/* Default init_ops implementation. */
+struct init_ops init_ops = {
+   .parse_preload_data =   native_parse_preload_data,
+};
+
 /*
  * The file conf/ldscript.amd64 defines the symbol kernphys.  Its value is
  * the physical address at which the kernel is loaded.
@@ -1683,6 +1692,26 @@ do_next:
msgbufp = (struct msgbuf *)PHYS_TO_DMAP(phys_avail[pa_indx]);
 }
 
+static caddr_t
+native_parse_preload_data(u_int64_t modulep)
+{
+   caddr_t kmdp;
+
+   preload_metadata = (caddr_t)(uintptr_t)(modulep + KERNBASE);
+   preload_bootstrap_relocate(KERNBASE);
+   kmdp = preload_search_by_type(elf kernel);
+   if (kmdp == NULL)
+   kmdp = preload_search_by_type(elf64 kernel);
+   boothowto = MD_FETCH(kmdp, MODINFOMD_HOWTO, int);
+   kern_envp = MD_FETCH(kmdp, MODINFOMD_ENVP, char *) + KERNBASE;
+#ifdef DDB
+   ksym_start = MD_FETCH(kmdp, MODINFOMD_SSYM, uintptr_t);
+   ksym_end = MD_FETCH(kmdp, MODINFOMD_ESYM, uintptr_t);
+#endif
+
+   return (kmdp);
+}
+
 u_int64_t
 hammer_time(u_int64_t modulep, u_int64_t physfree)
 {
@@ -1707,17 +1736,7 @@ hammer_time(u_int64_t modulep, u_int64_t physfree)
 */
proc_linkup0(proc0, thread0);
 
-   preload_metadata = (caddr_t)(uintptr_t)(modulep + KERNBASE);
-   preload_bootstrap_relocate(KERNBASE);
-   kmdp = preload_search_by_type(elf kernel);
-   if (kmdp == NULL)
-   kmdp = preload_search_by_type(elf64 kernel);
-   boothowto = MD_FETCH(kmdp, MODINFOMD_HOWTO, int);
-   kern_envp = MD_FETCH(kmdp, MODINFOMD_ENVP, char *) + KERNBASE;
-#ifdef DDB
-   ksym_start = MD_FETCH(kmdp, MODINFOMD_SSYM, uintptr_t);
-   ksym_end = MD_FETCH(kmdp, MODINFOMD_ESYM, uintptr_t);
-#endif
+   kmdp = init_ops.parse_preload_data(modulep);
 
/* Init basic tunables, hz etc */
init_param1();
diff --git a/sys/amd64/include/sysarch.h b/sys/amd64/include/sysarch.h
index cd380d4..58ac8cd 100644
--- a/sys/amd64/include/sysarch.h
+++ b/sys/amd64/include/sysarch.h
@@ -4,3 +4,15 @@
 /* $FreeBSD$ */
 
 #include x86/sysarch.h
+
+/*
+ * Struct containing pointers to init functions whose
+ * implementation is run time selectable.  Selection can be made,
+ * for example, based on detection of a BIOS variant or
+ * hypervisor environment.
+ */
+struct init_ops {
+   caddr_t (*parse_preload_data)(u_int64_t);
+};
+
+extern struct init_ops init_ops;
diff --git a/sys/x86/xen/pv.c b/sys/x86/xen/pv.c
index db3b7a3..908b50b 100644
--- a/sys/x86/xen/pv.c
+++ b/sys/x86/xen/pv.c
@@ -46,6 +46,8 @@ __FBSDID($FreeBSD$);
 #include vm/vm_pager.h
 #include vm/vm_param.h
 
+#include machine/sysarch.h
+
 #include xen/xen-os.h
 #include xen/hypervisor.h
 
@@ -54,6 +56,36 @@ extern u_int64_t hammer_time(u_int64_t, u_int64_t);
 /* Xen initial function */
 extern u_int64_t hammer_time_xen(start_info_t *, u_int64_t);
 
+/*--- Forward Declarations 
---*/
+static caddr_t xen_pv_parse_preload_data(u_int64_t);
+
+static void xen_pv_set_init_ops(void);
+
+/* Global Data 
---*/
+/* Xen init_ops implementation. */
+struct init_ops xen_init_ops = {
+   .parse_preload_data =   xen_pv_parse_preload_data,
+};
+
+static struct
+{
+   const char  *ev;
+   int mask;
+} howto_names[] = {
+   {boot_askname,RB_ASKNAME},
+   {boot_single, RB_SINGLE},
+   {boot_nosync, RB_NOSYNC},
+   {boot_halt,   RB_ASKNAME},
+   {boot_serial, RB_SERIAL},
+   {boot_cdrom,  RB_CDROM},
+   {boot_gdb,RB_GDB},
+   {boot_gdb_pause,  RB_RESERVED1},
+   {boot_verbose,RB_VERBOSE},
+   {boot_multicons,  RB_MULTIPLE},
+   {NULL,  0}
+};
+
+/* Xen PV init 
---*/
 /*
  * First function called by the Xen PVH boot sequence.
  *
@@ -118,6 +150,56 @@ hammer_time_xen(start_info_t *si, u_int64_t xenstack)
}
load_cr3(((u_int64_t)PT4[0]) - 

[PATCH v9 05/19] xen: rework xen timer so it can be used early in boot process

2014-01-02 Thread Roger Pau Monne
This should not introduce any functional change, and makes the
functions suitable to be called before we have actually mapped the
vcpu_info struct on a per-cpu basis.
---
 sys/dev/xen/timer/timer.c |   29 -
 1 files changed, 20 insertions(+), 9 deletions(-)

diff --git a/sys/dev/xen/timer/timer.c b/sys/dev/xen/timer/timer.c
index 354085b..b2f6bcd 100644
--- a/sys/dev/xen/timer/timer.c
+++ b/sys/dev/xen/timer/timer.c
@@ -230,22 +230,22 @@ xen_fetch_vcpu_tinfo(struct vcpu_time_info *dst, struct 
vcpu_time_info *src)
 /**
  * \brief Get the current time, in nanoseconds, since the hypervisor booted.
  *
+ * \param vcpu vcpu_info structure to fetch the time from.
+ *
  * \note This function returns the current CPU's idea of this value, unless
  *   it happens to be less than another CPU's previously determined value.
  */
 static uint64_t
-xen_fetch_vcpu_time(void)
+xen_fetch_vcpu_time(struct vcpu_info *vcpu)
 {
struct vcpu_time_info dst;
struct vcpu_time_info *src;
uint32_t pre_version;
uint64_t now;
volatile uint64_t last;
-   struct vcpu_info *vcpu = DPCPU_GET(vcpu_info);
 
src = vcpu-time;
 
-   critical_enter();
do {
pre_version = xen_fetch_vcpu_tinfo(dst, src);
barrier();
@@ -266,16 +266,19 @@ xen_fetch_vcpu_time(void)
}
} while (!atomic_cmpset_64(xen_timer_last_time, last, now));
 
-   critical_exit();
-
return (now);
 }
 
 static uint32_t
 xentimer_get_timecount(struct timecounter *tc)
 {
+   uint32_t xen_time;
 
-   return ((uint32_t)xen_fetch_vcpu_time()  UINT_MAX);
+   critical_enter();
+   xen_time = (uint32_t)xen_fetch_vcpu_time(DPCPU_GET(vcpu_info))  
UINT_MAX;
+   critical_exit();
+
+   return (xen_time);
 }
 
 /**
@@ -305,7 +308,12 @@ xen_fetch_wallclock(struct timespec *ts)
 static void
 xen_fetch_uptime(struct timespec *ts)
 {
-   uint64_t uptime = xen_fetch_vcpu_time();
+   uint64_t uptime;
+
+   critical_enter();
+   uptime = xen_fetch_vcpu_time(DPCPU_GET(vcpu_info));
+   critical_exit();
+
ts-tv_sec = uptime / NSEC_IN_SEC;
ts-tv_nsec = uptime % NSEC_IN_SEC;
 }
@@ -354,7 +362,7 @@ xentimer_intr(void *arg)
struct xentimer_softc *sc = (struct xentimer_softc *)arg;
struct xentimer_pcpu_data *pcpu = DPCPU_PTR(xentimer_pcpu);
 
-   pcpu-last_processed = xen_fetch_vcpu_time();
+   pcpu-last_processed = xen_fetch_vcpu_time(DPCPU_GET(vcpu_info));
if (pcpu-timer != 0  sc-et.et_active)
sc-et.et_event_cb(sc-et, sc-et.et_arg);
 
@@ -415,7 +423,10 @@ xentimer_et_start(struct eventtimer *et,
do {
if (++i == 60)
panic(can't schedule timer);
-   next_time = xen_fetch_vcpu_time() + first_in_ns;
+   critical_enter();
+   next_time = xen_fetch_vcpu_time(DPCPU_GET(vcpu_info)) +
+   first_in_ns;
+   critical_exit();
error = xentimer_vcpu_start_timer(cpu, next_time);
} while (error == -ETIME);
 
-- 
1.7.7.5 (Apple Git-26)

___
freebsd-current@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-current
To unsubscribe, send any mail to freebsd-current-unsubscr...@freebsd.org


[PATCH v9 03/19] xen: add and enable Xen console for PVH guests

2014-01-02 Thread Roger Pau Monne
This adds and enables the console used on XEN kernels.
---
 sys/conf/files |4 +-
 sys/dev/xen/console/console.c  |   37 +--
 sys/dev/xen/console/xencons_ring.c |   15 +
 sys/i386/include/xen/xen-os.h  |1 -
 sys/i386/xen/xen_machdep.c |   17 
 sys/x86/xen/pv.c   |4 +++
 sys/xen/xen-os.h   |4 +++
 7 files changed, 50 insertions(+), 32 deletions(-)

diff --git a/sys/conf/files b/sys/conf/files
index a73d31e..f55479d 100644
--- a/sys/conf/files
+++ b/sys/conf/files
@@ -2523,8 +2523,8 @@ dev/xe/if_xe_pccard.c optional xe pccard
 dev/xen/balloon/balloon.c  optional xen | xenhvm
 dev/xen/blkfront/blkfront.coptional xen | xenhvm
 dev/xen/blkback/blkback.c  optional xen | xenhvm
-dev/xen/console/console.c  optional xen
-dev/xen/console/xencons_ring.c optional xen
+dev/xen/console/console.c  optional xen | xenhvm
+dev/xen/console/xencons_ring.c optional xen | xenhvm
 dev/xen/control/control.c  optional xen | xenhvm
 dev/xen/netback/netback.c  optional xen | xenhvm
 dev/xen/netfront/netfront.coptional xen | xenhvm
diff --git a/sys/dev/xen/console/console.c b/sys/dev/xen/console/console.c
index 23eaee2..899dffc 100644
--- a/sys/dev/xen/console/console.c
+++ b/sys/dev/xen/console/console.c
@@ -69,11 +69,14 @@ struct mtx  cn_mtx;
 static char wbuf[WBUF_SIZE];
 static char rbuf[RBUF_SIZE];
 static int rc, rp;
-static unsigned int cnsl_evt_reg;
+unsigned int cnsl_evt_reg;
 static unsigned int wc, wp; /* write_cons, write_prod */
 xen_intr_handle_t xen_intr_handle;
 device_t xencons_dev;
 
+/* Virtual address of the shared console page */
+char *console_page;
+
 #ifdef KDB
 static int xc_altbrk;
 #endif
@@ -110,9 +113,26 @@ static struct ttydevsw xc_ttydevsw = {
 .tsw_outwakeup = xcoutwakeup,
 };
 
+/*- Debug function 
---*/
+#define XC_PRINTF_BUFSIZE 1024
+void
+xc_printf(const char *fmt, ...)
+{
+   static char buf[XC_PRINTF_BUFSIZE];
+   __va_list ap;
+
+   va_start(ap, fmt);
+   vsnprintf(buf, sizeof(buf), fmt, ap);
+   va_end(ap);
+   HYPERVISOR_console_write(buf, strlen(buf));
+}
+
 static void
 xc_cnprobe(struct consdev *cp)
 {
+   if (!xen_pv_domain())
+   return;
+
cp-cn_pri = CN_REMOTE;
sprintf(cp-cn_name, %s0, driver_name);
 }
@@ -175,7 +195,7 @@ static void
 xc_cnputc(struct consdev *dev, int c)
 {
 
-   if (xen_start_info-flags  SIF_INITDOMAIN)
+   if (xen_initial_domain())
xc_cnputc_dom0(dev, c);
else
xc_cnputc_domu(dev, c);
@@ -206,8 +226,7 @@ xcons_putc(int c)
xcons_force_flush();
 #endif 
}
-   if (cnsl_evt_reg)
-   __xencons_tx_flush();
+   __xencons_tx_flush();

/* inform start path that we're pretty full */
return ((wp - wc) = WBUF_SIZE - 100) ? TRUE : FALSE;
@@ -217,6 +236,10 @@ static void
 xc_identify(driver_t *driver, device_t parent)
 {
device_t child;
+
+   if (!xen_pv_domain())
+   return;
+
child = BUS_ADD_CHILD(parent, 0, driver_name, 0);
device_set_driver(child, driver);
device_set_desc(child, Xen Console);
@@ -245,7 +268,7 @@ xc_attach(device_t dev)
cnsl_evt_reg = 1;
callout_reset(xc_callout, XC_POLLTIME, xc_timeout, xccons);
 
-   if (xen_start_info-flags  SIF_INITDOMAIN) {
+   if (xen_initial_domain()) {
error = xen_intr_bind_virq(dev, VIRQ_CONSOLE, 0, NULL,
   xencons_priv_interrupt, NULL,
   INTR_TYPE_TTY, xen_intr_handle);
@@ -309,7 +332,7 @@ __xencons_tx_flush(void)
sz = wp - wc;
if (sz  (WBUF_SIZE - WBUF_MASK(wc)))
sz = WBUF_SIZE - WBUF_MASK(wc);
-   if (xen_start_info-flags  SIF_INITDOMAIN) {
+   if (xen_initial_domain()) {
HYPERVISOR_console_io(CONSOLEIO_write, sz, 
wbuf[WBUF_MASK(wc)]);
wc += sz;
} else {
@@ -424,7 +447,7 @@ xcons_force_flush(void)
 {
intsz;
 
-   if (xen_start_info-flags  SIF_INITDOMAIN)
+   if (xen_initial_domain())
return;
 
/* Spin until console data is flushed through to the domain controller. 
*/
diff --git a/sys/dev/xen/console/xencons_ring.c 
b/sys/dev/xen/console/xencons_ring.c
index 3701551..d826363 100644
--- a/sys/dev/xen/console/xencons_ring.c
+++ b/sys/dev/xen/console/xencons_ring.c
@@ -32,9 +32,9 @@ __FBSDID($FreeBSD$);
 
 #define console_evtchn console.domU.evtchn
 xen_intr_handle_t console_handle;
-extern char *console_page;
 extern struct mtx  cn_mtx;
 extern device_t xencons_dev;
+extern int cnsl_evt_reg;
 
 static inline struct 

[PATCH v9 16/19] xen: add shutdown hook for PVH

2014-01-02 Thread Roger Pau Monne
Add the PV shutdown hook to PVH.
---
 sys/dev/xen/control/control.c |   37 ++---
 1 files changed, 18 insertions(+), 19 deletions(-)

diff --git a/sys/dev/xen/control/control.c b/sys/dev/xen/control/control.c
index bc0609d..78894ba 100644
--- a/sys/dev/xen/control/control.c
+++ b/sys/dev/xen/control/control.c
@@ -316,21 +316,6 @@ xctrl_suspend()
EVENTHANDLER_INVOKE(power_resume);
 }
 
-static void
-xen_pv_shutdown_final(void *arg, int howto)
-{
-   /*
-* Inform the hypervisor that shutdown is complete.
-* This is not necessary in HVM domains since Xen
-* emulates ACPI in that mode and FreeBSD's ACPI
-* support will request this transition.
-*/
-   if (howto  (RB_HALT | RB_POWEROFF))
-   HYPERVISOR_shutdown(SHUTDOWN_poweroff);
-   else
-   HYPERVISOR_shutdown(SHUTDOWN_reboot);
-}
-
 #else
 
 /* HVM mode suspension. */
@@ -440,6 +425,21 @@ xctrl_crash()
panic(Xen directed crash);
 }
 
+static void
+xen_pv_shutdown_final(void *arg, int howto)
+{
+   /*
+* Inform the hypervisor that shutdown is complete.
+* This is not necessary in HVM domains since Xen
+* emulates ACPI in that mode and FreeBSD's ACPI
+* support will request this transition.
+*/
+   if (howto  (RB_HALT | RB_POWEROFF))
+   HYPERVISOR_shutdown(SHUTDOWN_poweroff);
+   else
+   HYPERVISOR_shutdown(SHUTDOWN_reboot);
+}
+
 /*-- Event Reception 
-*/
 static void
 xctrl_on_watch_event(struct xs_watch *watch, const char **vec, unsigned int 
len)
@@ -522,10 +522,9 @@ xctrl_attach(device_t dev)
xctrl-xctrl_watch.callback_data = (uintptr_t)xctrl;
xs_register_watch(xctrl-xctrl_watch);
 
-#ifndef XENHVM
-   EVENTHANDLER_REGISTER(shutdown_final, xen_pv_shutdown_final, NULL,
- SHUTDOWN_PRI_LAST);
-#endif
+   if (xen_pv_domain())
+   EVENTHANDLER_REGISTER(shutdown_final, xen_pv_shutdown_final, 
NULL,
+ SHUTDOWN_PRI_LAST);
 
return (0);
 }
-- 
1.7.7.5 (Apple Git-26)

___
freebsd-current@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-current
To unsubscribe, send any mail to freebsd-current-unsubscr...@freebsd.org


[PATCH v9 10/19] xen: add hook for AP bootstrap memory reservation

2014-01-02 Thread Roger Pau Monne
This hook will only be implemented for bare metal, Xen doesn't require
any bootstrap code since APs are started in long mode with paging
enabled.
---
 sys/amd64/amd64/machdep.c   |6 +-
 sys/amd64/include/sysarch.h |1 +
 2 files changed, 6 insertions(+), 1 deletions(-)

diff --git a/sys/amd64/amd64/machdep.c b/sys/amd64/amd64/machdep.c
index f6eef50..babf16d 100644
--- a/sys/amd64/amd64/machdep.c
+++ b/sys/amd64/amd64/machdep.c
@@ -178,6 +178,9 @@ struct init_ops init_ops = {
.early_delay_init = i8254_init,
.early_delay =  i8254_delay,
.parse_memmap = native_parse_memmap,
+#ifdef SMP
+   .mp_bootaddress =   mp_bootaddress,
+#endif
 };
 
 /*
@@ -1490,7 +1493,8 @@ getmemsize(caddr_t kmdp, u_int64_t first)
 
 #ifdef SMP
/* make hole for AP bootstrap code */
-   physmap[1] = mp_bootaddress(physmap[1] / 1024);
+   if (init_ops.mp_bootaddress)
+   physmap[1] = init_ops.mp_bootaddress(physmap[1] / 1024);
 #endif
 
/*
diff --git a/sys/amd64/include/sysarch.h b/sys/amd64/include/sysarch.h
index 084223e..7696064 100644
--- a/sys/amd64/include/sysarch.h
+++ b/sys/amd64/include/sysarch.h
@@ -16,6 +16,7 @@ struct init_ops {
void(*early_delay_init)(void);
void(*early_delay)(int);
void(*parse_memmap)(caddr_t, vm_paddr_t *, int *);
+   u_int   (*mp_bootaddress)(u_int);
 };
 
 extern struct init_ops init_ops;
-- 
1.7.7.5 (Apple Git-26)

___
freebsd-current@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-current
To unsubscribe, send any mail to freebsd-current-unsubscr...@freebsd.org


[PATCH v9 17/19] xen: xenstore changes to support PVH

2014-01-02 Thread Roger Pau Monne
---
 sys/xen/xenstore/xenstore.c |   18 +-
 1 files changed, 9 insertions(+), 9 deletions(-)

diff --git a/sys/xen/xenstore/xenstore.c b/sys/xen/xenstore/xenstore.c
index b5cf413..7fa08cc 100644
--- a/sys/xen/xenstore/xenstore.c
+++ b/sys/xen/xenstore/xenstore.c
@@ -229,13 +229,11 @@ struct xs_softc {
 */
struct sx xenwatch_mutex;
 
-#ifdef XENHVM
/**
 * The HVM guest pseudo-physical frame number.  This is Xen's mapping
 * of the true machine frame number into our physical address space.
 */
unsigned long gpfn;
-#endif
 
/**
 * The event channel for communicating with the
@@ -1147,13 +1145,15 @@ xs_attach(device_t dev)
/* Initialize the interface to xenstore. */
struct proc *p;
 
-#ifdef XENHVM
-   xs.evtchn = hvm_get_parameter(HVM_PARAM_STORE_EVTCHN);
-   xs.gpfn = hvm_get_parameter(HVM_PARAM_STORE_PFN);
-   xen_store = pmap_mapdev(xs.gpfn * PAGE_SIZE, PAGE_SIZE);
-#else
-   xs.evtchn = xen_start_info-store_evtchn;
-#endif
+   if (xen_hvm_domain()) {
+   xs.evtchn = hvm_get_parameter(HVM_PARAM_STORE_EVTCHN);
+   xs.gpfn = hvm_get_parameter(HVM_PARAM_STORE_PFN);
+   xen_store = pmap_mapdev(xs.gpfn * PAGE_SIZE, PAGE_SIZE);
+   } else if (xen_pv_domain()) {
+   xs.evtchn = HYPERVISOR_start_info-store_evtchn;
+   } else {
+   panic(Unknown domain type, cannot initialize xenstore\n);
+   }
 
TAILQ_INIT(xs.reply_list);
TAILQ_INIT(xs.watch_events);
-- 
1.7.7.5 (Apple Git-26)

___
freebsd-current@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-current
To unsubscribe, send any mail to freebsd-current-unsubscr...@freebsd.org


[PATCH v9 15/19] xen: create a Xen nexus to use in PV/PVH

2014-01-02 Thread Roger Pau Monne
Introduce a Xen specific nexus that is going to be in charge for
attaching Xen specific devices.
---
 sys/conf/files.amd64  |1 +
 sys/conf/files.i386   |1 +
 sys/dev/xen/console/console.c |2 +-
 sys/dev/xen/timer/timer.c |4 +-
 sys/dev/xen/xenpci/xenpci.c   |4 ++
 sys/x86/xen/xen_nexus.c   |   82 +
 sys/x86/xen/xenpv.c   |1 +
 sys/xen/xenstore/xenstore.c   |6 +--
 8 files changed, 93 insertions(+), 8 deletions(-)
 create mode 100644 sys/x86/xen/xen_nexus.c

diff --git a/sys/conf/files.amd64 b/sys/conf/files.amd64
index d7c98cc..f378983 100644
--- a/sys/conf/files.amd64
+++ b/sys/conf/files.amd64
@@ -571,3 +571,4 @@ x86/xen/xen_intr.c  optionalxen | xenhvm
 x86/xen/pv.c   optionalxenhvm
 x86/xen/pvcpu_enum.c   optionalxenhvm
 x86/xen/xenpv.coptionalxenhvm
+x86/xen/xen_nexus.coptionalxenhvm
diff --git a/sys/conf/files.i386 b/sys/conf/files.i386
index 81142e3..02887a33 100644
--- a/sys/conf/files.i386
+++ b/sys/conf/files.i386
@@ -604,3 +604,4 @@ x86/x86/delay.c standard
 x86/xen/hvm.c  optional xenhvm
 x86/xen/xen_intr.c optional xen | xenhvm
 x86/xen/xenpv.coptional xen | xenhvm
+x86/xen/xen_nexus.coptional xen | xenhvm
diff --git a/sys/dev/xen/console/console.c b/sys/dev/xen/console/console.c
index 899dffc..91538fe 100644
--- a/sys/dev/xen/console/console.c
+++ b/sys/dev/xen/console/console.c
@@ -462,4 +462,4 @@ xcons_force_flush(void)
}
 }
 
-DRIVER_MODULE(xc, nexus, xc_driver, xc_devclass, 0, 0);
+DRIVER_MODULE(xc, xenpv, xc_driver, xc_devclass, 0, 0);
diff --git a/sys/dev/xen/timer/timer.c b/sys/dev/xen/timer/timer.c
index 96372ab..f16f5a5 100644
--- a/sys/dev/xen/timer/timer.c
+++ b/sys/dev/xen/timer/timer.c
@@ -636,5 +636,5 @@ static driver_t xentimer_driver = {
sizeof(struct xentimer_softc),
 };
 
-DRIVER_MODULE(xentimer, nexus, xentimer_driver, xentimer_devclass, 0, 0);
-MODULE_DEPEND(xentimer, nexus, 1, 1, 1);
+DRIVER_MODULE(xentimer, xenpv, xentimer_driver, xentimer_devclass, 0, 0);
+MODULE_DEPEND(xentimer, xenpv, 1, 1, 1);
diff --git a/sys/dev/xen/xenpci/xenpci.c b/sys/dev/xen/xenpci/xenpci.c
index dd2ad92..a27b54f 100644
--- a/sys/dev/xen/xenpci/xenpci.c
+++ b/sys/dev/xen/xenpci/xenpci.c
@@ -270,6 +270,10 @@ xenpci_attach(device_t dev)
goto errexit;
}
 
+   /* Add the xenpv device so top level Xen devices can attach */
+   if (BUS_ADD_CHILD(dev, 0, xenpv, 0) == NULL)
+   panic(xenpci: unable to add xenpv device);
+
return (bus_generic_attach(dev));
 
 errexit:
diff --git a/sys/x86/xen/xen_nexus.c b/sys/x86/xen/xen_nexus.c
new file mode 100644
index 000..d34e333
--- /dev/null
+++ b/sys/x86/xen/xen_nexus.c
@@ -0,0 +1,82 @@
+/*
+ * Copyright (c) 2013 Roger Pau Monné roger@citrix.com
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *notice, this list of conditions and the following disclaimer in the
+ *documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include sys/cdefs.h
+__FBSDID($FreeBSD$);
+
+#include sys/param.h
+#include sys/bus.h
+#include sys/kernel.h
+#include sys/module.h
+#include sys/sysctl.h
+#include sys/systm.h
+#include sys/smp.h
+
+#include machine/nexusvar.h
+
+#include xen/xen-os.h
+
+/*
+ * Xen nexus(4) driver.
+ */
+static int
+nexus_xen_probe(device_t dev)
+{
+   if (!xen_pv_domain())
+   return (ENXIO);
+
+   return (BUS_PROBE_DEFAULT);
+}
+
+static int
+nexus_xen_attach(device_t dev)
+{
+
+   nexus_init_resources();
+   bus_generic_probe(dev);
+
+   /*
+* Explicitly add the xenpv device here. Other top level
+* Xen 

[PATCH v9 11/19] xen: changes to hvm code in order to support PVH guests

2014-01-02 Thread Roger Pau Monne
On PVH we don't need to init the shared info page, or disable emulated
devices. Also, make sure PV IPIs are set before starting the APs.
---
 sys/x86/xen/hvm.c |   17 -
 1 files changed, 12 insertions(+), 5 deletions(-)

diff --git a/sys/x86/xen/hvm.c b/sys/x86/xen/hvm.c
index 9a0411e..fb1ed79 100644
--- a/sys/x86/xen/hvm.c
+++ b/sys/x86/xen/hvm.c
@@ -523,7 +523,7 @@ xen_setup_cpus(void)
 {
int i;
 
-   if (!xen_hvm_domain() || !xen_vector_callback_enabled)
+   if (!xen_vector_callback_enabled)
return;
 
 #ifdef __amd64__
@@ -712,10 +712,13 @@ xen_hvm_init(enum xen_hvm_init_type init_type)
}
 
xen_vector_callback_enabled = 0;
-   xen_domain_type = XEN_HVM_DOMAIN;
-   xen_hvm_init_shared_info_page();
xen_hvm_set_callback(NULL);
-   xen_hvm_disable_emulated_devices();
+
+   if (!xen_pv_domain()) {
+   xen_domain_type = XEN_HVM_DOMAIN;
+   xen_hvm_init_shared_info_page();
+   xen_hvm_disable_emulated_devices();
+   }
 } 
 
 void
@@ -746,6 +749,9 @@ xen_set_vcpu_id(void)
struct pcpu *pc;
int i;
 
+   if (!xen_hvm_domain())
+   return;
+
/* Set vcpu_id to acpi_id */
CPU_FOREACH(i) {
pc = pcpu_find(i);
@@ -789,7 +795,8 @@ xen_hvm_cpu_init(void)
 
 SYSINIT(xen_hvm_init, SI_SUB_HYPERVISOR, SI_ORDER_FIRST, xen_hvm_sysinit, 
NULL);
 #ifdef SMP
-SYSINIT(xen_setup_cpus, SI_SUB_SMP, SI_ORDER_FIRST, xen_setup_cpus, NULL);
+/* We need to setup IPIs before APs are started */
+SYSINIT(xen_setup_cpus, SI_SUB_SMP-1, SI_ORDER_FIRST, xen_setup_cpus, NULL);
 #endif
 SYSINIT(xen_hvm_cpu_init, SI_SUB_INTR, SI_ORDER_FIRST, xen_hvm_cpu_init, NULL);
 SYSINIT(xen_set_vcpu_id, SI_SUB_CPU, SI_ORDER_ANY, xen_set_vcpu_id, NULL);
-- 
1.7.7.5 (Apple Git-26)

___
freebsd-current@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-current
To unsubscribe, send any mail to freebsd-current-unsubscr...@freebsd.org


[PATCH v9 19/19] isa: allow ISA bus to attach to xenpv device

2014-01-02 Thread Roger Pau Monne
---
 sys/x86/isa/isa.c |3 +++
 1 files changed, 3 insertions(+), 0 deletions(-)

diff --git a/sys/x86/isa/isa.c b/sys/x86/isa/isa.c
index 1a57137..9287ff2 100644
--- a/sys/x86/isa/isa.c
+++ b/sys/x86/isa/isa.c
@@ -241,3 +241,6 @@ isa_release_resource(device_t bus, device_t child, int 
type, int rid,
  * On this platform, isa can also attach to the legacy bus.
  */
 DRIVER_MODULE(isa, legacy, isa_driver, isa_devclass, 0, 0);
+#ifdef XENHVM
+DRIVER_MODULE(isa, xenpv, isa_driver, isa_devclass, 0, 0);
+#endif
-- 
1.7.7.5 (Apple Git-26)

___
freebsd-current@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-current
To unsubscribe, send any mail to freebsd-current-unsubscr...@freebsd.org


[PATCH v9 12/19] xen: add a hook to perform AP startup

2014-01-02 Thread Roger Pau Monne
AP startup on PVH follows the PV method, so we need to add a hook in
order to diverge from bare metal.
---
 sys/amd64/amd64/mp_machdep.c |   14 +++---
 sys/amd64/include/cpu.h  |1 +
 sys/amd64/include/smp.h  |1 +
 sys/x86/xen/hvm.c|   12 +-
 sys/x86/xen/pv.c |   85 ++
 sys/xen/pv.h |   32 
 6 files changed, 137 insertions(+), 8 deletions(-)
 create mode 100644 sys/xen/pv.h

diff --git a/sys/amd64/amd64/mp_machdep.c b/sys/amd64/amd64/mp_machdep.c
index 4ef4b3d..0738a37 100644
--- a/sys/amd64/amd64/mp_machdep.c
+++ b/sys/amd64/amd64/mp_machdep.c
@@ -90,7 +90,7 @@ extern  struct pcpu __pcpu[];
 
 /* AP uses this during bootstrap.  Do not staticize.  */
 char *bootSTK;
-static int bootAP;
+int bootAP;
 
 /* Free these after use */
 void *bootstacks[MAXCPU];
@@ -124,7 +124,8 @@ static u_long *ipi_hardclock_counts[MAXCPU];
 
 /* Default cpu_ops implementation. */
 struct cpu_ops cpu_ops = {
-   .ipi_vectored = lapic_ipi_vectored
+   .ipi_vectored = lapic_ipi_vectored,
+   .start_all_aps = native_start_all_aps,
 };
 
 extern inthand_t IDTVEC(fast_syscall), IDTVEC(fast_syscall32);
@@ -138,7 +139,7 @@ extern int pmap_pcid_enabled;
 static volatile cpuset_t ipi_nmi_pending;
 
 /* used to hold the AP's until we are ready to release them */
-static struct mtx ap_boot_mtx;
+struct mtx ap_boot_mtx;
 
 /* Set to 1 once we're ready to let the APs out of the pen. */
 static volatile int aps_ready = 0;
@@ -165,7 +166,6 @@ static int cpu_cores;   /* cores per 
package */
 
 static voidassign_cpu_ids(void);
 static voidset_interrupt_apic_ids(void);
-static int start_all_aps(void);
 static int start_ap(int apic_id);
 static voidrelease_aps(void *dummy);
 
@@ -569,7 +569,7 @@ cpu_mp_start(void)
assign_cpu_ids();
 
/* Start each Application Processor */
-   start_all_aps();
+   cpu_ops.start_all_aps();
 
set_interrupt_apic_ids();
 }
@@ -908,8 +908,8 @@ assign_cpu_ids(void)
 /*
  * start each AP in our list
  */
-static int
-start_all_aps(void)
+int
+native_start_all_aps(void)
 {
vm_offset_t va = boot_address + KERNBASE;
u_int64_t *pt4, *pt3, *pt2;
diff --git a/sys/amd64/include/cpu.h b/sys/amd64/include/cpu.h
index 3d9ff531..ed9f1db 100644
--- a/sys/amd64/include/cpu.h
+++ b/sys/amd64/include/cpu.h
@@ -64,6 +64,7 @@ struct cpu_ops {
void (*cpu_init)(void);
void (*cpu_resume)(void);
void (*ipi_vectored)(u_int, int);
+   int  (*start_all_aps)(void);
 };
 
 extern struct  cpu_ops cpu_ops;
diff --git a/sys/amd64/include/smp.h b/sys/amd64/include/smp.h
index d1b366b..15bc823 100644
--- a/sys/amd64/include/smp.h
+++ b/sys/amd64/include/smp.h
@@ -79,6 +79,7 @@ void  smp_masked_invlpg_range(cpuset_t mask, struct pmap 
*pmap,
vm_offset_t startva, vm_offset_t endva);
 void   smp_invltlb(struct pmap *pmap);
 void   smp_masked_invltlb(cpuset_t mask, struct pmap *pmap);
+intnative_start_all_aps(void);
 
 #endif /* !LOCORE */
 #endif /* SMP */
diff --git a/sys/x86/xen/hvm.c b/sys/x86/xen/hvm.c
index fb1ed79..49caacf 100644
--- a/sys/x86/xen/hvm.c
+++ b/sys/x86/xen/hvm.c
@@ -53,6 +53,9 @@ __FBSDID($FreeBSD$);
 #include xen/hypervisor.h
 #include xen/hvm.h
 #include xen/xen_intr.h
+#ifdef __amd64__
+#include xen/pv.h
+#endif
 
 #include xen/interface/hvm/params.h
 #include xen/interface/vcpu.h
@@ -119,7 +122,10 @@ enum xen_domain_type xen_domain_type = XEN_NATIVE;
 struct cpu_ops xen_hvm_cpu_ops = {
.ipi_vectored   = lapic_ipi_vectored,
.cpu_init   = xen_hvm_cpu_init,
-   .cpu_resume = xen_hvm_cpu_resume
+   .cpu_resume = xen_hvm_cpu_resume,
+#ifdef __amd64__
+   .start_all_aps = native_start_all_aps,
+#endif
 };
 
 static MALLOC_DEFINE(M_XENHVM, xen_hvm, Xen HVM PV Support);
@@ -698,6 +704,10 @@ xen_hvm_init(enum xen_hvm_init_type init_type)
setup_xen_features();
cpu_ops = xen_hvm_cpu_ops;
vm_guest = VM_GUEST_XEN;
+#ifdef __amd64__
+   if (xen_pv_domain())
+   cpu_ops.start_all_aps = xen_pv_start_all_aps;
+#endif
break;
case XEN_HVM_INIT_RESUME:
if (error != 0)
diff --git a/sys/x86/xen/pv.c b/sys/x86/xen/pv.c
index d11bc1a..22fd6a6 100644
--- a/sys/x86/xen/pv.c
+++ b/sys/x86/xen/pv.c
@@ -34,8 +34,11 @@ __FBSDID($FreeBSD$);
 #include sys/kernel.h
 #include sys/reboot.h
 #include sys/systm.h
+#include sys/malloc.h
 #include sys/lock.h
 #include sys/rwlock.h
+#include sys/mutex.h
+#include sys/smp.h
 
 #include vm/vm.h
 #include vm/vm_extern.h
@@ -49,9 +52,13 @@ __FBSDID($FreeBSD$);
 #include machine/sysarch.h
 #include machine/clock.h
 #include machine/pc/bios.h
+#include machine/smp.h
 
 #include xen/xen-os.h
 #include xen/hypervisor.h
+#include xen/pv.h
+
+#include xen/interface/vcpu.h
 
 /* Native initial function */
 extern 

[PATCH v9 14/19] xen: introduce xenpv bus and a dummy pvcpu device

2014-01-02 Thread Roger Pau Monne
Since Xen PVH guests doesn't have ACPI, we need to create a dummy
bus so top level Xen devices can attach to it (instead of
attaching directly to the nexus) and a pvcpu device that will be used
to fill the pcpu-pc_device field.
---
 sys/conf/files.amd64 |1 +
 sys/conf/files.i386  |1 +
 sys/x86/xen/xenpv.c  |  155 ++
 3 files changed, 157 insertions(+), 0 deletions(-)
 create mode 100644 sys/x86/xen/xenpv.c

diff --git a/sys/conf/files.amd64 b/sys/conf/files.amd64
index a3491da..d7c98cc 100644
--- a/sys/conf/files.amd64
+++ b/sys/conf/files.amd64
@@ -570,3 +570,4 @@ x86/xen/hvm.c   optionalxenhvm
 x86/xen/xen_intr.c optionalxen | xenhvm
 x86/xen/pv.c   optionalxenhvm
 x86/xen/pvcpu_enum.c   optionalxenhvm
+x86/xen/xenpv.coptionalxenhvm
diff --git a/sys/conf/files.i386 b/sys/conf/files.i386
index 790296d..81142e3 100644
--- a/sys/conf/files.i386
+++ b/sys/conf/files.i386
@@ -603,3 +603,4 @@ x86/x86/tsc.c   standard
 x86/x86/delay.cstandard
 x86/xen/hvm.c  optional xenhvm
 x86/xen/xen_intr.c optional xen | xenhvm
+x86/xen/xenpv.coptional xen | xenhvm
diff --git a/sys/x86/xen/xenpv.c b/sys/x86/xen/xenpv.c
new file mode 100644
index 000..41d674f
--- /dev/null
+++ b/sys/x86/xen/xenpv.c
@@ -0,0 +1,155 @@
+/*
+ * Copyright (c) 2013 Roger Pau Monné roger@citrix.com
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *notice, this list of conditions and the following disclaimer in the
+ *documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include sys/cdefs.h
+__FBSDID($FreeBSD$);
+
+#include sys/param.h
+#include sys/systm.h
+#include sys/bus.h
+#include sys/kernel.h
+#include sys/module.h
+#include sys/pcpu.h
+#include sys/smp.h
+
+#include xen/xen-os.h
+
+static int
+xenpv_probe(device_t dev)
+{
+
+   device_set_desc(dev, Xen PV bus);
+   device_quiet(dev);
+   return (0);
+}
+
+static int
+xenpv_attach(device_t dev)
+{
+   device_t child;
+
+   /*
+* Let our child drivers identify any child devices that they
+* can find.  Once that is done attach any devices that we
+* found.
+*/
+   bus_generic_probe(dev);
+   bus_generic_attach(dev);
+
+   if (!devclass_get_device(devclass_find(isa), 0)) {
+   child = BUS_ADD_CHILD(dev, 0, isa, 0);
+   if (child == NULL)
+   panic(xenpv_attach isa);
+   device_probe_and_attach(child);
+   }
+
+   return 0;
+}
+
+static device_method_t xenpv_methods[] = {
+   /* Device interface */
+   DEVMETHOD(device_probe, xenpv_probe),
+   DEVMETHOD(device_attach,xenpv_attach),
+   DEVMETHOD(device_suspend,   bus_generic_suspend),
+   DEVMETHOD(device_resume,bus_generic_resume),
+
+   /* Bus interface */
+   DEVMETHOD(bus_add_child,bus_generic_add_child),
+
+   DEVMETHOD_END
+};
+
+static driver_t xenpv_driver = {
+   xenpv,
+   xenpv_methods,
+   1,  /* no softc */
+};
+static devclass_t xenpv_devclass;
+
+DRIVER_MODULE(xenpv, nexus, xenpv_driver, xenpv_devclass, 0, 0);
+
+/*
+ * Dummy Xen cpu device
+ *
+ * Since there's no ACPI on PVH guests, we need to create a dummy
+ * CPU device in order to fill the pcpu-pc_device field.
+ */
+
+static void
+xenpvcpu_identify(driver_t *driver, device_t parent)
+{
+   device_t child;
+   int i;
+
+   /* Only attach to PV guests, HVM guests use the ACPI CPU devices */
+   if (!xen_pv_domain())
+   return;
+
+   CPU_FOREACH(i) {
+   child = BUS_ADD_CHILD(parent, 0, 

[PATCH v9 13/19] xen: introduce flag to disable the local apic

2014-01-02 Thread Roger Pau Monne
PVH guests don't have an emulated lapic.
---
 sys/amd64/amd64/mp_machdep.c |   10 ++
 sys/amd64/include/apicvar.h  |1 +
 sys/i386/include/apicvar.h   |1 +
 sys/i386/xen/xen_machdep.c   |2 ++
 sys/x86/x86/local_apic.c |8 +---
 sys/x86/xen/pv.c |3 +++
 6 files changed, 18 insertions(+), 7 deletions(-)

diff --git a/sys/amd64/amd64/mp_machdep.c b/sys/amd64/amd64/mp_machdep.c
index 0738a37..fd6eace 100644
--- a/sys/amd64/amd64/mp_machdep.c
+++ b/sys/amd64/amd64/mp_machdep.c
@@ -707,7 +707,8 @@ init_secondary(void)
wrmsr(MSR_SF_MASK, PSL_NT|PSL_T|PSL_I|PSL_C|PSL_D);
 
/* Disable local APIC just to be sure. */
-   lapic_disable();
+   if (lapic_valid)
+   lapic_disable();
 
/* signal our startup to the BSP. */
mp_naps++;
@@ -733,7 +734,7 @@ init_secondary(void)
 
/* A quick check from sanity claus */
cpuid = PCPU_GET(cpuid);
-   if (PCPU_GET(apic_id) != lapic_id()) {
+   if (lapic_valid  (PCPU_GET(apic_id) != lapic_id())) {
printf(SMP: cpuid = %d\n, cpuid);
printf(SMP: actual apic_id = %d\n, lapic_id());
printf(SMP: correct apic_id = %d\n, PCPU_GET(apic_id));
@@ -749,7 +750,8 @@ init_secondary(void)
mtx_lock_spin(ap_boot_mtx);
 
/* Init local apic for irq's */
-   lapic_setup(1);
+   if (lapic_valid)
+   lapic_setup(1);
 
/* Set memory range attributes for this CPU to match the BSP */
mem_range_AP_init();
@@ -764,7 +766,7 @@ init_secondary(void)
if (cpu_logical  1  PCPU_GET(apic_id) % cpu_logical != 0)
CPU_SET(cpuid, logical_cpus_mask);
 
-   if (bootverbose)
+   if (lapic_valid  bootverbose)
lapic_dump(AP);
 
if (smp_cpus == mp_ncpus) {
diff --git a/sys/amd64/include/apicvar.h b/sys/amd64/include/apicvar.h
index e7423a3..c04a238 100644
--- a/sys/amd64/include/apicvar.h
+++ b/sys/amd64/include/apicvar.h
@@ -169,6 +169,7 @@ inthand_t
 
 extern vm_paddr_t lapic_paddr;
 extern int apic_cpuids[];
+extern bool lapic_valid;
 
 u_int  apic_alloc_vector(u_int apic_id, u_int irq);
 u_int  apic_alloc_vectors(u_int apic_id, u_int *irqs, u_int count,
diff --git a/sys/i386/include/apicvar.h b/sys/i386/include/apicvar.h
index df99ebe..ea8a3c3 100644
--- a/sys/i386/include/apicvar.h
+++ b/sys/i386/include/apicvar.h
@@ -168,6 +168,7 @@ inthand_t
 
 extern vm_paddr_t lapic_paddr;
 extern int apic_cpuids[];
+extern bool lapic_valid;
 
 u_int  apic_alloc_vector(u_int apic_id, u_int irq);
 u_int  apic_alloc_vectors(u_int apic_id, u_int *irqs, u_int count,
diff --git a/sys/i386/xen/xen_machdep.c b/sys/i386/xen/xen_machdep.c
index 09c01f1..25b9cfc 100644
--- a/sys/i386/xen/xen_machdep.c
+++ b/sys/i386/xen/xen_machdep.c
@@ -59,6 +59,7 @@ __FBSDID($FreeBSD$);
 #include machine/intr_machdep.h
 #include machine/md_var.h
 #include machine/asmacros.h
+#include machine/apicvar.h
 
 
 
@@ -912,6 +913,7 @@ initvalues(start_info_t *startinfo)
 #endif 
xen_start_info = startinfo;
HYPERVISOR_start_info = startinfo;
+   lapic_valid = false;
xen_phys_machine = (xen_pfn_t *)startinfo-mfn_list;
 
IdlePTD = (pd_entry_t *)((uint8_t *)startinfo-pt_base + PAGE_SIZE);
diff --git a/sys/x86/x86/local_apic.c b/sys/x86/x86/local_apic.c
index 41bd602..fddf1fb 100644
--- a/sys/x86/x86/local_apic.c
+++ b/sys/x86/x86/local_apic.c
@@ -156,6 +156,7 @@ extern inthand_t IDTVEC(rsvd);
 
 volatile lapic_t *lapic;
 vm_paddr_t lapic_paddr;
+bool lapic_valid = true;
 static u_long lapic_timer_divisor;
 static struct eventtimer lapic_et;
 
@@ -1367,9 +1368,10 @@ apic_setup_io(void *dummy __unused)
if (retval != 0)
printf(%s: Failed to setup I/O APICs: returned %d\n,
best_enum-apic_name, retval);
-#ifdef XEN
-   return;
-#endif
+
+   if (!lapic_valid)
+   return;
+
/*
 * Finish setting up the local APIC on the BSP once we know how to
 * properly program the LINT pins.
diff --git a/sys/x86/xen/pv.c b/sys/x86/xen/pv.c
index 22fd6a6..6ea1e2a 100644
--- a/sys/x86/xen/pv.c
+++ b/sys/x86/xen/pv.c
@@ -53,6 +53,7 @@ __FBSDID($FreeBSD$);
 #include machine/clock.h
 #include machine/pc/bios.h
 #include machine/smp.h
+#include machine/apicvar.h
 
 #include xen/xen-os.h
 #include xen/hypervisor.h
@@ -315,4 +316,6 @@ xen_pv_set_init_ops(void)
 {
/* Init ops for Xen PV */
init_ops = xen_init_ops;
+   /* Disable lapic */
+   lapic_valid = false;
 }
-- 
1.7.7.5 (Apple Git-26)

___
freebsd-current@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-current
To unsubscribe, send any mail to freebsd-current-unsubscr...@freebsd.org


[PATCH v9 18/19] xen: changes to gnttab for PVH

2014-01-02 Thread Roger Pau Monne
---
 sys/xen/gnttab.c |   26 +-
 1 files changed, 21 insertions(+), 5 deletions(-)

diff --git a/sys/xen/gnttab.c b/sys/xen/gnttab.c
index 03c32b7..6949be5 100644
--- a/sys/xen/gnttab.c
+++ b/sys/xen/gnttab.c
@@ -25,6 +25,7 @@ __FBSDID($FreeBSD$);
 #include sys/lock.h
 #include sys/malloc.h
 #include sys/mman.h
+#include sys/limits.h
 
 #include xen/xen-os.h
 #include xen/hypervisor.h
@@ -607,6 +608,7 @@ gnttab_resume(void)
 {
int error;
unsigned int max_nr_gframes, nr_gframes;
+   void *alloc_mem;
 
nr_gframes = nr_grant_frames;
max_nr_gframes = max_nr_grant_frames();
@@ -614,11 +616,25 @@ gnttab_resume(void)
return (ENOSYS);
 
if (!resume_frames) {
-   error = xenpci_alloc_space(PAGE_SIZE * max_nr_gframes,
-   resume_frames);
-   if (error) {
-   printf(error mapping gnttab share frames\n);
-   return (error);
+   if (xen_pv_domain()) {
+   /*
+* This is a waste of physical memory,
+* we should use ballooned pages instead,
+* but it will do for now.
+*/
+   alloc_mem = contigmalloc(max_nr_gframes * PAGE_SIZE,
+M_DEVBUF, M_NOWAIT, 0,
+ULONG_MAX, PAGE_SIZE, 0);
+   KASSERT((alloc_mem != NULL),
+   (unable to alloc memory for gnttab));
+   resume_frames = vtophys(alloc_mem);
+   } else {
+   error = xenpci_alloc_space(PAGE_SIZE * max_nr_gframes,
+   resume_frames);
+   if (error) {
+   printf(error mapping gnttab share frames\n);
+   return (error);
+   }
}
}
 
-- 
1.7.7.5 (Apple Git-26)

___
freebsd-current@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-current
To unsubscribe, send any mail to freebsd-current-unsubscr...@freebsd.org


[PATCH RFC 03/13] xen: mask event channels while changing affinity

2013-12-24 Thread Roger Pau Monne
Event channels should be masked while chaning affinity, or else we
might get spurious/lost interrupts.
---
 sys/x86/xen/xen_intr.c |   15 ---
 1 files changed, 12 insertions(+), 3 deletions(-)

diff --git a/sys/x86/xen/xen_intr.c b/sys/x86/xen/xen_intr.c
index fd36e68..bc0781e 100644
--- a/sys/x86/xen/xen_intr.c
+++ b/sys/x86/xen/xen_intr.c
@@ -797,7 +797,7 @@ xen_intr_assign_cpu(struct intsrc *base_isrc, u_int apic_id)
struct evtchn_bind_vcpu bind_vcpu;
struct xenisrc *isrc;
u_int to_cpu, vcpu_id;
-   int error;
+   int error, masked;
 
 #ifdef XENHVM
if (xen_vector_callback_enabled == 0)
@@ -815,6 +815,12 @@ xen_intr_assign_cpu(struct intsrc *base_isrc, u_int 
apic_id)
return (EINVAL);
}
 
+   /*
+* Mask the event channel port so we don't receive spurious events
+* while changing affinity.
+*/
+   masked = evtchn_test_and_set_mask(isrc-xi_port);
+
if ((isrc-xi_type == EVTCHN_TYPE_VIRQ) ||
(isrc-xi_type == EVTCHN_TYPE_IPI)) {
/*
@@ -825,8 +831,7 @@ xen_intr_assign_cpu(struct intsrc *base_isrc, u_int apic_id)
evtchn_cpu_mask_port(isrc-xi_cpu, isrc-xi_port);
isrc-xi_cpu = to_cpu;
evtchn_cpu_unmask_port(isrc-xi_cpu, isrc-xi_port);
-   mtx_unlock(xen_intr_isrc_lock);
-   return (0);
+   goto out;
}
 
bind_vcpu.port = isrc-xi_port;
@@ -848,6 +853,10 @@ xen_intr_assign_cpu(struct intsrc *base_isrc, u_int 
apic_id)
evtchn_cpu_mask_port(to_cpu, isrc-xi_port);
}
}
+
+out:
+   if (!masked)
+   evtchn_unmask_port(isrc-xi_port);
mtx_unlock(xen_intr_isrc_lock);
return (0);
 #else
-- 
1.7.7.5 (Apple Git-26)

___
freebsd-current@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-current
To unsubscribe, send any mail to freebsd-current-unsubscr...@freebsd.org


[PATCH RFC 02/13] ioapic: introduce hooks for some ioapic ops

2013-12-24 Thread Roger Pau Monne
Create some hooks for IO APIC operations that will diverge from bare
metal when implemented for Xen Dom0.

This patch should not introduce any changes in functionality, it's a
preparatory patch for the implementation of the Xen IO APIC hooks.
---
 sys/amd64/include/apicvar.h |   13 
 sys/i386/include/apicvar.h  |   13 
 sys/x86/include/apicreg.h   |   12 
 sys/x86/x86/io_apic.c   |   65 ++-
 4 files changed, 71 insertions(+), 32 deletions(-)

diff --git a/sys/amd64/include/apicvar.h b/sys/amd64/include/apicvar.h
index 84e01d4..a48a76b 100644
--- a/sys/amd64/include/apicvar.h
+++ b/sys/amd64/include/apicvar.h
@@ -161,6 +161,19 @@ struct apic_enumerator {
SLIST_ENTRY(apic_enumerator) apic_next;
 };
 
+struct ioapic_intsrc {
+   struct intsrc io_intsrc;
+   u_int io_irq;
+   u_int io_intpin:8;
+   u_int io_vector:8;
+   u_int io_cpu:8;
+   u_int io_activehi:1;
+   u_int io_edgetrigger:1;
+   u_int io_masked:1;
+   int io_bus:4;
+   uint32_t io_lowreg;
+};
+
 inthand_t
IDTVEC(apic_isr1), IDTVEC(apic_isr2), IDTVEC(apic_isr3),
IDTVEC(apic_isr4), IDTVEC(apic_isr5), IDTVEC(apic_isr6),
diff --git a/sys/i386/include/apicvar.h b/sys/i386/include/apicvar.h
index 24c99f0..c8ee9bc 100644
--- a/sys/i386/include/apicvar.h
+++ b/sys/i386/include/apicvar.h
@@ -160,6 +160,19 @@ struct apic_enumerator {
SLIST_ENTRY(apic_enumerator) apic_next;
 };
 
+struct ioapic_intsrc {
+   struct intsrc io_intsrc;
+   u_int io_irq;
+   u_int io_intpin:8;
+   u_int io_vector:8;
+   u_int io_cpu:8;
+   u_int io_activehi:1;
+   u_int io_edgetrigger:1;
+   u_int io_masked:1;
+   int io_bus:4;
+   uint32_t io_lowreg;
+};
+
 inthand_t
IDTVEC(apic_isr1), IDTVEC(apic_isr2), IDTVEC(apic_isr3),
IDTVEC(apic_isr4), IDTVEC(apic_isr5), IDTVEC(apic_isr6),
diff --git a/sys/x86/include/apicreg.h b/sys/x86/include/apicreg.h
index 283d50e..4629470 100644
--- a/sys/x86/include/apicreg.h
+++ b/sys/x86/include/apicreg.h
@@ -204,6 +204,18 @@ struct IOAPIC {
 
 typedef struct IOAPIC ioapic_t;
 
+struct ioapic_intsrc;
+/*
+ * Struct containing pointers to IO APIC management functions whose
+ * implementation is run time selectable.
+ */
+struct ioapic_ops {
+   u_int(*read)(volatile ioapic_t *, int);
+   void (*write)(volatile ioapic_t *, int, u_int);
+   void (*register_intr)(struct ioapic_intsrc *);
+};
+extern struct ioapic_ops ioapic_ops;
+
 #undef PAD4
 #undef PAD3
 
diff --git a/sys/x86/x86/io_apic.c b/sys/x86/x86/io_apic.c
index 6d62b1e..125d06a 100644
--- a/sys/x86/x86/io_apic.c
+++ b/sys/x86/x86/io_apic.c
@@ -81,19 +81,6 @@ static MALLOC_DEFINE(M_IOAPIC, io_apic, I/O APIC 
structures);
  * ftp://download.intel.com/design/chipsets/datashts/29056601.pdf
  */
 
-struct ioapic_intsrc {
-   struct intsrc io_intsrc;
-   u_int io_irq;
-   u_int io_intpin:8;
-   u_int io_vector:8;
-   u_int io_cpu:8;
-   u_int io_activehi:1;
-   u_int io_edgetrigger:1;
-   u_int io_masked:1;
-   int io_bus:4;
-   uint32_t io_lowreg;
-};
-
 struct ioapic {
struct pic io_pic;
u_int io_id:8;  /* logical ID */
@@ -106,8 +93,9 @@ struct ioapic {
struct ioapic_intsrc io_pins[0];
 };
 
-static u_int   ioapic_read(volatile ioapic_t *apic, int reg);
-static voidioapic_write(volatile ioapic_t *apic, int reg, u_int val);
+static u_int   native_ioapic_read(volatile ioapic_t *apic, int reg);
+static voidnative_ioapic_write(volatile ioapic_t *apic, int reg, u_int 
val);
+static voidnative_ioapic_register_intr(struct ioapic_intsrc *pin);
 static const char *ioapic_bus_string(int bus_type);
 static voidioapic_print_irq(struct ioapic_intsrc *intpin);
 static voidioapic_enable_source(struct intsrc *isrc);
@@ -139,6 +127,13 @@ SYSCTL_INT(_hw_apic, OID_AUTO, enable_extint, 
CTLFLAG_RDTUN, enable_extint, 0,
 Enable the ExtINT pin in the first I/O APIC);
 TUNABLE_INT(hw.apic.enable_extint, enable_extint);
 
+/* Default ioapic_ops implementation. */
+struct ioapic_ops ioapic_ops = {
+   .read = native_ioapic_read,
+   .write =native_ioapic_write,
+   .register_intr =native_ioapic_register_intr,
+};
+
 static __inline void
 _ioapic_eoi_source(struct intsrc *isrc)
 {
@@ -146,7 +141,7 @@ _ioapic_eoi_source(struct intsrc *isrc)
 }
 
 static u_int
-ioapic_read(volatile ioapic_t *apic, int reg)
+native_ioapic_read(volatile ioapic_t *apic, int reg)
 {
 
mtx_assert(icu_lock, MA_OWNED);
@@ -155,7 +150,7 @@ ioapic_read(volatile ioapic_t *apic, int reg)
 }
 
 static void
-ioapic_write(volatile ioapic_t *apic, int reg, u_int val)
+native_ioapic_write(volatile ioapic_t *apic, int reg, u_int val)
 {
 
mtx_assert(icu_lock, MA_OWNED);
@@ -163,6 +158,12 @@ ioapic_write(volatile ioapic_t *apic, int reg, u_int val)
apic-iowin = 

[PATCH RFC 05/13] xen: implement Xen IO APIC ops

2013-12-24 Thread Roger Pau Monne
Implement a different set of hooks for IO APIC to use when running
under Xen Dom0.
---
 sys/x86/xen/pv.c |   44 
 1 files changed, 44 insertions(+), 0 deletions(-)

diff --git a/sys/x86/xen/pv.c b/sys/x86/xen/pv.c
index ab4afba..e5ad200 100644
--- a/sys/x86/xen/pv.c
+++ b/sys/x86/xen/pv.c
@@ -49,6 +49,7 @@ __FBSDID($FreeBSD$);
 #include vm/vm_pager.h
 #include vm/vm_param.h
 
+#include x86/apicreg.h
 #include machine/sysarch.h
 #include machine/clock.h
 #include machine/pc/bios.h
@@ -58,6 +59,7 @@ __FBSDID($FreeBSD$);
 #include xen/xen-os.h
 #include xen/hypervisor.h
 #include xen/pv.h
+#include xen/xen_intr.h
 
 #include xen/interface/vcpu.h
 
@@ -73,6 +75,11 @@ static caddr_t xen_pv_parse_preload_data(u_int64_t);
 static void xen_pv_parse_memmap(caddr_t, vm_paddr_t *, int *);
 
 static void xen_pv_set_init_ops(void);
+
+static u_int xen_pv_ioapic_read(volatile ioapic_t *, int);
+static void xen_pv_ioapic_write(volatile ioapic_t *, int, u_int);
+static void xen_pv_ioapic_register_intr(struct ioapic_intsrc *);
+
 /* Extern Declarations 
---*/
 /* Variables used by amd64 mp_machdep to start APs */
 extern struct mtx ap_boot_mtx;
@@ -92,6 +99,13 @@ struct init_ops xen_init_ops = {
.parse_memmap = xen_pv_parse_memmap,
 };
 
+/* Xen ioapic_ops implementation */
+struct ioapic_ops xen_ioapic_ops = {
+   .read = xen_pv_ioapic_read,
+   .write =xen_pv_ioapic_write,
+   .register_intr =xen_pv_ioapic_register_intr,
+};
+
 static struct
 {
const char  *ev;
@@ -342,6 +356,34 @@ xen_pv_parse_memmap(caddr_t kmdp, vm_paddr_t *physmap, int 
*physmap_idx)
bios_add_smap_entries(xen_smap, size, physmap, physmap_idx);
 }
 
+static u_int
+xen_pv_ioapic_read(volatile ioapic_t *apic, int reg)
+{
+   struct physdev_apic apic_op;
+   int rc;
+
+   mtx_assert(icu_lock, MA_OWNED);
+
+   apic_op.apic_physbase = pmap_kextract((vm_offset_t) apic);
+   apic_op.reg = reg;
+   rc = HYPERVISOR_physdev_op(PHYSDEVOP_apic_read, apic_op);
+   if (rc)
+   panic(apic_read operation failed);
+
+   return (apic_op.value);
+}
+
+static void
+xen_pv_ioapic_write(volatile ioapic_t *apic, int reg, u_int val)
+{
+}
+
+static void
+xen_pv_ioapic_register_intr(struct ioapic_intsrc *pin)
+{
+   xen_register_pirq(pin-io_irq, pin-io_activehi, pin-io_edgetrigger);
+}
+
 static void
 xen_pv_set_init_ops(void)
 {
@@ -349,4 +391,6 @@ xen_pv_set_init_ops(void)
init_ops = xen_init_ops;
/* Disable lapic */
lapic_disabled = true;
+   /* IOAPIC ops for Xen PV */
+   ioapic_ops = xen_ioapic_ops;
 }
-- 
1.7.7.5 (Apple Git-26)

___
freebsd-current@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-current
To unsubscribe, send any mail to freebsd-current-unsubscr...@freebsd.org


[PATCH RFC 06/13] xen: Dom0 console fixes

2013-12-24 Thread Roger Pau Monne
Minor fixes and workarounds to make the Xen Dom0 console work.
---
 sys/dev/xen/console/xencons_ring.c |   16 
 1 files changed, 16 insertions(+), 0 deletions(-)

diff --git a/sys/dev/xen/console/xencons_ring.c 
b/sys/dev/xen/console/xencons_ring.c
index d826363..ea97f7b 100644
--- a/sys/dev/xen/console/xencons_ring.c
+++ b/sys/dev/xen/console/xencons_ring.c
@@ -48,6 +48,9 @@ xencons_has_input(void)
 {
struct xencons_interface *intf; 
 
+   if (xen_initial_domain())
+   return 1;
+
intf = xencons_interface(); 
 
return (intf-in_cons != intf-in_prod);
@@ -97,6 +100,19 @@ xencons_handle_input(void *unused)
XENCONS_RING_IDX cons, prod;
 
CN_LOCK(cn_mtx);
+
+   if (xen_initial_domain()) {
+   /* XXX: read from console */
+   static char rbuf[16];
+   int l;
+
+   while ((l = HYPERVISOR_console_io(CONSOLEIO_read, 16, rbuf))  
0)
+   xencons_rx(rbuf, l);
+
+   CN_UNLOCK(cn_mtx);
+   return;
+   }
+
intf = xencons_interface();
 
cons = intf-in_cons;
-- 
1.7.7.5 (Apple Git-26)

___
freebsd-current@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-current
To unsubscribe, send any mail to freebsd-current-unsubscr...@freebsd.org


[PATCH RFC 01/13] xen: use the hardware e820 map on Dom0

2013-12-24 Thread Roger Pau Monne
We need to do some tweaking of the hardware e820 map, since the memory
layout provided by Xen and the e820 map doesn't match.

This consists in clamping the e820 map so that regions above max_pfn
are marked as unusuable.
---
 sys/x86/xen/pv.c |   35 +--
 1 files changed, 33 insertions(+), 2 deletions(-)

diff --git a/sys/x86/xen/pv.c b/sys/x86/xen/pv.c
index 4f7415e..ab4afba 100644
--- a/sys/x86/xen/pv.c
+++ b/sys/x86/xen/pv.c
@@ -297,17 +297,48 @@ static void
 xen_pv_parse_memmap(caddr_t kmdp, vm_paddr_t *physmap, int *physmap_idx)
 {
struct xen_memory_map memmap;
+   unsigned long max_pfn = HYPERVISOR_start_info-nr_pages;
+   u_int64_t mem_end = ptoa(max_pfn);
u_int32_t size;
-   int rc;
+   int rc, mem_op, i;
 
/* Fetch the E820 map from Xen */
memmap.nr_entries = MAX_E820_ENTRIES;
set_xen_guest_handle(memmap.buffer, xen_smap);
-   rc = HYPERVISOR_memory_op(XENMEM_memory_map, memmap);
+   mem_op = xen_initial_domain() ?
+   XENMEM_machine_memory_map :
+   XENMEM_memory_map;
+   rc = HYPERVISOR_memory_op(mem_op, memmap);
if (rc)
panic(unable to fetch Xen E820 memory map);
size = memmap.nr_entries * sizeof(xen_smap[0]);
 
+   /*
+* This should be improved, Xen provides us with a single
+* chunk of physical memory that goes from 0 to max_pfn,
+* and what we do here is clamp the HW memory map to make
+* sure regions above max_pfn are marked as reserved.
+*
+* TRTTD would be to move the memory not used because of
+* the holes in the HW memory map to the now clamped regions
+* using XENMEM_{decrease/increase}_reservation.
+*/
+   for (i = 0; i  memmap.nr_entries; i++) {
+   u_int64_t end = xen_smap[i].base + xen_smap[i].length;
+   if (xen_smap[i].type == SMAP_TYPE_MEMORY) {
+   if (xen_smap[i].base  mem_end) {
+   /* Mark as reserved */
+   xen_smap[i].type = SMAP_TYPE_RESERVED;
+   continue;
+   }
+   if (end  mem_end) {
+   /* Truncate region */
+   xen_smap[i].length -= end - mem_end;
+   }
+   }
+   }
+
+
bios_add_smap_entries(xen_smap, size, physmap, physmap_idx);
 }
 
-- 
1.7.7.5 (Apple Git-26)

___
freebsd-current@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-current
To unsubscribe, send any mail to freebsd-current-unsubscr...@freebsd.org


[PATCH RFC 07/13] xen: implement IO APIC support in Xen mptable parser

2013-12-24 Thread Roger Pau Monne
Use madt_setup_io (from madt.c) on Xen apic_enumerator, in order to
parse the interrupt sources from the IO APIC.

I would like to get opinions, but I think we should rename and move
madt_setup_io to io_apic.c.
---
 sys/amd64/include/apicvar.h |1 +
 sys/i386/include/apicvar.h  |1 +
 sys/x86/acpica/madt.c   |5 ++---
 sys/x86/xen/mptable.c   |   24 +++-
 4 files changed, 27 insertions(+), 4 deletions(-)

diff --git a/sys/amd64/include/apicvar.h b/sys/amd64/include/apicvar.h
index a48a76b..3974067 100644
--- a/sys/amd64/include/apicvar.h
+++ b/sys/amd64/include/apicvar.h
@@ -233,6 +233,7 @@ int lapic_set_lvt_triggermode(u_int apic_id, u_int lvt,
 void   lapic_set_tpr(u_int vector);
 void   lapic_setup(int boot);
 void   xen_intr_handle_upcall(struct trapframe *frame);
+intmadt_setup_io(void);
 
 #endif /* !LOCORE */
 #endif /* _MACHINE_APICVAR_H_ */
diff --git a/sys/i386/include/apicvar.h b/sys/i386/include/apicvar.h
index c8ee9bc..05ec013 100644
--- a/sys/i386/include/apicvar.h
+++ b/sys/i386/include/apicvar.h
@@ -232,6 +232,7 @@ int lapic_set_lvt_triggermode(u_int apic_id, u_int lvt,
 void   lapic_set_tpr(u_int vector);
 void   lapic_setup(int boot);
 void   xen_intr_handle_upcall(struct trapframe *frame);
+intmadt_setup_io(void);
 
 #endif /* !LOCORE */
 #endif /* _MACHINE_APICVAR_H_ */
diff --git a/sys/x86/acpica/madt.c b/sys/x86/acpica/madt.c
index 5929fde..6f3b591 100644
--- a/sys/x86/acpica/madt.c
+++ b/sys/x86/acpica/madt.c
@@ -61,7 +61,7 @@ static struct lapic_info {
 } lapics[MAX_APIC_ID + 1];
 
 static int madt_found_sci_override;
-static ACPI_TABLE_MADT *madt;
+ACPI_TABLE_MADT *madt;
 static vm_paddr_t madt_physaddr;
 static vm_offset_t madt_length;
 
@@ -84,7 +84,6 @@ static void   madt_probe_cpus_handler(ACPI_SUBTABLE_HEADER 
*entry,
void *arg __unused);
 static voidmadt_register(void *dummy);
 static int madt_setup_local(void);
-static int madt_setup_io(void);
 static voidmadt_walk_table(acpi_subtable_handler *handler, void *arg);
 
 static struct apic_enumerator madt_enumerator = {
@@ -147,7 +146,7 @@ madt_setup_local(void)
 /*
  * Enumerate I/O APICs and setup interrupt sources.
  */
-static int
+int
 madt_setup_io(void)
 {
void *ioapic;
diff --git a/sys/x86/xen/mptable.c b/sys/x86/xen/mptable.c
index 0384886..46b03f3 100644
--- a/sys/x86/xen/mptable.c
+++ b/sys/x86/xen/mptable.c
@@ -43,6 +43,9 @@ __FBSDID($FreeBSD$);
 #include machine/intr_machdep.h
 #include machine/apicvar.h
 
+#include contrib/dev/acpica/include/acpi.h
+#include contrib/dev/acpica/include/actables.h
+
 #include machine/cpu.h
 #include machine/smp.h
 
@@ -51,6 +54,9 @@ __FBSDID($FreeBSD$);
 
 #include xen/interface/vcpu.h
 
+/* From madt.c */
+extern ACPI_TABLE_MADT *madt;
+
 static int xenpv_probe(void);
 static int xenpv_probe_cpus(void);
 static int xenpv_setup_local(void);
@@ -107,7 +113,23 @@ xenpv_setup_local(void)
 static int
 xenpv_setup_io(void)
 {
-   return (0);
+   vm_paddr_t madt_physaddr;
+   vm_offset_t madt_length;
+
+   if (!xen_initial_domain())
+   return (0);
+
+   madt_physaddr = acpi_find_table(ACPI_SIG_MADT);
+   if (madt_physaddr == 0)
+   panic(could not find MADT table);
+   madt = acpi_map_table(madt_physaddr, ACPI_SIG_MADT);
+   if (madt == NULL)
+   panic(unable to map MADT);
+   madt_length = madt-Header.Length;
+   acpi_unmap_table(madt);
+   madt = pmap_mapbios(madt_physaddr, madt_length);
+
+   return (madt_setup_io());
 }
 
 static void
-- 
1.7.7.5 (Apple Git-26)

___
freebsd-current@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-current
To unsubscribe, send any mail to freebsd-current-unsubscr...@freebsd.org


[PATCH RFC 09/13] xen: change quality of the MADT ACPI enumerator

2013-12-24 Thread Roger Pau Monne
Lower the quality of the MADT ACPI enumerator, so on Xen Dom0 we can
force the usage of the Xen mptable enumerator even when ACPI is
detected.
---
 sys/x86/acpica/madt.c |2 +-
 sys/x86/xen/mptable.c |2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/sys/x86/acpica/madt.c b/sys/x86/acpica/madt.c
index 6f3b591..897189c 100644
--- a/sys/x86/acpica/madt.c
+++ b/sys/x86/acpica/madt.c
@@ -104,7 +104,7 @@ madt_probe(void)
madt_physaddr = acpi_find_table(ACPI_SIG_MADT);
if (madt_physaddr == 0)
return (ENXIO);
-   return (0);
+   return (-50);
 }
 
 /*
diff --git a/sys/x86/xen/mptable.c b/sys/x86/xen/mptable.c
index 46b03f3..a9704ab 100644
--- a/sys/x86/xen/mptable.c
+++ b/sys/x86/xen/mptable.c
@@ -76,7 +76,7 @@ static struct apic_enumerator xenpv_enumerator = {
 static int
 xenpv_probe(void)
 {
-   return (-100);
+   return (0);
 }
 
 /*
-- 
1.7.7.5 (Apple Git-26)

___
freebsd-current@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-current
To unsubscribe, send any mail to freebsd-current-unsubscr...@freebsd.org


[PATCH RFC 13/13] xenstore: changes needed to boot in Dom0 mode

2013-12-24 Thread Roger Pau Monne
This patch includes changes to xenstore in order to boot as Dom0. This
is different from booting as a guest, since when booted as Dom0
xenstore is not available. This patch sets up a memory page, an
event channel for xenstore and disables xenbus device probing at boot.
It contains a workaround for xs_watch, that should be fixed when we
are able to start xenstored from Dom0.
---
 sys/xen/xenbus/xenbusb.c|6 --
 sys/xen/xenstore/xenstore.c |   22 ++
 2 files changed, 26 insertions(+), 2 deletions(-)

diff --git a/sys/xen/xenbus/xenbusb.c b/sys/xen/xenbus/xenbusb.c
index 1f84795..11be0f5 100644
--- a/sys/xen/xenbus/xenbusb.c
+++ b/sys/xen/xenbus/xenbusb.c
@@ -760,8 +760,10 @@ xenbusb_attach(device_t dev, char *bus_node, u_int 
id_components)
 * bus when they are dynamically attached to us
 * by a Xen management action.
 */
-   (void)xenbusb_enumerate_bus(xbs);
-   xenbusb_probe_children(dev);
+   if (!xen_initial_domain()) {
+   (void)xenbusb_enumerate_bus(xbs);
+   xenbusb_probe_children(dev);
+   }
 
xbs-xbs_device_watch.node = bus_node;
xbs-xbs_device_watch.callback = xenbusb_devices_changed;
diff --git a/sys/xen/xenstore/xenstore.c b/sys/xen/xenstore/xenstore.c
index 2893c84..bde3f5d 100644
--- a/sys/xen/xenstore/xenstore.c
+++ b/sys/xen/xenstore/xenstore.c
@@ -1144,6 +1144,24 @@ xs_attach(device_t dev)
xs.gpfn = hvm_get_parameter(HVM_PARAM_STORE_PFN);
xen_store = pmap_mapdev(xs.gpfn * PAGE_SIZE, PAGE_SIZE);
} else if (xen_pv_domain()) {
+   if (!HYPERVISOR_start_info-store_evtchn) {
+   struct evtchn_alloc_unbound alloc_unbound;
+
+   /* Allocate a local event channel for xenstore */
+   alloc_unbound.dom= DOMID_SELF;
+   alloc_unbound.remote_dom = DOMID_SELF;
+   error = 
HYPERVISOR_event_channel_op(EVTCHNOP_alloc_unbound,
+   alloc_unbound);
+   if (error)
+   panic(unable to alloc event channel for Dom0: 
%d,
+ error);
+
+   HYPERVISOR_start_info-store_evtchn = 
alloc_unbound.port;
+
+   /* Allocate memory for the xs shared ring */
+   xen_store = malloc(PAGE_SIZE, M_XENSTORE,
+  M_WAITOK | M_ZERO);
+   }
xs.evtchn = HYPERVISOR_start_info-store_evtchn;
} else {
panic(Unknown domain type, cannot initialize xenstore\n);
@@ -1579,6 +1597,10 @@ xs_register_watch(struct xs_watch *watch)
char token[sizeof(watch) * 2 + 1];
int error;
 
+   /* XXX: this is a hack until we get xenstored working */
+   if (xen_initial_domain())
+   return (0);
+
sprintf(token, %lX, (long)watch);
 
sx_slock(xs.suspend_mutex);
-- 
1.7.7.5 (Apple Git-26)

___
freebsd-current@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-current
To unsubscribe, send any mail to freebsd-current-unsubscr...@freebsd.org


[PATCH RFC 11/13] pci: introduce a new event on PCI device detection

2013-12-24 Thread Roger Pau Monne
Add a new event that will fire each time a PCI device is added to the
system, and allows us to register the device with Xen.
---
 sys/dev/pci/pci.c   |1 +
 sys/sys/eventhandler.h  |5 +
 sys/x86/xen/pv.c|   21 +
 sys/x86/xen/xen_nexus.c |6 ++
 sys/xen/pv.h|1 +
 5 files changed, 34 insertions(+), 0 deletions(-)

diff --git a/sys/dev/pci/pci.c b/sys/dev/pci/pci.c
index 4d8837f..2ee5093 100644
--- a/sys/dev/pci/pci.c
+++ b/sys/dev/pci/pci.c
@@ -3293,6 +3293,7 @@ pci_add_child(device_t bus, struct pci_devinfo *dinfo)
resource_list_init(dinfo-resources);
pci_cfg_save(dinfo-cfg.dev, dinfo, 0);
pci_cfg_restore(dinfo-cfg.dev, dinfo);
+   EVENTHANDLER_INVOKE(pci_add, dinfo);
pci_print_verbose(dinfo);
pci_add_resources(bus, dinfo-cfg.dev, 0, 0);
 }
diff --git a/sys/sys/eventhandler.h b/sys/sys/eventhandler.h
index 111c21b..3201848 100644
--- a/sys/sys/eventhandler.h
+++ b/sys/sys/eventhandler.h
@@ -269,5 +269,10 @@ typedef void (*unregister_framebuffer_fn)(void *, struct 
fb_info *);
 EVENTHANDLER_DECLARE(register_framebuffer, register_framebuffer_fn);
 EVENTHANDLER_DECLARE(unregister_framebuffer, unregister_framebuffer_fn);
 
+/* PCI events */
+struct pci_devinfo;
+typedef void (*pci_add_fn)(void *, struct pci_devinfo *);
+EVENTHANDLER_DECLARE(pci_add, pci_add_fn);
+
 #endif /* _SYS_EVENTHANDLER_H_ */
 
diff --git a/sys/x86/xen/pv.c b/sys/x86/xen/pv.c
index e5ad200..a44f8ca 100644
--- a/sys/x86/xen/pv.c
+++ b/sys/x86/xen/pv.c
@@ -39,6 +39,9 @@ __FBSDID($FreeBSD$);
 #include sys/rwlock.h
 #include sys/mutex.h
 #include sys/smp.h
+#include sys/reboot.h
+#include sys/pciio.h
+#include sys/eventhandler.h
 
 #include vm/vm.h
 #include vm/vm_extern.h
@@ -63,6 +66,8 @@ __FBSDID($FreeBSD$);
 
 #include xen/interface/vcpu.h
 
+#include dev/pci/pcivar.h
+
 /* Native initial function */
 extern u_int64_t hammer_time(u_int64_t, u_int64_t);
 /* Xen initial function */
@@ -384,6 +389,22 @@ xen_pv_ioapic_register_intr(struct ioapic_intsrc *pin)
xen_register_pirq(pin-io_irq, pin-io_activehi, pin-io_edgetrigger);
 }
 
+void
+xen_pv_pci_device_add(void *arg, struct pci_devinfo *dinfo)
+{
+   struct physdev_pci_device_add add_pci;
+   int error;
+
+   bzero(add_pci, sizeof(add_pci));
+   add_pci.seg = dinfo-cfg.domain;
+   add_pci.bus = dinfo-cfg.bus;
+   add_pci.devfn = (dinfo-cfg.slot  3) | dinfo-cfg.func;
+   error = HYPERVISOR_physdev_op(PHYSDEVOP_pci_device_add, add_pci);
+   if (error)
+   printf(unable to add device bus %u devfn %u error: %d\n,
+  add_pci.bus, add_pci.devfn, error);
+}
+
 static void
 xen_pv_set_init_ops(void)
 {
diff --git a/sys/x86/xen/xen_nexus.c b/sys/x86/xen/xen_nexus.c
index 823b3bc..60c6c5d 100644
--- a/sys/x86/xen/xen_nexus.c
+++ b/sys/x86/xen/xen_nexus.c
@@ -34,6 +34,7 @@ __FBSDID($FreeBSD$);
 #include sys/sysctl.h
 #include sys/systm.h
 #include sys/smp.h
+#include sys/eventhandler.h
 
 #include contrib/dev/acpica/include/acpi.h
 
@@ -42,6 +43,7 @@ __FBSDID($FreeBSD$);
 #include machine/nexusvar.h
 
 #include xen/xen-os.h
+#include xen/pv.h
 
 static const char *xen_devices[] =
 {
@@ -87,6 +89,10 @@ nexus_xen_attach(device_t dev)
/* Disable some ACPI devices that are not usable by Dom0 */
setenv(debug.acpi.disabled, cpu hpet timer);
 
+   /* Register PCI add hook */
+   EVENTHANDLER_REGISTER(pci_add, xen_pv_pci_device_add, NULL,
+ EVENTHANDLER_PRI_FIRST);
+
acpi_dev = BUS_ADD_CHILD(dev, 10, acpi, 0);
if (acpi_dev == NULL)
panic(Unable to add ACPI bus to Xen Dom0);
diff --git a/sys/xen/pv.h b/sys/xen/pv.h
index a9d6eb0..ac737a7 100644
--- a/sys/xen/pv.h
+++ b/sys/xen/pv.h
@@ -24,5 +24,6 @@
 #define__XEN_PV_H__
 
 intxen_pv_start_all_aps(void);
+void   xen_pv_pci_device_add(void *, struct pci_devinfo *);
 
 #endif /* __XEN_PV_H__ */
-- 
1.7.7.5 (Apple Git-26)

___
freebsd-current@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-current
To unsubscribe, send any mail to freebsd-current-unsubscr...@freebsd.org


[PATCH RFC 12/13] mca: disable cmc enable on Xen PV

2013-12-24 Thread Roger Pau Monne
Xen PV guests doesn't have a lapic, so disable the lapic call in mca
initialization.
---
 sys/x86/x86/mca.c |2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/sys/x86/x86/mca.c b/sys/x86/x86/mca.c
index f1369cd..e9d2c1d 100644
--- a/sys/x86/x86/mca.c
+++ b/sys/x86/x86/mca.c
@@ -897,7 +897,7 @@ _mca_init(int boot)
}
 
 #ifdef DEV_APIC
-   if (PCPU_GET(cmci_mask) != 0  boot)
+   if (PCPU_GET(cmci_mask) != 0  boot  !lapic_disabled)
lapic_enable_cmc();
 #endif
}
-- 
1.7.7.5 (Apple Git-26)

___
freebsd-current@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-current
To unsubscribe, send any mail to freebsd-current-unsubscr...@freebsd.org


[PATCH RFC 10/13] xen: add ACPI bus to xen_nexus when running as Dom0

2013-12-24 Thread Roger Pau Monne
Also disable a couple of ACPI devices that are not usable under Dom0.
---
 sys/x86/xen/xen_nexus.c |   24 +---
 1 files changed, 21 insertions(+), 3 deletions(-)

diff --git a/sys/x86/xen/xen_nexus.c b/sys/x86/xen/xen_nexus.c
index 288e6b6..823b3bc 100644
--- a/sys/x86/xen/xen_nexus.c
+++ b/sys/x86/xen/xen_nexus.c
@@ -35,6 +35,10 @@ __FBSDID($FreeBSD$);
 #include sys/systm.h
 #include sys/smp.h
 
+#include contrib/dev/acpica/include/acpi.h
+
+#include dev/acpica/acpivar.h
+
 #include machine/nexusvar.h
 
 #include xen/xen-os.h
@@ -44,7 +48,6 @@ static const char *xen_devices[] =
xenstore, /* XenStore bus */
xen_et,   /* Xen PV timer (provides: tc, et, clk) */
xc,   /* Xen PV console */
-   isa,  /* Dummy ISA bus for sc to attach */
 };
 
 /*
@@ -56,13 +59,14 @@ nexus_xen_probe(device_t dev)
if (!xen_pv_domain())
return (ENXIO);
 
-   return (BUS_PROBE_DEFAULT);
+   return (BUS_PROBE_SPECIFIC);
 }
 
 static int
 nexus_xen_attach(device_t dev)
 {
int i, error = 0;
+   device_t acpi_dev;
 
nexus_init_resources();
bus_generic_probe(dev);
@@ -79,8 +83,22 @@ nexus_xen_attach(device_t dev)
if (BUS_ADD_CHILD(dev, 0, xen_devices[i], 0) == NULL)
panic(%s: could not add, xen_devices[i]);
}
+   if (xen_initial_domain()) {
+   /* Disable some ACPI devices that are not usable by Dom0 */
+   setenv(debug.acpi.disabled, cpu hpet timer);
+
+   acpi_dev = BUS_ADD_CHILD(dev, 10, acpi, 0);
+   if (acpi_dev == NULL)
+   panic(Unable to add ACPI bus to Xen Dom0);
+   } else {
+   /* Dummy ISA bus for sc to attach */
+   if (BUS_ADD_CHILD(dev, 0, isa, 0) == NULL)
+   panic(isa: could not add);
+   }
 
-   bus_generic_attach(dev);
+   error = bus_generic_attach(dev);
+   if (xen_initial_domain()  (error == 0))
+   acpi_install_wakeup_handler(device_get_softc(acpi_dev));
 
return (error);
 }
-- 
1.7.7.5 (Apple Git-26)

___
freebsd-current@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-current
To unsubscribe, send any mail to freebsd-current-unsubscr...@freebsd.org


[PATCH v7 00/19] FreeBSD PVH DomU support

2013-12-19 Thread Roger Pau Monne
This series is a split of the previous patch Xen x86 DomU PVH 
support, with the aim to make the review of the code easier.

The series can also be found on my git repo:

git://xenbits.xen.org/people/royger/freebsd.git pvh_v7

or

http://xenbits.xen.org/gitweb/?p=people/royger/freebsd.git;a=shortlog;h=refs/heads/pvh_v7

PVH mode is basically a PV guest inside an HVM container, and shares
a great amount of code with PVHVM. The main difference is the way the
guest is started, PVH uses the PV start sequence, jumping directly
into the kernel entry point in long mode and with page tables set.
The main work of this patch consists in setting the environment as
similar as possible to what native FreeBSD expects, and then adding
hooks to the PV ops when necessary.

sys/amd64/amd64/locore.S:
 * Add PV entry point, hypervisor_page and the necessary elfnotes.

sys/amd64/amd64/machdep.c:
 * Add hooks to replace bare metal operations that should use a PV
  helper, this includes:
   - Preload metadata
   - i8254_init and i8254_delay
   - Fetching the e820 memory map
   - Reserve of the MP bootstrap region

 * Create a DELAY function that uses the PV hooks.
 * Introduce a new hammer_time_xen that sets the necessary stuff when
   running in PVH mode.

sys/amd64/amd64/mp_machdep.c:
 * Introduce a hook to replace start_all_aps.
 * Use lapic_disabled variable to prevent polluting the code
   with xen specific gates.

sys/amd64/include/asmacros.h:
 * Copy the ELFNOTE macro from the i386 Xen PV port.

sys/amd64/include/clock.h:
sys/i386/include/clock.h:
 * Prototypes for the xen early delay initialization and usage.

sys/amd64/include/cpu.h:
 * Introduce a new cpu hook to init APs.

sys/amd64/include/sysarch.h:
 * Declare the init_ops structure.

sys/amd64/include/xen/hypercall.h:
sys/i386/include/xen/hypercall.h
 * Switch to the PV style hypercall mechanism for HVM also.

sys/conf/files:
 * Make the PV console available on XENHVM also.

sys/conf/files.amd64:
 * Include the new files for the PVH port.

sys/dev/xen/console/console.c:
sys/dev/xen/console/xencons_ring.c:
 * Remove the identify method and instead add the device from
   nexus_xen.
 * Use HYPERVISOR_start_info instead of xen_start_info.
 * Use HYPERVISOR_event_channel_op to kick the event channel before
   xen interrupts are setup.
 * Copy the xc_printf debug function from xen_machdep.c

sys/dev/xen/control/control.c:
 * Use the PV shutdown on PVH.

sys/dev/xen/timer/timer.c:
 * Pass a vcpu_info to xen_fetch_vcpu_time, this allows using this
   function at very early init, before per-cpu vcpu_info is set.
 * Remove critical_{enter/exit} from xen_fetch_vcpu_time so it can be
   used at early boot, instead place them on the callers.
 * Introduce two new functions, xen_delay_init and xen_delay that can
   be used at early boot to implement the generic DELAY function.
 * Remove the identify method that used to add the device, now it is
   manually added from either xenpci (HVM) or nexus_xen (PV).

sys/i386/i386/locore.s:
 * Reserve space for the hypercall page.

sys/i386/i386/machdep.c:
 * Create a generic DELAY function.

sys/i386/xen/xen_machdep.c:
 * Set HYPERVISOR_start_info.
 * Move and rename xc_printf debug function to xen console.c

sys/x86/isa/clock.c:
 * Rename the generic DELAY function to i8254_delay.

sys/x86/x86/delay.c:
 * Put generic delay helpers here, get_tsc and delay_tc.

sys/x86/x86/local_apic.c:
 * Prevent the local apic from attaching when running on PVH mode.

sys/x86/xen/hvm.c:
 * Set the start_all_aps hook.
 * Fix the setting of the hypercall page now that we are using the
   same mechanism as the PV port.
 * Initialize Xen CPU hooks for the PVH port.
 * Initialize APs before SI_SUB_SMP (SI_SUB_SMP-1).

sys/x86/xen/mptable.c:
 * Create a dummy PV CPU enumerator for the PVH port.

sys/x86/xen/pv.c:
 * Implement the PV functions for the early boot hooks,
   parse_preload_data and fetch_e820_map.
 * Implement the PV function for the start_all_aps hook.

sys/x86/xen/pvcpu.c:
 * Dummy Xen PV CPU device, that we use to set the per-cpu pc_device.

sys/xen/gnttab.c:
 * Allocate resume_frames for the PVH port.

sys/xen/pv.h:
 * Header that exports the specific PV functions.

sys/xen/xen-os.h:
 * Declare prototypes for the newly added functions.
 * Include new xen_initial_domain function.

sys/xen/xenstore/xenstore.c:
 * Make the xenstore driver hang from both xenpci and the nexus when
   running XENHVM, this is because we don't have a xenpci device on
   the PVH port.
 * Remove the identify routine that added the device, instead add it
   from either xenpci (HVM) or nexus_xen (PV).

sys/dev/xen/xenpci/xenpci.c:
 * Add the xenstore and xen_et devices on succesful attach.

sys/x86/xen/xen_nexus.c:
 * Create a specific nexus for Xen PV guests that takes care of adding
   the top level Xen PV devices.

___
freebsd-current@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-current
To 

[PATCH v7 02/19] xen: add macro to detect if running as Dom0

2013-12-19 Thread Roger Pau Monne
---
 sys/xen/xen-os.h |7 +++
 1 files changed, 7 insertions(+), 0 deletions(-)

diff --git a/sys/xen/xen-os.h b/sys/xen/xen-os.h
index c7474d8..e8a5a99 100644
--- a/sys/xen/xen-os.h
+++ b/sys/xen/xen-os.h
@@ -82,6 +82,13 @@ xen_hvm_domain(void)
return (xen_domain_type == XEN_HVM_DOMAIN);
 }
 
+static inline int
+xen_initial_domain(void)
+{
+   return (xen_domain()  HYPERVISOR_start_info 
+   HYPERVISOR_start_info-flags  SIF_INITDOMAIN);
+}
+
 #ifndef xen_mb
 #define xen_mb() mb()
 #endif
-- 
1.7.7.5 (Apple Git-26)

___
freebsd-current@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-current
To unsubscribe, send any mail to freebsd-current-unsubscr...@freebsd.org


[PATCH v7 05/19] xen: rework xen timer so it can be used early in boot process

2013-12-19 Thread Roger Pau Monne
This should not introduce any functional change, and makes the
functions suitable to be called before we have actually mapped the
vcpu_info struct on a per-cpu basis.
---
 sys/dev/xen/timer/timer.c |   29 -
 1 files changed, 20 insertions(+), 9 deletions(-)

diff --git a/sys/dev/xen/timer/timer.c b/sys/dev/xen/timer/timer.c
index 354085b..b2f6bcd 100644
--- a/sys/dev/xen/timer/timer.c
+++ b/sys/dev/xen/timer/timer.c
@@ -230,22 +230,22 @@ xen_fetch_vcpu_tinfo(struct vcpu_time_info *dst, struct 
vcpu_time_info *src)
 /**
  * \brief Get the current time, in nanoseconds, since the hypervisor booted.
  *
+ * \param vcpu vcpu_info structure to fetch the time from.
+ *
  * \note This function returns the current CPU's idea of this value, unless
  *   it happens to be less than another CPU's previously determined value.
  */
 static uint64_t
-xen_fetch_vcpu_time(void)
+xen_fetch_vcpu_time(struct vcpu_info *vcpu)
 {
struct vcpu_time_info dst;
struct vcpu_time_info *src;
uint32_t pre_version;
uint64_t now;
volatile uint64_t last;
-   struct vcpu_info *vcpu = DPCPU_GET(vcpu_info);
 
src = vcpu-time;
 
-   critical_enter();
do {
pre_version = xen_fetch_vcpu_tinfo(dst, src);
barrier();
@@ -266,16 +266,19 @@ xen_fetch_vcpu_time(void)
}
} while (!atomic_cmpset_64(xen_timer_last_time, last, now));
 
-   critical_exit();
-
return (now);
 }
 
 static uint32_t
 xentimer_get_timecount(struct timecounter *tc)
 {
+   uint32_t xen_time;
 
-   return ((uint32_t)xen_fetch_vcpu_time()  UINT_MAX);
+   critical_enter();
+   xen_time = (uint32_t)xen_fetch_vcpu_time(DPCPU_GET(vcpu_info))  
UINT_MAX;
+   critical_exit();
+
+   return (xen_time);
 }
 
 /**
@@ -305,7 +308,12 @@ xen_fetch_wallclock(struct timespec *ts)
 static void
 xen_fetch_uptime(struct timespec *ts)
 {
-   uint64_t uptime = xen_fetch_vcpu_time();
+   uint64_t uptime;
+
+   critical_enter();
+   uptime = xen_fetch_vcpu_time(DPCPU_GET(vcpu_info));
+   critical_exit();
+
ts-tv_sec = uptime / NSEC_IN_SEC;
ts-tv_nsec = uptime % NSEC_IN_SEC;
 }
@@ -354,7 +362,7 @@ xentimer_intr(void *arg)
struct xentimer_softc *sc = (struct xentimer_softc *)arg;
struct xentimer_pcpu_data *pcpu = DPCPU_PTR(xentimer_pcpu);
 
-   pcpu-last_processed = xen_fetch_vcpu_time();
+   pcpu-last_processed = xen_fetch_vcpu_time(DPCPU_GET(vcpu_info));
if (pcpu-timer != 0  sc-et.et_active)
sc-et.et_event_cb(sc-et, sc-et.et_arg);
 
@@ -415,7 +423,10 @@ xentimer_et_start(struct eventtimer *et,
do {
if (++i == 60)
panic(can't schedule timer);
-   next_time = xen_fetch_vcpu_time() + first_in_ns;
+   critical_enter();
+   next_time = xen_fetch_vcpu_time(DPCPU_GET(vcpu_info)) +
+   first_in_ns;
+   critical_exit();
error = xentimer_vcpu_start_timer(cpu, next_time);
} while (error == -ETIME);
 
-- 
1.7.7.5 (Apple Git-26)

___
freebsd-current@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-current
To unsubscribe, send any mail to freebsd-current-unsubscr...@freebsd.org


[PATCH v7 01/19] xen: add PV/PVH kernel entry point

2013-12-19 Thread Roger Pau Monne
Add the PV/PVH entry point and the low level functions for PVH
initialization.
---
 sys/amd64/amd64/locore.S |   53 +++
 sys/amd64/amd64/machdep.c|   72 ++
 sys/amd64/include/asmacros.h |   26 +++
 sys/i386/xen/xen_machdep.c   |2 +
 sys/x86/xen/hvm.c|1 +
 sys/xen/xen-os.h |4 ++
 6 files changed, 158 insertions(+), 0 deletions(-)

diff --git a/sys/amd64/amd64/locore.S b/sys/amd64/amd64/locore.S
index 55cda3a..e04cc48 100644
--- a/sys/amd64/amd64/locore.S
+++ b/sys/amd64/amd64/locore.S
@@ -31,6 +31,12 @@
 #include machine/pmap.h
 #include machine/specialreg.h
 
+#ifdef XENHVM
+#include xen/xen-os.h
+#define __ASSEMBLY__
+#include xen/interface/elfnote.h
+#endif
+
 #include assym.s
 
 /*
@@ -86,3 +92,50 @@ NON_GPROF_ENTRY(btext)
ALIGN_DATA  /* just to be sure */
.space  0x1000  /* space for bootstack - temporary 
stack */
 bootstack:
+
+#ifdef XENHVM
+/* Xen */
+.section __xen_guest
+   ELFNOTE(Xen, XEN_ELFNOTE_GUEST_OS,   .asciz, FreeBSD)
+   ELFNOTE(Xen, XEN_ELFNOTE_GUEST_VERSION,  .asciz, HEAD)
+   ELFNOTE(Xen, XEN_ELFNOTE_XEN_VERSION,.asciz, xen-3.0)
+   ELFNOTE(Xen, XEN_ELFNOTE_VIRT_BASE,  .quad,  KERNBASE)
+   ELFNOTE(Xen, XEN_ELFNOTE_PADDR_OFFSET,   .quad,  KERNBASE) /* Xen 
honours elf-p_paddr; compensate for this */
+   ELFNOTE(Xen, XEN_ELFNOTE_ENTRY,  .quad,  xen_start)
+   ELFNOTE(Xen, XEN_ELFNOTE_HYPERCALL_PAGE, .quad,  hypercall_page)
+   ELFNOTE(Xen, XEN_ELFNOTE_HV_START_LOW,   .quad,  HYPERVISOR_VIRT_START)
+   ELFNOTE(Xen, XEN_ELFNOTE_FEATURES,   .asciz, 
writable_descriptor_tables|auto_translated_physmap|supervisor_mode_kernel|hvm_callback_vector)
+   ELFNOTE(Xen, XEN_ELFNOTE_PAE_MODE,   .asciz, yes)
+   ELFNOTE(Xen, XEN_ELFNOTE_L1_MFN_VALID,   .long,  PG_V, PG_V)
+   ELFNOTE(Xen, XEN_ELFNOTE_LOADER, .asciz, generic)
+   ELFNOTE(Xen, XEN_ELFNOTE_SUSPEND_CANCEL, .long,  0)
+   ELFNOTE(Xen, XEN_ELFNOTE_BSD_SYMTAB, .asciz, yes)
+
+   .text
+.p2align PAGE_SHIFT, 0x90  /* Hypercall_page needs to be PAGE aligned */
+
+NON_GPROF_ENTRY(hypercall_page)
+   .skip   0x1000, 0x90/* Fill with nops */
+
+NON_GPROF_ENTRY(xen_start)
+   /* Don't trust what the loader gives for rflags. */
+   pushq   $PSL_KERNEL
+   popfq
+
+   /* Parameters for the xen init function */
+   movq%rsi, %rdi  /* shared_info (arg 1) */
+   movq%rsp, %rsi  /* xenstack(arg 2) */
+
+   /* Use our own stack */
+   movq$bootstack,%rsp
+   xorl%ebp, %ebp
+
+   /* u_int64_t hammer_time_xen(start_info_t *si, u_int64_t xenstack); */
+   callhammer_time_xen
+   movq%rax, %rsp  /* set up kstack for mi_startup() */
+   callmi_startup  /* autoconfiguration, mountroot etc */
+
+   /* NOTREACHED */
+0: hlt
+   jmp 0b
+#endif
diff --git a/sys/amd64/amd64/machdep.c b/sys/amd64/amd64/machdep.c
index eae657b..a73e33e 100644
--- a/sys/amd64/amd64/machdep.c
+++ b/sys/amd64/amd64/machdep.c
@@ -146,10 +146,17 @@ __FBSDID($FreeBSD$);
 #include isa/isareg.h
 #include isa/rtc.h
 
+#ifdef XENHVM
+#include xen/xen-os.h
+#endif
+
 /* Sanity check for __curthread() */
 CTASSERT(offsetof(struct pcpu, pc_curthread) == 0);
 
 extern u_int64_t hammer_time(u_int64_t, u_int64_t);
+#ifdef XENHVM
+extern u_int64_t hammer_time_xen(start_info_t *, u_int64_t);
+#endif
 
 extern void printcpuinfo(void);/* XXX header file */
 extern void identify_cpu(void);
@@ -1683,6 +1690,71 @@ do_next:
msgbufp = (struct msgbuf *)PHYS_TO_DMAP(phys_avail[pa_indx]);
 }
 
+#ifdef XENHVM
+/*
+ * First function called by the Xen PVH boot sequence.
+ *
+ * Set some Xen global variables and prepare the environment so it is
+ * as similar as possible to what native FreeBSD init function expects.
+ */
+u_int64_t
+hammer_time_xen(start_info_t *si, u_int64_t xenstack)
+{
+   u_int64_t physfree;
+   u_int64_t *PT4 = (u_int64_t *)xenstack;
+   u_int64_t *PT3 = (u_int64_t *)(xenstack + PAGE_SIZE);
+   u_int64_t *PT2 = (u_int64_t *)(xenstack + 2 * PAGE_SIZE);
+   int i;
+
+   KASSERT((si != NULL  xenstack != 0),
+   (invalid start_info or xenstack));
+
+   /* We use 3 pages of xen stack for the boot pagetables */
+   physfree = xenstack + 3 * PAGE_SIZE - KERNBASE;
+
+   /* Setup Xen global variables */
+   HYPERVISOR_start_info = si;
+   HYPERVISOR_shared_info =
+   (shared_info_t *)(si-shared_info + KERNBASE);
+
+   /*
+* Setup some misc global variables for Xen devices
+*
+* XXX: devices that need this specific variables should
+*  be rewritten to fetch this info by themselves from the
+*  start_info page.
+*/
+   xen_store = 

[PATCH v7 09/19] xen: add a apic_enumerator for PVH

2013-12-19 Thread Roger Pau Monne
---
 sys/conf/files.amd64  |1 +
 sys/x86/xen/mptable.c |  136 +
 2 files changed, 137 insertions(+), 0 deletions(-)
 create mode 100644 sys/x86/xen/mptable.c

diff --git a/sys/conf/files.amd64 b/sys/conf/files.amd64
index bdc1517..3bdc05e 100644
--- a/sys/conf/files.amd64
+++ b/sys/conf/files.amd64
@@ -568,3 +568,4 @@ x86/x86/delay.c standard
 x86/xen/hvm.c  optionalxenhvm
 x86/xen/xen_intr.c optionalxen | xenhvm
 x86/xen/pv.c   optionalxenhvm
+x86/xen/mptable.c  optionalxenhvm
diff --git a/sys/x86/xen/mptable.c b/sys/x86/xen/mptable.c
new file mode 100644
index 000..0384886
--- /dev/null
+++ b/sys/x86/xen/mptable.c
@@ -0,0 +1,136 @@
+/*-
+ * Copyright (c) 2003 John Baldwin j...@freebsd.org
+ * Copyright (c) 2013 Roger Pau Monné roger@citrix.com
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *notice, this list of conditions and the following disclaimer in the
+ *documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the author nor the names of any co-contributors
+ *may be used to endorse or promote products derived from this software
+ *without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include sys/cdefs.h
+__FBSDID($FreeBSD$);
+
+#include sys/param.h
+#include sys/systm.h
+#include sys/bus.h
+#include sys/kernel.h
+#include sys/smp.h
+#include sys/pcpu.h
+#include vm/vm.h
+#include vm/pmap.h
+
+#include machine/intr_machdep.h
+#include machine/apicvar.h
+
+#include machine/cpu.h
+#include machine/smp.h
+
+#include xen/xen-os.h
+#include xen/hypervisor.h
+
+#include xen/interface/vcpu.h
+
+static int xenpv_probe(void);
+static int xenpv_probe_cpus(void);
+static int xenpv_setup_local(void);
+static int xenpv_setup_io(void);
+
+static struct apic_enumerator xenpv_enumerator = {
+   Xen PV,
+   xenpv_probe,
+   xenpv_probe_cpus,
+   xenpv_setup_local,
+   xenpv_setup_io
+};
+
+/*
+ * This enumerator will only be registered on PVH
+ */
+static int
+xenpv_probe(void)
+{
+   return (-100);
+}
+
+/*
+ * Test each possible vCPU in order to find the number of vCPUs
+ */
+static int
+xenpv_probe_cpus(void)
+{
+#ifdef SMP
+   int i, ret;
+
+   for (i = 0; i  MAXCPU; i++) {
+   ret = HYPERVISOR_vcpu_op(VCPUOP_is_up, i, NULL);
+   if (ret = 0)
+   cpu_add((i * 2), (i == 0));
+   }
+#endif
+   return (0);
+}
+
+/*
+ * Initialize the vCPU id of the BSP
+ */
+static int
+xenpv_setup_local(void)
+{
+   PCPU_SET(vcpu_id, 0);
+   return (0);
+}
+
+/*
+ * On PVH guests there's no IO APIC
+ */
+static int
+xenpv_setup_io(void)
+{
+   return (0);
+}
+
+static void
+xenpv_register(void *dummy __unused)
+{
+   if (xen_pv_domain()) {
+   apic_register_enumerator(xenpv_enumerator);
+   }
+}
+SYSINIT(xenpv_register, SI_SUB_TUNABLES - 1, SI_ORDER_FIRST, xenpv_register, 
NULL);
+
+/*
+ * Setup per-CPU vCPU IDs
+ */
+static void
+xenpv_set_ids(void *dummy)
+{
+   struct pcpu *pc;
+   int i;
+
+   CPU_FOREACH(i) {
+   pc = pcpu_find(i);
+   pc-pc_vcpu_id = i;
+   }
+}
+SYSINIT(xenpv_set_ids, SI_SUB_CPU, SI_ORDER_MIDDLE, xenpv_set_ids, NULL);
-- 
1.7.7.5 (Apple Git-26)

___
freebsd-current@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-current
To unsubscribe, send any mail to freebsd-current-unsubscr...@freebsd.org

[PATCH v7 04/19] amd64: introduce hook for custom preload metadata parsers

2013-12-19 Thread Roger Pau Monne
---
 sys/amd64/amd64/machdep.c   |   45 +
 sys/amd64/include/sysarch.h |   12 +
 sys/conf/files.amd64|1 +
 sys/x86/xen/pv.c|  114 +++
 sys/xen/pv.h|   28 +++
 5 files changed, 189 insertions(+), 11 deletions(-)
 create mode 100644 sys/x86/xen/pv.c
 create mode 100644 sys/xen/pv.h

diff --git a/sys/amd64/amd64/machdep.c b/sys/amd64/amd64/machdep.c
index 1880f23..09d9a1a 100644
--- a/sys/amd64/amd64/machdep.c
+++ b/sys/amd64/amd64/machdep.c
@@ -126,6 +126,7 @@ __FBSDID($FreeBSD$);
 #include machine/reg.h
 #include machine/sigframe.h
 #include machine/specialreg.h
+#include machine/sysarch.h
 #ifdef PERFMON
 #include machine/perfmon.h
 #endif
@@ -148,6 +149,7 @@ __FBSDID($FreeBSD$);
 
 #ifdef XENHVM
 #include xen/xen-os.h
+#include xen/pv.h
 #endif
 
 /* Sanity check for __curthread() */
@@ -172,6 +174,14 @@ static int  set_fpcontext(struct thread *td, const 
mcontext_t *mcp,
 char *xfpustate, size_t xfpustate_len);
 SYSINIT(cpu, SI_SUB_CPU, SI_ORDER_FIRST, cpu_startup, NULL);
 
+/* Preload data parse function */
+static caddr_t native_parse_preload_data(u_int64_t);
+
+/* Default init_ops implementation. */
+struct init_ops init_ops = {
+   .parse_preload_data =   native_parse_preload_data,
+};
+
 /*
  * The file conf/ldscript.amd64 defines the symbol kernphys.  Its value is
  * the physical address at which the kernel is loaded.
@@ -1690,6 +1700,26 @@ do_next:
msgbufp = (struct msgbuf *)PHYS_TO_DMAP(phys_avail[pa_indx]);
 }
 
+static caddr_t
+native_parse_preload_data(u_int64_t modulep)
+{
+   caddr_t kmdp;
+
+   preload_metadata = (caddr_t)(uintptr_t)(modulep + KERNBASE);
+   preload_bootstrap_relocate(KERNBASE);
+   kmdp = preload_search_by_type(elf kernel);
+   if (kmdp == NULL)
+   kmdp = preload_search_by_type(elf64 kernel);
+   boothowto = MD_FETCH(kmdp, MODINFOMD_HOWTO, int);
+   kern_envp = MD_FETCH(kmdp, MODINFOMD_ENVP, char *) + KERNBASE;
+#ifdef DDB
+   ksym_start = MD_FETCH(kmdp, MODINFOMD_SSYM, uintptr_t);
+   ksym_end = MD_FETCH(kmdp, MODINFOMD_ESYM, uintptr_t);
+#endif
+
+   return (kmdp);
+}
+
 #ifdef XENHVM
 /*
  * First function called by the Xen PVH boot sequence.
@@ -1754,6 +1784,9 @@ hammer_time_xen(start_info_t *si, u_int64_t xenstack)
}
load_cr3(((u_int64_t)PT4[0]) - KERNBASE);
 
+   /* Set the hooks for early functions that diverge from bare metal */
+   xen_pv_set_init_ops();
+
/* Now we can jump into the native init function */
return (hammer_time(0, physfree));
 }
@@ -1783,17 +1816,7 @@ hammer_time(u_int64_t modulep, u_int64_t physfree)
 */
proc_linkup0(proc0, thread0);
 
-   preload_metadata = (caddr_t)(uintptr_t)(modulep + KERNBASE);
-   preload_bootstrap_relocate(KERNBASE);
-   kmdp = preload_search_by_type(elf kernel);
-   if (kmdp == NULL)
-   kmdp = preload_search_by_type(elf64 kernel);
-   boothowto = MD_FETCH(kmdp, MODINFOMD_HOWTO, int);
-   kern_envp = MD_FETCH(kmdp, MODINFOMD_ENVP, char *) + KERNBASE;
-#ifdef DDB
-   ksym_start = MD_FETCH(kmdp, MODINFOMD_SSYM, uintptr_t);
-   ksym_end = MD_FETCH(kmdp, MODINFOMD_ESYM, uintptr_t);
-#endif
+   kmdp = init_ops.parse_preload_data(modulep);
 
/* Init basic tunables, hz etc */
init_param1();
diff --git a/sys/amd64/include/sysarch.h b/sys/amd64/include/sysarch.h
index cd380d4..58ac8cd 100644
--- a/sys/amd64/include/sysarch.h
+++ b/sys/amd64/include/sysarch.h
@@ -4,3 +4,15 @@
 /* $FreeBSD$ */
 
 #include x86/sysarch.h
+
+/*
+ * Struct containing pointers to init functions whose
+ * implementation is run time selectable.  Selection can be made,
+ * for example, based on detection of a BIOS variant or
+ * hypervisor environment.
+ */
+struct init_ops {
+   caddr_t (*parse_preload_data)(u_int64_t);
+};
+
+extern struct init_ops init_ops;
diff --git a/sys/conf/files.amd64 b/sys/conf/files.amd64
index d1bdcd9..b3b1319 100644
--- a/sys/conf/files.amd64
+++ b/sys/conf/files.amd64
@@ -566,3 +566,4 @@ x86/x86/nexus.c standard
 x86/x86/tsc.c  standard
 x86/xen/hvm.c  optionalxenhvm
 x86/xen/xen_intr.c optionalxen | xenhvm
+x86/xen/pv.c   optionalxenhvm
diff --git a/sys/x86/xen/pv.c b/sys/x86/xen/pv.c
new file mode 100644
index 000..bbaca32
--- /dev/null
+++ b/sys/x86/xen/pv.c
@@ -0,0 +1,114 @@
+/*
+ * Copyright (c) 2004 Christian Limpach.
+ * Copyright (c) 2004-2006,2008 Kip Macy
+ * Copyright (c) 2013 Roger Pau Monné roger@citrix.com
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *notice, this list of conditions and the 

[PATCH v7 07/19] xen: implement hook to fetch e820 memory map

2013-12-19 Thread Roger Pau Monne
---
 sys/amd64/amd64/machdep.c   |   50 ++
 sys/amd64/include/pc/bios.h |2 +
 sys/amd64/include/sysarch.h |1 +
 sys/x86/xen/pv.c|   26 ++
 4 files changed, 60 insertions(+), 19 deletions(-)

diff --git a/sys/amd64/amd64/machdep.c b/sys/amd64/amd64/machdep.c
index a2dcb90..6bbfe5a 100644
--- a/sys/amd64/amd64/machdep.c
+++ b/sys/amd64/amd64/machdep.c
@@ -177,11 +177,15 @@ SYSINIT(cpu, SI_SUB_CPU, SI_ORDER_FIRST, cpu_startup, 
NULL);
 /* Preload data parse function */
 static caddr_t native_parse_preload_data(u_int64_t);
 
+/* Native function to fetch and parse the e820 map */
+static void native_parse_memmap(caddr_t, vm_paddr_t *, int *);
+
 /* Default init_ops implementation. */
 struct init_ops init_ops = {
.parse_preload_data =   native_parse_preload_data,
.early_delay_init = i8254_init,
.early_delay =  i8254_delay,
+   .parse_memmap = native_parse_memmap,
 };
 
 /*
@@ -1418,21 +1422,12 @@ add_physmap_entry(uint64_t base, uint64_t length, 
vm_paddr_t *physmap,
return (1);
 }
 
-static void
-add_smap_entries(struct bios_smap *smapbase, vm_paddr_t *physmap,
-int *physmap_idx)
+void
+bios_add_smap_entries(struct bios_smap *smapbase, u_int32_t smapsize,
+  vm_paddr_t *physmap, int *physmap_idx)
 {
struct bios_smap *smap, *smapend;
-   u_int32_t smapsize;
 
-   /*
-* Memory map from INT 15:E820.
-*
-* subr_module.c says:
-* Consumer may safely assume that size value precedes data.
-* ie: an int32_t immediately precedes smap.
-*/
-   smapsize = *((u_int32_t *)smapbase - 1);
smapend = (struct bios_smap *)((uintptr_t)smapbase + smapsize);
 
for (smap = smapbase; smap  smapend; smap++) {
@@ -1449,6 +1444,29 @@ add_smap_entries(struct bios_smap *smapbase, vm_paddr_t 
*physmap,
}
 }
 
+static void
+native_parse_memmap(caddr_t kmdp, vm_paddr_t *physmap, int *physmap_idx)
+{
+   struct bios_smap *smap;
+   u_int32_t size;
+
+   /*
+* Memory map from INT 15:E820.
+*
+* subr_module.c says:
+* Consumer may safely assume that size value precedes data.
+* ie: an int32_t immediately precedes smap.
+*/
+
+   smap = (struct bios_smap *)preload_search_info(kmdp,
+   MODINFO_METADATA | MODINFOMD_SMAP);
+   if (smap == NULL)
+   panic(No BIOS smap info from loader!);
+   size = *((u_int32_t *)smap - 1);
+
+   bios_add_smap_entries(smap, size, physmap, physmap_idx);
+}
+
 /*
  * Populate the (physmap) array with base/bound pairs describing the
  * available physical memory in the system, then test this memory and
@@ -1466,19 +1484,13 @@ getmemsize(caddr_t kmdp, u_int64_t first)
vm_paddr_t pa, physmap[PHYSMAP_SIZE];
u_long physmem_start, physmem_tunable, memtest;
pt_entry_t *pte;
-   struct bios_smap *smapbase;
quad_t dcons_addr, dcons_size;
 
bzero(physmap, sizeof(physmap));
basemem = 0;
physmap_idx = 0;
 
-   smapbase = (struct bios_smap *)preload_search_info(kmdp,
-   MODINFO_METADATA | MODINFOMD_SMAP);
-   if (smapbase == NULL)
-   panic(No BIOS smap info from loader!);
-
-   add_smap_entries(smapbase, physmap, physmap_idx);
+   init_ops.parse_memmap(kmdp, physmap, physmap_idx);
 
/*
 * Find the 'base memory' segment for SMP
diff --git a/sys/amd64/include/pc/bios.h b/sys/amd64/include/pc/bios.h
index e7d568e..92d4265 100644
--- a/sys/amd64/include/pc/bios.h
+++ b/sys/amd64/include/pc/bios.h
@@ -106,6 +106,8 @@ struct bios_oem {
 intbios_oem_strings(struct bios_oem *oem, u_char *buffer, size_t maxlen);
 uint32_t bios_sigsearch(uint32_t start, u_char *sig, int siglen, int paralen,
int sigofs);
+void bios_add_smap_entries(struct bios_smap *smapbase, u_int32_t smapsize,
+   vm_paddr_t *physmap, int *physmap_idx);
 #endif
 
 #endif /* _MACHINE_PC_BIOS_H_ */
diff --git a/sys/amd64/include/sysarch.h b/sys/amd64/include/sysarch.h
index 60fa635..084223e 100644
--- a/sys/amd64/include/sysarch.h
+++ b/sys/amd64/include/sysarch.h
@@ -15,6 +15,7 @@ struct init_ops {
caddr_t (*parse_preload_data)(u_int64_t);
void(*early_delay_init)(void);
void(*early_delay)(int);
+   void(*parse_memmap)(caddr_t, vm_paddr_t *, int *);
 };
 
 extern struct init_ops init_ops;
diff --git a/sys/x86/xen/pv.c b/sys/x86/xen/pv.c
index f8d8cfa..db576e0 100644
--- a/sys/x86/xen/pv.c
+++ b/sys/x86/xen/pv.c
@@ -37,12 +37,17 @@ __FBSDID($FreeBSD$);
 
 #include machine/sysarch.h
 #include machine/clock.h
+#include machine/pc/bios.h
 
 #include xen/xen-os.h
 #include xen/pv.h
+#include xen/hypervisor.h
+
+#define MAX_E820_ENTRIES   128
 
 /*--- Forward Declarations 
---*/
 static caddr_t 

[PATCH v7 03/19] xen: add and enable Xen console for PVH guests

2013-12-19 Thread Roger Pau Monne
This adds and enables the console used on XEN kernels.
---
 sys/amd64/amd64/machdep.c  |4 +++
 sys/conf/files |4 +-
 sys/dev/xen/console/console.c  |   45 ++-
 sys/dev/xen/console/xencons_ring.c |   15 
 sys/i386/include/xen/xen-os.h  |1 -
 sys/i386/xen/xen_machdep.c |   17 -
 sys/xen/xen-os.h   |4 +++
 7 files changed, 48 insertions(+), 42 deletions(-)

diff --git a/sys/amd64/amd64/machdep.c b/sys/amd64/amd64/machdep.c
index a73e33e..1880f23 100644
--- a/sys/amd64/amd64/machdep.c
+++ b/sys/amd64/amd64/machdep.c
@@ -1709,6 +1709,8 @@ hammer_time_xen(start_info_t *si, u_int64_t xenstack)
KASSERT((si != NULL  xenstack != 0),
(invalid start_info or xenstack));
 
+   xc_printf(FreeBSD PVH running on %s\n, si-magic);
+
/* We use 3 pages of xen stack for the boot pagetables */
physfree = xenstack + 3 * PAGE_SIZE - KERNBASE;
 
@@ -1726,6 +1728,8 @@ hammer_time_xen(start_info_t *si, u_int64_t xenstack)
 */
xen_store = (struct xenstore_domain_interface *)
(ptoa(si-store_mfn) + KERNBASE);
+   console_page =
+   (char *)(ptoa(si-console.domU.mfn) + KERNBASE);
 
xen_domain_type = XEN_PV_DOMAIN;
vm_guest = VM_GUEST_XEN;
diff --git a/sys/conf/files b/sys/conf/files
index a73d31e..f55479d 100644
--- a/sys/conf/files
+++ b/sys/conf/files
@@ -2523,8 +2523,8 @@ dev/xe/if_xe_pccard.c optional xe pccard
 dev/xen/balloon/balloon.c  optional xen | xenhvm
 dev/xen/blkfront/blkfront.coptional xen | xenhvm
 dev/xen/blkback/blkback.c  optional xen | xenhvm
-dev/xen/console/console.c  optional xen
-dev/xen/console/xencons_ring.c optional xen
+dev/xen/console/console.c  optional xen | xenhvm
+dev/xen/console/xencons_ring.c optional xen | xenhvm
 dev/xen/control/control.c  optional xen | xenhvm
 dev/xen/netback/netback.c  optional xen | xenhvm
 dev/xen/netfront/netfront.coptional xen | xenhvm
diff --git a/sys/dev/xen/console/console.c b/sys/dev/xen/console/console.c
index 23eaee2..e8079da 100644
--- a/sys/dev/xen/console/console.c
+++ b/sys/dev/xen/console/console.c
@@ -69,11 +69,14 @@ struct mtx  cn_mtx;
 static char wbuf[WBUF_SIZE];
 static char rbuf[RBUF_SIZE];
 static int rc, rp;
-static unsigned int cnsl_evt_reg;
+unsigned int cnsl_evt_reg;
 static unsigned int wc, wp; /* write_cons, write_prod */
 xen_intr_handle_t xen_intr_handle;
 device_t xencons_dev;
 
+/* Virt address of the shared console page */
+char *console_page;
+
 #ifdef KDB
 static int xc_altbrk;
 #endif
@@ -110,9 +113,28 @@ static struct ttydevsw xc_ttydevsw = {
 .tsw_outwakeup = xcoutwakeup,
 };
 
+/*- Debug function 
---*/
+#define XC_PRINTF_BUFSIZE 1024
+void
+xc_printf(const char *fmt, ...)
+{
+__va_list ap;
+int retval;
+static char buf[XC_PRINTF_BUFSIZE];
+
+va_start(ap, fmt);
+retval = vsnprintf(buf, XC_PRINTF_BUFSIZE - 1, fmt, ap);
+va_end(ap);
+buf[retval] = 0;
+HYPERVISOR_console_write(buf, retval);
+}
+
 static void
 xc_cnprobe(struct consdev *cp)
 {
+   if (!xen_pv_domain())
+   return;
+
cp-cn_pri = CN_REMOTE;
sprintf(cp-cn_name, %s0, driver_name);
 }
@@ -175,7 +197,7 @@ static void
 xc_cnputc(struct consdev *dev, int c)
 {
 
-   if (xen_start_info-flags  SIF_INITDOMAIN)
+   if (xen_initial_domain())
xc_cnputc_dom0(dev, c);
else
xc_cnputc_domu(dev, c);
@@ -206,22 +228,12 @@ xcons_putc(int c)
xcons_force_flush();
 #endif 
}
-   if (cnsl_evt_reg)
-   __xencons_tx_flush();
+   __xencons_tx_flush();

/* inform start path that we're pretty full */
return ((wp - wc) = WBUF_SIZE - 100) ? TRUE : FALSE;
 }
 
-static void
-xc_identify(driver_t *driver, device_t parent)
-{
-   device_t child;
-   child = BUS_ADD_CHILD(parent, 0, driver_name, 0);
-   device_set_driver(child, driver);
-   device_set_desc(child, Xen Console);
-}
-
 static int
 xc_probe(device_t dev)
 {
@@ -245,7 +257,7 @@ xc_attach(device_t dev)
cnsl_evt_reg = 1;
callout_reset(xc_callout, XC_POLLTIME, xc_timeout, xccons);
 
-   if (xen_start_info-flags  SIF_INITDOMAIN) {
+   if (xen_initial_domain()) {
error = xen_intr_bind_virq(dev, VIRQ_CONSOLE, 0, NULL,
   xencons_priv_interrupt, NULL,
   INTR_TYPE_TTY, xen_intr_handle);
@@ -309,7 +321,7 @@ __xencons_tx_flush(void)
sz = wp - wc;
if (sz  (WBUF_SIZE - WBUF_MASK(wc)))
sz = WBUF_SIZE - WBUF_MASK(wc);
-   if (xen_start_info-flags  SIF_INITDOMAIN) {
+   if 

[PATCH v7 11/19] xen: changes to hvm code in order to support PVH guests

2013-12-19 Thread Roger Pau Monne
On PVH we don't need to init the shared info page, or disable emulated
devices. Also, make sure PV IPIs are set before starting the APs.
---
 sys/x86/xen/hvm.c |   17 -
 1 files changed, 12 insertions(+), 5 deletions(-)

diff --git a/sys/x86/xen/hvm.c b/sys/x86/xen/hvm.c
index 9a0411e..fb1ed79 100644
--- a/sys/x86/xen/hvm.c
+++ b/sys/x86/xen/hvm.c
@@ -523,7 +523,7 @@ xen_setup_cpus(void)
 {
int i;
 
-   if (!xen_hvm_domain() || !xen_vector_callback_enabled)
+   if (!xen_vector_callback_enabled)
return;
 
 #ifdef __amd64__
@@ -712,10 +712,13 @@ xen_hvm_init(enum xen_hvm_init_type init_type)
}
 
xen_vector_callback_enabled = 0;
-   xen_domain_type = XEN_HVM_DOMAIN;
-   xen_hvm_init_shared_info_page();
xen_hvm_set_callback(NULL);
-   xen_hvm_disable_emulated_devices();
+
+   if (!xen_pv_domain()) {
+   xen_domain_type = XEN_HVM_DOMAIN;
+   xen_hvm_init_shared_info_page();
+   xen_hvm_disable_emulated_devices();
+   }
 } 
 
 void
@@ -746,6 +749,9 @@ xen_set_vcpu_id(void)
struct pcpu *pc;
int i;
 
+   if (!xen_hvm_domain())
+   return;
+
/* Set vcpu_id to acpi_id */
CPU_FOREACH(i) {
pc = pcpu_find(i);
@@ -789,7 +795,8 @@ xen_hvm_cpu_init(void)
 
 SYSINIT(xen_hvm_init, SI_SUB_HYPERVISOR, SI_ORDER_FIRST, xen_hvm_sysinit, 
NULL);
 #ifdef SMP
-SYSINIT(xen_setup_cpus, SI_SUB_SMP, SI_ORDER_FIRST, xen_setup_cpus, NULL);
+/* We need to setup IPIs before APs are started */
+SYSINIT(xen_setup_cpus, SI_SUB_SMP-1, SI_ORDER_FIRST, xen_setup_cpus, NULL);
 #endif
 SYSINIT(xen_hvm_cpu_init, SI_SUB_INTR, SI_ORDER_FIRST, xen_hvm_cpu_init, NULL);
 SYSINIT(xen_set_vcpu_id, SI_SUB_CPU, SI_ORDER_ANY, xen_set_vcpu_id, NULL);
-- 
1.7.7.5 (Apple Git-26)

___
freebsd-current@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-current
To unsubscribe, send any mail to freebsd-current-unsubscr...@freebsd.org


[PATCH v7 14/19] xen: introduce a dummy pvcpu device

2013-12-19 Thread Roger Pau Monne
Since Xen PVH guests doesn't have ACPI, we need to create a dummy
pvcpu device that will be used to fill the pcpu-pc_device field.
---
 sys/conf/files.amd64 |1 +
 sys/x86/xen/pvcpu.c  |   84 ++
 2 files changed, 85 insertions(+), 0 deletions(-)
 create mode 100644 sys/x86/xen/pvcpu.c

diff --git a/sys/conf/files.amd64 b/sys/conf/files.amd64
index 3bdc05e..4a3f612 100644
--- a/sys/conf/files.amd64
+++ b/sys/conf/files.amd64
@@ -569,3 +569,4 @@ x86/xen/hvm.c   optionalxenhvm
 x86/xen/xen_intr.c optionalxen | xenhvm
 x86/xen/pv.c   optionalxenhvm
 x86/xen/mptable.c  optionalxenhvm
+x86/xen/pvcpu.coptionalxenhvm
diff --git a/sys/x86/xen/pvcpu.c b/sys/x86/xen/pvcpu.c
new file mode 100644
index 000..8725e76
--- /dev/null
+++ b/sys/x86/xen/pvcpu.c
@@ -0,0 +1,84 @@
+/*
+ * Copyright (c) 2013 Roger Pau Monné roger@citrix.com
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *notice, this list of conditions and the following disclaimer in the
+ *documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include sys/cdefs.h
+__FBSDID($FreeBSD$);
+
+#include sys/param.h
+#include sys/systm.h
+#include sys/bus.h
+#include sys/kernel.h
+#include sys/module.h
+#include sys/pcpu.h
+#include sys/smp.h
+
+#include xen/xen-os.h
+
+/*
+ * Dummy Xen cpu device
+ *
+ * Since there's no ACPI on PVH guests, we need to create a dummy
+ * CPU device in order to fill the pcpu-pc_device field.
+ */
+
+static int
+xenpvcpu_probe(device_t dev)
+{
+   if (!xen_pv_domain())
+   return (ENXIO);
+
+   device_set_desc(dev, Xen PV CPU);
+   return (0);
+}
+
+static int
+xenpvcpu_attach(device_t dev)
+{
+   struct pcpu *pc;
+   int cpu;
+
+   cpu = device_get_unit(dev);
+   pc = pcpu_find(cpu);
+   pc-pc_device = dev;
+   return (0);
+}
+
+static device_method_t xenpvcpu_methods[] = {
+   DEVMETHOD(device_probe, xenpvcpu_probe),
+   DEVMETHOD(device_attach, xenpvcpu_attach),
+   DEVMETHOD_END
+};
+
+static driver_t xenpvcpu_driver = {
+   pvcpu,
+   xenpvcpu_methods,
+   0,
+};
+
+devclass_t xenpvcpu_devclass;
+
+DRIVER_MODULE(xenpvcpu, nexus, xenpvcpu_driver, xenpvcpu_devclass, 0, 0);
+MODULE_DEPEND(xenpvcpu, nexus, 1, 1, 1);
-- 
1.7.7.5 (Apple Git-26)

___
freebsd-current@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-current
To unsubscribe, send any mail to freebsd-current-unsubscr...@freebsd.org

[PATCH v7 18/19] xen: changes to gnttab for PVH

2013-12-19 Thread Roger Pau Monne
---
 sys/xen/gnttab.c |   26 +-
 1 files changed, 21 insertions(+), 5 deletions(-)

diff --git a/sys/xen/gnttab.c b/sys/xen/gnttab.c
index 03c32b7..6949be5 100644
--- a/sys/xen/gnttab.c
+++ b/sys/xen/gnttab.c
@@ -25,6 +25,7 @@ __FBSDID($FreeBSD$);
 #include sys/lock.h
 #include sys/malloc.h
 #include sys/mman.h
+#include sys/limits.h
 
 #include xen/xen-os.h
 #include xen/hypervisor.h
@@ -607,6 +608,7 @@ gnttab_resume(void)
 {
int error;
unsigned int max_nr_gframes, nr_gframes;
+   void *alloc_mem;
 
nr_gframes = nr_grant_frames;
max_nr_gframes = max_nr_grant_frames();
@@ -614,11 +616,25 @@ gnttab_resume(void)
return (ENOSYS);
 
if (!resume_frames) {
-   error = xenpci_alloc_space(PAGE_SIZE * max_nr_gframes,
-   resume_frames);
-   if (error) {
-   printf(error mapping gnttab share frames\n);
-   return (error);
+   if (xen_pv_domain()) {
+   /*
+* This is a waste of physical memory,
+* we should use ballooned pages instead,
+* but it will do for now.
+*/
+   alloc_mem = contigmalloc(max_nr_gframes * PAGE_SIZE,
+M_DEVBUF, M_NOWAIT, 0,
+ULONG_MAX, PAGE_SIZE, 0);
+   KASSERT((alloc_mem != NULL),
+   (unable to alloc memory for gnttab));
+   resume_frames = vtophys(alloc_mem);
+   } else {
+   error = xenpci_alloc_space(PAGE_SIZE * max_nr_gframes,
+   resume_frames);
+   if (error) {
+   printf(error mapping gnttab share frames\n);
+   return (error);
+   }
}
}
 
-- 
1.7.7.5 (Apple Git-26)

___
freebsd-current@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-current
To unsubscribe, send any mail to freebsd-current-unsubscr...@freebsd.org


[PATCH v7 17/19] xen: xenstore changes to support PVH

2013-12-19 Thread Roger Pau Monne
---
 sys/xen/xenstore/xenstore.c |   21 ++---
 1 files changed, 10 insertions(+), 11 deletions(-)

diff --git a/sys/xen/xenstore/xenstore.c b/sys/xen/xenstore/xenstore.c
index bcf6357..2893c84 100644
--- a/sys/xen/xenstore/xenstore.c
+++ b/sys/xen/xenstore/xenstore.c
@@ -229,13 +229,11 @@ struct xs_softc {
 */
struct sx xenwatch_mutex;
 
-#ifdef XENHVM
/**
 * The HVM guest pseudo-physical frame number.  This is Xen's mapping
 * of the true machine frame number into our physical address space.
 */
unsigned long gpfn;
-#endif
 
/**
 * The event channel for communicating with the
@@ -1141,13 +1139,15 @@ xs_attach(device_t dev)
/* Initialize the interface to xenstore. */
struct proc *p;
 
-#ifdef XENHVM
-   xs.evtchn = hvm_get_parameter(HVM_PARAM_STORE_EVTCHN);
-   xs.gpfn = hvm_get_parameter(HVM_PARAM_STORE_PFN);
-   xen_store = pmap_mapdev(xs.gpfn * PAGE_SIZE, PAGE_SIZE);
-#else
-   xs.evtchn = xen_start_info-store_evtchn;
-#endif
+   if (xen_hvm_domain()) {
+   xs.evtchn = hvm_get_parameter(HVM_PARAM_STORE_EVTCHN);
+   xs.gpfn = hvm_get_parameter(HVM_PARAM_STORE_PFN);
+   xen_store = pmap_mapdev(xs.gpfn * PAGE_SIZE, PAGE_SIZE);
+   } else if (xen_pv_domain()) {
+   xs.evtchn = HYPERVISOR_start_info-store_evtchn;
+   } else {
+   panic(Unknown domain type, cannot initialize xenstore\n);
+   }
 
TAILQ_INIT(xs.reply_list);
TAILQ_INIT(xs.watch_events);
@@ -1256,9 +1256,8 @@ static devclass_t xenstore_devclass;
  
 #ifdef XENHVM
 DRIVER_MODULE(xenstore, xenpci, xenstore_driver, xenstore_devclass, 0, 0);
-#else
-DRIVER_MODULE(xenstore, nexus, xenstore_driver, xenstore_devclass, 0, 0);
 #endif
+DRIVER_MODULE(xenstore, nexus, xenstore_driver, xenstore_devclass, 0, 0);
 
 /*--- Sysctl Data 
*/
 /* XXX Shouldn't the node be somewhere else? */
-- 
1.7.7.5 (Apple Git-26)

___
freebsd-current@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-current
To unsubscribe, send any mail to freebsd-current-unsubscr...@freebsd.org


[PATCH v7 15/19] xen: create a Xen nexus to use in PV/PVH

2013-12-19 Thread Roger Pau Monne
Introduce a Xen specific nexus that is going to be in charge for
attaching Xen specific devices. Remove the identify routine from Xen
devices and instead attach them from the nexus (PV/PVH) or xenpci
(HVM).
---
 sys/conf/files.amd64|1 +
 sys/conf/files.i386 |1 +
 sys/dev/xen/timer/timer.c   |   14 --
 sys/dev/xen/xenpci/xenpci.c |5 ++
 sys/x86/xen/xen_nexus.c |   99 +++
 sys/xen/xenstore/xenstore.c |7 ---
 6 files changed, 106 insertions(+), 21 deletions(-)
 create mode 100644 sys/x86/xen/xen_nexus.c

diff --git a/sys/conf/files.amd64 b/sys/conf/files.amd64
index 4a3f612..8bb0b5c 100644
--- a/sys/conf/files.amd64
+++ b/sys/conf/files.amd64
@@ -570,3 +570,4 @@ x86/xen/xen_intr.c  optionalxen | xenhvm
 x86/xen/pv.c   optionalxenhvm
 x86/xen/mptable.c  optionalxenhvm
 x86/xen/pvcpu.coptionalxenhvm
+x86/xen/xen_nexus.coptionalxenhvm
diff --git a/sys/conf/files.i386 b/sys/conf/files.i386
index 790296d..751db32 100644
--- a/sys/conf/files.i386
+++ b/sys/conf/files.i386
@@ -603,3 +603,4 @@ x86/x86/tsc.c   standard
 x86/x86/delay.cstandard
 x86/xen/hvm.c  optional xenhvm
 x86/xen/xen_intr.c optional xen | xenhvm
+x86/xen/xen_nexus.coptional xen | xenhvm
diff --git a/sys/dev/xen/timer/timer.c b/sys/dev/xen/timer/timer.c
index 96372ab..b047786 100644
--- a/sys/dev/xen/timer/timer.c
+++ b/sys/dev/xen/timer/timer.c
@@ -98,19 +98,6 @@ struct xentimer_softc {
 /* Last time; this guarantees a monotonically increasing clock. */
 volatile uint64_t xen_timer_last_time = 0;
 
-static void
-xentimer_identify(driver_t *driver, device_t parent)
-{
-   if (!xen_domain())
-   return;
-
-   /* Handle all Xen PV timers in one device instance. */
-   if (devclass_get_device(xentimer_devclass, 0))
-   return;
-
-   BUS_ADD_CHILD(parent, 0, xen_et, 0);
-}
-
 static int
 xentimer_probe(device_t dev)
 {
@@ -618,7 +605,6 @@ void xen_delay(int n)
 }
 
 static device_method_t xentimer_methods[] = {
-   DEVMETHOD(device_identify, xentimer_identify),
DEVMETHOD(device_probe, xentimer_probe),
DEVMETHOD(device_attach, xentimer_attach),
DEVMETHOD(device_detach, xentimer_detach),
diff --git a/sys/dev/xen/xenpci/xenpci.c b/sys/dev/xen/xenpci/xenpci.c
index dd2ad92..cac8022 100644
--- a/sys/dev/xen/xenpci/xenpci.c
+++ b/sys/dev/xen/xenpci/xenpci.c
@@ -270,6 +270,11 @@ xenpci_attach(device_t dev)
goto errexit;
}
 
+   if (BUS_ADD_CHILD(dev, 0, xenstore, 0) == NULL)
+   panic(xenpci: unable to add xenstore device);
+   if (BUS_ADD_CHILD(nexus, 0, xen_et, 0) == NULL)
+   panic(xenpci: unable to add xen pv timer device);
+
return (bus_generic_attach(dev));
 
 errexit:
diff --git a/sys/x86/xen/xen_nexus.c b/sys/x86/xen/xen_nexus.c
new file mode 100644
index 000..288e6b6
--- /dev/null
+++ b/sys/x86/xen/xen_nexus.c
@@ -0,0 +1,99 @@
+/*
+ * Copyright (c) 2013 Roger Pau Monné roger@citrix.com
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *notice, this list of conditions and the following disclaimer in the
+ *documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include sys/cdefs.h
+__FBSDID($FreeBSD$);
+
+#include sys/param.h
+#include sys/bus.h
+#include sys/kernel.h
+#include sys/module.h
+#include sys/sysctl.h
+#include sys/systm.h
+#include sys/smp.h
+
+#include machine/nexusvar.h
+
+#include xen/xen-os.h
+
+static const char *xen_devices[] =
+{
+   xenstore, /* XenStore bus */
+   xen_et,   /* Xen PV timer (provides: tc, et, clk) */
+   xc,   /* 

[PATCH v7 13/19] xen: introduce flag to disable the local apic

2013-12-19 Thread Roger Pau Monne
PVH guests don't have an emulated lapic.
---
 sys/amd64/amd64/mp_machdep.c |   10 ++
 sys/amd64/include/apicvar.h  |1 +
 sys/i386/include/apicvar.h   |1 +
 sys/i386/xen/xen_machdep.c   |2 ++
 sys/x86/x86/local_apic.c |8 +---
 sys/x86/xen/pv.c |3 +++
 6 files changed, 18 insertions(+), 7 deletions(-)

diff --git a/sys/amd64/amd64/mp_machdep.c b/sys/amd64/amd64/mp_machdep.c
index e302886..0296a92 100644
--- a/sys/amd64/amd64/mp_machdep.c
+++ b/sys/amd64/amd64/mp_machdep.c
@@ -709,7 +709,8 @@ init_secondary(void)
wrmsr(MSR_SF_MASK, PSL_NT|PSL_T|PSL_I|PSL_C|PSL_D);
 
/* Disable local APIC just to be sure. */
-   lapic_disable();
+   if (!lapic_disabled)
+   lapic_disable();
 
/* signal our startup to the BSP. */
mp_naps++;
@@ -735,7 +736,7 @@ init_secondary(void)
 
/* A quick check from sanity claus */
cpuid = PCPU_GET(cpuid);
-   if (PCPU_GET(apic_id) != lapic_id()) {
+   if (!lapic_disabled  (PCPU_GET(apic_id) != lapic_id())) {
printf(SMP: cpuid = %d\n, cpuid);
printf(SMP: actual apic_id = %d\n, lapic_id());
printf(SMP: correct apic_id = %d\n, PCPU_GET(apic_id));
@@ -751,7 +752,8 @@ init_secondary(void)
mtx_lock_spin(ap_boot_mtx);
 
/* Init local apic for irq's */
-   lapic_setup(1);
+   if (!lapic_disabled)
+   lapic_setup(1);
 
/* Set memory range attributes for this CPU to match the BSP */
mem_range_AP_init();
@@ -766,7 +768,7 @@ init_secondary(void)
if (cpu_logical  1  PCPU_GET(apic_id) % cpu_logical != 0)
CPU_SET(cpuid, logical_cpus_mask);
 
-   if (bootverbose)
+   if (!lapic_disabled  bootverbose)
lapic_dump(AP);
 
if (smp_cpus == mp_ncpus) {
diff --git a/sys/amd64/include/apicvar.h b/sys/amd64/include/apicvar.h
index e7423a3..84e01d4 100644
--- a/sys/amd64/include/apicvar.h
+++ b/sys/amd64/include/apicvar.h
@@ -169,6 +169,7 @@ inthand_t
 
 extern vm_paddr_t lapic_paddr;
 extern int apic_cpuids[];
+extern bool lapic_disabled;
 
 u_int  apic_alloc_vector(u_int apic_id, u_int irq);
 u_int  apic_alloc_vectors(u_int apic_id, u_int *irqs, u_int count,
diff --git a/sys/i386/include/apicvar.h b/sys/i386/include/apicvar.h
index df99ebe..24c99f0 100644
--- a/sys/i386/include/apicvar.h
+++ b/sys/i386/include/apicvar.h
@@ -168,6 +168,7 @@ inthand_t
 
 extern vm_paddr_t lapic_paddr;
 extern int apic_cpuids[];
+extern bool lapic_disabled;
 
 u_int  apic_alloc_vector(u_int apic_id, u_int irq);
 u_int  apic_alloc_vectors(u_int apic_id, u_int *irqs, u_int count,
diff --git a/sys/i386/xen/xen_machdep.c b/sys/i386/xen/xen_machdep.c
index 09c01f1..7039b4a 100644
--- a/sys/i386/xen/xen_machdep.c
+++ b/sys/i386/xen/xen_machdep.c
@@ -59,6 +59,7 @@ __FBSDID($FreeBSD$);
 #include machine/intr_machdep.h
 #include machine/md_var.h
 #include machine/asmacros.h
+#include machine/apicvar.h
 
 
 
@@ -912,6 +913,7 @@ initvalues(start_info_t *startinfo)
 #endif 
xen_start_info = startinfo;
HYPERVISOR_start_info = startinfo;
+   lapic_disabled = true;
xen_phys_machine = (xen_pfn_t *)startinfo-mfn_list;
 
IdlePTD = (pd_entry_t *)((uint8_t *)startinfo-pt_base + PAGE_SIZE);
diff --git a/sys/x86/x86/local_apic.c b/sys/x86/x86/local_apic.c
index 41bd602..85736c8 100644
--- a/sys/x86/x86/local_apic.c
+++ b/sys/x86/x86/local_apic.c
@@ -156,6 +156,7 @@ extern inthand_t IDTVEC(rsvd);
 
 volatile lapic_t *lapic;
 vm_paddr_t lapic_paddr;
+bool lapic_disabled;
 static u_long lapic_timer_divisor;
 static struct eventtimer lapic_et;
 
@@ -1367,9 +1368,10 @@ apic_setup_io(void *dummy __unused)
if (retval != 0)
printf(%s: Failed to setup I/O APICs: returned %d\n,
best_enum-apic_name, retval);
-#ifdef XEN
-   return;
-#endif
+
+   if (lapic_disabled)
+   return;
+
/*
 * Finish setting up the local APIC on the BSP once we know how to
 * properly program the LINT pins.
diff --git a/sys/x86/xen/pv.c b/sys/x86/xen/pv.c
index 7e45a83..e783bb8 100644
--- a/sys/x86/xen/pv.c
+++ b/sys/x86/xen/pv.c
@@ -48,6 +48,7 @@ __FBSDID($FreeBSD$);
 #include machine/clock.h
 #include machine/pc/bios.h
 #include machine/smp.h
+#include machine/apicvar.h
 
 #include xen/xen-os.h
 #include xen/pv.h
@@ -230,4 +231,6 @@ xen_pv_set_init_ops(void)
 {
/* Init ops for Xen PV */
init_ops = xen_init_ops;
+   /* Disable lapic */
+   lapic_disabled = true;
 }
-- 
1.7.7.5 (Apple Git-26)

___
freebsd-current@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-current
To unsubscribe, send any mail to freebsd-current-unsubscr...@freebsd.org


[PATCH v7 16/19] xen: add shutdown hook for PVH

2013-12-19 Thread Roger Pau Monne
Add the PV shutdown hook to PVH.
---
 sys/dev/xen/control/control.c |   37 ++---
 1 files changed, 18 insertions(+), 19 deletions(-)

diff --git a/sys/dev/xen/control/control.c b/sys/dev/xen/control/control.c
index bc0609d..78894ba 100644
--- a/sys/dev/xen/control/control.c
+++ b/sys/dev/xen/control/control.c
@@ -316,21 +316,6 @@ xctrl_suspend()
EVENTHANDLER_INVOKE(power_resume);
 }
 
-static void
-xen_pv_shutdown_final(void *arg, int howto)
-{
-   /*
-* Inform the hypervisor that shutdown is complete.
-* This is not necessary in HVM domains since Xen
-* emulates ACPI in that mode and FreeBSD's ACPI
-* support will request this transition.
-*/
-   if (howto  (RB_HALT | RB_POWEROFF))
-   HYPERVISOR_shutdown(SHUTDOWN_poweroff);
-   else
-   HYPERVISOR_shutdown(SHUTDOWN_reboot);
-}
-
 #else
 
 /* HVM mode suspension. */
@@ -440,6 +425,21 @@ xctrl_crash()
panic(Xen directed crash);
 }
 
+static void
+xen_pv_shutdown_final(void *arg, int howto)
+{
+   /*
+* Inform the hypervisor that shutdown is complete.
+* This is not necessary in HVM domains since Xen
+* emulates ACPI in that mode and FreeBSD's ACPI
+* support will request this transition.
+*/
+   if (howto  (RB_HALT | RB_POWEROFF))
+   HYPERVISOR_shutdown(SHUTDOWN_poweroff);
+   else
+   HYPERVISOR_shutdown(SHUTDOWN_reboot);
+}
+
 /*-- Event Reception 
-*/
 static void
 xctrl_on_watch_event(struct xs_watch *watch, const char **vec, unsigned int 
len)
@@ -522,10 +522,9 @@ xctrl_attach(device_t dev)
xctrl-xctrl_watch.callback_data = (uintptr_t)xctrl;
xs_register_watch(xctrl-xctrl_watch);
 
-#ifndef XENHVM
-   EVENTHANDLER_REGISTER(shutdown_final, xen_pv_shutdown_final, NULL,
- SHUTDOWN_PRI_LAST);
-#endif
+   if (xen_pv_domain())
+   EVENTHANDLER_REGISTER(shutdown_final, xen_pv_shutdown_final, 
NULL,
+ SHUTDOWN_PRI_LAST);
 
return (0);
 }
-- 
1.7.7.5 (Apple Git-26)

___
freebsd-current@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-current
To unsubscribe, send any mail to freebsd-current-unsubscr...@freebsd.org


[PATCH v7 12/19] xen: add a hook to perform AP startup

2013-12-19 Thread Roger Pau Monne
AP startup on PVH follows the PV method, so we need to add a hook in
order to diverge from bare metal.
---
 sys/amd64/amd64/mp_machdep.c |   16 ---
 sys/amd64/include/cpu.h  |1 +
 sys/x86/xen/hvm.c|   17 +++-
 sys/x86/xen/pv.c |   90 ++
 sys/xen/pv.h |1 +
 5 files changed, 117 insertions(+), 8 deletions(-)

diff --git a/sys/amd64/amd64/mp_machdep.c b/sys/amd64/amd64/mp_machdep.c
index 4ef4b3d..e302886 100644
--- a/sys/amd64/amd64/mp_machdep.c
+++ b/sys/amd64/amd64/mp_machdep.c
@@ -90,7 +90,7 @@ extern  struct pcpu __pcpu[];
 
 /* AP uses this during bootstrap.  Do not staticize.  */
 char *bootSTK;
-static int bootAP;
+int bootAP;
 
 /* Free these after use */
 void *bootstacks[MAXCPU];
@@ -122,9 +122,12 @@ u_long *ipi_rendezvous_counts[MAXCPU];
 static u_long *ipi_hardclock_counts[MAXCPU];
 #endif
 
+int native_start_all_aps(void);
+
 /* Default cpu_ops implementation. */
 struct cpu_ops cpu_ops = {
-   .ipi_vectored = lapic_ipi_vectored
+   .ipi_vectored = lapic_ipi_vectored,
+   .start_all_aps = native_start_all_aps,
 };
 
 extern inthand_t IDTVEC(fast_syscall), IDTVEC(fast_syscall32);
@@ -138,7 +141,7 @@ extern int pmap_pcid_enabled;
 static volatile cpuset_t ipi_nmi_pending;
 
 /* used to hold the AP's until we are ready to release them */
-static struct mtx ap_boot_mtx;
+struct mtx ap_boot_mtx;
 
 /* Set to 1 once we're ready to let the APs out of the pen. */
 static volatile int aps_ready = 0;
@@ -165,7 +168,6 @@ static int cpu_cores;   /* cores per 
package */
 
 static voidassign_cpu_ids(void);
 static voidset_interrupt_apic_ids(void);
-static int start_all_aps(void);
 static int start_ap(int apic_id);
 static voidrelease_aps(void *dummy);
 
@@ -569,7 +571,7 @@ cpu_mp_start(void)
assign_cpu_ids();
 
/* Start each Application Processor */
-   start_all_aps();
+   cpu_ops.start_all_aps();
 
set_interrupt_apic_ids();
 }
@@ -908,8 +910,8 @@ assign_cpu_ids(void)
 /*
  * start each AP in our list
  */
-static int
-start_all_aps(void)
+int
+native_start_all_aps(void)
 {
vm_offset_t va = boot_address + KERNBASE;
u_int64_t *pt4, *pt3, *pt2;
diff --git a/sys/amd64/include/cpu.h b/sys/amd64/include/cpu.h
index 3d9ff531..ed9f1db 100644
--- a/sys/amd64/include/cpu.h
+++ b/sys/amd64/include/cpu.h
@@ -64,6 +64,7 @@ struct cpu_ops {
void (*cpu_init)(void);
void (*cpu_resume)(void);
void (*ipi_vectored)(u_int, int);
+   int  (*start_all_aps)(void);
 };
 
 extern struct  cpu_ops cpu_ops;
diff --git a/sys/x86/xen/hvm.c b/sys/x86/xen/hvm.c
index fb1ed79..5ec9f3a 100644
--- a/sys/x86/xen/hvm.c
+++ b/sys/x86/xen/hvm.c
@@ -53,6 +53,9 @@ __FBSDID($FreeBSD$);
 #include xen/hypervisor.h
 #include xen/hvm.h
 #include xen/xen_intr.h
+#ifdef __amd64__
+#include xen/pv.h
+#endif
 
 #include xen/interface/hvm/params.h
 #include xen/interface/vcpu.h
@@ -97,6 +100,11 @@ extern void pmap_lazyfix_action(void);
 /* Variables used by mp_machdep to perform the bitmap IPI */
 extern volatile u_int cpu_ipi_pending[MAXCPU];
 
+#ifdef __amd64__
+/* Native AP start used on PVHVM */
+extern int native_start_all_aps(void);
+#endif
+
 /*-- Macros 
--*/
 #defineIPI_TO_IDX(ipi) ((ipi) - APIC_IPI_INTS)
 
@@ -119,7 +127,10 @@ enum xen_domain_type xen_domain_type = XEN_NATIVE;
 struct cpu_ops xen_hvm_cpu_ops = {
.ipi_vectored   = lapic_ipi_vectored,
.cpu_init   = xen_hvm_cpu_init,
-   .cpu_resume = xen_hvm_cpu_resume
+   .cpu_resume = xen_hvm_cpu_resume,
+#ifdef __amd64__
+   .start_all_aps = native_start_all_aps,
+#endif
 };
 
 static MALLOC_DEFINE(M_XENHVM, xen_hvm, Xen HVM PV Support);
@@ -698,6 +709,10 @@ xen_hvm_init(enum xen_hvm_init_type init_type)
setup_xen_features();
cpu_ops = xen_hvm_cpu_ops;
vm_guest = VM_GUEST_XEN;
+#ifdef __amd64__
+   if (xen_pv_domain())
+   cpu_ops.start_all_aps = xen_pv_start_all_aps;
+#endif
break;
case XEN_HVM_INIT_RESUME:
if (error != 0)
diff --git a/sys/x86/xen/pv.c b/sys/x86/xen/pv.c
index db576e0..7e45a83 100644
--- a/sys/x86/xen/pv.c
+++ b/sys/x86/xen/pv.c
@@ -34,21 +34,43 @@ __FBSDID($FreeBSD$);
 #include sys/kernel.h
 #include sys/reboot.h
 #include sys/systm.h
+#include sys/malloc.h
+#include sys/lock.h
+#include sys/mutex.h
+#include sys/smp.h
+
+#include vm/vm.h
+#include vm/pmap.h
+#include vm/vm_extern.h
+#include vm/vm_kern.h
 
 #include machine/sysarch.h
 #include machine/clock.h
 #include machine/pc/bios.h
+#include machine/smp.h
 
 #include xen/xen-os.h
 #include xen/pv.h
 #include xen/hypervisor.h
 
+#include xen/interface/vcpu.h
+
 #define MAX_E820_ENTRIES   128
 
 /*--- Forward Declarations 

[PATCH v7 19/19] isa: allow ISA bus to attach to the nexus

2013-12-19 Thread Roger Pau Monne
---
 sys/x86/isa/isa.c |3 +++
 1 files changed, 3 insertions(+), 0 deletions(-)

diff --git a/sys/x86/isa/isa.c b/sys/x86/isa/isa.c
index 1a57137..09d1ab7 100644
--- a/sys/x86/isa/isa.c
+++ b/sys/x86/isa/isa.c
@@ -241,3 +241,6 @@ isa_release_resource(device_t bus, device_t child, int 
type, int rid,
  * On this platform, isa can also attach to the legacy bus.
  */
 DRIVER_MODULE(isa, legacy, isa_driver, isa_devclass, 0, 0);
+#ifdef XENHVM
+DRIVER_MODULE(isa, nexus, isa_driver, isa_devclass, 0, 0);
+#endif
-- 
1.7.7.5 (Apple Git-26)

___
freebsd-current@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-current
To unsubscribe, send any mail to freebsd-current-unsubscr...@freebsd.org


[PATCH v7 10/19] xen: add hook for AP bootstrap memory reservation

2013-12-19 Thread Roger Pau Monne
This hook will only be implemented for bare metal, Xen doesn't require
any bootstrap code since APs are started in long mode with paging
enabled.
---
 sys/amd64/amd64/machdep.c   |6 +-
 sys/amd64/include/sysarch.h |3 +++
 2 files changed, 8 insertions(+), 1 deletions(-)

diff --git a/sys/amd64/amd64/machdep.c b/sys/amd64/amd64/machdep.c
index 6bbfe5a..a811a9b 100644
--- a/sys/amd64/amd64/machdep.c
+++ b/sys/amd64/amd64/machdep.c
@@ -186,6 +186,9 @@ struct init_ops init_ops = {
.early_delay_init = i8254_init,
.early_delay =  i8254_delay,
.parse_memmap = native_parse_memmap,
+#ifdef SMP
+   .mp_bootaddress =   mp_bootaddress,
+#endif
 };
 
 /*
@@ -1507,7 +1510,8 @@ getmemsize(caddr_t kmdp, u_int64_t first)
 
 #ifdef SMP
/* make hole for AP bootstrap code */
-   physmap[1] = mp_bootaddress(physmap[1] / 1024);
+   if (init_ops.mp_bootaddress)
+   physmap[1] = init_ops.mp_bootaddress(physmap[1] / 1024);
 #endif
 
/*
diff --git a/sys/amd64/include/sysarch.h b/sys/amd64/include/sysarch.h
index 084223e..77f4b29 100644
--- a/sys/amd64/include/sysarch.h
+++ b/sys/amd64/include/sysarch.h
@@ -16,6 +16,9 @@ struct init_ops {
void(*early_delay_init)(void);
void(*early_delay)(int);
void(*parse_memmap)(caddr_t, vm_paddr_t *, int *);
+#ifdef SMP
+   u_int   (*mp_bootaddress)(u_int);
+#endif
 };
 
 extern struct init_ops init_ops;
-- 
1.7.7.5 (Apple Git-26)

___
freebsd-current@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-current
To unsubscribe, send any mail to freebsd-current-unsubscr...@freebsd.org


[PATCH] xen-netback: fix compile errors introduced by r254804 and r254807

2013-08-26 Thread Roger Pau Monne
r254804 and r254807 changed the types of some of the members of the
mbuf struct, and introduced some compile time errors in netback
debug messages that prevented compiling a XENHVM kernel.

Cc: an...@freebsd.org
---
 sys/dev/xen/netback/netback.c |8 
 1 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/sys/dev/xen/netback/netback.c b/sys/dev/xen/netback/netback.c
index f18b791..16a54d9 100644
--- a/sys/dev/xen/netback/netback.c
+++ b/sys/dev/xen/netback/netback.c
@@ -585,16 +585,16 @@ xnb_dump_mbuf(const struct mbuf *m)
 
printf(xnb_dump_mbuf:\n);
if (m-m_flags  M_PKTHDR) {
-   printf(flowid=%10d, csum_flags=%#8x, csum_data=%#8x, 
+   printf(flowid=%10d, csum_flags=%b, csum_data=%#8x, 
   tso_segsz=%5hd\n,
-  m-m_pkthdr.flowid, m-m_pkthdr.csum_flags,
+  m-m_pkthdr.flowid, (int)m-m_pkthdr.csum_flags, 
CSUM_BITS,
   m-m_pkthdr.csum_data, m-m_pkthdr.tso_segsz);
printf(rcvif=%16p,  header=%18p, len=%19d\n,
-  m-m_pkthdr.rcvif, m-m_pkthdr.header, m-m_pkthdr.len);
+  m-m_pkthdr.rcvif, m-m_pkthdr.PH_loc.ptr, 
m-m_pkthdr.len);
}
printf(m_next=%16p, m_nextpk=%16p, m_data=%16p\n,
   m-m_next, m-m_nextpkt, m-m_data);
-   printf(m_len=%17d, m_flags=%#15x, m_type=%18hd\n,
+   printf(m_len=%17d, m_flags=%#15x, m_type=%u\n,
   m-m_len, m-m_flags, m-m_type);
 
len = m-m_len;
-- 
1.7.7.5 (Apple Git-26)

___
freebsd-current@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-current
To unsubscribe, send any mail to freebsd-current-unsubscr...@freebsd.org