static long archwrite(struct chan *c, void *a, long n, int64_t offset) { char *p; int port; uint16_t *sp; uint32_t *lp; Rdwrfn *fn; switch ((uint32_t) c->qid.path) { case Qgdb: p = a; if (n != 1) error(EINVAL, "Gdb: Write one byte, '1' or '0'"); if (*p == '1') gdbactive = 1; else if (*p == '0') gdbactive = 0; else error(EINVAL, "Gdb: must be 1 or 0"); return 1; case Qiob: p = a; checkport(offset, offset + n); for (port = offset; port < offset + n; port++) outb(port, *p++); return n; case Qiow: if (n & 1) error(EINVAL, NULL); checkport(offset, offset + n); sp = a; for (port = offset; port < offset + n; port += 2) outw(port, *sp++); return n; case Qiol: if (n & 3) error(EINVAL, NULL); checkport(offset, offset + n); lp = a; for (port = offset; port < offset + n; port += 4) outl(port, *lp++); return n; default: if (c->qid.path < narchdir && (fn = writefn[c->qid.path])) return fn(c, a, n, offset); error(EPERM, NULL); break; } return 0; }
static long archwrite(Chan *c, void *a, long n, vlong offset) { char *p; int port; ushort *sp; ulong *lp; vlong *vp; Rdwrfn *fn; switch((ulong)c->qid.path){ case Qiob: p = a; checkport(offset, offset+n); for(port = offset; port < offset+n; port++) outb(port, *p++); return n; case Qiow: if(n & 1) error(Ebadarg); checkport(offset, offset+n); sp = a; for(port = offset; port < offset+n; port += 2) outs(port, *sp++); return n; case Qiol: if(n & 3) error(Ebadarg); checkport(offset, offset+n); lp = a; for(port = offset; port < offset+n; port += 4) outl(port, *lp++); return n; case Qmsr: if(n & 7) error(Ebadarg); vp = a; for(port = offset; port < offset+n; port += 8) if(wrmsr(port, *vp++) < 0) error(Ebadarg); return n; default: if(c->qid.path < narchdir && (fn = writefn[c->qid.path])) return fn(c, a, n, offset); error(Eperm); break; } return 0; }
static long archwrite(Chan *c, void *a, long n, vlong offset) { char *p; int port; ushort *sp; ulong *lp; Rdwrfn *fn; switch((ulong)c->qid.path){ case Qiob: p = a; checkport(offset, offset+n); for(port = offset; port < offset+n; port++) outb(port, *p++); return n; case Qiow: if((n & 01) || (offset & 01)) error(Ebadarg); checkport(offset, offset+n+1); n /= 2; sp = a; for(port = offset; port < offset+n; port += 2) outs(port, *sp++); return n*2; case Qiol: if((n & 0x03) || (offset & 0x03)) error(Ebadarg); checkport(offset, offset+n+3); n /= 4; lp = a; for(port = offset; port < offset+n; port += 4) outl(port, *lp++); return n*4; default: if(c->qid.path < narchdir && (fn = writefn[c->qid.path])) return fn(c, a, n, offset); error(Eperm); break; } return 0; }
static int32_t archwrite(Chan *c, void *a, int32_t n, int64_t offset) { //char *p; //int port; //uint16_t *sp; //uint32_t *lp; Rdwrfn *fn; switch((uint32_t)c->qid.path){ #if 0 case Qiob: p = a; checkport(offset, offset+n); for(port = offset; port < offset+n; port++) outb(port, *p++); return n; case Qiow: if(n & 1) error(Ebadarg); checkport(offset, offset+n); sp = a; for(port = offset; port < offset+n; port += 2) outs(port, *sp++); return n; case Qiol: if(n & 3) error(Ebadarg); checkport(offset, offset+n); lp = a; for(port = offset; port < offset+n; port += 4) outl(port, *lp++); return n; #endif default: if(c->qid.path < narchdir && (fn = writefn[c->qid.path])) return fn(c, a, n, offset); error(Eperm); break; } return 0; }
int main(int argc, char *argv[]) { Connection conn; char filename[MAX_FILENAME]; int ctrl, first = TRUE; pid_t child; if (argc != 3) { fprintf(stderr, "syntax: %s <address> <port>\n", argv[0]); exit(-1); } //if (checkaddress(argv[1])) return -1; conn = conn_connect(argv[1], checkport(argv[2])); signal(SIGCHLD, signalHandler); signal(SIGINT, signalHandler); printf("Insert filename or <quit> to close the connection\n"); while (TRUE) { readline(filename, MAX_FILENAME); if (!strcmp(filename, "Q") || !strcmp(filename, "q")) { printf("Terminating connection with server...\n"); ctrl = conn_sends(conn, "QUIT\r\n"); if (ctrl == -1) return -1; ctrl = conn_close(conn); if (ctrl == -1) return -1; return 0; } if (!strcmp(filename, "A") || !strcmp(filename, "a")) { printf("Aborting connection with server...\n"); if (kill(child, SIGKILL)) report_err("Cannot terminate a child"); ctrl = conn_close(conn); if (ctrl == -1) return -1; return 0; } if (!first) wait(NULL); else first = FALSE; child = fork(); if (!child) { ctrl = requestFile(conn, filename); if (ctrl == -1) return -1; return 0; } } return 0; }
static long archread(Chan *c, void *a, long n, vlong offset) { char *buf, *p; int port; ushort *sp; ulong *lp; IOMap *m; Rdwrfn *fn; switch((ulong)c->qid.path){ case Qdir: return devdirread(c, a, n, archdir, narchdir, devgen); case Qiob: port = offset; checkport(offset, offset+n); for(p = a; port < offset+n; port++) *p++ = inb(port); return n; case Qiow: if(n & 1) error(Ebadarg); checkport(offset, offset+n); sp = a; for(port = offset; port < offset+n; port += 2) *sp++ = ins(port); return n; case Qiol: if(n & 3) error(Ebadarg); checkport(offset, offset+n); lp = a; for(port = offset; port < offset+n; port += 4) *lp++ = inl(port); return n; case Qioalloc: break; default: if(c->qid.path < narchdir && (fn = readfn[c->qid.path])) return fn(c, a, n, offset); error(Eperm); break; } if((buf = malloc(n)) == nil) error(Enomem); p = buf; n = n/Linelen; offset = offset/Linelen; lock(&iomap); for(m = iomap.m; n > 0 && m != nil; m = m->next){ if(offset-- > 0) continue; sprint(p, "%8lux %8lux %-12.12s\n", m->start, m->end-1, m->tag); p += Linelen; n--; } unlock(&iomap); n = p - buf; memmove(a, buf, n); free(buf); return n; }
static long archread(Chan *c, void *a, long n, vlong offset) { char buf[32], *p; int port, i; ushort *sp; ulong *lp; vlong *vp; IOMap *m; Rdwrfn *fn; switch((ulong)c->qid.path){ case Qdir: return devdirread(c, a, n, archdir, narchdir, devgen); case Qiob: port = offset; checkport(offset, offset+n); for(p = a; port < offset+n; port++) *p++ = inb(port); return n; case Qiow: if(n & 1) error(Ebadarg); checkport(offset, offset+n); sp = a; for(port = offset; port < offset+n; port += 2) *sp++ = ins(port); return n; case Qiol: if(n & 3) error(Ebadarg); checkport(offset, offset+n); lp = a; for(port = offset; port < offset+n; port += 4) *lp++ = inl(port); return n; case Qmsr: if(n & 7) error(Ebadarg); vp = a; for(port = offset; port < offset+n; port += 8) if(rdmsr(port, vp++) < 0) error(Ebadarg); return n; case Qioalloc: lock(&iomap); i = 0; for(m = iomap.m; m != nil; m = m->next){ i = snprint(buf, sizeof(buf), "%8lux %8lux %-12.12s\n", m->start, m->end-1, m->tag); offset -= i; if(offset < 0) break; } unlock(&iomap); if(offset >= 0) return 0; if(n > -offset) n = -offset; offset += i; memmove(a, buf+offset, n); return n; default: if(c->qid.path < narchdir && (fn = readfn[c->qid.path])) return fn(c, a, n, offset); error(Eperm); return 0; } }
static long archread(Chan *c, void *a, long n, vlong offset) { char buf[Linelen+1], *p; int port; ushort *sp; ulong *lp; IOMap *m; Rdwrfn *fn; switch((ulong)c->qid.path){ case Qdir: return devdirread(c, a, n, archdir, nelem(archdir), devgen); case Qiob: port = offset; checkport(offset, offset+n); for(p = a; port < offset+n; port++) *p++ = inb(port); return n; case Qiow: if((n & 0x01) || (offset & 0x01)) error(Ebadarg); checkport(offset, offset+n+1); n /= 2; sp = a; for(port = offset; port < offset+n; port += 2) *sp++ = ins(port); return n*2; case Qiol: if((n & 0x03) || (offset & 0x03)) error(Ebadarg); checkport(offset, offset+n+3); n /= 4; lp = a; for(port = offset; port < offset+n; port += 4) *lp++ = inl(port); return n*4; case Qioalloc: break; default: if(c->qid.path < narchdir && (fn = readfn[c->qid.path])) return fn(c, a, n, offset); error(Eperm); break; } offset = offset/Linelen; n = n/Linelen; p = a; lock(&iomap); for(m = iomap.m; n > 0 && m != nil; m = m->next){ if(offset-- > 0) continue; if(strcmp(m->tag, "dummy") == 0) break; sprint(buf, "%8lux %8lux %-12.12s\n", m->start, m->end-1, m->tag); memmove(p, buf, Linelen); p += Linelen; n--; } unlock(&iomap); return p - (char*)a; }
static int32_t archread(Chan *c, void *a, int32_t n, int64_t offset) { char *buf, *p; int port; uint16_t *sp; uint32_t *lp; IOMap *map; Rdwrfn *fn; switch((uint32_t)c->qid.path){ case Qdir: return devdirread(c, a, n, archdir, narchdir, devgen); case Qiob: port = offset; checkport(offset, offset+n); for(p = a; port < offset+n; port++) *p++ = inb(port); return n; case Qiow: if(n & 1) error(Ebadarg); checkport(offset, offset+n); sp = a; for(port = offset; port < offset+n; port += 2) *sp++ = ins(port); return n; case Qiol: if(n & 3) error(Ebadarg); checkport(offset, offset+n); lp = a; for(port = offset; port < offset+n; port += 4) *lp++ = inl(port); return n; case Qioalloc: break; default: if(c->qid.path < narchdir && (fn = readfn[c->qid.path])) return fn(c, a, n, offset); error(Eperm); break; } if((buf = malloc(n)) == nil) error(Enomem); p = buf; n = n/Linelen; offset = offset/Linelen; switch((uint32_t)c->qid.path){ case Qioalloc: lock(&iomap); for(map = iomap.map; n > 0 && map != nil; map = map->next){ if(offset-- > 0) continue; sprint(p, "%#8lux %#8lux %-12.12s\n", map->start, map->end-1, map->tag); p += Linelen; n--; } unlock(&iomap); break; case Qmapram: /* shit */ #ifdef NOTYET for(mp = rmapram.map; mp->size; mp++){ /* * Up to MemMinMiB is already set up. */ if(mp->addr < MemMinMiB*MiB){ if(mp->addr+mp->size <= MemMinMiB*MiB) continue; pa = MemMinMiB*MiB; size = mp->size - MemMinMiB*MiB-mp->addr; } else{ pa = mp->addr; size = mp->size; } #endif error("Not yet"); break; } n = p - buf; memmove(a, buf, n); free(buf); return n; } static int32_t archwrite(Chan *c, void *a, int32_t n, int64_t offset) { char *p; int port; uint16_t *sp; uint32_t *lp; Rdwrfn *fn; switch((uint32_t)c->qid.path){ case Qiob: p = a; checkport(offset, offset+n); for(port = offset; port < offset+n; port++) outb(port, *p++); return n; case Qiow: if(n & 1) error(Ebadarg); checkport(offset, offset+n); sp = a; for(port = offset; port < offset+n; port += 2) outs(port, *sp++); return n; case Qiol: if(n & 3) error(Ebadarg); checkport(offset, offset+n); lp = a; for(port = offset; port < offset+n; port += 4) outl(port, *lp++); return n; default: if(c->qid.path < narchdir && (fn = writefn[c->qid.path])) return fn(c, a, n, offset); error(Eperm); break; } return 0; }
static long archread(struct chan *c, void *a, long n, int64_t offset) { char *buf, *p; int port; uint16_t *sp; uint32_t *lp; IOMap *map; Rdwrfn *fn; switch ((uint32_t) c->qid.path) { case Qdir: return devdirread(c, a, n, archdir, narchdir, devgen); case Qgdb: p = gdbactive ? "1" : "0"; return readstr(offset, a, n, p); case Qiob: port = offset; checkport(offset, offset + n); for (p = a; port < offset + n; port++) *p++ = inb(port); return n; case Qiow: if (n & 1) error(EINVAL, NULL); checkport(offset, offset + n); sp = a; for (port = offset; port < offset + n; port += 2) *sp++ = inw(port); return n; case Qiol: if (n & 3) error(EINVAL, NULL); checkport(offset, offset + n); lp = a; for (port = offset; port < offset + n; port += 4) *lp++ = inl(port); return n; case Qioalloc: break; default: if (c->qid.path < narchdir && (fn = readfn[c->qid.path])) return fn(c, a, n, offset); error(EPERM, NULL); break; } if ((buf = kzmalloc(n, 0)) == NULL) error(ENOMEM, NULL); p = buf; n = n / Linelen; offset = offset / Linelen; switch ((uint32_t) c->qid.path) { case Qioalloc: spin_lock(&(&iomap)->lock); for (map = iomap.map; n > 0 && map != NULL; map = map->next) { if (offset-- > 0) continue; snprintf(p, n * Linelen, "%#8p %#8p %-12.12s\n", map->start, map->end - 1, map->tag); p += Linelen; n--; } spin_unlock(&(&iomap)->lock); break; case Qmapram: error(ENOSYS, NULL); break; } n = p - buf; memmove(a, buf, n); kfree(buf); return n; }