Subject: FreeBSD 5/6/7 kernel emulator for NetBSD 2.x
To: None <tech-kern@netbsd.org, freebsd-hackers@freebsd.org>
From: Hans Petter Selasky <hselasky@c2i.net>
List: tech-kern
Date: 10/24/2005 22:35:47
Hi,

I have made an effort on making a FreeBSD 5/6/7 kernel emulator for NetBSD 
2.x. Many device drivers are shared between these two operating systems, and 
I think a lot of work can be saved when it comes to porting code and patches 
forth and back. Currently this emulator makes my FreeBSD PCI ISDN driver load 
and run on NetBSD. I have chosen to make FreeBSD 5+ the standard for several 
reasons:

- all drivers are dynamically linked through use of the "section attribute" in 
the "C" compiler.

- "/dev" is a file system that can be manipulated from the kernel, without 
intervention from "mknod".

- All I/O resources are allocated through a single function, 
"bus_alloc_resource()".

- And more.


Here is a case in which such a kernel emulator can be used:

I think it is a good idea that FreeBSD and NetBSD shares as many USB drivers 
as possible. But sharing USB device drivers like 
"/usr/src/sys/dev/usb/ulpt.c", is difficult, because two quite different 
interfaces are used to create devices in "/dev/". And it is not only this, 
but also how USB device drivers register in the kernel so that they get 
probed. Here one has tried to hide system differences by using macros. 

I think one should rather have some external library that hides these system 
differences, so that there is only one branch for the USB device drivers, for 
both NetBSD and FreeBSD, and probably the other *BSD's aswell, if possible. 
That means a branch without "ifdefs" for every operating system it is 
supposed to compile on. Then one has got to choose the library interface, and 
I would say that "FreeBSD 5+ specific" is the best candidate so far. 

I see that one can move many USB drivers over to FreeBSD, merge everything 
together, expand all the macros in "/usr/src/sys/dev/usb/usb_port.h", and 
then copy it back to NetBSD which then must have a FreeBSD kernel emulator in 
the kernel. When the drivers are updated later, it will be very easy to cross 
port the changes, and at the same time the USB system is brought out of the 
Giant lock. Also it will be easier to create portable USB kernel device 
drivers.


Anyone have any opinion about what system is better to use as a standard in 
the kernel?



Main features:

- Implements FreeBSD's devfs on NetBSD.

- Support for mutexes, mtx_xxxx() and msleep()

- Support for probe/attach and general use of PCI devices

- Support for SYSINIT()

- Support for DRIVER_MODULE()

- And some other things found in FreeBSD 5/6/7


Here is a tarball (only tested on i386 and compatible, NetBSD 2.x):

http://home.c2i.net/hselasky/isdn4bsd/privat/temporary/new_ihfc_1_5_5_NetBSD.tar.bz2


--HPS