summaryrefslogtreecommitdiff
path: root/hw/kdrive
diff options
context:
space:
mode:
Diffstat (limited to 'hw/kdrive')
-rw-r--r--hw/kdrive/fbdev/fbdev.c7
-rw-r--r--hw/kdrive/linux/keyboard.c1
-rw-r--r--hw/kdrive/linux/linux.c4
-rw-r--r--hw/kdrive/linux/mouse.c44
-rw-r--r--hw/kdrive/smi/smi.c2
5 files changed, 43 insertions, 15 deletions
diff --git a/hw/kdrive/fbdev/fbdev.c b/hw/kdrive/fbdev/fbdev.c
index cb0a1b399..113584070 100644
--- a/hw/kdrive/fbdev/fbdev.c
+++ b/hw/kdrive/fbdev/fbdev.c
@@ -40,11 +40,15 @@ fbdevInitialize (KdCardInfo *card, FbdevPriv *priv)
perror("Error opening /dev/fb0\n");
return FALSE;
}
+ /* quiet valgrind */
+ memset (&priv->fix, '\0', sizeof (priv->fix));
if ((k=ioctl(priv->fd, FBIOGET_FSCREENINFO, &priv->fix)) < 0) {
perror("Error with /dev/fb ioctl FIOGET_FSCREENINFO");
close (priv->fd);
return FALSE;
}
+ /* quiet valgrind */
+ memset (&priv->var, '\0', sizeof (priv->var));
if ((k=ioctl(priv->fd, FBIOGET_VSCREENINFO, &priv->var)) < 0) {
perror("Error with /dev/fb ioctl FIOGET_VSCREENINFO");
close (priv->fd);
@@ -197,12 +201,13 @@ fbdevScreenInit (KdScreenInfo *screen)
if (!scrpriv)
return FALSE;
memset (scrpriv, '\0', sizeof (FbdevScrPriv));
+ screen->driver = scrpriv;
if (!fbdevScreenInitialize (screen, scrpriv))
{
+ screen->driver = 0;
xfree (scrpriv);
return FALSE;
}
- screen->driver = scrpriv;
return TRUE;
}
diff --git a/hw/kdrive/linux/keyboard.c b/hw/kdrive/linux/keyboard.c
index dba87a00d..27757c3dd 100644
--- a/hw/kdrive/linux/keyboard.c
+++ b/hw/kdrive/linux/keyboard.c
@@ -135,6 +135,7 @@ readKernelMapping(void)
k[j] = NoSymbol;
kbe.kb_table = tbl[j];
+ kbe.kb_value = 0;
if (ioctl(LinuxConsoleFd, KDGKBENT, &kbe))
continue;
diff --git a/hw/kdrive/linux/linux.c b/hw/kdrive/linux/linux.c
index 2badebebe..555102925 100644
--- a/hw/kdrive/linux/linux.c
+++ b/hw/kdrive/linux/linux.c
@@ -118,6 +118,7 @@ LinuxInit (void)
* Linux doesn't switch to an active vt after the last close of a vt,
* so we do this ourselves by remembering which is active now.
*/
+ memset (&vts, '\0', sizeof (vts)); /* valgrind */
if (ioctl(LinuxConsoleFd, VT_GETSTATE, &vts) == 0)
{
activeVT = vts.v_active;
@@ -376,6 +377,7 @@ LinuxSpecialKey (KeySym sym)
if (XK_F1 <= sym && sym <= XK_F12)
{
con = sym - XK_F1 + 1;
+ memset (&vts, '\0', sizeof (vts)); /* valgrind */
ioctl (LinuxConsoleFd, VT_GETSTATE, &vts);
if (con != vts.v_active && (vts.v_state & (1 << con)))
{
@@ -420,6 +422,7 @@ LinuxFini (void)
VT.mode = VT_AUTO;
ioctl(LinuxConsoleFd, VT_SETMODE, &VT); /* set dflt vt handling */
}
+ memset (&vts, '\0', sizeof (vts)); /* valgrind */
ioctl (LinuxConsoleFd, VT_GETSTATE, &vts);
/*
* Find a legal VT to switch to, either the one we started from
@@ -448,6 +451,7 @@ LinuxFini (void)
fd = open ("/dev/tty0", O_RDWR|O_NDELAY, 0);
if (fd >= 0)
{
+ memset (&vts, '\0', sizeof (vts)); /* valgrind */
ioctl (fd, VT_GETSTATE, &vts);
if (ioctl (fd, VT_DISALLOCATE, vtno) < 0)
fprintf (stderr, "Can't deallocate console %d errno %d\n", vtno, errno);
diff --git a/hw/kdrive/linux/mouse.c b/hw/kdrive/linux/mouse.c
index 689c7e9e7..1faffd27b 100644
--- a/hw/kdrive/linux/mouse.c
+++ b/hw/kdrive/linux/mouse.c
@@ -38,6 +38,7 @@
#undef DEBUG
#undef DEBUG_BYTES
#define KBUFIO_SIZE 256
+#define MOUSE_TIMEOUT 100
typedef struct _kbufio {
int fd;
@@ -52,20 +53,32 @@ MouseWaitForReadable (int fd, int timeout)
fd_set set;
struct timeval tv, *tp;
int n;
+ CARD32 done;
- FD_ZERO (&set);
- FD_SET (fd, &set);
- if (timeout == -1)
- tp = 0;
- else
+ done = GetTimeInMillis () + timeout;
+ for (;;)
{
- tv.tv_sec = timeout / 1000;
- tv.tv_usec = (timeout % 1000) * 1000;
- tp = &tv;
+ FD_ZERO (&set);
+ FD_SET (fd, &set);
+ if (timeout == -1)
+ tp = 0;
+ else
+ {
+ tv.tv_sec = timeout / 1000;
+ tv.tv_usec = (timeout % 1000) * 1000;
+ tp = &tv;
+ }
+ n = select (fd + 1, &set, 0, 0, tp);
+ if (n > 0)
+ return TRUE;
+ if (n < 0 && (errno == EAGAIN || errno == EINTR))
+ {
+ timeout = (int) (done - GetTimeInMillis ());
+ if (timeout > 0)
+ continue;
+ }
+ break;
}
- n = select (fd + 1, &set, 0, 0, tp);
- if (n > 0)
- return TRUE;
return FALSE;
}
@@ -76,7 +89,12 @@ MouseReadByte (Kbufio *b, int timeout)
if (b->avail <= b->used)
{
if (timeout && !MouseWaitForReadable (b->fd, timeout))
+ {
+#ifdef DEBUG_BYTES
+ ErrorF ("\tTimeout %d\n", timeout);
+#endif
return -1;
+ }
n = read (b->fd, b->buf, KBUFIO_SIZE);
if (n <= 0)
return -1;
@@ -443,7 +461,7 @@ ps2SkipInit (KdMouseInfo *mi, int ninit, Bool ret_next)
waiting = FALSE;
while (ninit || ret_next)
{
- c = MouseReadByte (&km->iob, 100);
+ c = MouseReadByte (&km->iob, MOUSE_TIMEOUT);
if (c == -1)
break;
/* look for ACK */
@@ -895,7 +913,7 @@ MouseRead (int mousePort, void *closure)
timeout = 0;
}
else
- timeout = 100;
+ timeout = MOUSE_TIMEOUT;
}
}
}
diff --git a/hw/kdrive/smi/smi.c b/hw/kdrive/smi/smi.c
index aaa0b8356..635fca4da 100644
--- a/hw/kdrive/smi/smi.c
+++ b/hw/kdrive/smi/smi.c
@@ -62,6 +62,7 @@ smiScreenInit (KdScreenInfo *screen)
if (!smis)
return FALSE;
memset (smis, '\0', sizeof (SmiScreenInfo));
+ screen->driver = smis;
if (!subScreenInitialize (screen, &smis->sub))
{
xfree (smis);
@@ -75,7 +76,6 @@ smiScreenInit (KdScreenInfo *screen)
#else
smis->screen = smic->sub.fb;
#endif
- screen->driver = smis;
LEAVE();
return TRUE;
}