φ(^∇^ ) メモナノラ
昨日の続きというほど続いて無いですが、今日の変更点はこちら。
まず、昨日の続きに当たる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の仕様に合うようにラッパーかますなりな修正が必要ですね( ´ー`)フゥー...