|
From: <sv...@va...> - 2006-06-07 18:35:38
|
Author: tom
Date: 2006-06-07 19:35:34 +0100 (Wed, 07 Jun 2006)
New Revision: 5970
Log:
Implement some more terminal ioctls. Fixes bug #124039.
Modified:
trunk/coregrind/m_syswrap/syswrap-generic.c
trunk/include/vki-linux.h
Modified: trunk/coregrind/m_syswrap/syswrap-generic.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- trunk/coregrind/m_syswrap/syswrap-generic.c 2006-06-07 17:51:27 UTC (=
rev 5969)
+++ trunk/coregrind/m_syswrap/syswrap-generic.c 2006-06-07 18:35:34 UTC (=
rev 5970)
@@ -3815,6 +3815,32 @@
VKI_E_TABSZ * sizeof(unsigned short) );
break;
=20
+ case VKI_GIO_UNIMAP:
+ if ( ARG3 ) {
+ struct vki_unimapdesc *desc =3D (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 =3D (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_unimapi=
nit));
+ break;
+
case VKI_KDGKBMODE:
PRE_MEM_WRITE( "ioctl(KDGKBMODE)", ARG3, sizeof(int) );
break;
@@ -3902,6 +3928,68 @@
case VKI_KDKBDREP:
PRE_MEM_READ( "ioctl(KBKBDREP)", ARG3, sizeof(struct vki_kbd_repea=
t) );
break;
+
+ case VKI_KDFONTOP:
+ if ( ARG3 ) {
+ struct vki_console_font_op *op =3D (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->charcoun=
t );
+ break;
+ case VKI_KD_FONT_OP_SET_DEFAULT:
+ if ( op->data )
+ PRE_MEM_RASCIIZ( "ioctl(KDFONTOP,KD_FONT_OP_SET_DEFAUL=
T).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_mod=
e) );
+ 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_sta=
t) );
+ 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_cons=
ize) );
+ break;
+ case VKI_VT_LOCKSWITCH:
+ case VKI_VT_UNLOCKSWITCH:
+ break;
+
=20
/* We don't have any specific information on it, so
try to do something reasonable based on direction and
@@ -4453,6 +4541,19 @@
case VKI_PIO_UNISCRNMAP:
break;
=20
+ case VKI_GIO_UNIMAP:
+ if ( ARG3 ) {
+ struct vki_unimapdesc *desc =3D (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 @@
case VKI_KDKBDREP:
break;
=20
+ case VKI_KDFONTOP:
+ if ( ARG3 ) {
+ struct vki_console_font_op *op =3D (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->charcou=
nt );
+ 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;
+ =20
+
/* 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
Modified: trunk/include/vki-linux.h
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- trunk/include/vki-linux.h 2006-06-07 17:51:27 UTC (rev 5969)
+++ trunk/include/vki-linux.h 2006-06-07 18:35:34 UTC (rev 5970)
@@ -1941,7 +1941,7 @@
};
=20
//----------------------------------------------------------------------
-// From linux-2.6.9/include/linux/kb.h
+// From linux-2.6.9/include/linux/kd.h
//----------------------------------------------------------------------
=20
#define VKI_GIO_FONT 0x4B60 /* gets font in expanded form */
@@ -1986,8 +1986,21 @@
#define VKI_PIO_UNISCRNMAP 0x4B6A /* set full Unicode screen mapping */
=20
#define VKI_GIO_UNIMAP 0x4B66 /* get unicode-to-font mapping from k=
ernel */
+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 ker=
nel */
#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 */
+};
=20
#define VKI_KDGKBMODE 0x4B44 /* gets current keyboard mode */
#define VKI_KDSKBMODE 0x4B45 /* sets current keyboard mode */
@@ -2041,6 +2054,19 @@
=20
#define VKI_KDFONTOP 0x4B72 /* font operations */
=20
+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 @@
=20
#endif // __VKI_LINUX_H
=20
+//----------------------------------------------------------------------
+// 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 ---*/
/*--------------------------------------------------------------------*/
|