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

BHyVeビルドめも20

DragonFlyBSD BHyVe

φ(・・*)ゞ ウーン
とうとうこのメモも20回目ですね。今日はs/malloc/kmalloc/とs/free/kfreeで終わるという惨敗っぷりですがwww ↓の初期化でコンパイルエラーになってたのですが、dfbsdはどこでcdevsw構造体を定義しているのか探していて力尽きました\(^o^)/ 一応直し方は分かりましたけどね( ´∀`)bグッ!

static struct cdevsw vmmdevsw = {
        .d_name         = "vmmdev",
        .d_version      = D_VERSION,
        .d_ioctl        = vmmdev_ioctl,
        .d_mmap         = vmmdev_mmap,
        .d_read         = vmmdev_rw,
        .d_write        = vmmdev_rw,
};

例えば、このdev/raid/dpt/dpt_control.cで使われているっぽいけど、raidディレクトリのMakefileにdptのディレクトリの指定ないですよねとか、

SUBDIR=	aac amr arcmsr asr ciss hptiop hptmv \
	iir ips mfi mlx mly mps pst twa twe tws vinum

.include <bsd.subdir.mk>

ifdefでコメントアウトされてるとかで使われてる形跡が見つかりませんでしたorz
それで、このvmmdevswが使われるのはmake_dev()の一番目の引数としてですが、この関数はFreeBSDとDragonFly BSDでちょっと違いますね。
FreeBSD9だとsys/conf.hでこのように定義されてます。__printflikeってなんだ?というのはありますが、printfっぽい何かのための定義なんでしょう。const char *_fmt, ...とか引数にありますし。まあ、細かいことは(・ε・)キニシナイ!!

  270 struct cdev *make_dev(struct cdevsw *_devsw, int _unit, uid_t _uid, gid_t _gid,
  271                 int _perms, const char *_fmt, ...) __printflike(6, 7);

DragonFly BSDだとsys/device.hでこうなってます。

cdev_t make_dev(struct dev_ops *ops, int minor, uid_t uid, gid_t gid,
		int perms, const char *fmt, ...) __printflike(6, 7);

両者の違いは最初の引数なのですが、dfbsdはこのdev_ops構造体ですね。deb_ops構造体もsys/device.hにいました。

/*
 * Character device switch table.
 *
 * NOTE: positions are hard coded for static structure initialization.
 */
struct dev_ops {
	struct {
		const char	*name;	/* base name, e.g. 'da' */
		int		 maj;	/* major device number */
		u_int		 flags;	/* D_XXX flags */
		void		*data;	/* custom driver data */
		int		 refs;	/* ref count */
		int		 id;
	} head;

#define dev_ops_first_field	d_default
	d_default_t	*d_default;
	d_open_t	*d_open;
	d_close_t	*d_close;
	d_read_t	*d_read;
	d_write_t	*d_write;
	d_ioctl_t	*d_ioctl;
	d_mmap_t	*d_mmap;
	d_strategy_t	*d_strategy;
	d_dump_t	*d_dump;
	d_psize_t	*d_psize;
	d_kqfilter_t	*d_kqfilter;
	d_clone_t	*d_clone;	/* clone from base dev_ops */
	d_revoke_t	*d_revoke;
#define dev_ops_last_field	d_revoke
};

dev_ops_first_fieldで使う関数というか、デフォルトの関数は同じくsys/device.hにいて、このように定義されてます。

d_default_t	nodefault;
d_open_t	noopen;
d_close_t	noclose;
d_read_t	noread;
d_write_t	nowrite;
d_ioctl_t	noioctl;
d_mmap_t	nommap;
d_strategy_t	nostrategy;
d_dump_t	nodump;
d_psize_t	nopsize;
d_kqfilter_t	nokqfilter;
d_clone_t	noclone;
d_revoke_t	norevoke;

d_open_t	nullopen;
d_close_t	nullclose;

これらの実体はsys/kern_device.cで定義されてます。使わない関数にはNULLじゃなくてデフォルトの関数をセットしろということですね。
ということで答えは大体見えていて、cdevsw構造体をdev_ops構造体に代えてあげれば大体OKじゃないかなーというところです。
今日はdfbsdのソースをgrepしたときにcdevsw構造体が中途半端に見つかったせいでものすごく遠回りした挙句、力尽きた感じです( ´ー`)フゥー...