struct display *p = &fb_display[vc->vc_num]; 
static void ud_putcs(struct vc_data *vc, struct fb_info *info,		      const unsigned short *s, int count, int yy, int xx,		      int fg, int bg){	struct fb_image image;	struct display *p = &fb_display[vc->vc_num];	struct fbcon_ops *ops = info->fbcon_par;	u32 width = (vc->vc_font.width + 7)/8;	u32 cellsize = width * vc->vc_font.height;	u32 maxcnt = info->pixmap.size/cellsize;	u32 scan_align = info->pixmap.scan_align - 1;	u32 buf_align = info->pixmap.buf_align - 1;	u32 mod = vc->vc_font.width % 8, cnt, pitch, size;	u32 attribute = get_attribute(info, scr_readw(s));	u8 *dst, *buf = NULL;	u32 vyres = GETVYRES(p->scrollmode, info);	u32 vxres = GETVXRES(p->scrollmode, info);	if (!ops->fontbuffer)		return;	image.fg_color = fg;	image.bg_color = bg;	image.dy = vyres - ((yy * vc->vc_font.height) + vc->vc_font.height);	image.dx = vxres - ((xx + count) * vc->vc_font.width);	image.height = vc->vc_font.height;	image.depth = 1;	if (attribute) {		buf = kmalloc(cellsize, GFP_KERNEL);		if (!buf)			return;	}	s += count - 1;	while (count) {		if (count > maxcnt)			cnt = maxcnt;		else			cnt = count;		image.width = vc->vc_font.width * cnt;		pitch = ((image.width + 7) >> 3) + scan_align;		pitch &= ~scan_align;		size = pitch * image.height + buf_align;		size &= ~buf_align;		dst = fb_get_buffer_offset(info, &info->pixmap, size);		image.data = dst;		if (!mod)			ud_putcs_aligned(vc, info, s, attribute, cnt, pitch,					 width, cellsize, &image, buf, dst);		else			ud_putcs_unaligned(vc, info, s, attribute, cnt, pitch,					   width, cellsize, &image,					   buf, dst);		image.dx += image.width;		count -= cnt;		s -= cnt;		xx += cnt;	}	/* buf is always NULL except when in monochrome mode, so in this case	   it's a gain to check buf against NULL even though kfree() handles	   NULL pointers just fine */	if (unlikely(buf))		kfree(buf);}
4520	/local/tlutelli/issta_data/temp/c/2005_temp/2005/4520/ab767201881fec073157986c314485ab26caa4a0/fbcon_ud.c/buggy/drivers/video/console/fbcon_ud.c