2004-11-24 17:25:45

by Antonino A. Daplas

[permalink] [raw]
Subject: [PATCH] fbdev: Fix crash if fb_set_var() called before register_framebuffer()

The field info->modelist is initialized during register_framebuffer. This
field is also referred to in fb_set_var(). Thus a call to fb_set_var()
before register_framebuffer() will cause a crash. A few drivers do this,
notably controlfb. (This might fix reports of controlfb crashing in
powermacs).

Signed-off-by: Antonino Daplas <[email protected]>
---

fbmem.c | 5 ++++-
1 files changed, 4 insertions(+), 1 deletion(-)

diff -Nru a/drivers/video/fbmem.c b/drivers/video/fbmem.c
--- a/drivers/video/fbmem.c 2004-11-23 21:20:13 +08:00
+++ b/drivers/video/fbmem.c 2004-11-25 01:09:22 +08:00
@@ -725,7 +725,10 @@
fb_set_cmap(&info->cmap, info);

fb_var_to_videomode(&mode, &info->var);
- fb_add_videomode(&mode, &info->modelist);
+
+ if (info->modelist.prev && info->modelist.next &&
+ !list_empty(&info->modelist))
+ fb_add_videomode(&mode, &info->modelist);

if (info->flags & FBINFO_MISC_MODECHANGEUSER) {
struct fb_event event;





2004-11-26 20:25:37

by Antonino A. Daplas

[permalink] [raw]
Subject: Re: [PATCH] fbdev: Fix crash if fb_set_var() called before register_framebuffer()

On Friday 26 November 2004 08:20, Mario Gaucher wrote:
> > The field info->modelist is initialized during register_framebuffer.
> > This field is also referred to in fb_set_var(). Thus a call to
> > fb_set_var() before register_framebuffer() will cause a crash. A few
> > drivers do this, notably controlfb. (This might fix reports of controlfb
> > crashing in powermacs).
>
> this patch works well... I can now boot my PowerMac 7300 using
> 2.6.10-rc2-bk8 (that I got on kernel.org) with this patch...

That's good.

>
> but I still has some problem with my Matrox Millenium PCI card using
> matroxfb driver... the kernel boot... but I get corrupted characters on
> the console... X load ok and display ok...

Try this first.

1. Open drivers/video/matrox/matrofb_accel.c
2. At the end of the file is this function:

static void matroxfb_imageblit(struct fb_info* info, const struct fb_image* image) {
MINFO_FROM_INFO(info);

DBG_HEAVY(__FUNCTION__);

if (image->depth == 1) {
u_int32_t fgx, bgx;

fgx = ((u_int32_t*)info->pseudo_palette)[image->fg_color];
bgx = ((u_int32_t*)info->pseudo_palette)[image->bg_color];
matroxfb_1bpp_imageblit(PMINFO fgx, bgx, image->data, image->width, image->height, image->dy, image->dx);
} else {
/* Danger! image->depth is useless: logo painting code always
passes framebuffer color depth here, although logo data are
always 8bpp and info->pseudo_palette is changed to contain
logo palette to be used (but only for true/direct-color... sic...).
So do it completely in software... */
cfb_imageblit(info, image);
}
}

3. Replace the above function to use software drawing so it becomes like this:

static void matroxfb_imageblit(struct fb_info* info, const struct fb_image* image) {
cfb_imageblit(info, image);
}

Tony


2004-11-26 23:19:52

by Mario Gaucher

[permalink] [raw]
Subject: Re: [PATCH] fbdev: Fix crash if fb_set_var() called before register_framebuffer()


From: "Antonino A. Daplas" <[email protected]>
> > but I still has some problem with my Matrox Millenium PCI card using
> > matroxfb driver... the kernel boot... but I get corrupted characters on
> > the console... X load ok and display ok...
>
> Try this first.
>
> 1. Open drivers/video/matrox/matrofb_accel.c
> 2. At the end of the file is this function:
>
> static void matroxfb_imageblit(struct fb_info* info, const struct
fb_image* image) {
> MINFO_FROM_INFO(info);
>
> DBG_HEAVY(__FUNCTION__);
>
> if (image->depth == 1) {
> u_int32_t fgx, bgx;
>
> fgx = ((u_int32_t*)info->pseudo_palette)[image->fg_color];
> bgx = ((u_int32_t*)info->pseudo_palette)[image->bg_color];
> matroxfb_1bpp_imageblit(PMINFO fgx, bgx, image->data, image->width,
image->height, image->dy, image->dx);
> } else {
> /* Danger! image->depth is useless: logo painting code always
> passes framebuffer color depth here, although logo data are
> always 8bpp and info->pseudo_palette is changed to contain
> logo palette to be used (but only for true/direct-color... sic...).
> So do it completely in software... */
> cfb_imageblit(info, image);
> }
> }
>
> 3. Replace the above function to use software drawing so it becomes like
this:
>
> static void matroxfb_imageblit(struct fb_info* info, const struct
fb_image* image) {
> cfb_imageblit(info, image);
> }


this patch works fine on my PowerMac 7300 with my Matrox Millenium PCI
card...

so I think that both patch you sent me should be included in the kernel...

thank you

2004-11-26 23:39:05

by Antonino A. Daplas

[permalink] [raw]
Subject: Re: [PATCH] fbdev: Fix crash if fb_set_var() called before register_framebuffer()

On Saturday 27 November 2004 07:17, Mario Gaucher wrote:
> From: "Antonino A. Daplas" <[email protected]>
>
> > > but I still has some problem with my Matrox Millenium PCI card using
> > > matroxfb driver... the kernel boot... but I get corrupted characters on
> > > the console... X load ok and display ok...
> >
> > Try this first.
> >
> > 1. Open drivers/video/matrox/matrofb_accel.c
> > 2. At the end of the file is this function:
> >
> > static void matroxfb_imageblit(struct fb_info* info, const struct
>
> fb_image* image) {
>
> > MINFO_FROM_INFO(info);
> >
> > DBG_HEAVY(__FUNCTION__);
> >
> > if (image->depth == 1) {
> > u_int32_t fgx, bgx;
> >
> > fgx = ((u_int32_t*)info->pseudo_palette)[image->fg_color];
> > bgx = ((u_int32_t*)info->pseudo_palette)[image->bg_color];
> > matroxfb_1bpp_imageblit(PMINFO fgx, bgx, image->data, image->width,
>
> image->height, image->dy, image->dx);
>
> > } else {
> > /* Danger! image->depth is useless: logo painting code always
> > passes framebuffer color depth here, although logo data are
> > always 8bpp and info->pseudo_palette is changed to contain
> > logo palette to be used (but only for true/direct-color... sic...).
> > So do it completely in software... */
> > cfb_imageblit(info, image);
> > }
> > }
> >
> > 3. Replace the above function to use software drawing so it becomes like
>
> this:
> > static void matroxfb_imageblit(struct fb_info* info, const struct
>
> fb_image* image) {
>
> > cfb_imageblit(info, image);
> > }
>
> this patch works fine on my PowerMac 7300 with my Matrox Millenium PCI
> card...
>
> so I think that both patch you sent me should be included in the kernel...

No, this modification is for testing purposes only. It means that hardware
color expansion in matroxfb for powerpc's got broken. CC'ed Petr.

Tony


2004-11-27 02:02:48

by Mario Gaucher

[permalink] [raw]
Subject: Re: [PATCH] fbdev: Fix crash if fb_set_var() called before register_framebuffer()


> The field info->modelist is initialized during register_framebuffer. This
> field is also referred to in fb_set_var(). Thus a call to fb_set_var()
> before register_framebuffer() will cause a crash. A few drivers do this,
> notably controlfb. (This might fix reports of controlfb crashing in
> powermacs).


this patch works well... I can now boot my PowerMac 7300 using
2.6.10-rc2-bk8 (that I got on kernel.org) with this patch...

but I still has some problem with my Matrox Millenium PCI card using
matroxfb driver... the kernel boot... but I get corrupted characters on
the console... X load ok and display ok...
It works really well with the onboard video (controlfb driver)

matroxfb driver works fine on 2.6.8