From: Julian Seward Date: Mon, 28 Aug 2006 12:08:10 +0000 (+0000) Subject: Merge r5970 (fix for: Lacks support for VKI_[GP]IO_UNIMAP*) X-Git-Tag: svn/VALGRIND_3_2_1~31 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9ef22f015f93a7d176e7b95f1bc56d2d7dcdc5d1;p=thirdparty%2Fvalgrind.git Merge r5970 (fix for: Lacks support for VKI_[GP]IO_UNIMAP*) git-svn-id: svn://svn.valgrind.org/valgrind/branches/VALGRIND_3_2_BRANCH@6018 --- diff --git a/coregrind/m_syswrap/syswrap-generic.c b/coregrind/m_syswrap/syswrap-generic.c index 322b02464e..ebb8d0578e 100644 --- a/coregrind/m_syswrap/syswrap-generic.c +++ b/coregrind/m_syswrap/syswrap-generic.c @@ -3815,6 +3815,32 @@ PRE(sys_ioctl) VKI_E_TABSZ * sizeof(unsigned short) ); break; + case VKI_GIO_UNIMAP: + if ( ARG3 ) { + struct vki_unimapdesc *desc = (struct vki_unimapdesc *) ARG3; + PRE_MEM_READ( "ioctl(GIO_UNIMAP)", (Addr)&desc->entry_ct, + sizeof(unsigned short)); + PRE_MEM_READ( "ioctl(GIO_UNIMAP)", (Addr)&desc->entries, + sizeof(struct vki_unipair *)); + PRE_MEM_WRITE( "ioctl(GIO_UNIMAP).entries", (Addr)desc->entries, + desc->entry_ct * sizeof(struct vki_unipair)); + } + break; + case VKI_PIO_UNIMAP: + if ( ARG3 ) { + struct vki_unimapdesc *desc = (struct vki_unimapdesc *) ARG3; + PRE_MEM_READ( "ioctl(GIO_UNIMAP)", (Addr)&desc->entry_ct, + sizeof(unsigned short) ); + PRE_MEM_READ( "ioctl(GIO_UNIMAP)", (Addr)&desc->entries, + sizeof(struct vki_unipair *) ); + PRE_MEM_READ( "ioctl(PIO_UNIMAP).entries", (Addr)desc->entries, + desc->entry_ct * sizeof(struct vki_unipair) ); + } + break; + case VKI_PIO_UNIMAPCLR: + PRE_MEM_READ( "ioctl(GIO_UNIMAP)", ARG3, sizeof(struct vki_unimapinit)); + break; + case VKI_KDGKBMODE: PRE_MEM_WRITE( "ioctl(KDGKBMODE)", ARG3, sizeof(int) ); break; @@ -3902,6 +3928,68 @@ PRE(sys_ioctl) case VKI_KDKBDREP: PRE_MEM_READ( "ioctl(KBKBDREP)", ARG3, sizeof(struct vki_kbd_repeat) ); break; + + case VKI_KDFONTOP: + if ( ARG3 ) { + struct vki_console_font_op *op = (struct vki_console_font_op *) ARG3; + PRE_MEM_READ( "ioctl(KDFONTOP)", (Addr)op, + sizeof(struct vki_console_font_op) ); + switch ( op->op ) { + case VKI_KD_FONT_OP_SET: + PRE_MEM_READ( "ioctl(KDFONTOP,KD_FONT_OP_SET).data", + (Addr)op->data, + (op->width + 7) / 8 * 32 * op->charcount ); + break; + case VKI_KD_FONT_OP_GET: + if ( op->data ) + PRE_MEM_WRITE( "ioctl(KDFONTOP,KD_FONT_OP_GET).data", + (Addr)op->data, + (op->width + 7) / 8 * 32 * op->charcount ); + break; + case VKI_KD_FONT_OP_SET_DEFAULT: + if ( op->data ) + PRE_MEM_RASCIIZ( "ioctl(KDFONTOP,KD_FONT_OP_SET_DEFAULT).data", + (Addr)op->data ); + break; + case VKI_KD_FONT_OP_COPY: + break; + } + } + break; + + case VKI_VT_OPENQRY: + PRE_MEM_WRITE( "ioctl(VT_OPENQRY)", ARG3, sizeof(int) ); + break; + case VKI_VT_GETMODE: + PRE_MEM_WRITE( "ioctl(VT_GETMODE)", ARG3, sizeof(struct vki_vt_mode) ); + break; + case VKI_VT_SETMODE: + PRE_MEM_READ( "ioctl(VT_SETMODE)", ARG3, sizeof(struct vki_vt_mode) ); + break; + case VKI_VT_GETSTATE: + PRE_MEM_READ( "ioctl(VT_GETSTATE)", ARG3, sizeof(struct vki_vt_stat) ); + PRE_MEM_WRITE( "ioctl(VT_GETSTATE).v_active", + (Addr) &(((struct vki_vt_stat*) ARG3)->v_active), + sizeof(((struct vki_vt_stat*) ARG3)->v_active)); + PRE_MEM_WRITE( "ioctl(VT_GETSTATE).v_state", + (Addr) &(((struct vki_vt_stat*) ARG3)->v_state), + sizeof(((struct vki_vt_stat*) ARG3)->v_state)); + break; + case VKI_VT_RELDISP: + case VKI_VT_ACTIVATE: + case VKI_VT_WAITACTIVE: + case VKI_VT_DISALLOCATE: + break; + case VKI_VT_RESIZE: + PRE_MEM_READ( "ioctl(VT_RESIZE)", ARG3, sizeof(struct vki_vt_sizes) ); + break; + case VKI_VT_RESIZEX: + PRE_MEM_READ( "ioctl(VT_RESIZEX)", ARG3, sizeof(struct vki_vt_consize) ); + break; + case VKI_VT_LOCKSWITCH: + case VKI_VT_UNLOCKSWITCH: + break; + /* We don't have any specific information on it, so try to do something reasonable based on direction and @@ -4453,6 +4541,19 @@ POST(sys_ioctl) case VKI_PIO_UNISCRNMAP: break; + case VKI_GIO_UNIMAP: + if ( ARG3 ) { + struct vki_unimapdesc *desc = (struct vki_unimapdesc *) ARG3; + POST_MEM_WRITE( (Addr)&desc->entry_ct, sizeof(desc->entry_ct)); + POST_MEM_WRITE( (Addr)desc->entries, + desc->entry_ct * sizeof(struct vki_unipair) ); + } + break; + case VKI_PIO_UNIMAP: + break; + case VKI_PIO_UNIMAPCLR: + break; + case VKI_KDGKBMODE: POST_MEM_WRITE( ARG3, sizeof(int) ); break; @@ -4504,6 +4605,54 @@ POST(sys_ioctl) case VKI_KDKBDREP: break; + case VKI_KDFONTOP: + if ( ARG3 ) { + struct vki_console_font_op *op = (struct vki_console_font_op *) ARG3; + switch ( op->op ) { + case VKI_KD_FONT_OP_SET: + break; + case VKI_KD_FONT_OP_GET: + if ( op->data ) + POST_MEM_WRITE( (Addr) op->data, + (op->width + 7) / 8 * 32 * op->charcount ); + break; + case VKI_KD_FONT_OP_SET_DEFAULT: + break; + case VKI_KD_FONT_OP_COPY: + break; + } + POST_MEM_WRITE( (Addr) op, sizeof(*op)); + } + break; + + case VKI_VT_OPENQRY: + POST_MEM_WRITE( ARG3, sizeof(int) ); + break; + case VKI_VT_GETMODE: + POST_MEM_WRITE( ARG3, sizeof(struct vki_vt_mode) ); + break; + case VKI_VT_SETMODE: + break; + case VKI_VT_GETSTATE: + POST_MEM_WRITE( (Addr) &(((struct vki_vt_stat*) ARG3)->v_active), + sizeof(((struct vki_vt_stat*) ARG3)->v_active) ); + POST_MEM_WRITE( (Addr) &(((struct vki_vt_stat*) ARG3)->v_state), + sizeof(((struct vki_vt_stat*) ARG3)->v_state) ); + break; + case VKI_VT_RELDISP: + case VKI_VT_ACTIVATE: + case VKI_VT_WAITACTIVE: + case VKI_VT_DISALLOCATE: + break; + case VKI_VT_RESIZE: + break; + case VKI_VT_RESIZEX: + break; + case VKI_VT_LOCKSWITCH: + case VKI_VT_UNLOCKSWITCH: + break; + + /* We don't have any specific information on it, so try to do something reasonable based on direction and size bits. The encoding scheme is described in diff --git a/include/vki-linux.h b/include/vki-linux.h index 1a51df5e30..7066709a0b 100644 --- a/include/vki-linux.h +++ b/include/vki-linux.h @@ -1941,7 +1941,7 @@ struct vki_fb_var_screeninfo { }; //---------------------------------------------------------------------- -// From linux-2.6.9/include/linux/kb.h +// From linux-2.6.9/include/linux/kd.h //---------------------------------------------------------------------- #define VKI_GIO_FONT 0x4B60 /* gets font in expanded form */ @@ -1986,8 +1986,21 @@ struct vki_consolefontdesc { #define VKI_PIO_UNISCRNMAP 0x4B6A /* set full Unicode screen mapping */ #define VKI_GIO_UNIMAP 0x4B66 /* get unicode-to-font mapping from kernel */ +struct vki_unipair { + unsigned short unicode; + unsigned short fontpos; +}; +struct vki_unimapdesc { + unsigned short entry_ct; + struct vki_unipair __user *entries; +}; #define VKI_PIO_UNIMAP 0x4B67 /* put unicode-to-font mapping in kernel */ #define VKI_PIO_UNIMAPCLR 0x4B68 /* clear table, possibly advise hash algorithm */ +struct vki_unimapinit { + unsigned short advised_hashsize; /* 0 if no opinion */ + unsigned short advised_hashstep; /* 0 if no opinion */ + unsigned short advised_hashlevel; /* 0 if no opinion */ +}; #define VKI_KDGKBMODE 0x4B44 /* gets current keyboard mode */ #define VKI_KDSKBMODE 0x4B45 /* sets current keyboard mode */ @@ -2041,6 +2054,19 @@ struct vki_kbd_repeat { #define VKI_KDFONTOP 0x4B72 /* font operations */ +struct vki_console_font_op { + unsigned int op; /* operation code KD_FONT_OP_* */ + unsigned int flags; /* KD_FONT_FLAG_* */ + unsigned int width, height; /* font size */ + unsigned int charcount; + unsigned char __user *data; /* font data with height fixed to 32 */ +}; + +#define VKI_KD_FONT_OP_SET 0 /* Set font */ +#define VKI_KD_FONT_OP_GET 1 /* Get font */ +#define VKI_KD_FONT_OP_SET_DEFAULT 2 /* Set font to default, data points to name / NULL */ +#define VKI_KD_FONT_OP_COPY 3 /* Copy from another console */ + //---------------------------------------------------------------------- // From linux-2.6.9/include/linux/kb.h //---------------------------------------------------------------------- @@ -2097,6 +2123,55 @@ struct vki_serial_icounter_struct { #endif // __VKI_LINUX_H +//---------------------------------------------------------------------- +// From linux-2.6.16/include/linux/vt.h +//---------------------------------------------------------------------- + +#define VKI_VT_OPENQRY 0x5600 /* find available vt */ + +struct vki_vt_mode { + char mode; /* vt mode */ + char waitv; /* if set, hang on writes if not active */ + short relsig; /* signal to raise on release req */ + short acqsig; /* signal to raise on acquisition */ + short frsig; /* unused (set to 0) */ +}; +#define VKI_VT_GETMODE 0x5601 /* get mode of active vt */ +#define VKI_VT_SETMODE 0x5602 /* set mode of active vt */ + +struct vki_vt_stat { + unsigned short v_active; /* active vt */ + unsigned short v_signal; /* signal to send */ + unsigned short v_state; /* vt bitmask */ +}; +#define VKI_VT_GETSTATE 0x5603 /* get global vt state info */ +#define VKI_VT_SENDSIG 0x5604 /* signal to send to bitmask of vts */ + +#define VKI_VT_RELDISP 0x5605 /* release display */ + +#define VKI_VT_ACTIVATE 0x5606 /* make vt active */ +#define VKI_VT_WAITACTIVE 0x5607 /* wait for vt active */ +#define VKI_VT_DISALLOCATE 0x5608 /* free memory associated to vt */ + +struct vki_vt_sizes { + unsigned short v_rows; /* number of rows */ + unsigned short v_cols; /* number of columns */ + unsigned short v_scrollsize; /* number of lines of scrollback */ +}; +#define VKI_VT_RESIZE 0x5609 /* set kernel's idea of screensize */ + +struct vki_vt_consize { + unsigned short v_rows; /* number of rows */ + unsigned short v_cols; /* number of columns */ + unsigned short v_vlin; /* number of pixel rows on screen */ + unsigned short v_clin; /* number of pixel rows per character */ + unsigned short v_vcol; /* number of pixel columns on screen */ + unsigned short v_ccol; /* number of pixel columns per character */ +}; +#define VKI_VT_RESIZEX 0x560A /* set kernel's idea of screensize + more */ +#define VKI_VT_LOCKSWITCH 0x560B /* disallow vt switching */ +#define VKI_VT_UNLOCKSWITCH 0x560C /* allow vt switching */ + /*--------------------------------------------------------------------*/ /*--- end ---*/ /*--------------------------------------------------------------------*/