Allow kfunc to take decimals and print the retval
authorBarret Rhoden <brho@cs.berkeley.edu>
Fri, 3 Jun 2016 14:16:32 +0000 (10:16 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Thu, 16 Jun 2016 16:20:31 +0000 (12:20 -0400)
Not all functions actually return something.  We're basically just printing
what the caller *thinks* was returned.  On x86, this is just rax.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
kern/src/monitor.c

index 85a56bd..7749f89 100644 (file)
@@ -422,11 +422,12 @@ int mon_exit(int argc, char **argv, struct hw_trapframe *hw_tf)
 
 int mon_kfunc(int argc, char **argv, struct hw_trapframe *hw_tf)
 {
-       void (*func)(void *arg, ...);
+       long ret;
+       long (*func)(void *arg, ...);
 
        if (argc < 2) {
                printk("Usage: kfunc FUNCTION [arg1] [arg2] [etc]\n");
-               printk("Arguments must be in hex.  Can take 6 args.\n");
+               printk("Use 0x with hex arguments.  Can take 6 args.\n");
                return 1;
        }
        func = (void*)get_symbol_addr(argv[1]);
@@ -437,46 +438,47 @@ int mon_kfunc(int argc, char **argv, struct hw_trapframe *hw_tf)
        /* Not elegant, but whatever.  maybe there's a better syntax, or we can do
         * it with asm magic. */
        switch (argc) {
-               case 2: /* have to fake one arg */
-                       func((void*)0);
-                       break;
-               case 3: /* the real first arg */
-                       func((void*)strtol(argv[2], 0, 16));
-                       break;
-               case 4:
-                       func((void*)strtol(argv[2], 0, 16),
-                                   strtol(argv[3], 0, 16));
-                       break;
-               case 5:
-                       func((void*)strtol(argv[2], 0, 16),
-                                   strtol(argv[3], 0, 16),
-                                   strtol(argv[4], 0, 16));
-                       break;
-               case 6:
-                       func((void*)strtol(argv[2], 0, 16),
-                                   strtol(argv[3], 0, 16),
-                                   strtol(argv[4], 0, 16),
-                                   strtol(argv[5], 0, 16));
-                       break;
-               case 7:
-                       func((void*)strtol(argv[2], 0, 16),
-                                   strtol(argv[3], 0, 16),
-                                   strtol(argv[4], 0, 16),
-                                   strtol(argv[5], 0, 16),
-                                   strtol(argv[6], 0, 16));
-                       break;
-               case 8:
-                       func((void*)strtol(argv[2], 0, 16),
-                                   strtol(argv[3], 0, 16),
-                                   strtol(argv[4], 0, 16),
-                                   strtol(argv[5], 0, 16),
-                                   strtol(argv[6], 0, 16),
-                                   strtol(argv[7], 0, 16));
-                       break;
-               default:
-                       printk("Bad number of arguments.\n");
-                       return -1;
+       case 2: /* have to fake one arg */
+               ret = func((void*)0);
+               break;
+       case 3: /* the real first arg */
+               ret = func((void*)strtol(argv[2], 0, 0));
+               break;
+       case 4:
+               ret = func((void*)strtol(argv[2], 0, 0),
+                                 strtol(argv[3], 0, 0));
+               break;
+       case 5:
+               ret = func((void*)strtol(argv[2], 0, 0),
+                                 strtol(argv[3], 0, 0),
+                                 strtol(argv[4], 0, 0));
+               break;
+       case 6:
+               ret = func((void*)strtol(argv[2], 0, 0),
+                                 strtol(argv[3], 0, 0),
+                                 strtol(argv[4], 0, 0),
+                                 strtol(argv[5], 0, 0));
+               break;
+       case 7:
+               ret = func((void*)strtol(argv[2], 0, 0),
+                                 strtol(argv[3], 0, 0),
+                                 strtol(argv[4], 0, 0),
+                                 strtol(argv[5], 0, 0),
+                                 strtol(argv[6], 0, 0));
+               break;
+       case 8:
+               ret = func((void*)strtol(argv[2], 0, 0),
+                                 strtol(argv[3], 0, 0),
+                                 strtol(argv[4], 0, 0),
+                                 strtol(argv[5], 0, 0),
+                                 strtol(argv[6], 0, 0),
+                                 strtol(argv[7], 0, 0));
+               break;
+       default:
+               printk("Bad number of arguments.\n");
+               return -1;
        }
+       printk("%s (might have) returned %p\n", argv[1], ret);
        return 0;
 }