summaryrefslogtreecommitdiff
path: root/sys/src/cmd/vmx/9p.c
diff options
context:
space:
mode:
authoraiju <devnull@localhost>2017-06-21 22:18:26 +0000
committeraiju <devnull@localhost>2017-06-21 22:18:26 +0000
commit5c0bff4ba204cfad7aedb8c1c20f1c29265dcb01 (patch)
tree055fa5e6319b94d0f2992480a0e6ed0271179fb6 /sys/src/cmd/vmx/9p.c
parent37b9ab5a043e45a68979632c177e11af7a439027 (diff)
vmx(1): add support for (so far) crude 9p debugging fs; add gdb stub; clean up linux gdt code
Diffstat (limited to 'sys/src/cmd/vmx/9p.c')
-rw-r--r--sys/src/cmd/vmx/9p.c65
1 files changed, 65 insertions, 0 deletions
diff --git a/sys/src/cmd/vmx/9p.c b/sys/src/cmd/vmx/9p.c
new file mode 100644
index 000000000..69cc744f2
--- /dev/null
+++ b/sys/src/cmd/vmx/9p.c
@@ -0,0 +1,65 @@
+#include <u.h>
+#include <libc.h>
+#include <thread.h>
+#include <fcall.h>
+#include <9p.h>
+#include "dat.h"
+#include "fns.h"
+
+extern int regsfd;
+char Egreg[] = "the front fell off";
+
+enum {
+ Qregs,
+ Qmem,
+ Qmax
+};
+
+static Dir files[] = {
+ [Qregs] {.name "regs", .mode 0440},
+ [Qmem] {.name "mem", .mode 0440},
+};
+
+void
+srvread(Req *r)
+{
+ int rc;
+
+ switch(r->fid->qid.path){
+ case Qregs:
+ rc = pread(regsfd, r->ofcall.data, r->ifcall.count, r->ifcall.offset);
+ if(rc < 0)
+ responderror(r);
+ else{
+ r->ofcall.count = rc;
+ respond(r, nil);
+ }
+ break;
+ case Qmem:
+ r->ofcall.count = vmemread(r->ofcall.data, r->ifcall.count, r->ifcall.offset);
+ if(r->ofcall.count == 0)
+ respond(r, "fault");
+ else
+ respond(r, nil);
+ break;
+ default:
+ respond(r, Egreg);
+ }
+}
+
+Srv vmxsrv = {
+ .read srvread,
+};
+
+void
+init9p(char *srvname)
+{
+ char *uid;
+ int i;
+
+ uid = getuser();
+ vmxsrv.tree = alloctree(uid, uid, 0770, nil);
+ for(i = 0; i < Qmax; i++)
+ createfile(vmxsrv.tree->root, files[i].name, uid, files[i].mode, nil);
+ threadpostmountsrv(&vmxsrv, srvname, nil, 0);
+}