diff options
author | aiju <devnull@localhost> | 2017-06-21 22:18:26 +0000 |
---|---|---|
committer | aiju <devnull@localhost> | 2017-06-21 22:18:26 +0000 |
commit | 5c0bff4ba204cfad7aedb8c1c20f1c29265dcb01 (patch) | |
tree | 055fa5e6319b94d0f2992480a0e6ed0271179fb6 /sys/src/cmd/vmx/9p.c | |
parent | 37b9ab5a043e45a68979632c177e11af7a439027 (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.c | 65 |
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); +} |