diff options
author | gibbs <gibbs@FreeBSD.org> | 2013-09-20 22:59:22 +0000 |
---|---|---|
committer | gibbs <gibbs@FreeBSD.org> | 2013-09-20 22:59:22 +0000 |
commit | 7ed30adae7eb0c6e156983ca0c96c04e1e6a8e0d (patch) | |
tree | 301b6e7f4ff8cd017faecbcf64de6922be093a7e /sys/i386/i386 | |
parent | ec391855a94cc7ab44ba6ba5b3d8d27a5a1c224d (diff) | |
download | FreeBSD-src-7ed30adae7eb0c6e156983ca0c96c04e1e6a8e0d.zip FreeBSD-src-7ed30adae7eb0c6e156983ca0c96c04e1e6a8e0d.tar.gz |
Merge Xen PVHVM support into the GENERIC kernel config for both
amd64 and i386.
Submitted by: Roger Pau Monné
Sponsored by: Citrix Systems R&D
Reviewed by: gibbs
Approved by: re (blanket Xen)
MFC after: 2 weeks
sys/amd64/amd64/mp_machdep.c:
sys/amd64/include/cpu.h:
sys/i386/i386/mp_machdep.c:
sys/i386/include/cpu.h:
- Introduce two new CPU hooks for initialization and resume
purposes. This allows us to get rid of the XENHVM ifdefs in
mp_machdep, and also sets some hooks into common code that can be
used by other hypervisor implementations.
sys/amd64/conf/XENHVM:
sys/i386/conf/XENHVM:
- Remove these configs now that GENERIC has builtin support for Xen
HVM.
sys/kern/subr_smp.c:
- Make sure there are no pending IPIs when suspending a system.
sys/x86/xen/hvm.c:
- Add cpu init and resume vectors that are called from mp_machdep
using the new hooks.
- Only clear the vcpu_info mapping data on resume. It is already
clear for the BSP on a cold boot and is set correctly as APs
are started.
- Gate xen_hvm_init_cpu only to systems running under Xen.
sys/x86/xen/xen_intr.c:
- Gate the setup of event channels only to systems running under Xen.
Diffstat (limited to 'sys/i386/i386')
-rw-r--r-- | sys/i386/i386/mp_machdep.c | 28 |
1 files changed, 6 insertions, 22 deletions
diff --git a/sys/i386/i386/mp_machdep.c b/sys/i386/i386/mp_machdep.c index 1d6d58a..8ee8653 100644 --- a/sys/i386/i386/mp_machdep.c +++ b/sys/i386/i386/mp_machdep.c @@ -83,10 +83,6 @@ __FBSDID("$FreeBSD$"); #include <machine/specialreg.h> #include <machine/cpu.h> -#ifdef XENHVM -#include <xen/hvm.h> -#endif - #define WARMBOOT_TARGET 0 #define WARMBOOT_OFF (KERNBASE + 0x0467) #define WARMBOOT_SEG (KERNBASE + 0x0469) @@ -202,7 +198,7 @@ int cpu_apic_ids[MAXCPU]; int apic_cpuids[MAX_APIC_ID + 1]; /* Holds pending bitmap based IPIs per CPU */ -static volatile u_int cpu_ipi_pending[MAXCPU]; +volatile u_int cpu_ipi_pending[MAXCPU]; static u_int boot_address; static int cpu_logical; /* logical cpus per core */ @@ -757,10 +753,8 @@ init_secondary(void) /* set up SSE registers */ enable_sse(); -#ifdef XENHVM - /* register vcpu_info area */ - xen_hvm_init_cpu(); -#endif + if (cpu_ops.cpu_init) + cpu_ops.cpu_init(); #ifdef PAE /* Enable the PTE no-execute bit. */ @@ -1527,12 +1521,9 @@ cpususpend_handler(void) { u_int cpu; - cpu = PCPU_GET(cpuid); - -#ifdef XENHVM mtx_assert(&smp_ipi_mtx, MA_NOTOWNED); -#endif + cpu = PCPU_GET(cpuid); if (savectx(susppcbs[cpu])) { wbinvd(); CPU_SET_ATOMIC(cpu, &suspended_cpus); @@ -1549,15 +1540,8 @@ cpususpend_handler(void) while (!CPU_ISSET(cpu, &started_cpus)) ia32_pause(); -#ifdef XENHVM - /* - * Reset pending bitmap IPIs, because Xen doesn't preserve pending - * event channels on migration. - */ - cpu_ipi_pending[cpu] = 0; - /* register vcpu_info area */ - xen_hvm_init_cpu(); -#endif + if (cpu_ops.cpu_resume) + cpu_ops.cpu_resume(); /* Resume MCA and local APIC */ mca_resume(); |