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

BHyVeビルドめも21

DragonFlyBSD BHyVe

φ(^∇^ ) メモナノラ
昨日の続きというほど続いて無いですが、今日の変更点はこちら
まず、昨日の続きに当たるFreeBSDのcdevsw構造体とDragonFly BSDのdev_ops構造体の差のところはとりあえずこんな感じで。
単に使用する構造体を変えたのに伴って変数へのアクセスがちょっと変わった位です。fbsdと違って名前やメジャー番号をセットする変数にアクセスするのに構造体を一つかましているのが違いです。関数ポインタのところは特に変更無しで変数にはアクセスできます。

@@ -416,9 +428,9 @@ sysctl_vmm_destroy(SYSCTL_HANDLER_ARGS)
 SYSCTL_PROC(_hw_vmm, OID_AUTO, destroy, CTLTYPE_STRING | CTLFLAG_RW,
 	    NULL, 0, sysctl_vmm_destroy, "A", NULL);
 
-static struct cdevsw vmmdevsw = {
-	.d_name		= "vmmdev",
-	.d_version	= D_VERSION,
+static struct dev_ops vmmdevsw = {
+	.head.name	= "vmmdev",
+	.head.maj	= D_VERSION,
 	.d_ioctl	= vmmdev_ioctl,
 	.d_mmap		= vmmdev_mmap,
 	.d_read		= vmmdev_rw,

後は別のコンパイルエラーをちょろっと修正しています。dbbsdだとSLIST_FOREACH_SAFEマクロはいなかったのでFreeBSDから借りてきたり、mtx_init()の引数はdfbsdだとmtx構造体だけなのでdfbsdで不要な引数を消した程度です。
ちなみに、SLIST_XXXXなマクロはdfbsdもfbsdと同様にsys/queue.hにいます。
さて、これで残りのコンパイルエラーは


--------------------------------------------------------------
>>> Kernel build for BHYVE started on Fri Jul 20 20:20:52 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_dev.c -Werror
cc1: warnings being treated as errors
/usr/src/sys/platform/pc64/vmm/vmm_dev.c:434: error: initialization from incompatible pointer type
/usr/src/sys/platform/pc64/vmm/vmm_dev.c:435: error: initialization from incompatible pointer type
/usr/src/sys/platform/pc64/vmm/vmm_dev.c:436: error: initialization from incompatible pointer type
/usr/src/sys/platform/pc64/vmm/vmm_dev.c:437: error: initialization from incompatible pointer type
*** 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.

となり、残り4つです。この4個はこの初期化部分の関数をセットしているところです。

static struct dev_ops vmmdevsw = {
	.head.name	= "vmmdev",
	.head.maj	= D_VERSION,
	.d_ioctl	= vmmdev_ioctl,
	.d_mmap		= vmmdev_mmap,
	.d_read		= vmmdev_rw,
	.d_write	= vmmdev_rw,
};

これは関数プロトタイプの違いから来るものですが、素のBHyVe(FreeBSD)はこんな感じで、

static int
vmmdev_mmap(struct cdev *cdev, vm_ooffset_t offset, vm_paddr_t *paddr,
    int nprot, vm_memattr_t *memattr)

static int
vmmdev_ioctl(struct cdev *cdev, u_long cmd, caddr_t data, int fflag,
	     struct thread *td)
static int
vmmdev_rw(struct cdev *cdev, struct uio *uio, int flags)

dfbsdのほうはこんな感じです。

typedef int d_read_t (struct dev_read_args *ap);
typedef int d_write_t (struct dev_write_args *ap);
typedef int d_ioctl_t (struct dev_ioctl_args *ap);
typedef int d_mmap_t (struct dev_mmap_args *ap);

そりゃコンパイル通らないですよね~ということで、vmmdev_XXXで受け取った引数とかをdfbsdの仕様に合うようにラッパーかますなりな修正が必要ですね( ´ー`)フゥー...