summaryrefslogtreecommitdiff
path: root/sys/src/9/xen/devrtc.c
diff options
context:
space:
mode:
authormischief <mischief@offblast.org>2014-06-24 18:02:25 -0700
committermischief <mischief@offblast.org>2014-06-24 18:02:25 -0700
commit5ba95fdb07ddc2c32111a1b2f57f17aa27fcbbf5 (patch)
treec1ec54cb9ecff85b0b820a26d26a10a32a118d0c /sys/src/9/xen/devrtc.c
parentfa03455b5057675b18d1c87aef2d1071b2088de0 (diff)
import xen 32 bit paravirtual kernel from /n/sources/xen.
Diffstat (limited to 'sys/src/9/xen/devrtc.c')
-rw-r--r--sys/src/9/xen/devrtc.c96
1 files changed, 96 insertions, 0 deletions
diff --git a/sys/src/9/xen/devrtc.c b/sys/src/9/xen/devrtc.c
new file mode 100644
index 000000000..52db3ca22
--- /dev/null
+++ b/sys/src/9/xen/devrtc.c
@@ -0,0 +1,96 @@
+/*
+ * Xen wall clock
+ */
+
+#include "u.h"
+#include "../port/lib.h"
+#include "mem.h"
+#include "dat.h"
+#include "fns.h"
+#include "../port/error.h"
+
+enum{
+ Qdir = 0,
+ Qrtc,
+};
+
+Dirtab rtcdir[]={
+ ".", {Qdir, 0, QTDIR}, 0, 0555,
+ "rtc", {Qrtc, 0}, 0, 0664,
+};
+
+static long
+rtcread(Chan *c, void *a, long n, vlong offset)
+{
+ if(c->qid.type & QTDIR)
+ return devdirread(c, a, n, rtcdir, nelem(rtcdir), devgen);
+
+ switch((ulong)c->qid.path){
+ case Qrtc:
+ return readnum((ulong)offset, a, n, xenwallclock(), 12);
+ }
+ error(Ebadarg);
+ return 0;
+}
+
+static long
+rtcwrite(Chan*c, void*, long n, vlong)
+{
+ switch((ulong)c->qid.path){
+ case Qrtc:
+ return n;
+ }
+ error(Eperm);
+ return 0;
+}
+
+static Chan*
+rtcattach(char* spec)
+{
+ return devattach('r', spec);
+}
+
+static Walkqid*
+rtcwalk(Chan* c, Chan *nc, char** name, int nname)
+{
+ return devwalk(c, nc, name, nname, rtcdir, nelem(rtcdir), devgen);
+}
+
+static int
+rtcstat(Chan* c, uchar* dp, int n)
+{
+ return devstat(c, dp, n, rtcdir, nelem(rtcdir), devgen);
+}
+
+static Chan*
+rtcopen(Chan* c, int omode)
+{
+ return devopen(c, omode, rtcdir, nelem(rtcdir), devgen);
+}
+
+static void
+rtcclose(Chan*)
+{
+}
+
+Dev rtcdevtab = {
+ 'r',
+ "rtc",
+
+ devreset,
+ devinit,
+ devshutdown,
+ rtcattach,
+ rtcwalk,
+ rtcstat,
+ rtcopen,
+ devcreate,
+ rtcclose,
+ rtcread,
+ devbread,
+ rtcwrite,
+ devbwrite,
+ devremove,
+ devwstat,
+};
+