From owner-svn-src-projects@FreeBSD.ORG Sat May 14 20:35:02 2011 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 974E41065676; Sat, 14 May 2011 20:35:02 +0000 (UTC) (envelope-from jhb@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 7E7FA8FC18; Sat, 14 May 2011 20:35:02 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id p4EKZ2IB014686; Sat, 14 May 2011 20:35:02 GMT (envelope-from jhb@svn.freebsd.org) Received: (from jhb@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p4EKZ2lm014664; Sat, 14 May 2011 20:35:02 GMT (envelope-from jhb@svn.freebsd.org) Message-Id: <201105142035.p4EKZ2lm014664@svn.freebsd.org> From: John Baldwin Date: Sat, 14 May 2011 20:35:02 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r221914 - in projects/bhyve/sys: amd64/amd64 amd64/conf amd64/include amd64/vmm amd64/vmm/io conf dev/blackhole dev/bvm kern modules modules/blackhole modules/vmm x86/include x86/x86 X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 14 May 2011 20:35:02 -0000 Author: jhb Date: Sat May 14 20:35:01 2011 New Revision: 221914 URL: http://svn.freebsd.org/changeset/base/221914 Log: First cut at porting the kernel portions of 221828 and 221905 from the BHyVe reference branch to HEAD. Added: projects/bhyve/sys/amd64/include/vmm.h - copied unchanged from r221828, projects/bhyve_ref/sys/amd64/include/vmm.h projects/bhyve/sys/amd64/include/vmm_dev.h - copied unchanged from r221828, projects/bhyve_ref/sys/amd64/include/vmm_dev.h projects/bhyve/sys/amd64/vmm/ - copied from r221828, projects/bhyve_ref/sys/amd64/vmm/ projects/bhyve/sys/dev/blackhole/ - copied from r221905, projects/bhyve_ref/sys/dev/blackhole/ projects/bhyve/sys/dev/bvm/ - copied from r221905, projects/bhyve_ref/sys/dev/bvm/ projects/bhyve/sys/modules/blackhole/ - copied from r221905, projects/bhyve_ref/sys/modules/blackhole/ projects/bhyve/sys/modules/vmm/ - copied from r221828, projects/bhyve_ref/sys/modules/vmm/ Modified: projects/bhyve/sys/amd64/amd64/apic_vector.S projects/bhyve/sys/amd64/amd64/intr_machdep.c projects/bhyve/sys/amd64/amd64/minidump_machdep.c projects/bhyve/sys/amd64/amd64/mp_machdep.c projects/bhyve/sys/amd64/amd64/vm_machdep.c projects/bhyve/sys/amd64/conf/GENERIC projects/bhyve/sys/amd64/include/specialreg.h projects/bhyve/sys/amd64/vmm/io/ppt.c projects/bhyve/sys/amd64/vmm/io/vlapic.c projects/bhyve/sys/amd64/vmm/vmm.c projects/bhyve/sys/amd64/vmm/vmm_dev.c projects/bhyve/sys/amd64/vmm/vmm_ipi.c projects/bhyve/sys/amd64/vmm/vmm_msr.c projects/bhyve/sys/conf/files.amd64 projects/bhyve/sys/conf/options.amd64 projects/bhyve/sys/kern/subr_bus.c projects/bhyve/sys/modules/Makefile projects/bhyve/sys/modules/vmm/Makefile projects/bhyve/sys/x86/include/bus.h projects/bhyve/sys/x86/x86/local_apic.c Modified: projects/bhyve/sys/amd64/amd64/apic_vector.S ============================================================================== --- projects/bhyve/sys/amd64/amd64/apic_vector.S Sat May 14 20:31:04 2011 (r221913) +++ projects/bhyve/sys/amd64/amd64/apic_vector.S Sat May 14 20:35:01 2011 (r221914) @@ -57,8 +57,15 @@ IDTVEC(vec_name) ; \ PUSH_FRAME ; \ FAKE_MCOUNT(TF_RIP(%rsp)) ; \ movq lapic, %rdx ; /* pointer to local APIC */ \ + testq %rdx, %rdx; \ + jnz 3f; \ + movl $MSR_APIC_ISR ## index, %ecx; \ + rdmsr; \ + jmp 4f; \ +3: ; \ movl LA_ISR + 16 * (index)(%rdx), %eax ; /* load ISR */ \ - bsrl %eax, %eax ; /* index of highest set bit in ISR */ \ +4: ; \ + bsrl %eax, %eax ; /* index of highset set bit in ISR */ \ jz 1f ; \ addl $(32 * index),%eax ; \ movq %rsp, %rsi ; \ @@ -129,6 +136,26 @@ IDTVEC(errorint) jmp doreti #ifdef SMP + +/* + * We assume that %rax is being saved/restored outside of this macro + */ +#define DO_EOI \ + movq lapic, %rax; \ + testq %rax, %rax; \ + jz 8f; \ + movl $0, LA_EOI(%rax); \ + jmp 9f; \ +8:; \ + pushq %rcx; \ + pushq %rdx; \ + xorl %edx, %edx; /* eax is already zero */ \ + movl $MSR_APIC_EOI, %ecx; \ + wrmsr; \ + popq %rdx; \ + popq %rcx; \ +9: + /* * Global address space TLB shootdown. */ @@ -153,8 +180,7 @@ IDTVEC(invltlb) movq %cr3, %rax /* invalidate the TLB */ movq %rax, %cr3 - movq lapic, %rax - movl $0, LA_EOI(%rax) /* End Of Interrupt to APIC */ + DO_EOI lock incl smp_tlb_wait @@ -186,8 +212,7 @@ IDTVEC(invlpg) movq smp_tlb_addr1, %rax invlpg (%rax) /* invalidate single page */ - movq lapic, %rax - movl $0, LA_EOI(%rax) /* End Of Interrupt to APIC */ + DO_EOI lock incl smp_tlb_wait @@ -224,8 +249,7 @@ IDTVEC(invlrng) cmpq %rax, %rdx jb 1b - movq lapic, %rax - movl $0, LA_EOI(%rax) /* End Of Interrupt to APIC */ + DO_EOI lock incl smp_tlb_wait @@ -252,8 +276,7 @@ IDTVEC(invlcache) wbinvd - movq lapic, %rax - movl $0, LA_EOI(%rax) /* End Of Interrupt to APIC */ + DO_EOI lock incl smp_tlb_wait @@ -269,9 +292,8 @@ IDTVEC(invlcache) IDTVEC(ipi_intr_bitmap_handler) PUSH_FRAME - movq lapic, %rdx - movl $0, LA_EOI(%rdx) /* End Of Interrupt to APIC */ - + DO_EOI + FAKE_MCOUNT(TF_RIP(%rsp)) call ipi_bitmap_handler @@ -286,8 +308,7 @@ IDTVEC(ipi_intr_bitmap_handler) IDTVEC(cpustop) PUSH_FRAME - movq lapic, %rax - movl $0, LA_EOI(%rax) /* End Of Interrupt to APIC */ + DO_EOI call cpustop_handler jmp doreti @@ -300,8 +321,7 @@ IDTVEC(cpustop) IDTVEC(cpususpend) PUSH_FRAME - movq lapic, %rax - movl $0, LA_EOI(%rax) /* End Of Interrupt to APIC */ + DO_EOI call cpususpend_handler @@ -323,7 +343,6 @@ IDTVEC(rendezvous) incq (%rax) #endif call smp_rendezvous_action - movq lapic, %rax - movl $0, LA_EOI(%rax) /* End Of Interrupt to APIC */ + DO_EOI jmp doreti #endif /* SMP */ Modified: projects/bhyve/sys/amd64/amd64/intr_machdep.c ============================================================================== --- projects/bhyve/sys/amd64/amd64/intr_machdep.c Sat May 14 20:31:04 2011 (r221913) +++ projects/bhyve/sys/amd64/amd64/intr_machdep.c Sat May 14 20:35:01 2011 (r221914) @@ -78,6 +78,8 @@ static STAILQ_HEAD(, pic) pics; #ifdef SMP static int assign_cpu; +static int round_robin_interrupts = 1; +TUNABLE_INT("round_robin_interrupts", &round_robin_interrupts); #endif static int intr_assign_cpu(void *arg, u_char cpu); @@ -460,6 +462,10 @@ intr_next_cpu(void) if (!assign_cpu) return (PCPU_GET(apic_id)); + /* All interrupts go to the BSP if not allowed to round robin */ + if (!round_robin_interrupts) + return (cpu_apic_ids[0]); + mtx_lock_spin(&icu_lock); apic_id = cpu_apic_ids[current_cpu]; do { Modified: projects/bhyve/sys/amd64/amd64/minidump_machdep.c ============================================================================== --- projects/bhyve/sys/amd64/amd64/minidump_machdep.c Sat May 14 20:31:04 2011 (r221913) +++ projects/bhyve/sys/amd64/amd64/minidump_machdep.c Sat May 14 20:35:01 2011 (r221914) @@ -27,6 +27,7 @@ #include __FBSDID("$FreeBSD$"); +#include "opt_pmap.h" #include "opt_watchdog.h" #include Modified: projects/bhyve/sys/amd64/amd64/mp_machdep.c ============================================================================== --- projects/bhyve/sys/amd64/amd64/mp_machdep.c Sat May 14 20:31:04 2011 (r221913) +++ projects/bhyve/sys/amd64/amd64/mp_machdep.c Sat May 14 20:35:01 2011 (r221914) @@ -146,6 +146,26 @@ struct cpu_info { int cpu_apic_ids[MAXCPU]; int apic_cpuids[MAX_APIC_ID + 1]; +/* + * Trampoline for hypervisor direct 64-bit jump. + * + * 0 - signature for guest->host verification + * 8 - virtual address of this page + * 16 - instruction virtual address + * 24 - stack pointer virtual address + * 32 - CR3, physical address of kernel page table + * 40 - 24-byte area for null/code/data GDT entries + */ +#define MP_V64T_SIG 0xcafebabecafebabeULL +struct mp_v64tramp { + uint64_t mt_sig; + uint64_t mt_virt; + uint64_t mt_eip; + uint64_t mt_rsp; + uint64_t mt_cr3; + uint64_t mt_gdtr[3]; +}; + /* Holds pending bitmap based IPIs per CPU */ static volatile u_int cpu_ipi_pending[MAXCPU]; @@ -948,6 +968,29 @@ start_all_aps(void) bootSTK = (char *)bootstacks[cpu] + KSTACK_PAGES * PAGE_SIZE - 8; bootAP = cpu; + /* + * If running in a VM that doesn't support the unrestricted + * guest 16-bit mode, forget most of the above and create + * the data block that allows the hypervisor to direct-jump + * into 64-bit mode. Copy this over the top of the 16-bit + * bootstrap. The startup-IPI informs the hypervisor which + * physical page this data block lies in. The hypervisor + * will then use the block to initialise register state of + * the AP in an almost identical fashion to how it builds + * the BSP initial register state. + */ + if (testenv("hw.use_bvm_mptramp")) { + struct mp_v64tramp mv; + + bzero(&mv, sizeof(mv)); + mv.mt_sig = MP_V64T_SIG; + mv.mt_virt = (uint64_t) va; + mv.mt_eip = (uint64_t) init_secondary; + mv.mt_rsp = (uint64_t) bootSTK; + mv.mt_cr3 = KPML4phys; + bcopy(&mv, (void *) va, sizeof(mv)); + } + /* attempt to start the Application Processor */ if (!start_ap(apic_id)) { /* restore the warmstart vector */ Modified: projects/bhyve/sys/amd64/amd64/vm_machdep.c ============================================================================== --- projects/bhyve/sys/amd64/amd64/vm_machdep.c Sat May 14 20:31:04 2011 (r221913) +++ projects/bhyve/sys/amd64/amd64/vm_machdep.c Sat May 14 20:35:01 2011 (r221914) @@ -514,8 +514,10 @@ cpu_reset_proxy() { cpu_reset_proxy_active = 1; - while (cpu_reset_proxy_active == 1) + while (cpu_reset_proxy_active == 1) { + ia32_pause(); ; /* Wait for other cpu to see that we've started */ + } stop_cpus((1<msi.arg[i].msg = i; error = bus_setup_intr(ppt->dev, ppt->msi.res[i], - INTR_TYPE_NET | INTR_MPSAFE | INTR_FAST, + INTR_TYPE_NET | INTR_MPSAFE, pptintr, NULL, &ppt->msi.arg[i], &ppt->msi.cookie[i]); if (error != 0) Modified: projects/bhyve/sys/amd64/vmm/io/vlapic.c ============================================================================== --- projects/bhyve_ref/sys/amd64/vmm/io/vlapic.c Fri May 13 04:54:01 2011 (r221828) +++ projects/bhyve/sys/amd64/vmm/io/vlapic.c Sat May 14 20:35:01 2011 (r221914) @@ -63,7 +63,7 @@ __FBSDID("$FreeBSD$"); #include #include -#include +#include #include Modified: projects/bhyve/sys/amd64/vmm/vmm.c ============================================================================== --- projects/bhyve_ref/sys/amd64/vmm/vmm.c Fri May 13 04:54:01 2011 (r221828) +++ projects/bhyve/sys/amd64/vmm/vmm.c Sat May 14 20:35:01 2011 (r221914) @@ -46,7 +46,7 @@ __FBSDID("$FreeBSD$"); #include #include -#include +#include #include #include "vmm_mem.h" @@ -160,7 +160,8 @@ vcpu_init(struct vm *vm, uint32_t vcpu_i vcpu->hostcpu = -1; vcpu->vcpuid = vcpu_id; vcpu->vlapic = vlapic_init(vm, vcpu_id); - fpugetregs(curthread, &vcpu->savefpu); + fpugetregs(curthread); + vcpu->savefpu = curthread->td_pcb->pcb_user_save; vcpu->stats = vmm_stat_alloc(); } @@ -545,7 +546,7 @@ vm_run(struct vm *vm, struct vm_run *vmr tscval = rdtsc(); pcb = PCPU_GET(curpcb); - pcb->pcb_full_iret = 1; + set_pcb_flags(pcb, PCB_FULL_IRET); vcpu->hostcpu = curcpu; Modified: projects/bhyve/sys/amd64/vmm/vmm_dev.c ============================================================================== --- projects/bhyve_ref/sys/amd64/vmm/vmm_dev.c Fri May 13 04:54:01 2011 (r221828) +++ projects/bhyve/sys/amd64/vmm/vmm_dev.c Sat May 14 20:35:01 2011 (r221914) @@ -336,7 +336,8 @@ done: } static int -vmmdev_mmap(struct cdev *cdev, vm_offset_t offset, vm_paddr_t *paddr, int nprot) +vmmdev_mmap(struct cdev *cdev, vm_ooffset_t offset, vm_paddr_t *paddr, + int nprot, vm_memattr_t *memattr) { int error; struct vmmdev_softc *sc; Modified: projects/bhyve/sys/amd64/vmm/vmm_ipi.c ============================================================================== --- projects/bhyve_ref/sys/amd64/vmm/vmm_ipi.c Fri May 13 04:54:01 2011 (r221828) +++ projects/bhyve/sys/amd64/vmm/vmm_ipi.c Sat May 14 20:35:01 2011 (r221914) @@ -99,5 +99,5 @@ vm_interrupt_hostcpu(struct vm *vm, int int hostcpu; if (vcpu_is_running(vm, vcpu, &hostcpu) && hostcpu != curcpu) - ipi_selected((cpumask_t)1 << hostcpu, ipinum); + ipi_cpu(hostcpu, ipinum); } Modified: projects/bhyve/sys/amd64/vmm/vmm_msr.c ============================================================================== --- projects/bhyve_ref/sys/amd64/vmm/vmm_msr.c Fri May 13 04:54:01 2011 (r221828) +++ projects/bhyve/sys/amd64/vmm/vmm_msr.c Sat May 14 20:35:01 2011 (r221914) @@ -33,7 +33,7 @@ __FBSDID("$FreeBSD$"); #include #include -#include +#include #include #include "vmm_lapic.h" Modified: projects/bhyve/sys/conf/files.amd64 ============================================================================== --- projects/bhyve/sys/conf/files.amd64 Sat May 14 20:31:04 2011 (r221913) +++ projects/bhyve/sys/conf/files.amd64 Sat May 14 20:35:01 2011 (r221914) @@ -295,6 +295,11 @@ libkern/memset.c standard compat/x86bios/x86bios.c optional x86bios | atkbd | dpms | vesa contrib/x86emu/x86emu.c optional x86bios | atkbd | dpms | vesa # +# bvm console +# +dev/bvm/bvm_console.c optional bvmconsole +dev/bvm/bvm_dbg.c optional bvmdebug +# # x86 shared code between IA32, AMD64 and PC98 architectures # x86/acpica/OsdEnvironment.c optional acpi Modified: projects/bhyve/sys/conf/options.amd64 ============================================================================== --- projects/bhyve/sys/conf/options.amd64 Sat May 14 20:31:04 2011 (r221913) +++ projects/bhyve/sys/conf/options.amd64 Sat May 14 20:35:01 2011 (r221914) @@ -10,6 +10,7 @@ PERFMON PMAP_SHPGPERPROC opt_pmap.h MPTABLE_FORCE_HTT MP_WATCHDOG +NKPT opt_pmap.h # Options for emulators. These should only be used at config time, so # they are handled like options for static filesystems Modified: projects/bhyve/sys/kern/subr_bus.c ============================================================================== --- projects/bhyve/sys/kern/subr_bus.c Sat May 14 20:31:04 2011 (r221913) +++ projects/bhyve/sys/kern/subr_bus.c Sat May 14 20:35:01 2011 (r221914) @@ -2683,7 +2683,7 @@ device_attach(device_t dev) printf("device_attach: %s%d attach returned %d\n", dev->driver->name, dev->unit, error); /* Unset the class; set in device_probe_child */ - if (dev->devclass == NULL) + if ((dev->flags & DF_FIXEDCLASS) == 0) device_set_devclass(dev, NULL); device_set_driver(dev, NULL); device_sysctl_fini(dev); Modified: projects/bhyve/sys/modules/Makefile ============================================================================== --- projects/bhyve/sys/modules/Makefile Sat May 14 20:31:04 2011 (r221913) +++ projects/bhyve/sys/modules/Makefile Sat May 14 20:35:01 2011 (r221914) @@ -43,6 +43,7 @@ SUBDIR= ${_3dfx} \ ${_bxe} \ ${_bios} \ ${_bktr} \ + ${_blackhole} \ ${_bm} \ bridgestp \ bwi \ @@ -311,6 +312,7 @@ SUBDIR= ${_3dfx} \ ${_vesa} \ vge \ vkbd \ + ${_vmm} \ ${_vpo} \ vr \ vte \ @@ -541,6 +543,7 @@ _amdsbwd= amdsbwd _amdtemp= amdtemp _arcmsr= arcmsr _asmc= asmc +_blackhole= blackhole _bxe= bxe _cardbus= cardbus _cbb= cbb @@ -617,6 +620,7 @@ _sppp= sppp _tpm= tpm _twa= twa _vesa= vesa +_vmm= vmm _x86bios= x86bios _wi= wi _wpi= wpi Modified: projects/bhyve/sys/modules/vmm/Makefile ============================================================================== --- projects/bhyve_ref/sys/modules/vmm/Makefile Fri May 13 04:54:01 2011 (r221828) +++ projects/bhyve/sys/modules/vmm/Makefile Sat May 14 20:35:01 2011 (r221914) @@ -9,7 +9,7 @@ KMOD= vmm SRCS= device_if.h bus_if.h pci_if.h -CFLAGS+= -DVMM_KEEP_STATS +CFLAGS+= -DVMM_KEEP_STATS -DSMP CFLAGS+= -DOLD_BINUTILS CFLAGS+= -I${.CURDIR}/../../amd64/vmm CFLAGS+= -I${.CURDIR}/../../amd64/vmm/io @@ -60,7 +60,7 @@ vmx_support.o: vmx_support.S vmx_assym.s ${CC} -c -x assembler-with-cpp -DLOCORE ${CFLAGS} \ ${.IMPSRC} -o ${.TARGET} -vmx_genassym.o: vmx_genassym.c @ machine +vmx_genassym.o: vmx_genassym.c @ machine x86 ${CC} -c ${CFLAGS:N-fno-common} ${.IMPSRC} .include Modified: projects/bhyve/sys/x86/include/bus.h ============================================================================== --- projects/bhyve/sys/x86/include/bus.h Sat May 14 20:31:04 2011 (r221913) +++ projects/bhyve/sys/x86/include/bus.h Sat May 14 20:35:01 2011 (r221914) @@ -279,9 +279,13 @@ bus_space_read_multi_1(bus_space_tag_t t bus_size_t offset, u_int8_t *addr, size_t count) { - if (tag == X86_BUS_SPACE_IO) - insb(bsh + offset, addr, count); - else { + if (tag == X86_BUS_SPACE_IO) { + while (count > 0) { + *addr = inb(bsh + offset); + count--; + addr++; + } + } else { #ifdef __GNUCLIKE_ASM __asm __volatile(" \n\ cld \n\ @@ -300,9 +304,13 @@ bus_space_read_multi_2(bus_space_tag_t t bus_size_t offset, u_int16_t *addr, size_t count) { - if (tag == X86_BUS_SPACE_IO) - insw(bsh + offset, addr, count); - else { + if (tag == X86_BUS_SPACE_IO) { + while (count > 0) { + *addr = inw(bsh + offset); + count--; + addr++; + } + } else { #ifdef __GNUCLIKE_ASM __asm __volatile(" \n\ cld \n\ @@ -321,9 +329,13 @@ bus_space_read_multi_4(bus_space_tag_t t bus_size_t offset, u_int32_t *addr, size_t count) { - if (tag == X86_BUS_SPACE_IO) - insl(bsh + offset, addr, count); - else { + if (tag == X86_BUS_SPACE_IO) { + while (count > 0) { *** DIFF OUTPUT TRUNCATED AT 1000 LINES ***