From: James S. <jsi...@in...> - 2002-10-09 19:19:11
|
Started to nuke the global currcon variable. Really bad for pre-emptive kernels. MS: (n) 1. A debilitating and surprisingly widespread affliction that renders the sufferer barely able to perform the simplest task. 2. A disease. James Simmons [jsi...@us...] ____/| fbdev/console/gfx developer \ o.O| http://www.linux-fbdev.org =(_)= http://linuxgfx.sourceforge.net U http://linuxconsole.sourceforge.net You can import this changeset into BK by piping this whole message to: '| bk receive [path to repository]' or apply the patch as usual. =================================================================== ChangeSet@1.718, 2002-10-09 11:55:52-07:00, jsi...@ma... Started to nuke the gloabl currcon variable. I changed over the unimap and font handling functions to use struct vc_data instead. I also seperated out the framebuffer code from the VT code since very soon the framebuffer will be able to function without a VT. arch/mips64/kernel/ioctl32.c | 3 arch/ppc64/kernel/ioctl32.c | 67 +++++++++++-------- arch/sparc64/kernel/ioctl32.c | 34 +++++++--- arch/x86_64/ia32/ia32_ioctl.c | 35 +++++++--- drivers/char/consolemap.c | 142 ++++++++++++++++++++---------------------- drivers/char/keyboard.c | 1 drivers/char/selection.c | 4 - drivers/char/vc_screen.c | 1 drivers/char/vt.c | 65 +++++++++---------- drivers/char/vt_ioctl.c | 44 ++++++------- drivers/video/dummycon.c | 1 drivers/video/mdacon.c | 3 drivers/video/newport_con.c | 1 drivers/video/promcon.c | 13 +-- drivers/video/sticon.c | 1 drivers/video/vgacon.c | 9 +- include/linux/consolemap.h | 6 - include/linux/vt_kern.h | 25 +++---- include/video/fbcon.h | 2 19 files changed, 246 insertions(+), 211 deletions(-) diff -Nru a/arch/mips64/kernel/ioctl32.c b/arch/mips64/kernel/ioctl32.c --- a/arch/mips64/kernel/ioctl32.c Wed Oct 9 11:58:53 2002 +++ b/arch/mips64/kernel/ioctl32.c Wed Oct 9 11:58:53 2002 @@ -619,6 +619,8 @@ IOCTL32_DEFAULT(FIONBIO), IOCTL32_DEFAULT(FIONREAD), +#ifdef CONFIG_VT + IOCTL32_DEFAULT(PIO_FONT), IOCTL32_DEFAULT(GIO_FONT), IOCTL32_DEFAULT(KDSIGACCEPT), @@ -662,6 +664,7 @@ IOCTL32_DEFAULT(VT_RESIZEX), IOCTL32_DEFAULT(VT_LOCKSWITCH), IOCTL32_DEFAULT(VT_UNLOCKSWITCH), +#endif #ifdef CONFIG_NET /* Socket level stuff */ diff -Nru a/arch/ppc64/kernel/ioctl32.c b/arch/ppc64/kernel/ioctl32.c --- a/arch/ppc64/kernel/ioctl32.c Wed Oct 9 11:58:54 2002 +++ b/arch/ppc64/kernel/ioctl32.c Wed Oct 9 11:58:54 2002 @@ -1794,6 +1794,8 @@ static int do_fontx_ioctl(unsigned int fd, int cmd, struct consolefontdesc32 *user_cfd, struct file *file) { + struct tty_struct *tty = (struct tty_struct *) file->private_data; + struct vc_data *vc = (struct vc_data *) tty->driver_data; struct consolefontdesc cfdarg; struct console_font_op op; int i, perm; @@ -1816,7 +1818,7 @@ op.height = cfdarg.charheight; op.charcount = cfdarg.charcount; op.data = cfdarg.chardata; - return con_font_op(fg_console, &op); + return con_font_op(vc, &op); case GIO_FONTX: if (!cfdarg.chardata) return 0; @@ -1826,7 +1828,7 @@ op.height = cfdarg.charheight; op.charcount = cfdarg.charcount; op.data = cfdarg.chardata; - i = con_font_op(fg_console, &op); + i = con_font_op(vc, &op); if (i) return i; cfdarg.charheight = op.height; @@ -1849,9 +1851,10 @@ static int do_kdfontop_ioctl(unsigned int fd, unsigned int cmd, struct console_font_op32 *fontop, struct file *file) { - struct console_font_op op; + struct tty_struct *tty = (struct tty_struct *) file->private_data; + struct vc_data *vc = (struct vc_data *) tty->driver_data; int perm = vt_check(file), i; - struct vt_struct *vt; + struct console_font_op op; if (perm < 0) return perm; @@ -1861,8 +1864,7 @@ return -EPERM; op.data = (unsigned char *)A(((struct console_font_op32 *)&op)->data); op.flags |= KD_FONT_FLAG_OLD; - vt = (struct vt_struct *)((struct tty_struct *)file->private_data)->driver_data; - i = con_font_op(vt->vc_num, &op); + i = con_font_op(vc, &op); if (i) return i; ((struct console_font_op32 *)&op)->data = (unsigned long)op.data; if (copy_to_user((void *) fontop, &op, sizeof(struct console_font_op32))) @@ -1870,6 +1872,33 @@ return 0; } +struct unimapdesc32 { + unsigned short entry_ct; + u32 entries; +}; + +static int do_unimap_ioctl(unsigned int fd, unsigned int cmd, struct unimapdesc32 *user_ud, struct file *file) +{ + struct tty_struct *tty = (struct tty_struct *) file->private_data; + struct vc_data *vc = (struct vc_data *) tty->driver_data; + int perm = vt_check(file); + struct unimapdesc32 tmp; + + if (perm < 0) return perm; + if (copy_from_user(&tmp, user_ud, sizeof tmp)) + return -EFAULT; + switch (cmd) { + case PIO_UNIMAP: + if (!perm) return -EPERM; + return con_set_unimap(vc, tmp.entry_ct, (struct unipair *)A(tmp.entries)); + case GIO_UNIMAP: + return con_get_unimap(vc, tmp.entry_ct, &(user_ud->entry_ct), (struct unipair *)A(tmp.entries)); + } + return 0; +} +#endif /* CONFIG_VT */ + +#ifdef CONFIG_FB struct fb_fix_screeninfo32 { char id[16]; /* identification string eg "TT Builtin" */ unsigned int smem_start; /* Start of frame buffer mem */ @@ -1993,30 +2022,8 @@ } return err; } +#endif /* CONFIG_FB */ -struct unimapdesc32 { - unsigned short entry_ct; - u32 entries; -}; - -static int do_unimap_ioctl(unsigned int fd, unsigned int cmd, struct unimapdesc32 *user_ud, struct file *file) -{ - struct unimapdesc32 tmp; - int perm = vt_check(file); - - if (perm < 0) return perm; - if (copy_from_user(&tmp, user_ud, sizeof tmp)) - return -EFAULT; - switch (cmd) { - case PIO_UNIMAP: - if (!perm) return -EPERM; - return con_set_unimap(fg_console, tmp.entry_ct, (struct unipair *)A(tmp.entries)); - case GIO_UNIMAP: - return con_get_unimap(fg_console, tmp.entry_ct, &(user_ud->entry_ct), (struct unipair *)A(tmp.entries)); - } - return 0; -} -#endif /* CONFIG_VT */ static int do_smb_getmountuid(unsigned int fd, unsigned int cmd, unsigned long arg) { mm_segment_t old_fs = get_fs(); @@ -4465,6 +4472,8 @@ HANDLE_IOCTL(PIO_UNIMAP, do_unimap_ioctl), HANDLE_IOCTL(GIO_UNIMAP, do_unimap_ioctl), HANDLE_IOCTL(KDFONTOP, do_kdfontop_ioctl), +#endif +#ifdef CONFIG_FB HANDLE_IOCTL(FBIOGET_FSCREENINFO, do_fbioget_fscreeninfo_ioctl), HANDLE_IOCTL(FBIOGETCMAP, do_fbiogetcmap_ioctl), HANDLE_IOCTL(FBIOPUTCMAP, do_fbioputcmap_ioctl), diff -Nru a/arch/sparc64/kernel/ioctl32.c b/arch/sparc64/kernel/ioctl32.c --- a/arch/sparc64/kernel/ioctl32.c Wed Oct 9 11:58:53 2002 +++ b/arch/sparc64/kernel/ioctl32.c Wed Oct 9 11:58:54 2002 @@ -873,6 +873,7 @@ return err ? -EFAULT : 0; } +#ifdef CONFIG_FB struct fbcmap32 { int index; /* first element (0 origin) */ int count; @@ -1112,6 +1113,7 @@ if (cmap.transp) kfree(cmap.transp); return err; } +#endif /* CONFIG_FB */ static int hdio_ioctl_trans(unsigned int fd, unsigned int cmd, unsigned long arg) { @@ -2077,6 +2079,7 @@ extern int tty_ioctl(struct inode * inode, struct file * file, unsigned int cmd, unsigned long arg); +#ifdef CONFIG_VT static int vt_check(struct file *file) { struct tty_struct *tty; @@ -2109,6 +2112,8 @@ static int do_fontx_ioctl(unsigned int fd, int cmd, struct consolefontdesc32 *user_cfd, struct file *file) { + struct tty_struct *tty = (struct tty_struct *)file->private_data; + struct vc_data *vc = (struct vc_data *) tty->driver_data; struct consolefontdesc cfdarg; struct console_font_op op; int i, perm; @@ -2131,7 +2136,7 @@ op.height = cfdarg.charheight; op.charcount = cfdarg.charcount; op.data = cfdarg.chardata; - return con_font_op(fg_console, &op); + return con_font_op(vc, &op); case GIO_FONTX: if (!cfdarg.chardata) return 0; @@ -2141,7 +2146,7 @@ op.height = cfdarg.charheight; op.charcount = cfdarg.charcount; op.data = cfdarg.chardata; - i = con_font_op(fg_console, &op); + i = con_font_op(vc, &op); if (i) return i; cfdarg.charheight = op.height; @@ -2164,9 +2169,10 @@ static int do_kdfontop_ioctl(unsigned int fd, unsigned int cmd, struct console_font_op32 *fontop, struct file *file) { - struct console_font_op op; + struct tty_struct *tty = (struct tty_struct *)file->private_data; + struct vc_data *vc = (struct vc_data *) tty->driver_data; int perm = vt_check(file), i; - struct vt_struct *vt; + struct console_font_op op; if (perm < 0) return perm; @@ -2176,8 +2182,7 @@ return -EPERM; op.data = (unsigned char *)A(((struct console_font_op32 *)&op)->data); op.flags |= KD_FONT_FLAG_OLD; - vt = (struct vt_struct *)((struct tty_struct *)file->private_data)->driver_data; - i = con_font_op(vt->vc_num, &op); + i = con_font_op(vc, &op); if (i) return i; ((struct console_font_op32 *)&op)->data = (unsigned long)op.data; if (copy_to_user((void *) fontop, &op, sizeof(struct console_font_op32))) @@ -2192,8 +2197,10 @@ static int do_unimap_ioctl(unsigned int fd, unsigned int cmd, struct unimapdesc32 *user_ud, struct file *file) { - struct unimapdesc32 tmp; + struct tty_struct *tty = (struct tty_struct *)file->private_data; + struct vc_data *vc = (struct vc_data *) tty->driver_data; int perm = vt_check(file); + struct unimapdesc32 tmp; if (perm < 0) return perm; if (copy_from_user(&tmp, user_ud, sizeof tmp)) @@ -2201,12 +2208,13 @@ switch (cmd) { case PIO_UNIMAP: if (!perm) return -EPERM; - return con_set_unimap(fg_console, tmp.entry_ct, (struct unipair *)A(tmp.entries)); + return con_set_unimap(vc, tmp.entry_ct, (struct unipair *)A(tmp.entries)); case GIO_UNIMAP: - return con_get_unimap(fg_console, tmp.entry_ct, &(user_ud->entry_ct), (struct unipair *)A(tmp.entries)); + return con_get_unimap(vc, tmp.entry_ct, &(user_ud->entry_ct), (struct unipair *)A(tmp.entries)); } return 0; } +#endif /* CONFIG_VT */ static int do_smb_getmountuid(unsigned int fd, unsigned int cmd, unsigned long arg) { @@ -4273,6 +4281,7 @@ COMPATIBLE_IOCTL(TIOCSSERIAL) COMPATIBLE_IOCTL(TIOCSERGETLSR) COMPATIBLE_IOCTL(TIOCSLTC) +#ifdef CONFIG_FB /* Big F */ COMPATIBLE_IOCTL(FBIOGTYPE) COMPATIBLE_IOCTL(FBIOSATTR) @@ -4293,6 +4302,7 @@ COMPATIBLE_IOCTL(FBIOPUT_CURSORSTATE) COMPATIBLE_IOCTL(FBIOGET_CON2FBMAP) COMPATIBLE_IOCTL(FBIOPUT_CON2FBMAP) +#endif /* Little f */ COMPATIBLE_IOCTL(FIOCLEX) COMPATIBLE_IOCTL(FIONCLEX) @@ -4423,6 +4433,7 @@ COMPATIBLE_IOCTL(TUNSETIFF) COMPATIBLE_IOCTL(TUNSETPERSIST) COMPATIBLE_IOCTL(TUNSETOWNER) +#ifdef CONFIG_VT /* Big V */ COMPATIBLE_IOCTL(VT_SETMODE) COMPATIBLE_IOCTL(VT_GETMODE) @@ -4436,6 +4447,7 @@ COMPATIBLE_IOCTL(VT_RESIZEX) COMPATIBLE_IOCTL(VT_LOCKSWITCH) COMPATIBLE_IOCTL(VT_UNLOCKSWITCH) +#endif /* Little v */ COMPATIBLE_IOCTL(VUIDSFORMAT) COMPATIBLE_IOCTL(VUIDGFORMAT) @@ -5007,12 +5019,14 @@ HANDLE_IOCTL(0x1260, broken_blkgetsize) HANDLE_IOCTL(BLKSECTGET, w_long) HANDLE_IOCTL(BLKPG, blkpg_ioctl_trans) +#ifdef CONFIG_FB HANDLE_IOCTL(FBIOPUTCMAP32, fbiogetputcmap) HANDLE_IOCTL(FBIOGETCMAP32, fbiogetputcmap) HANDLE_IOCTL(FBIOSCURSOR32, fbiogscursor) HANDLE_IOCTL(FBIOGET_FSCREENINFO, fb_ioctl_trans) HANDLE_IOCTL(FBIOGETCMAP, fb_ioctl_trans) HANDLE_IOCTL(FBIOPUTCMAP, fb_ioctl_trans) +#endif HANDLE_IOCTL(HDIO_GET_UNMASKINTR, hdio_ioctl_trans) HANDLE_IOCTL(HDIO_GET_DMA, hdio_ioctl_trans) HANDLE_IOCTL(HDIO_GET_32BIT, hdio_ioctl_trans) @@ -5048,11 +5062,13 @@ HANDLE_IOCTL(LOOP_GET_STATUS, loop_status) #define AUTOFS_IOC_SETTIMEOUT32 _IOWR(0x93,0x64,unsigned int) HANDLE_IOCTL(AUTOFS_IOC_SETTIMEOUT32, ioc_settimeout) +#ifdef CONFIG_VT HANDLE_IOCTL(PIO_FONTX, do_fontx_ioctl) HANDLE_IOCTL(GIO_FONTX, do_fontx_ioctl) HANDLE_IOCTL(PIO_UNIMAP, do_unimap_ioctl) HANDLE_IOCTL(GIO_UNIMAP, do_unimap_ioctl) HANDLE_IOCTL(KDFONTOP, do_kdfontop_ioctl) +#endif HANDLE_IOCTL(EXT2_IOC32_GETFLAGS, do_ext2_ioctl) HANDLE_IOCTL(EXT2_IOC32_SETFLAGS, do_ext2_ioctl) HANDLE_IOCTL(EXT2_IOC32_GETVERSION, do_ext2_ioctl) diff -Nru a/arch/x86_64/ia32/ia32_ioctl.c b/arch/x86_64/ia32/ia32_ioctl.c --- a/arch/x86_64/ia32/ia32_ioctl.c Wed Oct 9 11:58:53 2002 +++ b/arch/x86_64/ia32/ia32_ioctl.c Wed Oct 9 11:58:53 2002 @@ -790,6 +790,7 @@ return err ? -EFAULT : 0; } +#ifdef CONFIG_FB struct fbcmap32 { int index; /* first element (0 origin) */ int count; @@ -930,6 +931,7 @@ if (cmap.transp) kfree(cmap.transp); return err; } +#endif /* CONFIG_FB */ static int hdio_ioctl_trans(unsigned int fd, unsigned int cmd, unsigned long arg) { @@ -1633,6 +1635,8 @@ extern int tty_ioctl(struct inode * inode, struct file * file, unsigned int cmd, unsigned long arg); +#ifdef CONFIG_VT + static int vt_check(struct file *file) { struct tty_struct *tty; @@ -1665,6 +1669,8 @@ static int do_fontx_ioctl(unsigned int fd, int cmd, struct consolefontdesc32 *user_cfd, struct file *file) { + struct tty_struct *tty = (struct tty_struct *)file->private_data; + struct vc_data *vc = (struct vc_data *) tty->driver_data; struct consolefontdesc cfdarg; struct console_font_op op; int i, perm; @@ -1687,7 +1693,7 @@ op.height = cfdarg.charheight; op.charcount = cfdarg.charcount; op.data = cfdarg.chardata; - return con_font_op(fg_console, &op); + return con_font_op(vc, &op); case GIO_FONTX: if (!cfdarg.chardata) return 0; @@ -1697,7 +1703,7 @@ op.height = cfdarg.charheight; op.charcount = cfdarg.charcount; op.data = cfdarg.chardata; - i = con_font_op(fg_console, &op); + i = con_font_op(vc, &op); if (i) return i; cfdarg.charheight = op.height; @@ -1720,9 +1726,10 @@ static int do_kdfontop_ioctl(unsigned int fd, unsigned int cmd, struct console_font_op32 *fontop, struct file *file) { - struct console_font_op op; + struct tty_struct *tty = (struct tty_struct *)file->private_data; + struct vc_data *vc = (struct vc_data *) tty->driver_data; int perm = vt_check(file), i; - struct vt_struct *vt; + struct console_font_op op; if (perm < 0) return perm; @@ -1732,8 +1739,7 @@ return -EPERM; op.data = (unsigned char *)A(((struct console_font_op32 *)&op)->data); op.flags |= KD_FONT_FLAG_OLD; - vt = (struct vt_struct *)((struct tty_struct *)file->private_data)->driver_data; - i = con_font_op(vt->vc_num, &op); + i = con_font_op(vc, &op); if (i) return i; ((struct console_font_op32 *)&op)->data = (unsigned long)op.data; if (copy_to_user((void *) fontop, &op, sizeof(struct console_font_op32))) @@ -1748,8 +1754,10 @@ static int do_unimap_ioctl(unsigned int fd, unsigned int cmd, struct unimapdesc32 *user_ud, struct file *file) { - struct unimapdesc32 tmp; + struct tty_struct *tty = (struct tty_struct *)file->private_data; + struct vc_data *vc = (struct vc_data *) tty->driver_data; int perm = vt_check(file); + struct unimapdesc32 tmp; if (perm < 0) return perm; if (copy_from_user(&tmp, user_ud, sizeof tmp)) @@ -1757,12 +1765,13 @@ switch (cmd) { case PIO_UNIMAP: if (!perm) return -EPERM; - return con_set_unimap(fg_console, tmp.entry_ct, (struct unipair *)A(tmp.entries)); + return con_set_unimap(vc, tmp.entry_ct, (struct unipair *)A(tmp.entries)); case GIO_UNIMAP: - return con_get_unimap(fg_console, tmp.entry_ct, &(user_ud->entry_ct), (struct unipair *)A(tmp.entries)); + return con_get_unimap(vc, tmp.entry_ct, &(user_ud->entry_ct), (struct unipair *)A(tmp.entries)); } return 0; } +#endif /* CONFIG_VT */ static int do_smb_getmountuid(unsigned int fd, unsigned int cmd, unsigned long arg) { @@ -3172,6 +3181,7 @@ COMPATIBLE_IOCTL(TIOCGPTN) COMPATIBLE_IOCTL(TIOCSPTLCK) COMPATIBLE_IOCTL(TIOCSERGETLSR) +#ifdef CONFIG_FB COMPATIBLE_IOCTL(FBIOGET_VSCREENINFO) COMPATIBLE_IOCTL(FBIOPUT_VSCREENINFO) COMPATIBLE_IOCTL(FBIOPAN_DISPLAY) @@ -3182,6 +3192,7 @@ COMPATIBLE_IOCTL(FBIOPUT_CURSORSTATE) COMPATIBLE_IOCTL(FBIOGET_CON2FBMAP) COMPATIBLE_IOCTL(FBIOPUT_CON2FBMAP) +#endif /* Little f */ COMPATIBLE_IOCTL(FIOCLEX) COMPATIBLE_IOCTL(FIONCLEX) @@ -3291,6 +3302,7 @@ COMPATIBLE_IOCTL(SCSI_IOCTL_TAGGED_DISABLE) COMPATIBLE_IOCTL(SCSI_IOCTL_GET_BUS_NUMBER) COMPATIBLE_IOCTL(SCSI_IOCTL_SEND_COMMAND) +#ifdef CONFIG_VT /* Big V */ COMPATIBLE_IOCTL(VT_SETMODE) COMPATIBLE_IOCTL(VT_GETMODE) @@ -3304,6 +3316,7 @@ COMPATIBLE_IOCTL(VT_RESIZEX) COMPATIBLE_IOCTL(VT_LOCKSWITCH) COMPATIBLE_IOCTL(VT_UNLOCKSWITCH) +#endif /* Little v, the video4linux ioctls */ COMPATIBLE_IOCTL(VIDIOCGCAP) COMPATIBLE_IOCTL(VIDIOCGCHAN) @@ -3747,8 +3760,10 @@ HANDLE_IOCTL(0x1260, broken_blkgetsize) HANDLE_IOCTL(BLKSECTGET, w_long) HANDLE_IOCTL(BLKPG, blkpg_ioctl_trans) +#ifdef CONFIG_FB HANDLE_IOCTL(FBIOGETCMAP, fb_ioctl_trans) HANDLE_IOCTL(FBIOPUTCMAP, fb_ioctl_trans) +#endif HANDLE_IOCTL(HDIO_GET_UNMASKINTR, hdio_ioctl_trans) HANDLE_IOCTL(HDIO_GET_DMA, hdio_ioctl_trans) HANDLE_IOCTL(HDIO_GET_32BIT, hdio_ioctl_trans) @@ -3779,11 +3794,13 @@ HANDLE_IOCTL(CDROM_SEND_PACKET, cdrom_ioctl_trans) HANDLE_IOCTL(LOOP_SET_STATUS, loop_status) HANDLE_IOCTL(LOOP_GET_STATUS, loop_status) +#ifdef CONFIG_VT HANDLE_IOCTL(PIO_FONTX, do_fontx_ioctl) HANDLE_IOCTL(GIO_FONTX, do_fontx_ioctl) HANDLE_IOCTL(PIO_UNIMAP, do_unimap_ioctl) HANDLE_IOCTL(GIO_UNIMAP, do_unimap_ioctl) HANDLE_IOCTL(KDFONTOP, do_kdfontop_ioctl) +#endif HANDLE_IOCTL(EXT2_IOC32_GETFLAGS, do_ext2_ioctl) HANDLE_IOCTL(EXT2_IOC32_SETFLAGS, do_ext2_ioctl) HANDLE_IOCTL(EXT2_IOC32_GETVERSION, do_ext2_ioctl) diff -Nru a/drivers/char/consolemap.c b/drivers/char/consolemap.c --- a/drivers/char/consolemap.c Wed Oct 9 11:58:53 2002 +++ b/drivers/char/consolemap.c Wed Oct 9 11:58:53 2002 @@ -19,7 +19,6 @@ #include <linux/tty.h> #include <asm/uaccess.h> #include <linux/consolemap.h> -#include <linux/console_struct.h> #include <linux/vt_kern.h> static unsigned short translations[][256] = { @@ -182,7 +181,7 @@ static struct uni_pagedir *dflt; -static void set_inverse_transl(struct vc_data *conp, struct uni_pagedir *p, int i) +static void set_inverse_transl(struct vc_data *vc, struct uni_pagedir *p, int i) { int j, glyph; unsigned short *t = translations[i]; @@ -199,7 +198,7 @@ memset(q, 0, MAX_GLYPH); for (j = 0; j < E_TABSZ; j++) { - glyph = conv_uni_to_pc(conp, t[j]); + glyph = conv_uni_to_pc(vc, t[j]); if (glyph >= 0 && glyph < MAX_GLYPH && q[glyph] < 32) { /* prefer '-' above SHY etc. */ q[glyph] = j; @@ -207,10 +206,10 @@ } } -unsigned short *set_translate(int m,int currcons) +void set_translate(struct vc_data *vc, int m) { - inv_translate[currcons] = m; - return translations[m]; + inv_translate[vc->vc_num] = m; + vc->vc_translate = translations[m]; } /* @@ -220,29 +219,32 @@ * was active, or using Unicode. * Still, it is now possible to a certain extent to cut and paste non-ASCII. */ -unsigned char inverse_translate(struct vc_data *conp, int glyph) +unsigned char inverse_translate(struct vc_data *vc, int glyph) { struct uni_pagedir *p; if (glyph < 0 || glyph >= MAX_GLYPH) return 0; - else if (!(p = (struct uni_pagedir *)*conp->vc_uni_pagedir_loc) || - !p->inverse_translations[inv_translate[conp->vc_num]]) + else if (!(p = (struct uni_pagedir *)*vc->vc_uni_pagedir_loc) || + !p->inverse_translations[inv_translate[vc->vc_num]]) return glyph; else - return p->inverse_translations[inv_translate[conp->vc_num]][glyph]; + return p->inverse_translations[inv_translate[vc->vc_num]][glyph]; } static void update_user_maps(void) { - int i; struct uni_pagedir *p, *q = NULL; + struct vc_data *vc; + int i; for (i = 0; i < MAX_NR_CONSOLES; i++) { - if (!vc_cons_allocated(i)) + vc = vc_cons[i].d; + + if (!vc) continue; - p = (struct uni_pagedir *)*vc_cons[i].d->vc_uni_pagedir_loc; + p = (struct uni_pagedir *)*vc->vc_uni_pagedir_loc; if (p && p != q) { - set_inverse_transl(vc_cons[i].d, p, USER_MAP); + set_inverse_transl(vc, p, USER_MAP); q = p; } } @@ -256,7 +258,7 @@ * 0xf000-0xf0ff "transparent" Unicodes) whereas the "new" variants set * Unicodes explicitly. */ -int con_set_trans_old(unsigned char * arg) +int con_set_trans_old(struct vc_data *vc, unsigned char * arg) { int i; unsigned short *p = translations[USER_MAP]; @@ -275,7 +277,7 @@ return 0; } -int con_get_trans_old(unsigned char * arg) +int con_get_trans_old(struct vc_data *vc, unsigned char * arg) { int i, ch; unsigned short *p = translations[USER_MAP]; @@ -286,13 +288,13 @@ for (i=0; i<E_TABSZ ; i++) { - ch = conv_uni_to_pc(vc_cons[fg_console].d, p[i]); + ch = conv_uni_to_pc(vc, p[i]); __put_user((ch & ~0xff) ? 0 : ch, arg+i); } return 0; } -int con_set_trans_new(ushort * arg) +int con_set_trans_new(struct vc_data *vc, ushort * arg) { int i; unsigned short *p = translations[USER_MAP]; @@ -312,7 +314,7 @@ return 0; } -int con_get_trans_new(ushort * arg) +int con_get_trans_new(struct vc_data *vc, ushort * arg) { int i; unsigned short *p = translations[USER_MAP]; @@ -363,28 +365,29 @@ } } -void con_free_unimap(int con) +void con_free_unimap(struct vc_data *vc) { struct uni_pagedir *p; - struct vc_data *conp = vc_cons[con].d; - p = (struct uni_pagedir *)*conp->vc_uni_pagedir_loc; + p = (struct uni_pagedir *)*vc->vc_uni_pagedir_loc; if (!p) return; - *conp->vc_uni_pagedir_loc = 0; + *vc->vc_uni_pagedir_loc = 0; if (--p->refcount) return; con_release_unimap(p); kfree(p); } -static int con_unify_unimap(struct vc_data *conp, struct uni_pagedir *p) +static int con_unify_unimap(struct vc_data *vc, struct uni_pagedir *p) { int i, j, k; struct uni_pagedir *q; for (i = 0; i < MAX_NR_CONSOLES; i++) { - if (!vc_cons_allocated(i)) + struct vc_data *tmp = vc_cons[i].d; + + if (!tmp) continue; - q = (struct uni_pagedir *)*vc_cons[i].d->vc_uni_pagedir_loc; + q = (struct uni_pagedir *)*tmp->vc_uni_pagedir_loc; if (!q || q == p || q->sum != p->sum) continue; for (j = 0; j < 32; j++) { @@ -407,7 +410,7 @@ } if (j == 32) { q->refcount++; - *conp->vc_uni_pagedir_loc = (unsigned long)q; + *vc->vc_uni_pagedir_loc = (unsigned long)q; con_release_unimap(p); kfree(p); return 1; @@ -443,12 +446,11 @@ } /* ui is a leftover from using a hashtable, but might be used again */ -int con_clear_unimap(int con, struct unimapinit *ui) +int con_clear_unimap(struct vc_data *vc, struct unimapinit *ui) { struct uni_pagedir *p, *q; - struct vc_data *conp = vc_cons[con].d; - p = (struct uni_pagedir *)*conp->vc_uni_pagedir_loc; + p = (struct uni_pagedir *)*vc->vc_uni_pagedir_loc; if (p && p->readonly) return -EIO; if (!p || --p->refcount) { q = (struct uni_pagedir *)kmalloc(sizeof(*p), GFP_KERNEL); @@ -458,7 +460,7 @@ } memset(q, 0, sizeof(*q)); q->refcount=1; - *conp->vc_uni_pagedir_loc = (unsigned long)q; + *vc->vc_uni_pagedir_loc = (unsigned long)q; } else { if (p == dflt) dflt = NULL; p->refcount++; @@ -469,13 +471,12 @@ } int -con_set_unimap(int con, ushort ct, struct unipair *list) +con_set_unimap(struct vc_data *vc, ushort ct, struct unipair *list) { - int err = 0, err1, i; struct uni_pagedir *p, *q; - struct vc_data *conp = vc_cons[con].d; - - p = (struct uni_pagedir *)*conp->vc_uni_pagedir_loc; + int err = 0, err1, i; + + p = (struct uni_pagedir *)*vc->vc_uni_pagedir_loc; if (p->readonly) return -EIO; if (!ct) return 0; @@ -484,10 +485,10 @@ int j, k; u16 **p1, *p2, l; - err1 = con_clear_unimap(con, NULL); + err1 = con_clear_unimap(vc, NULL); if (err1) return err1; - q = (struct uni_pagedir *)*conp->vc_uni_pagedir_loc; + q = (struct uni_pagedir *)*vc->vc_uni_pagedir_loc; for (i = 0, l = 0; i < 32; i++) if ((p1 = p->uni_pgdir[i])) for (j = 0; j < 32; j++) @@ -497,7 +498,7 @@ err1 = con_insert_unipair(q, l, p2[k]); if (err1) { p->refcount++; - *conp->vc_uni_pagedir_loc = (unsigned long)p; + *vc->vc_uni_pagedir_loc = (unsigned long)p; con_release_unimap(q); kfree(q); return err1; @@ -516,12 +517,11 @@ list++; } - if (con_unify_unimap(conp, p)) + if (con_unify_unimap(vc, p)) return err; for (i = 0; i <= 3; i++) - set_inverse_transl(conp, p, i); /* Update all inverse translations */ - + set_inverse_transl(vc, p, i); /* Update all inverse translations */ return err; } @@ -531,19 +531,18 @@ PIO_FONTRESET ioctl is called. */ int -con_set_default_unimap(int con) +con_set_default_unimap(struct vc_data *vc) { int i, j, err = 0, err1; u16 *q; struct uni_pagedir *p; - struct vc_data *conp = vc_cons[con].d; if (dflt) { - p = (struct uni_pagedir *)*conp->vc_uni_pagedir_loc; + p = (struct uni_pagedir *)*vc->vc_uni_pagedir_loc; if (p == dflt) return 0; dflt->refcount++; - *conp->vc_uni_pagedir_loc = (unsigned long)dflt; + *vc->vc_uni_pagedir_loc = (unsigned long)dflt; if (p && --p->refcount) { con_release_unimap(p); kfree(p); @@ -552,11 +551,10 @@ } /* The default font is always 256 characters */ - - err = con_clear_unimap(con,NULL); + err = con_clear_unimap(vc, NULL); if (err) return err; - p = (struct uni_pagedir *)*conp->vc_uni_pagedir_loc; + p = (struct uni_pagedir *)*vc->vc_uni_pagedir_loc; q = dfont_unitable; for (i = 0; i < 256; i++) @@ -566,46 +564,43 @@ err = err1; } - if (con_unify_unimap(conp, p)) { - dflt = (struct uni_pagedir *)*conp->vc_uni_pagedir_loc; + if (con_unify_unimap(vc, p)) { + dflt = (struct uni_pagedir *)*vc->vc_uni_pagedir_loc; return err; } for (i = 0; i <= 3; i++) - set_inverse_transl(conp, p, i); /* Update all inverse translations */ + set_inverse_transl(vc, p, i); /* Update all inverse translations */ dflt = p; return err; } int -con_copy_unimap(int dstcon, int srccon) +con_copy_unimap(struct vc_data *dst, struct vc_data *src) { - struct vc_data *sconp = vc_cons[srccon].d; - struct vc_data *dconp = vc_cons[dstcon].d; struct uni_pagedir *q; - if (!vc_cons_allocated(srccon) || !*sconp->vc_uni_pagedir_loc) + if (!src || !*src->vc_uni_pagedir_loc) return -EINVAL; - if (*dconp->vc_uni_pagedir_loc == *sconp->vc_uni_pagedir_loc) + if (*dst->vc_uni_pagedir_loc == *src->vc_uni_pagedir_loc) return 0; - con_free_unimap(dstcon); - q = (struct uni_pagedir *)*sconp->vc_uni_pagedir_loc; + con_free_unimap(dst); + q = (struct uni_pagedir *)*src->vc_uni_pagedir_loc; q->refcount++; - *dconp->vc_uni_pagedir_loc = (long)q; + *dst->vc_uni_pagedir_loc = (long)q; return 0; } int -con_get_unimap(int con, ushort ct, ushort *uct, struct unipair *list) +con_get_unimap(struct vc_data *vc, ushort ct, ushort *uct, struct unipair *list) { int i, j, k, ect; u16 **p1, *p2; struct uni_pagedir *p; - struct vc_data *conp = vc_cons[con].d; ect = 0; - if (*conp->vc_uni_pagedir_loc) { - p = (struct uni_pagedir *)*conp->vc_uni_pagedir_loc; + if (*vc->vc_uni_pagedir_loc) { + p = (struct uni_pagedir *)*vc->vc_uni_pagedir_loc; for (i = 0; i < 32; i++) if ((p1 = p->uni_pgdir[i])) for (j = 0; j < 32; j++) @@ -625,16 +620,16 @@ return ((ect <= ct) ? 0 : -ENOMEM); } -void con_protect_unimap(int con, int rdonly) +void con_protect_unimap(struct vc_data *vc, int rdonly) { struct uni_pagedir *p = (struct uni_pagedir *) - *vc_cons[con].d->vc_uni_pagedir_loc; + *vc->vc_uni_pagedir_loc; if (p) p->readonly = rdonly; } int -conv_uni_to_pc(struct vc_data *conp, long ucs) +conv_uni_to_pc(struct vc_data *vc, long ucs) { int h; u16 **p1, *p2; @@ -655,10 +650,10 @@ else if ((ucs & ~UNI_DIRECT_MASK) == UNI_DIRECT_BASE) return ucs & UNI_DIRECT_MASK; - if (!*conp->vc_uni_pagedir_loc) + if (!*vc->vc_uni_pagedir_loc) return -3; - p = (struct uni_pagedir *)*conp->vc_uni_pagedir_loc; + p = (struct uni_pagedir *)*vc->vc_uni_pagedir_loc; if ((p1 = p->uni_pgdir[ucs >> 11]) && (p2 = p1[(ucs >> 6) & 0x1f]) && (h = p2[ucs & 0x3f]) < MAX_GLYPH) @@ -677,7 +672,10 @@ { int i; - for (i = 0; i < MAX_NR_CONSOLES; i++) - if (vc_cons_allocated(i) && !*vc_cons[i].d->vc_uni_pagedir_loc) - con_set_default_unimap(i); + for (i = 0; i < MAX_NR_CONSOLES; i++) { + struct vc_data *vc = vc_cons[i].d; + + if (vc && !*vc->vc_uni_pagedir_loc) + con_set_default_unimap(vc); + } } diff -Nru a/drivers/char/keyboard.c b/drivers/char/keyboard.c --- a/drivers/char/keyboard.c Wed Oct 9 11:58:53 2002 +++ b/drivers/char/keyboard.c Wed Oct 9 11:58:53 2002 @@ -35,7 +35,6 @@ #include <linux/init.h> #include <linux/slab.h> -#include <linux/console_struct.h> #include <linux/kbd_kern.h> #include <linux/kbd_diacr.h> #include <linux/vt_kern.h> diff -Nru a/drivers/char/selection.c b/drivers/char/selection.c --- a/drivers/char/selection.c Wed Oct 9 11:58:53 2002 +++ b/drivers/char/selection.c Wed Oct 9 11:58:53 2002 @@ -22,7 +22,6 @@ #include <linux/vt_kern.h> #include <linux/consolemap.h> -#include <linux/console_struct.h> #include <linux/selection.h> #ifndef MIN @@ -288,7 +287,8 @@ */ int paste_selection(struct tty_struct *tty) { - struct vt_struct *vt = (struct vt_struct *) tty->driver_data; + struct vc_data *vc = (struct vc_data *) tty->driver_data; + struct vt_struct *vt = vt_cons[vc->vc_num]; int pasted = 0, count; DECLARE_WAITQUEUE(wait, current); diff -Nru a/drivers/char/vc_screen.c b/drivers/char/vc_screen.c --- a/drivers/char/vc_screen.c Wed Oct 9 11:58:53 2002 +++ b/drivers/char/vc_screen.c Wed Oct 9 11:58:53 2002 @@ -32,7 +32,6 @@ #include <linux/mm.h> #include <linux/init.h> #include <linux/vt_kern.h> -#include <linux/console_struct.h> #include <linux/selection.h> #include <linux/kbd_kern.h> #include <linux/console.h> diff -Nru a/drivers/char/vt.c b/drivers/char/vt.c --- a/drivers/char/vt.c Wed Oct 9 11:58:53 2002 +++ b/drivers/char/vt.c Wed Oct 9 11:58:53 2002 @@ -90,7 +90,6 @@ #include <linux/devfs_fs_kernel.h> #include <linux/vt_kern.h> #include <linux/selection.h> -#include <linux/console_struct.h> #include <linux/kbd_kern.h> #include <linux/consolemap.h> #include <linux/timer.h> @@ -669,7 +668,7 @@ vt_cons[currcons] = (struct vt_struct *)(p+sizeof(struct vc_data)); visual_init(currcons, 1); if (!*vc_cons[currcons].d->vc_uni_pagedir_loc) - con_set_default_unimap(currcons); + con_set_default_unimap(vc_cons[currcons].d); q = (long)kmalloc(screenbuf_size, GFP_KERNEL); if (!q) { kfree((char *) p); @@ -1073,9 +1072,8 @@ * control chars if defined, don't set * bit 8 on output. */ - translate = set_translate(charset == 0 - ? G0_charset - : G1_charset,currcons); + set_translate(vc_cons[currcons].d, charset == 0 ? + G0_charset : G1_charset); disp_ctrl = 0; toggle_meta = 0; break; @@ -1083,7 +1081,7 @@ * Select first alternate font, lets * chars < 32 be displayed as ROM chars. */ - translate = set_translate(IBMPC_MAP,currcons); + set_translate(vc_cons[currcons].d, IBMPC_MAP); disp_ctrl = 1; toggle_meta = 0; break; @@ -1091,7 +1089,7 @@ * Select second alternate font, toggle * high bit before displaying as ROM char. */ - translate = set_translate(IBMPC_MAP,currcons); + set_translate(vc_cons[currcons].d, IBMPC_MAP); disp_ctrl = 1; toggle_meta = 1; break; @@ -1373,7 +1371,7 @@ color = s_color; G0_charset = saved_G0; G1_charset = saved_G1; - translate = set_translate(charset ? G1_charset : G0_charset,currcons); + set_translate(vc_cons[currcons].d, charset ? G1_charset : G0_charset); update_attr(currcons); need_wrap = 0; } @@ -1389,7 +1387,7 @@ bottom = video_num_lines; vc_state = ESnormal; ques = 0; - translate = set_translate(LAT1_MAP,currcons); + set_translate(vc_cons[currcons].d, LAT1_MAP); G0_charset = LAT1_MAP; G1_charset = GRAF_MAP; charset = 0; @@ -1474,12 +1472,12 @@ return; case 14: charset = 1; - translate = set_translate(G1_charset,currcons); + set_translate(vc_cons[currcons].d, G1_charset); disp_ctrl = 1; return; case 15: charset = 0; - translate = set_translate(G0_charset,currcons); + set_translate(vc_cons[currcons].d, G0_charset); disp_ctrl = 0; return; case 24: case 26: @@ -1786,7 +1784,7 @@ else if (c == 'K') G0_charset = USER_MAP; if (charset == 0) - translate = set_translate(G0_charset,currcons); + set_translate(vc_cons[currcons].d, G0_charset); vc_state = ESnormal; return; case ESsetG1: @@ -1799,7 +1797,7 @@ else if (c == 'K') G1_charset = USER_MAP; if (charset == 1) - translate = set_translate(G1_charset,currcons); + set_translate(vc_cons[currcons].d, G1_charset); vc_state = ESnormal; return; default: @@ -1834,9 +1832,9 @@ #endif int c, tc, ok, n = 0, draw_x = -1; - unsigned int currcons; + unsigned int currcons = minor(tty->device) - tty->driver.minor_start; unsigned long draw_from = 0, draw_to = 0; - struct vt_struct *vt = (struct vt_struct *)tty->driver_data; + struct vc_data *vc = (struct vc_data *)tty->driver_data; u16 himask, charmask; const unsigned char *orig_buf = NULL; int orig_count; @@ -1844,13 +1842,12 @@ if (in_interrupt()) return count; - currcons = vt->vc_num; - if (!vc_cons_allocated(currcons)) { + if (!vc) { /* could this happen? */ static int error = 0; if (!error) { error = 1; - printk("con_write: tty %d not allocated\n", currcons+1); + printk("con_write: tty %d not allocated\n", currcons + 1); } return 0; } @@ -2308,7 +2305,8 @@ static void con_unthrottle(struct tty_struct *tty) { - struct vt_struct *vt = (struct vt_struct *) tty->driver_data; + struct vc_data *vc = (struct vc_data *) tty->driver_data; + struct vt_struct *vt = vt_cons[vc->vc_num]; wake_up_interruptible(&vt->paste_wait); } @@ -2345,7 +2343,7 @@ static void con_flush_chars(struct tty_struct *tty) { - struct vt_struct *vt; + struct vc_data *vc; if (in_interrupt()) /* from flush_to_ldisc */ return; @@ -2354,9 +2352,9 @@ /* if we race with con_close(), vt may be null */ acquire_console_sem(); - vt = (struct vt_struct *)tty->driver_data; - if (vt) - set_cursor(vt->vc_num); + vc = (struct vc_data *)tty->driver_data; + if (vc) + set_cursor(vc->vc_num); release_console_sem(); } @@ -2375,7 +2373,7 @@ return i; vt_cons[currcons]->vc_num = currcons; - tty->driver_data = vt_cons[currcons]; + tty->driver_data = vc_cons[currcons].d; vc_cons[currcons].d->vc_tty = tty; if (!tty->winsize.ws_row && !tty->winsize.ws_col) { @@ -2389,15 +2387,15 @@ static void con_close(struct tty_struct *tty, struct file * filp) { - struct vt_struct *vt; + struct vc_data *vc; if (!tty) return; if (tty->count != 1) return; vcs_make_devfs (minor(tty->device) - tty->driver.minor_start, 1); - vt = (struct vt_struct*)tty->driver_data; - if (vt) - vc_cons[vt->vc_num].d->vc_tty = NULL; + vc = (struct vc_data *)tty->driver_data; + if (vc) + vc_cons[vc->vc_num].d->vc_tty = NULL; tty->driver_data = 0; } @@ -2845,12 +2843,13 @@ #define max_font_size 65536 -int con_font_op(int currcons, struct console_font_op *op) +int con_font_op(struct vc_data *vc, struct console_font_op *op) { - int rc = -EINVAL; + struct console_font_op old_op; int size = max_font_size, set; + int currcons = vc->vc_num; + int rc = -EINVAL; u8 *temp = NULL; - struct console_font_op old_op; if (vt_cons[currcons]->vc_mode != KD_TEXT) goto quit; @@ -2891,7 +2890,7 @@ } else if (op->op == KD_FONT_OP_GET) set = 0; else - return sw->con_font_op(vc_cons[currcons].d, op); + return sw->con_font_op(vc, op); if (op->data) { temp = kmalloc(size, GFP_KERNEL); if (!temp) @@ -2904,7 +2903,7 @@ } acquire_console_sem(); - rc = sw->con_font_op(vc_cons[currcons].d, op); + rc = sw->con_font_op(vc, op); release_console_sem(); op->data = old_op.data; diff -Nru a/drivers/char/vt_ioctl.c b/drivers/char/vt_ioctl.c --- a/drivers/char/vt_ioctl.c Wed Oct 9 11:58:53 2002 +++ b/drivers/char/vt_ioctl.c Wed Oct 9 11:58:53 2002 @@ -279,7 +279,7 @@ } static inline int -do_fontx_ioctl(int cmd, struct consolefontdesc *user_cfd, int perm) +do_fontx_ioctl(struct vc_data *vc, int cmd, struct consolefontdesc *user_cfd, int perm) { struct consolefontdesc cfdarg; struct console_font_op op; @@ -298,7 +298,7 @@ op.height = cfdarg.charheight; op.charcount = cfdarg.charcount; op.data = cfdarg.chardata; - return con_font_op(fg_console, &op); + return con_font_op(vc, &op); case GIO_FONTX: { op.op = KD_FONT_OP_GET; op.flags = KD_FONT_FLAG_OLD; @@ -306,7 +306,7 @@ op.height = cfdarg.charheight; op.charcount = cfdarg.charcount; op.data = cfdarg.chardata; - i = con_font_op(fg_console, &op); + i = con_font_op(vc, &op); if (i) return i; cfdarg.charheight = op.height; @@ -320,7 +320,7 @@ } static inline int -do_unimap_ioctl(int cmd, struct unimapdesc *user_ud,int perm) +do_unimap_ioctl(struct vc_data *vc, int cmd, struct unimapdesc *user_ud,int perm) { struct unimapdesc tmp; int i = 0; @@ -336,9 +336,9 @@ case PIO_UNIMAP: if (!perm) return -EPERM; - return con_set_unimap(fg_console, tmp.entry_ct, tmp.entries); + return con_set_unimap(vc, tmp.entry_ct, tmp.entries); case GIO_UNIMAP: - return con_get_unimap(fg_console, tmp.entry_ct, &(user_ud->entry_ct), tmp.entries); + return con_get_unimap(vc, tmp.entry_ct, &(user_ud->entry_ct), tmp.entries); } return 0; } @@ -350,13 +350,13 @@ int vt_ioctl(struct tty_struct *tty, struct file * file, unsigned int cmd, unsigned long arg) { - int i, perm; + struct vc_data *vc = (struct vc_data *)tty->driver_data; + struct kbd_struct * kbd; unsigned int console; unsigned char ucval; - struct kbd_struct * kbd; - struct vt_struct *vt = (struct vt_struct *)tty->driver_data; + int i, perm; - console = vt->vc_num; + console = vc->vc_num; if (!vc_cons_allocated(console)) /* impossible? */ return -ENOIOCTLCMD; @@ -869,7 +869,7 @@ op.height = 0; op.charcount = 256; op.data = (char *) arg; - return con_font_op(fg_console, &op); + return con_font_op(vc, &op); } case GIO_FONT: { @@ -880,7 +880,7 @@ op.height = 32; op.charcount = 256; op.data = (char *) arg; - return con_font_op(fg_console, &op); + return con_font_op(vc, &op); } case PIO_CMAP: @@ -893,7 +893,7 @@ case PIO_FONTX: case GIO_FONTX: - return do_fontx_ioctl(cmd, (struct consolefontdesc *)arg, perm); + return do_fontx_ioctl(vc, cmd, (struct consolefontdesc *)arg, perm); case PIO_FONTRESET: { @@ -909,9 +909,9 @@ struct console_font_op op; op.op = KD_FONT_OP_SET_DEFAULT; op.data = NULL; - i = con_font_op(fg_console, &op); + i = con_font_op(vc, &op); if (i) return i; - con_set_default_unimap(fg_console); + con_set_default_unimap(vc); return 0; } #endif @@ -923,7 +923,7 @@ return -EFAULT; if (!perm && op.op != KD_FONT_OP_GET) return -EPERM; - i = con_font_op(console, &op); + i = con_font_op(vc, &op); if (i) return i; if (copy_to_user((void *) arg, &op, sizeof(op))) return -EFAULT; @@ -933,18 +933,18 @@ case PIO_SCRNMAP: if (!perm) return -EPERM; - return con_set_trans_old((unsigned char *)arg); + return con_set_trans_old(vc, (unsigned char *)arg); case GIO_SCRNMAP: - return con_get_trans_old((unsigned char *)arg); + return con_get_trans_old(vc, (unsigned char *)arg); case PIO_UNISCRNMAP: if (!perm) return -EPERM; - return con_set_trans_new((unsigned short *)arg); + return con_set_trans_new(vc, (unsigned short *)arg); case GIO_UNISCRNMAP: - return con_get_trans_new((unsigned short *)arg); + return con_get_trans_new(vc, (unsigned short *)arg); case PIO_UNIMAPCLR: { struct unimapinit ui; @@ -952,13 +952,13 @@ return -EPERM; i = copy_from_user(&ui, (void *)arg, sizeof(struct unimapinit)); if (i) return -EFAULT; - con_clear_unimap(fg_console, &ui); + con_clear_unimap(vc, &ui); return 0; } case PIO_UNIMAP: case GIO_UNIMAP: - return do_unimap_ioctl(cmd, (struct unimapdesc *)arg, perm); + return do_unimap_ioctl(vc, cmd, (struct unimapdesc *)arg, perm); case VT_LOCKSWITCH: if (!capable(CAP_SYS_TTY_CONFIG)) diff -Nru a/drivers/video/dummycon.c b/drivers/video/dummycon.c --- a/drivers/video/dummycon.c Wed Oct 9 11:58:53 2002 +++ b/drivers/video/dummycon.c Wed Oct 9 11:58:53 2002 @@ -9,7 +9,6 @@ #include <linux/kdev_t.h> #include <linux/tty.h> #include <linux/console.h> -#include <linux/console_struct.h> #include <linux/vt_kern.h> #include <linux/init.h> diff -Nru a/drivers/video/mdacon.c b/drivers/video/mdacon.c --- a/drivers/video/mdacon.c Wed Oct 9 11:58:53 2002 +++ b/drivers/video/mdacon.c Wed Oct 9 11:58:53 2002 @@ -33,7 +33,6 @@ #include <linux/module.h> #include <linux/tty.h> #include <linux/console.h> -#include <linux/console_struct.h> #include <linux/string.h> #include <linux/kd.h> #include <linux/slab.h> @@ -377,7 +376,7 @@ static void mdacon_deinit(struct vc_data *c) { - /* con_set_default_unimap(c->vc_num); */ + /* con_set_default_unimap(c); */ if (mda_display_fg == c) mda_display_fg = NULL; diff -Nru a/drivers/video/newport_con.c b/drivers/video/newport_con.c --- a/drivers/video/newport_con.c Wed Oct 9 11:58:53 2002 +++ b/drivers/video/newport_con.c Wed Oct 9 11:58:53 2002 @@ -16,7 +16,6 @@ #include <linux/kd.h> #include <linux/selection.h> #include <linux/console.h> -#include <linux/console_struct.h> #include <linux/vt_kern.h> #include <linux/mm.h> #include <linux/module.h> diff -Nru a/drivers/video/promcon.c b/drivers/video/promcon.c --- a/drivers/video/promcon.c Wed Oct 9 11:58:53 2002 +++ b/drivers/video/promcon.c Wed Oct 9 11:58:53 2002 @@ -15,7 +15,6 @@ #include <linux/slab.h> #include <linux/delay.h> #include <linux/console.h> -#include <linux/console_struct.h> #include <linux/vt_kern.h> #include <linux/selection.h> #include <linux/fb.h> @@ -156,9 +155,9 @@ k++; } set_fs(KERNEL_DS); - con_clear_unimap(conp->vc_num, NULL); - con_set_unimap(conp->vc_num, k, p); - con_protect_unimap(conp->vc_num, 1); + con_clear_unimap(conp, NULL); + con_set_unimap(conp, k, p); + con_protect_unimap(conp, 1); set_fs(old_fs); kfree(p); } @@ -176,7 +175,7 @@ p = *conp->vc_uni_pagedir_loc; if (conp->vc_uni_pagedir_loc == &conp->vc_uni_pagedir || !--conp->vc_uni_pagedir_loc[1]) - con_free_unimap(conp->vc_num); + con_free_unimap(conp); conp->vc_uni_pagedir_loc = promcon_uni_pagedir; promcon_uni_pagedir[1]++; if (!promcon_uni_pagedir[0] && p) { @@ -193,9 +192,9 @@ { /* When closing the last console, reset video origin */ if (!--promcon_uni_pagedir[1]) - con_free_unimap(conp->vc_num); + con_free_unimap(conp); conp->vc_uni_pagedir_loc = &conp->vc_uni_pagedir; - con_set_default_unimap(conp->vc_num); + con_set_default_unimap(conp); } static int diff -Nru a/drivers/video/sticon.c b/drivers/video/sticon.c --- a/drivers/video/sticon.c Wed Oct 9 11:58:53 2002 +++ b/drivers/video/sticon.c Wed Oct 9 11:58:53 2002 @@ -49,7 +49,6 @@ #include <linux/kernel.h> #include <linux/tty.h> #include <linux/console.h> -#include <linux/console_struct.h> #include <linux/errno.h> #include <linux/vt_kern.h> #include <linux/selection.h> diff -Nru a/drivers/video/vgacon.c b/drivers/video/vgacon.c --- a/drivers/video/vgacon.c Wed Oct 9 11:58:53 2002 +++ b/drivers/video/vgacon.c Wed Oct 9 11:58:53 2002 @@ -41,7 +41,6 @@ #include <linux/kernel.h> #include <linux/tty.h> #include <linux/console.h> -#include <linux/console_struct.h> #include <linux/string.h> #include <linux/kd.h> #include <linux/slab.h> @@ -334,11 +333,11 @@ p = *c->vc_uni_pagedir_loc; if (c->vc_uni_pagedir_loc == &c->vc_uni_pagedir || !--c->vc_uni_pagedir_loc[1]) - con_free_unimap(c->vc_num); + con_free_unimap(c); c->vc_uni_pagedir_loc = vgacon_uni_pagedir; vgacon_uni_pagedir[1]++; if (!vgacon_uni_pagedir[0] && p) - con_set_default_unimap(c->vc_num); + con_set_default_unimap(c); } static inline void vga_set_mem_top(struct vc_data *c) @@ -352,10 +351,10 @@ if (!--vgacon_uni_pagedir[1]) { c->vc_visible_origin = vga_vram_base; vga_set_mem_top(c); - con_free_unimap(c->vc_num); + con_free_unimap(c); } c->vc_uni_pagedir_loc = &c->vc_uni_pagedir; - con_set_default_unimap(c->vc_num); + con_set_default_unimap(c); } static u8 vgacon_build_attr(struct vc_data *c, u8 color, u8 intensity, u8 blink, u8 underline, u8 reverse) diff -Nru a/include/linux/consolemap.h b/include/linux/consolemap.h --- a/include/linux/consolemap.h Wed Oct 9 11:58:54 2002 +++ b/include/linux/consolemap.h Wed Oct 9 11:58:54 2002 @@ -10,6 +10,6 @@ struct vc_data; -extern unsigned char inverse_translate(struct vc_data *conp, int glyph); -extern unsigned short *set_translate(int m,int currcons); -extern int conv_uni_to_pc(struct vc_data *conp, long ucs); +extern unsigned char inverse_translate(struct vc_data *vc, int glyph); +extern void set_translate(struct vc_data *vc, int m); +extern int conv_uni_to_pc(struct vc_data *vc, long ucs); diff -Nru a/include/linux/vt_kern.h b/include/linux/vt_kern.h --- a/include/linux/vt_kern.h Wed Oct 9 11:58:53 2002 +++ b/include/linux/vt_kern.h Wed Oct 9 11:58:53 2002 @@ -7,6 +7,7 @@ */ #include <linux/config.h> +#include <linux/console_struct.h> #include <linux/vt.h> #include <linux/kd.h> #include <linux/tty.h> @@ -51,7 +52,7 @@ void do_blank_screen(int gfx_mode); void unblank_screen(void); void poke_blanked_console(void); -int con_font_op(int currcons, struct console_font_op *op); +int con_font_op(struct vc_data *vc, struct console_font_op *op); int con_set_cmap(unsigned char *cmap); int con_get_cmap(unsigned char *cmap); void scrollback(int); @@ -69,17 +70,17 @@ struct unimapinit; struct unipair; -int con_set_trans_old(unsigned char * table); -int con_get_trans_old(unsigned char * table); -int con_set_trans_new(unsigned short * table); -int con_get_trans_new(unsigned short * table); -int con_clear_unimap(int currcons, struct unimapinit *ui); -int con_set_unimap(int currcons, ushort ct, struct unipair *list); -int con_get_unimap(int currcons, ushort ct, ushort *uct, struct unipair *list); -int con_set_default_unimap(int currcons); -void con_free_unimap(int currcons); -void con_protect_unimap(int currcons, int rdonly); -int con_copy_unimap(int dstcons, int srccons); +int con_set_trans_old(struct vc_data *vc, unsigned char * table); +int con_get_trans_old(struct vc_data *vc, unsigned char * table); +int con_set_trans_new(struct vc_data *vc, unsigned short * table); +int con_get_trans_new(struct vc_data *vc, unsigned short * table); +int con_clear_unimap(struct vc_data *vc, struct unimapinit *ui); +int con_set_unimap(struct vc_data *vc, ushort ct, struct unipair *list); +int con_get_unimap(struct vc_data *vc, ushort ct, ushort *uct, struct unipair *list); +int con_set_default_unimap(struct vc_data *vc); +void con_free_unimap(struct vc_data *vc); +void con_protect_unimap(struct vc_data *vc, int rdonly); +int con_copy_unimap(struct vc_data *dst, struct vc_data *src); /* vt.c */ diff -Nru a/include/video/fbcon.h b/include/video/fbcon.h --- a/include/video/fbcon.h Wed Oct 9 11:58:53 2002 +++ b/include/video/fbcon.h Wed Oct 9 11:58:53 2002 @@ -13,8 +13,8 @@ #include <linux/config.h> #include <linux/types.h> -#include <linux/console_struct.h> #include <linux/vt_buffer.h> +#include <linux/vt_kern.h> #include <asm/io.h> =================================================================== This BitKeeper patch contains the following changesets: + ## Wrapped with gzip_uu ## begin 664 bkpatch4038 M'XL(`&Y\I#T``^T];7/;-M*?I5^!7N<R=FK9Q`M!TFYR2>,TIWG2)),TG9MI M.QJ:I&S5DJ@C*2>^ZO[[L\"2$D61%$G'EWZP^[*V""P6V%<L%M2WY&,<1*>] M/^+);!;.X_ZWY)]AG)SV9N[G3\%T>ARX47(UG<ROC^=!`D_?AR$\/5G&T4D< M>2<>]`FGP2!.W(MIT(<&[]S$NR(W012?]N@Q7W^2W"Z"T][[EZ\^OG[^OM]_ M\H2\N'+GE\&'("%/GO23,+IQIW[\S(7APOEQ$KGS>!8D[K$7SE;KIBMF&`S^ M,:G%#5.NJ#2$M?*H3ZDK:.`;3-A2]+/I/"N=1@$=-0R'FJ;#K!6CG!O]<T*/ M+6H3@YU0X\1P"*6GIGEJLH%AG1H&J<=.OJ,.&1C]'\B7G=.+OD<^)#!2X`-F M,E]>!R2Y"LCE-(2U)]XRBH`;Y,:-)HH7QV1(/#V$3T)@AVZ[G$]F[H*X<Y^, MPWE"X+D/=%^2\7+N)1.8DT*]C`,2)]'22\B--_+=Q"63>9P$KJ^0NM,X)'&P M"")7D1(N$XUZ'+FSX&(Y'L-07NBK#\*9?O++S_A!/)E[@9*,6Q*'0&FQUZ?) M=$HN`J*H5V1D-,&#Y$H-XP*JX_[_$4XI<_KO-@+4'[3\Z?<-U^@_W<,A-_*N M3F:312S%R740S8/IR23TDBEGQUZ.:<+@;`5_V<;*L;DCI2$E=9AA7?`]HK)_ M!"V;MFER:R6$;=-F-,<+`/N(9LX*UM$`>3.IZPO?D((Z0O*@$=&U0^2HYK`X M]EZJ_6BB+,;)S<0/PI.;2Q<DN4`NE2O.*.4KUY4NY98C/=<P+N@^:FM0K\FT M5]1V)&M)Y@($O)1.YAA4K"X$\XRQ<.C%V`],[K0C=!MYCE+3$4P`I>[UL]G2 M._8#Y,=G6XZ`'1.7,_V_D>;(FC;*F0'FA:V$(21=N3QPI.DRZ3*'NH9HQ/+: M(7(4&J9!S<9K"38JRMP(V*;":AIB9=C2X2OIPS**\85G\\"6QE[-JD>?7T]I M&?M-P1:ZFV272LFI00&9E'SL4M,%07#Y/E=11%NUHH++!M()YG6Z](,3P+[\ MK+`IW3R^RKL71]`5IT#;RK4N_`M&'?MB?#%V]NI\'>XUH<Z*F:84+0G-,6>' M5L-BEK'R/1%<^)XGQL*S+%>V(W8'?XY>3KG8;U.W-=-?SF:WY?9)6(8%U`:V M:_J@IKYK-Q>!4N0Y&9#@4)2<NO,DG#^+E^!_@\OP^&`>SH-#5-#%HL;H4T'A M/RY7!K.`5@NL/I!H4\>Q[3&W&UF`F@%R)M\T6FM4'$P#[>M+U-\!L/("(%-R M(3B_\'SAME*L(O:\]G/+EBT%8!Y\6H11,BJ7`=.P[94M;1<LEDL-X9CC<4LA MV!T@;PNH;3=WJ&A8O%'L14%0MKK@$_B*>N;8"Z0E(>*DX[W&H!9YWA$XEM%V M<>-D4NY3057YRG(N7$/ZPAX'P@'OVFY=MW#GZ`0;8/!V2WH=W%Z$;N3OKBAL M)*BS"H3G&X&\8/XX&(_Y7I-5ASQ/J6VT"%/ROJ^$4-AM\)7/I25\VQF/?=.' MWUIZK!(2&3>;NP!D#+CUL.BI3`Z[,1LV0CZU/3!<#+0_\,=\K^>O1ITS_)*V MU_N97QZ6"FE8X/JDY7C>F'''@.U:<XZ7X,YKN^#4T;OEVA!,[:"_:$`(V!:S M9_[D,@@WVXI]`:`-"&T3(@P+0D"]BW:*>VAN-]Q#,TD&SL,>^M[VT#I&?TL& MT2?]+VR)W]6+6(<]]M!R&*'];R>P`1J3%V_?_#A\-?KQA_[0X?KS8.Y/QN3D M\>81>7S2'U+)3<(*W7[YN?^;>B0M>-1+5S9);D?IKX_A=_*$')0\.1Q/IL'@ MZ0(4#E9;\^)LC2)CSN,;+]=]_>FAPC1XBLJ:=CVGTC&`_F$*>[TH2);1'#@T M'RF1&(6+@QOOB#P*%X>J.81#NCG"7F\"(U6V91S;`OSZ$[68F5*C8(8J=2D9 M_21<Z+:::]`6;!^TK9VD21$MP*\]244%RTT.U=L/8@^$-)GAU&3*0+G#[SA( M1MA%SQ`Z'`?S)+H=><G1F@!HL'`G$1#P_"!K,0GB0UP,R5+DK(C\L@[YHP.P M,=%HZ0^>9A\>-AI2#666Z1\8&:5_'/Q:J=IR\,?K?O`G<_A..]#3(>>&S+>S MA%..#^5@T\ZFY?C`5V_:K9UA^6Y$N\+[V2.5.L7Z/5'F$IDIF-0ND1H[/M%J MZ!-AES9@#T[Q/IVBVKF6><5R+G?QB=1R9'NC1[ZX:0>IUF8'X5X?9K.T.7/V M^C#;1(NFX%]AIJ9(R1%[G1CH@W9BMK:0-;.$)A;,SNJ7N8T_^[WE/)Y<SD&, MXRO8RI/,0L-4EM`@M<9G_?^>05@3)R[L3$$5$N*'J<''L.M@C48]'/M'9.L# M;P:?E!'P.'4-ZZ=J4<EC]?_#_I]?FR4]13NH^0PZW"0C[RKPK@\T;6<U;K@' M_<;D0/?[GAB'))58]<$9/O/"Q>U(F8>1FO_!(^AW1#9+,?E/$(X5LL/#C<`/ M7O[X_./KG]7(8`Z\*\`R\P\5"ST7S-6[X=O1QS?#GYZ_.U52#X-\HP9<CSYX M^>[E^Y_.OFQ0@$._VAKZWL."WG_[V2`&"&95>/!;B2,'!UD:4&!`?PZ/(6KG M_:$0.GQ/'7F*)X=H[=HKCL3V'Q3?_<BN[[M3D,?)L^!F$H.3&-S`&BVC(&Z( M'_P\=;@$=RNX06WM\W>.DIN[_(>3Y/MT^'BF6N;P*WC<Q>-+1BNVLU**DKBV MZFBUH?3?[?"W-,;==]B;1;F2<8MKB1?=HUS8:CYD?NZS>D*?R)?)?!6;NPB] M;9FE>SY*J:AV%4,PP;M[1;4'9-#QJ^<*SAGE.I9,X;ZH&3:3:7,A]D7-C()O MU&W_"BDNH,))J7'V!<T,MC0J:&;4-O9D?AC5@<)0PZ\]246%K,_\,/#GFEZ$ M7S;S`TAEBES^CS(_,)13D_D1K$)K!<L%>"J.8[OME)8*P>U<.],PRC,_*ON\ MU<XT2O'!`W/;0^Z</^WWBG<Y#MM725AY'`;;:D&%O>+J1[M$QCH?AH`\#@#+ M@T^\-Y^H#RT+/G&'MQW\X+E.D9Y+2V=$$/1ZF?D`:7>7TYRFJR/_^-=TX>/? MCWV=3S$L26#W!-!61A-^5&?-^RFL6%F_(\6I*-:UM<0@_]"]>KU7QBC[_)2\ MHMD?.(I.L@Y3V'"4X0\_O7LQ@BTJHG`PTX*P$PIN(14(VTST'[D)J=D96[/C M#N:D$#;!^_KYSW1-EK"T<TYAHWD5EE?82`#"9ABVIV#9F()#V&QQ"RAL(\W, M&:PYBNUYV!Q7`F%O.Q^5]@,//)O,P^@`G2[LI+W@D`SR/OA8-P#?#N8'T:;Y M19Z/-_9Y]=)TG[`PA2=L'8VHE,V-IS(Z*A7(TU0@U_.'6&*>7!_\32GDIVB2 M!*>*1O)WG\Q#L`[3:>@ID_3;_&]'F\E]1ZAVWYSJ4RP-V9WR85FC9!WKW"1I M;DRQX\8;/`4$\^7L=SVNGM@PA27CZD:FI6P&0`=@K_'ZZ?6"Y4HE%"8=`Q\W M%.#,K90"#7M%+(KT74G2'5$+6::%Y:0[MB8=W')7TK/A<RMW[.M?,;Q\\_'U M:S64G2XE0BW"N<!UE[QU/K48"#^&^%;ATW',,(654?/4'ZG(6;73HE/0G0W5 M::XT4DLP>#E\\\MS)%N++T"TMRE<!Y#QI\'38@">QM^.@9L,A#V-N++Y3KR5 MKZ/M%G>UJ/#M+]2]D>ZH3<LP5]1TTG,WWCGZL@PRL-A#]'5_QVZRY-BMDL5= MHC"FS(TR_ZGU!Y`>NMR$$Y\H2S>9J^&"U!O6Z3XL^FCA`A_4)FMQI#W?1&D_ M.E>6^M;+Z>WB"K?"-RK"&R7A:.'A=N[7/W['[3":"PW6E&S\<1D1:K29&HTR MW'1SM"`WFWYYLZ=<\9DRHFC]LB;P<?:[DI)?T;-@[0F"M6-7#"#;JU-'FYZV MHH_9FCZF<@.]8`HRJ%WQP2)GSK>6\O!Q2F7NTQ%XX$.R6L%ZDF\6@Z=%.C3Q ME9/_7='!4Y>S55W1'M6O>F+H@-&&<KO<[:=&>Z*:"@P1`'#MEG*N<:)]XF_9 MJ9)R7-`>.2#2\*3M4NDA,<.B01KA%61;L0KD]N.'E^^S`)>9F.[1(/.#:V$< M@<<J9?BVD#PF;G2I9I&&!U;>J5YV1891+X(>@1^O0JL6L*3HY'`%--B=RSSX M5#X\GM1FXW*=H1@BV)U$4RQ2;V<0:`W7GC8*@FS3MXM$=U.S/>>6%A\$G:2! M6QPQ:(&J:`=X#=W6P;;.QCQF$X<>X]MJDBMLHYH)VEP%E`84NR:S15$ER$8G MU%&M0F$A"MQZ_;MZ&:!]Q3H(M+0(0"NJ5V)SY`XN_O+PWZJST$Q$D*V(-X4P MH=F*0(O)?`)"L51N0NAJJ'.!-7`(.O%62,2@0=LI84("02&;62/6*OM83#-. M)W&BIJ6+Q@#H7(6P5`RO[6`014K`CM0O]$B9Q5['^:(<B%0.%+HTT[S%"T6N MBN^5*1!8J"G2.LT:T:D<U<3B33.MW>RU$1Z50C:QS@9!6J50T"=MO`YA#4U= M]#DTF5BG",I-]^3P3&5O/RY\Y<MAGYHYZ"VOK@_?33RQ0%"1>"JU0:;>B9^; M0DL*@FXNR43]0=!B^?SQ5.4&3%,7EIJF[H[B5,MU$YT9@FX42WVB`5L('5S5 M,$T5BO04H5U&T=GV(8(][.XU9;>NH1PBT*ND:F(J^.S'&WU>?QA'FONV$D4` M%J*SUKD4>`X!&?E&-2P-UU0O9("]EGDU5#G3GY`Z1`[5?'!T(5G1=0).5;=2 MH]45F-7:X]890:^:/'*PMIFF@[/2H'!(L\=F9E'!LL:`2GW$!$"GKZ1A9Z)7 M&1;_V5$?)=/Q&8)U4+*(PB3P:F>D<Q%^.)_>*GJYEC0$E5JMAL-X&4$A;BL; M12TX67KQ(8&^)I)J;G)Y5<L!C=$A(NBP,D0-:*NDTU#:C,A^;QQ&Y&"BXR,R M(=^3GY[_:_3F_>C%VS<?WKY^^0$^_.X[Y$-I]J\\U(='CQZ1ZGGT:@X(L$YK M)S&SN3'6,BW3]AY;J_.PW7ML-HS`*5L)RFP33\5V"T6:YF4,,J`/69G[.Q/3 M=PWKLC(;_G;)R>B3XAU)SMW5;2G*K>\0-TXPEF%F!N7<7$%8);#&3W2_ZD8& M#]G%>\PNZBO>=7*<XV^GY**ID_$.IGJ<_^5AT&Y%Q.8V=DOU:7M)O'\9!9?/ MKJ/0O6J`#&2540X[@!5E#G/P%4L/EO^OJ3'ZVGYM,<2&O9TLOUEF^3>O/VDK MN8U?Q]*RFF?W?C/6]`CI.'B_F=[A@K,R^P]V_QYKN_5+<^IK>NYPN?F<84$' M`C_4QZ>?TVL[59NG_(6=]$Q+=5,UA^F='4]=\LGNQZCDIX$I8(/FCR\JRBNY M@1E<8^\=+8Y'/0B*EXZ:4+\IEMQ<-LJ3C>4<")J73>;K%165>'R"X*[UD47< M6`JB0'-_7>VNKR_\M;]6?^@1U$6_H:K$H.F1T%%Z6^F<8XH*02\5A<+1_[F- M25K;VKD87,)1V];S0;"WL2Y\'2)8-RX(L6JO67Y0);&';G2)4U)(':K)15`K M?8ZN`1\BJ-_MGCM,DXJ@'BO'EGRGFG;[($MU.2@<-JF9(`X'<>S([65S'%CT M[8C2DN'-\=$VCC1#M$%B(1*KFI#]2'3U[!`!KO-.TO31<J*;8N[$D;0@$5N6 M84<D\F9@2QKR[KWX:JOF_KW3&[>:>OERY!:SF+KH+E?29`Z_8^W(0Z1ZKSX> M7XI6X>.+_.WBY+4MVY7E['4];26YW2N$V@GR-NY,C"%:M9EC:3&6G<68/J0H M[O<:HGK+4ZT89]SMM-^2NIA`W\X9(E#'215N%[RN.DG:%?JMU]*UE?P.+\UK M)_XE`^1TP*24:ATP'TSY7U0']'L-:W5@B\6=K+E3:LW7[]IM*]0MWP#<3J`+ MR#?"#`.(NPJS)`/K09CO+^>L7])<*\QK]G829'5V<DYU;?^02EU=N!/=PP>+ M=5'$>I.U]?!:U3"D#POGO]B`XLV3].*)L]Y&Y(_A54O=##>5Z:7*FF8V-K/3 MK6^I$\+&N[J:O<.SK:JV>Z]H.TW=QITJJFFLN,73XO/NAT,/7N=^#SGUJU]K M%37C;A<]-<NW#]E;Z-L*<:L7X[>3X6W4F0RK%Y?!,'<\KA%D8#[(\+W),'YW M0:T,9]SM(L,ZC77.L8@'08EQ+TG75N\O5/X3RX)SF:E==%C[@Z`.FU*PZG>^ M[U>RN[Z/_@NA9^K=R0P/EG;OBCO-WQCT<%/\/K][1GUC0$'9JCG<*;CC.JI3 M!?/!YR2(YN1N=W'.,C2M;ABM>Z4%[XVK]LKT<?V%$6V5L=VW6/1OPC\@AKUZ M%H,8'7O_J4=F,Y,JSVFO(`:PJIQ<4[T#K@WH0Y+L_C0/OUND5O/6#.[RQB)\ M4PGB(]]OJ7)ZLG=\]505LV,M.[GS?6%P<>ID3YW#:=#]VI7^\C7`U_VN51%# M@^M2A3.G&B(ZH^AXQV9[&G>XU;(]F2]5ZKU-WOZK&&>-+XZ==:WFSBUYE^L" MVR9_ZXL7FAO\#E\%L6^+4X/:IHQ:5,"V28)A87<U_@^[]'L]YJ,E)9RES.T4 E;V':RBJQ_VN'\G3SU9;Z=;7Q<O;$MX.QXS"O___@&A]!17,````` ` end |