読者です 読者をやめる 読者になる 読者になる

BHyVeビルドめも26

DragonFlyBSD BHyVe

( ..)φカキカキ
vmm_ipi.cの残りを片付けたので、これでこのファイルは終わりましたヽ(・∀・ )ノ キャッ キャッ

やったことは3行ほどのパッチなんですけどねw ipi_cpu()がsingle_apic_ipi()に置き換わっただけです。

diff --git a/sys/platform/pc64/vmm/vmm_ipi.c b/sys/platform/pc64/vmm/vmm_ipi.c
index becccf7..14695b0 100644
--- a/sys/platform/pc64/vmm/vmm_ipi.c
+++ b/sys/platform/pc64/vmm/vmm_ipi.c
@@ -40,6 +40,8 @@
 #include <machine/smp.h>
 
 #include <machine_base/apic/apicvar.h>
+#include <machine_base/apic/apicreg.h>
+#include <machine_base/apic/lapic.h>
 #include <machine/vmm.h>
 #include "vmm_ipi.h"
 
@@ -122,5 +124,5 @@ vm_interrupt_hostcpu(struct vm *vm, int vcpu)
 	int hostcpu;
 
 	if (vcpu_is_running(vm, vcpu, &hostcpu) && hostcpu != mycpuid)
-		ipi_cpu(hostcpu, ipinum);
+		single_apic_ipi(hostcpu, ipinum[hostcpu], APIC_DELMODE_LOWPRIO);
 }

これに行き着いた経緯としては、まずやりたいことは対象のcpuに対して指定した割り込み番号の割り込みをかけるというipi_cpu()の挙動を満たすのはどれかってのを当然探した訳です。
その時にkern/lwkt_ipiq.cというファイルが見つかったんですが、こっちはスレッドよりと言うかちょっと求めているものと違うようでしたので諦めました。
例えば、lwkt_send_ipiq3()って関数だとコメントに「Send a function execution request to another cpu.」なんて書いてあったり、他のも似たような感じだったりで、今回の目的には合わなかった訳です。そしてsys/platform/pc64/apicというある意味基本なところに落ち着き、見つかったのがsingle_apic_ipi()と言う訳です。ちなみにこれはヘッダの定義だと引数がよくわからなかったのですが、cファイルのほうでなんとかわかりました。プロトタイプはこれで、そんなにわかりやすくもないんですがさらにこれを呼んでるところを探してdelivery_modeって何をセットするの?等の疑問を解決しました。

void
single_apic_ipi(int cpu, int vector, int delivery_mode)

これを使っている関数も同じくlapic.cにいました。

/*
 * Send APIC IPI 'vector' to 'target's via 'delivery_mode'.
 *
 * target is a bitmask of destination cpus.  Vector is any
 * valid system INT vector.  Delivery mode may be either
 * APIC_DELMODE_FIXED or APIC_DELMODE_LOWPRIO.
 */
void
selected_apic_ipi(cpumask_t target, int vector, int delivery_mode)
{
	crit_enter();
	while (target) {
		int n = BSFCPUMASK(target);
		target &= ~CPUMASK(n);
		single_apic_ipi(n, vector, delivery_mode);
	}
	crit_exit();
}

さらにこのselected_apic_ipi()の使用箇所を探すとsys/platform/pc64/x86_64/mp_machdep.cにいまして、これで何となく使い方分かるよねってなりました。

int
stop_cpus(cpumask_t map)
{
	map &= smp_active_mask;

	/* send the Xcpustop IPI to all CPUs in map */
	selected_apic_ipi(map, XCPUSTOP_OFFSET, APIC_DELMODE_FIXED);

	while ((stopped_cpus & map) != map)
		/* spin */ ;

	return 1;
}

そうするとここまででsingle_apic_ipi()の引数はこんな感じになるのがわかります。
1番目:cpu番号
2番目:idtの番号だろう
3番目:APIC_DELMODE_FIXED or APIC_DELMODE_LOWPRIO
念のためXCPUSTOP_OFFSETを確認しておくと、sys/platform/pc64/include/intr_machdep.hdfly-3.0.2-bhyve/sys/platform/pc64/include/intr_machdep.h at 3.0.2-BHyVe · masami256/dfly-3.0.2-bhyve · GitHubで以下のように定義されていて、予想通りっぽいのがわかります。

/* IPI to signal CPUs to stop and wait for another CPU to restart them */
#define XCPUSTOP_OFFSET		(IDT_OFFSET_IPIG2 + 0)

残りは3番目の引数でどっちを使えば良いのかってことなんですが、sys/platform/pc64/apic/apicreg.hのコメントで使い分け方が書いてありました。
APIC_DELMODE_FIXEDはこのように書かれていて全てのプロセッサに割り込みをするらしいですね。

 *		000 - Fixed.  Deliver to all processors according to the
 *		      ICR.  Always treated as edge triggered.

もう一個のAPIC_DELMODE_LOWPRIOはというと、指定したcpu以外には割り込まないことが分かります。

 *		001 - Lowest Priority.  Deliver to just the processor
 *		      running at the lowest priority.

そうすると、single_apic_ipi()を使いたいという要求からしてAPIC_DELMODE_LOWPRIOを使うのが良さそうということでAPIC_DELMODE_LOWPRIOを3番目の引数に渡すようにしました。

さて、これにて無事にvmm_ipi.cのコンパイルは終わりなのですが、当然のごとく次のファイルがありますよorz


--------------------------------------------------------------
>>> Kernel build for BHYVE started on Thu Jul 26 20:39:33 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_ipi.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_lapic.c -Werror
/usr/src/sys/platform/pc64/vmm/vmm_lapic.c:39:20: error: vlapic.h: No such file or directory
cc1: warnings being treated as errors
/usr/src/sys/platform/pc64/vmm/vmm_lapic.c: In function 'lapic_write':
/usr/src/sys/platform/pc64/vmm/vmm_lapic.c:50: error: implicit declaration of function 'vlapic_op_mem_write'
/usr/src/sys/platform/pc64/vmm/vmm_lapic.c:50: error: nested extern declaration of 'vlapic_op_mem_write'
/usr/src/sys/platform/pc64/vmm/vmm_lapic.c:50: error: 'DWORD' undeclared (first use in this function)
/usr/src/sys/platform/pc64/vmm/vmm_lapic.c:50: error: (Each undeclared identifier is reported only once
/usr/src/sys/platform/pc64/vmm/vmm_lapic.c:50: error: for each function it appears in.)
/usr/src/sys/platform/pc64/vmm/vmm_lapic.c: In function 'lapic_read':
/usr/src/sys/platform/pc64/vmm/vmm_lapic.c:67: error: implicit declaration of function 'vlapic_op_mem_read'
/usr/src/sys/platform/pc64/vmm/vmm_lapic.c:67: error: nested extern declaration of 'vlapic_op_mem_read'
/usr/src/sys/platform/pc64/vmm/vmm_lapic.c:67: error: 'DWORD' undeclared (first use in this function)
/usr/src/sys/platform/pc64/vmm/vmm_lapic.c: In function 'lapic_pending_intr':
/usr/src/sys/platform/pc64/vmm/vmm_lapic.c:82: error: implicit declaration of function 'vlapic_pending_intr'
/usr/src/sys/platform/pc64/vmm/vmm_lapic.c:82: error: nested extern declaration of 'vlapic_pending_intr'
/usr/src/sys/platform/pc64/vmm/vmm_lapic.c: In function 'lapic_intr_accepted':
/usr/src/sys/platform/pc64/vmm/vmm_lapic.c:92: error: implicit declaration of function 'vlapic_intr_accepted'
/usr/src/sys/platform/pc64/vmm/vmm_lapic.c:92: error: nested extern declaration of 'vlapic_intr_accepted'
/usr/src/sys/platform/pc64/vmm/vmm_lapic.c: In function 'lapic_set_intr':
/usr/src/sys/platform/pc64/vmm/vmm_lapic.c:107: error: implicit declaration of function 'vlapic_set_intr_ready'
/usr/src/sys/platform/pc64/vmm/vmm_lapic.c:107: error: nested extern declaration of 'vlapic_set_intr_ready'
/usr/src/sys/platform/pc64/vmm/vmm_lapic.c: In function 'lapic_timer_tick':
/usr/src/sys/platform/pc64/vmm/vmm_lapic.c:121: error: implicit declaration of function 'vlapic_timer_tick'
/usr/src/sys/platform/pc64/vmm/vmm_lapic.c:121: error: nested extern declaration of 'vlapic_timer_tick'
*** 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.

このエラーで最初にあるvlapic.hがないってのはインクルードファイルのパスの問題なので、これを修正後にどんな感じになるかですね?ということでやってみるとコンパイルエラー消えましたw
次にvmm_msr.cのコンパイルエラーですがこれもサクッと片付きました。APICBASE_X2APICが無いってことでマクロを追加したのですが、これはFreeBSD9にもなかったので10のほうからもってきました。そしてこのファイルのコンパイルエラーが消えてvmm_stat.cになったわけですが、これはs/malloc/kmalloc、s/free/kfree、s/printf/kprintfというだけのお手軽パターンでサクサクっと片付きました!
今度はこのvmm_support.Sですね~

--------------------------------------------------------------
>>> Kernel build for BHYVE started on Thu Jul 26 21:28:33 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_stat.c -Werror
cc -c -x assembler-with-cpp -DLOCORE -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_support.S -Werror
/usr/src/sys/platform/pc64/vmm/vmm_support.S:29:1: error: "LOCORE" redefined
<command-line>: error: this is the location of the previous definition
*** 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.