|
From: Antonino D. <ad...@po...> - 2003-01-08 04:03:59
|
On Wed, 2003-01-08 at 06:37, James Simmons wrote: > > > I can run the fb color map tests now if you had a > > chance to fix the code. > > > > I am just running fbtest from the sourceforge fb cvs. > > I'm CC the fbdev list because the fb color map code is a mess. I like to > know what the best approach would be to clean it up. > > FIrst the main bug. In fb_copy_cmap we should be testing to see if > copy_from[to]_user fails. We don't. The other issue is for fb_copy_cmap > We handle memcpy, copy_from_user, and copy)to_user. Now in fb_set_cmap > we use get_user also without any checks. > > So we could have fb_copy_cmap keep handling all these issues and remove > get_user from fb_set_cmap. We would just pass in fbcmap we got from > fb_copy_cmap and pass into fb_set_cmap. The other approach is to > remove copy_from_user in fb_copy_cmap and place it int fb_set_cmap. > > What do you think is the best approach to this? > > I don't know, it looks okay to me except for the following: 1. In case FBIOPUTCMAP, fb_set_cmap() must pass 1 (to imply get info from user space). 2. In case FBIOGETCMAP, fb_copy_cmap() must pass 2 (to imply copy cmap from kernel space to user space) 3. no checks when doing the user access functions (should have no effect really, except for the extra processing). I think fb_set_cmap() is a bit misleading. It mostly implies set the hardware DAC based on the color information in fb_cmap. fb_cmap is either in kernel space or user space. There is no need to copy the actual cmap to kernel space and we just let the user app keep a copy of its own. So fb_copy_cmap() is not necessary when doing an fb_set_cmap() because you have to allocate memory for it, which has to be deallocated after doing an fb_set_cmap(). We cannot use info->cmap because it might be of different length, and it will clobber the console cmap. The copy_from_user() of fb_copy_cmap() may not be needed unless we have support for it. If this is the case, then we have to find a way of saving info->cmap first then allocate memory for the new cmap. Then deallocate the new cmap and restore the default cmap to info->cmap afterwards. You will need additional code for this. In any case, info->cmap is driver-private anyway, and user apps have no business replacing info->cmap with its own. I think the main use of those 2 ioctls is this: 1. save kernel cmap by doing FBIOGETCMAP, 2. set hardware DAC based on user app's cmap using FBIOPUTCMAP, 3. upon exit of the app, restore hardware DAC by doing FBIOPUTCMAP using the cmap taken from FBIOGETCMAP. Tony |