φ(・・*)ゞ ウーン
vmm.cのコンパイル出来ました。今日のdiffはこちら。
毎回忘れるので先にメモっておくと、FreeBSDのスレッド構造体(struct thread)はsys/proc.hで定義されてるφ(・ω・ )かきかき
今日弄ったところはvmm.cのvm_set_pinning()でスレッドをcpuにバインドしているところです。似たようなことをBHyVeビルドめも10で調べてたのでそれを思い出しつつやってみました。多分ホスト側のcpuにピンしたりの部分はそもそも動いているスレッドが他のcpuに勝手に行くことはないだろうというところで、sched_bind()等の処理をザクッと消して仮想cpuとホストのcpuがなんとなく紐付く程度にしてみました。
--- a/sys/platform/pc64/vmm/vmm.c +++ b/sys/platform/pc64/vmm/vmm.c @@ -469,6 +469,7 @@ vm_get_pinning(struct vm *vm, int vcpuid, int *cpuid) int vm_set_pinning(struct vm *vm, int vcpuid, int host_cpuid) { +#if 0 struct thread *td; if (vcpuid < 0 || vcpuid >= VM_MAXCPU) @@ -498,6 +499,15 @@ vm_set_pinning(struct vm *vm, int vcpuid, int host_cpuid) VCPU_PIN(vm, vcpuid, host_cpuid); return (0); +#else + if (host_cpuid < 0) { + VCPU_UNPIN(vm, vcpuid); + return (0); + } + + VCPU_PIN(vm, vcpuid, host_cpuid); + return (0); +#endif }
もう一個の修正はホントに単純なものでcurcpuでカレントcpuのidにアクセスするところをmycpuidに変えただけです。
@@ -540,7 +550,7 @@ vm_run(struct vm *vm, struct vm_run *vmrun) pcb = curthread->td_pcb; set_pcb_flags(pcb, PCB_FULL_IRET); - vcpu->hostcpu = curcpu; + vcpu->hostcpu = mycpuid; restore_guest_msrs(vm, vcpuid); restore_guest_fpustate(vcpu);
そして、次からはvmm_dev.cになります。
-------------------------------------------------------------- >>> Kernel build for BHYVE started on Wed Jul 18 20:29:12 JST 2012 -------------------------------------------------------------- ===> BHYVE cd /usr/src/sys/config; PATH=/usr/obj/usr/src/ctools_x86_64_x86_64/usr/sbin:/usr/obj/usr/src/ctools_x86_64_x86_64/usr/bin:/usr/obj/usr/src/ctools_x86_64_x86_64/bin:/usr/obj/usr/src/ctools_x86_64_x86_64/usr/games:/usr/obj/usr/src/btools_x86_64/usr/sbin:/usr/obj/usr/src/btools_x86_64/usr/bin:/usr/obj/usr/src/btools_x86_64/bin:/usr/obj/usr/src/btools_x86_64/usr/games:/usr/pkg/bin config -d /usr/obj/usr/src/sys/BHYVE /usr/src/sys/config/BHYVE Kernel build directory is /usr/obj/usr/src/sys/BHYVE cd /usr/obj/usr/src/sys/BHYVE; MAKEOBJDIRPREFIX=/usr/obj/usr/src/world_x86_64 OBJTREE=/usr/obj MACHINE_ARCH=x86_64 MACHINE=x86_64 MACHINE_PLATFORM=pc64 OBJFORMAT_PATH=/usr/obj/usr/src/ctools_x86_64_x86_64 HOST_CCVER=gcc44 CCVER=gcc44 BINUTILSVER=binutils221 DESTDIR=/usr/obj/usr/src/world_x86_64 INSTALL="sh /usr/src/tools/install.sh" PATH=/usr/obj/usr/src/ctools_x86_64_x86_64/usr/sbin:/usr/obj/usr/src/ctools_x86_64_x86_64/usr/bin:/usr/obj/usr/src/ctools_x86_64_x86_64/bin:/usr/obj/usr/src/ctools_x86_64_x86_64/usr/games:/usr/obj/usr/src/btools_x86_64/usr/sbin:/usr/obj/usr/src/btools_x86_64/usr/bin:/usr/obj/usr/src/btools_x86_64/bin:/usr/obj/usr/src/btools_x86_64/usr/games:/usr/pkg/bin make KERNEL=kernel all cc -c -O -pipe -Wall -Wredundant-decls -Wnested-externs -Wstrict-prototypes -Wmissing-prototypes -Wpointer-arith -Winline -Wcast-qual -Wold-style-definition -std=c99 -Wold-style-declaration -g -nostdinc -I. -Iinclude -I/usr/src/sys -I/usr/src/sys/../include -I/usr/obj/usr/src/sys/BHYVE -I"/usr/src/sys/dev/acpica5" -I"/usr/src/sys/contrib/dev/acpica-unix/include" -I/usr/src/sys/dev/netif/ath/hal -I/usr/src/sys/dev/netif/ath/hal/ath_hal -D_KERNEL -include opt_global.h -finline-limit=8000 --param inline-unit-growth=100 --param large-function-growth=1000 -fno-common -ffreestanding -mpreferred-stack-boundary=4 -fno-stack-protector -mcmodel=kernel -mno-red-zone -mfpmath=387 -mno-mmx -mno-3dnow -mno-sse -mno-sse2 -mno-sse3 -mno-ssse3 -mno-sse4.1 -mno-sse4.2 -mno-sse4 -mno-sse4a -mno-sse5 -mno-abm -mno-aes -mno-avx -mno-pclmul -mno-popcnt -msoft-float -fno-asynchronous-unwind-tables -fno-omit-frame-pointer /usr/src/sys/platform/pc64/vmm/vmm.c -Werror cc -c -O -pipe -Wall -Wredundant-decls -Wnested-externs -Wstrict-prototypes -Wmissing-prototypes -Wpointer-arith -Winline -Wcast-qual -Wold-style-definition -std=c99 -Wold-style-declaration -g -nostdinc -I. -Iinclude -I/usr/src/sys -I/usr/src/sys/../include -I/usr/obj/usr/src/sys/BHYVE -I"/usr/src/sys/dev/acpica5" -I"/usr/src/sys/contrib/dev/acpica-unix/include" -I/usr/src/sys/dev/netif/ath/hal -I/usr/src/sys/dev/netif/ath/hal/ath_hal -D_KERNEL -include opt_global.h -finline-limit=8000 --param inline-unit-growth=100 --param large-function-growth=1000 -fno-common -ffreestanding -mpreferred-stack-boundary=4 -fno-stack-protector -mcmodel=kernel -mno-red-zone -mfpmath=387 -mno-mmx -mno-3dnow -mno-sse -mno-sse2 -mno-sse3 -mno-ssse3 -mno-sse4.1 -mno-sse4.2 -mno-sse4 -mno-sse4a -mno-sse5 -mno-abm -mno-aes -mno-avx -mno-pclmul -mno-popcnt -msoft-float -fno-asynchronous-unwind-tables -fno-omit-frame-pointer /usr/src/sys/platform/pc64/vmm/vmm_dev.c -Werror cc1: warnings being treated as errors /usr/src/sys/platform/pc64/vmm/vmm_dev.c: In function 'vmmdev_rw': /usr/src/sys/platform/pc64/vmm/vmm_dev.c:114: error: implicit declaration of function 'mtx_lock' /usr/src/sys/platform/pc64/vmm/vmm_dev.c:114: error: nested extern declaration of 'mtx_lock' /usr/src/sys/platform/pc64/vmm/vmm_dev.c:140: error: implicit declaration of function 'mtx_unlock' /usr/src/sys/platform/pc64/vmm/vmm_dev.c:140: error: nested extern declaration of 'mtx_unlock' /usr/src/sys/platform/pc64/vmm/vmm_dev.c: In function 'vmmdev_destroy': /usr/src/sys/platform/pc64/vmm/vmm_dev.c:384: error: implicit declaration of function 'free' /usr/src/sys/platform/pc64/vmm/vmm_dev.c:384: error: nested extern declaration of 'free' /usr/src/sys/platform/pc64/vmm/vmm_dev.c: At top level: /usr/src/sys/platform/pc64/vmm/vmm_dev.c:412: error: variable 'vmmdevsw' has initializer but incomplete type /usr/src/sys/platform/pc64/vmm/vmm_dev.c:413: error: unknown field 'd_name' specified in initializer /usr/src/sys/platform/pc64/vmm/vmm_dev.c:413: error: excess elements in struct initializer /usr/src/sys/platform/pc64/vmm/vmm_dev.c:413: error: (near initialization for 'vmmdevsw') /usr/src/sys/platform/pc64/vmm/vmm_dev.c:414: error: unknown field 'd_version' specified in initializer /usr/src/sys/platform/pc64/vmm/vmm_dev.c:414: error: 'D_VERSION' undeclared here (not in a function) /usr/src/sys/platform/pc64/vmm/vmm_dev.c:414: error: excess elements in struct initializer /usr/src/sys/platform/pc64/vmm/vmm_dev.c:414: error: (near initialization for 'vmmdevsw') /usr/src/sys/platform/pc64/vmm/vmm_dev.c:415: error: unknown field 'd_ioctl' specified in initializer /usr/src/sys/platform/pc64/vmm/vmm_dev.c:415: error: excess elements in struct initializer /usr/src/sys/platform/pc64/vmm/vmm_dev.c:415: error: (near initialization for 'vmmdevsw') /usr/src/sys/platform/pc64/vmm/vmm_dev.c:416: error: unknown field 'd_mmap' specified in initializer /usr/src/sys/platform/pc64/vmm/vmm_dev.c:416: error: excess elements in struct initializer /usr/src/sys/platform/pc64/vmm/vmm_dev.c:416: error: (near initialization for 'vmmdevsw') /usr/src/sys/platform/pc64/vmm/vmm_dev.c:417: error: unknown field 'd_read' specified in initializer /usr/src/sys/platform/pc64/vmm/vmm_dev.c:417: error: excess elements in struct initializer /usr/src/sys/platform/pc64/vmm/vmm_dev.c:417: error: (near initialization for 'vmmdevsw') /usr/src/sys/platform/pc64/vmm/vmm_dev.c:418: error: unknown field 'd_write' specified in initializer /usr/src/sys/platform/pc64/vmm/vmm_dev.c:418: error: excess elements in struct initializer /usr/src/sys/platform/pc64/vmm/vmm_dev.c:418: error: (near initialization for 'vmmdevsw') /usr/src/sys/platform/pc64/vmm/vmm_dev.c: In function 'sysctl_vmm_create': /usr/src/sys/platform/pc64/vmm/vmm_dev.c:448: error: implicit declaration of function 'malloc' /usr/src/sys/platform/pc64/vmm/vmm_dev.c:448: error: nested extern declaration of 'malloc' /usr/src/sys/platform/pc64/vmm/vmm_dev.c:448: error: assignment makes pointer from integer without a cast /usr/src/sys/platform/pc64/vmm/vmm_dev.c:450: error: implicit declaration of function 'make_dev' /usr/src/sys/platform/pc64/vmm/vmm_dev.c:450: error: nested extern declaration of 'make_dev' /usr/src/sys/platform/pc64/vmm/vmm_dev.c:451: error: assignment makes pointer from integer without a cast /usr/src/sys/platform/pc64/vmm/vmm_dev.c: In function 'vmmdev_init': /usr/src/sys/platform/pc64/vmm/vmm_dev.c:464: error: implicit declaration of function 'mtx_init' /usr/src/sys/platform/pc64/vmm/vmm_dev.c:464: error: nested extern declaration of 'mtx_init' /usr/src/sys/platform/pc64/vmm/vmm_dev.c:464: error: 'MTX_DEF' undeclared (first use in this function) /usr/src/sys/platform/pc64/vmm/vmm_dev.c:464: error: (Each undeclared identifier is reported only once /usr/src/sys/platform/pc64/vmm/vmm_dev.c:464: error: for each function it appears in.) /usr/src/sys/platform/pc64/vmm/vmm_dev.c: In function 'vmmdev_cleanup': /usr/src/sys/platform/pc64/vmm/vmm_dev.c:474: error: implicit declaration of function 'SLIST_FOREACH_SAFE' /usr/src/sys/platform/pc64/vmm/vmm_dev.c:474: error: nested extern declaration of 'SLIST_FOREACH_SAFE' /usr/src/sys/platform/pc64/vmm/vmm_dev.c:474: error: 'link' undeclared (first use in this function) /usr/src/sys/platform/pc64/vmm/vmm_dev.c:475: error: expected ';' before 'vmmdev_destroy' *** Error code 1 Stop in /usr/obj/usr/src/sys/BHYVE. *** Error code 1 Stop in /usr/src. *** Error code 1 Stop in /usr/src.