Adds chaninfo()
authorBarret Rhoden <brho@cs.berkeley.edu>
Wed, 29 Jan 2014 19:34:08 +0000 (11:34 -0800)
committerBarret Rhoden <brho@cs.berkeley.edu>
Wed, 29 Jan 2014 19:34:08 +0000 (11:34 -0800)
This is useful for debugging.  Most devices will use devchaninfo.  But
if you want to spit out extra info, take a look at ipchaninfo.

This info will show up now when we do a "procinfo pid #" from the kernel
monitor.  We could also use it from procfs in the future.

13 files changed:
kern/drivers/dev/alarm.c
kern/drivers/dev/cons.c
kern/drivers/dev/ether.c
kern/drivers/dev/mnt.c
kern/drivers/dev/pipe.c
kern/drivers/dev/proc.c
kern/drivers/dev/root.c
kern/drivers/dev/srv.c
kern/drivers/dev/vm.c
kern/include/ns.h
kern/src/net/devip.c
kern/src/ns/dev.c
kern/src/ns/sysfile.c

index 274612d..7b352cc 100644 (file)
@@ -422,5 +422,5 @@ struct dev alarmdevtab __devtab = {
        alarmwstat,
        devpower,
        //devconfig,
-       //devchaninfo,
+       devchaninfo,
 };
index 8050489..df56d56 100644 (file)
@@ -1089,6 +1089,8 @@ struct dev consdevtab __devtab = {
        devbwrite,
        devremove,
        devwstat,
+       devpower,
+       devchaninfo,
 };
 
 static uint32_t        randn;
index 8b1118c..988e899 100644 (file)
@@ -827,4 +827,5 @@ struct dev etherdevtab __devtab = {
        devremove,
        etherwstat,
        etherpower,
+       devchaninfo,
 };
index 8c99a39..7de04e9 100644 (file)
@@ -1235,4 +1235,6 @@ struct dev mntdevtab __devtab = {
        devbwrite,
        mntremove,
        mntwstat,
+       devpower,
+       devchaninfo,
 };
index bb66ffc..46eaea4 100644 (file)
@@ -478,4 +478,6 @@ struct dev pipedevtab __devtab = {
        pipebwrite,
        devremove,
        pipewstat,
+       devpower,
+       devchaninfo,
 };
index f8bd5f3..e8a6c00 100644 (file)
@@ -411,5 +411,5 @@ struct dev procdevtab __devtab = {
        procwstat,
        devpower,
 //     devconfig,
-//     devchaninfo,
+       devchaninfo,
 };
index 2d3972e..1e8886d 100644 (file)
@@ -188,4 +188,6 @@ struct dev rootdevtab __devtab = {
        devbwrite,
        devremove,
        devwstat,
+       devpower,
+       devchaninfo,
 };
index db43e80..c02dd2f 100644 (file)
@@ -320,5 +320,7 @@ struct dev srvdevtab __devtab = {
        srvwrite,
        devbwrite,
        srvremove,
-       srvwstat
+       srvwstat,
+       devpower,
+       devchaninfo,
 };
index 5337dee..bcabc45 100644 (file)
@@ -527,5 +527,5 @@ struct dev vmdevtab __devtab = {
        vmwstat,
        devpower,
 //     devconfig,
-//     devchaninfo,
+       devchaninfo,
 };
index fdc55c0..a192201 100644 (file)
@@ -412,6 +412,7 @@ struct dev
        int     (*wstat)(struct chan*, uint8_t *unused_uint8_p_t, int);
        void    (*power)(int);  /* power mgt: power(1) → on, power (0) → off */
 //     int     (*config)( int unused_int, char *unused_char_p_t, DevConf*);
+       char*   (*chaninfo)(struct chan*, char*, size_t);
        /* we need to be aligned, i think to 32 bytes, for the linker tables. */
 } __attribute__ ((aligned(32)));;
 
@@ -695,6 +696,7 @@ struct walkqid*     devwalk(struct chan*,
                        struct chan*, char **unused_char_pp_t, int unused_int,
                        struct dirtab*, int unused_intw, Devgen*);
 int            devwstat(struct chan*, uint8_t *unused_uint8_p_t, int);
+char   *devchaninfo(struct chan *chan, char *ret, size_t ret_l);
 void           disinit(void*);
 void           disfault(void*, char *unused_char_p_t);
 int            domount(struct chan**, struct mhead**);
index ddca2c3..70d6df8 100644 (file)
@@ -568,6 +568,48 @@ ipwstat(struct chan *c, uint8_t *dp, int n)
        return n;
 }
 
+/* Should be able to handle any file type chan. Feel free to extend it. */
+static char *ipchaninfo(struct chan *ch, char *ret, size_t ret_l)
+{
+       struct conv *conv;
+       struct Proto *proto;
+       char *p;
+       struct Fs *f;
+       
+       f = ipfs[ch->dev];
+       
+       switch (TYPE(ch->qid)) {
+               default:
+                       ret = "Unknown type";
+                       break;
+               case Qdata:
+                       proto = f->p[PROTO(ch->qid)];
+                       conv = proto->conv[CONV(ch->qid)];
+                       snprintf(ret, ret_l, "Qdata, proto %s, conv idx %d", proto->name,
+                                conv->x);
+                       break;
+               case Qarp:
+                       ret = "Qarp";
+                       break;
+               case Qiproute:
+                       ret = "Qiproute";
+                       break;
+               case Qlog:
+                       ret = "Qlog";
+                       break;
+               case Qndb:
+                       ret = "Qndb";
+                       break;
+               case Qctl:
+                       proto = f->p[PROTO(ch->qid)];
+                       conv = proto->conv[CONV(ch->qid)];
+                       snprintf(ret, ret_l, "Qctl, proto %s, conv idx %d", proto->name,
+                                conv->x);
+                       break;
+       }
+       return ret;
+}
+
 static void
 closeconv(struct conv *cv)
 {
@@ -1227,6 +1269,8 @@ struct dev ipdevtab __devtab = {
        ipbwrite,
        devremove,
        ipwstat,
+       devpower,
+       ipchaninfo,
 };
 
 int
index d3b6775..c69ab49 100644 (file)
@@ -449,6 +449,14 @@ devconfig( int unused_int, char *c, DevConf *)
        return 0;
 }
 #endif
+
+char *devchaninfo(struct chan *chan, char *ret, size_t ret_l)
+{
+       snprintf(ret, ret_l, "qid.path: %p, qid.type: %02x\n", chan->qid.path,
+       chan->qid.type);
+       return ret;
+}
+
 /*
  * check that the name in a wstat is plausible
  */
index 9885cba..7161576 100644 (file)
@@ -1374,8 +1374,7 @@ void print_chaninfo(struct chan *c)
        printk("Chan pathname: %s, Dev: %s, Devinfo: %s\n",
               c->name ? c->name->s : "no cname",
               has_dev ? devtab[c->type].name : "no dev",
-                  /* TODO: chaninfo op */
-              //has_dev ? devtab[c->type].chaninfo(c, buf, sizeof(buf)) :
+              has_dev ? devtab[c->type].chaninfo(c, buf, sizeof(buf)) :
                               "no info");
        if (!has_dev)
                printk("No dev: intermediate chan? qid.path: %p\n", c->qid.path);