Add support for most of the console driver ioctls. This fixes one of

the ioctls complained about in bug 93096 as well as one that came up
on the mailing list a few weeks ago.


git-svn-id: svn://svn.valgrind.org/valgrind/trunk@2982
This commit is contained in:
Tom Hughes 2004-11-13 00:36:15 +00:00
parent e35a3fb298
commit 8448d42efa
2 changed files with 270 additions and 0 deletions

View File

@ -3486,6 +3486,175 @@ PREx(sys_ioctl, MayBlock)
PRE_MEM_WRITE( "ioctl(PPGETTIME)", arg3, sizeof(struct vki_timeval) );
break;
case VKI_GIO_FONT:
PRE_MEM_WRITE( "ioctl(GIO_FONT)", arg3, 32 * 256 );
break;
case VKI_PIO_FONT:
PRE_MEM_READ( "ioctl(PIO_FONT)", arg3, 32 * 256 );
break;
case VKI_GIO_FONTX:
PRE_MEM_READ( "ioctl(GIO_FONTX)", arg3, sizeof(struct vki_consolefontdesc) );
if ( arg3 ) {
/* ToDo: don't do any of the following if the structure is invalid */
struct vki_consolefontdesc *cfd = (struct vki_consolefontdesc *)arg3;
PRE_MEM_WRITE( "ioctl(GIO_FONTX).chardata", (Addr)cfd->chardata,
32 * cfd->charcount );
}
break;
case VKI_PIO_FONTX:
PRE_MEM_READ( "ioctl(PIO_FONTX)", arg3, sizeof(struct vki_consolefontdesc) );
if ( arg3 ) {
/* ToDo: don't do any of the following if the structure is invalid */
struct vki_consolefontdesc *cfd = (struct vki_consolefontdesc *)arg3;
PRE_MEM_READ( "ioctl(PIO_FONTX).chardata", (Addr)cfd->chardata,
32 * cfd->charcount );
}
break;
case VKI_PIO_FONTRESET:
break;
case VKI_GIO_CMAP:
PRE_MEM_WRITE( "ioctl(GIO_CMAP)", arg3, 16 * 3 );
break;
case VKI_PIO_CMAP:
PRE_MEM_READ( "ioctl(PIO_CMAP)", arg3, 16 * 3 );
break;
case VKI_KIOCSOUND:
case VKI_KDMKTONE:
break;
case VKI_KDGETLED:
PRE_MEM_WRITE( "ioctl(KDGETLED)", arg3, sizeof(char) );
break;
case VKI_KDSETLED:
break;
case VKI_KDGKBTYPE:
PRE_MEM_WRITE( "ioctl(KDGKBTYPE)", arg3, sizeof(char) );
break;
case VKI_KDADDIO:
case VKI_KDDELIO:
case VKI_KDENABIO:
case VKI_KDDISABIO:
break;
case VKI_KDSETMODE:
break;
case VKI_KDGETMODE:
PRE_MEM_WRITE( "ioctl(KDGETMODE)", arg3, sizeof(int) );
break;
case VKI_KDMAPDISP:
case VKI_KDUNMAPDISP:
break;
case VKI_GIO_SCRNMAP:
PRE_MEM_WRITE( "ioctl(GIO_SCRNMAP)", arg3, VKI_E_TABSZ );
break;
case VKI_PIO_SCRNMAP:
PRE_MEM_READ( "ioctl(PIO_SCRNMAP)", arg3, VKI_E_TABSZ );
break;
case VKI_GIO_UNISCRNMAP:
PRE_MEM_WRITE( "ioctl(GIO_UNISCRNMAP)", arg3,
VKI_E_TABSZ * sizeof(unsigned short) );
break;
case VKI_PIO_UNISCRNMAP:
PRE_MEM_READ( "ioctl(PIO_UNISCRNMAP)", arg3,
VKI_E_TABSZ * sizeof(unsigned short) );
break;
case VKI_KDGKBMODE:
PRE_MEM_WRITE( "ioctl(KDGKBMODE)", arg3, sizeof(int) );
break;
case VKI_KDSKBMODE:
break;
case VKI_KDGKBMETA:
PRE_MEM_WRITE( "ioctl(KDGKBMETA)", arg3, sizeof(int) );
break;
case VKI_KDSKBMETA:
break;
case VKI_KDGKBLED:
PRE_MEM_WRITE( "ioctl(KDGKBLED)", arg3, sizeof(char) );
break;
case VKI_KDSKBLED:
break;
case VKI_KDGKBENT:
PRE_MEM_READ( "ioctl(KDGKBENT).kb_table",
(Addr)&((struct vki_kbentry *)arg3)->kb_table,
sizeof(((struct vki_kbentry *)arg3)->kb_table) );
PRE_MEM_READ( "ioctl(KDGKBENT).kb_index",
(Addr)&((struct vki_kbentry *)arg3)->kb_index,
sizeof(((struct vki_kbentry *)arg3)->kb_index) );
PRE_MEM_WRITE( "ioctl(KDGKBENT).kb_value",
(Addr)&((struct vki_kbentry *)arg3)->kb_value,
sizeof(((struct vki_kbentry *)arg3)->kb_value) );
break;
case VKI_KDSKBENT:
PRE_MEM_READ( "ioctl(KDSKBENT).kb_table",
(Addr)&((struct vki_kbentry *)arg3)->kb_table,
sizeof(((struct vki_kbentry *)arg3)->kb_table) );
PRE_MEM_READ( "ioctl(KDSKBENT).kb_index",
(Addr)&((struct vki_kbentry *)arg3)->kb_index,
sizeof(((struct vki_kbentry *)arg3)->kb_index) );
PRE_MEM_READ( "ioctl(KDSKBENT).kb_value",
(Addr)&((struct vki_kbentry *)arg3)->kb_value,
sizeof(((struct vki_kbentry *)arg3)->kb_value) );
break;
case VKI_KDGKBSENT:
PRE_MEM_READ( "ioctl(KDGKBSENT).kb_func",
(Addr)&((struct vki_kbsentry *)arg3)->kb_func,
sizeof(((struct vki_kbsentry *)arg3)->kb_func) );
PRE_MEM_WRITE( "ioctl(KDGKSENT).kb_string",
(Addr)((struct vki_kbsentry *)arg3)->kb_string,
sizeof(((struct vki_kbsentry *)arg3)->kb_string) );
break;
case VKI_KDSKBSENT:
PRE_MEM_READ( "ioctl(KDSKBSENT).kb_func",
(Addr)&((struct vki_kbsentry *)arg3)->kb_func,
sizeof(((struct vki_kbsentry *)arg3)->kb_func) );
PRE_MEM_RASCIIZ( "ioctl(KDSKBSENT).kb_string",
(Addr)((struct vki_kbsentry *)arg3)->kb_string );
break;
case VKI_KDGKBDIACR:
PRE_MEM_WRITE( "ioctl(KDGKBDIACR)", arg3, sizeof(struct vki_kbdiacrs) );
break;
case VKI_KDSKBDIACR:
PRE_MEM_READ( "ioctl(KDSKBDIACR)", arg3, sizeof(struct vki_kbdiacrs) );
break;
case VKI_KDGETKEYCODE:
PRE_MEM_READ( "ioctl(KDGETKEYCODE).scancode",
(Addr)&((struct vki_kbkeycode *)arg3)->scancode,
sizeof(((struct vki_kbkeycode *)arg3)->scancode) );
PRE_MEM_WRITE( "ioctl(KDGETKEYCODE).keycode",
(Addr)((struct vki_kbkeycode *)arg3)->keycode,
sizeof(((struct vki_kbkeycode *)arg3)->keycode) );
break;
case VKI_KDSETKEYCODE:
PRE_MEM_READ( "ioctl(KDSETKEYCODE).scancode",
(Addr)&((struct vki_kbkeycode *)arg3)->scancode,
sizeof(((struct vki_kbkeycode *)arg3)->scancode) );
PRE_MEM_READ( "ioctl(KDSETKEYCODE).keycode",
(Addr)((struct vki_kbkeycode *)arg3)->keycode,
sizeof(((struct vki_kbkeycode *)arg3)->keycode) );
break;
case VKI_KDSIGACCEPT:
break;
case VKI_KDKBDREP:
PRE_MEM_READ( "ioctl(KBKBDREP)", arg3, sizeof(struct vki_kbd_repeat) );
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

View File

@ -1717,6 +1717,107 @@ struct vki_fb_var_screeninfo {
__vki_u32 reserved[5]; /* Reserved for future compatibility */
};
//----------------------------------------------------------------------
// From linux-2.6.9/include/linux/kb.h
//----------------------------------------------------------------------
#define VKI_GIO_FONT 0x4B60 /* gets font in expanded form */
#define VKI_PIO_FONT 0x4B61 /* use font in expanded form */
#define VKI_GIO_FONTX 0x4B6B /* get font using struct consolefontdesc */
#define VKI_PIO_FONTX 0x4B6C /* set font using struct consolefontdesc */
struct vki_consolefontdesc {
unsigned short charcount; /* characters in font (256 or 512) */
unsigned short charheight; /* scan lines per character (1-32) */
char __user *chardata; /* font data in expanded form */
};
#define VKI_PIO_FONTRESET 0x4B6D /* reset to default font */
#define VKI_GIO_CMAP 0x4B70 /* gets colour palette on VGA+ */
#define VKI_PIO_CMAP 0x4B71 /* sets colour palette on VGA+ */
#define VKI_KIOCSOUND 0x4B2F /* start sound generation (0 for off) */
#define VKI_KDMKTONE 0x4B30 /* generate tone */
#define VKI_KDGETLED 0x4B31 /* return current led state */
#define VKI_KDSETLED 0x4B32 /* set led state [lights, not flags] */
#define VKI_KDGKBTYPE 0x4B33 /* get keyboard type */
#define VKI_KDADDIO 0x4B34 /* add i/o port as valid */
#define VKI_KDDELIO 0x4B35 /* del i/o port as valid */
#define VKI_KDENABIO 0x4B36 /* enable i/o to video board */
#define VKI_KDDISABIO 0x4B37 /* disable i/o to video board */
#define VKI_KDSETMODE 0x4B3A /* set text/graphics mode */
#define VKI_KDGETMODE 0x4B3B /* get current mode */
#define VKI_KDMAPDISP 0x4B3C /* map display into address space */
#define VKI_KDUNMAPDISP 0x4B3D /* unmap display from address space */
#define VKI_E_TABSZ 256
#define VKI_GIO_SCRNMAP 0x4B40 /* get screen mapping from kernel */
#define VKI_PIO_SCRNMAP 0x4B41 /* put screen mapping table in kernel */
#define VKI_GIO_UNISCRNMAP 0x4B69 /* get full Unicode screen mapping */
#define VKI_PIO_UNISCRNMAP 0x4B6A /* set full Unicode screen mapping */
#define VKI_GIO_UNIMAP 0x4B66 /* get unicode-to-font mapping from kernel */
#define VKI_PIO_UNIMAP 0x4B67 /* put unicode-to-font mapping in kernel */
#define VKI_PIO_UNIMAPCLR 0x4B68 /* clear table, possibly advise hash algorithm */
#define VKI_KDGKBMODE 0x4B44 /* gets current keyboard mode */
#define VKI_KDSKBMODE 0x4B45 /* sets current keyboard mode */
#define VKI_KDGKBMETA 0x4B62 /* gets meta key handling mode */
#define VKI_KDSKBMETA 0x4B63 /* sets meta key handling mode */
#define VKI_KDGKBLED 0x4B64 /* get led flags (not lights) */
#define VKI_KDSKBLED 0x4B65 /* set led flags (not lights) */
struct vki_kbentry {
unsigned char kb_table;
unsigned char kb_index;
unsigned short kb_value;
};
#define VKI_KDGKBENT 0x4B46 /* gets one entry in translation table */
#define VKI_KDSKBENT 0x4B47 /* sets one entry in translation table */
struct vki_kbsentry {
unsigned char kb_func;
unsigned char kb_string[512];
};
#define VKI_KDGKBSENT 0x4B48 /* gets one function key string entry */
#define VKI_KDSKBSENT 0x4B49 /* sets one function key string entry */
struct vki_kbdiacr {
unsigned char diacr, base, result;
};
struct vki_kbdiacrs {
unsigned int kb_cnt; /* number of entries in following array */
struct vki_kbdiacr kbdiacr[256]; /* MAX_DIACR from keyboard.h */
};
#define VKI_KDGKBDIACR 0x4B4A /* read kernel accent table */
#define VKI_KDSKBDIACR 0x4B4B /* write kernel accent table */
struct vki_kbkeycode {
unsigned int scancode, keycode;
};
#define VKI_KDGETKEYCODE 0x4B4C /* read kernel keycode table entry */
#define VKI_KDSETKEYCODE 0x4B4D /* write kernel keycode table entry */
#define VKI_KDSIGACCEPT 0x4B4E /* accept kbd generated signals */
struct vki_kbd_repeat {
int delay; /* in msec; <= 0: don't change */
int period; /* in msec; <= 0: don't change */
/* earlier this field was misnamed "rate" */
};
#define VKI_KDKBDREP 0x4B52 /* set keyboard delay/repeat rate;
* actually used values are returned */
#define VKI_KDFONTOP 0x4B72 /* font operations */
#endif // __LINUX_VKI_H
/*--------------------------------------------------------------------*/