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

BHyVeビルドめも12

DragonFlyBSD BHyVe

( ..)φカキカキ
今日はとりあえず簡単なやつだけ片付けておいて、次のために

--------------------------------------------------------------
>>> Kernel build for BHYVE started on Mon Jul  9 21:42: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/io/ppt.c -Werror
/usr/src/sys/platform/pc64/vmm/io/ppt.c: In function 'pptintr':
/usr/src/sys/platform/pc64/vmm/io/ppt.c:394: error: 'FILTER_STRAY' undeclared (first use in this function)
/usr/src/sys/platform/pc64/vmm/io/ppt.c:394: error: (Each undeclared identifier is reported only once
/usr/src/sys/platform/pc64/vmm/io/ppt.c:394: error: for each function it appears in.)
/usr/src/sys/platform/pc64/vmm/io/ppt.c:396: error: 'FILTER_HANDLED' undeclared (first use in this function)
/usr/src/sys/platform/pc64/vmm/io/ppt.c: In function 'ppt_setup_msi':
/usr/src/sys/platform/pc64/vmm/io/ppt.c:471: error: too few arguments to function 'pci_alloc_msi'
/usr/src/sys/platform/pc64/vmm/io/ppt.c:503: error: 'INTR_TYPE_NET' undeclared (first use in this function)
cc1: warnings being treated as errors
/usr/src/sys/platform/pc64/vmm/io/ppt.c:505: error: passing argument 4 of 'bus_setup_intr' from incompatible pointer type
/usr/src/sys/sys/bus.h:322: note: expected 'void (*)(void *)' but argument is of type 'int (*)(void *)'
/usr/src/sys/platform/pc64/vmm/io/ppt.c:505: error: passing argument 6 of 'bus_setup_intr' from incompatible pointer type
/usr/src/sys/sys/bus.h:322: note: expected 'void **' but argument is of type 'struct pptintr_arg *'
/usr/src/sys/platform/pc64/vmm/io/ppt.c:505: error: passing argument 7 of 'bus_setup_intr' from incompatible pointer type
/usr/src/sys/sys/bus.h:322: note: expected 'lwkt_serialize_t' but argument is of type 'void **'
/usr/src/sys/platform/pc64/vmm/io/ppt.c: In function 'ppt_setup_msix':
/usr/src/sys/platform/pc64/vmm/io/ppt.c:558: error: implicit declaration of function 'pci_alloc_msix'
/usr/src/sys/platform/pc64/vmm/io/ppt.c:558: error: nested extern declaration of 'pci_alloc_msix'
/usr/src/sys/platform/pc64/vmm/io/ppt.c:605: error: 'INTR_TYPE_NET' undeclared (first use in this function)
/usr/src/sys/platform/pc64/vmm/io/ppt.c:607: error: passing argument 4 of 'bus_setup_intr' from incompatible pointer type
/usr/src/sys/sys/bus.h:322: note: expected 'void (*)(void *)' but argument is of type 'int (*)(void *)'
/usr/src/sys/platform/pc64/vmm/io/ppt.c:607: error: passing argument 6 of 'bus_setup_intr' from incompatible pointer type
/usr/src/sys/sys/bus.h:322: note: expected 'void **' but argument is of type 'struct pptintr_arg *'
/usr/src/sys/platform/pc64/vmm/io/ppt.c:607: error: passing argument 7 of 'bus_setup_intr' from incompatible pointer type
/usr/src/sys/sys/bus.h:322: note: expected 'lwkt_serialize_t' but argument is of type 'void **'
*** 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.

まずはpptintr()のFILTER_STRAYとFILTER_HANDLEDが無いって怒られてるところ。
これはbus_setup_intr()の4番目の引数の型が違うって言われているところと関係があります。bus_setup_intr()はDragonFly BSDだとsys/bus.hでこのように定義されてます。

int	bus_setup_intr(device_t dev, struct resource *r, int flags,
		       driver_intr_t handler, void *arg,
		       void **cookiep, lwkt_serialize_t serializer);

これのhandlerのとこでコンパイルエラー出てます。ここでFreeBSDとDragonFlyの違いが出てきて、FreeBSDはハンドラとして渡す関数はintを返すけど、DragonFlyはvoidというとこで違ってきます。そうするとDragonFlyの流儀に合わせるとpptintr()は戻り値がなくなるので、FILTER_STRAYとFILTER_HANDLEDが無いって問題も解決なのですが、どうなんですかね。

ちょっと見てみるとして、https://github.com/masami256/dfly-3.0.2-bhyve/blob/3.0.2-BHyVe/sys/kern/subr_bus.cにbus_setup_intr関数がいてこの関数はbus_setup_intr_descr()を呼びます。そしてbus_setup_intr_descr()が中でBUS_SETUP_INTRの引数としてハンドラを渡します。

int
bus_setup_intr_descr(device_t dev, struct resource *r, int flags,
    driver_intr_t handler, void *arg, void **cookiep,
    lwkt_serialize_t serializer, const char *desc)
{
        if (dev->parent == 0)
                return EINVAL;
        return BUS_SETUP_INTR(dev->parent, dev, r, flags, handler, arg,
            cookiep, serializer, desc);
}

int
bus_setup_intr(device_t dev, struct resource *r, int flags,
    driver_intr_t handler, void *arg, void **cookiep,
    lwkt_serialize_t serializer)
{
        return bus_setup_intr_descr(dev, r, flags, handler, arg, cookiep,
            serializer, NULL);
}

それで、このBUS_SETUP_INTRは何者ですかねという話になってググってみるとFreeBSDのメーリングリストの過去ログが見つかりました。これによるとコンパイル時に作られて/usr/obj/usr/src/sys/XXX/*/bus_if.hってなってるといことでしたが、DragonFlyだと/usr/obj/usr/src/sys/BHYVE/bus_if.hとして存在しました。こんな関数になっています。

static __inline int BUS_SETUP_INTR(device_t dev, device_t child,
                                   struct resource *irq, int flags,
                                   driver_intr_t *intr, void *arg,
                                   void **cookiep, lwkt_serialize_t serializer,
                                   const char *desc)
{
        kobjop_t _m;
        KOBJOPLOOKUP(((kobj_t)dev)->ops, bus_setup_intr);
        return ((bus_setup_intr_t *) _m)(dev, child, irq, flags, intr, arg, cook
iep, serializer, desc);
}

ついでに見ておくと、sys/kobj.hで定義されてます。

#define KOBJOPLOOKUP(OPS,OP) do {                                       \\
        _m = kobj_lookup_method_cache(OPS->cls, &OPS->cache[0],         \\
                                       &OP##_##desc);                   \\
} while(0)

他にはbus/pci/x86_4/pci_sub.cにはこんな感じで定義があったり。

DEVMETHOD(bus_setup_intr,	bus_generic_setup_intr),

DEVMETHODはsys/bus.hでこのように定義されてます。

/*
 * Shorthand for constructing method tables.
 */
#define DEVMETHOD	KOBJMETHOD

さて、bus_generic_setup_intr()はというとkern/subr_bus.cにいます。

int
bus_generic_setup_intr(device_t dev, device_t child, struct resource *irq,
    int flags, driver_intr_t *intr, void *arg, void **cookiep,
    lwkt_serialize_t serializer, const char *desc)
{
	/* Propagate up the bus hierarchy until someone handles it. */
	if (dev->parent) {
		return BUS_SETUP_INTR(dev->parent, child, irq, flags,
		    intr, arg, cookiep, serializer, desc);
	} else {
		return EINVAL;
	}
}

またBUS_SETUP_INTR()が出てきますね/(^o^)\
さらにbus/pci/pci.cでこんな定義があって、

static device_method_t pci_methods[] = {
    ...
    DEVMETHOD(bus_setup_intr,	pci_setup_intr),
    ...

関数も同じファイルで定義されてて、中でbus_generic_setup_intr()が呼ばれてます…

int
pci_setup_intr(device_t dev, device_t child, struct resource *irq, int flags,
    driver_intr_t *intr, void *arg, void **cookiep,
    lwkt_serialize_t serializer, const char *desc)
{
	int rid, error;
	void *cookie;

	error = bus_generic_setup_intr(dev, child, irq, flags, intr,
	    arg, &cookie, serializer, desc);
	if (error)
		return (error);

とまあ、これを追いかけていくと訳がわからなくなるのでここで止めておきます。 なんかデーモン君のソース探検を思い出したのはさておきw
なにはともあれ、ハンドラとして渡す関数は戻り値が無くて他のデバイスのコードを見た感じでは引数にも(voidでキャストしてるけど構造体)エラーコードを入れるような変数は使ってないようです。なのでppt.cのほうはreturnしているところはコメントアウトにしておいて、それで問題があるようなら構造体側に結果を持たせるようにすれば良いかな(´ε`;)ウーン…