[openbeos] driver stuff

Someone on BeShare just mentionned to me the existance of a bunch of functions 
in libroot that are known to belong to the kerneland PCI/ISA modules.

[revol@patrick /boot/home/devel/obos/commands]$ nm /system/lib/libroot.so|grep 
isa_
00055f1c T read_isa_io
00055f24 T write_isa_io
[revol@patrick /boot/home/devel/obos/commands]$ nm /system/lib/libroot.so|grep 
pci_
00055c04 T get_nth_pci_info
00055be4 T read_pci_config
00055bec T write_pci_config

as I've been told, those use system calls to access thoses calls that are
presumably made against the kernel instance of the pci and isa modules.

strings /system/lib/libroot.so|grep misc
tells nothing that would look like /dev/misc/config (the device driver listdev 
uses to access the same calls. I've been told also those libroot calls were 
public in R4 maybe. I would like whoever is to be implementing part of 
libroot not to use the syscalls, but to open("/dev/misc/config"); this would 
be both cleaner and consistend with multi-user stuff in the future (easier to 
chmod a device entry than it is to check the user in the syscall).


Another thing about drivers...
Although NewOS still uses the 2 GB kernel/ 2 GB user scheme, it isn't said it 
won't switch away from this some day...

I'd suggest anyone writing drivers up to now to use those simple macros, not 
very hard, but surely will make switching easier in the future
(there are other issues, but most of the drivers should compile OoTB)
just put them at the top of your source (or the corresponding header file)

#ifndef DONT_TOUCH_USERSPACE
// copy data from kernel space to user space
# define copy_to_user(dst, src, len) memcpy(dst, src, len)
// copy data from user space to kernel space
# define copy_from_user(dst, src, len) memcpy(dst, src, len)
// get a kernel address from a user address (if possible)
# define user_to_kernel(addr) (addr)
// get a user address from a kernel address (if possible)
# define kernel_to_user(addr) (addr)
#endif

and do 

read_hook(..., char *p, ...)
{
...
    copy_to_user(p, my_kernel_buffer, to_copy);
    // instead of memcpy(p, my_kernel_buffer, to_copy);
... 
}


If you have a better suggestion maybe ?

François.

Other related posts: