Implement ctl command for ktest
authorRonald G. Minnich <rminnich@gmail.com>
Wed, 10 Dec 2014 01:05:03 +0000 (01:05 +0000)
committerRonald G. Minnich <rminnich@gmail.com>
Wed, 10 Dec 2014 01:05:03 +0000 (01:05 +0000)
echo ktest > '#Z/monctl'
will run any ktests that are built in.
See Documentation/testing.txt

A note on the files:
read monctl will get you all valid commands
write monctl will pass a command and args to monctl,
which are then interpreted and then call functions directly, with
none, some, or all the args depending on what the function is.

read mondata, right now, gets bupkus
write mondata converts the string into an argv[] array and calls
a function called onecmd directly. onecmd runs one monitor command.
Output appears on the console, not in mondata as we might like.

So,
write (e.g. ktest) to monctl -> interpretation -> (e.g.) run_registered_ktest_suites

write to mondata -> convert to argv[] -> onecmd -> command[argv[0]]

So 'mondata' can be read as 'uninterpreted'. This may change if it
is clearly inconvenient.

Signed-off-by: Ronald G. Minnich <rminnich@gmail.com>
kern/drivers/dev/regress.c

index 274af63..30ce706 100644 (file)
@@ -26,6 +26,7 @@
 #include <smp.h>
 #include <ip.h>
 #include <console.h>
+#include <ktest.h>
 
 struct regress
 {
@@ -46,8 +47,7 @@ struct dirtab regresstab[]={
        {"monctl",      {Monitorctlqid},                0,      0600},
 };
 
-static size_t mpstatraw_len(void);
-static size_t mpstat_len(void);
+static char *ctlcommands = "ktest";
 
 static struct chan*
 regressattach(char *spec)
@@ -112,7 +112,12 @@ regressread(struct chan *c, void *va, long n, int64_t off)
 
        switch((int)c->qid.path){
        case Monitordirqid:
-               return devdirread(c, va, n, regresstab, ARRAY_SIZE(regresstab), devgen);
+               n = devdirread(c, va, n, regresstab, ARRAY_SIZE(regresstab), devgen);
+               break;
+
+       case Monitorctlqid:
+               n = readstr(off, va, n, ctlcommands);
+               break;
 
        case Monitordataqid:
                if (regress.monitor) {
@@ -146,7 +151,11 @@ regresswrite(struct chan *c, void *a, long n, int64_t unused)
 
        switch((int)(c->qid.path)){
        case Monitorctlqid:
-               error("no ctl commands yet");
+               if(strncmp(a, "ktest", 5) == 0){
+                       run_registered_ktest_suites();
+               } else {
+                       error("regresswrite: only commands are %s", ctlcommands);
+               }
                break;
 
        case Monitordataqid: