T119: implement syscall and monitor interface to debug_print_capabilities
[barrelfish] / usr / fish / fish_common.c
index 4e7c0f6..208bd06 100644 (file)
@@ -23,6 +23,7 @@
 #include <barrelfish/dispatch.h>
 #include <barrelfish_kpi/init.h>
 #include <barrelfish/debug.h>
+#include <barrelfish/monitor_client.h>
 #include <barrelfish/nameservice_client.h>
 #include <barrelfish/spawn_client.h>
 #include <barrelfish/terminal.h>
@@ -95,7 +96,7 @@ static int execute_program(coreid_t coreid, int argc, char *argv[],
 
     argv[argc] = NULL;
     err = spawn_program_with_caps(coreid, prog, argv, NULL, inheritcn_cap,
-                                  NULL_CAP, SPAWN_NEW_DOMAIN, retdomainid);
+                                  NULL_CAP, SPAWN_FLAGS_NEW_DOMAIN, retdomainid);
 
     if (prog != argv[0]) {
         free(prog);
@@ -123,6 +124,11 @@ static int print_cspace(int argc, char *argv[])
     return EXIT_SUCCESS;
 }
 
+static int debug_print_caps(int argc, char *argv[]) {
+    monitor_debug_print_cababilities();
+    return EXIT_SUCCESS;
+}
+
 static int setenvcmd(int argc, char *argv[])
 {
     if (argc <= 1) {
@@ -173,7 +179,7 @@ static struct pixels_binding my_pixels_bindings[NUM_PIXELS];
 
 static int acks = 0;
 
-static void pixels_ack(struct pixels_binding *cl) 
+static void pixels_ack(struct pixels_binding *cl)
 {
     acks--;
 }
@@ -185,11 +191,11 @@ static struct pixels_rx_vtbl pixels_vtbl = {
 static void my_pixels_bind_cb(void *st, errval_t err, struct pixels_binding *b)
 {
     struct pixels_binding *pb = (struct pixels_binding *)st;
-    
+
     if (err_is_fail(err)) {
         USER_PANIC_ERR(err, "bind failed");
     }
-    
+
     pb->rx_vtbl = pixels_vtbl;
     pixels_connected++;
 }
@@ -208,9 +214,9 @@ static void pixels_init(void)
         char name[16];
         iref_t serv_iref;
         errval_t err;
-        
+
         sprintf(name, "pixels.%d", core);
-        
+
         /* Connect to the server */
         err = nameservice_blocking_lookup(name, &serv_iref);
         if (err_is_fail(err)) {
@@ -218,36 +224,36 @@ static void pixels_init(void)
             exit(EXIT_FAILURE);
         }
 
-    if (serv_iref == 0) {
-        DEBUG_ERR(err, "failed to get a valid iref back from lookup");
-        exit(EXIT_FAILURE);
-    }
-  
-    err = pixels_bind(serv_iref, 
-              my_pixels_bind_cb, 
-              &my_pixels_bindings[core],
-              get_default_waitset(),
-              IDC_BIND_FLAGS_DEFAULT);
-    if (err_is_fail(err)) {
-        DEBUG_ERR(err, "bind request to pixels server failed immediately");
-        exit(EXIT_FAILURE);
-    }
+        if (serv_iref == 0) {
+            DEBUG_ERR(err, "failed to get a valid iref back from lookup");
+            exit(EXIT_FAILURE);
+        }
+      
+        err = pixels_bind(serv_iref, 
+                  my_pixels_bind_cb, 
+                  &my_pixels_bindings[core],
+                  get_default_waitset(),
+                  IDC_BIND_FLAGS_DEFAULT);
+        if (err_is_fail(err)) {
+            DEBUG_ERR(err, "bind request to pixels server failed immediately");
+            exit(EXIT_FAILURE);
+        }
     }
 
     while (pixels_connected < NUM_PIXELS) 
-    messages_wait_and_handle_next();
+        messages_wait_and_handle_next();
     
     printf("connected to pixels server\n");
     pixels_inited = true;
 }
 
 static const char *scroller = "Barrelfish posse in full effect!!!   ";
-       
+
 static char c64map(char c) {
     if ('A' <= c && c <= 'Z') {
         return 65 + c-'A';
     } else if ('a' <= c && c <= 'z') {
-        return 1 + c-'a';        
+        return 1 + c-'a';
     } else if (c == ' ') {
         return 32;
     } else if (c == '!') {
@@ -269,20 +275,20 @@ static int demo(int argc, char *argv[])
     int frames = FRAMES;
 
     if (!pixels_inited) pixels_init();
-    
+
     if (argc == 3) {
         pixwidth = atoi(argv[1]);
         frames = atoi(argv[2]);
     }
     int width = 8 * strlen(scroller);
-    
+
     for (int x = 0; x < width - RENDER_WIDTH; x++) {
 
         // Repeat each frame a few times to slow down scrolling!
         for (int f = 0; f < frames; f++) {
         trace_event(TRACE_SUBSYS_BENCH, TRACE_EVENT_BENCH_PCBENCH, 1);
         for(int i = 0; i < RENDER_WIDTH; i++) {
-            
+
             int xpos = (x + i)%width;
             char ascii = scroller[xpos >> 3];
             char c64char = c64map(ascii);
@@ -291,17 +297,17 @@ static int demo(int argc, char *argv[])
             acks = 0;
             for (core = 0 ;core < 8; core++) {
                 unsigned char bits = font[c64char*8 + (7-core)];
-                
+
                 if (bits & (1<<(7-xsub)) ) {
 
                     my_pixels_bindings[core+2].tx_vtbl.display(&my_pixels_bindings[core+2], NOP_CONT, pixwidth);
                     acks++;
                 }
             }
-            
+
             uint64_t now = rdtsc();
-            
-            while (acks) {             
+
+            while (acks) {
                 messages_wait_and_handle_next();
             }
             while (rdtsc() - now < pixwidth) ;
@@ -504,6 +510,61 @@ static int cat(int argc, char *argv[])
     return ret;
 }
 
+#define LINE_SIZE 16
+static int hd(int argc, char *argv[])
+{
+    if(argc < 2) {
+        printf("Usage: %s [file...]\n", argv[0]);
+        return EXIT_FAILURE;
+    }
+
+    uint8_t buf[1024];
+    size_t size;
+    vfs_handle_t vh;
+    errval_t err;
+    int ret = EXIT_SUCCESS;
+
+    for (int i = 1; i < argc; i++) {
+        char *path = vfs_path_mkabsolute(cwd, argv[i]);
+        err = vfs_open(path, &vh);
+        free(path);
+        if (err_is_fail(err)) {
+            printf("%s: file not found\n", argv[i]);
+            ret = EXIT_FAILURE;
+            continue;
+        }
+
+        printf("Contents of %s\n", argv[i]);
+        int k=0;
+        do {
+            err = vfs_read(vh, buf, sizeof(buf), &size);
+            if (err_is_fail(err)) {
+                // XXX: Close any files that might be open
+                DEBUG_ERR(err, "error reading file");
+                return EXIT_FAILURE;
+            }
+
+            for (int j = k%LINE_SIZE; j < size; j++) {
+                if (j % LINE_SIZE == 0) {
+                    printf("%08X: ", k+j);
+                }
+                printf("%02x%s", buf[j], (j+1)%LINE_SIZE == 0 ? "\n" : " ");
+            }
+            k+=size;
+        } while(size > 0);
+        if (k%LINE_SIZE) {
+            printf("\n");
+        }
+
+        err = vfs_close(vh);
+        if (err_is_fail(err)) {
+            DEBUG_ERR(err, "in vfs_close");
+        }
+    }
+
+    return ret;
+}
+
 static int cat2(int argc, char *argv[])
 {
     errval_t err;
@@ -658,7 +719,7 @@ static int dd(int argc, char *argv[])
 
     vfs_handle_t source_vh = NULL;
     vfs_handle_t target_vh = NULL;
-    
+
     size_t blocksize = 512;
     size_t count = 0;
     size_t skip = 0;
@@ -801,7 +862,7 @@ static int dd(int argc, char *argv[])
 out:
     if (buffer != NULL)
         free(buffer);
-    
+
     if (source_vh != NULL) {
         err = vfs_close(source_vh);
         if (err_is_fail(err)) {
@@ -825,9 +886,9 @@ out:
 
     double kbps = ((double)total_bytes_written / 1024.0) / elapsed_secs;
 
-    printf("%zd bytes read. %zd bytes written. %f s, %f kB/s\n", total_bytes_read, total_bytes_written, elapsed_secs, kbps); 
+    printf("%zd bytes read. %zd bytes written. %f s, %f kB/s\n", total_bytes_read, total_bytes_written, elapsed_secs, kbps);
 #else
-    printf("%zd bytes read. %zd bytes written.\n", total_bytes_read, total_bytes_written); 
+    printf("%zd bytes read. %zd bytes written.\n", total_bytes_read, total_bytes_written);
 #endif
 
     return ret;
@@ -1146,6 +1207,7 @@ static struct cmd commands[] = {
     {"pwd", pwd, "Print current working directory"},
     {"touch", touch, "Create an empty file"},
     {"cat", cat, "Print the contents of file(s)"},
+    {"hd", hd, "Print the contents of file(s) as hexdump"},
     {"cat2", cat2, "Print the contents of file(s) into another file"},
     {"dd", dd, "copy stuff"},
     {"cp", cp, "Copy files"},
@@ -1156,6 +1218,7 @@ static struct cmd commands[] = {
     {"src", src, "Execute the list of commands in a file"},
     {"printenv", printenv, "Display environment variables"},
     {"free", freecmd, "Display amount of free memory in the system"},
+    {"debug_print_caps", debug_print_caps, "Display cspace debug information"},
 };
 
 static void getline(char *input, size_t size)