aboutsummaryrefslogtreecommitdiffstats
path: root/extras/mini-os/lib
diff options
context:
space:
mode:
authorKeir Fraser <keir.fraser@citrix.com>2008-02-26 14:47:23 +0000
committerKeir Fraser <keir.fraser@citrix.com>2008-02-26 14:47:23 +0000
commit26a1b308f37898b744d3b38477edcfb0a23b93cc (patch)
tree568602b1e4b7c88b844a5758baccdaaacc4b64ea /extras/mini-os/lib
parent2e83dbdb929d8a553ffd2f82404e8169d1fe4134 (diff)
downloadxen-26a1b308f37898b744d3b38477edcfb0a23b93cc.tar.gz
xen-26a1b308f37898b744d3b38477edcfb0a23b93cc.tar.bz2
xen-26a1b308f37898b744d3b38477edcfb0a23b93cc.zip
minios: add PVFB support
Signed-off-by: Samuel Thibault <samuel.thibault@eu.citrix.com>
Diffstat (limited to 'extras/mini-os/lib')
-rw-r--r--extras/mini-os/lib/sys.c24
1 files changed, 24 insertions, 0 deletions
diff --git a/extras/mini-os/lib/sys.c b/extras/mini-os/lib/sys.c
index f71e6966bd..13096d1eca 100644
--- a/extras/mini-os/lib/sys.c
+++ b/extras/mini-os/lib/sys.c
@@ -26,6 +26,7 @@
#include <wait.h>
#include <netfront.h>
#include <blkfront.h>
+#include <fbfront.h>
#include <xenbus.h>
#include <xs.h>
@@ -221,6 +222,16 @@ int read(int fd, void *buf, size_t nbytes)
}
return ret;
}
+ case FTYPE_KBD: {
+ int ret, n;
+ n = nbytes / sizeof(union xenkbd_in_event);
+ ret = kbdfront_receive(files[fd].kbd.dev, buf, n);
+ if (ret <= 0) {
+ errno = EAGAIN;
+ return -1;
+ }
+ return ret * sizeof(union xenkbd_in_event);
+ }
case FTYPE_NONE:
case FTYPE_XENBUS:
case FTYPE_EVTCHN:
@@ -261,6 +272,7 @@ int write(int fd, const void *buf, size_t nbytes)
case FTYPE_XENBUS:
case FTYPE_EVTCHN:
case FTYPE_BLK:
+ case FTYPE_KBD:
break;
}
printk("write(%d): Bad descriptor\n", fd);
@@ -318,6 +330,7 @@ int fsync(int fd) {
case FTYPE_EVTCHN:
case FTYPE_TAP:
case FTYPE_BLK:
+ case FTYPE_KBD:
break;
}
printk("fsync(%d): Bad descriptor\n", fd);
@@ -360,6 +373,10 @@ int close(int fd)
shutdown_blkfront(files[fd].blk.dev);
files[fd].type = FTYPE_NONE;
return 0;
+ case FTYPE_KBD:
+ shutdown_kbdfront(files[fd].kbd.dev);
+ files[fd].type = FTYPE_NONE;
+ return 0;
case FTYPE_NONE:
break;
}
@@ -450,6 +467,7 @@ int fstat(int fd, struct stat *buf)
case FTYPE_EVTCHN:
case FTYPE_TAP:
case FTYPE_BLK:
+ case FTYPE_KBD:
break;
}
@@ -477,6 +495,7 @@ int ftruncate(int fd, off_t length)
case FTYPE_EVTCHN:
case FTYPE_TAP:
case FTYPE_BLK:
+ case FTYPE_KBD:
break;
}
@@ -587,6 +606,7 @@ static const char file_types[] = {
[FTYPE_SOCKET] = 'S',
[FTYPE_TAP] = 'T',
[FTYPE_BLK] = 'B',
+ [FTYPE_KBD] = 'K',
};
#ifdef LIBC_DEBUG
static void dump_set(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout)
@@ -694,6 +714,7 @@ static int select_poll(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exce
case FTYPE_EVTCHN:
case FTYPE_TAP:
case FTYPE_BLK:
+ case FTYPE_KBD:
if (FD_ISSET(i, readfds)) {
if (files[i].read)
n++;
@@ -775,6 +796,7 @@ int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds,
DEFINE_WAIT(w2);
DEFINE_WAIT(w3);
DEFINE_WAIT(w4);
+ DEFINE_WAIT(w5);
assert(thread == main_thread);
@@ -795,6 +817,7 @@ int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds,
add_waiter(w2, event_queue);
add_waiter(w3, blkfront_queue);
add_waiter(w4, xenbus_watch_queue);
+ add_waiter(w5, kbdfront_queue);
myread = *readfds;
mywrite = *writefds;
@@ -860,6 +883,7 @@ out:
remove_waiter(w2);
remove_waiter(w3);
remove_waiter(w4);
+ remove_waiter(w5);
return ret;
}