Index: sys/arch/amd64/amd64/db_interface.c =================================================================== RCS file: /cvsroot/src/sys/arch/amd64/amd64/db_interface.c,v retrieving revision 1.15 diff -u -p -r1.15 db_interface.c --- sys/arch/amd64/amd64/db_interface.c 28 Nov 2007 16:28:43 -0000 1.15 +++ sys/arch/amd64/amd64/db_interface.c 21 Apr 2008 17:41:58 -0000 @@ -35,6 +35,7 @@ #include __KERNEL_RCSID(0, "$NetBSD: db_interface.c,v 1.15 2007/11/28 16:28:43 ad Exp $"); +#include "opt_xen.h" #include "opt_ddb.h" #include "opt_multiprocessor.h" @@ -99,10 +100,20 @@ db_machine_init(void) { #ifdef MULTIPROCESSOR + +#if !defined(XEN) ddb_vec = idt_vec_alloc(0xf0, 0xff); setgate((struct gate_descriptor *)&idt[ddb_vec], &Xintrddb, 1, SDT_SYS386IGT, SEL_KPL, GSEL(GCODE_SEL, SEL_KPL)); +#else + xen_idt[xen_idt_idx].vector = 0xf0; + xen_idt[xen_idt_idx].flags = SEL_KPL; + xen_idt[xen_idt_idx].cs = GSEL(GCODE_SEL, SEL_KPL); + xen_idt[xen_idt_idx].address = (unsigned long) &Xintrddb; + xen_idt_idx++; #endif + +#endif /* MULTIPROCESSOR */ } #ifdef MULTIPROCESSOR Index: sys/arch/amd64/amd64/ipifuncs.c =================================================================== RCS file: /cvsroot/src/sys/arch/amd64/amd64/ipifuncs.c,v retrieving revision 1.16 diff -u -p -r1.16 ipifuncs.c --- sys/arch/amd64/amd64/ipifuncs.c 15 Jan 2008 14:50:09 -0000 1.16 +++ sys/arch/amd64/amd64/ipifuncs.c 21 Apr 2008 17:41:58 -0000 @@ -46,6 +46,7 @@ __KERNEL_RCSID(0, "$NetBSD: ipifuncs.c,v * Interprocessor interrupt handlers. */ +#include "opt_xen.h" #include "opt_ddb.h" #include "opt_mtrr.h" @@ -87,6 +88,11 @@ void acpi_cpu_sleep(struct cpu_info *); #define acpi_cpu_sleep NULL #endif +#ifdef XEN +#define msr_write_ipi NULL +#define acpi_cpu_sleep NULL +#endif + void (*ipifunc[X86_NIPI])(struct cpu_info *) = { x86_64_ipi_halt, Index: sys/arch/amd64/amd64/locore.S =================================================================== RCS file: /cvsroot/src/sys/arch/amd64/amd64/locore.S,v retrieving revision 1.40 diff -u -p -r1.40 locore.S --- sys/arch/amd64/amd64/locore.S 11 Mar 2008 02:24:43 -0000 1.40 +++ sys/arch/amd64/amd64/locore.S 21 Apr 2008 17:41:58 -0000 @@ -189,9 +189,9 @@ #include #include -#if NLAPIC > 0 +//#if NLAPIC > 0 #include -#endif +//#endif /* XXX temporary kluge; these should not be here */ /* Get definitions for IOM_BEGIN, IOM_END, and IOM_SIZE */ @@ -224,7 +224,7 @@ */ .data -#if NLAPIC > 0 +//#if NLAPIC > 0 .align NBPG .globl _C_LABEL(local_apic), _C_LABEL(lapic_id), _C_LABEL(lapic_tpr) _C_LABEL(local_apic): @@ -238,7 +238,7 @@ _C_LABEL(lapic_ppr): .space LAPIC_ISR-LAPIC_PPRI _C_LABEL(lapic_isr): .space NBPG-LAPIC_ISR -#endif +//#endif .globl _C_LABEL(cpu_id),_C_LABEL(cpu_vendorname), _C_LABEL(cpu_brand_id) .globl _C_LABEL(cpuid_level),_C_LABEL(cpu_feature),_C_LABEL(cpu_feature2) Index: sys/arch/amd64/amd64/vector.S =================================================================== RCS file: /cvsroot/src/sys/arch/amd64/amd64/vector.S,v retrieving revision 1.19 diff -u -p -r1.19 vector.S --- sys/arch/amd64/amd64/vector.S 1 Jan 2008 19:49:06 -0000 1.19 +++ sys/arch/amd64/amd64/vector.S 21 Apr 2008 17:41:58 -0000 @@ -333,7 +333,7 @@ calltrap: #define XINTR(name,num) _Xintr_/**/name/**/num #endif -#if NLAPIC > 0 +//#if NLAPIC > 0 #ifdef MULTIPROCESSOR IDTVEC(recurse_lapic_ipi) INTR_RECURSE_HWFRAME @@ -377,7 +377,7 @@ IDTVEC(intrddb) movq %rax,%cr8 INTRFASTEXIT #endif /* DDB */ -#endif /* MULTIPROCESSOR */ +//#endif /* MULTIPROCESSOR */ /* * Interrupt from the local APIC timer. Index: sys/arch/amd64/conf/XEN3_DOM0 =================================================================== RCS file: /cvsroot/src/sys/arch/amd64/conf/XEN3_DOM0,v retrieving revision 1.14 diff -u -p -r1.14 XEN3_DOM0 --- sys/arch/amd64/conf/XEN3_DOM0 29 Mar 2008 01:14:25 -0000 1.14 +++ sys/arch/amd64/conf/XEN3_DOM0 21 Apr 2008 17:41:59 -0000 @@ -179,6 +179,8 @@ config netbsd root on ? type ? #config netbsd root on wd0a type ffs #config netbsd root on xennet0 type nfs +options MULTIPROCESSOR + mainbus0 at root cpu* at mainbus? Index: sys/arch/amd64/conf/XEN3_DOMU =================================================================== RCS file: /cvsroot/src/sys/arch/amd64/conf/XEN3_DOMU,v retrieving revision 1.8 diff -u -p -r1.8 XEN3_DOMU --- sys/arch/amd64/conf/XEN3_DOMU 27 Mar 2008 16:48:35 -0000 1.8 +++ sys/arch/amd64/conf/XEN3_DOMU 21 Apr 2008 17:41:59 -0000 @@ -150,6 +150,8 @@ config netbsd root on ? type ? #config netbsd root on wd0a type ffs #config netbsd root on xennet0 type nfs +options MULTIPROCESSOR + mainbus0 at root hypervisor* at mainbus? # Xen hypervisor Index: sys/arch/amd64/include/segments.h =================================================================== RCS file: /cvsroot/src/sys/arch/amd64/include/segments.h,v retrieving revision 1.18 diff -u -p -r1.18 segments.h --- sys/arch/amd64/include/segments.h 19 Apr 2008 12:10:08 -0000 1.18 +++ sys/arch/amd64/include/segments.h 21 Apr 2008 17:42:00 -0000 @@ -218,7 +218,8 @@ struct region_descriptor { extern struct sys_segment_descriptor *ldt; #endif #ifdef XEN -extern struct trap_info *idt; +extern struct trap_info *xen_idt; +extern int xen_idt_idx; #else extern struct gate_descriptor *idt; #endif Index: sys/arch/i386/conf/XEN3_DOM0 =================================================================== RCS file: /cvsroot/src/sys/arch/i386/conf/XEN3_DOM0,v retrieving revision 1.8 diff -u -p -r1.8 XEN3_DOM0 --- sys/arch/i386/conf/XEN3_DOM0 7 Jan 2008 08:39:07 -0000 1.8 +++ sys/arch/i386/conf/XEN3_DOM0 21 Apr 2008 17:42:02 -0000 @@ -6,6 +6,8 @@ include "arch/i386/conf/XEN2_DOM0" options XEN3 #Xen 3.x support +options MULTIPROCESSOR + # boot messages with MPBIOS, acpi and ioapic can be quite large options MSGBUFSIZE=24576 Index: sys/arch/i386/conf/XEN3_DOMU =================================================================== RCS file: /cvsroot/src/sys/arch/i386/conf/XEN3_DOMU,v retrieving revision 1.10 diff -u -p -r1.10 XEN3_DOMU --- sys/arch/i386/conf/XEN3_DOMU 11 Nov 2006 20:00:39 -0000 1.10 +++ sys/arch/i386/conf/XEN3_DOMU 21 Apr 2008 17:42:02 -0000 @@ -2,6 +2,8 @@ include "arch/i386/conf/XEN2_DOMU" +options MULTIPROCESSOR + options XEN3 #Xen 3.x support options XEN_COMPAT_030001 #compatible with Xen3 before 3.0.2 options MAXPHYS=32768 #xbd doesn't handle 64k transfers Index: sys/arch/i386/i386/db_interface.c =================================================================== RCS file: /cvsroot/src/sys/arch/i386/i386/db_interface.c,v retrieving revision 1.57 diff -u -p -r1.57 db_interface.c --- sys/arch/i386/i386/db_interface.c 4 Jan 2008 21:24:22 -0000 1.57 +++ sys/arch/i386/i386/db_interface.c 21 Apr 2008 17:42:02 -0000 @@ -35,6 +35,7 @@ #include __KERNEL_RCSID(0, "$NetBSD: db_interface.c,v 1.57 2008/01/04 21:24:22 xtraeme Exp $"); +#include "opt_xen.h" #include "opt_ddb.h" #include "opt_multiprocessor.h" @@ -98,13 +99,23 @@ typedef void (vector)(void); extern vector Xintrddbipi; void -db_machine_init() +db_machine_init(void) { #ifdef MULTIPROCESSOR + +#if !defined(XEN) ddb_vec = idt_vec_alloc(0xf0, 0xff); setgate((struct gate_descriptor *)&idt[ddb_vec], &Xintrddbipi, 0, SDT_SYS386IGT, SEL_KPL, GSEL(GCODE_SEL, SEL_KPL)); +#else + xen_idt[xen_idt_idx].vector = 0xf0; + xen_idt[xen_idt_idx].flags = SEL_KPL; + xen_idt[xen_idt_idx].cs = GSEL(GCODE_SEL, SEL_KPL); + xen_idt[xen_idt_idx].address = (unsigned long) &Xintrddbipi; + xen_idt_idx++; +#endif + #endif } Index: sys/arch/i386/i386/ipifuncs.c =================================================================== RCS file: /cvsroot/src/sys/arch/i386/i386/ipifuncs.c,v retrieving revision 1.24 diff -u -p -r1.24 ipifuncs.c --- sys/arch/i386/i386/ipifuncs.c 15 Jan 2008 14:50:08 -0000 1.24 +++ sys/arch/i386/i386/ipifuncs.c 21 Apr 2008 17:42:02 -0000 @@ -46,6 +46,7 @@ #include /* RCS ID & Copyright macro defns */ __KERNEL_RCSID(0, "$NetBSD: ipifuncs.c,v 1.24 2008/01/15 14:50:08 joerg Exp $"); +#include "opt_xen.h" #include "opt_ddb.h" #include "opt_mtrr.h" #include "npx.h" @@ -92,6 +93,11 @@ void acpi_cpu_sleep(struct cpu_info *); #define acpi_cpu_sleep NULL #endif +#ifdef XEN +#define msr_write_ipi NULL +#define acpi_cpu_sleep NULL +#endif + void (*ipifunc[X86_NIPI])(struct cpu_info *) = { i386_ipi_halt, Index: sys/arch/i386/i386/machdep.c =================================================================== RCS file: /cvsroot/src/sys/arch/i386/i386/machdep.c,v retrieving revision 1.628 diff -u -p -r1.628 machdep.c --- sys/arch/i386/i386/machdep.c 21 Apr 2008 15:15:33 -0000 1.628 +++ sys/arch/i386/i386/machdep.c 21 Apr 2008 17:42:03 -0000 @@ -1085,7 +1085,6 @@ extern vector IDTVEC(svr4_fasttrap); extern vector IDTVEC(mach_trap); #endif #ifdef XEN -#define MAX_XEN_IDT 128 trap_info_t xen_idt[MAX_XEN_IDT]; int xen_idt_idx; #endif Index: sys/arch/i386/include/segments.h =================================================================== RCS file: /cvsroot/src/sys/arch/i386/include/segments.h,v retrieving revision 1.49 diff -u -p -r1.49 segments.h --- sys/arch/i386/include/segments.h 19 Apr 2008 12:10:08 -0000 1.49 +++ sys/arch/i386/include/segments.h 21 Apr 2008 17:42:03 -0000 @@ -187,8 +187,16 @@ struct region_descriptor { #endif #ifdef _KERNEL -extern union descriptor *gdt, *ldt; +#ifdef XEN +#include + +#define MAX_XEN_IDT 128 +extern trap_info_t xen_idt[MAX_XEN_IDT]; +extern int xen_idt_idx; +#else extern struct gate_descriptor *idt; +#endif +extern union descriptor *gdt, *ldt; void setgate(struct gate_descriptor *, void *, int, int, int, int); void setregion(struct region_descriptor *, void *, size_t); Index: sys/arch/x86/include/i82489var.h =================================================================== RCS file: /cvsroot/src/sys/arch/x86/include/i82489var.h,v retrieving revision 1.11 diff -u -p -r1.11 i82489var.h --- sys/arch/x86/include/i82489var.h 14 Apr 2008 05:52:34 -0000 1.11 +++ sys/arch/x86/include/i82489var.h 21 Apr 2008 17:42:09 -0000 @@ -43,14 +43,17 @@ * Software definitions belonging to Local APIC driver. */ +#ifndef _LAPIC_CUSTOM_RW static __inline uint32_t i82489_readreg(int); static __inline void i82489_writereg(int, uint32_t); +#endif #ifdef _KERNEL extern volatile uint32_t local_apic[]; extern volatile uint32_t lapic_tpr; #endif +#ifndef _LAPIC_CUSTOM_RW static __inline uint32_t i82489_readreg(int reg) { @@ -65,6 +68,7 @@ i82489_writereg(int reg, uint32_t val) } #define lapic_cpu_number() (i82489_readreg(LAPIC_ID) >> LAPIC_ID_SHIFT) +#endif /* * "spurious interrupt vector"; vector used by interrupt which was Index: sys/arch/xen/conf/files.xen =================================================================== RCS file: /cvsroot/src/sys/arch/xen/conf/files.xen,v retrieving revision 1.83 diff -u -p -r1.83 files.xen --- sys/arch/xen/conf/files.xen 27 Feb 2008 04:19:24 -0000 1.83 +++ sys/arch/xen/conf/files.xen 21 Apr 2008 17:42:09 -0000 @@ -260,9 +260,12 @@ file arch/i386/pci/pci_bus_fixup.c pci_b file arch/i386/pci/pci_addr_fixup.c pci_addr_fixup endif -file arch/x86/x86/apic.c ioapic +file arch/x86/x86/apic.c ioapic | lapic -device ioapic +define lapic +file arch/xen/x86/lapic.c lapic needs-flag + +device ioapic: lapic attach ioapic at ioapicbus file arch/x86/x86/ioapic.c ioapic needs-flag Index: sys/arch/xen/include/i82489var.h =================================================================== RCS file: /cvsroot/src/sys/arch/xen/include/i82489var.h,v retrieving revision 1.1 diff -u -p -r1.1 i82489var.h --- sys/arch/xen/include/i82489var.h 28 Sep 2006 18:53:15 -0000 1.1 +++ sys/arch/xen/include/i82489var.h 21 Apr 2008 17:42:09 -0000 @@ -1,5 +1,39 @@ -/* $NetBSD: i82489var.h,v 1.1 2006/09/28 18:53:15 bouyer Exp $ */ +/* $NetBSD: i82489var.h,v 1.1 2006/09/28 18:53:15 bouyer Exp $ */ +#include "opt_xen.h" +#define _LAPIC_CUSTOM_RW #include +#include + #undef lapic_cpu_number -#define lapic_cpu_number() (0) + +#ifdef XEN3 + +uint32_t lapic_cpu_number(void); + +static inline uint32_t +acpi_cpu_number(void) +{ +#ifdef VCPUOP_get_physid + struct vcpu_get_physid cpu_id; + int ret; + + ret = HYPERVISOR_vcpu_op(VCPUOP_get_physid, 0, &cpu_id); + if (ret != 0) { + return 0; + } + + return xen_vcpu_physid_to_x86_acpiid(cpu_id.phys_id); +#else + printf("%s: WARNING: Xen 3.2.x or newer required to determine ACPI ID\n", + __func__); + return 0; +#endif +} + +#else + +/* Xen2 */ +#define lapic_cpu_number() (0) + +#endif Index: sys/arch/xen/include/intr.h =================================================================== RCS file: /cvsroot/src/sys/arch/xen/include/intr.h,v retrieving revision 1.25 diff -u -p -r1.25 intr.h --- sys/arch/xen/include/intr.h 19 Apr 2008 13:46:12 -0000 1.25 +++ sys/arch/xen/include/intr.h 21 Apr 2008 17:42:09 -0000 @@ -191,6 +191,13 @@ int intr_find_mpmapping(int, int, struct struct pic *intr_findpic(int); void intr_add_pcibus(struct pcibus_attach_args *); +int x86_send_ipi(struct cpu_info *, int); +void x86_broadcast_ipi(int); +void x86_multicast_ipi(int, int); +void x86_ipi_handler(void); + +extern void (*ipifunc[X86_NIPI])(struct cpu_info *); + #endif /* !_LOCORE */ #endif /* _XEN_INTR_H_ */ Index: sys/arch/xen/x86/cpu.c =================================================================== RCS file: /cvsroot/src/sys/arch/xen/x86/cpu.c,v retrieving revision 1.16 diff -u -p -r1.16 cpu.c --- sys/arch/xen/x86/cpu.c 21 Apr 2008 15:15:34 -0000 1.16 +++ sys/arch/xen/x86/cpu.c 21 Apr 2008 17:42:09 -0000 @@ -110,11 +110,11 @@ __KERNEL_RCSID(0, "$NetBSD: cpu.c,v 1.16 #include #endif -#if NLAPIC > 0 +//#if NLAPIC > 0 #include #include #include -#endif +//#endif #include #include @@ -713,7 +713,9 @@ cpu_hatch(void *v) KASSERT((ci->ci_flags & CPUF_RUNNING) == 0); +#ifndef __x86_64__ lcr3(pmap_kernel()->pm_pdirpa); +#endif curlwp->l_addr->u_pcb.pcb_cr3 = pmap_kernel()->pm_pdirpa; lcr0(ci->ci_data.cpu_idlelwp->l_addr->u_pcb.pcb_cr0); cpu_init_idt(); @@ -728,7 +730,9 @@ cpu_hatch(void *v) fpuinit(ci); #endif +#ifndef __x86_64__ lldt(GSEL(GLDT_SEL, SEL_KPL)); +#endif ltr(ci->ci_tss_sel); cpu_init(ci); @@ -851,6 +855,7 @@ cpu_set_tss_gates(struct cpu_info *ci) GSEL(GTRAPTSS_SEL, SEL_KPL)); #endif +#if 0 #if defined(DDB) && defined(MULTIPROCESSOR) /* * Set up separate handler for the DDB IPI, so that it doesn't @@ -868,9 +873,11 @@ cpu_set_tss_gates(struct cpu_info *ci) SDT_SYS386TSS, SEL_KPL, 0, 0); ci->ci_gdt[GIPITSS_SEL].sd = sd; - setgate(&idt[ddb_vec], NULL, 0, SDT_SYSTASKGT, SEL_KPL, + setgate(&xen_idt[ddb_vec], NULL, 0, SDT_SYSTASKGT, SEL_KPL, GSEL(GIPITSS_SEL, SEL_KPL)); #endif + +#endif /* 0 */ } #else static void