X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=drivers%2Fvideo%2Fsbuslib.c;h=70e875aaa2f5645ae8eb67756410f500c83b8dd2;hb=6a77f38946aaee1cd85eeec6cf4229b204c15071;hp=3820d7e628657664a0e791571c44b68bc64eeda5;hpb=87fc8d1bb10cd459024a742c6a10961fefcef18f;p=linux-2.6.git diff --git a/drivers/video/sbuslib.c b/drivers/video/sbuslib.c index 3820d7e62..70e875aaa 100644 --- a/drivers/video/sbuslib.c +++ b/drivers/video/sbuslib.c @@ -52,7 +52,7 @@ int sbusfb_mmap_helper(struct sbus_mmap_map *map, off = vma->vm_pgoff << PAGE_SHIFT; /* To stop the swapper from even considering these pages */ - vma->vm_flags |= (VM_SHM | VM_IO | VM_LOCKED); + vma->vm_flags |= (VM_IO | VM_RESERVED); /* Each page, see which map applies */ for (page = 0; page < size; ){ @@ -108,6 +108,7 @@ int sbusfb_ioctl_helper(unsigned long cmd, unsigned long arg, struct fbcmap __user *c = (struct fbcmap __user *) arg; struct fb_cmap cmap; u16 red, green, blue; + u8 red8, green8, blue8; unsigned char __user *ured; unsigned char __user *ugreen; unsigned char __user *ublue; @@ -128,11 +129,15 @@ int sbusfb_ioctl_helper(unsigned long cmd, unsigned long arg, for (i = 0; i < count; i++) { int err; - if (get_user(red, &ured[i]) || - get_user(green, &ugreen[i]) || - get_user(blue, &ublue[i])) + if (get_user(red8, &ured[i]) || + get_user(green8, &ugreen[i]) || + get_user(blue8, &ublue[i])) return -EFAULT; + red = red8 << 8; + green = green8 << 8; + blue = blue8 << 8; + cmap.start = index + i; err = fb_set_cmap(&cmap, info); if (err) @@ -147,6 +152,7 @@ int sbusfb_ioctl_helper(unsigned long cmd, unsigned long arg, unsigned char __user *ublue; struct fb_cmap *cmap = &info->cmap; int index, count, i; + u8 red, green, blue; if (get_user(index, &c->index) || __get_user(count, &c->count) || @@ -159,9 +165,12 @@ int sbusfb_ioctl_helper(unsigned long cmd, unsigned long arg, return -EINVAL; for (i = 0; i < count; i++) { - if (put_user(cmap->red[index + i], &ured[i]) || - put_user(cmap->green[index + i], &ugreen[i]) || - put_user(cmap->blue[index + i], &ublue[i])) + red = cmap->red[index + i] >> 8; + green = cmap->green[index + i] >> 8; + blue = cmap->blue[index + i] >> 8; + if (put_user(red, &ured[i]) || + put_user(green, &ugreen[i]) || + put_user(blue, &ublue[i])) return -EFAULT; } return 0;